public void Initialize() { recorder = new AWSXRayRecorder(); recorder.BeginSegment("Test EF6"); connection = new SQLiteConnection(connectionString); connection.Open(); }
/// <summary> /// Processes HTTP request. /// </summary> private static void ProcessHTTPRequest(Object sender, EventArgs e) { var context = ((HttpApplication)sender).Context; string ruleName = null; var request = context.Request; TraceHeader traceHeader = GetTraceHeader(context); var segmentName = GetSegmentNamingStrategy().GetSegmentName(request); // Make sample decision if (traceHeader.Sampled == SampleDecision.Unknown || traceHeader.Sampled == SampleDecision.Requested) { SamplingResponse response = MakeSamplingDecision(request, traceHeader, segmentName); ruleName = response.RuleName; } var timestamp = context.Timestamp.ToUniversalTime(); // Gets initial timestamp of current HTTP Request SamplingResponse samplingResponse = new SamplingResponse(ruleName, traceHeader.Sampled); // get final ruleName and SampleDecision _recorder.BeginSegment(segmentName, traceHeader.RootTraceId, traceHeader.ParentId, samplingResponse, timestamp); if (!AWSXRayRecorder.Instance.IsTracingDisabled()) { Dictionary <string, object> requestAttributes = new Dictionary <string, object>(); ProcessRequestAttributes(request, requestAttributes); _recorder.AddHttpInformation("request", requestAttributes); } }
/// <summary> /// Processes HTTP request. /// </summary> private static void ProcessHTTPRequest(Object sender, EventArgs e) { var context = ((HttpApplication)sender).Context; if (context.Items.Contains(XRayEntity)) { return; // Do not override segment for the current request } var request = context.Request; TraceHeader traceHeader = GetTraceHeader(context); // Make sample decision if (traceHeader.Sampled == SampleDecision.Unknown || traceHeader.Sampled == SampleDecision.Requested) { SetSamplingDecision(request, traceHeader); } var timestamp = context.Timestamp.ToUniversalTime().ToUnixTimeSeconds(); // Gets initial timestamp of current HTTP Request _recorder.BeginSegment(GetSegmentNamingStrategy().GetSegmentName(request), traceHeader.RootTraceId, timestamp, traceHeader.ParentId, traceHeader.Sampled); if (!AWSXRayRecorder.Instance.IsTracingDisabled()) { Dictionary <string, object> requestAttributes = new Dictionary <string, object>(); ProcessRequestAttributes(request, requestAttributes); _recorder.AddHttpInformation("request", requestAttributes); } context.Items.Add(XRayEntity, Core.Internal.Utils.TraceContext.GetEntity()); }
public static void ContinueFrom(this AWSXRayRecorder recorder, string serviceName, Message message) { var traceHeader = message?.GetTraceHeader() ?? new TraceHeader { RootTraceId = TraceId.NewId(), ParentId = null, Sampled = SampleDecision.Unknown }; string ruleName = null; if (traceHeader.Sampled == SampleDecision.Unknown || traceHeader.Sampled == SampleDecision.Requested) { var samplingInput = new SamplingInput(serviceName); var sampleResponse = recorder.SamplingStrategy.ShouldTrace(samplingInput); traceHeader.Sampled = sampleResponse.SampleDecision; ruleName = sampleResponse.RuleName; } var samplingResponse = new SamplingResponse(ruleName, traceHeader.Sampled); recorder .BeginSegment ( serviceName, traceHeader.RootTraceId, traceHeader.ParentId, samplingResponse ); }
public void TestEFCoreRequestWithEntityFrameworkCoreAndSqlDiagnosticListener() { // EntityFramework request will first trigger EntityFrameworkCoreDiagnosticListener and then SqlDiagnosticListener, // With EntityFrameworkCoreDiagnosticListener, SqlDiagnosticListener will process EF Core request. var subscription = new List <DiagnosticListenerBase>() { new EntityFrameworkCoreDiagnosticListener(), new SqlDiagnosticListener() }; _subscription = DiagnosticListener.AllListeners.Subscribe(new DiagnosticListenerObserver(subscription)); _recorder.BeginSegment("EFCoreRequestWithEntityFrameworkCoreAndSqlDiagnosticListener"); var context = GetTestEFContext(); var users = context.Users.Where(u => u.UserId == 1).ToList(); var segment = _recorder.TraceContext.GetEntity(); Assert.AreEqual(4, segment.Subsegments.Count); var subsegment = segment.Subsegments[3]; Assert.IsNotNull(subsegment); Assert.IsNotNull(subsegment.Sql); Assert.AreEqual(0, subsegment.Subsegments.Count); // No nested duplicate subsegment Assert.AreEqual("sqlite", subsegment.Sql["database_type"]); Assert.AreEqual(_connectionString, subsegment.Sql["connection_string"]); Assert.AreEqual(connection.ServerVersion, subsegment.Sql["database_version"]); _recorder.EndSegment(); }
/// <summary> /// Processes HTTP request. /// </summary> private void ProcessHTTPRequest(HttpContext context) { HttpRequest request = context.Request; string headerString = null; if (request.Headers.TryGetValue(TraceHeader.HeaderKey, out StringValues headerValue)) { if (headerValue.ToArray().Length >= 1) { headerString = headerValue.ToArray()[0]; } } // Trace header doesn't exist, which means this is the root node. Create a new traceId and inject the trace header. if (!TraceHeader.TryParse(headerString, out TraceHeader traceHeader)) { _logger.DebugFormat("Trace header doesn't exist or not valid : ({0}). Injecting a new one.", headerString); 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) { string serviceName = request.Host.Host; string url = request.Path; string method = request.Method; traceHeader.Sampled = _recorder.SamplingStrategy.Sample(serviceName, url, method); } if (AWSXRayRecorder.Instance.IsLambda()) { _recorder.BeginSubsegment(SegmentNamingStrategy.GetSegmentName(request)); } else { _recorder.BeginSegment(SegmentNamingStrategy.GetSegmentName(request), traceHeader.RootTraceId, traceHeader.ParentId, traceHeader.Sampled); } if (!AWSXRayRecorder.Instance.IsTracingDisabled()) { var requestAttributes = new Dictionary <string, object>(); PopulateRequestAttributes(request, requestAttributes); _recorder.AddHttpInformation("request", requestAttributes); } if (isSampleDecisionRequested) { context.Response.Headers.Add(TraceHeader.HeaderKey, traceHeader.ToString()); // Its recommended not to modify response header after _next.Invoke() call } }
public void TestNoNewSegmentInLambda() { try { _recorder.BeginSegment("test"); Assert.Fail(); } catch (UnsupportedOperationException) { // expected } Assert.IsFalse(AWSXRayRecorder.Instance.TraceContext.IsEntityPresent()); // Segment cannot be added in Lambda Context }
public void Test_EFCore_unsuccessful_query() { var recorder = new AWSXRayRecorder(); recorder.BeginSegment("TestSegment"); var context = GetTestEFContext(false); var users = context.Users.Where(u => u.UserId == 1).ToList(); var segment = recorder.TraceContext.GetEntity(); Assert.AreEqual(3, segment.Subsegments.Count); var query_subsegment = segment.Subsegments[2]; AssertQueryNotCollected(query_subsegment); recorder.EndSegment(); }
public void TestTryParseSubsegment() { using (var recorder = new AWSXRayRecorder()) { recorder.BeginSegment("TraceHeaderTest", TraceId); recorder.BeginSubsegment("subjob"); var subsegment = TraceContext.GetEntity(); TraceHeader header; Assert.IsTrue(TraceHeader.TryParse(subsegment, out header)); Assert.AreEqual(TraceId, header.RootTraceId); Assert.AreEqual(subsegment.Id, header.ParentId); Assert.AreEqual(SampleDecision.Sampled, header.Sampled); recorder.EndSubsegment(); recorder.EndSegment(); } }
public void Test_EFCore_successful_query() { // Arrange var recorder = new AWSXRayRecorder(); recorder.BeginSegment("TestSegment"); var context = GetTestEFContext(true); // Act var users = context.Users.Where(u => u.UserId == 1).ToList(); // Assert var segment = recorder.TraceContext.GetEntity(); Assert.AreEqual(3, segment.Subsegments.Count); //2 subsegments from validating the db and 1 from the actual query var query_subsegment = segment.Subsegments[2]; AssertQueryCollected(query_subsegment); recorder.EndSegment(); }
public async Task InterceptAsync_DoesNot_CollectQueries_When_NotEnabled() { // arrange #if !NET45 var recorder = new AWSXRayRecorder { XRayOptions = new XRayOptions() }; #else var recorder = new AWSXRayRecorder(); #endif recorder.BeginSegment("test"); var interceptor = new DbCommandInterceptor(recorder); // act await interceptor.InterceptAsync(() => Task.FromResult(0), _command); // assert var segment = AWSXRayRecorder.Instance.TraceContext.GetEntity(); AssertNotCollected(recorder); recorder.EndSegment(); }
public void TestTrustedConnection_DoesNotCollectUserID() { // arrange #if !NET45 var recorder = new AWSXRayRecorder { XRayOptions = new XRayOptions() }; #else var recorder = new AWSXRayRecorder(); #endif InitializeMockTrustedConnection(); recorder.BeginSegment("test"); var interceptor = new DbCommandInterceptor(recorder); // act interceptor.Intercept(() => 0, _command); // assert var segment = AWSXRayRecorder.Instance.TraceContext.GetEntity(); AssertNotCollected(recorder, true); recorder.EndSegment(); }
public async Task InterceptAsync_DoesNot_CollectQueries_When_EnabledGlobally_And_DisabledLocally() { // arrange #if !NET45 var recorder = new AWSXRayRecorder { XRayOptions = new XRayOptions { CollectSqlQueries = true } }; #else ConfigurationManager.AppSettings[_collectSqlQueriesKey] = "true"; AppSettings.Reset(); var recorder = new AWSXRayRecorder(); #endif var interceptor = new DbCommandInterceptor(recorder, collectSqlQueries: false); recorder.BeginSegment("test"); // act await interceptor.InterceptAsync(() => Task.FromResult(0), _command); // assert AssertNotCollected(recorder); recorder.EndSegment(); }
public void Test_EFCore_query_with_exception() { var recorder = new AWSXRayRecorder(); recorder.BeginSegment("TestSegment"); var context = GetTestEFContext(true); try { context.Database.ExecuteSqlCommand("Select * From FakeTable"); // A false sql command which results in 'no such table: FakeTable' exception } catch { // ignore } var segment = recorder.TraceContext.GetEntity(); Assert.AreEqual(3, segment.Subsegments.Count); var subsegment = segment.Subsegments[2]; Assert.AreEqual(true, subsegment.HasFault); recorder.EndSegment(); }
public void Intercept_CollectsQueries_When_EnabledGlobally() { // arrange #if !NET45 var recorder = new AWSXRayRecorder { XRayOptions = new XRayOptions { CollectSqlQueries = true } }; #else ConfigurationManager.AppSettings[_collectSqlQueriesKey] = "true"; AppSettings.Reset(); var recorder = new AWSXRayRecorder(); #endif var interceptor = new DbCommandInterceptor(recorder); recorder.BeginSegment("test"); // act interceptor.Intercept(() => 0, _command); // assert AssertCollected(recorder); recorder.EndSegment(); }
public void TestAddEventHandlerToDynamoDBClient() { using (var client = new AmazonDynamoDBClient(new AnonymousAWSCredentials(), RegionEndpoint.USEast1)) { _handler.AddEventHandler(client); string requestId = @"fakerequ-esti-dfak-ereq-uestidfakere"; CustomResponses.SetResponse(client, null, requestId, true); _recorder.BeginSegment("test", TraceId); client.ListTables(); var segment = TraceContext.GetEntity(); var subsegment = segment.Subsegments[0]; _recorder.EndSegment(); Assert.AreEqual(segment.Subsegments.Count, 1); Assert.AreEqual(subsegment.Name, "DynamoDBv2"); Assert.AreEqual(subsegment.Aws["region"], RegionEndpoint.USEast1.SystemName); Assert.AreEqual(subsegment.Aws["operation"], "ListTables"); Assert.AreEqual(requestId, subsegment.Aws["request_id"]); Assert.AreEqual("aws", subsegment.Namespace); } }
/// <summary> /// Process http request. /// </summary> internal static void ProcessRequest(HttpContext httpContext) { HttpRequest request = httpContext.Request; string headerString = null; if (request.Headers.TryGetValue(TraceHeader.HeaderKey, out StringValues headerValue)) { if (headerValue.Count >= 1) { headerString = headerValue[0]; } } if (!TraceHeader.TryParse(headerString, out TraceHeader traceHeader)) { _logger.DebugFormat("Trace header doesn't exist or not valid : ({0}). Injecting a new one.", headerString); traceHeader = new TraceHeader { RootTraceId = TraceId.NewId(), ParentId = null, Sampled = SampleDecision.Unknown }; } var segmentName = SegmentNamingStrategy.GetSegmentName(request); bool isSampleDecisionRequested = traceHeader.Sampled == SampleDecision.Requested; string ruleName = null; // Make sample decision if (traceHeader.Sampled == SampleDecision.Unknown || traceHeader.Sampled == SampleDecision.Requested) { string host = request.Host.Host; string url = request.Path; string method = request.Method; SamplingInput samplingInput = new SamplingInput(host, url, method, segmentName, _recorder.Origin); SamplingResponse sampleResponse = _recorder.SamplingStrategy.ShouldTrace(samplingInput); traceHeader.Sampled = sampleResponse.SampleDecision; ruleName = sampleResponse.RuleName; } if (AWSXRayRecorder.IsLambda()) { _recorder.BeginSubsegment(segmentName); } else { SamplingResponse samplingResponse = new SamplingResponse(ruleName, traceHeader.Sampled); // get final ruleName and SampleDecision _recorder.BeginSegment(SegmentNamingStrategy.GetSegmentName(request), traceHeader.RootTraceId, traceHeader.ParentId, samplingResponse); } if (!AWSXRayRecorder.Instance.IsTracingDisabled()) { var requestAttributes = PopulateRequestAttributes(request); _recorder.AddHttpInformation("request", requestAttributes); } // Mark the segment as auto-instrumented AgentUtil.AddAutoInstrumentationMark(); if (isSampleDecisionRequested) { httpContext.Response.Headers.Add(TraceHeader.HeaderKey, traceHeader.ToString()); // Its recommended not to modify response header after _next.Invoke() call } }
public void TestSyncCreateSegmentAndSubsegments() { _recorder.BeginSegment("parent", TraceId); Segment parent = (Segment)AWSXRayRecorder.Instance.TraceContext.GetEntity(); _recorder.BeginSubsegment("child"); Subsegment child = (Subsegment)AWSXRayRecorder.Instance.TraceContext.GetEntity(); _recorder.EndSubsegment(); Assert.ReferenceEquals(AWSXRayRecorder.Instance.TraceContext.GetEntity(), parent); _recorder.EndSegment(); Assert.ReferenceEquals(parent, child.Parent); Assert.IsTrue(parent.Subsegments.Contains(child)); }
/// <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); }