Skip to content

add self observability for stdout exporter#8263

Open
yumosx wants to merge 20 commits into
open-telemetry:mainfrom
yumosx:feat/yumosx/inst-stdlog
Open

add self observability for stdout exporter#8263
yumosx wants to merge 20 commits into
open-telemetry:mainfrom
yumosx:feat/yumosx/inst-stdlog

Conversation

@yumosx
Copy link
Copy Markdown
Member

@yumosx yumosx commented Apr 26, 2026

ref: #7020

goos: darwin
goarch: arm64
pkg: go.opentelemetry.io/otel/exporters/stdout/stdoutlog
                                      │ bench_observability_disabled_6x.txt │ bench_observability_upload_6x.txt │
                                      │               sec/op                │           sec/op            vs base   │
ExporterObservability/Disabled-8                                3.968µ ± 1%
ExporterObservability/UploadSuccess-8                                                        4.236µ ± 2%
geomean                                                         3.967µ                       4.235µ       ? ¹ ²
¹ benchmark set differs from baseline; geomeans may not be comparable
² ratios must be >0 to compute geomean

                                      │ bench_observability_disabled_6x.txt │ bench_observability_upload_6x.txt │
                                      │                B/op                 │            B/op             vs base   │
ExporterObservability/Disabled-8                               1.419Ki ± 0%
ExporterObservability/UploadSuccess-8                                                       1.420Ki ± 0%
geomean                                                        1.419Ki                      1.420Ki       ? ¹ ²
¹ benchmark set differs from baseline; geomeans may not be comparable
² ratios must be >0 to compute geomean

                                      │ bench_observability_disabled_6x.txt │ bench_observability_upload_6x.txt │
                                      │              allocs/op              │         allocs/op           vs base   │
ExporterObservability/Disabled-8                                 33.00 ± 0%
ExporterObservability/UploadSuccess-8                                                         33.00 ± 0%
geomean                                                          33.00                        33.00       ? ¹ ²
¹ benchmark set differs from baseline; geomeans may not be comparable
² ratios must be >0 to compute geomean

@codecov
Copy link
Copy Markdown

codecov Bot commented Apr 26, 2026

Codecov Report

❌ Patch coverage is 95.55556% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 82.9%. Comparing base (a51ddb1) to head (c7f67de).

Files with missing lines Patch % Lines
...tdout/stdoutlog/internal/observ/instrumentation.go 92.8% 1 Missing and 1 partial ⚠️
Additional details and impacted files

Impacted file tree graph

@@          Coverage Diff          @@
##            main   #8263   +/-   ##
=====================================
  Coverage   82.9%   82.9%           
=====================================
  Files        314     315    +1     
  Lines      25093   25109   +16     
=====================================
+ Hits       20809   20826   +17     
  Misses      3910    3910           
+ Partials     374     373    -1     
Files with missing lines Coverage Δ
exporters/stdout/stdoutlog/exporter.go 100.0% <100.0%> (+8.0%) ⬆️
...rters/stdout/stdoutlog/internal/counter/counter.go 100.0% <100.0%> (ø)
...tdout/stdoutlog/internal/observ/instrumentation.go 98.0% <92.8%> (+<0.1%) ⬆️

... and 1 file with indirect coverage changes

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Adds experimental self-observability (SDK exporter metrics) to the stdoutlog exporter, gated behind the OTEL_GO_X_OBSERVABILITY feature flag, following the project’s exporter-observability direction from issue #7020.

Changes:

  • Generate and add an internal counter package to provide unique exporter IDs (and allow deterministic resets in tests).
  • Wire stdoutlog.Exporter to initialize observability instrumentation and record inflight/exported/duration metrics during Export.
  • Add observability-focused tests and a benchmark for enabled vs disabled overhead.

Reviewed changes

