Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 8 additions & 0 deletions go/samples/http/curls/update_with_traceparent.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
# usage: update_with_traceparent.sh <id> <task>

curl --header "Content-Type: application/json" \
--header "Traceparent: 00-a7586e0a5bc7934ce028e83bc1d247f2-6b94506168fc7803-01" \
--request PUT \
--data '{"task":"'$2'"}' \
http://localhost:8081/todos/$1
echo
16 changes: 11 additions & 5 deletions go/samples/http/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,20 @@ go 1.19

require (
github.com/go-sql-driver/mysql v1.6.0
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.10.0
go.opentelemetry.io/otel/sdk v1.10.0
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.1
go.opentelemetry.io/otel/sdk v1.11.1
)

require (
github.com/julienschmidt/httprouter v1.3.0
github.com/felixge/httpsnoop v1.0.3 // indirect
github.com/gorilla/mux v1.8.0
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.36.4
)

require (
github.com/julienschmidt/httprouter v1.3.0
github.com/lib/pq v1.10.7
go.opentelemetry.io/otel v1.10.0 // indirect
go.opentelemetry.io/otel v1.11.1
)

require (
Expand All @@ -20,6 +26,6 @@ require (
github.com/google/sqlcommenter/go/core v0.0.1-beta
github.com/google/sqlcommenter/go/database/sql v0.0.1-beta
github.com/google/sqlcommenter/go/net/http v0.0.1-beta
go.opentelemetry.io/otel/trace v1.10.0 // indirect
go.opentelemetry.io/otel/trace v1.11.1 // indirect
golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6 // indirect
)
15 changes: 15 additions & 0 deletions go/samples/http/go.sum
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
github.com/DATA-DOG/go-sqlmock v1.5.0 h1:Shsta01QNfFxHCfpW6YH2STWB0MudeXXEWMr20OEh60=
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
github.com/felixge/httpsnoop v1.0.3 h1:s/nj+GCswXYzN5v2DpNMuMQYe+0DDwt5WVCU6CWBdXk=
github.com/felixge/httpsnoop v1.0.3/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
Expand All @@ -8,26 +10,39 @@ github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre
github.com/go-sql-driver/mysql v1.6.0 h1:BCTh4TKNUYmOmMUcQ3IipzF5prigylS7XXjEkfCHuOE=
github.com/go-sql-driver/mysql v1.6.0/go.mod h1:DCzpHaOWr8IXmIStZouvnhqoel9Qv2LBy8hT2VhHyBg=
github.com/google/go-cmp v0.5.8 h1:e6P7q2lk1O+qJJb4BtCQXlK8vWEO8V1ZeuEdJNOqZyg=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/sqlcommenter/go/core v0.0.1-beta h1:IVszEHanWVeS7UcmP8C3SHa57CmfeqMBj0QUcJ8VZ9Q=
github.com/google/sqlcommenter/go/core v0.0.1-beta/go.mod h1:CZfcqmbIxngExnZ7Se6AsKNVubZhKyi54aeDJZiqTMQ=
github.com/google/sqlcommenter/go/database/sql v0.0.1-beta h1:N680pEYaRwmOSrQWUd4A4aD4kj4WYxcJTQB9WLe69vY=
github.com/google/sqlcommenter/go/database/sql v0.0.1-beta/go.mod h1:VdswmF4SM0cbjJdD+3GyM5QuXpHhH6F5nSzcbikzCGY=
github.com/google/sqlcommenter/go/net/http v0.0.1-beta h1:7XQ6poZv+ZJwwHWQHlesq9IMsRus3G6Z9n10qAkrGqE=
github.com/google/sqlcommenter/go/net/http v0.0.1-beta/go.mod h1:tVUqM1YZ/K3eRTdGzeav1GSbw+BXNdTGzSAbLW9CxAc=
github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI=
github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So=
github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.36.4 h1:gn5Cf5XpnENThRBjAHq6vuENFo+l9qwnEMqwmanIYuY=
go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux v0.36.4/go.mod h1:f26RulijcxdgrGSYep0AykXM9ZkWoKVtInstDYUR8EU=
go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4=
go.opentelemetry.io/otel v1.10.0/go.mod h1:NbvWjCthWHKBEUMpf0/v8ZRZlni86PpGFEMA9pnQSnQ=
go.opentelemetry.io/otel v1.11.1 h1:4WLLAmcfkmDk2ukNXJyq3/kiz/3UzCaYq6PskJsaou4=
go.opentelemetry.io/otel v1.11.1/go.mod h1:1nNhXBbWSD0nsL38H6btgnFN2k4i0sNLHNNMZMSbUGE=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.10.0 h1:c9UtMu/qnbLlVwTwt+ABrURrioEruapIslTDYZHJe2w=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.10.0/go.mod h1:h3Lrh9t3Dnqp3NPwAZx7i37UFX7xrfnO1D+fuClREOA=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.1 h1:3Yvzs7lgOw8MmbxmLRsQGwYdCubFmUHSooKaEhQunFQ=
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.11.1/go.mod h1:pyHDt0YlyuENkD2VwHsiRDf+5DfI3EH7pfhUYW6sQUE=
go.opentelemetry.io/otel/sdk v1.10.0 h1:jZ6K7sVn04kk/3DNUdJ4mqRlGDiXAVuIG+MMENpTNdY=
go.opentelemetry.io/otel/sdk v1.10.0/go.mod h1:vO06iKzD5baltJz1zarxMCNHFpUlUiOy4s65ECtn6kE=
go.opentelemetry.io/otel/sdk v1.11.1 h1:F7KmQgoHljhUuJyA+9BiU+EkJfyX5nVVF4wyzWZpKxs=
go.opentelemetry.io/otel/sdk v1.11.1/go.mod h1:/l3FE4SupHJ12TduVjUkZtlfFqDCQJlOlithYrdktys=
go.opentelemetry.io/otel/trace v1.10.0 h1:npQMbR8o7mum8uF95yFbOEJffhs1sbCOfDh8zAJiH5E=
go.opentelemetry.io/otel/trace v1.10.0/go.mod h1:Sij3YYczqAdz+EhmGhE6TpTxUO5/F/AzrK+kxfGqySM=
go.opentelemetry.io/otel/trace v1.11.1 h1:ofxdnzsNrGBYXbP7t7zpUK281+go5rF7dvdIZXF8gdQ=
go.opentelemetry.io/otel/trace v1.11.1/go.mod h1:f/Q9G7vzk5u91PhbmKbg1Qn0rzH1LJ4vbPHFGkTPtOk=
golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6 h1:cy1ko5847T/lJ45eyg/7uLprIE/amW5IXxGtEnQdYMI=
golang.org/x/sys v0.0.0-20220927170352-d9d178bc13c6/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
92 changes: 42 additions & 50 deletions go/samples/http/main.go
Original file line number Diff line number Diff line change
@@ -1,63 +1,33 @@
package main

import (
"context"
"flag"
"fmt"
"log"
"net/http"

"github.com/google/sqlcommenter/go/core"
gosql "github.com/google/sqlcommenter/go/database/sql"
httpnet "github.com/google/sqlcommenter/go/net/http"
"github.com/julienschmidt/httprouter"
"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
"github.com/gorilla/mux"
"go.opentelemetry.io/contrib/instrumentation/github.com/gorilla/mux/otelmux"
"go.opentelemetry.io/otel"
stdout "go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
"go.opentelemetry.io/otel/propagation"
sdktrace "go.opentelemetry.io/otel/sdk/trace"

"sqlcommenter-http/mysqldb"
"sqlcommenter-http/pgdb"
"sqlcommenter-http/todos"
)

func MakeIndexRoute(db *gosql.DB) func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
return func(w http.ResponseWriter, r *http.Request, _ httprouter.Params) {
exp, _ := stdouttrace.New(stdouttrace.WithPrettyPrint())
bsp := sdktrace.NewSimpleSpanProcessor(exp) // You should use batch span processor in prod
tp := sdktrace.NewTracerProvider(
sdktrace.WithSampler(sdktrace.AlwaysSample()),
sdktrace.WithSpanProcessor(bsp),
)

ctx, span := tp.Tracer("foo").Start(r.Context(), "parent-span-name")
defer span.End()

db.ExecContext(ctx, "Select 1")
db.Exec("Select 2")

stmt1, err := db.Prepare("Select 3")
if err != nil {
log.Fatal(err)
}
stmt1.QueryRow()

stmt2, err := db.PrepareContext(ctx, "Select 4")
if err != nil {
log.Fatal(err)
}
stmt2.QueryRow()

db.QueryContext(ctx, "Select 5")

fmt.Fprintf(w, "Hello World!\r\n")
}
}

// middleware is used to intercept incoming HTTP calls and apply general functions upon them.
func middleware(next httprouter.Handle) httprouter.Handle {
return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
ctx := core.ContextInject(r.Context(), httpnet.NewHTTPRequestExtractor(r, next))
log.Printf("HTTP request sent to %s from %v", r.URL.Path, next)
next(w, r.WithContext(ctx), p)
}
func middleware(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
ctx := core.ContextInject(r.Context(), httpnet.NewHTTPRequestExtractor(r, h))
log.Printf("HTTP request sent to %s", r.URL.Path)
h.ServeHTTP(w, r.WithContext(ctx))
})
}

func runApp(todosController *todos.TodosController) {
Expand All @@ -66,17 +36,25 @@ func runApp(todosController *todos.TodosController) {
log.Fatal(err)
}

router := httprouter.New()
tp, err := initTracer()
if err != nil {
log.Fatal(err)
}
defer func() {
if err := tp.Shutdown(context.Background()); err != nil {
log.Printf("Error shutting down tracer provider: %v", err)
}
}()

index := MakeIndexRoute(todosController.DB)
router.GET("/", middleware(index))
r := mux.NewRouter()
r.Use(otelmux.Middleware("sqlcommenter sample-server"))

router.GET("/todos", middleware(todosController.ActionList))
router.POST("/todos", middleware(todosController.ActionInsert))
router.PUT("/todos/:id", middleware(todosController.ActionUpdate))
router.DELETE("/todos/:id", middleware(todosController.ActionDelete))
r.HandleFunc("/todos", todosController.ActionList).Methods("GET")
r.HandleFunc("/todos", todosController.ActionInsert).Methods("POST")
r.HandleFunc("/todos/{id}", todosController.ActionUpdate).Methods("PUT")
r.HandleFunc("/todos/{id}", todosController.ActionDelete).Methods("DELETE")

http.ListenAndServe(":8081", router)
http.ListenAndServe(":8081", middleware(r))
}

