Пример #1
0
        public void ScopeManager_NotNull()
        {
            var shim = TracerShim.Create(tracer);

            // Internals of the ScopeManagerShim tested elsewhere
            Assert.NotNull(shim.ScopeManager as ScopeManagerShim);
        }
Пример #2
0
        public void Extract_ArgumentValidation()
        {
            var shim = TracerShim.Create(tracer);

            Assert.Throws <ArgumentNullException>(() => shim.Extract(null, new Mock <ITextMap>().Object));
            Assert.Throws <ArgumentNullException>(() => shim.Extract(new Mock <IFormat <ITextMap> >().Object, null));
        }
Пример #3
0
        internal static object Run(OpenTracingShimOptions options)
        {
            // Enable OpenTelemetry for the source "MyCompany.MyProduct.MyWebServer"
            // and use Console exporter.
            using var openTelemetry = Sdk.CreateTracerProvider(
                      (builder) => builder.AddActivitySource("MyCompany.MyProduct.MyWebServer")
                      .SetResource(Resources.CreateServiceResource("MyServiceName"))
                      .UseConsoleExporter(opt => opt.DisplayAsJson = options.DisplayAsJson));

            // The above line is required only in applications
            // which decide to use OpenTelemetry.

            // Following shows how to use the OpenTracing shim

            var tracer = new TracerShim(TracerProvider.Default.GetTracer("MyCompany.MyProduct.MyWebServer"), new TraceContextFormat());

            using (IScope parentScope = tracer.BuildSpan("Parent").StartActive(finishSpanOnDispose: true))
            {
                parentScope.Span.SetTag("my", "value");
                parentScope.Span.SetOperationName("parent span new name");

                // The child scope will automatically use parentScope as its parent.
                using (IScope childScope = tracer.BuildSpan("Child").StartActive(finishSpanOnDispose: true))
                {
                    childScope.Span.SetTag("Child Tag", "Child Tag Value").SetTag("ch", "value").SetTag("more", "attributes");
                }
            }

            System.Console.WriteLine("Press Enter key to exit.");

            return(null);
        }
Пример #4
0
        public void BuildSpan_NotNull()
        {
            var shim = TracerShim.Create(tracer);

            // Internals of the SpanBuilderShim tested elsewhere
            Assert.NotNull(shim.BuildSpan("foo") as SpanBuilderShim);
        }
Пример #5
0
        public void Extract_ArgumentValidation()
        {
            var tracer = TracerProvider.Default.GetTracer(TracerName);
            var shim   = new TracerShim(tracer, new TextMapPropagator());

            Assert.Throws <ArgumentNullException>(() => shim.Extract(null, new Mock <ITextMap>().Object));
            Assert.Throws <ArgumentNullException>(() => shim.Extract(new Mock <IFormat <ITextMap> >().Object, null));
        }
        public void BuildSpan_NotNull()
        {
            var tracer = TracerProvider.GetTracer(TracerName);
            var shim   = new TracerShim(tracer, new TraceContextFormat());

            // Internals of the SpanBuilderShim tested elsewhere
            Assert.NotNull(shim.BuildSpan("foo") as SpanBuilderShim);
        }
Пример #7
0
        public void BuildSpan_NotNull()
        {
            var tracer = TracerProvider.Default.GetTracer(TracerName);
            var shim   = new TracerShim(tracer, new TextMapPropagator());

            // Internals of the SpanBuilderShim tested elsewhere
            Assert.NotNull(shim.BuildSpan("foo") as SpanBuilderShim);
        }
        public void BuildSpan_NotNull()
        {
            var tracerMock = new Mock <Trace.ITracer>();
            var shim       = TracerShim.Create(tracerMock.Object);

            // Internals of the SpanBuilderShim tested elsewhere
            Assert.NotNull(shim.BuildSpan("foo") as SpanBuilderShim);
        }
        public void ScopeManager_NotNull()
        {
            var tracerMock = new Mock <Trace.ITracer>();
            var shim       = TracerShim.Create(tracerMock.Object);

            // Internals of the ScopeManagerShim tested elsewhere
            Assert.NotNull(shim.ScopeManager as ScopeManagerShim);
        }
