diff --git a/cmd/wonderwall/main.go b/cmd/wonderwall/main.go index 913d568..60d3aa3 100644 --- a/cmd/wonderwall/main.go +++ b/cmd/wonderwall/main.go @@ -53,7 +53,7 @@ func run() error { } if cfg.OpenTelemetry.Enabled { - otelShutdown, err := observability.SetupOpenTelemetry(ctx, cfg.OpenTelemetry.ServiceName, cfg.Version) + otelShutdown, err := observability.SetupOpenTelemetry(ctx, cfg.OtelResourceAttributes()) if err != nil { return fmt.Errorf("initializing OpenTelemetry: %w", err) } diff --git a/internal/observability/otel.go b/internal/observability/otel.go index 78351ff..e004705 100644 --- a/internal/observability/otel.go +++ b/internal/observability/otel.go @@ -6,6 +6,7 @@ import ( log "github.com/sirupsen/logrus" "github.com/uptrace/opentelemetry-go-extra/otellogrus" + "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/trace/noop" "go.opentelemetry.io/otel" @@ -14,6 +15,7 @@ import ( "go.opentelemetry.io/otel/sdk/resource" "go.opentelemetry.io/otel/sdk/trace" "go.opentelemetry.io/otel/semconv/v1.26.0" + oteltrace "go.opentelemetry.io/otel/trace" ) const ( @@ -23,15 +25,15 @@ const ( var tracer = noop.NewTracerProvider().Tracer("noop") -//func Tracer() oteltrace.Tracer { -// return tracer -//} +func Tracer() oteltrace.Tracer { + return tracer +} -func SetupOpenTelemetry(ctx context.Context, serviceName, version string) (func(context.Context), error) { +func SetupOpenTelemetry(ctx context.Context, attributes OtelResourceAttributes) (func(context.Context), error) { prop := newPropagator() otel.SetTextMapPropagator(prop) - res, err := newResource(serviceName, version) + res, err := newResource(attributes.KeyValues()) if err != nil { return nil, err } @@ -41,7 +43,7 @@ func SetupOpenTelemetry(ctx context.Context, serviceName, version string) (func( return nil, err } otel.SetTracerProvider(tracerProvider) - tracer = tracerProvider.Tracer("wonderwall") + tracer = tracerProvider.Tracer(attributes.ServiceName) log.Infof("opentelemetry: initialized configuration") shutdown := func(ctx context.Context) { @@ -57,19 +59,42 @@ func SetupOpenTelemetry(ctx context.Context, serviceName, version string) (func( log.FatalLevel, log.ErrorLevel, log.WarnLevel, - log.InfoLevel, ))) return shutdown, nil } -func newResource(serviceName, serviceVersion string) (*resource.Resource, error) { +type OtelResourceAttributes struct { + ServiceName string + ServiceVersion string + IdentityProvider string + IdentityProviderURL string + AutoLoginEnabled bool + SSOEnabled bool + SSOMode string +} + +func (a OtelResourceAttributes) KeyValues() []attribute.KeyValue { + attrs := []attribute.KeyValue{ + semconv.ServiceName(a.ServiceName), + semconv.ServiceVersion(a.ServiceVersion), + attribute.String("wonderwall.identity_provider.name", a.IdentityProvider), + attribute.String("wonderwall.identity_provider.url", a.IdentityProviderURL), + attribute.Bool("wonderwall.autologin", a.AutoLoginEnabled), + attribute.Bool("wonderwall.sso", a.SSOEnabled), + } + if a.SSOEnabled { + attrs = append(attrs, attribute.String("wonderwall.sso.mode", a.SSOMode)) + } + return attrs +} + +func newResource(attributes []attribute.KeyValue) (*resource.Resource, error) { return resource.Merge( resource.Default(), resource.NewWithAttributes( semconv.SchemaURL, - semconv.ServiceName(serviceName), - semconv.ServiceVersion(serviceVersion), + attributes..., ), ) } diff --git a/pkg/config/config.go b/pkg/config/config.go index b7e1fd3..93fb051 100644 --- a/pkg/config/config.go +++ b/pkg/config/config.go @@ -184,6 +184,18 @@ func (c *Config) validateUpstream() error { return nil } +func (c *Config) OtelResourceAttributes() observability.OtelResourceAttributes { + return observability.OtelResourceAttributes{ + ServiceName: c.OpenTelemetry.ServiceName, + ServiceVersion: c.Version, + IdentityProvider: string(c.OpenID.Provider), + IdentityProviderURL: c.OpenID.WellKnownURL, + AutoLoginEnabled: c.AutoLogin, + SSOEnabled: c.SSO.Enabled, + SSOMode: string(c.SSO.Mode), + } +} + func resolveUpstream() { ip := viper.GetString(UpstreamIP) port := viper.GetInt(UpstreamPort)