chatdesk-ui/auth_v2.169.0/internal/api/opentelemetry-tracer_test.go

94 lines
2.7 KiB
Go

package api
import (
"net/http"
"net/http/httptest"
"testing"
"github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require"
"github.com/stretchr/testify/suite"
"github.com/supabase/auth/internal/conf"
"github.com/supabase/auth/internal/storage"
"go.opentelemetry.io/otel"
"go.opentelemetry.io/otel/attribute"
sdktrace "go.opentelemetry.io/otel/sdk/trace"
"go.opentelemetry.io/otel/sdk/trace/tracetest"
semconv "go.opentelemetry.io/otel/semconv/v1.25.0"
)
type OpenTelemetryTracerTestSuite struct {
suite.Suite
API *API
Config *conf.GlobalConfiguration
}
func TestOpenTelemetryTracer(t *testing.T) {
api, config, err := setupAPIForTestWithCallback(func(config *conf.GlobalConfiguration, conn *storage.Connection) {
if config != nil {
config.Tracing.Enabled = true
config.Tracing.Exporter = conf.OpenTelemetryTracing
}
})
require.NoError(t, err)
ts := &OpenTelemetryTracerTestSuite{
API: api,
Config: config,
}
defer api.db.Close()
suite.Run(t, ts)
}
func getAttribute(attributes []attribute.KeyValue, key attribute.Key) *attribute.Value {
for _, value := range attributes {
if value.Key == key {
return &value.Value
}
}
return nil
}
func (ts *OpenTelemetryTracerTestSuite) TestOpenTelemetryTracer_Spans() {
exporter := tracetest.NewInMemoryExporter()
bsp := sdktrace.NewSimpleSpanProcessor(exporter)
traceProvider := sdktrace.NewTracerProvider(
sdktrace.WithSampler(sdktrace.AlwaysSample()),
sdktrace.WithSpanProcessor(bsp),
)
otel.SetTracerProvider(traceProvider)
w := httptest.NewRecorder()
req := httptest.NewRequest(http.MethodPost, "http://localhost/something1", nil)
req.Header.Set("User-Agent", "whatever")
ts.API.handler.ServeHTTP(w, req)
req = httptest.NewRequest(http.MethodGet, "http://localhost/something2", nil)
req.Header.Set("User-Agent", "whatever")
ts.API.handler.ServeHTTP(w, req)
spanStubs := exporter.GetSpans()
spans := spanStubs.Snapshots()
if assert.Equal(ts.T(), 2, len(spans)) {
attributes1 := spans[0].Attributes()
method1 := getAttribute(attributes1, semconv.HTTPMethodKey)
assert.Equal(ts.T(), "POST", method1.AsString())
url1 := getAttribute(attributes1, semconv.HTTPTargetKey)
assert.Equal(ts.T(), "/something1", url1.AsString())
statusCode1 := getAttribute(attributes1, semconv.HTTPStatusCodeKey)
assert.Equal(ts.T(), int64(404), statusCode1.AsInt64())
attributes2 := spans[1].Attributes()
method2 := getAttribute(attributes2, semconv.HTTPMethodKey)
assert.Equal(ts.T(), "GET", method2.AsString())
url2 := getAttribute(attributes2, semconv.HTTPTargetKey)
assert.Equal(ts.T(), "/something2", url2.AsString())
statusCode2 := getAttribute(attributes2, semconv.HTTPStatusCodeKey)
assert.Equal(ts.T(), int64(404), statusCode2.AsInt64())
}
}