Пример #10
0
        public void BuildSpan_NotNull()
        {
            var tracerMock = new Mock <Trace.Tracer>();
            var shim       = new TracerShim(tracerMock.Object, new TraceContextFormat(), new BinaryFormat());

            // Internals of the SpanBuilderShim tested elsewhere
            Assert.NotNull(shim.BuildSpan("foo") as SpanBuilderShim);
        }
Пример #11
0
        public void ScopeManager_NotNull()
        {
            var tracer = TracerProvider.Default.GetTracer(TracerName);
            var shim   = new TracerShim(tracer, new TextMapPropagator());

            // Internals of the ScopeManagerShim tested elsewhere
            Assert.NotNull(shim.ScopeManager as ScopeManagerShim);
        }
Пример #12
0
        public void Extract_ArgumentValidation()
        {
            var tracerMock = new Mock <Trace.Tracer>();
            var shim       = new TracerShim(tracerMock.Object, new TraceContextFormat(), new BinaryFormat());

            Assert.Throws <ArgumentNullException>(() => shim.Extract(null, new Mock <ITextMap>().Object));
            Assert.Throws <ArgumentNullException>(() => shim.Extract(new Mock <IFormat <ITextMap> >().Object, null));
        }
        public void ScopeManager_NotNull()
        {
            var tracer = TracerProvider.GetTracer(TracerName);
            var shim   = new TracerShim(tracer, new TraceContextFormat());

            // Internals of the ScopeManagerShim tested elsewhere
            Assert.NotNull(shim.ScopeManager as ScopeManagerShim);
        }
Пример #14
0
        public void ScopeManager_NotNull()
        {
            var tracerMock = new Mock <Trace.Tracer>();
            var shim       = new TracerShim(tracerMock.Object, new TraceContextFormat(), new BinaryFormat());

            // Internals of the ScopeManagerShim tested elsewhere
            Assert.NotNull(shim.ScopeManager as ScopeManagerShim);
        }
Пример #15
0
        public void Inject_Ok()
        {
            var shim = TracerShim.Create(tracer);

            var spanContextShim = new SpanContextShim(Defaults.GetOpenTelemetrySpanContext());

            var mockCarrier = new Mock <ITextMap>();

            shim.Inject(spanContextShim, BuiltinFormats.TextMap, mockCarrier.Object);

            // Verify that the carrier mock was invoked at least one time.
            mockCarrier.Verify(x => x.Set(It.IsAny <string>(), It.IsAny <string>()), Times.AtLeastOnce);
        }
Пример #16
0
        public void Inject_ArgumentValidation()
        {
            var shim = TracerShim.Create(tracer);

            var spanContextShim = new SpanContextShim(Defaults.GetOpenTelemetrySpanContext());
            var mockFormat      = new Mock <IFormat <ITextMap> >();
            var mockCarrier     = new Mock <ITextMap>();

            Assert.Throws <ArgumentNullException>(() => shim.Inject(null, mockFormat.Object, mockCarrier.Object));
            Assert.Throws <ArgumentException>(() => shim.Inject(new Mock <ISpanContext>().Object, mockFormat.Object, mockCarrier.Object));
            Assert.Throws <ArgumentNullException>(() => shim.Inject(spanContextShim, null, mockCarrier.Object));
            Assert.Throws <ArgumentNullException>(() => shim.Inject(spanContextShim, mockFormat.Object, null));
        }
Пример #17
0
        public void Extract_UnknownFormatIgnored()
        {
            var shim = TracerShim.Create(tracer);

            var spanContextShim = new SpanContextShim(Defaults.GetOpenTelemetrySpanContext());

            // Only two specific types of ITextMap are supported, and neither is a Mock.
            var mockCarrier = new Mock <ITextMap>();
            var context     = shim.Extract(new Mock <IFormat <ITextMap> >().Object, mockCarrier.Object);

            // Verify that the carrier mock was never called.
            mockCarrier.Verify(x => x.GetEnumerator(), Times.Never);
        }
