diff --git a/cmd/werf/common/telemetry.go b/cmd/werf/common/telemetry.go index b3c10ed295..f08261a56f 100644 --- a/cmd/werf/common/telemetry.go +++ b/cmd/werf/common/telemetry.go @@ -2,21 +2,32 @@ package common import ( "context" + "fmt" + "os" - "github.com/werf/logboek" "github.com/werf/werf/pkg/telemetry" + "github.com/werf/werf/pkg/util" ) func InitTelemetry(ctx context.Context) { - // TODO: append error to the ~/.werf/telemetry_errors.log - if err := telemetry.Init(ctx); err != nil { - logboek.Context(ctx).Debug().LogF("Telemetry: init error: %s\n", err) + if err := telemetry.Init(ctx, telemetry.TelemetryOptions{ + ErrorHandlerFunc: func(err error) { + logTelemetryError(ctx, err.Error()) + }, + }); err != nil { + logTelemetryError(ctx, fmt.Sprintf("unable to init: %s", err)) } } func ShutdownTelemetry(ctx context.Context, exitCode int) { - // TODO: append error to the ~/.werf/telemetry_errors.log if err := telemetry.Shutdown(ctx); err != nil { - logboek.Context(ctx).Debug().LogF("Telemetry: shutdown error: %s\n", err) + logTelemetryError(ctx, fmt.Sprintf("unable to shutdown: %s", err)) } } + +func logTelemetryError(ctx context.Context, msg string) { + if !util.GetBoolEnvironmentDefaultFalse("WERF_TELEMETRY_LOGS") { + return + } + fmt.Fprintf(os.Stderr, "Telemetry error: %s\n", msg) +} diff --git a/cmd/werf/main.go b/cmd/werf/main.go index 2e1bc45364..9687376495 100644 --- a/cmd/werf/main.go +++ b/cmd/werf/main.go @@ -1,7 +1,6 @@ package main import ( - "context" "fmt" "log" "os" @@ -75,7 +74,7 @@ func getFullCommandName(cmd *cobra.Command) string { } func main() { - ctx := context.Background() + ctx := common.GetContext() common.InitTelemetry(ctx) @@ -138,6 +137,8 @@ func main() { common.TerminateWithError(err.Error(), 1) } } + + common.ShutdownTelemetry(ctx, 0) } func constructRootCmd() *cobra.Command { diff --git a/pkg/telemetry/telemetry.go b/pkg/telemetry/telemetry.go index febfdaebf5..72db5c0399 100644 --- a/pkg/telemetry/telemetry.go +++ b/pkg/telemetry/telemetry.go @@ -4,6 +4,8 @@ import ( "context" "fmt" + "go.opentelemetry.io/otel" + "github.com/werf/werf/pkg/util" ) @@ -20,7 +22,11 @@ func GetTelemetryWerfIO() TelemetryWerfIOInterface { return telemetrywerfio } -func Init(ctx context.Context) error { +type TelemetryOptions struct { + ErrorHandlerFunc func(err error) +} + +func Init(ctx context.Context, opts TelemetryOptions) error { if !IsEnabled() { return nil } @@ -31,9 +37,23 @@ func Init(ctx context.Context) error { telemetrywerfio = t } + otel.SetErrorHandler(&callFuncErrorHandler{f: opts.ErrorHandlerFunc}) + + if err := telemetrywerfio.Start(ctx); err != nil { + return fmt.Errorf("unable to start telemetry.werf.io exporter: %w", err) + } + return nil } +type callFuncErrorHandler struct{ f func(error) } + +func (h *callFuncErrorHandler) Handle(err error) { + if h.f != nil { + h.f(err) + } +} + func Shutdown(ctx context.Context) error { if !IsEnabled() { return nil diff --git a/pkg/telemetry/telemetrywerfio.go b/pkg/telemetry/telemetrywerfio.go index bdd1bff4b6..99d68900e3 100644 --- a/pkg/telemetry/telemetrywerfio.go +++ b/pkg/telemetry/telemetrywerfio.go @@ -34,9 +34,14 @@ func NewTelemetryWerfIO(url string) (*TelemetryWerfIO, error) { } return &TelemetryWerfIO{ - tracerProvider: sdktrace.NewTracerProvider(sdktrace.WithSyncer(e)), - traceExporter: e, - executionID: uuid.New().String(), + tracerProvider: sdktrace.NewTracerProvider( + sdktrace.WithBatcher(e, + sdktrace.WithBatchTimeout(0), + sdktrace.WithExportTimeout(3*time.Second), + ), + ), + traceExporter: e, + executionID: uuid.New().String(), }, nil }