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"
12- "github.com/julienschmidt/httprouter"
13- "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
12+ "github.com/gorilla/mux"
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 , _ httprouter.Params ) {
22- return func (w http.ResponseWriter , r * http.Request , _ httprouter.Params ) {
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 httprouter. Handle ) httprouter. Handle {
56- return func (w http.ResponseWriter , r * http.Request , p httprouter. Params ) {
57- ctx := core .ContextInject (r .Context (), httpnet .NewHTTPRequestExtractor (r , next ))
58- log .Printf ("HTTP request sent to %s from %v " , r .URL .Path , next )
59- next (w , r .WithContext (ctx ), p )
60- }
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 ))
28+ log .Printf ("HTTP request sent to %s" , r .URL .Path )
29+ h . ServeHTTP (w , r .WithContext (ctx ))
30+ })
6131}
6232
6333func runApp (todosController * todos.TodosController ) {
@@ -66,17 +36,25 @@ func runApp(todosController *todos.TodosController) {
6636 log .Fatal (err )
6737 }
6838
69- router := httprouter .New ()
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+ }()
7048
71- index := MakeIndexRoute ( todosController . DB )
72- router . GET ( "/" , middleware ( index ))
49+ r := mux . NewRouter ( )
50+ r . Use ( otelmux . Middleware ( "sqlcommenter sample-server" ))
7351
74- router . GET ("/todos" , middleware ( todosController .ActionList ))
75- router . POST ("/todos" , middleware ( todosController .ActionInsert ))
76- router . PUT ("/todos/:id " , middleware ( todosController .ActionUpdate ))
77- router . DELETE ("/todos/:id " , middleware ( todosController .ActionDelete ))
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" )
7856
79- http .ListenAndServe (":8081" , router )
57+ http .ListenAndServe (":8081" , middleware ( r ) )
8058}
8159
8260// host = “host.docker.internal”
@@ -97,6 +75,20 @@ func runForPg() *gosql.DB {
9775 return db
9876}
9977
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+
10092func main () {
10193 var engine string
10294
0 commit comments