Пример #18
0
        public void Extract_UnknownFormatIgnored()
        {
            var tracer = TracerProvider.Default.GetTracer(TracerName);
            var shim   = new TracerShim(tracer, new TextMapPropagator());

            var spanContextShim = new SpanContextShim(new SpanContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.None));

            // Only two specific types of ITextMap are supported, and neither is a Mock.
            var mockCarrier = new Mock <ITextMap>();
            var context     = shim.Extract(new Mock <IFormat <ITextMap> >().Object, mockCarrier.Object);

            // Verify that the carrier mock was never called.
            mockCarrier.Verify(x => x.GetEnumerator(), Times.Never);
        }
Пример #19
0
        public void Inject_UnknownFormatIgnored()
        {
            var shim = TracerShim.Create(NoopTracer.Instance);

            var spanContextShim = new SpanContextShim(Defaults.GetOpenTelemetrySpanContext());

            // Only two specific types of ITextMap are supported, and neither is a Mock.
            var mockCarrier = new Mock <ITextMap>();

            shim.Inject(spanContextShim, new Mock <IFormat <ITextMap> >().Object, mockCarrier.Object);

            // Verify that the carrier mock was never called.
            mockCarrier.Verify(x => x.Set(It.IsAny <string>(), It.IsAny <string>()), Times.Never);
        }
Пример #20
0
        public void Inject_ArgumentValidation()
        {
            var tracer = TracerProvider.Default.GetTracer(TracerName);
            var shim   = new TracerShim(tracer, new TextMapPropagator());

            var spanContextShim = new SpanContextShim(new SpanContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.None));
            var mockFormat      = new Mock <IFormat <ITextMap> >();
            var mockCarrier     = new Mock <ITextMap>();

            Assert.Throws <ArgumentNullException>(() => shim.Inject(null, mockFormat.Object, mockCarrier.Object));
            Assert.Throws <ArgumentException>(() => shim.Inject(new Mock <ISpanContext>().Object, mockFormat.Object, mockCarrier.Object));
            Assert.Throws <ArgumentNullException>(() => shim.Inject(spanContextShim, null, mockCarrier.Object));
            Assert.Throws <ArgumentNullException>(() => shim.Inject(spanContextShim, mockFormat.Object, null));
        }
        public void Inject_UnknownFormatIgnored()
        {
            var tracer = TracerProvider.Default.GetTracer(TracerName);
            var shim   = new TracerShim(tracer, new TraceContextFormat());

            var spanContextShim = new SpanContextShim(new SpanContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.Recorded));

            // Only two specific types of ITextMap are supported, and neither is a Mock.
            var mockCarrier = new Mock <ITextMap>();

            shim.Inject(spanContextShim, new Mock <IFormat <ITextMap> >().Object, mockCarrier.Object);

            // Verify that the carrier mock was never called.
            mockCarrier.Verify(x => x.Set(It.IsAny <string>(), It.IsAny <string>()), Times.Never);
        }
Пример #22
0
        public void InjectExtract_TextMap_Ok()
        {
            var carrier = new TextMapCarrier();

            var spanContextShim = new SpanContextShim(new SpanContext(ActivityTraceId.CreateRandom(), ActivitySpanId.CreateRandom(), ActivityTraceFlags.None));

            var format = new TextMapPropagator();

            var tracer = TracerProvider.Default.GetTracer(TracerName);
            var shim   = new TracerShim(tracer, format);

            // first inject
            shim.Inject(spanContextShim, BuiltinFormats.TextMap, carrier);

            // then extract
            var extractedSpanContext = shim.Extract(BuiltinFormats.TextMap, carrier);

            AssertOpenTracerSpanContextEqual(spanContextShim, extractedSpanContext);
        }
