Skip to content

[POC] Emit otel.sdk.component.shutdown event from BatchLogRecordExportProcessor and OtlpLogExporter#7406

Draft
cijothomas wants to merge 6 commits into
open-telemetry:mainfrom
cijothomas:cijothomas/poc-sdk-shutdown-event
Draft

[POC] Emit otel.sdk.component.shutdown event from BatchLogRecordExportProcessor and OtlpLogExporter#7406
cijothomas wants to merge 6 commits into
open-telemetry:mainfrom
cijothomas:cijothomas/poc-sdk-shutdown-event

Conversation

@cijothomas

@cijothomas cijothomas commented Jun 12, 2026

Copy link
Copy Markdown
Member

POC validating open-telemetry/semantic-conventions#3723 (otel.sdk.component.shutdown event) end-to-end in .NET. Cross-language companion to the Rust POC (open-telemetry/opentelemetry-rust#3552).

Emits one otel.sdk.component.shutdown event per provider instance when Shutdown() is called. All three providers are covered.

Event shape

Attribute Value
otel.component.type logger_provider / tracer_provider / meter_provider
otel.component.name <type>/N (e.g. logger_provider/0)
error.type absent on success; timeout or failed on failure
otel.component.shutdown.duration wall-clock seconds (includes all child shutdowns)

Severity: INFO when successful, WARN when error.type present.

Scope

  • LoggerProviderSdk.Shutdown(int) (src/OpenTelemetry/Logs/LoggerProviderSdk.cs)
  • TracerProviderSdk.OnShutdown(int) (src/OpenTelemetry/Trace/TracerProviderSdk.cs)
  • MeterProviderSdk.OnShutdown(int) (src/OpenTelemetry/Metrics/MeterProviderSdk.cs)
  • All three Dispose paths route through the instrumented Shutdown/OnShutdown so the event fires on using-style disposal too.
  • Uses SdkSelfObservability.EmitProviderShutdownEvent dispatching via a process-global ILogger (POC mechanism; production design would use per-provider injection).
  • Three unit tests validate: event emitted on shutdown, no-op when no logger configured, at-most-one event on repeated shutdown.

Out of scope

  • Per-component events (future refinement if operators need which processor/exporter failed).
  • Timeout classification uses wall-clock heuristic (proper fix needs structured result propagation from children).

@cijothomas cijothomas added pkg:OpenTelemetry Issues related to OpenTelemetry NuGet package pkg:OpenTelemetry.Exporter.OpenTelemetryProtocol Issues related to OpenTelemetry.Exporter.OpenTelemetryProtocol NuGet package logs Logging signal related spec-compliance Issues related to compliance with the OpenTelemetry Specification labels Jun 12, 2026
@codecov

codecov Bot commented Jun 12, 2026

Copy link
Copy Markdown

❌ 1 Tests Failed:

Tests completed Failed Passed Skipped
2232 1 2231 8
View the full list of 1 ❄️ flaky test(s)
OpenTelemetry.Metrics.Tests.MeterProviderBuilderExtensionsTests::AddInstrumentationTest

Flake rate in main: 100.00% (Passed 0 times, Failed 1 times)

Stack Traces | 0.0047s run time
at OpenTelemetry.Metrics.Tests.MeterProviderBuilderExtensionsTests.AddInstrumentationTest() in C:\a\opentelemetry-dotnet\opentelemetry-dotnet\test\OpenTelemetry.Tests\Metrics\MeterProviderBuilderExtensionsTests.cs:line 104
   at System.RuntimeMethodHandle.InvokeMethod(Object target, Void** arguments, Signature sig, Boolean isConstructor)
   at System.Reflection.MethodBaseInvoker.InvokeWithNoArgs(Object obj, BindingFlags invokeAttr)

To view more test analytics, go to the Test Analytics Dashboard
📋 Got 3 mins? Take this short survey to help us improve Test Analytics.

@github-actions

Copy link
Copy Markdown
Contributor

This PR was marked stale due to lack of activity and will be closed in 7 days. Commenting or pushing will instruct the bot to automatically remove the label. This bot runs once per day.

@github-actions github-actions Bot added the Stale Issues and pull requests which have been flagged for closing due to inactivity label Jun 20, 2026
- Move emission from BatchLogRecordExportProcessor + OtlpLogExporter
  to LoggerProviderSdk.Shutdown (one event per provider).
- Use error.type (absent=success, 'timeout'/'failed' on failure)
  instead of custom otel.component.shutdown.result enum.
- Revert BLP + OtlpLogExporter + PublicAPI.Unshipped.txt to main.
- Update tests to validate provider-level event shape.
Each provider now emits otel.sdk.component.shutdown with:
- otel.component.type: tracer_provider / meter_provider / logger_provider
- otel.component.name: <type>/<N>
- error.type: absent on success, 'timeout'/'failed' on failure
- otel.component.shutdown.duration: wall-clock seconds
- LoggerProviderSdk.Dispose: call this.Shutdown(5000) instead of
  this.Processor?.Shutdown(5000) directly.
- TracerProviderSdk.Dispose: call OnShutdown via idempotency guard.
- MeterProviderSdk.Dispose: same pattern.
- Tests: clear self-obs logger before disposing selfObsLoggerFactory
  to avoid capturing the self-obs provider's own shutdown event.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

logs Logging signal related pkg:OpenTelemetry.Exporter.OpenTelemetryProtocol Issues related to OpenTelemetry.Exporter.OpenTelemetryProtocol NuGet package pkg:OpenTelemetry Issues related to OpenTelemetry NuGet package spec-compliance Issues related to compliance with the OpenTelemetry Specification Stale Issues and pull requests which have been flagged for closing due to inactivity

Projects

Status: In progress

Development

Successfully merging this pull request may close these issues.

1 participant