Skip to content

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

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

[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.
@github-actions

Copy link
Copy Markdown
Contributor

Closed as inactive. Feel free to reopen if this PR is still being worked on.

@github-actions github-actions Bot closed this Jul 10, 2026
@github-project-automation github-project-automation Bot moved this from In progress to Done in OTel Clients Self Observability Jul 10, 2026
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

Development

Successfully merging this pull request may close these issues.

1 participant