From c137790c3362c9450dc3d7b0aa55f5691b717423 Mon Sep 17 00:00:00 2001 From: Ragot Geoffrey Date: Fri, 18 Nov 2022 09:14:03 +0100 Subject: [PATCH] feat(telemetry): add resource attributes --- sharedotlp/pkg/sharedotlptraces/cli.go | 6 ++++ sharedotlp/pkg/sharedotlptraces/traces.go | 38 +++++++++++++++-------- 2 files changed, 31 insertions(+), 13 deletions(-) diff --git a/sharedotlp/pkg/sharedotlptraces/cli.go b/sharedotlp/pkg/sharedotlptraces/cli.go index ca78cae..d98ee4c 100644 --- a/sharedotlp/pkg/sharedotlptraces/cli.go +++ b/sharedotlp/pkg/sharedotlptraces/cli.go @@ -16,6 +16,8 @@ const ( OtelTracesExporterOTLPModeFlag = "otel-traces-exporter-otlp-mode" OtelTracesExporterOTLPEndpointFlag = "otel-traces-exporter-otlp-endpoint" OtelTracesExporterOTLPInsecureFlag = "otel-traces-exporter-otlp-insecure" + OtelResourceAttributes = "otel-resource-attributes" + OtelServiceName = "otel-service-name" ) func InitOTLPTracesFlags(flags *flag.FlagSet) { @@ -28,6 +30,8 @@ func InitOTLPTracesFlags(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.String(OtelServiceName, "", "OpenTelemetry service name") + flags.StringSlice(OtelResourceAttributes, []string{}, "Additional OTLP resource attributes") } func CLITracesModule(v *viper.Viper) fx.Option { @@ -55,6 +59,8 @@ func CLITracesModule(v *viper.Viper) fx.Option { Insecure: v.GetBool(OtelTracesExporterOTLPInsecureFlag), } }(), + ServiceName: v.GetString(OtelServiceName), + ResourceAttributes: v.GetStringSlice(OtelResourceAttributes), }) } return fx.Options() diff --git a/sharedotlp/pkg/sharedotlptraces/traces.go b/sharedotlp/pkg/sharedotlptraces/traces.go index a0a9931..fc4f007 100644 --- a/sharedotlp/pkg/sharedotlptraces/traces.go +++ b/sharedotlp/pkg/sharedotlptraces/traces.go @@ -2,10 +2,13 @@ package sharedotlptraces import ( "context" + "fmt" + "strings" sharedotlp "github.com/formancehq/go-libs/sharedotlp/pkg" "go.opentelemetry.io/contrib/propagators/b3" "go.opentelemetry.io/otel" + "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/exporters/jaeger" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp" @@ -37,11 +40,12 @@ type OTLPConfig struct { } type ModuleConfig struct { - Exporter string - Batch bool - JaegerConfig *JaegerConfig - OTLPConfig *OTLPConfig - Resource *resource.Resource + Exporter string + Batch bool + JaegerConfig *JaegerConfig + OTLPConfig *OTLPConfig + ResourceAttributes []string + ServiceName string } func ProvideTracerProviderOption(v any, annotations ...fx.Annotation) fx.Option { @@ -49,17 +53,25 @@ func ProvideTracerProviderOption(v any, annotations ...fx.Annotation) fx.Option return fx.Provide(fx.Annotate(v, annotations...)) } +func loadResource(cfg ModuleConfig) (*resource.Resource, error) { + defaultResource := resource.Default() + attributes := make([]attribute.KeyValue, 0) + attributes = append(attributes, attribute.String("service.name", cfg.ServiceName)) + for _, ra := range cfg.ResourceAttributes { + parts := strings.SplitN(ra, "=", 2) + if len(parts) < 2 { + return nil, fmt.Errorf("malformed otlp attribute: %s", ra) + } + attributes = append(attributes, attribute.String(parts[0], parts[1])) + } + return resource.Merge(defaultResource, resource.NewSchemaless(attributes...)) +} + func TracesModule(cfg ModuleConfig) fx.Option { options := make([]fx.Option, 0) options = append(options, - fx.Provide(func() (*resource.Resource, error) { - defaultResource := resource.Default() - if cfg.Resource == nil { - return defaultResource, nil - } - return resource.Merge(defaultResource, cfg.Resource) - }), - fx.Supply(resource.Default()), + fx.Supply(cfg), + fx.Provide(loadResource), fx.Provide(func(tp *tracesdk.TracerProvider) trace.TracerProvider { return tp }), fx.Provide(fx.Annotate(func(options ...tracesdk.TracerProviderOption) *tracesdk.TracerProvider { return tracesdk.NewTracerProvider(options...)