@@ -11,33 +11,73 @@ import (
1111 jaegercfg "github.com/uber/jaeger-client-go/config"
1212 jaegerlog "github.com/uber/jaeger-client-go/log"
1313 "github.com/uber/jaeger-lib/metrics"
14+ "go.opentelemetry.io/contrib/detectors/gcp"
1415 "go.opentelemetry.io/otel"
16+ "go.opentelemetry.io/otel/sdk/resource"
1517 sdktrace "go.opentelemetry.io/otel/sdk/trace"
18+ semconv "go.opentelemetry.io/otel/semconv/v1.21.0"
1619)
1720
21+ type gcpTracerCloser struct {
22+ tp * sdktrace.TracerProvider
23+ }
24+
25+ func (c * gcpTracerCloser ) Close () error {
26+ if c .tp != nil {
27+ ctx := context .Background ()
28+ return c .tp .Shutdown (ctx )
29+ }
30+ return nil
31+ }
32+
1833func initTracer (ctx context.Context , conf * config.Config ) io.Closer {
19- if conf .Tracer == "gcp" {
20- initGCPTracer (ctx , conf )
21- } else if conf .Tracer == "jaeger" {
34+ switch conf .Tracer {
35+ case "gcp" :
36+ return initGCPTracer (ctx , conf )
37+ case "jaeger" :
2238 return initJaegerTracer (conf )
39+ default :
40+ return nil
2341 }
24- return nil
2542}
2643
27- func initGCPTracer (ctx context.Context , conf * config.Config ) {
44+ func initGCPTracer (ctx context.Context , conf * config.Config ) io.Closer {
45+ // Create GCP trace exporter
2846 exporter , err := texporter .New (texporter .WithProjectID (conf .GCPProject ))
2947 if err != nil {
30- log .Fatalf ("failed to init GCP tracer : %v" , err )
48+ log .Fatalf ("failed to create GCP trace exporter : %v" , err )
3149 }
3250
33- tp := sdktrace .NewTracerProvider (sdktrace .WithSyncer (exporter ), sdktrace .WithSampler (sdktrace .TraceIDRatioBased (conf .TracerSample )))
34- defer func () {
35- _ = tp .ForceFlush (ctx )
36- }()
51+ // Detect GCP resources (project, instance, etc.)
52+ res , err := resource .New (ctx ,
53+ resource .WithDetectors (gcp .NewDetector ()),
54+ resource .WithTelemetrySDK (),
55+ resource .WithAttributes (
56+ semconv .ServiceNameKey .String ("reearth-visualizer" ),
57+ ),
58+ )
59+ if err != nil {
60+ log .Warnf ("failed to detect GCP resources: %v, using default resource" , err )
61+ res , _ = resource .New (ctx ,
62+ resource .WithTelemetrySDK (),
63+ resource .WithAttributes (
64+ semconv .ServiceNameKey .String ("reearth-visualizer" ),
65+ ),
66+ )
67+ }
68+
69+ // Create tracer provider with batch span processor for better performance
70+ tp := sdktrace .NewTracerProvider (
71+ sdktrace .WithBatcher (exporter ),
72+ sdktrace .WithResource (res ),
73+ sdktrace .WithSampler (sdktrace .TraceIDRatioBased (conf .TracerSample )),
74+ )
3775
3876 otel .SetTracerProvider (tp )
3977
40- log .Infof ("tracer: initialized cloud trace with sample fraction: %g" , conf .TracerSample )
78+ log .Infof ("tracer: initialized GCP Cloud Trace (project=%s, sample=%g)" , conf .GCPProject , conf .TracerSample )
79+
80+ return & gcpTracerCloser {tp : tp }
4181}
4282
4383func initJaegerTracer (conf * config.Config ) io.Closer {
0 commit comments