Skip to content

Commit 5359d8c

Browse files
committed
traceparent functionality working example
1 parent 12bbed0 commit 5359d8c

3 files changed

Lines changed: 51 additions & 50 deletions

File tree

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# usage: update.sh <id> <task>
2+
3+
curl --header "Content-Type: application/json" \
4+
--header "Traceparent: 00-a7586e0a5bc7934ce028e83bc1d247f2-6b94506168fc7803-01" \
5+
--request PUT \
6+
--data '{"task":"'$2'"}' \
7+
http://localhost:8081/todos/$1
8+
echo

go/samples/http/go.mod

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,14 +10,14 @@ require (
1010

1111
require (
1212
github.com/felixge/httpsnoop v1.0.3 // indirect
13-
github.com/gorilla/mux v1.8.0 // indirect
14-
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.36.4 // indirect
13+
github.com/gorilla/mux v1.8.0
14+
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.36.4
1515
)
1616

1717
require (
1818
github.com/julienschmidt/httprouter v1.3.0
1919
github.com/lib/pq v1.10.7
20-
go.opentelemetry.io/otel v1.11.1 // indirect
20+
go.opentelemetry.io/otel v1.11.1
2121
)
2222

2323
require (

go/samples/http/main.go

Lines changed: 40 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,63 +1,33 @@
11
package main
22

33
import (
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

6333
func 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+
9992
func main() {
10093
var engine string
10194

0 commit comments

Comments
 (0)