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

Commit

Permalink
Enrich Zipkin db tracing
Browse files Browse the repository at this point in the history
Add info regarding

- database type and address
- approximation for queries results size
  • Loading branch information
embs committed Nov 26, 2017
1 parent 9de2c86 commit 8f5de66
Show file tree
Hide file tree
Showing 9 changed files with 203 additions and 57 deletions.
5 changes: 4 additions & 1 deletion cmd/cataloguesvc/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,10 @@ func main() {
}

// Data domain.
db, err := sqlx.Open("mysql", *dsn)
var db catalogue.Database
sqlxdb, err := sqlx.Open("mysql", *dsn)
db = &catalogue.SqlxDb{Db: sqlxdb}
db = catalogue.DbTracingMiddleware()(db)
if err != nil {
logger.Log("err", err)
os.Exit(1)
Expand Down
50 changes: 50 additions & 0 deletions db.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package catalogue

import(
"context"
"database/sql"

"github.com/jmoiron/sqlx"
)

type Database interface {
Close() error
Ping() error
Select(ctx context.Context, dest interface{}, query string, args ...interface{}) error
//Prepare(query string) (*sql.Stmt, error)
Prepare(query string) (StmtMiddleware, error)
Get(ctx context.Context, dest interface{}, query string, args ...interface{}) error
Query(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error)
}

// SqlxDb meets the Database interface requirements
type SqlxDb struct {
// db is a reference for the underlying database implementation
Db *sqlx.DB
}

func (sqlxdb *SqlxDb) Close() error {
return sqlxdb.Db.Close()
}

func (sqlxdb *SqlxDb) Ping() error {
return sqlxdb.Db.Ping()
}

func (sqlxdb *SqlxDb) Select(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
return sqlxdb.Db.Select(dest, query, args...)
}

//func (sqlxdb *SqlxDb) Prepare(query string) (*sql.Stmt, error) {
func (sqlxdb *SqlxDb) Prepare(query string) (StmtMiddleware, error) {
sel, err := sqlxdb.Db.Prepare(query)
return StmtMiddleware{next: sel}, err
}

func (sqlxdb *SqlxDb) Get(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
return sqlxdb.Db.Get(dest, query, args...)
}

func (sqlxdb *SqlxDb) Query(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) {
return sqlxdb.Db.Query(query, args...)
}
87 changes: 87 additions & 0 deletions db_tracing_middleware.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,87 @@
package catalogue

import (
"context"
"database/sql"
"unsafe"

stdopentracing "github.com/opentracing/opentracing-go"
)

// Middleware decorates a database.
type DbMiddleware func(Database) Database

// DbTracingMiddleware traces database calls.
func DbTracingMiddleware() DbMiddleware {
return func(next Database) Database {
return dbTracingMiddleware{
next: next,
}
}
}

type dbTracingMiddleware struct {
next Database
}

type StmtMiddleware struct {
next *sql.Stmt
}

func (stmt StmtMiddleware) Close() error {
return stmt.next.Close()
}

func (stmt StmtMiddleware) QueryRow(ctx context.Context, args ...interface{}) *sql.Row {
span := startSpan(ctx, "rows from database")
rows := stmt.next.QueryRow(args...)
finishSpan(span, unsafe.Sizeof(rows))
return rows
}

func (mw dbTracingMiddleware) Close() error {
return mw.next.Close()
}

func (mw dbTracingMiddleware) Ping() error {
return mw.next.Ping()
}

func (mw dbTracingMiddleware) Select(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
span := startSpan(ctx, "socks from database")
err := mw.next.Select(ctx, dest, query, args...)
finishSpan(span, unsafe.Sizeof(dest))
return err
}

func (mw dbTracingMiddleware) Prepare(query string) (StmtMiddleware, error) {
return mw.next.Prepare(query)
}

func (mw dbTracingMiddleware) Get(ctx context.Context, dest interface{}, query string, args ...interface{}) error {
span := startSpan(ctx, "get from database")
err := mw.next.Get(ctx, dest, query, args...)
finishSpan(span, unsafe.Sizeof(dest))
return err
}

func (mw dbTracingMiddleware) Query(ctx context.Context, query string, args ...interface{}) (*sql.Rows, error) {
span := startSpan(ctx, "query from database")
rows, err := mw.next.Query(ctx, query, args...)
finishSpan(span, unsafe.Sizeof(rows))
return rows, err
}

func startSpan(ctx context.Context, n string) stdopentracing.Span {
var span stdopentracing.Span
span, ctx = stdopentracing.StartSpanFromContext(ctx, n)
span.SetTag("span.kind", "client")
span.SetTag("db.type", "mysql")
span.SetTag("peer.address", "catalogue-db:3306")
return span
}

func finishSpan(span stdopentracing.Span, size uintptr) {
span.SetTag("db.query.result.size", size)
span.Finish()
}
26 changes: 13 additions & 13 deletions docker/catalogue/Dockerfile-release
Original file line number Diff line number Diff line change
Expand Up @@ -20,18 +20,18 @@ RUN chmod +x /app && \

USER ${SERVICE_USER}

ARG BUILD_DATE
ARG BUILD_VERSION
ARG COMMIT

LABEL org.label-schema.vendor="Weaveworks" \
org.label-schema.build-date="${BUILD_DATE}" \
org.label-schema.version="${BUILD_VERSION}" \
org.label-schema.name="Socks Shop: Catalogue" \
org.label-schema.description="REST API for Catalogue service" \
org.label-schema.url="https://github.com/microservices-demo/catalogue" \
org.label-schema.vcs-url="github.com:microservices-demo/catalogue.git" \
org.label-schema.vcs-ref="${COMMIT}" \
org.label-schema.schema-version="1.0"
#ARG BUILD_DATE
#ARG BUILD_VERSION
#ARG COMMIT
#
#LABEL org.label-schema.vendor="Weaveworks" \
# org.label-schema.build-date="${BUILD_DATE}" \
# org.label-schema.version="${BUILD_VERSION}" \
# org.label-schema.name="Socks Shop: Catalogue" \
# org.label-schema.description="REST API for Catalogue service" \
# org.label-schema.url="https://github.com/microservices-demo/catalogue" \
# org.label-schema.vcs-url="github.com:microservices-demo/catalogue.git" \
# org.label-schema.vcs-ref="${COMMIT}" \
# org.label-schema.schema-version="1.0"

CMD ["/app", "-port=80"]
8 changes: 4 additions & 4 deletions endpoints.go
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ func MakeEndpoints(s Service, tracer stdopentracing.Tracer) Endpoints {
func MakeListEndpoint(s Service) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
req := request.(listRequest)
socks, err := s.List(req.Tags, req.Order, req.PageNum, req.PageSize)
socks, err := s.List(ctx, req.Tags, req.Order, req.PageNum, req.PageSize)
return listResponse{Socks: socks, Err: err}, err
}
}
Expand All @@ -45,7 +45,7 @@ func MakeListEndpoint(s Service) endpoint.Endpoint {
func MakeCountEndpoint(s Service) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
req := request.(countRequest)
n, err := s.Count(req.Tags)
n, err := s.Count(ctx, req.Tags)
return countResponse{N: n, Err: err}, err
}
}
Expand All @@ -54,15 +54,15 @@ func MakeCountEndpoint(s Service) endpoint.Endpoint {
func MakeGetEndpoint(s Service) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
req := request.(getRequest)
sock, err := s.Get(req.ID)
sock, err := s.Get(ctx, req.ID)
return getResponse{Sock: sock, Err: err}, err
}
}

