private void PopulateResponseAttributes(HttpResponse response, Dictionary <string, object> responseAttributes) { int statusCode = (int)response.StatusCode; if (statusCode >= 400 && statusCode <= 499) { _recorder.MarkError(); if (statusCode == 429) { _recorder.MarkThrottle(); } } else if (statusCode >= 500 && statusCode <= 599) { _recorder.MarkFault(); } responseAttributes["status"] = statusCode; if (response.Headers.ContentLength != null) { responseAttributes["content_length"] = response.Headers.ContentLength; } }
private void AddHttpInformation(IWebResponseData httpResponse) { var responseAttributes = new Dictionary <string, object>(); int statusCode = (int)httpResponse.StatusCode; if (statusCode >= 400 && statusCode <= 499) { _recorder.MarkError(); if (statusCode == 429) { _recorder.MarkThrottle(); } } else if (statusCode >= 500 && statusCode <= 599) { _recorder.MarkFault(); } responseAttributes["status"] = statusCode; responseAttributes["content_length"] = httpResponse.ContentLength; _recorder.AddHttpInformation("response", responseAttributes); }
private void AddHttpInformation(IWebResponseData httpResponse) { var responseAttributes = new Dictionary <string, object>(); var statusCode = httpResponse.StatusCode; if (!statusCode.IsSuccessStatusCode()) { _recorder.MarkError(); if (statusCode.IsTooManyRequests()) { _recorder.MarkThrottle(); } } else if (statusCode.IsFault()) { _recorder.MarkFault(); } responseAttributes["status"] = statusCode; responseAttributes["content_length"] = httpResponse.ContentLength; _recorder.AddHttpInformation("response", responseAttributes); }
private static void ProcessResponseAttributes(HttpResponse response, Dictionary <string, object> reponseAttributes) { int statusCode = (int)response.StatusCode; reponseAttributes["status"] = statusCode; if (statusCode >= 400 && statusCode <= 499) { _recorder.MarkError(); if (statusCode == 429) { _recorder.MarkThrottle(); } } else if (statusCode >= 500 && statusCode <= 599) { _recorder.MarkFault(); } }
public void TestLogErrorModeForContextMissingStrategy() { using (var recorder = new AWSXRayRecorder()) { recorder.ContextMissingStrategy = ContextMissingStrategy.LOG_ERROR; recorder.EndSegment(); recorder.BeginSubsegment("no segment"); recorder.EndSubsegment(); recorder.SetNamespace("dummy namespace"); recorder.AddAnnotation("key", "value"); recorder.AddHttpInformation("key", "value"); recorder.MarkError(); recorder.MarkFault(); recorder.MarkThrottle(); recorder.AddException(new ArgumentNullException()); recorder.AddPrecursorId(Entity.GenerateId()); recorder.AddSqlInformation("sqlKey", "value"); recorder.AddMetadata("key", "value"); } }
/// <summary> /// Sends an HTTP request to the inner handler to send to the server as an asynchronous /// operation. /// </summary> /// <param name="request">The HTTP request message to send to the server.</param> /// <param name="cancellationToken">A cancellation token to cancel operation.</param> /// <returns>Returns System.Threading.Tasks.Task. The task object representing the asynchronous operation.</returns> protected async override Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { string headerSring = null; if (request.Headers.TryGetValues(TraceHeader.HeaderKey, out IEnumerable <string> headerValue)) { headerSring = headerValue.First(); } // If Trace header doesn't exist, which means this is the root node. Create a new traceId and inject the trace header. if (!TraceHeader.TryParse(headerSring, out TraceHeader traceHeader)) { _logger.DebugFormat("Trace header doesn't exist or not valid. Injecting a new one. existing header = {0}", headerSring); traceHeader = new TraceHeader { RootTraceId = TraceId.NewId(), ParentId = null, Sampled = SampleDecision.Unknown }; } bool isSampleDecisionRequested = traceHeader.Sampled == SampleDecision.Requested; // Make sample decision if (traceHeader.Sampled == SampleDecision.Unknown || traceHeader.Sampled == SampleDecision.Requested) { traceHeader.Sampled = _recorder.SamplingStrategy.Sample(request); } _recorder.BeginSegment(SegmentNamingStrategy.GetSegmentName(request), traceHeader.RootTraceId, traceHeader.ParentId, traceHeader.Sampled); if (!AppSettings.IsXRayTracingDisabled) { var requestAttributes = new Dictionary <string, object>(); requestAttributes["url"] = request.RequestUri.AbsoluteUri; requestAttributes["method"] = request.Method.Method; string xForwardedFor = GetXForwardedFor(request); if (xForwardedFor == null) { requestAttributes["client_ip"] = GetClientIpAddress(request); } else { requestAttributes["client_ip"] = xForwardedFor; requestAttributes["x_forwarded_for"] = true; } requestAttributes["user_agent"] = request.Headers.UserAgent.ToString(); _recorder.AddHttpInformation("request", requestAttributes); } var response = await base.SendAsync(request, cancellationToken); if (!AppSettings.IsXRayTracingDisabled) { var responseAttributes = new Dictionary <string, object>(); int statusCode = (int)response.StatusCode; if (statusCode >= 400 && statusCode <= 499) { _recorder.MarkError(); if (statusCode == 429) { _recorder.MarkThrottle(); } } else if (statusCode >= 500 && statusCode <= 599) { _recorder.MarkFault(); } responseAttributes["status"] = statusCode; if (response.Content != null && response.Content.Headers.ContentLength != null) { responseAttributes["content_length"] = response.Content.Headers.ContentLength; } _recorder.AddHttpInformation("response", responseAttributes); } _recorder.EndSegment(); // If the sample decision is requested, added the trace header to response if (isSampleDecisionRequested) { response.Headers.Add(TraceHeader.HeaderKey, traceHeader.ToString()); } return(response); }