78 lines
2 KiB
Go
78 lines
2 KiB
Go
package observability
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
|
|
"git.toki-labs.com/toki/rara/packages/go/config"
|
|
"github.com/prometheus/client_golang/prometheus"
|
|
"go.opentelemetry.io/otel"
|
|
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
|
|
"go.opentelemetry.io/otel/sdk/resource"
|
|
sdktrace "go.opentelemetry.io/otel/sdk/trace"
|
|
semconv "go.opentelemetry.io/otel/semconv/v1.30.0"
|
|
"go.uber.org/fx"
|
|
"go.uber.org/zap"
|
|
"go.uber.org/zap/zapcore"
|
|
)
|
|
|
|
func NewLogger(cfg config.Config) (*zap.Logger, error) {
|
|
level := zap.NewAtomicLevel()
|
|
if err := level.UnmarshalText([]byte(cfg.Logging.Level)); err != nil {
|
|
return nil, fmt.Errorf("parse log level: %w", err)
|
|
}
|
|
|
|
var zapConfig zap.Config
|
|
if cfg.Logging.Pretty {
|
|
zapConfig = zap.NewDevelopmentConfig()
|
|
} else {
|
|
zapConfig = zap.NewProductionConfig()
|
|
}
|
|
zapConfig.Level = level
|
|
zapConfig.EncoderConfig.EncodeTime = zapcore.ISO8601TimeEncoder
|
|
return zapConfig.Build()
|
|
}
|
|
|
|
func NewRegistry() *prometheus.Registry {
|
|
return prometheus.NewRegistry()
|
|
}
|
|
|
|
func SetupTracing(
|
|
lifecycle fx.Lifecycle,
|
|
cfg config.Config,
|
|
logger *zap.Logger,
|
|
) error {
|
|
if cfg.Observability.OTelEndpoint == "" {
|
|
logger.Debug("OpenTelemetry exporter disabled")
|
|
return nil
|
|
}
|
|
|
|
options := []otlptracegrpc.Option{
|
|
otlptracegrpc.WithEndpoint(cfg.Observability.OTelEndpoint),
|
|
}
|
|
if cfg.Observability.OTelInsecure {
|
|
options = append(options, otlptracegrpc.WithInsecure())
|
|
}
|
|
exporter, err := otlptracegrpc.New(context.Background(), options...)
|
|
if err != nil {
|
|
return fmt.Errorf("create OTLP exporter: %w", err)
|
|
}
|
|
res, err := resource.New(
|
|
context.Background(),
|
|
resource.WithAttributes(semconv.ServiceName(cfg.Service.Name)),
|
|
)
|
|
if err != nil {
|
|
return fmt.Errorf("create telemetry resource: %w", err)
|
|
}
|
|
provider := sdktrace.NewTracerProvider(
|
|
sdktrace.WithBatcher(exporter),
|
|
sdktrace.WithResource(res),
|
|
)
|
|
otel.SetTracerProvider(provider)
|
|
lifecycle.Append(fx.Hook{
|
|
OnStop: func(ctx context.Context) error {
|
|
return provider.Shutdown(ctx)
|
|
},
|
|
})
|
|
return nil
|
|
}
|