You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

142 lines
4.6 KiB
Go

package tracing
// Tests for tracing initialization, config parsing, and helper wrappers.
import (
"context"
"errors"
"testing"
"github.com/stretchr/testify/require"
)
// TestNewTracer_Disabled ensures new tracer disabled behavior is handled correctly.
func TestNewTracer_Disabled(t *testing.T) {
cfg := DefaultConfig()
cfg.Enabled = false
tracer, err := NewTracer(cfg)
require.NoError(t, err)
require.NotNil(t, tracer)
ctx, span := tracer.StartSpan(context.Background(), "test")
require.NotNil(t, ctx)
require.NotNil(t, span)
require.NotPanics(t, func() {
span.SetAttribute("k", "v")
span.RecordError(errors.New("boom"))
span.End()
})
}
// TestNewTracer_Enabled ensures new tracer enabled behavior is handled correctly.
func TestNewTracer_Enabled(t *testing.T) {
cfg := DefaultConfig()
cfg.Enabled = true
tracer, err := NewTracer(cfg)
require.NoError(t, err)
require.NotNil(t, tracer)
require.NoError(t, tracer.Shutdown(context.Background()))
}
// TestShutdown_Disabled ensures shutdown disabled behavior is handled correctly.
func TestShutdown_Disabled(t *testing.T) {
tracer, err := NewTracer(DefaultConfig())
require.NoError(t, err)
err = tracer.Shutdown(context.Background())
require.NoError(t, err)
}
// TestTraceServiceOperation ensures trace service operation behavior is handled correctly.
func TestTraceServiceOperation(t *testing.T) {
tracer, err := NewTracer(DefaultConfig())
require.NoError(t, err)
expected := errors.New("boom")
err = TraceServiceOperation(context.Background(), tracer, "svc", "op", func(ctx context.Context) error {
return expected
})
require.Equal(t, expected, err)
}
// TestTraceDatabaseOperation ensures trace database operation behavior is handled correctly.
func TestTraceDatabaseOperation(t *testing.T) {
tracer, err := NewTracer(DefaultConfig())
require.NoError(t, err)
called := false
err = TraceDatabaseOperation(context.Background(), tracer, "select", "users", func(ctx context.Context) error {
called = true
return nil
})
require.NoError(t, err)
require.True(t, called)
}
// TestConfigFromEnvDefaults ensures config from env defaults behavior is handled correctly.
func TestConfigFromEnvDefaults(t *testing.T) {
t.Setenv("TRACING_ENABLED", "")
t.Setenv("TRACING_SERVICE_NAME", "")
t.Setenv("TRACING_SERVICE_VERSION", "")
t.Setenv("TRACING_ENVIRONMENT", "")
t.Setenv("TRACING_OTLP_ENDPOINT", "")
t.Setenv("TRACING_JAEGER_ENDPOINT", "")
t.Setenv("TRACING_SAMPLE_RATE", "")
cfg := ConfigFromEnv()
def := DefaultConfig()
require.Equal(t, def, cfg)
}
// TestConfigFromEnvOverrides ensures config from env overrides behavior is handled correctly.
func TestConfigFromEnvOverrides(t *testing.T) {
t.Setenv("TRACING_ENABLED", "true")
t.Setenv("TRACING_SERVICE_NAME", "gateway")
t.Setenv("TRACING_SERVICE_VERSION", "1.2.3")
t.Setenv("TRACING_ENVIRONMENT", "production")
t.Setenv("TRACING_OTLP_ENDPOINT", "https://otel-collector:4318/v1/traces")
t.Setenv("TRACING_JAEGER_ENDPOINT", "http://jaeger:14268/api/traces")
t.Setenv("TRACING_SAMPLE_RATE", "0.25")
cfg := ConfigFromEnv()
require.True(t, cfg.Enabled)
require.Equal(t, "gateway", cfg.ServiceName)
require.Equal(t, "1.2.3", cfg.ServiceVersion)
require.Equal(t, "production", cfg.Environment)
require.Equal(t, "https://otel-collector:4318/v1/traces", cfg.OTLPEndpoint)
require.Equal(t, "http://jaeger:14268/api/traces", cfg.JaegerEndpoint)
require.Equal(t, 0.25, cfg.SampleRate)
}
// TestConfigFromEnvInvalidSampleRate ensures config from env invalid sample rate behavior is handled correctly.
func TestConfigFromEnvInvalidSampleRate(t *testing.T) {
t.Setenv("TRACING_SAMPLE_RATE", "not-a-float")
cfg := ConfigFromEnv()
require.Equal(t, DefaultConfig().SampleRate, cfg.SampleRate)
}
// TestConfigFromEnvLegacyEndpointFallback ensures config from env legacy endpoint
// fallback behavior is handled correctly.
func TestConfigFromEnvLegacyEndpointFallback(t *testing.T) {
t.Setenv("TRACING_OTLP_ENDPOINT", "")
t.Setenv("TRACING_JAEGER_ENDPOINT", "http://legacy:14268/api/traces")
cfg := ConfigFromEnv()
require.Equal(t, "http://legacy:14268/api/traces", cfg.OTLPEndpoint)
require.Equal(t, "http://legacy:14268/api/traces", cfg.JaegerEndpoint)
}
// TestConfigFromEnvEndpointPrecedence ensures config from env endpoint precedence behavior is handled correctly.
func TestConfigFromEnvEndpointPrecedence(t *testing.T) {
t.Setenv("TRACING_OTLP_ENDPOINT", "https://collector:4318/v1/traces")
t.Setenv("TRACING_JAEGER_ENDPOINT", "http://legacy:14268/api/traces")
cfg := ConfigFromEnv()
require.Equal(t, "https://collector:4318/v1/traces", cfg.OTLPEndpoint)
require.Equal(t, "http://legacy:14268/api/traces", cfg.JaegerEndpoint)
}