/// <summary> /// Associates telemetry item to a SQL command object to to avoid duplicate tracking. /// When there is an existing telemetry item in the corresponding to the given SQL REQUEST, we return the existing telemetry and associate the same with the SQL REQUEST. /// </summary> /// <param name="telemetry">Telemetry object that needs to be associated with the web request.</param> /// <param name="sqlRequest">SQL request object which is used as a key to store in the tables.</param> /// <returns>Dependency telemetry item with an associated dependency telemetry item.</returns> public static DependencyTelemetry AssociateTelemetryWithSqlRequest(this DependencyTelemetry telemetry, SqlCommand sqlRequest) { if (sqlRequest == null) { DependencyCollectorEventSource.Log.WebRequestIsNullWarning(); return(null); } if (telemetry == null) { DependencyCollectorEventSource.Log.TelemetryToTrackIsNullWarning(); return(null); } var telemetryTuple = ClientServerDependencyTracker.GetTupleForSqlDependencies(sqlRequest); if (telemetryTuple != null) { return(telemetryTuple.Item1 as DependencyTelemetry); } else { ClientServerDependencyTracker.AddTupleForSqlDependencies(sqlRequest, telemetry, true); } return(telemetry); }
public void BeginWebTrackingWithParentActivityReturnsOperationItemWithTelemetryItemW3COff() { Activity.DefaultIdFormat = ActivityIdFormat.Hierarchical; Activity.ForceDefaultIdFormat = true; var parentActivity = new Activity("test"); parentActivity.SetParentId("|guid.1234_"); parentActivity.AddBaggage("k", "v"); parentActivity.Start(); var telemetry = ClientServerDependencyTracker.BeginTracking(this.telemetryClient); Assert.AreEqual(parentActivity.Id, telemetry.Context.Operation.ParentId); Assert.AreEqual(parentActivity.RootId, telemetry.Context.Operation.Id); Assert.IsTrue(telemetry.Id.StartsWith(parentActivity.Id, StringComparison.Ordinal)); Assert.AreNotEqual(parentActivity.Id, telemetry.Id); var properties = telemetry.Properties; Assert.AreEqual(1, properties.Count); Assert.AreEqual("v", properties["k"]); parentActivity.Stop(); }
public void BeginWebTrackingWithParentActivityReturnsOperationItemWithTelemetryItem() { var parentActivity = new Activity("test"); parentActivity.AddBaggage("k", "v"); parentActivity.TraceStateString = "state=some"; parentActivity.Start(); var telemetry = ClientServerDependencyTracker.BeginTracking(this.telemetryClient); var currentActivity = Activity.Current; Assert.IsNotNull(Activity.Current); Assert.AreNotEqual(parentActivity, currentActivity); Assert.AreEqual(parentActivity, currentActivity.Parent); Assert.AreEqual(currentActivity.SpanId.ToHexString(), telemetry.Id); Assert.AreEqual(currentActivity.TraceId.ToHexString(), telemetry.Context.Operation.Id); Assert.AreEqual(currentActivity.ParentSpanId.ToHexString(), telemetry.Context.Operation.ParentId); var properties = telemetry.Properties; Assert.AreEqual(2, properties.Count); Assert.AreEqual("v", properties["k"]); Assert.AreEqual("state=some", properties["tracestate"]); parentActivity.Stop(); }
public void AddTupleForWebDependenciesThrowsExceptionIfExists() { var telemetry = new DependencyTelemetry(); var falseTelemetry = new DependencyTelemetry(); ClientServerDependencyTracker.AddTupleForWebDependencies(this.webRequest, falseTelemetry, false); ClientServerDependencyTracker.AddTupleForWebDependencies(this.webRequest, telemetry, false); }
public void EndTrackingComputesTheDurationOfTelemetryItem() { var telemetry = ClientServerDependencyTracker.BeginTracking(this.telemetryClient); ClientServerDependencyTracker.EndTracking(this.telemetryClient, telemetry); var telemetryItem = this.sendItems[0] as DependencyTelemetry; this.ValidateSentTelemetry(telemetryItem); }
public void BeginWebTrackingReturnsOperationItemWithTelemetryItem() { var telemetry = ClientServerDependencyTracker.BeginTracking(this.telemetryClient); Assert.AreEqual(telemetry.Timestamp, telemetry.Timestamp); Assert.IsNull(telemetry.Context.Operation.ParentId); Assert.IsNotNull(telemetry.Context.Operation.Id); Assert.IsTrue(telemetry.Id.StartsWith('|' + telemetry.Context.Operation.Id, StringComparison.Ordinal)); Assert.AreEqual(0, telemetry.Properties.Count); }
public void EndTrackingSendsTelemetryItemOnSuccess() { var telemetry = ClientServerDependencyTracker.BeginTracking(this.telemetryClient); ClientServerDependencyTracker.EndTracking(this.telemetryClient, telemetry); Assert.AreEqual(1, this.sendItems.Count); telemetry = ClientServerDependencyTracker.BeginTracking(this.telemetryClient); ClientServerDependencyTracker.EndTracking(this.telemetryClient, telemetry); Assert.AreEqual(2, this.sendItems.Count); }
public void AddTupleForSqlDependenciesAddsTelemetryTupleToTheTable() { var telemetry = new DependencyTelemetry(); ClientServerDependencyTracker.AddTupleForSqlDependencies(this.sqlRequest, telemetry, false); var tuple = ClientServerDependencyTracker.GetTupleForSqlDependencies(this.sqlRequest); Assert.IsNotNull(tuple); Assert.IsNotNull(tuple.Item1); Assert.AreEqual(telemetry, tuple.Item1); }
public void EndTrackingTracksTelemetryItemWithInitializedContent() { var telemetry = ClientServerDependencyTracker.BeginTracking(this.telemetryClient); ClientServerDependencyTracker.EndTracking(this.telemetryClient, telemetry); var telemetryItem = this.sendItems[0] as DependencyTelemetry; Assert.IsNotNull(telemetryItem.Context.User.Id); Assert.IsNotNull(telemetryItem.Context.Session.Id); Assert.AreEqual(telemetryItem.Context.User.Id, "UserID"); Assert.AreEqual(telemetryItem.Context.Session.Id, "SessionID"); }
public void FrameworkHttpProcessingIsDisabledWhenHttpDesktopDiagSourceIsEnabled() { DependencyTableStore.IsDesktopHttpDiagnosticSourceActivated = true; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.testUrl); var id = ClientServerDependencyTracker.GetIdForRequestObject(request); this.httpProcessingFramework.OnBeginHttpCallback(id, this.testUrl.ToString()); this.httpProcessingFramework.OnEndHttpCallback(id, null, false, 200); Assert.AreEqual(0, this.sendItems.Count, "No telemetry item should be sent"); }
public void RddTestHttpProcessingFrameworkOnEndHttpCallbackInvalidId() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.testUrl); var id1 = ClientServerDependencyTracker.GetIdForRequestObject(request); var id2 = 200; this.httpProcessingFramework.OnBeginHttpCallback(id1, this.testUrl.ToString()); Thread.Sleep(this.sleepTimeMsecBetweenBeginAndEnd); Assert.AreEqual(0, this.sendItems.Count, "No telemetry item should be processed without calling End"); this.httpProcessingFramework.OnEndHttpCallback(id2, true, true, null); Assert.AreEqual(0, this.sendItems.Count, "No telemetry item should be processed as invalid id is passed"); }
public void HttpProcessorSetsTargetForNonStandardPort() { HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.testUrlNonStandardPort); var id = ClientServerDependencyTracker.GetIdForRequestObject(request); this.httpProcessingFramework.OnBeginHttpCallback(id, this.testUrlNonStandardPort.ToString()); this.httpProcessingFramework.OnEndHttpCallback(id, null, false, 500); Assert.AreEqual(1, this.sendItems.Count, "Exactly one telemetry item should be sent"); DependencyTelemetry receivedItem = (DependencyTelemetry)this.sendItems[0]; string expectedTarget = this.testUrlNonStandardPort.Host + ":" + this.testUrlNonStandardPort.Port; Assert.AreEqual(expectedTarget, receivedItem.Target, "HttpProcessingFramework returned incorrect target for non standard port."); }
public void OnEndHttpCallbackSetsSuccessToTrueForLessThan400() { int statusCode = 399; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.testUrl); var id = ClientServerDependencyTracker.GetIdForRequestObject(request); this.httpProcessingFramework.OnBeginHttpCallback(id, this.testUrl.ToString()); this.httpProcessingFramework.OnEndHttpCallback(id, null, false, statusCode); Assert.AreEqual(1, this.sendItems.Count, "Only one telemetry item should be sent"); var actual = this.sendItems[0] as DependencyTelemetry; Assert.IsTrue(actual.Success.Value); }
public void OnEndHttpCallbackSetsSuccessToFalseForNegativeStatusCode() { // -1 StatusCode is returned in case of no response int statusCode = -1; HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.testUrl); var id = ClientServerDependencyTracker.GetIdForRequestObject(request); this.httpProcessingFramework.OnBeginHttpCallback(id, this.testUrl.ToString()); this.httpProcessingFramework.OnEndHttpCallback(id, null, false, statusCode); Assert.AreEqual(1, this.sendItems.Count, "Only one telemetry item should be sent"); var actual = this.sendItems[0] as DependencyTelemetry; Assert.IsFalse(actual.Success.Value); }
public void BeginWebTrackingWithParentActivityReturnsOperationItemWithTelemetryItemNoParent() { var telemetry = ClientServerDependencyTracker.BeginTracking(this.telemetryClient); var currentActivity = Activity.Current; Assert.IsNotNull(Activity.Current); Assert.IsNull(currentActivity.Parent); Assert.AreEqual(currentActivity.SpanId.ToHexString(), telemetry.Id); Assert.AreEqual(currentActivity.TraceId.ToHexString(), telemetry.Context.Operation.Id); Assert.IsNull(telemetry.Context.Operation.ParentId); var properties = telemetry.Properties; Assert.AreEqual(0, properties.Count); }
public void RddTestHttpProcessingFrameworkStartTimeFromGetRequestStreamAsync() { Stopwatch stopwatch = Stopwatch.StartNew(); HttpWebRequest request = (HttpWebRequest)WebRequest.Create(this.testUrl); var id1 = ClientServerDependencyTracker.GetIdForRequestObject(request); this.httpProcessingFramework.OnBeginHttpCallback(id1, this.testUrl.ToString()); Thread.Sleep(this.sleepTimeMsecBetweenBeginAndEnd); this.httpProcessingFramework.OnBeginHttpCallback(id1, this.testUrl.ToString()); Thread.Sleep(this.sleepTimeMsecBetweenBeginAndEnd); Assert.AreEqual(0, this.sendItems.Count, "No telemetry item should be processed without calling End"); this.httpProcessingFramework.OnEndHttpCallback(id1, true, false, 200); stopwatch.Stop(); Assert.AreEqual(1, this.sendItems.Count, "Exactly one telemetry item should be sent"); ValidateTelemetryPacketForOnBeginHttpCallback(this.sendItems[0] as DependencyTelemetry, this.testUrl, RemoteDependencyConstants.HTTP, true, stopwatch.Elapsed.TotalMilliseconds, "200"); }
public void BeginWebTrackingWithDesktopParentActivityReturnsOperationItemWithTelemetryItem() { var activity = new Activity("System.Net.Http.Desktop.HttpRequestOut"); activity.SetParentId(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.None); activity.AddBaggage("k", "v"); activity.Start(); var telemetry = ClientServerDependencyTracker.BeginTracking(this.telemetryClient); Assert.AreEqual(activity.SpanId.ToHexString(), telemetry.Id); Assert.AreEqual(activity.TraceId.ToHexString(), telemetry.Context.Operation.Id); Assert.AreEqual(activity.ParentSpanId.ToHexString(), telemetry.Context.Operation.ParentId); var properties = telemetry.Properties; Assert.AreEqual(1, properties.Count); Assert.AreEqual("v", properties["k"]); activity.Stop(); }
public void BeginWebTrackingWithDesktopParentActivityReturnsOperationItemWithTelemetryItem() { var parentActivity = new Activity("System.Net.Http.Desktop.HttpRequestOut"); parentActivity.SetParentId("|guid.1234_"); parentActivity.AddBaggage("k", "v"); parentActivity.Start(); var telemetry = ClientServerDependencyTracker.BeginTracking(this.telemetryClient); Assert.AreEqual(parentActivity.Id, telemetry.Id); Assert.AreEqual(parentActivity.RootId, telemetry.Context.Operation.Id); Assert.AreEqual(parentActivity.ParentId, telemetry.Context.Operation.ParentId); var properties = telemetry.Context.Properties; Assert.AreEqual(1, properties.Count); Assert.AreEqual("v", properties["k"]); parentActivity.Stop(); }
/// <summary> /// Associates telemetry item to a web request to avoid duplicate tracking, and populates cookies with data from initialized telemetry item if setCookies is set to true. /// When there is an existing telemetry item in the corresponding to the given WEB REQUEST, we return the existing telemetry and associate the same with the WEB REQUEST. /// </summary> /// <param name="telemetry">Telemetry object that needs to be associated with the web request.</param> /// <param name="webRequest">Web request object which we use to populate from the information obtained from the initialized telemetry.</param> /// <param name="setCookies">Set cookies enables the process of setting the cookies to the web request. By default it is set to false.</param> /// <param name="setCorrelationContext">Set request headers to correlate dependency telemetry item with the request telemetry item that will process this http request.</param> /// <returns>Dependency telemetry item with an associated dependency telemetry item.</returns> public static DependencyTelemetry AssociateTelemetryWithWebRequest(this DependencyTelemetry telemetry, WebRequest webRequest, bool setCookies = false, bool setCorrelationContext = false) { if (webRequest == null) { DependencyCollectorEventSource.Log.WebRequestIsNullWarning(); return(null); } if (telemetry == null) { DependencyCollectorEventSource.Log.TelemetryToTrackIsNullWarning(); return(null); } DependencyTelemetry result; var telemetryTuple = ClientServerDependencyTracker.GetTupleForWebDependencies(webRequest); if (telemetryTuple != null) { result = telemetryTuple.Item1 as DependencyTelemetry; } else { result = telemetry; ClientServerDependencyTracker.AddTupleForWebDependencies(webRequest, telemetry, true); } if (setCookies) { WebRequestDependencyTrackingHelpers.SetUserAndSessionContextForWebRequest(result, webRequest); } if (setCorrelationContext) { WebRequestDependencyTrackingHelpers.SetCorrelationContextForWebRequest(result, webRequest); } return(telemetry); }
public void GetTupleForSqlDependenciesReturnsNullIfEntryDoesNotExistInTables() { Assert.IsNull(ClientServerDependencyTracker.GetTupleForSqlDependencies(new SqlCommand("select * from table;"))); }
public void GetTupleForSqlDependenciesThrowsArgumentNullExceptionForNullSqlRequest() { ClientServerDependencyTracker.GetTupleForSqlDependencies(null); }
public void GetTupleForSqlDependenciesReturnsNullIfTheItemDoesNotExistInTheTable() { var tuple = ClientServerDependencyTracker.GetTupleForSqlDependencies(this.sqlRequest); Assert.IsNull(tuple); }
public void GetTupleForWebDependenciesReturnsNullIfEntryDoesNotExistInTables() { Assert.IsNull(ClientServerDependencyTracker.GetTupleForWebDependencies(WebRequest.Create(new Uri("http://bing.com")))); }
public void AddTupleForWebDependenciesThrowsArgumentNullExceptionForNullWebRequest() { ClientServerDependencyTracker.AddTupleForWebDependencies(null, new DependencyTelemetry(), false); }
public void AddTupleForWebDependenciesThrowsArgumentNullExceptionForNullTelemetry() { ClientServerDependencyTracker.AddTupleForWebDependencies(WebRequest.Create(new Uri("http://bing.com")), null, false); }
public void AddTupleForSqlDependenciesThrowsArgumentNullExceptionForNullTelemetry() { ClientServerDependencyTracker.AddTupleForSqlDependencies(new SqlCommand("select * from table;"), null, false); }