Skip to content

Commit 1d2bee9

Browse files
authored
Merge pull request #171 from google/go_samples/http
working go samples/http
2 parents d7e4758 + 172341c commit 1d2bee9

15 files changed

Lines changed: 569 additions & 29 deletions

File tree

go/samples/http/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
sqlcommenter-http
2+
docker-data/

go/samples/http/curls/delete.sh

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# usage: delete.sh <id>
2+
3+
curl --header "Content-Type: application/json" \
4+
--request DELETE \
5+
http://localhost:8080/todos/$1
6+
echo

go/samples/http/curls/index.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# usage: index.sh
2+
3+
curl http://localhost:8080
4+
echo

go/samples/http/curls/insert.sh

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
# usage: insert.sh <task>
2+
3+
curl --header "Content-Type: application/json" \
4+
--request POST \
5+
--data '{"task":"'$1'"}' \
6+
http://localhost:8080/todos
7+
echo

go/samples/http/curls/list.sh

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
# usage: list.sh
2+
3+
curl http://localhost:8080/todos?search=$1
4+
echo

go/samples/http/curls/update.sh

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

go/samples/http/docker-compose.yml

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
version: '3.8'
2+
services:
3+
sqlcommenter_mysql_db:
4+
container_name: sqlcommenter_mysql_db
5+
image: mysql:8
6+
command:
7+
--general-log=TRUE
8+
--general-log-file=/var/lib/mysql/mysql-log.log
9+
ports:
10+
- '3306:3306'
11+
environment:
12+
MYSQL_DATABASE: 'sqlcommenter_db'
13+
MYSQL_ROOT_PASSWORD: 'password'
14+
volumes:
15+
- './docker-data/mysql:/var/lib/postgresql/data'
16+
sqlcommenter_pg_db:
17+
container_name: sqlcommenter_pg_db
18+
image: postgres:14
19+
command: postgres -c log_statement=all
20+
ports:
21+
- '5432:5432'
22+
environment:
23+
POSTGRES_USER: dev
24+
POSTGRES_PASSWORD: dev
25+
POSTGRES_DB: sqlcommenter_db
26+
volumes:
27+
- './docker-data/pg:/var/lib/postgresql/data'

go/samples/http/go.mod

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,11 @@ require (
88
go.opentelemetry.io/otel/sdk v1.10.0
99
)
1010

11-
require go.opentelemetry.io/otel v1.10.0 // indirect
11+
require (
12+
github.com/julienschmidt/httprouter v1.3.0
13+
github.com/lib/pq v1.10.7
14+
go.opentelemetry.io/otel v1.10.0 // indirect
15+
)
1216

1317
require (
1418
github.com/go-logr/logr v1.2.3 // indirect

go/samples/http/go.sum

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,10 @@ github.com/google/sqlcommenter/go/database/sql v0.0.1-beta h1:N680pEYaRwmOSrQWUd
1414
github.com/google/sqlcommenter/go/database/sql v0.0.1-beta/go.mod h1:VdswmF4SM0cbjJdD+3GyM5QuXpHhH6F5nSzcbikzCGY=
1515
github.com/google/sqlcommenter/go/net/http v0.0.1-beta h1:7XQ6poZv+ZJwwHWQHlesq9IMsRus3G6Z9n10qAkrGqE=
1616
github.com/google/sqlcommenter/go/net/http v0.0.1-beta/go.mod h1:tVUqM1YZ/K3eRTdGzeav1GSbw+BXNdTGzSAbLW9CxAc=
17+
github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U=
18+
github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=
19+
github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw=
20+
github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o=
1721
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
1822
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
1923
go.opentelemetry.io/otel v1.10.0 h1:Y7DTJMR6zs1xkS/upamJYk0SxxN4C9AqRd77jmZnyY4=

go/samples/http/main.go

Lines changed: 91 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,55 +1,118 @@
11
package main
22

33
import (
4+
"flag"
45
"fmt"
56
"log"
67
"net/http"
78

8-
_ "github.com/go-sql-driver/mysql"
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"
1213
"go.opentelemetry.io/otel/exporters/stdout/stdouttrace"
1314
sdktrace "go.opentelemetry.io/otel/sdk/trace"
15+
16+
"sqlcommenter-http/mysqldb"
17+
"sqlcommenter-http/pgdb"
18+
"sqlcommenter-http/todos"
1419
)
1520

16-
func Index(w http.ResponseWriter, r *http.Request) {
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+
)
1729

18-
connection := "root:root@/gotest"
19-
exp, _ := stdouttrace.New(stdouttrace.WithPrettyPrint())
20-
bsp := sdktrace.NewSimpleSpanProcessor(exp) // You should use batch span processor in prod
21-
tp := sdktrace.NewTracerProvider(
22-
sdktrace.WithSampler(sdktrace.AlwaysSample()),
23-
sdktrace.WithSpanProcessor(bsp),
24-
)
30+
ctx, span := tp.Tracer("foo").Start(r.Context(), "parent-span-name")
31+
defer span.End()
2532

26-
ctx, span := tp.Tracer("foo").Start(r.Context(), "parent-span-name")
27-
defer span.End()
33+
db.ExecContext(ctx, "Select 1")
34+
db.Exec("Select 2")
2835

29-
db, err := gosql.Open("mysql", connection, core.CommenterOptions{EnableDBDriver: true, EnableRoute: true, EnableAction: true, EnableFramework: true, EnableTraceparent: true})
30-
if err != nil {
31-
fmt.Println(err)
32-
} else {
33-
db.ExecContext(ctx, "Select 11;")
34-
db.Exec("Select 2;")
35-
db.Prepare("Select 10")
36-
db.PrepareContext(ctx, "Select 10")
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")
3751
}
38-
fmt.Fprintf(w, "Hello World!")
3952
}
4053

