Skip to content

Commit d35d54f

Browse files
authored
Merge pull request #181 from google/go/samples/traceparent
Go/samples/traceparent
2 parents 4585046 + b077be0 commit d35d54f

File tree

5 files changed

+85
-62
lines changed

5 files changed

+85
-62
lines changed
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
# usage: update_with_traceparent.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: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,14 +4,20 @@ go 1.19
44

55
require (
66
github.com/go-sql-driver/mysql v1.6.0
7-
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.10.0
8-
go.opentelemetry.io/otel/sdk v1.10.0
7+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.1
8+
go.opentelemetry.io/otel/sdk v1.11.1
99
)
1010

1111
require (
12-
github.com/julienschmidt/httprouter v1.3.0
12+
github.com/felixge/httpsnoop v1.0.3 // indirect
13+
github.com/gorilla/mux v1.8.0
14+
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.36.4
15+
)
16+
17+
require (
18+
github.com/julienschmidt/httprouter v1.3.0
1319
github.com/lib/pq v1.10.7
14-
go.opentelemetry.io/otel v1.10.0 // indirect
20+
go.opentelemetry.io/otel v1.11.1
1521
)
1622

1723
require (
@@ -20,6 +26,6 @@ require (
2026
github.com/google/sqlcommenter/go/core v0.0.1-beta
2127
github.com/google/sqlcommenter/go/database/sql v0.0.1-beta
2228
github.com/google/sqlcommenter/go/net/http v0.0.1-beta
23-
go.opentelemetry.io/otel/trace v1.10.0 // indirect
29+
go.opentelemetry.io/otel/trace v1.11.1 // indirect
2430
golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6 // indirect
2531
)

go/samples/http/go.sum

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
22
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
3+
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
4+
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
35
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
46
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
57
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
@@ -8,26 +10,39 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre
810
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
911
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
1012
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
13+
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
1114
github.com/google/sqlcommenter/go/core v0.0.1-beta h1:IVszEHanWVeS7UcmP8C3SHa57CmfeqMBj0QUcJ8VZ9Q=
1215
github.com/google/sqlcommenter/go/core v0.0.1-beta/go.mod h1:CZfcqmbIxngExnZ7Se6AsKNVubZhKyi54aeDJZiqTMQ=
1316
github.com/google/sqlcommenter/go/database/sql v0.0.1-beta h1:N680pEYaRwmOSrQWUd4A4aD4kj4WYxcJTQB9WLe69vY=
1417
github.com/google/sqlcommenter/go/database/sql v0.0.1-beta/go.mod h1:VdswmF4SM0cbjJdD+3GyM5QuXpHhH6F5nSzcbikzCGY=
1518
github.com/google/sqlcommenter/go/net/http v0.0.1-beta h1:7XQ6poZv+ZJwwHWQHlesq9IMsRus3G6Z9n10qAkrGqE=
1619
github.com/google/sqlcommenter/go/net/http v0.0.1-beta/go.mod h1:tVUqM1YZ/K3eRTdGzeav1GSbw+BXNdTGzSAbLW9CxAc=
20+
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
21+
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
1722
github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=
1823
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
1924
github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
2025
github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
2126
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
2227
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
28+
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.36.4 h1:gn5Cf5XpnENThRBjAHq6vuENFo+l9qwnEMqwmanIYuY=
29+
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.36.4/go.mod h1:f26RulijcxdgrGSYep0AykXM9ZkWoKVtInstDYUR8EU=
2330
go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4=
2431
go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ=
32+
go.opentelemetry.io/otel v1.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4=
33+
go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE=
2534
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.10.0 h1:c9UtMu/qnbLlVwTwt+ABrURrioEruapIslTDYZHJe2w=
2635
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.10.0/go.mod h1:h3Lrh9t3Dnqp3NPwAZx7i37UFX7xrfnO1D+fuClREOA=
36+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.1 h1:3Yvzs7lgOw8MmbxmLRsQGwYdCubFmUHSooKaEhQunFQ=
37+
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.1/go.mod h1:pyHDt0YlyuENkD2VwHsiRDf+5DfI3EH7pfhUYW6sQUE=
2738
go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY=
2839
go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE=
40+
go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs=
41+
go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys=
2942
go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E=
3043
go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM=
44+
go.opentelemetry.io/otel/trace v1.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ=
45+
go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk=
3146
golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6 h1:cy1ko5847T/lJ45eyg/7uLprIE/amW5IXxGtEnQdYMI=
3247
golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
3348
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=

go/samples/http/main.go

Lines changed: 42 additions & 50 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"
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

6333
func 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+
10092
func main() {
10193
var engine string
10294

go/samples/http/todos/controller.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ import (
88
"net/http"
99

1010
gosql "github.com/google/sqlcommenter/go/database/sql"
11-
"github.com/julienschmidt/httprouter"
11+
"github.com/gorilla/mux"
1212
)
1313

1414
type Todo struct {
@@ -31,7 +31,7 @@ func (c *TodosController) CreateTodosTableIfNotExists() error {
3131
return err
3232
}
3333

34-
func (c *TodosController) ActionList(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
34+
func (c *TodosController) ActionList(w http.ResponseWriter, r *http.Request) {
3535
ctx := r.Context()
3636

3737
query := r.URL.Query()
@@ -62,7 +62,7 @@ func (c *TodosController) ActionList(w http.ResponseWriter, r *http.Request, p h
6262
writeJsonResponse(w, res)
6363
}
6464

65-
func (c *TodosController) ActionInsert(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
65+
func (c *TodosController) ActionInsert(w http.ResponseWriter, r *http.Request) {
6666
ctx := r.Context()
6767

6868
var dto TodoDTO
@@ -149,9 +149,10 @@ func (c *TodosController) insertTodoMySQL(ctx context.Context, w http.ResponseWr
149149
}
150150
}
151151

152-
func (c *TodosController) ActionUpdate(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
152+
func (c *TodosController) ActionUpdate(w http.ResponseWriter, r *http.Request) {
153153
ctx := r.Context()
154-
id := p.ByName("id")
154+
vars := mux.Vars(r)
155+
id := vars["id"]
155156

156157
var dto TodoDTO
157158
err := json.NewDecoder(r.Body).Decode(&dto)
@@ -194,9 +195,10 @@ func (c *TodosController) ActionUpdate(w http.ResponseWriter, r *http.Request, p
194195
writeJsonResponse(w, res)
195196
}
196197

197-
func (c *TodosController) ActionDelete(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
198+
func (c *TodosController) ActionDelete(w http.ResponseWriter, r *http.Request) {
198199
ctx := r.Context()
199-
id := p.ByName("id")
200+
vars := mux.Vars(r)
201+
id := vars["id"]
200202

201203
var todo Todo
202204
rows, err := c.DB.QueryContext(ctx, c.SQL.TodoById(), id)

0 commit comments

Comments
 (0)