Skip to content

[Logs] Add extension for registering OpenTelemetryLoggerProvider with ILoggingBuilder - #3489

Merged
cijothomas merged 6 commits into
open-telemetry:mainfrom
CodeBlanch:loggerprovider-extension
Jul 28, 2022
Merged

[Logs] Add extension for registering OpenTelemetryLoggerProvider with ILoggingBuilder#3489
cijothomas merged 6 commits into
open-telemetry:mainfrom
CodeBlanch:loggerprovider-extension

Conversation

@CodeBlanch

@CodeBlanch CodeBlanch commented Jul 26, 2022

Copy link
Copy Markdown
Member

Following up on #3454 (comment)

Changes

  • Adds an extension for manually registering an OpenTelemetryLoggerProvider with an ILoggingBuilder. You don't really need this extension to do that, but I think it helps with discoverability and our documentation/examples to have it.

Details

Here is the use case I am thinking about.

The Serilog startup pattern configures the log pipeline before the host builder. That sort of prescribes that users will need to manually build their own OpenTelemetryLoggerProvider. What this new extension does is just smooth that out.

    public static int Main(string[] args)
    {
        OpenTelemetryLoggerProvider provider = new OpenTelemetryLoggerProvider(options =>
        {
            options.IncludeFormattedMessage = true;
            options.AddConsoleExporter();
        });

        Log.Logger = new LoggerConfiguration()
            .WriteTo.OpenTelemetry(provider, disposeProvider: true)
            .CreateLogger();

        try
        {
            Log.Information("Starting web host");
            CreateHostBuilder(args, provider).Build().Run();
            return 0;
        }
        catch (Exception ex)
        {
            Log.Fatal(ex, "Host terminated unexpectedly");
            return 1;
        }
        finally
        {
            Log.CloseAndFlush();
        }
    }

    public static IHostBuilder CreateHostBuilder(string[] args, OpenTelemetryLoggerProvider openTelemetryLoggerProvider) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureLogging(builder =>
                {
                    builder.AddOpenTelemetry(openTelemetryLoggerProvider, disposeProvider: false); // <- New extension used here
                })
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });

Public API

+ public static ILoggingBuilder AddOpenTelemetry(this ILoggingBuilder builder)
+ public static ILoggingBuilder AddOpenTelemetry(this ILoggingBuilder builder, Action<OpenTelemetryLoggerOptions>? configure)
+ public static ILoggingBuilder AddOpenTelemetry(this ILoggingBuilder builder, OpenTelemetryLoggerProvider openTelemetryLoggerProvider)
+ public static ILoggingBuilder AddOpenTelemetry(this ILoggingBuilder builder, OpenTelemetryLoggerProvider openTelemetryLoggerProvider, bool disposeProvider)
- public static ILoggingBuilder AddOpenTelemetry(this ILoggingBuilder builder, Action<OpenTelemetryLoggerOptions>? configure = null)

The reason that one method is being removed is I first tried this...

public static ILoggingBuilder AddOpenTelemetry(this ILoggingBuilder builder, Action<OpenTelemetryLoggerOptions>? configure = null)
public static ILoggingBuilder AddOpenTelemetry(this ILoggingBuilder builder, OpenTelemetryLoggerProvider openTelemetryLoggerProvider)

...which gave me the warning:

Symbol 'AddOpenTelemetry' violates the backcompat requirement: 'Public API with optional parameter(s) should have the most parameters amongst its public overloads'. See 'https://github.com/dotnet/roslyn/blob/master/docs/Adding%20Optional%20Parameters%20in%20Public%20API.md' for details.

The layout of the new methods fixes that. Checked with @tarekgh. New design should be mostly safe. If users were calling these methods with reflection and specifically checking the metadata for "optional" parameter, they would break. But I feel like that is a super edge case. Anyone just compiling should be fine.

TODOs

  • Appropriate CHANGELOG.md updated for non-trivial changes
  • Changes in public API reviewed
  • Tests

@CodeBlanch
CodeBlanch requested a review from a team July 26, 2022 19:03
@codecov

codecov Bot commented Jul 26, 2022

Copy link
Copy Markdown

Codecov Report

Merging #3489 (b7903b0) into main (f089ec7) will increase coverage by 0.00%.
The diff coverage is 100.00%.

Impacted file tree graph

@@           Coverage Diff           @@
##             main    #3489   +/-   ##
=======================================
  Coverage   86.49%   86.49%           
=======================================
  Files         272      272           
  Lines        9931     9939    +8     
=======================================
+ Hits         8590     8597    +7     
- Misses       1341     1342    +1     
Impacted Files Coverage Δ
...enTelemetry/Logs/OpenTelemetryLoggingExtensions.cs 100.00% <100.00%> (ø)
src/OpenTelemetry/Logs/OpenTelemetryLogger.cs 86.66% <0.00%> (-4.45%) ⬇️
...Telemetry/Internal/SelfDiagnosticsEventListener.cs 96.87% <0.00%> (-0.79%) ⬇️
...tation/OpenTelemetryProtocolExporterEventSource.cs 85.00% <0.00%> (+10.00%) ⬆️

Comment on lines -40 to +48
public static ILoggingBuilder AddOpenTelemetry(this ILoggingBuilder builder, Action<OpenTelemetryLoggerOptions>? configure = null)
public static ILoggingBuilder AddOpenTelemetry(this ILoggingBuilder builder, Action<OpenTelemetryLoggerOptions>? configure)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🥳 🎉

@alanwest alanwest left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@cijothomas
cijothomas merged commit 2b1e75d into open-telemetry:main Jul 28, 2022
@CodeBlanch
CodeBlanch deleted the loggerprovider-extension branch July 28, 2022 20:41
AsherBond pushed a commit to OTEL-California/opentelemetry-specification that referenced this pull request Jun 29, 2026
## Changes

Update the compliance matrix for .NET as of 1.16.0 of the .NET SDK.

I got Copilot to do most of the work of researching what was missing
that had been implementing and finding the relevant PRs that implemented
then. I cross checked the PRs _looked_ correct, but some of it might be
incorrect, particularly things that seem to have been implemented for a
while and predate my contributions to OTel. I then had Claude review the
changes and cross-reference, which fixed some of the entries, but again
there might still be some mistakes.

~~Some of the entries might only be available as experimental features,
so maybe they shouldn't be updated?~~ Experimental entries removed, now
marked as ~~strikethrough~~ below.

Entries updated with relevant PR links where appropriate below.

/cc @open-telemetry/dotnet-maintainers 

### Traces

- Get a Tracer with schema_url:
open-telemetry/opentelemetry-dotnet#6736
- Get a Tracer with scope attributes:
open-telemetry/opentelemetry-dotnet#6137
- Associate Tracer with InstrumentationScope:
open-telemetry/opentelemetry-dotnet#239
- Fetch InstrumentationScope from ReadableSpan:
open-telemetry/opentelemetry-dotnet#679

### Metrics

- Associate Meter with InstrumentationScope:
open-telemetry/opentelemetry-dotnet#6714
- Gauge instrument is supported:
open-telemetry/opentelemetry-dotnet#5867
- Valid instrument created / warning for duplicate name:
open-telemetry/opentelemetry-dotnet#2916
- Duplicate instrument registration resolved by first-seen:
open-telemetry/opentelemetry-dotnet#2916
- Instrument names conform to specified syntax:
open-telemetry/opentelemetry-dotnet#3821
- Instrument supports advisory ExplicitBucketBoundaries:
open-telemetry/opentelemetry-dotnet#5854
- Instrument supports advisory Attributes: Not implemented
- name/version/schema_url create InstrumentationScope:
open-telemetry/opentelemetry-dotnet#6714
- ~~View allows configuring name, description, attributes, aggregation:
open-telemetry/opentelemetry-dotnet#2396
- ~~View allows configuring exemplar reservoir:
open-telemetry/opentelemetry-dotnet#5558
- Metrics Reader supports default aggregation config:
open-telemetry/opentelemetry-dotnet#6778
- Metrics Reader supports default temporality config:
open-telemetry/opentelemetry-dotnet#4667
- ~~ExemplarReservoir interface/extension point:
open-telemetry/opentelemetry-dotnet#5542
- ~~ExemplarReservoir has offer method:
open-telemetry/opentelemetry-dotnet#5542
- SimpleFixedSizeExemplarReservoir:
open-telemetry/opentelemetry-dotnet#4256
- AlignedHistogramBucketExemplarReservoir:
open-telemetry/opentelemetry-dotnet#4119