4154
// middleware is used to intercept incoming HTTP calls and apply general functions upon them.
42-
func middleware(next http.Handler) http.Handler {
43-
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
55+
func middleware(next httprouter.Handle) httprouter.Handle {
56+
return func(w http.ResponseWriter, r *http.Request, p httprouter.Params) {
4457
ctx := core.ContextInject(r.Context(), httpnet.NewHTTPRequestExtractor(r, next))
4558
log.Printf("HTTP request sent to %s from %v", r.URL.Path, next)
46-
next.ServeHTTP(w, r.WithContext(ctx))
47-
})
59+
next(w, r.WithContext(ctx), p)
60+
}
61+
}
62+
63+
func runApp(todosController *todos.TodosController) {
64+
err := todosController.CreateTodosTableIfNotExists()
65+
if err != nil {
66+
log.Fatal(err)
67+
}
68+
69+
router := httprouter.New()
70+
71+
index := MakeIndexRoute(todosController.DB)
72+
router.GET("/", middleware(index))
73+
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))
78+
79+
http.ListenAndServe(":8080", router)
80+
}
81+
82+
func runForMysql() *gosql.DB {
83+
connection := "root:password@/sqlcommenter_db"
84+
db := mysqldb.ConnectMySQL(connection)
85+
todosController := &todos.TodosController{Engine: "mysql", DB: db, SQL: todos.MySQLQueries{}}
86+
runApp(todosController)
87+
return db
88+
}
89+
90+
func runForPg() *gosql.DB {
91+
connection := "postgres://dev:dev@localhost/sqlcommenter_db?sslmode=disable"
92+
db := pgdb.ConnectPG(connection)
93+
todosController := &todos.TodosController{Engine: "pg", DB: db, SQL: todos.PGQueries{}}
94+
runApp(todosController)
95+
return db
4896
}
4997

5098
func main() {
51-
mux := http.NewServeMux()
52-
finalHandler := http.HandlerFunc(Index)
53-
mux.Handle("/", middleware((finalHandler)))
54-
log.Fatal(http.ListenAndServe(":8080", mux))
99+
var engine string
100+
101+
flag.StringVar(&engine, "db_engine", "mysql", "db-engine to run the sample application on")
102+
flag.Parse()
103+
104+
if engine != "mysql" && engine != "pg" {
105+
log.Fatalf("invalid engine: %s", engine)
106+
}
107+
108+
var db *gosql.DB
109+
110+
switch engine {
111+
case "mysql":
112+
db = runForMysql()
113+
case "pg":
114+
db = runForPg()
115+
}
116+
117+
db.Close()
55118
}

0 commit comments

Comments
 (0)