From 711aa66bd5da30e6005d802b0b028f7d6611cbf8 Mon Sep 17 00:00:00 2001 From: Bryan Boreham Date: Fri, 10 May 2019 14:26:33 +0000 Subject: [PATCH] Add OpenTracing span for report.ReadBinary() So we can see the timing and size in Jaeger. Signed-off-by: Bryan Boreham --- app/benchmark_internal_test.go | 2 +- app/collector.go | 2 +- app/multitenant/s3_client.go | 2 +- app/router.go | 2 +- extras/copyreport/main.go | 3 ++- report/marshal.go | 16 +++++++++++----- report/marshal_test.go | 5 +++-- 7 files changed, 20 insertions(+), 12 deletions(-) diff --git a/app/benchmark_internal_test.go b/app/benchmark_internal_test.go index 18e79fdd9..7a14f5ee9 100644 --- a/app/benchmark_internal_test.go +++ b/app/benchmark_internal_test.go @@ -30,7 +30,7 @@ func readReportFiles(b *testing.B, path string) []report.Report { if info.IsDir() { return nil } - rpt, err := report.MakeFromFile(p) + rpt, err := report.MakeFromFile(context.Background(), p) if err != nil { return err } diff --git a/app/collector.go b/app/collector.go index 8f7374a3b..5d9deea9b 100644 --- a/app/collector.go +++ b/app/collector.go @@ -278,7 +278,7 @@ func NewFileCollector(path string, window time.Duration) (Collector, error) { } timestamps = append(timestamps, t) - rpt, err := report.MakeFromFile(p) + rpt, err := report.MakeFromFile(context.Background(), p) if err != nil { return err } diff --git a/app/multitenant/s3_client.go b/app/multitenant/s3_client.go index 586a28f9c..3058eb950 100644 --- a/app/multitenant/s3_client.go +++ b/app/multitenant/s3_client.go @@ -83,7 +83,7 @@ func (store *S3Store) fetchReport(ctx context.Context, key string) (*report.Repo return nil, err } defer resp.Body.Close() - return report.MakeFromBinary(resp.Body) + return report.MakeFromBinary(ctx, resp.Body) } // StoreReportBytes stores a report. diff --git a/app/router.go b/app/router.go index c3347092c..3bf27060d 100644 --- a/app/router.go +++ b/app/router.go @@ -140,7 +140,7 @@ func RegisterReportPostHandler(a Adder, router *mux.Router) { return } - if err := rpt.ReadBinary(reader, gzipped, handle); err != nil { + if err := rpt.ReadBinary(ctx, reader, gzipped, handle); err != nil { respondWith(w, http.StatusBadRequest, err) return } diff --git a/extras/copyreport/main.go b/extras/copyreport/main.go index 60e8eeb87..9f3e7dbe6 100644 --- a/extras/copyreport/main.go +++ b/extras/copyreport/main.go @@ -2,6 +2,7 @@ package main import ( + "context" "flag" "log" @@ -15,7 +16,7 @@ func main() { log.Fatal("usage: copyreport src.(json|msgpack)[.gz] dst.(json|msgpack)[.gz]") } - rpt, err := report.MakeFromFile(flag.Arg(0)) + rpt, err := report.MakeFromFile(context.Background(), flag.Arg(0)) if err != nil { log.Fatal(err) } diff --git a/report/marshal.go b/report/marshal.go index 3158ea52c..fcb32a350 100644 --- a/report/marshal.go +++ b/report/marshal.go @@ -4,6 +4,7 @@ import ( "bufio" "bytes" "compress/gzip" + "context" "fmt" "io" "os" @@ -11,6 +12,8 @@ import ( "strings" "sync" + opentracing "github.com/opentracing/opentracing-go" + otlog "github.com/opentracing/opentracing-go/log" log "github.com/sirupsen/logrus" "github.com/ugorji/go/codec" ) @@ -73,7 +76,9 @@ var gzipWriterPool = &sync.Pool{ // // Will decompress the binary if gzipped is true, and will use the given // codecHandle to decode it. -func (rep *Report) ReadBinary(r io.Reader, gzipped bool, codecHandle codec.Handle) error { +func (rep *Report) ReadBinary(ctx context.Context, r io.Reader, gzipped bool, codecHandle codec.Handle) error { + span, ctx := opentracing.StartSpanFromContext(ctx, "report.ReadBinary") + defer span.Finish() var err error var compressedSize uint64 @@ -106,13 +111,14 @@ func (rep *Report) ReadBinary(r io.Reader, gzipped bool, codecHandle codec.Handl uncompressedSize, float32(compressedSize)/float32(uncompressedSize)*100, ) + span.LogFields(otlog.Uint64("compressedSize", compressedSize), otlog.Int64("uncompressedSize", uncompressedSize)) return nil } // MakeFromBinary constructs a Report from a gzipped msgpack. -func MakeFromBinary(r io.Reader) (*Report, error) { +func MakeFromBinary(ctx context.Context, r io.Reader) (*Report, error) { rep := MakeReport() - if err := rep.ReadBinary(r, true, &codec.MsgpackHandle{}); err != nil { + if err := rep.ReadBinary(ctx, r, true, &codec.MsgpackHandle{}); err != nil { return nil, err } return &rep, nil @@ -153,7 +159,7 @@ func MakeFromBytes(buf []byte) (*Report, error) { // MakeFromFile construct a Report from a file, with the encoding // determined by the extension (".msgpack" or ".json", with an // optional ".gz"). -func MakeFromFile(path string) (rpt Report, _ error) { +func MakeFromFile(ctx context.Context, path string) (rpt Report, _ error) { f, err := os.Open(path) if err != nil { return rpt, err @@ -165,7 +171,7 @@ func MakeFromFile(path string) (rpt Report, _ error) { return rpt, err } - err = rpt.ReadBinary(f, gzipped, handle) + err = rpt.ReadBinary(ctx, f, gzipped, handle) return rpt, err } diff --git a/report/marshal_test.go b/report/marshal_test.go index b1792303c..b79be7fe8 100644 --- a/report/marshal_test.go +++ b/report/marshal_test.go @@ -1,6 +1,7 @@ package report_test import ( + "context" "reflect" "testing" "time" @@ -14,7 +15,7 @@ func TestRoundtrip(t *testing.T) { r1 := report.MakeReport() buf, _ := r1.WriteBinary() bytes := append([]byte{}, buf.Bytes()...) // copy the contents for later - r2, err := report.MakeFromBinary(buf) + r2, err := report.MakeFromBinary(context.Background(), buf) if err != nil { t.Error(err) } @@ -71,7 +72,7 @@ func makeTestReport() report.Report { func TestBiggerRoundtrip(t *testing.T) { r1 := makeTestReport() buf, _ := r1.WriteBinary() - r2, err := report.MakeFromBinary(buf) + r2, err := report.MakeFromBinary(context.Background(), buf) if err != nil { t.Error(err) }