// host = “host.docker.internal”
Expand All @@ -97,6 +75,20 @@ func runForPg() *gosql.DB {
return db
}

func initTracer() (*sdktrace.TracerProvider, error) {
exporter, err := stdout.New(stdout.WithPrettyPrint())
if err != nil {
return nil, err
}
tp := sdktrace.NewTracerProvider(
sdktrace.WithSampler(sdktrace.AlwaysSample()),
sdktrace.WithBatcher(exporter),
)
otel.SetTracerProvider(tp)
otel.SetTextMapPropagator(propagation.NewCompositeTextMapPropagator(propagation.TraceContext{}, propagation.Baggage{}))
return tp, nil
}

func main() {
var engine string

Expand Down
16 changes: 9 additions & 7 deletions go/samples/http/todos/controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import (
"net/http"

gosql "github.com/google/sqlcommenter/go/database/sql"
"github.com/julienschmidt/httprouter"
"github.com/gorilla/mux"
)

type Todo struct {
Expand All @@ -31,7 +31,7 @@ func (c *TodosController) CreateTodosTableIfNotExists() error {
return err
}

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

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

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

var dto TodoDTO
Expand Down Expand Up @@ -149,9 +149,10 @@ func (c *TodosController) insertTodoMySQL(ctx context.Context, w http.ResponseWr
}
}

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

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

func (c *TodosController) ActionDelete(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
func (c *TodosController) ActionDelete(w http.ResponseWriter, r *http.Request) {
ctx := r.Context()
id := p.ByName("id")
vars := mux.Vars(r)
id := vars["id"]

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