diff --git a/otlp/otlpmetrics/cli.go b/otlp/otlpmetrics/cli.go index d9cf8fc..1d38419 100644 --- a/otlp/otlpmetrics/cli.go +++ b/otlp/otlpmetrics/cli.go @@ -1,6 +1,7 @@ package otlpmetrics import ( + "strings" "time" "github.com/spf13/cobra" @@ -19,6 +20,7 @@ const ( OtelMetricsExporterOTLPModeFlag = "otel-metrics-exporter-otlp-mode" OtelMetricsExporterOTLPEndpointFlag = "otel-metrics-exporter-otlp-endpoint" OtelMetricsExporterOTLPInsecureFlag = "otel-metrics-exporter-otlp-insecure" + OtelMetricsExporterOTLPHeadersFlag = "otel-metrics-exporter-otlp-headers" ) func AddFlags(flags *flag.FlagSet) { @@ -31,6 +33,7 @@ func AddFlags(flags *flag.FlagSet) { flags.String(OtelMetricsExporterOTLPModeFlag, "grpc", "OpenTelemetry metrics OTLP exporter mode (grpc|http)") flags.String(OtelMetricsExporterOTLPEndpointFlag, "", "OpenTelemetry metrics grpc endpoint") flags.Bool(OtelMetricsExporterOTLPInsecureFlag, false, "OpenTelemetry metrics grpc insecure") + flags.StringSlice(OtelMetricsExporterOTLPHeadersFlag, nil, "OpenTelemetry metrics grpc headers") // notes(gfyrag): apps are in charge of exposing in memory metrics using whatever protocol it wants to flags.Bool(OtelMetricsKeepInMemoryFlag, false, "Allow to keep metrics in memory") @@ -45,12 +48,19 @@ func FXModuleFromFlags(cmd *cobra.Command) fx.Option { otelMetricsRuntimeMinimumReadMemStatsInterval, _ := cmd.Flags().GetDuration(OtelMetricsRuntimeMinimumReadMemStatsIntervalFlag) otelMetricsExporterPushInterval, _ := cmd.Flags().GetDuration(OtelMetricsExporterPushIntervalFlag) otelMetricsKeepInMemory, _ := cmd.Flags().GetBool(OtelMetricsKeepInMemoryFlag) + otelMetricsExporterOTLPHeaders, _ := cmd.Flags().GetStringSlice(OtelMetricsExporterOTLPHeadersFlag) + headersMap := make(map[string]string) + for _, header := range otelMetricsExporterOTLPHeaders { + parts := strings.SplitN(header, "=", 2) + headersMap[parts[0]] = parts[1] + } return MetricsModule(ModuleConfig{ OTLPConfig: &OTLPConfig{ Mode: otelMetricsExporterOTLPMode, Endpoint: otelMetricsExporterOTLPEndpoint, Insecure: otelMetricsExporterOTLPInsecure, + Headers: headersMap, }, Exporter: otelMetricsExporter, RuntimeMetrics: otelMetricsRuntime, diff --git a/otlp/otlpmetrics/module.go b/otlp/otlpmetrics/module.go index 664cbeb..e46642c 100644 --- a/otlp/otlpmetrics/module.go +++ b/otlp/otlpmetrics/module.go @@ -42,6 +42,7 @@ type OTLPConfig struct { Mode string Endpoint string Insecure bool + Headers map[string]string } func ProvideMetricsProviderOption(v any, annotations ...fx.Annotation) fx.Option { @@ -132,6 +133,11 @@ func MetricsModule(cfg ModuleConfig) fx.Option { return otlpmetricgrpc.WithInsecure() })) } + if cfg.OTLPConfig.Headers != nil { + options = append(options, ProvideOTLPMetricsGRPCOption(func() otlpmetricgrpc.Option { + return otlpmetricgrpc.WithHeaders(cfg.OTLPConfig.Headers) + })) + } } options = append(options, ProvideOTLPMetricsGRPCExporter()) @@ -147,6 +153,11 @@ func MetricsModule(cfg ModuleConfig) fx.Option { return otlpmetrichttp.WithInsecure() })) } + if cfg.OTLPConfig.Headers != nil { + options = append(options, ProvideOTLPMetricsHTTPOption(func() otlpmetrichttp.Option { + return otlpmetrichttp.WithHeaders(cfg.OTLPConfig.Headers) + })) + } } options = append(options, ProvideOTLPMetricsHTTPExporter()) diff --git a/otlp/otlptraces/cli.go b/otlp/otlptraces/cli.go index 3f7389c..8336967 100644 --- a/otlp/otlptraces/cli.go +++ b/otlp/otlptraces/cli.go @@ -1,6 +1,8 @@ package otlptraces import ( + "strings" + "github.com/formancehq/go-libs/v2/otlp" "github.com/spf13/cobra" flag "github.com/spf13/pflag" @@ -16,6 +18,7 @@ const ( OtelTracesExporterOTLPModeFlag = "otel-traces-exporter-otlp-mode" OtelTracesExporterOTLPEndpointFlag = "otel-traces-exporter-otlp-endpoint" OtelTracesExporterOTLPInsecureFlag = "otel-traces-exporter-otlp-insecure" + OtelTracesExporterOTLPHeadersFlag = "otel-traces-exporter-otlp-headers" ) func AddFlags(flags *flag.FlagSet) { @@ -29,6 +32,7 @@ func AddFlags(flags *flag.FlagSet) { flags.String(OtelTracesExporterOTLPModeFlag, "grpc", "OpenTelemetry traces OTLP exporter mode (grpc|http)") flags.String(OtelTracesExporterOTLPEndpointFlag, "", "OpenTelemetry traces grpc endpoint") flags.Bool(OtelTracesExporterOTLPInsecureFlag, false, "OpenTelemetry traces grpc insecure") + flags.StringSlice(OtelTracesExporterOTLPHeadersFlag, nil, "OpenTelemetry traces grpc headers") } func FXModuleFromFlags(cmd *cobra.Command) fx.Option { @@ -47,11 +51,21 @@ func FXModuleFromFlags(cmd *cobra.Command) fx.Option { mode, _ := cmd.Flags().GetString(OtelTracesExporterOTLPModeFlag) endpoint, _ := cmd.Flags().GetString(OtelTracesExporterOTLPEndpointFlag) insecure, _ := cmd.Flags().GetBool(OtelTracesExporterOTLPInsecureFlag) + headers, _ := cmd.Flags().GetStringSlice(OtelTracesExporterOTLPHeadersFlag) + + headersMap := make(map[string]string) + for _, header := range headers { + parts := strings.SplitN(header, "=", 2) + if len(parts) == 2 { + headersMap[parts[0]] = parts[1] + } + } return &OTLPConfig{ Mode: mode, Endpoint: endpoint, Insecure: insecure, + Headers: headersMap, } }(), ServiceName: serviceName, diff --git a/otlp/otlptraces/traces.go b/otlp/otlptraces/traces.go index 46e77e4..ae0a342 100644 --- a/otlp/otlptraces/traces.go +++ b/otlp/otlptraces/traces.go @@ -33,6 +33,7 @@ type OTLPConfig struct { Mode string Endpoint string Insecure bool + Headers map[string]string } type ModuleConfig struct { @@ -109,6 +110,11 @@ func TracesModule(cfg ModuleConfig) fx.Option { return otlptracegrpc.WithInsecure() })) } + if cfg.OTLPConfig.Headers != nil { + options = append(options, ProvideOTLPTracerGRPCClientOption(func() otlptracegrpc.Option { + return otlptracegrpc.WithHeaders(cfg.OTLPConfig.Headers) + })) + } case otlp.ModeHTTP: if cfg.OTLPConfig.Endpoint != "" { options = append(options, ProvideOTLPTracerHTTPClientOption(func() otlptracehttp.Option { @@ -120,6 +126,11 @@ func TracesModule(cfg ModuleConfig) fx.Option { return otlptracehttp.WithInsecure() })) } + if cfg.OTLPConfig.Headers != nil { + options = append(options, ProvideOTLPTracerHTTPClientOption(func() otlptracehttp.Option { + return otlptracehttp.WithHeaders(cfg.OTLPConfig.Headers) + })) + } } } switch mode {