Example #1
0
        public void ValidateDbRemoteDependencyData()
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Client,
                      parentContext: new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded),
                      startTime: DateTime.UtcNow);
            activity.Stop();

            activity.SetStatus(Status.Ok);
            activity.SetTag(SemanticConventions.AttributeDbSystem, "mssql");
            activity.SetTag(SemanticConventions.AttributePeerService, "localhost"); // only adding test via peer.service. all possible combinations are covered in HttpHelperTests.
            activity.SetTag(SemanticConventions.AttributeDbStatement, "Select * from table");

            var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);

            var remoteDependencyData = TelemetryPartB.GetRemoteDependencyData(activity, ref monitorTags);

            Assert.Equal(ActivityName, remoteDependencyData.Name);
            Assert.Equal(activity.Context.SpanId.ToHexString(), remoteDependencyData.Id);
            Assert.Equal("Select * from table", remoteDependencyData.Data);
            Assert.Null(remoteDependencyData.ResultCode);
            Assert.Equal(activity.Duration.ToString("c", CultureInfo.InvariantCulture), remoteDependencyData.Duration);
            Assert.Equal(activity.GetStatus() != Status.Error, remoteDependencyData.Success);
            Assert.True(remoteDependencyData.Properties.Count == 0);
            Assert.True(remoteDependencyData.Measurements.Count == 0);
        }
Example #2
0
        public void ValidateHttpRequestData()
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Server,
                      parentContext: new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded),
                      startTime: DateTime.UtcNow);
            activity.Stop();

            var httpUrl = "https://www.foo.bar/search";

            activity.SetStatus(Status.Ok);
            activity.SetTag(SemanticConventions.AttributeHttpMethod, "GET");
            activity.SetTag(SemanticConventions.AttributeHttpUrl, httpUrl); // only adding test via http.url. all possible combinations are covered in HttpHelperTests.
            activity.SetTag(SemanticConventions.AttributeHttpStatusCode, null);

            var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);

            var requestData = TelemetryPartB.GetRequestData(activity, ref monitorTags);

            Assert.Equal($"GET {activity.DisplayName}", requestData.Name);
            Assert.Equal(activity.Context.SpanId.ToHexString(), requestData.Id);
            Assert.Equal(httpUrl, requestData.Url);
            Assert.Equal("0", requestData.ResponseCode);
            Assert.Equal(activity.Duration.ToString("c", CultureInfo.InvariantCulture), requestData.Duration);
            Assert.Equal(activity.GetStatus() != Status.Error, requestData.Success);
            Assert.Null(requestData.Source);
            Assert.True(requestData.Properties.Count == 1); //Because of otel_statuscode attribute for activity status. todo: do not add all tags to PartC
            Assert.True(requestData.Measurements.Count == 0);
        }
Example #3
0
        public void ValidateRequestDataSuccess(string activityStatus)
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Server,
                      parentContext: new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded),
                      startTime: DateTime.UtcNow);

            if (activityStatus == "Ok")
            {
                activity.SetStatus(Status.Ok);
            }
            else if (activityStatus == "Error")
            {
                activity.SetStatus(Status.Error);
            }
            else
            {
                activity.SetStatus(Status.Unset);
            }
            activity.SetTag(SemanticConventions.AttributeHttpUrl, "https://www.foo.bar/search");

            var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);

            var requestData = TelemetryPartB.GetRequestData(activity, ref monitorTags);

            Assert.Equal(activity.GetStatus() != Status.Error, requestData.Success);
        }
        public void LinksAreTruncatedWhenCannotFitInMaxLength(string telemetryType)
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            List <ActivityLink> links = new List <ActivityLink>();

            int numberOfLinks = 150; //arbitrary number > 100

            for (int i = 0; i < numberOfLinks; i++)
            {
                ActivityLink activityLink = new ActivityLink(new ActivityContext(
                                                                 ActivityTraceId.CreateRandom(),
                                                                 ActivitySpanId.CreateRandom(),
                                                                 ActivityTraceFlags.None), null);
                links.Add(activityLink);
            }

            string expectedMSlinks = GetExpectedMSlinks(links.GetRange(0, MaxLinksAllowed));
            string actualMSlinks   = null;

            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Client,
                      parentContext: default,
                      null,
                      links,
                      startTime: DateTime.UtcNow);

            var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);

            if (telemetryType == "RequestData")
            {
                var telemetryPartBRequestData = TelemetryPartB.GetRequestData(activity, ref monitorTags);
                Assert.True(telemetryPartBRequestData.Properties.TryGetValue(msLinks, out actualMSlinks));
            }
            if (telemetryType == "RemoteDependencyData")
            {
                var telemetryPartBRemoteDependencyData = TelemetryPartB.GetRemoteDependencyData(activity, ref monitorTags);
                Assert.True(telemetryPartBRemoteDependencyData.Properties.TryGetValue(msLinks, out actualMSlinks));
            }

            // Check for valid JSON string
            try
            {
                JsonDocument document = JsonDocument.Parse(actualMSlinks);
            }
            catch (Exception)
            {
                Assert.True(false, "_MSlinks should be a JSON formatted string");
            }

            Assert.True(actualMSlinks.Length <= MaxLength);
            Assert.Equal(actualMSlinks, expectedMSlinks);
        }
Example #5
0
        public void DependencyTypeisSetToInProcForInternalSpanWithParent()
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var parentActivity            = activitySource.StartActivity("ParentActivity", ActivityKind.Internal);
            using var childActivity             = activitySource.StartActivity("ChildActivity", ActivityKind.Internal);

            var monitorTagsParent = AzureMonitorConverter.EnumerateActivityTags(parentActivity);

            var remoteDependencyDataTypeForParent = TelemetryPartB.GetRemoteDependencyData(parentActivity, ref monitorTagsParent).Type;

            Assert.Null(remoteDependencyDataTypeForParent);

            var monitorTagsChild = AzureMonitorConverter.EnumerateActivityTags(childActivity);

            var remoteDependencyDataTypeForChild = TelemetryPartB.GetRemoteDependencyData(childActivity, ref monitorTagsChild).Type;

            Assert.Equal("InProc", remoteDependencyDataTypeForChild);
        }
Example #6
0
        public void ValidateDBDependencyType(string dbSystem)
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Server,
                      parentContext: new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded),
                      startTime: DateTime.UtcNow);

            activity.SetTag(SemanticConventions.AttributeDbSystem, dbSystem);

            var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);

            var remoteDependencyDataType = TelemetryPartB.GetRemoteDependencyData(activity, ref monitorTags).Type;
            var expectedType             = TelemetryPartB.SqlDbs.Contains(dbSystem) ? "SQL" : dbSystem;

            Assert.Equal(expectedType, remoteDependencyDataType);
        }
Example #7
0
        public void HttpDependencyNameIsActivityDisplayNameByDefault()
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Client,
                      parentContext: new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded),
                      startTime: DateTime.UtcNow);

            activity.SetTag(SemanticConventions.AttributeHttpMethod, "GET");

            activity.DisplayName = "HTTP GET";

            var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);

            var remoteDependencyDataName = TelemetryPartB.GetRemoteDependencyData(activity, ref monitorTags).Name;

            Assert.Equal(activity.DisplayName, remoteDependencyDataName);
        }
Example #8
0
        public void ValidateHttpRequestDataResponseCode(string httpStatusCode)
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Server,
                      parentContext: new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded),
                      startTime: DateTime.UtcNow);

            var httpResponseCode = httpStatusCode ?? "0";

            activity.SetTag(SemanticConventions.AttributeHttpUrl, "https://www.foo.bar/search");
            activity.SetTag(SemanticConventions.AttributeHttpStatusCode, httpStatusCode);

            var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);

            var requestData = TelemetryPartB.GetRequestData(activity, ref monitorTags);

            Assert.Equal(httpResponseCode, requestData.ResponseCode);
        }
Example #9
0
        public void ValidateSuccessForRequestAndRemoteDependency(string activityStatusCode, string activityStatusDescription)
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Server,
                      parentContext: new ActivityContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded),
                      startTime: DateTime.UtcNow);

            activity.SetTag("otel.status_code", activityStatusCode);
            activity.SetTag("otel.status_description", activityStatusDescription);

            activity.SetTag(SemanticConventions.AttributeHttpUrl, "https://www.foo.bar/search");

            var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);

            var requestData          = TelemetryPartB.GetRequestData(activity, ref monitorTags);
            var remoteDependencyData = TelemetryPartB.GetRequestData(activity, ref monitorTags);

            Assert.Equal(activity.GetStatus().StatusCode != StatusCode.Error, requestData.Success);
            Assert.Equal(activity.GetStatus().StatusCode != StatusCode.Error, remoteDependencyData.Success);
        }
        public void TelemetryPartBPropertiesDoesNotContainMSLinksWhenActivityHasNoLinks(string telemetryType)
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Client,
                      parentContext: default,
                      startTime: DateTime.UtcNow);

            var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);

            if (telemetryType == "RequestData")
            {
                var telemetryPartBRequestData = TelemetryPartB.GetRequestData(activity, ref monitorTags);
                Assert.False(telemetryPartBRequestData.Properties.TryGetValue(msLinks, out var mslinks));
            }
            if (telemetryType == "RemoteDependencyData")
            {
                var telemetryPartBRemoteDependencyData = TelemetryPartB.GetRemoteDependencyData(activity, ref monitorTags);
                Assert.False(telemetryPartBRemoteDependencyData.Properties.TryGetValue(msLinks, out var mslinks));
            }
        }
        public void RequestNameMatchesOperationName(string httpMethod)
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Server,
                      null,
                      startTime: DateTime.UtcNow);
            var resource = CreateTestResource();

            activity.DisplayName = "displayname";
            if (httpMethod != null)
            {
                activity.SetTag(SemanticConventions.AttributeHttpMethod, httpMethod);
            }
            var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);

            var telemetryItem = TelemetryPartA.GetTelemetryItem(activity, ref monitorTags, resource, null);
            var requestData   = TelemetryPartB.GetRequestData(activity, ref monitorTags);

            Assert.Equal(requestData.Name, telemetryItem.Tags[ContextTagKeys.AiOperationName.ToString()]);
        }
        public void TelemetryPartBPropertiesContainsMSLinksWhenActivityHasLinks(string telemetryType)
        {
            using ActivitySource activitySource = new ActivitySource(ActivitySourceName);
            ActivityLink activityLink = new ActivityLink(new ActivityContext(
                                                             ActivityTraceId.CreateRandom(),
                                                             ActivitySpanId.CreateRandom(),
                                                             ActivityTraceFlags.None), null);

            List <ActivityLink> links = new List <ActivityLink>();

            links.Add(activityLink);

            using var activity = activitySource.StartActivity(
                      ActivityName,
                      ActivityKind.Client,
                      parentContext: default,
                      null,
                      links,
                      startTime: DateTime.UtcNow);

            string expectedMSlinks = GetExpectedMSlinks(links);
            string actualMSlinks   = null;

            var monitorTags = AzureMonitorConverter.EnumerateActivityTags(activity);

            if (telemetryType == "RequestData")
            {
                var telemetryPartBRequestData = TelemetryPartB.GetRequestData(activity, ref monitorTags);
                Assert.True(telemetryPartBRequestData.Properties.TryGetValue(msLinks, out actualMSlinks));
            }
            if (telemetryType == "RemoteDependencyData")
            {
                var telemetryPartBRemoteDependencyData = TelemetryPartB.GetRemoteDependencyData(activity, ref monitorTags);
                Assert.True(telemetryPartBRemoteDependencyData.Properties.TryGetValue(msLinks, out actualMSlinks));
            }

            Assert.Equal(expectedMSlinks, actualMSlinks);
        }