// MakeTagsEndpoint returns an endpoint via the given service.
func MakeTagsEndpoint(s Service) endpoint.Endpoint {
return func(ctx context.Context, request interface{}) (response interface{}, err error) {
tags, err := s.Tags()
tags, err := s.Tags(ctx)
return tagsResponse{Tags: tags, Err: err}, err
}
}
Expand Down
17 changes: 9 additions & 8 deletions logging.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package catalogue

import (
"context"
"strings"
"time"

Expand All @@ -22,7 +23,7 @@ type loggingMiddleware struct {
logger log.Logger
}

func (mw loggingMiddleware) List(tags []string, order string, pageNum, pageSize int) (socks []Sock, err error) {
func (mw loggingMiddleware) List(ctx context.Context, tags []string, order string, pageNum, pageSize int) (socks []Sock, err error) {
defer func(begin time.Time) {
mw.logger.Log(
"method", "List",
Expand All @@ -35,10 +36,10 @@ func (mw loggingMiddleware) List(tags []string, order string, pageNum, pageSize
"took", time.Since(begin),
)
}(time.Now())
return mw.next.List(tags, order, pageNum, pageSize)
return mw.next.List(ctx, tags, order, pageNum, pageSize)
}

func (mw loggingMiddleware) Count(tags []string) (n int, err error) {
func (mw loggingMiddleware) Count(ctx context.Context, tags []string) (n int, err error) {
defer func(begin time.Time) {
mw.logger.Log(
"method", "Count",
Expand All @@ -48,10 +49,10 @@ func (mw loggingMiddleware) Count(tags []string) (n int, err error) {
"took", time.Since(begin),
)
}(time.Now())
return mw.next.Count(tags)
return mw.next.Count(ctx, tags)
}

func (mw loggingMiddleware) Get(id string) (s Sock, err error) {
func (mw loggingMiddleware) Get(ctx context.Context, id string) (s Sock, err error) {
defer func(begin time.Time) {
mw.logger.Log(
"method", "Get",
Expand All @@ -61,10 +62,10 @@ func (mw loggingMiddleware) Get(id string) (s Sock, err error) {
"took", time.Since(begin),
)
}(time.Now())
return mw.next.Get(id)
return mw.next.Get(ctx, id)
}

func (mw loggingMiddleware) Tags() (tags []string, err error) {
func (mw loggingMiddleware) Tags(ctx context.Context) (tags []string, err error) {
defer func(begin time.Time) {
mw.logger.Log(
"method", "Tags",
Expand All @@ -73,7 +74,7 @@ func (mw loggingMiddleware) Tags() (tags []string, err error) {
"took", time.Since(begin),
)
}(time.Now())
return mw.next.Tags()
return mw.next.Tags(ctx)
}

func (mw loggingMiddleware) Health() (health []Health) {
Expand Down
25 changes: 13 additions & 12 deletions scripts/build.sh
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

set -ev

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

SCRIPT_DIR=$(dirname "$0")
echo $SCRIPT_DIR

if [[ -z "$GROUP" ]] ; then
echo "Cannot find GROUP env var"
Expand All @@ -17,11 +18,11 @@ if [[ -z "$COMMIT" ]] ; then
exit 1
fi

if [[ "$(uname)" == "Darwin" ]]; then
#if [[ "$(uname)" == "Darwin" ]]; then
DOCKER_CMD=docker
else
DOCKER_CMD="sudo docker"
fi
#else
# DOCKER_CMD="sudo docker"
#fi
CODE_DIR=$(cd $SCRIPT_DIR/..; pwd)
echo $CODE_DIR

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

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

$DOCKER_CMD build -t ${REPO}-dev $CODE_DIR/docker/catalogue;
$DOCKER_CMD create --name catalogue ${REPO}-dev;
$DOCKER_CMD cp catalogue:/app/main $CODE_DIR/docker/catalogue/app;
$DOCKER_CMD rm catalogue;
#$DOCKER_CMD build -t ${REPO}-dev $CODE_DIR/docker/catalogue;
#$DOCKER_CMD create --name catalogue ${REPO}-dev;
#$DOCKER_CMD cp catalogue:/app/main $CODE_DIR/docker/catalogue/app;
#$DOCKER_CMD rm catalogue;
$DOCKER_CMD build \
--build-arg BUILD_VERSION=$BUILD_VERSION \
--build-arg BUILD_DATE=$BUILD_DATE \
--build-arg COMMIT=$COMMIT \
-t ${REPO}:${COMMIT} \
-f $CODE_DIR/docker/catalogue/Dockerfile-release $CODE_DIR/docker/catalogue;

$DOCKER_CMD build \
-t ${REPO}-db:${COMMIT} \
-f $CODE_DIR/docker/catalogue-db/Dockerfile $CODE_DIR/docker/catalogue-db;
#$DOCKER_CMD build \
# -t ${REPO}-db:${COMMIT} \
# -f $CODE_DIR/docker/catalogue-db/Dockerfile $CODE_DIR/docker/catalogue-db;
Loading

0 comments on commit 8f5de66

Please sign in to comment.