Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

autoexport: Add support for metrics #4229

Merged
merged 28 commits into from Oct 24, 2023
Merged
Show file tree
Hide file tree
Changes from 8 commits
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
80d77f8
autoexport: Add support for metrics
punya Aug 22, 2023
78ef081
Format and fix typo
punya Aug 22, 2023
0b6c412
Add changelog entry
punya Aug 22, 2023
3ea1366
Factor registry into metrics/spans/shared
punya Aug 22, 2023
3ae284a
Start adding metrics-related tests
punya Aug 23, 2023
155c74e
Generalize tests to metrics
punya Aug 23, 2023
2999fd4
Fix deps
punya Oct 16, 2023
d498e8e
Tests
punya Oct 18, 2023
c33d73f
Add support for Prometheus exporter
punya Oct 19, 2023
8c40f0a
Rename signal -> fixture in tests
punya Oct 19, 2023
ffd185b
Rewrite + respond to PR feedback
punya Oct 19, 2023
0f350db
Reduce unnecessarily fancy generics in tests
punya Oct 19, 2023
6d04d4c
Remove unnecessary generics in tests
punya Oct 19, 2023
5cf5027
Remove unused deps
punya Oct 19, 2023
4f0e614
Cleanup
punya Oct 19, 2023
90eeff5
Cleanup and lint fixes
punya Oct 19, 2023
6c1e67c
Fix copypasta and improve names
punya Oct 19, 2023
1e68beb
Tests for unspecified protocol
punya Oct 19, 2023
9cacbfc
Merge remote-tracking branch 'origin/main' into autoexport-metrics
punya Oct 19, 2023
b8c8b35
Appease gofumpt
punya Oct 19, 2023
1af21f1
DRY panic logic
punya Oct 19, 2023
2b08d9f
Avoid unnecessary require block
punya Oct 19, 2023
37ac9d5
Fix documentation
punya Oct 20, 2023
8f6c1bb
Use SpanOption rather than deprecated alias
punya Oct 20, 2023
b1a5584
Remove Prometheus support - deferred to #4472
punya Oct 23, 2023
3ecc111
Merge branch 'main' into autoexport-metrics
punya Oct 23, 2023
a8b2ef7
Move CHANGELOG entry and add deprecation
punya Oct 23, 2023
503e4ff
Update CHANGELOG.md
pellared Oct 23, 2023
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -73,6 +73,7 @@ This project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.htm
- Add `WithSpanOptions` option in `go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc`. (#3768)
- Add testing support for Go 1.21. (#4233)
- Add `WithFilter` option to `go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux`. (#4230)
- Add metrics support to `go.opentelemetry.io/contrib/exporters/autoexport`. (#4229)
punya marked this conversation as resolved.
Show resolved Hide resolved

### Changed

Expand Down
94 changes: 83 additions & 11 deletions exporters/autoexport/exporter.go
Expand Up @@ -18,15 +18,18 @@
"context"
"os"

"go.opentelemetry.io/otel/sdk/metric"
"go.opentelemetry.io/otel/sdk/trace"
)

const (
otelTracesExportersEnvKey = "OTEL_TRACES_EXPORTER"
otelTracesExportersEnvKey = "OTEL_TRACES_EXPORTER"
otelMetricsExportersEnvKey = "OTEL_METRICS_EXPORTER"
)

type config struct {
fallbackExporter trace.SpanExporter
fallbackSpanExporter trace.SpanExporter
fallbackMetricReader metric.Reader
}

func newConfig(ctx context.Context, opts ...Option) (config, error) {
Expand All @@ -35,14 +38,24 @@
cfg = opt.apply(cfg)
}

// if no fallback exporter is configured, use otlp exporter
if cfg.fallbackExporter == nil {
exp, err := spanExporter(context.Background(), "otlp")
// if no fallback span exporter is configured, use otlp exporter
if cfg.fallbackSpanExporter == nil {
exp, err := spanExporter(ctx, "otlp")
if err != nil {
return cfg, err
}
cfg.fallbackExporter = exp
cfg.fallbackSpanExporter = exp
}

// if no fallback metric reader is configured, use otlp exporter
if cfg.fallbackMetricReader == nil {
r, err := metricReader(ctx, "otlp")
if err != nil {
return cfg, err
}

Check warning on line 55 in exporters/autoexport/exporter.go

View check run for this annotation

Codecov / codecov/patch

exporters/autoexport/exporter.go#L54-L55

Added lines #L54 - L55 were not covered by tests
cfg.fallbackMetricReader = r
}

return cfg, nil
}

Expand All @@ -61,7 +74,7 @@
// is configured through the OTEL_TRACES_EXPORTER environment variable.
func WithFallbackSpanExporter(exporter trace.SpanExporter) Option {
return optionFunc(func(cfg config) config {
cfg.fallbackExporter = exporter
cfg.fallbackSpanExporter = exporter
return cfg
})
}
Expand Down Expand Up @@ -91,7 +104,7 @@
func NewSpanExporter(ctx context.Context, opts ...Option) (trace.SpanExporter, error) {
// prefer exporter configured via environment variables over exporter
// passed in via exporter parameter
envExporter, err := makeExporterFromEnv(ctx)
envExporter, err := makeSpanExporterFromEnv(ctx)
if err != nil {
return nil, err
}
Expand All @@ -102,16 +115,75 @@
if err != nil {
return nil, err
}
return config.fallbackExporter, nil
return config.fallbackSpanExporter, nil
}

// NewMetricReader returns a configured [go.opentelemetry.io/otel/sdk/metric.Reader]
// defined using the environment variables described below.
//
// OTEL_METRICS_EXPORTER defines the metrics exporter; supported values:
punya marked this conversation as resolved.
Show resolved Hide resolved
// - "none" - "no operation" exporter
// - "otlp" (default) - OTLP exporter; see [go.opentelemetry.io/otel/exporters/otlp/otlptrace]
//
// OTEL_EXPORTER_OTLP_PROTOCOL defines OTLP exporter's transport protocol;
// supported values:
// - "grpc" - protobuf-encoded data using gRPC wire format over HTTP/2 connection;
// see: [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc]
// - "http/protobuf" (default) - protobuf-encoded data over HTTP connection;
// see: [go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp]
//
// An error is returned if an environment value is set to an unhandled value.
//
// Use [RegisterMetricReader] to handle more values of OTEL_METRICS_EXPORTER.
//
// Use [WithFallbackMetricReader] option to change the returned exporter
// when OTEL_TRACES_EXPORTER is unset or empty.
//
// Use [IsNoneSpanExporter] to check if the retured exporter is a "no operation" exporter.
func NewMetricReader(ctx context.Context, opts ...Option) (metric.Reader, error) {
punya marked this conversation as resolved.
Show resolved Hide resolved
// prefer exporter configured via environment variables over exporter
// passed in via exporter parameter
envReader, err := makeMetricReaderFromEnv(ctx)
if err != nil {
return nil, err
}
if envReader != nil {
return envReader, nil
}
config, err := newConfig(ctx, opts...)
if err != nil {
return nil, err
}

Check warning on line 156 in exporters/autoexport/exporter.go

View check run for this annotation

Codecov / codecov/patch

exporters/autoexport/exporter.go#L155-L156

Added lines #L155 - L156 were not covered by tests
return config.fallbackMetricReader, nil
}

// makeExporterFromEnv returns a configured SpanExporter defined by the OTEL_TRACES_EXPORTER
// WithFallbackMetricReader sets the fallback exporter to use when no exporter
// is configured through the OTEL_METRICS_EXPORTER environment variable.
func WithFallbackMetricReader(reader metric.Reader) Option {
return optionFunc(func(cfg config) config {
cfg.fallbackMetricReader = reader
return cfg
})
}

// makeSpanExporterFromEnv returns a configured SpanExporter defined by the OTEL_TRACES_EXPORTER
// environment variable.
// nil is returned if no exporter is defined for the environment variable.
func makeExporterFromEnv(ctx context.Context) (trace.SpanExporter, error) {
func makeSpanExporterFromEnv(ctx context.Context) (trace.SpanExporter, error) {
expType := os.Getenv(otelTracesExportersEnvKey)
if expType == "" {
return nil, nil
}
return spanExporter(ctx, expType)
}

// makeMetricReaderFromEnv returns a configured metric.Reader defined by the OTEL_METRICS_EXPORTER
// environment variable.
// nil is returned if no exporter is defined for the environment variable.
func makeMetricReaderFromEnv(ctx context.Context) (metric.Reader, error) {
expType := os.Getenv(otelMetricsExportersEnvKey)
if expType == "" {
return nil, nil
}
return metricReader(ctx, expType)
}