Plugins

May 7, 2026 ยท View on GitHub

Status: Experimental.

You can use OTEL_DOTNET_AUTO_PLUGINS environment variable to extend the configuration and overwrite options of the OpenTelemetry .NET SDK Tracer, Meter or Logs. No more than one instance of each plugin type will be created. A plugin must be a non-static, non-abstract class which has a default constructor and that implements at least one of the configuration methods below showed in an example plugin class:


public class MyPlugin 
{
    // To configure plugin, before OTel SDK configuration is called.
    public void Initializing()
    {
        // My custom logic here
    }

    // To configure plugin, after auto instrumentation is initialized.
    public void Initialized()
    {
        // My custom logic here
    }

    // To access TracerProvider right after TracerProviderBuilder.Build() is executed.
    public void TracerProviderInitialized(TracerProvider tracerProvider)
    {
        // My custom logic here
    }

    // To access MeterProvider right after MeterProviderBuilder.Build() is executed.
    public void MeterProviderInitialized(MeterProvider meterProvider)
    {
        // My custom logic here
    }

    // To configure tracing SDK before Auto Instrumentation configured SDK
    public OpenTelemetry.Trace.TracerProviderBuilder BeforeConfigureTracerProvider(OpenTelemetry.Trace.TracerProviderBuilder builder)
    {
        // My custom logic here

        return builder;
    }

    // To configure tracing SDK after Auto Instrumentation configured SDK
    public OpenTelemetry.Trace.TracerProviderBuilder AfterConfigureTracerProvider(OpenTelemetry.Trace.TracerProviderBuilder builder)
    {
        // My custom logic here

        return builder;
    }
        
    // To configure any traces options used by OpenTelemetry .NET Automatic Instrumentation
    public void ConfigureTracesOptions(OpenTelemetry.NameSpace.OptionType options)
    {
        // My custom logic here
        // Find supported options below
    }

    // To configure metrics SDK before Auto Instrumentation configured SDK
    public OpenTelemetry.Metrics.MeterProviderBuilder BeforeConfigureMeterProvider(OpenTelemetry.Metrics.MeterProviderBuilder builder)
    {
        // My custom logic here

        return builder;
    }

    // To configure metrics SDK after Auto Instrumentation configured SDK
    public OpenTelemetry.Metrics.MeterProviderBuilder AfterConfigureMeterProvider(OpenTelemetry.Metrics.MeterProviderBuilder builder)
    {
        // My custom logic here

        return builder;
    }
    
    // To configure any metrics options used by OpenTelemetry .NET Automatic Instrumentation
    public void ConfigureMetricsOptions(OpenTelemetry.NameSpace.OptionType options)
    {
        // My custom logic here
        // Find supported options below
    }

    // To configure logs SDK (the method name is the same as for other logs options)
    public void ConfigureLogsOptions(OpenTelemetry.Logs.OpenTelemetryLoggerOptions options)
    {
        // My custom logic here
    }

    // To configure any logs options used by OpenTelemetry .NET Automatic Instrumentation
    public void ConfigureLogsOptions(OpenTelemetry.NameSpace.OptionType options)
    {
        // My custom logic here
        // Find supported options below
    }

    // To configure Resource
    public OpenTelemetry.Resources.ResourceBuilder ConfigureResource(OpenTelemetry.Resources.ResourceBuilder builder)
    {
        // My custom logic here
        // Please note this method is common to set the resource for trace, logs and metrics.
        // This method could be overridden by ConfigureTracesOptions, ConfigureMeterProvider and ConfigureLogsOptions
        // by calling SetResourceBuilder with new object.

        return builder;
    }
}
public class MyOpAmpPlugin 
{
    // To configure OpAMP client
    public void ConfigureOpAmpOptions(OpenTelemetry.OpAmp.Client.Settings.OpAmpClientSettings options)
    {
        // My custom logic here
    }

    // To get the OpAMP client instance after client is created and started
    public void AfterOpAmpClientStarted(OpenTelemetry.OpAmp.Client.OpAmpClient client)
    {
        // My custom logic here
    }

    // To get the final callback before OpAMP client shuts down
    public void BeforeOpAmpClientStopped()
    {
        // My custom logic here
        // WARNING: This is already in application OnExit() cycle, do not add long running tasks.
    }
}