### Logs

- ~~LoggerProvider.GetLogger:
open-telemetry/opentelemetry-dotnet#4422
- LoggerProvider.GetLogger accepts attributes: Not implemented
- LoggerProvider.Shutdown:
open-telemetry/opentelemetry-dotnet#5648
- LoggerProvider.ForceFlush:
open-telemetry/opentelemetry-dotnet#5648
- Logger.Emit(LogRecord) with Exception parameter: Not implemented
- ~~LogRecord.Set EventName:
open-telemetry/opentelemetry-dotnet#6306
- Logger.Enabled: Not implemented
- Ergonomic API (ILogger bridge):
open-telemetry/opentelemetry-dotnet#3489
- SimpleLogRecordProcessor:
open-telemetry/opentelemetry-dotnet#1622
- BatchLogRecordProcessor:
open-telemetry/opentelemetry-dotnet#1622
- Can plug custom LogRecordProcessor:
open-telemetry/opentelemetry-dotnet#4916
- LogRecordProcessor.Enabled: Not implemented
- Can plug custom LogRecordExporter:
open-telemetry/opentelemetry-dotnet#1622

### Context Propagation

- Jaeger Propagator:
open-telemetry/opentelemetry-dotnet#3309
- TextMapPropagator:
open-telemetry/opentelemetry-dotnet#1427

### Environment Variables

- OTEL_SDK_DISABLED:
open-telemetry/opentelemetry-dotnet#6568
- OTEL_LOGRECORD_ATTRIBUTE_COUNT_LIMIT:
open-telemetry/opentelemetry-dotnet#4887
- OTEL_LOGRECORD_ATTRIBUTE_VALUE_LENGTH_LIMIT:
open-telemetry/opentelemetry-dotnet#4887
- OTEL_TRACES_SAMPLER:
open-telemetry/opentelemetry-dotnet#5448
- OTEL_TRACES_SAMPLER_ARG:
open-telemetry/opentelemetry-dotnet#5448
- OTEL_EXPORTER_OTLP_METRICS_DEFAULT_HISTOGRAM_AGGREGATION:
open-telemetry/opentelemetry-dotnet#6778

### Exporters — OTLP

- OTLP/HTTP gzip Content-Encoding support:
open-telemetry/opentelemetry-dotnet#7055
- ~~Honors retryable responses with backoff:
open-telemetry/opentelemetry-dotnet#5495
- ~~Honors non-retryable responses:
open-telemetry/opentelemetry-dotnet#5495
- ~~Honors throttling response:
open-telemetry/opentelemetry-dotnet#5495
- Metric Exporter configurable temporality preference:
open-telemetry/opentelemetry-dotnet#4667
- Metric Exporter configurable default aggregation:
open-telemetry/opentelemetry-dotnet#6778

### Exporters — Zipkin

- InstrumentationScope mapping:
open-telemetry/opentelemetry-dotnet#5473

### Exporters — Prometheus

- Metadata Deduplication:
open-telemetry/opentelemetry-dotnet#7237
- otel_scope_name and otel_scope_version labels:
open-telemetry/opentelemetry-dotnet#7237
- otel_scope_[attribute] labels:
open-telemetry/opentelemetry-dotnet#7237
- Prometheus Counters have _total suffix by default:
open-telemetry/opentelemetry-dotnet#5305
- Prometheus Counters _total suffixing can be disabled:
open-telemetry/opentelemetry-dotnet#5305
- Colliding sanitized attribute keys are merged:
open-telemetry/opentelemetry-dotnet#7239
- Exemplars for Histograms and Monotonic sums:
open-telemetry/opentelemetry-dotnet#7222
- target_info metric from Resource:
open-telemetry/opentelemetry-dotnet#5407

### OpenTracing Compatibility

- Create OpenTracing Shim:
open-telemetry/opentelemetry-dotnet#197
- Tracer shim:
open-telemetry/opentelemetry-dotnet#197
- Span shim:
open-telemetry/opentelemetry-dotnet#197
- SpanContext shim:
open-telemetry/opentelemetry-dotnet#197
- ScopeManager shim:
open-telemetry/opentelemetry-dotnet#197
- Error mapping for attributes/events:
open-telemetry/opentelemetry-dotnet#197
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants