/// <summary> /// OnMethodBegin callback /// </summary> /// <typeparam name="TTarget">Type of the target</typeparam> /// <param name="instance">Instance value, aka `this` of the instrumented method.</param> /// <returns>Calltarget state value</returns> public static CallTargetState OnMethodBegin <TTarget>(TTarget instance) where TTarget : ITestMethodRunner, IDuckType { if (!Common.TestTracer.Settings.IsIntegrationEnabled(IntegrationId)) { return(CallTargetState.GetDefault()); } ITestMethod testMethodInfo = instance.TestMethodInfo; MethodInfo testMethod = testMethodInfo.MethodInfo; object[] testMethodArguments = testMethodInfo.Arguments; string testFramework = "MSTestV2 " + instance.Type.Assembly.GetName().Version; string testSuite = testMethodInfo.TestClassName; string testName = testMethodInfo.TestMethodName; Scope scope = Common.TestTracer.StartActive("mstest.test", serviceName: Common.ServiceName); Span span = scope.Span; span.Type = SpanTypes.Test; span.SetTraceSamplingPriority(SamplingPriority.AutoKeep); span.ResourceName = $"{testSuite}.{testName}"; span.SetTag(TestTags.Suite, testSuite); span.SetTag(TestTags.Name, testName); span.SetTag(TestTags.Framework, testFramework); span.SetTag(TestTags.Type, TestTags.TypeTest); CIEnvironmentValues.DecorateSpan(span); var framework = FrameworkDescription.Instance; span.SetTag(CommonTags.RuntimeName, framework.Name); span.SetTag(CommonTags.RuntimeVersion, framework.ProductVersion); span.SetTag(CommonTags.RuntimeArchitecture, framework.ProcessArchitecture); span.SetTag(CommonTags.OSArchitecture, framework.OSArchitecture); span.SetTag(CommonTags.OSPlatform, framework.OSPlatform); span.SetTag(CommonTags.OSVersion, Environment.OSVersion.VersionString); // Get test parameters ParameterInfo[] methodParameters = testMethod.GetParameters(); if (methodParameters?.Length > 0) { TestParameters testParameters = new TestParameters(); testParameters.Metadata = new Dictionary <string, object>(); testParameters.Arguments = new Dictionary <string, object>(); for (int i = 0; i < methodParameters.Length; i++) { if (testMethodArguments != null && i < testMethodArguments.Length) { testParameters.Arguments[methodParameters[i].Name] = testMethodArguments[i]?.ToString() ?? "(null)"; } else { testParameters.Arguments[methodParameters[i].Name] = "(default)"; } } span.SetTag(TestTags.Parameters, testParameters.ToJSON()); } // Get traits Dictionary <string, List <string> > testTraits = GetTraits(testMethod); if (testTraits != null && testTraits.Count > 0) { span.SetTag(TestTags.Traits, Datadog.Trace.Vendors.Newtonsoft.Json.JsonConvert.SerializeObject(testTraits)); } span.ResetStartTime(); return(new CallTargetState(scope)); }
internal static Scope CreateScope(ref TestRunnerStruct runnerInstance, Type targetType) { string testBundle = runnerInstance.TestClass.Assembly?.GetName().Name; string testSuite = runnerInstance.TestClass.ToString(); string testName = runnerInstance.TestMethod.Name; string testFramework = "xUnit"; Scope scope = Tracer.Instance.StartActiveInternal("xunit.test"); Span span = scope.Span; span.Type = SpanTypes.Test; span.SetTraceSamplingPriority(SamplingPriorityValues.AutoKeep); span.ResourceName = $"{testSuite}.{testName}"; span.SetTag(Tags.Origin, TestTags.CIAppTestOriginName); span.SetTag(TestTags.Bundle, testBundle); span.SetTag(TestTags.Suite, testSuite); span.SetTag(TestTags.Name, testName); span.SetTag(TestTags.Framework, testFramework); span.SetTag(TestTags.FrameworkVersion, targetType.Assembly?.GetName().Version.ToString()); span.SetTag(TestTags.Type, TestTags.TypeTest); var framework = FrameworkDescription.Instance; CIEnvironmentValues.Instance.DecorateSpan(span); span.SetTag(CommonTags.LibraryVersion, TracerConstants.AssemblyVersion); span.SetTag(CommonTags.RuntimeName, framework.Name); span.SetTag(CommonTags.RuntimeVersion, framework.ProductVersion); span.SetTag(CommonTags.RuntimeArchitecture, framework.ProcessArchitecture); span.SetTag(CommonTags.OSArchitecture, framework.OSArchitecture); span.SetTag(CommonTags.OSPlatform, framework.OSPlatform); span.SetTag(CommonTags.OSVersion, Environment.OSVersion.VersionString); // Get test parameters object[] testMethodArguments = runnerInstance.TestMethodArguments; ParameterInfo[] methodParameters = runnerInstance.TestMethod.GetParameters(); if (methodParameters?.Length > 0 && testMethodArguments?.Length > 0) { TestParameters testParameters = new TestParameters(); testParameters.Metadata = new Dictionary <string, object>(); testParameters.Arguments = new Dictionary <string, object>(); testParameters.Metadata[TestTags.MetadataTestName] = runnerInstance.TestCase.DisplayName; for (int i = 0; i < methodParameters.Length; i++) { if (i < testMethodArguments.Length) { testParameters.Arguments[methodParameters[i].Name] = Common.GetParametersValueData(testMethodArguments[i]); } else { testParameters.Arguments[methodParameters[i].Name] = "(default)"; } } span.SetTag(TestTags.Parameters, testParameters.ToJSON()); } // Get traits Dictionary <string, List <string> > traits = runnerInstance.TestCase.Traits; if (traits.Count > 0) { span.SetTag(TestTags.Traits, Datadog.Trace.Vendors.Newtonsoft.Json.JsonConvert.SerializeObject(traits)); } // Test code and code owners Common.DecorateSpanWithSourceAndCodeOwners(span, runnerInstance.TestMethod); Tracer.Instance.TracerManager.Telemetry.IntegrationGeneratedSpan(IntegrationId); Ci.Coverage.CoverageReporter.Handler.StartSession(); // Skip tests if (runnerInstance.SkipReason != null) { span.SetTag(TestTags.Status, TestTags.StatusSkip); span.SetTag(TestTags.SkipReason, runnerInstance.SkipReason); var coverageSession = Ci.Coverage.CoverageReporter.Handler.EndSession(); if (coverageSession is not null) { scope.Span.SetTag("test.coverage", Datadog.Trace.Vendors.Newtonsoft.Json.JsonConvert.SerializeObject(coverageSession)); } span.Finish(TimeSpan.Zero); scope.Dispose(); return(null); } span.ResetStartTime(); return(scope); }
internal static Scope CreateScope(ITest currentTest, Type targetType) { MethodInfo testMethod = currentTest.Method.MethodInfo; object[] testMethodArguments = currentTest.Arguments; IPropertyBag testMethodProperties = currentTest.Properties; if (testMethod == null) { return(null); } string testFramework = "NUnit"; string fullName = currentTest.FullName; string composedTestName = currentTest.Name; string testName = testMethod.Name; string testSuite = testMethod.DeclaringType?.FullName; string testBundle = testMethod.DeclaringType?.Assembly?.GetName().Name; // Extract the test suite from the full name to support custom fixture parameters and test declared in base classes. if (fullName.EndsWith("." + composedTestName)) { testSuite = fullName.Substring(0, fullName.Length - (composedTestName.Length + 1)); } string skipReason = null; Scope scope = Tracer.Instance.StartActiveInternal("nunit.test"); Span span = scope.Span; span.Type = SpanTypes.Test; span.SetTraceSamplingPriority(SamplingPriorityValues.AutoKeep); span.ResourceName = $"{testSuite}.{testName}"; span.SetTag(Tags.Origin, TestTags.CIAppTestOriginName); span.SetTag(Tags.Language, TracerConstants.Language); span.SetTag(TestTags.Bundle, testBundle); span.SetTag(TestTags.Suite, testSuite); span.SetTag(TestTags.Name, testName); span.SetTag(TestTags.Framework, testFramework); span.SetTag(TestTags.FrameworkVersion, targetType.Assembly?.GetName().Version.ToString()); span.SetTag(TestTags.Type, TestTags.TypeTest); CIEnvironmentValues.Instance.DecorateSpan(span); var framework = FrameworkDescription.Instance; span.SetTag(CommonTags.LibraryVersion, TracerConstants.AssemblyVersion); span.SetTag(CommonTags.RuntimeName, framework.Name); span.SetTag(CommonTags.RuntimeVersion, framework.ProductVersion); span.SetTag(CommonTags.RuntimeArchitecture, framework.ProcessArchitecture); span.SetTag(CommonTags.OSArchitecture, framework.OSArchitecture); span.SetTag(CommonTags.OSPlatform, framework.OSPlatform); span.SetTag(CommonTags.OSVersion, Environment.OSVersion.VersionString); // Get test parameters ParameterInfo[] methodParameters = testMethod.GetParameters(); if (methodParameters?.Length > 0) { TestParameters testParameters = new TestParameters(); testParameters.Metadata = new Dictionary <string, object>(); testParameters.Arguments = new Dictionary <string, object>(); testParameters.Metadata[TestTags.MetadataTestName] = currentTest.Name; for (int i = 0; i < methodParameters.Length; i++) { if (testMethodArguments != null && i < testMethodArguments.Length) { testParameters.Arguments[methodParameters[i].Name] = Common.GetParametersValueData(testMethodArguments[i]); } else { testParameters.Arguments[methodParameters[i].Name] = "(default)"; } } span.SetTag(TestTags.Parameters, testParameters.ToJSON()); } // Get traits if (testMethodProperties != null) { Dictionary <string, List <string> > traits = new Dictionary <string, List <string> >(); skipReason = (string)testMethodProperties.Get("_SKIPREASON"); foreach (var key in testMethodProperties.Keys) { if (key == "_SKIPREASON" || key == "_JOINTYPE") { continue; } IList value = testMethodProperties[key]; if (value != null) { List <string> lstValues = new List <string>(); foreach (object valObj in value) { if (valObj is null) { continue; } lstValues.Add(valObj.ToString()); } traits[key] = lstValues; } else { traits[key] = null; } } if (traits.Count > 0) { span.SetTag(TestTags.Traits, Vendors.Newtonsoft.Json.JsonConvert.SerializeObject(traits)); } } if (skipReason != null) { FinishSkippedScope(scope, skipReason); scope = null; } span.ResetStartTime(); Tracer.Instance.TracerManager.Telemetry.IntegrationGeneratedSpan(IntegrationId); return(scope); }
internal static Scope CreateScope(ref TestRunnerStruct runnerInstance, Type targetType) { string testSuite = runnerInstance.TestClass.ToString(); string testName = runnerInstance.TestMethod.Name; AssemblyName testInvokerAssemblyName = targetType.Assembly.GetName(); string testFramework = "xUnit " + testInvokerAssemblyName.Version.ToString(); Scope scope = Common.TestTracer.StartActive("xunit.test", serviceName: Common.ServiceName); Span span = scope.Span; span.Type = SpanTypes.Test; span.SetTraceSamplingPriority(SamplingPriority.AutoKeep); span.ResourceName = $"{testSuite}.{testName}"; span.SetTag(TestTags.Suite, testSuite); span.SetTag(TestTags.Name, testName); span.SetTag(TestTags.Framework, testFramework); span.SetTag(TestTags.Type, TestTags.TypeTest); CIEnvironmentValues.DecorateSpan(span); var framework = FrameworkDescription.Instance; span.SetTag(CommonTags.RuntimeName, framework.Name); span.SetTag(CommonTags.RuntimeVersion, framework.ProductVersion); span.SetTag(CommonTags.RuntimeArchitecture, framework.ProcessArchitecture); span.SetTag(CommonTags.OSArchitecture, framework.OSArchitecture); span.SetTag(CommonTags.OSPlatform, framework.OSPlatform); span.SetTag(CommonTags.OSVersion, Environment.OSVersion.VersionString); // Get test parameters object[] testMethodArguments = runnerInstance.TestMethodArguments; ParameterInfo[] methodParameters = runnerInstance.TestMethod.GetParameters(); if (methodParameters?.Length > 0 && testMethodArguments?.Length > 0) { TestParameters testParameters = new TestParameters(); testParameters.Metadata = new Dictionary <string, object>(); testParameters.Arguments = new Dictionary <string, object>(); testParameters.Metadata[TestTags.MetadataTestName] = runnerInstance.TestCase.DisplayName; for (int i = 0; i < methodParameters.Length; i++) { if (i < testMethodArguments.Length) { testParameters.Arguments[methodParameters[i].Name] = testMethodArguments[i]?.ToString() ?? "(null)"; } else { testParameters.Arguments[methodParameters[i].Name] = "(default)"; } } span.SetTag(TestTags.Parameters, testParameters.ToJSON()); } // Get traits Dictionary <string, List <string> > traits = runnerInstance.TestCase.Traits; if (traits.Count > 0) { span.SetTag(TestTags.Traits, Datadog.Trace.Vendors.Newtonsoft.Json.JsonConvert.SerializeObject(traits)); } // Skip tests if (runnerInstance.SkipReason != null) { span.SetTag(TestTags.Status, TestTags.StatusSkip); span.SetTag(TestTags.SkipReason, runnerInstance.SkipReason); span.Finish(new TimeSpan(10)); scope.Dispose(); return(null); } span.ResetStartTime(); return(scope); }
internal static Scope CreateScope(ITest currentTest, Type targetType) { MethodInfo testMethod = currentTest.Method.MethodInfo; object[] testMethodArguments = currentTest.Arguments; IPropertyBag testMethodProperties = currentTest.Properties; if (testMethod == null) { return(null); } string testFramework = "NUnit " + targetType?.Assembly?.GetName().Version; string testSuite = testMethod.DeclaringType?.FullName; string testName = testMethod.Name; string skipReason = null; Scope scope = Common.TestTracer.StartActive("nunit.test", serviceName: Common.TestTracer.DefaultServiceName); Span span = scope.Span; span.Type = SpanTypes.Test; span.SetTraceSamplingPriority(SamplingPriority.AutoKeep); span.ResourceName = $"{testSuite}.{testName}"; span.SetTag(Tags.Origin, TestTags.CIAppTestOriginName); span.SetTag(TestTags.Suite, testSuite); span.SetTag(TestTags.Name, testName); span.SetTag(TestTags.Framework, testFramework); span.SetTag(TestTags.Type, TestTags.TypeTest); CIEnvironmentValues.DecorateSpan(span); var framework = FrameworkDescription.Instance; span.SetTag(CommonTags.RuntimeName, framework.Name); span.SetTag(CommonTags.RuntimeVersion, framework.ProductVersion); span.SetTag(CommonTags.RuntimeArchitecture, framework.ProcessArchitecture); span.SetTag(CommonTags.OSArchitecture, framework.OSArchitecture); span.SetTag(CommonTags.OSPlatform, framework.OSPlatform); span.SetTag(CommonTags.OSVersion, Environment.OSVersion.VersionString); // Get test parameters ParameterInfo[] methodParameters = testMethod.GetParameters(); if (methodParameters?.Length > 0) { TestParameters testParameters = new TestParameters(); testParameters.Metadata = new Dictionary <string, object>(); testParameters.Arguments = new Dictionary <string, object>(); testParameters.Metadata[TestTags.MetadataTestName] = currentTest.Name; for (int i = 0; i < methodParameters.Length; i++) { if (testMethodArguments != null && i < testMethodArguments.Length) { testParameters.Arguments[methodParameters[i].Name] = testMethodArguments[i]?.ToString() ?? "(null)"; } else { testParameters.Arguments[methodParameters[i].Name] = "(default)"; } } span.SetTag(TestTags.Parameters, testParameters.ToJSON()); } // Get traits if (testMethodProperties != null) { Dictionary <string, List <string> > traits = new Dictionary <string, List <string> >(); skipReason = (string)testMethodProperties.Get("_SKIPREASON"); foreach (var key in testMethodProperties.Keys) { if (key == "_SKIPREASON" || key == "_JOINTYPE") { continue; } IList value = testMethodProperties[key]; if (value != null) { List <string> lstValues = new List <string>(); foreach (object valObj in value) { if (valObj is null) { continue; } lstValues.Add(valObj.ToString()); } traits[key] = lstValues; } else { traits[key] = null; } } if (traits.Count > 0) { span.SetTag(TestTags.Traits, Datadog.Trace.Vendors.Newtonsoft.Json.JsonConvert.SerializeObject(traits)); } } if (skipReason != null) { FinishSkippedScope(scope, skipReason); scope = null; } span.ResetStartTime(); return(scope); }
internal static Scope OnMethodBegin <TTestMethod>(TTestMethod testMethodInfo, Type type) where TTestMethod : ITestMethod { MethodInfo testMethod = testMethodInfo.MethodInfo; object[] testMethodArguments = testMethodInfo.Arguments; string testFramework = "MSTestV2"; string testSuite = testMethodInfo.TestClassName; string testName = testMethodInfo.TestMethodName; Scope scope = Tracer.Instance.StartActiveInternal("mstest.test"); Span span = scope.Span; span.Type = SpanTypes.Test; span.SetTraceSamplingPriority(SamplingPriorityValues.AutoKeep); span.ResourceName = $"{testSuite}.{testName}"; span.SetTag(Tags.Origin, TestTags.CIAppTestOriginName); span.SetTag(Tags.Language, TracerConstants.Language); span.SetTag(TestTags.Suite, testSuite); span.SetTag(TestTags.Name, testName); span.SetTag(TestTags.Framework, testFramework); span.SetTag(TestTags.FrameworkVersion, type.Assembly?.GetName().Version.ToString()); span.SetTag(TestTags.Type, TestTags.TypeTest); span.SetTag(CommonTags.LibraryVersion, TracerConstants.AssemblyVersion); CIEnvironmentValues.Instance.DecorateSpan(span); var framework = FrameworkDescription.Instance; span.SetTag(CommonTags.RuntimeName, framework.Name); span.SetTag(CommonTags.RuntimeVersion, framework.ProductVersion); span.SetTag(CommonTags.RuntimeArchitecture, framework.ProcessArchitecture); span.SetTag(CommonTags.OSArchitecture, framework.OSArchitecture); span.SetTag(CommonTags.OSPlatform, framework.OSPlatform); span.SetTag(CommonTags.OSVersion, Environment.OSVersion.VersionString); // Get test parameters ParameterInfo[] methodParameters = testMethod.GetParameters(); if (methodParameters?.Length > 0) { TestParameters testParameters = new TestParameters(); testParameters.Metadata = new Dictionary <string, object>(); testParameters.Arguments = new Dictionary <string, object>(); for (int i = 0; i < methodParameters.Length; i++) { if (testMethodArguments != null && i < testMethodArguments.Length) { testParameters.Arguments[methodParameters[i].Name] = Common.GetParametersValueData(testMethodArguments[i]); } else { testParameters.Arguments[methodParameters[i].Name] = "(default)"; } } span.SetTag(TestTags.Parameters, testParameters.ToJSON()); } // Get traits Dictionary <string, List <string> > testTraits = GetTraits(testMethod); if (testTraits != null && testTraits.Count > 0) { span.SetTag(TestTags.Traits, Datadog.Trace.Vendors.Newtonsoft.Json.JsonConvert.SerializeObject(testTraits)); } span.ResetStartTime(); Tracer.Instance.TracerManager.Telemetry.IntegrationGeneratedSpan(IntegrationId); return(scope); }