1-
21// Copyright The OpenTelemetry Authors
32// SPDX-License-Identifier: Apache-2.0
43package main
@@ -15,12 +14,19 @@ import (
1514 "syscall"
1615 "time"
1716
17+ "go.opentelemetry.io/contrib/bridges/otelslog"
1818 "go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc"
1919 "go.opentelemetry.io/contrib/instrumentation/runtime"
2020 "go.opentelemetry.io/otel"
2121 "go.opentelemetry.io/otel/attribute"
2222 otelcodes "go.opentelemetry.io/otel/codes"
23+ "go.opentelemetry.io/otel/exporters/otlp/otlplog/otlploggrpc"
24+ "go.opentelemetry.io/otel/exporters/otlp/otlpmetric/otlpmetricgrpc"
25+ "go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc"
26+ "go.opentelemetry.io/otel/exporters/stdout/stdoutlog"
27+ "go.opentelemetry.io/otel/log/global"
2328 "go.opentelemetry.io/otel/propagation"
29+ sdklog "go.opentelemetry.io/otel/sdk/log"
2430 sdkmetric "go.opentelemetry.io/otel/sdk/metric"
2531 sdkresource "go.opentelemetry.io/otel/sdk/resource"
2632 sdktrace "go.opentelemetry.io/otel/sdk/trace"
@@ -56,12 +62,8 @@ const (
5662 CTX_QUERY_TIMEOUT = 10 * time .Second
5763)
5864
59- // Initialize slog with JSON handler for raw logs
6065func init () {
61- handler := slog .NewJSONHandler (os .Stdout , & slog.HandlerOptions {
62- Level : slog .LevelInfo ,
63- })
64- logger = slog .New (handler )
66+ logger = otelslog .NewLogger ("product-catalog" )
6567}
6668
6769func initResource () * sdkresource.Resource {
@@ -83,11 +85,12 @@ func initResource() *sdkresource.Resource {
8385
8486func initTracerProvider () * sdktrace.TracerProvider {
8587 ctx := context .Background ()
86- exporter , err := sdktrace . NewSimpleSpanProcessor ( nil ) // placeholder if OTLP exporter removed
88+ exporter , err := otlptracegrpc . New ( ctx )
8789 if err != nil {
88- logger .Error ("Failed to initialize tracer exporter" )
90+ logger .Error (fmt . Sprintf ( "OTLP Trace gRPC Creation: %v" , err ) )
8991 }
9092 tp := sdktrace .NewTracerProvider (
93+ sdktrace .WithBatcher (exporter ),
9194 sdktrace .WithResource (initResource ()),
9295 )
9396 otel .SetTracerProvider (tp )
@@ -96,13 +99,37 @@ func initTracerProvider() *sdktrace.TracerProvider {
9699}
97100
98101func initMeterProvider () * sdkmetric.MeterProvider {
102+ ctx := context .Background ()
103+ exporter , err := otlpmetricgrpc .New (ctx )
104+ if err != nil {
105+ logger .Error (fmt .Sprintf ("new otlp metric grpc exporter failed: %v" , err ))
106+ }
99107 mp := sdkmetric .NewMeterProvider (
108+ sdkmetric .WithReader (sdkmetric .NewPeriodicReader (exporter )),
100109 sdkmetric .WithResource (initResource ()),
101110 )
102111 otel .SetMeterProvider (mp )
103112 return mp
104113}
105114
115+ func initLoggerProvider () * sdklog.LoggerProvider {
116+ ctx := context .Background ()
117+ logExporter , err := otlploggrpc .New (ctx )
118+ if err != nil {
119+ return nil
120+ }
121+ consoleExporter , err := stdoutlog .New ()
122+ if err != nil {
123+ return nil
124+ }
125+ loggerProvider := sdklog .NewLoggerProvider (
126+ sdklog .WithProcessor (sdklog .NewBatchProcessor (logExporter )),
127+ sdklog .WithProcessor (sdklog .NewSimpleProcessor (consoleExporter )),
128+ )
129+ global .SetLoggerProvider (loggerProvider )
130+ return loggerProvider
131+ }
132+
106133func initPostgresConnectionPool () * pgxpool.Pool {
107134 var connStr string
108135 mustMapEnv (& connStr , "PRODUCT_CATALOG_DB_CONNECTION" )
@@ -124,26 +151,35 @@ func initPostgresConnectionPool() *pgxpool.Pool {
124151 return pool
125152}
126153
127- // Helper function to enrich logs with trace/span IDs as top-level fields
128154func logWithTrace (ctx context.Context , level slog.Level , msg string , attrs ... slog.Attr ) {
129155 span := trace .SpanFromContext (ctx )
130156 sc := span .SpanContext ()
157+
158+ // Add trace_id and span_id as top-level attributes
131159 attrs = append (attrs ,
132160 slog .String ("trace_id" , sc .TraceID ().String ()),
133161 slog .String ("span_id" , sc .SpanID ().String ()),
134162 )
163+
135164 logger .LogAttrs (ctx , level , msg , attrs ... )
136165}
137166
167+
138168func main () {
169+ lp := initLoggerProvider ()
170+ defer func () {
171+ if err := lp .Shutdown (context .Background ()); err != nil {
172+ logger .Error (fmt .Sprintf ("Logger Provider Shutdown: %v" , err ))
173+ }
174+ logger .Info ("Shutdown logger provider" )
175+ }()
139176 tp := initTracerProvider ()
140177 defer func () {
141178 if err := tp .Shutdown (context .Background ()); err != nil {
142179 logger .Error (fmt .Sprintf ("Tracer Provider Shutdown: %v" , err ))
143180 }
144181 logger .Info ("Shutdown tracer provider" )
145182 }()
146-
147183 mp := initMeterProvider ()
148184 defer func () {
149185 if err := mp .Shutdown (context .Background ()); err != nil {
@@ -331,4 +367,4 @@ func createClient(ctx context.Context, svcAddr string) (*grpc.ClientConn, error)
331367 grpc .WithTransportCredentials (insecure .NewCredentials ()),
332368 grpc .WithStatsHandler (otelgrpc .NewClientHandler ()),
333369 )
334- }
370+ }
0 commit comments