From f8bc3d27ea83202c7db7e3b9be9c972a495ea257 Mon Sep 17 00:00:00 2001 From: Peter Giacomo Lombardo Date: Fri, 15 Feb 2019 14:40:07 +0100 Subject: [PATCH 1/2] Clean up and improve span kind reporting --- agent.go | 6 +++--- json_span.go | 1 + recorder.go | 5 +++-- recorder_internal_test.go | 8 ++++---- span.go | 16 ++++++++++++++-- 5 files changed, 25 insertions(+), 11 deletions(-) diff --git a/agent.go b/agent.go index f2537b77a..eb2bb38b1 100644 --- a/agent.go +++ b/agent.go @@ -121,6 +121,9 @@ func (r *agentS) fullRequestResponse(url string, method string, data interface{} req, err = http.NewRequest(method, url, nil) } + // Uncomment this to dump json payloads + // log.debug(bytes.NewBuffer(j)) + if err == nil { req.Header.Set("Content-Type", "application/json") resp, err = r.client.Do(req) @@ -130,9 +133,6 @@ func (r *agentS) fullRequestResponse(url string, method string, data interface{} if resp.StatusCode < 200 || resp.StatusCode >= 300 { err = errors.New(resp.Status) } else { - - log.debug("agent response:", url, resp.Status) - if body != nil { var b []byte b, err = ioutil.ReadAll(resp.Body) diff --git a/json_span.go b/json_span.go index a39938329..0d6ca0410 100644 --- a/json_span.go +++ b/json_span.go @@ -12,6 +12,7 @@ type jsonSpan struct { Duration uint64 `json:"d"` Name string `json:"n"` From *fromS `json:"f"` + Kind int `json:"k"` Error bool `json:"error"` Ec int `json:"ec,omitempty"` Lang string `json:"ta,omitempty"` diff --git a/recorder.go b/recorder.go index 56ba8cff5..889572fb3 100644 --- a/recorder.go +++ b/recorder.go @@ -63,11 +63,11 @@ func (r *Recorder) RecordSpan(span *spanS) { } var data = &jsonData{} - kind := span.getSpanKind() + kindTag := span.getSpanKindTag() data.SDK = &jsonSDKData{ Name: span.Operation, - Type: kind, + Type: kindTag, Custom: &jsonCustomData{Tags: span.Tags, Logs: span.collectLogs()}} baggage := make(map[string]string) @@ -108,6 +108,7 @@ func (r *Recorder) RecordSpan(span *spanS) { Ec: span.Ec, Lang: "go", From: sensor.agent.from, + Kind: span.getSpanKindInt(), Data: data}) if r.testMode || !sensor.agent.canSend() { diff --git a/recorder_internal_test.go b/recorder_internal_test.go index 08416fdd5..b6ece3b8b 100644 --- a/recorder_internal_test.go +++ b/recorder_internal_test.go @@ -18,28 +18,28 @@ func TestSpanKind(t *testing.T) { span := tracer.StartSpan("http-client") span.SetTag(string(ext.SpanKind), "exit") span.Finish() - kind := span.(*spanS).getSpanKind() + kind := span.(*spanS).getSpanKindTag() assert.EqualValues(t, "exit", kind, "Wrong span kind") // Entry span = tracer.StartSpan("http-client") span.SetTag(string(ext.SpanKind), "entry") span.Finish() - kind = span.(*spanS).getSpanKind() + kind = span.(*spanS).getSpanKindTag() assert.EqualValues(t, "entry", kind, "Wrong span kind") // Consumer span = tracer.StartSpan("http-client") span.SetTag(string(ext.SpanKind), "consumer") span.Finish() - kind = span.(*spanS).getSpanKind() + kind = span.(*spanS).getSpanKindTag() assert.EqualValues(t, "entry", kind, "Wrong span kind") // Producer span = tracer.StartSpan("http-client") span.SetTag(string(ext.SpanKind), "producer") span.Finish() - kind = span.(*spanS).getSpanKind() + kind = span.(*spanS).getSpanKindTag() assert.EqualValues(t, "exit", kind, "Wrong span kind") } diff --git a/span.go b/span.go index 9fb991f7f..3c6c71c99 100644 --- a/span.go +++ b/span.go @@ -225,7 +225,7 @@ func (r *spanS) getHostName() string { return h } -func (r *spanS) getSpanKind() string { +func (r *spanS) getSpanKindTag() string { kind := r.getStringTag(string(ext.SpanKind)) switch kind { @@ -234,7 +234,19 @@ func (r *spanS) getSpanKind() string { case string(ext.SpanKindRPCClientEnum), "producer", "exit": return "exit" } - return "" + return "intermediate" +} + +func (r *spanS) getSpanKindInt() int { + kind := r.getStringTag(string(ext.SpanKind)) + + switch kind { + case string(ext.SpanKindRPCServerEnum), "consumer", "entry": + return 1 + case string(ext.SpanKindRPCClientEnum), "producer", "exit": + return 2 + } + return 3 } func (r *spanS) collectLogs() map[uint64]map[string]interface{} { From 5eaf247b60cb99083b422b6e51d7868e287aaa90 Mon Sep 17 00:00:00 2001 From: Peter Giacomo Lombardo Date: Fri, 15 Feb 2019 15:11:45 +0100 Subject: [PATCH 2/2] Update example: random durations and intermediate span --- example/ot-simple/simple.go | 24 ++++++++++++++++++------ 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/example/ot-simple/simple.go b/example/ot-simple/simple.go index 57cfe8452..187227a28 100644 --- a/example/ot-simple/simple.go +++ b/example/ot-simple/simple.go @@ -1,6 +1,7 @@ package main import ( + "math/rand" "time" "github.com/instana/golang-sensor" @@ -16,27 +17,38 @@ const ( ) func simple(ctx context.Context) { - parentSpan, ctx := ot.StartSpanFromContext(ctx, "asteroid") + // Handling an incoming request + parentSpan := ot.StartSpan("asteroid") parentSpan.SetTag(string(ext.Component), "Go simple example app") parentSpan.SetTag(string(ext.SpanKind), string(ext.SpanKindRPCServerEnum)) - parentSpan.SetTag(string(ext.HTTPUrl), "/golang/simple/one") + parentSpan.SetTag(string(ext.HTTPUrl), "https://asteroid.svc.io/golang/api/v2") parentSpan.SetTag(string(ext.HTTPMethod), "GET") parentSpan.SetTag(string(ext.HTTPStatusCode), uint16(200)) parentSpan.LogFields(log.String("foo", "bar")) + // Making an HTTP request childSpan := ot.StartSpan("spacedust", ot.ChildOf(parentSpan.Context())) childSpan.SetTag(string(ext.SpanKind), string(ext.SpanKindRPCClientEnum)) - childSpan.SetTag(string(ext.HTTPUrl), "/golang/simple/two") + childSpan.SetTag(string(ext.HTTPUrl), "https://meteor.svc.io/golang/api/v2") childSpan.SetTag(string(ext.HTTPMethod), "POST") childSpan.SetTag(string(ext.HTTPStatusCode), 204) childSpan.SetBaggageItem("someBaggage", "someValue") - time.Sleep(10 * time.Millisecond) - + // Make the HTTP request (we'll just sleep for a random duration as an example) + time.Sleep(time.Duration(rand.Intn(200)) * time.Millisecond) childSpan.Finish() - time.Sleep(5 * time.Millisecond) + // Rendering a template with custom tags + renderSpan := ot.StartSpan("render", ot.ChildOf(childSpan.Context())) + renderSpan.SetTag("type", "layout") + renderSpan.SetTag("name", "application_layout.erb") + + // Render the template (we'll just sleep for a random duration as an example) + time.Sleep(time.Duration(rand.Intn(100)) * time.Millisecond) + renderSpan.Finish() + // Additional work (we'll just sleep for a random duration as an example) + time.Sleep(time.Duration(rand.Intn(30)) * time.Millisecond) parentSpan.Finish() }