rara/packages/go/observability/observability.go
toki fdc86c7ff4
Some checks are pending
ci / validate (push) Waiting to run
initial commit
2026-07-18 18:41:17 +09:00

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
}