public void EventSourceSetup_HigherSeverity()
    {
        // get default sink using reflection
        var defaultLogger = OtelLogging.GetLogger();
        var sinkField     = defaultLogger.GetType().GetField("_sink", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        var defaultSink   = (ISink)sinkField.GetValue(defaultLogger);

        try
        {
            var testSink = new TestSink();

            var listener = new SdkSelfDiagnosticsEventListener(EventLevel.Verbose);

            // override default logger's sink with test sink
            sinkField.SetValue(defaultLogger, testSink);

            // Emitting a Verbose event. Or any EventSource event with lower severity than Error.
            AspNetTelemetryEventSource.Log.ActivityRestored("123");
            OpenTelemetrySdkEventSource.Log.ActivityStarted("Activity started", "1");

            testSink.Messages.Should().Contain(msg => msg.Contains("EventSource=OpenTelemetry-Instrumentation-AspNet-Telemetry, Message=Activity restored, Id='123'"));
            testSink.Messages.Should().Contain(msg => msg.Contains("EventSource=OpenTelemetry-Sdk, Message=Activity started."));
        }
        finally
        {
            // restore default sink
            sinkField.SetValue(defaultLogger, defaultSink);
        }
    }
    public void EventSourceSetup_LowerSeverity()
    {
        // get default sink using reflection
        var defaultLogger = OtelLogging.GetLogger();
        var sinkField     = defaultLogger.GetType().GetField("_sink", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance);
        var defaultSink   = (ISink)sinkField.GetValue(defaultLogger);

        try
        {
            var testSink = new TestSink();
            var listener = new SdkSelfDiagnosticsEventListener(EventLevel.Error);

            // override default logger's sink with test sink
            sinkField.SetValue(defaultLogger, testSink);

            // Emitting a Verbose event. Or any EventSource event with lower severity than Error.
            AspNetTelemetryEventSource.Log.ActivityRestored("123");
            OpenTelemetrySdkEventSource.Log.ActivityStarted("Activity started", "1");

            testSink.Messages.Should().BeEmpty("events with lower severity than error should not be written.");
        }
        finally
        {
            // restore default sink
            sinkField.SetValue(defaultLogger, defaultSink);
        }
    }
示例#3
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;
        }
    }