Skip to content

Commit 3e30918

Browse files
authored
chore(otel): add support for http/protobuf OTLP metrics export (#15061)
Signed-off-by: Milas Bowman <[email protected]>
1 parent 59f9b7b commit 3e30918

File tree

4 files changed

+31
-6
lines changed

4 files changed

+31
-6
lines changed

docs/metrics.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ It will not be enabled if left blank, unlike some other implementations.
3131

3232
You can configure the protocol using the environment variables documented in [standard environment variables](https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/).
3333

34+
By default, GRPC is used; to switch to HTTP, set either the `OTEL_EXPORTER_OTLP_PROTOCOL` or `OTEL_EXPORTER_OTLP_METRICS_PROTOCOL` environment variable to `http/protobuf`.
35+
3436
The [configuration options](#common) in the controller ConfigMap `metricsTTL`, `modifiers` and `temporality` affect the OpenTelemetry behavior, but the other parameters do not.
3537

3638
To use the [OpenTelemetry collector](https://opentelemetry.io/docs/collector/) you can configure it

go.mod

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ require (
6060
go.opentelemetry.io/contrib/instrumentation/runtime v0.61.0
6161
go.opentelemetry.io/otel v1.36.0
6262
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0
63+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0
6364
go.opentelemetry.io/otel/exporters/prometheus v0.58.0
6465
go.opentelemetry.io/otel/metric v1.36.0
6566
go.opentelemetry.io/otel/sdk v1.36.0

go.sum

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -872,6 +872,8 @@ go.opentelemetry.io/otel v1.36.0 h1:UumtzIklRBY6cI/lllNZlALOF5nNIzJVb16APdvgTXg=
872872
go.opentelemetry.io/otel v1.36.0/go.mod h1:/TcFMXYjyRNh8khOAO9ybYkqaDBb/70aVwkNML4pP8E=
873873
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0 h1:zwdo1gS2eH26Rg+CoqVQpEK1h8gvt5qyU5Kk5Bixvow=
874874
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc v1.36.0/go.mod h1:rUKCPscaRWWcqGT6HnEmYrK+YNe5+Sw64xgQTOJ5b30=
875+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0 h1:gAU726w9J8fwr4qRDqu1GYMNNs4gXrU+Pv20/N1UpB4=
876+
go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp v1.36.0/go.mod h1:RboSDkp7N292rgu+T0MgVt2qgFGu6qa1RpZDOtpL76w=
875877
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0 h1:Vh5HayB/0HHfOQA7Ctx69E/Y/DcQSMPpKANYVMQ7fBA=
876878
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.33.0/go.mod h1:cpgtDBaqD/6ok/UG0jT15/uKjAY8mRA53diogHBg3UI=
877879
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.33.0 h1:5pojmb1U1AogINhN3SurB+zm/nIcusopeBNp42f45QM=

util/telemetry/metrics.go

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,14 @@ package telemetry
33
import (
44
"context"
55
"os"
6+
"strings"
67
"sync"
78
"time"
89

9-
"go.opentelemetry.io/otel"
10-
1110
"go.opentelemetry.io/contrib/instrumentation/runtime"
11+
"go.opentelemetry.io/otel"
1212
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
13+
"go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetrichttp"
1314
"go.opentelemetry.io/otel/metric"
1415
metricsdk "go.opentelemetry.io/otel/sdk/metric"
1516
"go.opentelemetry.io/otel/sdk/resource"
@@ -74,13 +75,32 @@ func NewMetrics(ctx context.Context, serviceName, prometheusName string, config
7475
_, otlpEnabled := os.LookupEnv(`OTEL_EXPORTER_OTLP_ENDPOINT`)
7576
_, otlpMetricsEnabled := os.LookupEnv(`OTEL_EXPORTER_OTLP_METRICS_ENDPOINT`)
7677
logger := logging.RequireLoggerFromContext(ctx)
78+
7779
if otlpEnabled || otlpMetricsEnabled {
7880
logger.Info(ctx, "Starting OTLP metrics exporter")
79-
otelExporter, err := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithTemporalitySelector(config.Temporality))
80-
if err != nil {
81-
return nil, err
81+
82+
// NOTE: The OTel SDK default changed from gRPC to http/protobuf. For backwards compatibility,
83+
// gRPC is preserved as the default in workflows controller, but http/protobuf can be opted-in
84+
// to by setting the _PROTOCOL env var explicitly.
85+
// These env vars match the official SDK: https://opentelemetry.io/docs/languages/sdk-configuration/otlp-exporter/#otel_exporter_otlp_metrics_protocol.
86+
otlpProtocol := os.Getenv(`OTEL_EXPORTER_OTLP_METRICS_PROTOCOL`)
87+
if otlpProtocol == "" {
88+
otlpProtocol = os.Getenv(`OTEL_EXPORTER_OTLP_PROTOCOL`)
89+
}
90+
91+
if otlpProtocol == "" || otlpProtocol == "grpc" {
92+
httpExporter, err := otlpmetricgrpc.New(ctx, otlpmetricgrpc.WithTemporalitySelector(config.Temporality))
93+
if err != nil {
94+
return nil, err
95+
}
96+
options = append(options, metricsdk.WithReader(metricsdk.NewPeriodicReader(httpExporter)))
97+
} else if strings.HasPrefix(otlpProtocol, "http/") {
98+
grpcExporter, err := otlpmetrichttp.New(ctx, otlpmetrichttp.WithTemporalitySelector(config.Temporality))
99+
if err != nil {
100+
return nil, err
101+
}
102+
options = append(options, metricsdk.WithReader(metricsdk.NewPeriodicReader(grpcExporter)))
82103
}
83-
options = append(options, metricsdk.WithReader(metricsdk.NewPeriodicReader(otelExporter)))
84104
}
85105

86106
if config.Enabled {

0 commit comments

Comments
 (0)