package apm import ( "context" "log" "strings" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/exporters/otlp/otlptrace" "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc" "go.opentelemetry.io/otel/sdk/resource" sdktrace "go.opentelemetry.io/otel/sdk/trace" "google.golang.org/grpc/credentials" "github.com/chaitin/panda-wiki/config" ) type Tracer struct { Shutdown func(context.Context) error } func NewTracer(config *config.Config) (*Tracer, error) { serviceName := config.GetString("apm.service_name") collectorURL := config.GetString("apm.otel_exporter_otlp_endpoint") insecure := config.GetString("apm.insecure") var secureOption otlptracegrpc.Option if strings.ToLower(insecure) == "false" || insecure == "0" || strings.ToLower(insecure) == "f" { secureOption = otlptracegrpc.WithTLSCredentials(credentials.NewClientTLSFromCert(nil, "")) } else { secureOption = otlptracegrpc.WithInsecure() } exporter, err := otlptrace.New( context.Background(), otlptracegrpc.NewClient( secureOption, otlptracegrpc.WithEndpoint(collectorURL), ), ) if err != nil { log.Fatalf("Failed to create exporter: %v", err) } resources, err := resource.New( context.Background(), resource.WithAttributes( attribute.String("service.name", serviceName), attribute.String("library.language", "go"), ), ) if err != nil { log.Fatalf("Could not set resources: %v", err) } otel.SetTracerProvider( sdktrace.NewTracerProvider( sdktrace.WithSampler(sdktrace.AlwaysSample()), sdktrace.WithBatcher(exporter), sdktrace.WithResource(resources), ), ) return &Tracer{Shutdown: exporter.Shutdown}, nil }