public async void StartWork() { var httpClient = new HttpClient { BaseAddress = _serverUrlBase }; while (true) { var item = _payloads.Take(); try { var json = JsonConvert.SerializeObject(item, new JsonSerializerSettings { ContractResolver = new CamelCasePropertyNamesContractResolver() }); var content = new StringContent(json, Encoding.UTF8, "application/json"); HttpResponseMessage result = null; switch (item) { case Payload p: result = await httpClient.PostAsync(Consts.IntakeV1Transactions, content); break; case Error e: result = await httpClient.PostAsync(Consts.IntakeV1Errors, content); break; } var isSucc = result.IsSuccessStatusCode; var str = await result.Content.ReadAsStringAsync(); } catch (Exception e) { switch (item) { case Payload p: _logger.LogWarning($"Failed sending transaction {p.Transactions.FirstOrDefault()?.Name}"); _logger.LogDebug($"{e.GetType().Name}: {e.Message}"); break; case Error err: _logger.LogWarning($"Failed sending Error {err.Errors[0]?.Id}"); _logger.LogDebug($"{e.GetType().Name}: {e.Message}"); break; } } } }
/// <summary> /// Turns a System.Diagnostic.StackFrame[] into a <see cref="Stacktrace" /> list which can be reported to the APM Server /// </summary> /// <param name="capturingFor">Just for logging.</param> /// <returns>A prepared List that can be passed to the APM server</returns> internal static List <Stacktrace> GenerateApmStackTrace(StackFrame[] frames, AbstractLogger logger, string capturingFor) { var retVal = new List <Stacktrace>(frames.Length); try { retVal.AddRange(from item in frames let fileName = item?.GetMethod()?.DeclaringType?.Assembly?.GetName()?.Name where !string.IsNullOrEmpty(fileName) select new Stacktrace { Function = item?.GetMethod()?.Name, FileName = fileName, Module = item?.GetMethod()?.ReflectedType?.Name, LineNo = item?.GetFileLineNumber() ?? 0 }); } catch (Exception e) { logger.LogWarning($"Failed capturing stacktrace for {capturingFor}"); logger.LogDebug($"{e.GetType().Name}: {e.Message}"); } return(retVal); }
/// <summary> /// Turns a System.Diagnostic.StackFrame[] into a <see cref="Stacktrace"/> list which can be reported to the APM Server /// </summary> /// <param name="capturingFor">Just for logging.</param> /// <returns>A prepared List that can be passed to the APM server</returns> public static List <Stacktrace> GenerateApmStackTrace(StackFrame[] frames, AbstractLogger logger, string capturingFor) { var retVal = new List <Stacktrace>(frames.Length); try { foreach (var item in frames) { var fileName = item?.GetMethod()?.DeclaringType?.Assembly?.GetName()?.Name; if (String.IsNullOrEmpty(fileName)) { continue; //since filename is required by the server, if we don't have it we skip the frame } retVal.Add(new Stacktrace { Function = item?.GetMethod()?.Name, Filename = fileName, Module = item?.GetMethod()?.ReflectedType?.Name }); } } catch (Exception e) { logger.LogWarning($"Failed capturing stacktrace for {capturingFor}"); logger.LogDebug($"{e.GetType().Name}: {e.Message}"); } return(retVal); }
private void LogWithLevel(LogLevel logLevel) { Apm.Agent.Config.LogLevel = logLevel; logger.LogError("Error log"); logger.LogWarning("Warning log"); logger.LogInfo("Info log"); logger.LogDebug("Debug log"); }