diff --git a/plugins/outputs/opentelemetry/opentelemetry.go b/plugins/outputs/opentelemetry/opentelemetry.go index ea68fbae6..a25fe2ff8 100644 --- a/plugins/outputs/opentelemetry/opentelemetry.go +++ b/plugins/outputs/opentelemetry/opentelemetry.go @@ -13,6 +13,7 @@ import ( "go.opentelemetry.io/collector/model/otlpgrpc" "google.golang.org/grpc" "google.golang.org/grpc/credentials" + "google.golang.org/grpc/metadata" ) type OpenTelemetry struct { @@ -160,6 +161,10 @@ func (o *OpenTelemetry) Write(metrics []telegraf.Metric) error { } ctx, cancel := context.WithTimeout(context.Background(), time.Duration(o.Timeout)) + + if len(o.Headers) > 0 { + ctx = metadata.NewOutgoingContext(ctx, metadata.New(o.Headers)) + } defer cancel() _, err := o.metricsServiceClient.Export(ctx, md, o.callOptions...) return err diff --git a/plugins/outputs/opentelemetry/opentelemetry_test.go b/plugins/outputs/opentelemetry/opentelemetry_test.go index b61f48097..cfafcd47f 100644 --- a/plugins/outputs/opentelemetry/opentelemetry_test.go +++ b/plugins/outputs/opentelemetry/opentelemetry_test.go @@ -18,6 +18,7 @@ import ( "go.opentelemetry.io/collector/model/otlpgrpc" "go.opentelemetry.io/collector/model/pdata" "google.golang.org/grpc" + "google.golang.org/grpc/metadata" ) func TestOpenTelemetry(t *testing.T) { @@ -43,6 +44,7 @@ func TestOpenTelemetry(t *testing.T) { plugin := &OpenTelemetry{ ServiceAddress: m.Address(), Timeout: config.Duration(time.Second), + Headers: map[string]string{"test": "header1"}, metricsConverter: metricsConverter, grpcClientConn: m.GrpcClient(), metricsServiceClient: otlpgrpc.NewMetricsClient(m.GrpcClient()), @@ -131,5 +133,8 @@ func (m *mockOtelService) Address() string { func (m *mockOtelService) Export(ctx context.Context, request pdata.Metrics) (otlpgrpc.MetricsResponse, error) { m.metrics = request.Clone() + ctxMetadata, ok := metadata.FromIncomingContext(ctx) + assert.Equal(m.t, []string{"header1"}, ctxMetadata.Get("test")) + assert.True(m.t, ok) return otlpgrpc.MetricsResponse{}, nil }