From 5fc55f53730d8d4a6b38216c39c6fa58fce0fdfb Mon Sep 17 00:00:00 2001 From: Alexander Trost Date: Fri, 6 Mar 2026 10:44:56 +0100 Subject: [PATCH] feat: add --disable-otel / DISABLE_OTEL to disable otel trace export Signed-off-by: Alexander Trost --- .env.template | 2 ++ README.md | 1 + cmd/lite/lite.go | 7 ++++++- pkg/otel/exporter.go | 14 +++++++++++--- 4 files changed, 20 insertions(+), 4 deletions(-) diff --git a/.env.template b/.env.template index c31ecd1..65fb39f 100644 --- a/.env.template +++ b/.env.template @@ -16,5 +16,7 @@ CLICKHOUSE_DATABASE=default CLICKHOUSE_USERNAME=default CLICKHOUSE_PASSWORD=password +DISABLE_OTEL=false + VERSION=dev # dev only ENV=dev # dev only diff --git a/README.md b/README.md index 4ea00fa..8dd4995 100644 --- a/README.md +++ b/README.md @@ -63,6 +63,7 @@ The application is configured via environment variables. | `CLICKHOUSE_PASSWORD` | ClickHouse password | `password` | | `CLICKHOUSE_DATABASE` | ClickHouse database name | `default` | | `ENV` | Environment mode (`production` or `dev`) | `dev` | +| `DISABLE_OTEL` | Disable OpenTelemetry integration (true/false) | `false` | --- diff --git a/cmd/lite/lite.go b/cmd/lite/lite.go index 69f4036..ad26895 100644 --- a/cmd/lite/lite.go +++ b/cmd/lite/lite.go @@ -48,7 +48,7 @@ var rootCmd = &cobra.Command{ slog.Info("starting Fivemanage application", slog.String("version", Version)) - otelShutdown, err := otel.SetupTracer() + otelShutdown, err := otel.SetupTracer(viper.GetBool("disable-otel")) if err != nil { slog.Error("failed to setup OpenTelemetry", slog.Any("error", err)) } @@ -185,6 +185,8 @@ func init() { // s3 rootCmd.Flags().String("s3-provider", "minio", "S3 provider") rootCmd.Flags().String("bucket-domain", "", "Bucket domain for file storage") + // otel + rootCmd.Flags().Bool("disable-otel", false, "Disable OpenTelemetry") // fuck me if err := viper.BindPFlag("port", rootCmd.Flags().Lookup("port")); err != nil { @@ -220,6 +222,9 @@ func init() { if err := viper.BindEnv("bucket-domain", "BUCKET_DOMAIN"); err != nil { bindError(err) } + if err := viper.BindEnv("disable-otel", "DISABLE_OTEL"); err != nil { + bindError(err) + } rootCmd.AddCommand(migrate.RootCmd) migrate.RootCmd.AddCommand( diff --git a/pkg/otel/exporter.go b/pkg/otel/exporter.go index 907e4f6..45212c6 100644 --- a/pkg/otel/exporter.go +++ b/pkg/otel/exporter.go @@ -12,6 +12,7 @@ import ( "go.opentelemetry.io/otel/sdk/resource" "go.opentelemetry.io/otel/sdk/trace" semconv "go.opentelemetry.io/otel/semconv/v1.24.0" + "go.opentelemetry.io/otel/trace/noop" ) const ( @@ -19,9 +20,9 @@ const ( otlpEndpoint = "localhost:4318" ) -func SetupTracer() (func(context.Context) error, error) { +func SetupTracer(disabled bool) (func(context.Context) error, error) { ctx := context.Background() - return InstallExportPipeline(ctx) + return InstallExportPipeline(ctx, disabled) } func Resource() *resource.Resource { @@ -34,7 +35,14 @@ func Resource() *resource.Resource { ) } -func InstallExportPipeline(ctx context.Context) (func(context.Context) error, error) { +func InstallExportPipeline(ctx context.Context, disabled bool) (func(context.Context) error, error) { + if disabled { + tracerProvider := noop.NewTracerProvider() + otel.SetTracerProvider(tracerProvider) + + return func(context.Context) error { return nil }, nil + } + var tlsOption otlptracehttp.Option if os.Getenv("ENV") == "dev" { tlsOption = otlptracehttp.WithInsecure()