Copilot reviewed 5 out of 5 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
exporters/stdout/stdoutlog/internal/gen.go Adds go:generate rules to generate the internal counter package.
exporters/stdout/stdoutlog/internal/counter/counter.go Generated atomic counter used to assign unique exporter IDs.
exporters/stdout/stdoutlog/internal/counter/counter_test.go Generated tests validating counter behavior and concurrency-safety.
exporters/stdout/stdoutlog/exporter.go Initializes instrumentation and records observability metrics around Export.
exporters/stdout/stdoutlog/exporter_test.go Adds tests/benchmarks validating emitted metrics when observability is enabled.

Comment thread exporters/stdout/stdoutlog/exporter_test.go Outdated
Comment thread exporters/stdout/stdoutlog/exporter_test.go
Comment thread exporters/stdout/stdoutlog/exporter_test.go
@yumosx
Copy link
Copy Markdown
Member Author

yumosx commented Apr 27, 2026

I missed the changelog. I will add it later

Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 6 out of 6 changed files in this pull request and generated 3 comments.

Comment thread exporters/stdout/stdoutlog/exporter_test.go
Comment thread exporters/stdout/stdoutlog/exporter.go
Comment thread exporters/stdout/stdoutlog/exporter_test.go
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 3 comments.

Comment thread exporters/stdout/stdoutlog/exporter_test.go
Comment thread exporters/stdout/stdoutlog/internal/observ/instrumentation.go
Comment thread exporters/stdout/stdoutlog/internal/observ/instrumentation.go Outdated
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated 3 comments.

Comment thread exporters/stdout/stdoutlog/internal/observ/instrumentation.go
Comment thread exporters/stdout/stdoutlog/internal/observ/instrumentation.go Outdated
Comment thread exporters/stdout/stdoutlog/exporter.go Outdated
yumosx and others added 5 commits May 6, 2026 11:33
…is true

Previously, the error.type attribute was only added when exportedLogsEnable
was true. If opDurationEnable was true but exportedLogsEnable was false,
the error attribute was never recorded.

Now the condition is expanded to (exportedLogsEnable || opDurationEnable),
while still only calling e.inst.exported.Add when exportedLogsEnable is true.
Previously, stdoutlog.New returned (nil, err) when self-observability
setup failed, making the exporter unusable. This differed from
stdouttrace.New and stdoutmetric.New, which return the exporter
alongside the error, allowing core export functionality to continue
even when experimental observability fails.

Change stdoutlog.New to return the exporter with inst=nil and the
instrumentation error separately, matching the behavior of the other
stdout exporters. The Export method already guards against nil inst,
so this is safe.

Fixes the inconsistency where enabling observability could prevent
stdout log export from working.
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Copilot reviewed 8 out of 8 changed files in this pull request and generated no new comments.

@yumosx
Copy link
Copy Markdown
Member Author

yumosx commented May 8, 2026

Vulnerability #1: GO-2026-4971
    Panic in Dial and LookupPort when handling NUL byte on Windows in net
  More info: https://pkg.go.dev/vuln/GO-2026-4971
  Standard library
    Found in: net@go1.26.2
    Fixed in: net@go1.26.3
    Example traces found:
Error:       #1: client.go:151:2: otlploggrpc.client.UploadLogs calls context.WithCancel, which eventually calls net.Dialer.DialContext

Your code is affected by 1 vulnerability from the Go standard library.
This scan also found 5 vulnerabilities in packages you import and 2
vulnerabilities in modules you require, but your code doesn't appear to call
these vulnerabilities.
Use '-show verbose' for more details.
make: *** [Makefile:235: govulncheck/./exporters/otlp/otlplog/otlploggrpc] Error 3
Error: Process completed with exit code 2.

The CI failure doesn't seem to be caused by this PR.

@yumosx
Copy link
Copy Markdown
Member Author

yumosx commented May 18, 2026

@flc1125 can you help review it?

yumosx and others added 2 commits May 18, 2026 14:15
The observ package uses semconv v1.41.0, but the test was importing
v1.40.0, causing SchemaURL mismatch failures in TestObservability.

Updates the test imports to match the actual package version.
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.

4 participants