Note

Automatic Instrumentation can configure particular properties before calling Configure{Signal}Options. It is plugin responsibility to not override this behavior. Example: OpenTelemetry.Instrumentation.Http.HttpClientTraceInstrumentationOptions.EnrichWithHttpWebRequest is conditionally set by this project.

Supported Options

Tracing

Options typeNuGet packageNuGet version
OpenTelemetry.Exporter.ConsoleExporterOptionsOpenTelemetry.Exporter.Console1.15.3
OpenTelemetry.Exporter.ZipkinExporterOptions DeprecatedOpenTelemetry.Exporter.Zipkin1.15.3
OpenTelemetry.Exporter.OtlpExporterOptionsOpenTelemetry.Exporter.OpenTelemetryProtocol1.15.3
OpenTelemetry.Instrumentation.AspNet.AspNetTraceInstrumentationOptionsOpenTelemetry.Instrumentation.AspNet1.15.2
OpenTelemetry.Instrumentation.AspNetCore.AspNetCoreTraceInstrumentationOptionsOpenTelemetry.Instrumentation.AspNetCore1.15.2
OpenTelemetry.Instrumentation.EntityFrameworkCore.EntityFrameworkInstrumentationOptionsOpenTelemetry.Instrumentation.EntityFrameworkCore1.15.1-beta.1
OpenTelemetry.Instrumentation.GrpcNetClient.GrpcClientTraceInstrumentationOptionsOpenTelemetry.Instrumentation.GrpcNetClient1.15.1-beta.1
OpenTelemetry.Instrumentation.Http.HttpClientTraceInstrumentationOptionsOpenTelemetry.Instrumentation.Http1.15.1
OpenTelemetry.Instrumentation.Quartz.QuartzInstrumentationOptionsOpenTelemetry.Instrumentation.Quartz1.15.1-beta.1
OpenTelemetry.Instrumentation.SqlClient.SqlClientTraceInstrumentationOptionsOpenTelemetry.Instrumentation.SqlClient1.15.2
OpenTelemetry.Instrumentation.StackExchangeRedis.StackExchangeRedisInstrumentationOptionsOpenTelemetry.Instrumentation.StackExchangeRedis1.15.1-beta.1
OpenTelemetry.Instrumentation.Wcf.WcfInstrumentationOptionsOpenTelemetry.Instrumentation.Wcf1.15.1-beta.2

Metrics

Options typeNuGet packageNuGet version
OpenTelemetry.Metrics.MetricReaderOptionsOpenTelemetry1.15.3
OpenTelemetry.Exporter.ConsoleExporterOptionsOpenTelemetry.Exporter.Console1.15.3
OpenTelemetry.Exporter.PrometheusExporterOptionsOpenTelemetry.Exporter.Prometheus.HttpListener1.15.3-beta.1
OpenTelemetry.Exporter.OtlpExporterOptionsOpenTelemetry.Exporter.OpenTelemetryProtocol1.15.3
OpenTelemetry.Instrumentation.AspNet.AspNetMetricsInstrumentationOptionsOpenTelemetry.Instrumentation.AspNet1.15.2
OpenTelemetry.Instrumentation.Runtime.RuntimeInstrumentationOptionsOpenTelemetry.Instrumentation.Runtime1.15.1

Logs

Options typeNuGet packageNuGet version
OpenTelemetry.Logs.OpenTelemetryLoggerOptionsOpenTelemetry1.15.3
OpenTelemetry.Exporter.ConsoleExporterOptionsOpenTelemetry.Exporter.Console1.15.3
OpenTelemetry.Exporter.OtlpExporterOptionsOpenTelemetry.Exporter.OpenTelemetryProtocol1.15.3

OpAMP

Settings typeNuGet packageNuGet version
OpenTelemetry.OpAmp.Client.Settings.OpAmpClientSettingsOpenTelemetry.OpAmp.Client0.3.0-alpha.1

Requirements

  • The plugin must use the same version of the OpenTelemetry as the OpenTelemetry .NET Automatic Instrumentation.
  • The plugin must use the same options versions as the OpenTelemetry .NET Automatic Instrumentation (found in the table above).