Files
upstream-centrifugo/internal/telemetry/provider_test.go
upstream-mirror b352a9a30d
Some checks failed
test / Lint (push) Failing after 3s
test / Test with Go 1.26.8 (push) Failing after 2s
snapshot of https://github.com/centrifugal/centrifugo.git (master, 2026-09-16; blobs > 131072B omitted)
2026-09-16 01:17:21 +05:00

122 lines
3.8 KiB
Go

package telemetry
import (
"context"
"testing"
"go.opentelemetry.io/otel/attribute"
"go.opentelemetry.io/otel/sdk/resource"
semconv "go.opentelemetry.io/otel/semconv/v1.20.0"
)
func resourceAttr(t *testing.T, attrs []attribute.KeyValue, key attribute.Key) (string, bool) {
t.Helper()
for _, kv := range attrs {
if kv.Key == key {
return kv.Value.AsString(), true
}
}
return "", false
}
func TestNewResourceDefaults(t *testing.T) {
t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "")
t.Setenv("OTEL_SERVICE_NAME", "")
rs, err := newResource(context.Background(), "node-1")
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
attrs := rs.Attributes()
if v, _ := resourceAttr(t, attrs, semconv.ServiceNameKey); v != "centrifugo" {
t.Fatalf("unexpected service.name: %q", v)
}
if v, _ := resourceAttr(t, attrs, semconv.ServiceInstanceIDKey); v != "node-1" {
t.Fatalf("unexpected service.instance.id: %q", v)
}
}
func TestNewResourceEnvOverridesAndMerges(t *testing.T) {
t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "gcp.project_id=my-project,service.instance.id=custom-id")
t.Setenv("OTEL_SERVICE_NAME", "my-centrifugo")
rs, err := newResource(context.Background(), "node-1")
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
attrs := rs.Attributes()
if v, _ := resourceAttr(t, attrs, semconv.ServiceNameKey); v != "my-centrifugo" {
t.Fatalf("unexpected service.name: %q", v)
}
if v, _ := resourceAttr(t, attrs, semconv.ServiceInstanceIDKey); v != "custom-id" {
t.Fatalf("env must override default service.instance.id, got: %q", v)
}
if v, ok := resourceAttr(t, attrs, "gcp.project_id"); !ok || v != "my-project" {
t.Fatalf("OTEL_RESOURCE_ATTRIBUTES not merged into resource, gcp.project_id: %q (present: %v)", v, ok)
}
if v, ok := resourceAttr(t, attrs, "version"); !ok || v == "" {
t.Fatalf("version attribute missing: %q (present: %v)", v, ok)
}
}
func TestNewResourceMalformedEnv(t *testing.T) {
t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "missing-equals-sign")
t.Setenv("OTEL_SERVICE_NAME", "")
if _, err := newResource(context.Background(), "node-1"); err == nil {
t.Fatal("expected error for malformed OTEL_RESOURCE_ATTRIBUTES")
}
}
type errorDetector struct{}
func (errorDetector) Detect(context.Context) (*resource.Resource, error) {
return nil, context.DeadlineExceeded
}
func TestNewResourceDetectorError(t *testing.T) {
t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "")
t.Setenv("OTEL_SERVICE_NAME", "")
if _, err := newResource(context.Background(), "node-1", errorDetector{}); err == nil {
t.Fatal("expected error when detector fails")
}
}
type staticDetector []attribute.KeyValue
func (d staticDetector) Detect(context.Context) (*resource.Resource, error) {
return resource.NewSchemaless(d...), nil
}
func TestNewResourceDetectorPrecedence(t *testing.T) {
t.Setenv("OTEL_RESOURCE_ATTRIBUTES", "cloud.region=env-region")
t.Setenv("OTEL_SERVICE_NAME", "")
det := staticDetector{
attribute.String("cloud.region", "detected-region"),
attribute.String("k8s.cluster.name", "detected-cluster"),
semconv.ServiceNameKey.String("detected-name"),
}
rs, err := newResource(context.Background(), "node-1", det)
if err != nil {
t.Fatalf("unexpected error: %v", err)
}
attrs := rs.Attributes()
if v, _ := resourceAttr(t, attrs, "cloud.region"); v != "env-region" {
t.Fatalf("env must override detector, cloud.region: %q", v)
}
if v, _ := resourceAttr(t, attrs, "k8s.cluster.name"); v != "detected-cluster" {
t.Fatalf("detector attribute lost, k8s.cluster.name: %q", v)
}
if v, _ := resourceAttr(t, attrs, semconv.ServiceNameKey); v != "centrifugo" {
t.Fatalf("Centrifugo defaults must override detector, service.name: %q", v)
}
if v, _ := resourceAttr(t, attrs, semconv.ServiceInstanceIDKey); v != "node-1" {
t.Fatalf("unexpected service.instance.id: %q", v)
}
}