Skip to content

[api proposal] Cross-cutting UseOtlpExporter method #4940

@CodeBlanch

Description

@CodeBlanch

[This was requested by @davidfowl & @samsp-msft]

Goal

There is a lot of code required to configure traces, metrics, & logs to use OTLP at the same endpoint:

var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);

if (useOtlpExporter)
{
    builder.Services.Configure<OpenTelemetryLoggerOptions>(logging => logging.AddOtlpExporter());
    builder.Services.ConfigureOpenTelemetryMeterProvider(metrics => metrics.AddOtlpExporter());
    builder.Services.ConfigureOpenTelemetryTracerProvider(tracing => tracing.AddOtlpExporter());
}

The goal is to turn this into a ~one-liner.

Proposal

OpenTelemetry (SDK)

namespace OpenTelemetry;

+public interface IOpenTelemetryBuilder
+{
+   IServiceCollection Services { get; }
+}

OpenTelemetry.Extensions.Hosting

namespace OpenTelemetry;

-public sealed class OpenTelemetryBuilder
+public sealed class OpenTelemetryBuilder : IOpenTelemetryBuilder
{
   // No other changes
}

OpenTelemetry.Exporter.OpenTelemetryProtocol

namespace OpenTelemetry;

+public sealed class OtlpExporterBuilderOptions
+{
+    public bool EnableLogging { get; set; } = true;
+    public bool EnableMetrics { get; set; } = true;
+    public bool EnableTracing { get; set; } = true;
+    public OtlpExporterOptions DefaultOptions { get; }
+    public OtlpExporterOptions LoggingOptions { get; }
+    public OtlpExporterOptions MetricsOptions { get; }
+    public OtlpExporterOptions TracingOptions { get; }
+}

+public static class OpenTelemetryBuilderOtlpExporterExtensions
+{
+    public static T AddOtlpExporter<T>(this T builder) where T : IOpenTelemetryBuilder {}
+    public static T AddOtlpExporter<T>(this T builder, Action<OtlpExporterBuilderOptions>? configure) where T : IOpenTelemetryBuilder {}
+    public static T AddOtlpExporter<T>(this T builder, string? name, Action<OtlpExporterBuilderOptions>? configure) where T : IOpenTelemetryBuilder {}
+}

Example implementation

https://github.com/open-telemetry/opentelemetry-dotnet/compare/main...CodeBlanch:poc/otlp-builder?expand=1

Scenarios enabled

  • The primary goal is accomplished:

    services.AddOpenTelemetry().AddOtlpExporter();

    That will turn on OTLP respecting the various environment variables.

  • And also really nice configuration integration is enabled:

    appSettings.json:

    {
       "opentelemetry_otlpexporter": {
          "DefaultOptions": {
              "Protocol": "HttpProtobuf"
          },
          "LoggingOptions": {
              "Endpoint": "http://log_endpoint/"
          },
          "MetricsOptions": {
              "Endpoint": "http://metric_endpoint/"
          },
          "TracingOptions": {
              "Endpoint": "http://trace_endpoint/"
          }
       }
    }

    bootstrap:

    services.Configure<OtlpExporterBuilderOptions>(appBuilder.Configuration.GetSection("opentelemetry_otlpexporter"));
    services.AddOpenTelemetry().AddOtlpExporter();

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions