refactor(otel): extract shared buildResource helper

This commit is contained in:
Julien Neuhart
2026-06-02 19:13:38 +02:00
parent 65e8bf20d4
commit 387728f09a
2 changed files with 44 additions and 33 deletions

View File

@@ -20,11 +20,9 @@ import (
semconv "go.opentelemetry.io/otel/semconv/v1.41.0" semconv "go.opentelemetry.io/otel/semconv/v1.41.0"
) )
// InitTracerProvider initializes the OpenTelemetry tracer provider. // buildResource assembles the OpenTelemetry resource shared by the tracer,
func InitTracerProvider(logger *slog.Logger, serviceName, serviceVersion string) (shutdown func(context.Context) error, err error) { // meter, and logger providers.
initOtelLogger(logger) func buildResource(serviceName, serviceVersion string) (*resource.Resource, error) {
ctx := context.Background()
hostname, err := os.Hostname() hostname, err := os.Hostname()
if err != nil { if err != nil {
return nil, fmt.Errorf("get hostname: %w", err) return nil, fmt.Errorf("get hostname: %w", err)
@@ -43,6 +41,20 @@ func InitTracerProvider(logger *slog.Logger, serviceName, serviceVersion string)
return nil, fmt.Errorf("merge resource: %w", err) return nil, fmt.Errorf("merge resource: %w", err)
} }
return res, nil
}
// InitTracerProvider initializes the OpenTelemetry tracer provider.
func InitTracerProvider(logger *slog.Logger, serviceName, serviceVersion string) (shutdown func(context.Context) error, err error) {
initOtelLogger(logger)
ctx := context.Background()
res, err := buildResource(serviceName, serviceVersion)
if err != nil {
return nil, fmt.Errorf("build resource: %w", err)
}
traceOpts := []trace.TracerProviderOption{ traceOpts := []trace.TracerProviderOption{
trace.WithResource(res), trace.WithResource(res),
} }
@@ -72,22 +84,10 @@ func InitMeterProvider(logger *slog.Logger, serviceName, serviceVersion string)
initOtelLogger(logger) initOtelLogger(logger)
ctx := context.Background() ctx := context.Background()
hostname, err := os.Hostname()
if err != nil {
return nil, fmt.Errorf("get hostname: %w", err)
}
res, err := resource.Merge( res, err := buildResource(serviceName, serviceVersion)
resource.Default(),
resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName(serviceName),
semconv.ServiceVersion(serviceVersion),
semconv.HostName(hostname),
),
)
if err != nil { if err != nil {
return nil, fmt.Errorf("merge resource: %w", err) return nil, fmt.Errorf("build resource: %w", err)
} }
metricOpts := []metric.Option{ metricOpts := []metric.Option{
@@ -126,22 +126,10 @@ func InitLoggerProvider(logger *slog.Logger, serviceName, serviceVersion string)
initOtelLogger(logger) initOtelLogger(logger)
ctx := context.Background() ctx := context.Background()
hostname, err := os.Hostname()
if err != nil {
return nil, nil, fmt.Errorf("get hostname: %w", err)
}
res, err := resource.Merge( res, err := buildResource(serviceName, serviceVersion)
resource.Default(),
resource.NewWithAttributes(
semconv.SchemaURL,
semconv.ServiceName(serviceName),
semconv.ServiceVersion(serviceVersion),
semconv.HostName(hostname),
),
)
if err != nil { if err != nil {
return nil, nil, fmt.Errorf("merge resource: %w", err) return nil, nil, fmt.Errorf("build resource: %w", err)
} }
logOpts := []log.LoggerProviderOption{ logOpts := []log.LoggerProviderOption{

View File

@@ -11,8 +11,31 @@ import (
"go.opentelemetry.io/otel/sdk/metric/exemplar" "go.opentelemetry.io/otel/sdk/metric/exemplar"
"go.opentelemetry.io/otel/sdk/metric/metricdata" "go.opentelemetry.io/otel/sdk/metric/metricdata"
sdktrace "go.opentelemetry.io/otel/sdk/trace" sdktrace "go.opentelemetry.io/otel/sdk/trace"
semconv "go.opentelemetry.io/otel/semconv/v1.41.0"
) )
func TestBuildResource(t *testing.T) {
res, err := buildResource("gotenberg", "v8.0.0")
if err != nil {
t.Fatalf("build resource: %v", err)
}
got := map[string]string{}
for _, kv := range res.Attributes() {
got[string(kv.Key)] = kv.Value.AsString()
}
if got[string(semconv.ServiceNameKey)] != "gotenberg" {
t.Errorf("service.name = %q, want %q", got[string(semconv.ServiceNameKey)], "gotenberg")
}
if got[string(semconv.ServiceVersionKey)] != "v8.0.0" {
t.Errorf("service.version = %q, want %q", got[string(semconv.ServiceVersionKey)], "v8.0.0")
}
if _, ok := got[string(semconv.HostNameKey)]; !ok {
t.Error("expected host.name attribute to be present")
}
}
// TestInitTracerProvider_HonorsSamplerEnv guards the contract that the tracer // TestInitTracerProvider_HonorsSamplerEnv guards the contract that the tracer
// provider keeps honoring OTEL_TRACES_SAMPLER. The SDK reads it only when no // provider keeps honoring OTEL_TRACES_SAMPLER. The SDK reads it only when no
// explicit sampler is configured, so any future WithSampler() would silently // explicit sampler is configured, so any future WithSampler() would silently