Пример #23
0
        public void InjectExtract_Binary_Ok()
        {
            var tracerMock = new Mock <Trace.Tracer>();

            var carrier = new BinaryCarrier();

            var spanContextShim = new SpanContextShim(Defaults.GetOpenTelemetrySpanContext());

            var format = new BinaryFormat();

            var shim = new TracerShim(tracerMock.Object, new TraceContextFormat(), format);

            // first inject
            shim.Inject(spanContextShim, BuiltinFormats.Binary, carrier);

            // then extract
            var extractedSpanContext = shim.Extract(BuiltinFormats.Binary, carrier);

            AssertOpenTracerSpanContextEqual(spanContextShim, extractedSpanContext);
        }
Пример #24
0
        public void Extract_InvalidTraceParent()
        {
            var shim = TracerShim.Create(tracer);

            var mockCarrier = new Mock <ITextMap>();

            // The ProxyTracer uses OpenTelemetry.Context.Propagation.TraceContextFormat, so we need to satisfy the traceparent key at the least
            var carrierMap = new Dictionary <string, string>
            {
                // This is an invalid traceparent value
                { "traceparent", "unused" },
            };

            mockCarrier.Setup(x => x.GetEnumerator()).Returns(carrierMap.GetEnumerator());
            var spanContextShim = shim.Extract(BuiltinFormats.TextMap, mockCarrier.Object) as SpanContextShim;

            // Verify that the carrier was called
            mockCarrier.Verify(x => x.GetEnumerator(), Times.Once);

            Assert.Null(spanContextShim);
        }
Пример #25
0
        public void InjectExtract_TextMap_Ok()
        {
            var tracerMock = new Mock <Trace.ITracer>();

            var carrier = new TextMapCarrier();

            var spanContextShim = new SpanContextShim(Defaults.GetOpenTelemetrySpanContext());

            var format = new TraceContextFormat();

            tracerMock.Setup(x => x.TextFormat).Returns(format);

            var shim = TracerShim.Create(tracerMock.Object);

            // first inject
            shim.Inject(spanContextShim, BuiltinFormats.TextMap, carrier);

            // then extract
            var extractedSpanContext = shim.Extract(BuiltinFormats.TextMap, carrier);

            AssertOpenTracerSpanContextEqual(spanContextShim, extractedSpanContext);
        }
        internal static object Run(OpenTracingShimOptions options)
        {
            // Enable OpenTelemetry for the source "MyCompany.MyProduct.MyWebServer"
            // and use Console exporter.
            using var openTelemetry = Sdk.CreateTracerProviderBuilder()
                                      .AddSource("MyCompany.MyProduct.MyWebServer")
                                      .SetResourceBuilder(ResourceBuilder.CreateDefault().AddService("MyServiceName"))
                                      .AddConsoleExporter()
                                      .Build();

            // Instantiate the OpenTracing shim. The underlying OpenTelemetry tracer will create
            // spans using the "MyCompany.MyProduct.MyWebServer" source.
            var tracer = new TracerShim(
                TracerProvider.Default.GetTracer("MyCompany.MyProduct.MyWebServer"),
                Propagators.DefaultTextMapPropagator);

            // Not necessary for this example, though it is best practice per
            // the OpenTracing project to register a GlobalTracer.
            OpenTracing.Util.GlobalTracer.Register(tracer);

            // The code below is meant to resemble application code that has been instrumented
            // with the OpenTracing API.
            using (IScope parentScope = tracer.BuildSpan("Parent").StartActive(finishSpanOnDispose: true))
            {
                parentScope.Span.SetTag("my", "value");
                parentScope.Span.SetOperationName("parent span new name");

                // The child scope will automatically use parentScope as its parent.
                using (IScope childScope = tracer.BuildSpan("Child").StartActive(finishSpanOnDispose: true))
                {
                    childScope.Span.SetTag("Child Tag", "Child Tag Value").SetTag("ch", "value").SetTag("more", "attributes");
                }
            }

            System.Console.WriteLine("Press Enter key to exit.");
            System.Console.ReadLine();

            return(null);
        }
Пример #27
0
        public void Extract_Ok()
        {
            var shim = TracerShim.Create(tracer);

            var mockCarrier = new Mock <ITextMap>();

            // The ProxyTracer uses OpenTelemetry.Context.Propagation.TraceContextFormat, so we need to satisfy that.
            var traceContextFormat = new TraceContextFormat();
            var spanContext        = Defaults.GetOpenTelemetrySpanContext();

            var carrierMap = new Dictionary <string, string>();

            // inject the SpanContext into the carrier map
            traceContextFormat.Inject <Dictionary <string, string> >(spanContext, carrierMap, (map, key, value) => map.Add(key, value));

            // send the populated carrier map to the extract method.
            mockCarrier.Setup(x => x.GetEnumerator()).Returns(carrierMap.GetEnumerator());
            var spanContextShim = shim.Extract(BuiltinFormats.TextMap, mockCarrier.Object) as SpanContextShim;

            // Verify that the carrier was called
            mockCarrier.Verify(x => x.GetEnumerator(), Times.Once);

            Assert.Equal(spanContext, spanContextShim.SpanContext);
        }
Пример #28
0
    /// <summary>
    /// Initialize the OpenTelemetry SDK with a pre-defined set of exporters, shims, and
    /// instrumentations.
    /// </summary>
    public static void Initialize()
    {
        if (Interlocked.Exchange(ref _firstInitialization, value: 0) != 1)
        {
            // Initialize() was already called before
            return;
        }

        try
        {
            if (TracerSettings.LoadTracerAtStartup || MeterSettings.LoadMetricsAtStartup)
            {
                // Initialize SdkSelfDiagnosticsEventListener to create an EventListener for the OpenTelemetry SDK
                _sdkEventListener = new(EventLevel.Warning);

                // Register to shutdown events
                AppDomain.CurrentDomain.ProcessExit  += OnExit;
                AppDomain.CurrentDomain.DomainUnload += OnExit;

                if (TracerSettings.FlushOnUnhandledException || MeterSettings.FlushOnUnhandledException)
                {
                    AppDomain.CurrentDomain.UnhandledException += OnUnhandledException;
                }
            }

            if (TracerSettings.LoadTracerAtStartup)
            {
                var builder = Sdk
                              .CreateTracerProviderBuilder()
                              .SetResourceBuilder(_resourceBuilder)
                              .UseEnvironmentVariables(TracerSettings)
                              .SetSampler(new AlwaysOnSampler())
                              .InvokePlugins(TracerSettings.TracerPlugins);

                _tracerProvider = builder.Build();
                Logger.Information("OpenTelemetry tracer initialized.");
            }

            if (MeterSettings.LoadMetricsAtStartup)
            {
                var builder = Sdk
                              .CreateMeterProviderBuilder()
                              .SetResourceBuilder(_resourceBuilder)
                              .UseEnvironmentVariables(MeterSettings)
                              .InvokePlugins(MeterSettings.MetricPlugins);

                _meterProvider = builder.Build();
                Logger.Information("OpenTelemetry meter initialized.");
            }
        }
        catch (Exception ex)
        {
            Logger.Error(ex, "OpenTelemetry SDK load exception.");
            throw;
        }

        try
        {
            if (_tracerProvider is not null)
            {
                // Instantiate the OpenTracing shim. The underlying OpenTelemetry tracer will create
                // spans using the "OpenTelemetry.AutoInstrumentation.OpenTracingShim" source.
                var openTracingShim = new TracerShim(
                    _tracerProvider.GetTracer("OpenTelemetry.AutoInstrumentation.OpenTracingShim"),
                    Propagators.DefaultTextMapPropagator);

                // This registration must occur prior to any reference to the OpenTracing tracer:
                // otherwise the no-op tracer is going to be used by OpenTracing instead.
                GlobalTracer.RegisterIfAbsent(openTracingShim);
                Logger.Information("OpenTracingShim loaded.");
            }
            else
            {
                Logger.Information("OpenTracingShim was not loaded as the provider is not initialized.");
            }
        }
        catch (Exception ex)
        {
            Logger.Error(ex, "OpenTracingShim exception.");
            throw;
        }
    }
Пример #29
0
 public void CtorArgumentValidation()
 {
     Assert.Throws <ArgumentNullException>(() => TracerShim.Create(null));
 }