Skip to content
This repository was archived by the owner on Dec 5, 2023. It is now read-only.

Commit 8f5de66

Browse files
author
embs
committed
Enrich Zipkin db tracing
Add info regarding - database type and address - approximation for queries results size
1 parent 9de2c86 commit 8f5de66

File tree

9 files changed

+203
-57
lines changed

9 files changed

+203
-57
lines changed

cmd/cataloguesvc/main.go

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,10 @@ func main() {
106106
}
107107

108108
// Data domain.
109-
db, err := sqlx.Open("mysql", *dsn)
109+
var db catalogue.Database
110+
sqlxdb, err := sqlx.Open("mysql", *dsn)
111+
db = &catalogue.SqlxDb{Db: sqlxdb}
112+
db = catalogue.DbTracingMiddleware()(db)
110113
if err != nil {
111114
logger.Log("err", err)
112115
os.Exit(1)

db.go

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package catalogue
2+
3+
import(
4+
"context"
5+
"database/sql"
6+
7+
"github.com/jmoiron/sqlx"
8+
)
9+
10+
type Database interface {
11+
Close() error
12+
Ping() error
13+
Select(ctx context.Context, dest interface{}, query string, args ...interface{}) error
14+
//Prepare(query string) (*sql.Stmt, error)
15+
Prepare(query string) (StmtMiddleware, error)
16+
Get(ctx context.Context, dest interface{}, query string, args ...interface{}) error
17+
Query(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
18+
}
19+
20+
// SqlxDb meets the Database interface requirements
21+
type SqlxDb struct {
22+
// db is a reference for the underlying database implementation
23+
Db *sqlx.DB
24+
}
25+
26+
func (sqlxdb *SqlxDb) Close() error {
27+
return sqlxdb.Db.Close()
28+
}
29+
30+
func (sqlxdb *SqlxDb) Ping() error {
31+
return sqlxdb.Db.Ping()
32+
}
33+
34+
func (sqlxdb *SqlxDb) Select(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
35+
return sqlxdb.Db.Select(dest, query, args...)
36+
}
37+
38+
//func (sqlxdb *SqlxDb) Prepare(query string) (*sql.Stmt, error) {
39+
func (sqlxdb *SqlxDb) Prepare(query string) (StmtMiddleware, error) {
40+
sel, err := sqlxdb.Db.Prepare(query)
41+
return StmtMiddleware{next: sel}, err
42+
}
43+
44+
func (sqlxdb *SqlxDb) Get(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
45+
return sqlxdb.Db.Get(dest, query, args...)
46+
}
47+
48+
func (sqlxdb *SqlxDb) Query(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) {
49+
return sqlxdb.Db.Query(query, args...)
50+
}

db_tracing_middleware.go

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,87 @@
1+
package catalogue
2+
3+
import (
4+
"context"
5+
"database/sql"
6+
"unsafe"
7+
8+
stdopentracing "github.com/opentracing/opentracing-go"
9+
)
10+
11+
// Middleware decorates a database.
12+
type DbMiddleware func(Database) Database
13+
14+
// DbTracingMiddleware traces database calls.
15+
func DbTracingMiddleware() DbMiddleware {
16+
return func(next Database) Database {
17+
return dbTracingMiddleware{
18+
next: next,
19+
}
20+
}
21+
}
22+
23+
type dbTracingMiddleware struct {
24+
next Database
25+
}
26+
27+
type StmtMiddleware struct {
28+
next *sql.Stmt
29+
}
30+
31+
func (stmt StmtMiddleware) Close() error {
32+
return stmt.next.Close()
33+
}
34+
35+
func (stmt StmtMiddleware) QueryRow(ctx context.Context, args ...interface{}) *sql.Row {
36+
span := startSpan(ctx, "rows from database")
37+
rows := stmt.next.QueryRow(args...)
38+
finishSpan(span, unsafe.Sizeof(rows))
39+
return rows
40+
}
41+
42+
func (mw dbTracingMiddleware) Close() error {
43+
return mw.next.Close()
44+
}
45+
46+
func (mw dbTracingMiddleware) Ping() error {
47+
return mw.next.Ping()
48+
}
49+
50+
func (mw dbTracingMiddleware) Select(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
51+
span := startSpan(ctx, "socks from database")
52+
err := mw.next.Select(ctx, dest, query, args...)
53+
finishSpan(span, unsafe.Sizeof(dest))
54+
return err
55+
}
56+
57+
func (mw dbTracingMiddleware) Prepare(query string) (StmtMiddleware, error) {
58+
return mw.next.Prepare(query)
59+
}
60+
61+
func (mw dbTracingMiddleware) Get(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
62+
span := startSpan(ctx, "get from database")
63+
err := mw.next.Get(ctx, dest, query, args...)
64+
finishSpan(span, unsafe.Sizeof(dest))
65+
return err
66+
}
67+
68+
func (mw dbTracingMiddleware) Query(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) {
69+
span := startSpan(ctx, "query from database")
70+
rows, err := mw.next.Query(ctx, query, args...)
71+
finishSpan(span, unsafe.Sizeof(rows))
72+
return rows, err
73+
}
74+
75+
func startSpan(ctx context.Context, n string) stdopentracing.Span {
76+
var span stdopentracing.Span
77+
span, ctx = stdopentracing.StartSpanFromContext(ctx, n)
78+
span.SetTag("span.kind", "client")
79+
span.SetTag("db.type", "mysql")
80+
span.SetTag("peer.address", "catalogue-db:3306")
81+
return span
82+
}
83+
84+
func finishSpan(span stdopentracing.Span, size uintptr) {
85+
span.SetTag("db.query.result.size", size)
86+
span.Finish()
87+
}

docker/catalogue/Dockerfile-release

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,18 @@ RUN chmod +x /app && \
2020

2121
USER ${SERVICE_USER}
2222

23-
ARG BUILD_DATE
24-
ARG BUILD_VERSION
25-
ARG COMMIT
26-
27-
LABEL org.label-schema.vendor="Weaveworks" \
28-
org.label-schema.build-date="${BUILD_DATE}" \
29-
org.label-schema.version="${BUILD_VERSION}" \
30-
org.label-schema.name="Socks Shop: Catalogue" \
31-
org.label-schema.description="REST API for Catalogue service" \
32-
org.label-schema.url="https://github.com/microservices-demo/catalogue" \
33-
org.label-schema.vcs-url="github.com:microservices-demo/catalogue.git" \
34-
org.label-schema.vcs-ref="${COMMIT}" \
35-
org.label-schema.schema-version="1.0"
23+
#ARG BUILD_DATE
24+
#ARG BUILD_VERSION
25+
#ARG COMMIT
26+
#
27+
#LABEL org.label-schema.vendor="Weaveworks" \
28+
# org.label-schema.build-date="${BUILD_DATE}" \
29+
# org.label-schema.version="${BUILD_VERSION}" \
30+
# org.label-schema.name="Socks Shop: Catalogue" \
31+
# org.label-schema.description="REST API for Catalogue service" \
32+
# org.label-schema.url="https://github.com/microservices-demo/catalogue" \
33+
# org.label-schema.vcs-url="github.com:microservices-demo/catalogue.git" \
34+
# org.label-schema.vcs-ref="${COMMIT}" \
35+
# org.label-schema.schema-version="1.0"
3636

3737
CMD ["/app", "-port=80"]

endpoints.go

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ func MakeEndpoints(s Service, tracer stdopentracing.Tracer) Endpoints {
3636
func MakeListEndpoint(s Service) endpoint.Endpoint {
3737
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
3838
req := request.(listRequest)
39-
socks, err := s.List(req.Tags, req.Order, req.PageNum, req.PageSize)
39+
socks, err := s.List(ctx, req.Tags, req.Order, req.PageNum, req.PageSize)
4040
return listResponse{Socks: socks, Err: err}, err
4141
}
4242
}
@@ -45,7 +45,7 @@ func MakeListEndpoint(s Service) endpoint.Endpoint {
4545
func MakeCountEndpoint(s Service) endpoint.Endpoint {
4646
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
4747
req := request.(countRequest)
48-
n, err := s.Count(req.Tags)
48+
n, err := s.Count(ctx, req.Tags)
4949
return countResponse{N: n, Err: err}, err
5050
}
5151
}
@@ -54,15 +54,15 @@ func MakeCountEndpoint(s Service) endpoint.Endpoint {
5454
func MakeGetEndpoint(s Service) endpoint.Endpoint {
5555
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
5656
req := request.(getRequest)
57-
sock, err := s.Get(req.ID)
57+
sock, err := s.Get(ctx, req.ID)
5858
return getResponse{Sock: sock, Err: err}, err
5959
}
6060
}
6161

6262
// MakeTagsEndpoint returns an endpoint via the given service.
6363
func MakeTagsEndpoint(s Service) endpoint.Endpoint {
6464
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
65-
tags, err := s.Tags()
65+
tags, err := s.Tags(ctx)
6666
return tagsResponse{Tags: tags, Err: err}, err
6767
}
6868
}

logging.go

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package catalogue
22

33
import (
4+
"context"
45
"strings"
56
"time"
67

@@ -22,7 +23,7 @@ type loggingMiddleware struct {
2223
logger log.Logger
2324
}
2425

25-
func (mw loggingMiddleware) List(tags []string, order string, pageNum, pageSize int) (socks []Sock, err error) {
26+
func (mw loggingMiddleware) List(ctx context.Context, tags []string, order string, pageNum, pageSize int) (socks []Sock, err error) {
2627
defer func(begin time.Time) {
2728
mw.logger.Log(
2829
"method", "List",
@@ -35,10 +36,10 @@ func (mw loggingMiddleware) List(tags []string, order string, pageNum, pageSize
3536
"took", time.Since(begin),
3637
)
3738
}(time.Now())
38-
return mw.next.List(tags, order, pageNum, pageSize)
39+
return mw.next.List(ctx, tags, order, pageNum, pageSize)
3940
}
4041

41-
func (mw loggingMiddleware) Count(tags []string) (n int, err error) {
42+
func (mw loggingMiddleware) Count(ctx context.Context, tags []string) (n int, err error) {
4243
defer func(begin time.Time) {
4344
mw.logger.Log(
4445
"method", "Count",
@@ -48,10 +49,10 @@ func (mw loggingMiddleware) Count(tags []string) (n int, err error) {
4849
"took", time.Since(begin),
4950
)
5051
}(time.Now())
51-
return mw.next.Count(tags)
52+
return mw.next.Count(ctx, tags)
5253
}
5354

54-
func (mw loggingMiddleware) Get(id string) (s Sock, err error) {
55+
func (mw loggingMiddleware) Get(ctx context.Context, id string) (s Sock, err error) {
5556
defer func(begin time.Time) {
5657
mw.logger.Log(
5758
"method", "Get",
@@ -61,10 +62,10 @@ func (mw loggingMiddleware) Get(id string) (s Sock, err error) {
6162
"took", time.Since(begin),
6263
)
6364
}(time.Now())
64-
return mw.next.Get(id)
65+
return mw.next.Get(ctx, id)
6566
}
6667

67-
func (mw loggingMiddleware) Tags() (tags []string, err error) {
68+
func (mw loggingMiddleware) Tags(ctx context.Context) (tags []string, err error) {
6869
defer func(begin time.Time) {
6970
mw.logger.Log(
7071
"method", "Tags",
@@ -73,7 +74,7 @@ func (mw loggingMiddleware) Tags() (tags []string, err error) {
7374
"took", time.Since(begin),
7475
)
7576
}(time.Now())
76-
return mw.next.Tags()
77+
return mw.next.Tags(ctx)
7778
}
7879

7980
func (mw loggingMiddleware) Health() (health []Health) {

scripts/build.sh

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,11 @@
22

33
set -ev
44

5-
export BUILD_VERSION="0.0.2-SNAPSHOT"
5+
export BUILD_VERSION="4"
66
export BUILD_DATE=`date +%Y-%m-%dT%T%z`
77

88
SCRIPT_DIR=$(dirname "$0")
9+
echo $SCRIPT_DIR
910

1011
if [[ -z "$GROUP" ]] ; then
1112
echo "Cannot find GROUP env var"
@@ -17,11 +18,11 @@ if [[ -z "$COMMIT" ]] ; then
1718
exit 1
1819
fi
1920

20-
if [[ "$(uname)" == "Darwin" ]]; then
21+
#if [[ "$(uname)" == "Darwin" ]]; then
2122
DOCKER_CMD=docker
22-
else
23-
DOCKER_CMD="sudo docker"
24-
fi
23+
#else
24+
# DOCKER_CMD="sudo docker"
25+
#fi
2526
CODE_DIR=$(cd $SCRIPT_DIR/..; pwd)
2627
echo $CODE_DIR
2728

@@ -32,17 +33,17 @@ mkdir -p $CODE_DIR/docker/catalogue/vendor && cp $CODE_DIR/vendor/manifest $CODE
3233

3334
REPO=${GROUP}/$(basename catalogue);
3435

35-
$DOCKER_CMD build -t ${REPO}-dev $CODE_DIR/docker/catalogue;
36-
$DOCKER_CMD create --name catalogue ${REPO}-dev;
37-
$DOCKER_CMD cp catalogue:/app/main $CODE_DIR/docker/catalogue/app;
38-
$DOCKER_CMD rm catalogue;
36+
#$DOCKER_CMD build -t ${REPO}-dev $CODE_DIR/docker/catalogue;
37+
#$DOCKER_CMD create --name catalogue ${REPO}-dev;
38+
#$DOCKER_CMD cp catalogue:/app/main $CODE_DIR/docker/catalogue/app;
39+
#$DOCKER_CMD rm catalogue;
3940
$DOCKER_CMD build \
4041
--build-arg BUILD_VERSION=$BUILD_VERSION \
4142
--build-arg BUILD_DATE=$BUILD_DATE \
4243
--build-arg COMMIT=$COMMIT \
4344
-t ${REPO}:${COMMIT} \
4445
-f $CODE_DIR/docker/catalogue/Dockerfile-release $CODE_DIR/docker/catalogue;
4546

46-
$DOCKER_CMD build \
47-
-t ${REPO}-db:${COMMIT} \
48-
-f $CODE_DIR/docker/catalogue-db/Dockerfile $CODE_DIR/docker/catalogue-db;
47+
#$DOCKER_CMD build \
48+
# -t ${REPO}-db:${COMMIT} \
49+
# -f $CODE_DIR/docker/catalogue-db/Dockerfile $CODE_DIR/docker/catalogue-db;

0 commit comments

Comments
 (0)