11package main
22
33import (
4+ "context"
45 "flag"
5- "fmt"
66 "log"
77 "net/http"
88
99 "github.com/google/sqlcommenter/go/core"
1010 gosql "github.com/google/sqlcommenter/go/database/sql"
1111 httpnet "github.com/google/sqlcommenter/go/net/http"
1212 "github.com/gorilla/mux"
13- "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
13+ "go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux"
14+ "go.opentelemetry.io/otel"
15+ stdout "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
16+ "go.opentelemetry.io/otel/propagation"
1417 sdktrace "go.opentelemetry.io/otel/sdk/trace"
1518
1619 "sqlcommenter-http/mysqldb"
1720 "sqlcommenter-http/pgdb"
1821 "sqlcommenter-http/todos"
1922)
2023
21- func MakeIndexRoute (db * gosql.DB ) func (w http.ResponseWriter , r * http.Request ) {
22- return func (w http.ResponseWriter , r * http.Request ) {
23- exp , _ := stdouttrace .New (stdouttrace .WithPrettyPrint ())
24- bsp := sdktrace .NewSimpleSpanProcessor (exp ) // You should use batch span processor in prod
25- tp := sdktrace .NewTracerProvider (
26- sdktrace .WithSampler (sdktrace .AlwaysSample ()),
27- sdktrace .WithSpanProcessor (bsp ),
28- )
29-
30- ctx , span := tp .Tracer ("foo" ).Start (r .Context (), "parent-span-name" )
31- defer span .End ()
32-
33- db .ExecContext (ctx , "Select 1" )
34- db .Exec ("Select 2" )
35-
36- stmt1 , err := db .Prepare ("Select 3" )
37- if err != nil {
38- log .Fatal (err )
39- }
40- stmt1 .QueryRow ()
41-
42- stmt2 , err := db .PrepareContext (ctx , "Select 4" )
43- if err != nil {
44- log .Fatal (err )
45- }
46- stmt2 .QueryRow ()
47-
48- db .QueryContext (ctx , "Select 5" )
49-
50- fmt .Fprintf (w , "Hello World!\r \n " )
51- }
52- }
53-
5424// middleware is used to intercept incoming HTTP calls and apply general functions upon them.
55- func middleware (next func ( http.ResponseWriter , * http. Request )) func ( w http.ResponseWriter , r * http. Request ) {
56- return func (w http.ResponseWriter , r * http.Request ) {
57- ctx := core .ContextInject (r .Context (), httpnet .NewHTTPRequestExtractor (r , next ))
25+ func middleware (h http.Handler ) http.Handler {
26+ return http . HandlerFunc ( func (w http.ResponseWriter , r * http.Request ) {
27+ ctx := core .ContextInject (r .Context (), httpnet .NewHTTPRequestExtractor (r , h ))
5828 log .Printf ("HTTP request sent to %s" , r .URL .Path )
59- next (w , r .WithContext (ctx ))
60- }
29+ h . ServeHTTP (w , r .WithContext (ctx ))
30+ })
6131}
6232
6333func runApp (todosController * todos.TodosController ) {
@@ -66,16 +36,25 @@ func runApp(todosController *todos.TodosController) {
6636 log .Fatal (err )
6737 }
6838
39+ tp , err := initTracer ()
40+ if err != nil {
41+ log .Fatal (err )
42+ }
43+ defer func () {
44+ if err := tp .Shutdown (context .Background ()); err != nil {
45+ log .Printf ("Error shutting down tracer provider: %v" , err )
46+ }
47+ }()
48+
6949 r := mux .NewRouter ()
50+ r .Use (otelmux .Middleware ("sqlcommenter sample-server" ))
7051
71- index := MakeIndexRoute (todosController .DB )
72- r .HandleFunc ("/" , middleware (index )).Methods ("GET" )
73- r .HandleFunc ("/todos" , middleware (todosController .ActionList )).Methods ("GET" )
74- r .HandleFunc ("/todos" , middleware (todosController .ActionInsert )).Methods ("POST" )
75- r .HandleFunc ("/todos/{id}" , middleware (todosController .ActionUpdate )).Methods ("PUT" )
76- r .HandleFunc ("/todos/{id}" , middleware (todosController .ActionDelete )).Methods ("DELETE" )
52+ r .HandleFunc ("/todos" , todosController .ActionList ).Methods ("GET" )
53+ r .HandleFunc ("/todos" , todosController .ActionInsert ).Methods ("POST" )
54+ r .HandleFunc ("/todos/{id}" , todosController .ActionUpdate ).Methods ("PUT" )
55+ r .HandleFunc ("/todos/{id}" , todosController .ActionDelete ).Methods ("DELETE" )
7756
78- http .ListenAndServe (":8081" , r )
57+ http .ListenAndServe (":8081" , middleware ( r ) )
7958}
8059
8160// host = “host.docker.internal”
@@ -96,6 +75,20 @@ func runForPg() *gosql.DB {
9675 return db
9776}
9877
78+ func initTracer () (* sdktrace.TracerProvider , error ) {
79+ exporter , err := stdout .New (stdout .WithPrettyPrint ())
80+ if err != nil {
81+ return nil , err
82+ }
83+ tp := sdktrace .NewTracerProvider (
84+ sdktrace .WithSampler (sdktrace .AlwaysSample ()),
85+ sdktrace .WithBatcher (exporter ),
86+ )
87+ otel .SetTracerProvider (tp )
88+ otel .SetTextMapPropagator (propagation .NewCompositeTextMapPropagator (propagation.TraceContext {}, propagation.Baggage {}))
89+ return tp , nil
90+ }
91+
9992func main () {
10093 var engine string
10194
0 commit comments