1
1
package main
2
2
3
3
import (
4
+ "context"
4
5
"flag"
5
- "fmt"
6
6
"log"
7
7
"net/http"
8
8
9
9
"github.com/google/sqlcommenter/go/core"
10
10
gosql "github.com/google/sqlcommenter/go/database/sql"
11
11
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"
14
17
sdktrace "go.opentelemetry.io/otel/sdk/trace"
15
18
16
19
"sqlcommenter-http/mysqldb"
17
20
"sqlcommenter-http/pgdb"
18
21
"sqlcommenter-http/todos"
19
22
)
20
23
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
-
54
24
// 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
+ })
61
31
}
62
32
63
33
func runApp (todosController * todos.TodosController ) {
@@ -66,17 +36,25 @@ func runApp(todosController *todos.TodosController) {
66
36
log .Fatal (err )
67
37
}
68
38
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
+ }()
70
48
71
- index := MakeIndexRoute ( todosController . DB )
72
- router . GET ( "/" , middleware ( index ))
49
+ r := mux . NewRouter ( )
50
+ r . Use ( otelmux . Middleware ( "sqlcommenter sample-server" ))
73
51
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" )
78
56
79
- http .ListenAndServe (":8081" , router )
57
+ http .ListenAndServe (":8081" , middleware ( r ) )
80
58
}
81
59
82
60
// host = “host.docker.internal”
@@ -97,6 +75,20 @@ func runForPg() *gosql.DB {
97
75
return db
98
76
}
99
77
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
+
100
92
func main () {
101
93
var engine string
102
94
0 commit comments