Skip to content

Commit a1b09ec

Browse files
authored
Merge pull request #188 from pranavmehta94/pranav/tracing
Add support to send trace context to clickhouse server
2 parents 557cddc + a0aa2a4 commit a1b09ec

File tree

5 files changed

+168
-4
lines changed

5 files changed

+168
-4
lines changed

Diff for: README.md

+62
Original file line numberDiff line numberDiff line change
@@ -297,7 +297,69 @@ func main() {
297297
}
298298

299299
```
300+
Trace context propogation using OTEL SDK
301+
```go
302+
package main
303+
304+
import (
305+
"context"
306+
"fmt"
307+
"log"
308+
309+
"go.opentelemetry.io/otel"
310+
"go.opentelemetry.io/otel/propagation"
311+
"go.opentelemetry.io/otel/sdk/trace"
312+
oteltrace "go.opentelemetry.io/otel/trace"
313+
314+
"database/sql"
315+
316+
_ "github.com/mailru/go-clickhouse/v2"
317+
)
318+
319+
func startTracing() (oteltrace.TracerProvider, error) {
320+
return trace.NewTracerProvider(), nil
321+
}
322+
323+
func main() {
324+
// Open DB connection
325+
connect, err := sql.Open("chhttp", "http://127.0.0.1:8123/default")
326+
if err != nil {
327+
log.Fatal(err)
328+
}
329+
ctx := context.Background()
330+
331+
// Get trace provider
332+
tp, err := startTracing()
333+
if err != nil {
334+
log.Fatal(err)
335+
}
336+
337+
// Set MapPropagator
338+
otel.SetTextMapPropagator(propagation.TraceContext{})
339+
340+
if err := connect.PingContext(ctx); err != nil {
341+
log.Fatal(err)
342+
}
343+
344+
// start span
345+
trCtx, span := tp.Tracer("test").Start(ctx, "app-query")
300346

347+
// execute query with span context
348+
rows, err := connect.QueryContext(trCtx, "SELECT COUNT() FROM (SELECT number FROM system.numbers LIMIT 5)")
349+
if err != nil {
350+
log.Fatal(err)
351+
}
352+
span.End()
353+
var count uint64
354+
for rows.Next() {
355+
if err := rows.Scan(&count); err != nil {
356+
log.Fatal(err)
357+
}
358+
}
359+
fmt.Printf("count: %d\n", count)
360+
}
361+
362+
```
301363
## Go versions
302364
Officially support last 4 golang releases
303365

Diff for: conn.go

+9
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,9 @@ import (
1919
"time"
2020

2121
"github.com/google/uuid"
22+
"go.opentelemetry.io/otel"
23+
"go.opentelemetry.io/otel/propagation"
24+
"go.opentelemetry.io/otel/trace"
2225
)
2326

2427
type key int
@@ -374,6 +377,12 @@ func (c *conn) buildRequest(ctx context.Context, query string, params []driver.V
374377
req.Header.Set("Content-Encoding", "gzip")
375378
}
376379

380+
parentSpan := trace.SpanFromContext(ctx)
381+
if parentSpan.SpanContext().IsValid() {
382+
carrier := propagation.HeaderCarrier(req.Header)
383+
otel.GetTextMapPropagator().Inject(ctx, carrier)
384+
}
385+
377386
return req, nil
378387
}
379388

Diff for: conn_test.go

+70
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,10 @@ import (
1313

1414
"github.com/google/uuid"
1515
"github.com/stretchr/testify/suite"
16+
"go.opentelemetry.io/otel"
17+
"go.opentelemetry.io/otel/propagation"
18+
"go.opentelemetry.io/otel/sdk/trace"
19+
oteltrace "go.opentelemetry.io/otel/trace"
1620
)
1721

1822
var (
@@ -377,6 +381,72 @@ func (s *connSuite) TestBuildRequestWithQueryIdAndQuotaKey() {
377381
}
378382
}
379383
}
384+
385+
func (s *connSuite) TestBuildRequestWithTraceContext() {
386+
cn := newConn(NewConfig())
387+
testCases := []struct {
388+
name string
389+
traceProvider oteltrace.TracerProvider
390+
propagator propagation.TextMapPropagator
391+
expectedValidSpan bool
392+
expectedTraceHeaderPresent bool
393+
}{
394+
{
395+
name: "trace context",
396+
traceProvider: trace.NewTracerProvider(),
397+
propagator: propagation.TraceContext{},
398+
expectedTraceHeaderPresent: true,
399+
expectedValidSpan: true,
400+
},
401+
{
402+
name: "trace context with noop trace provider",
403+
traceProvider: oteltrace.NewNoopTracerProvider(),
404+
propagator: propagation.TraceContext{},
405+
expectedTraceHeaderPresent: false,
406+
expectedValidSpan: false,
407+
},
408+
{
409+
name: "trace context with noop propagator",
410+
traceProvider: trace.NewTracerProvider(),
411+
propagator: propagation.NewCompositeTextMapPropagator(),
412+
expectedTraceHeaderPresent: false,
413+
expectedValidSpan: false,
414+
},
415+
{
416+
name: "trace context with noop provider and propagator",
417+
traceProvider: oteltrace.NewNoopTracerProvider(),
418+
propagator: propagation.NewCompositeTextMapPropagator(),
419+
expectedTraceHeaderPresent: false,
420+
expectedValidSpan: false,
421+
},
422+
}
423+
for _, tc := range testCases {
424+
ctx := context.Background()
425+
otel.SetTextMapPropagator(tc.propagator)
426+
// start span
427+
trCtx, expectedSpan := tc.traceProvider.Tracer("go test").Start(ctx, tc.name)
428+
req, err := cn.buildRequest(trCtx, "SELECT 1", nil)
429+
expectedSpan.End()
430+
if s.NoError(err) {
431+
// check TraceParent header present in request header
432+
traceHeader := req.Header.Get("TraceParent")
433+
traceHeaderPresent := len(traceHeader) > 0
434+
s.Equal(tc.expectedTraceHeaderPresent, traceHeaderPresent)
435+
436+
reqCtx := context.Background()
437+
reqTrCtx := otel.GetTextMapPropagator().Extract(reqCtx, propagation.HeaderCarrier(req.Header))
438+
reqSpan := oteltrace.SpanFromContext(reqTrCtx).SpanContext()
439+
440+
// check if request span valid
441+
s.Equal(tc.expectedValidSpan, reqSpan.IsValid())
442+
if tc.expectedValidSpan {
443+
s.Equal(expectedSpan.SpanContext().SpanID(), reqSpan.SpanID())
444+
s.Equal(expectedSpan.SpanContext().TraceID(), reqSpan.TraceID())
445+
}
446+
}
447+
}
448+
}
449+
380450
func (s *connSuite) TestBuildRequestParamsInterpolation() {
381451
query := `INSERT INTO test (str) VALUES ("Question?")`
382452
cn := newConn(NewConfig())

Diff for: go.mod

+5-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,10 @@ module github.com/mailru/go-clickhouse/v2
22

33
require (
44
github.com/google/uuid v1.2.0
5-
github.com/stretchr/testify v1.3.0
5+
github.com/stretchr/testify v1.7.1
6+
go.opentelemetry.io/otel v1.7.0
7+
go.opentelemetry.io/otel/sdk v1.7.0
8+
go.opentelemetry.io/otel/trace v1.7.0
69
)
710

8-
go 1.11
11+
go 1.16

Diff for: go.sum

+22-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,29 @@
11
github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8=
22
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
3+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
4+
github.com/go-logr/logr v1.2.3 h1:2DntVwHkVopvECVRSlL5PSo9eG+cAkDCuckLubN+rq0=
5+
github.com/go-logr/logr v1.2.3/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
6+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
7+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
8+
github.com/google/go-cmp v0.5.7 h1:81/ik6ipDQS2aGcBfIN5dHDB36BwrStyeAQquSYCV4o=
9+
github.com/google/go-cmp v0.5.7/go.mod h1:n+brtR0CgQNWTVd5ZUFpTBC8YFBDLK/h/bpaJ8/DtOE=
310
github.com/google/uuid v1.2.0 h1:qJYtXnJRWmpe7m/3XlyhrsLrEURqHRM2kxzoxXqyUDs=
411
github.com/google/uuid v1.2.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
512
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
613
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
714
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
8-
github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q=
9-
github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI=
15+
github.com/stretchr/testify v1.7.1 h1:5TQK59W5E3v0r2duFAb7P95B6hEeOyEnHRa8MjYSMTY=
16+
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
17+
go.opentelemetry.io/otel v1.7.0 h1:Z2lA3Tdch0iDcrhJXDIlC94XE+bxok1F9B+4Lz/lGsM=
18+
go.opentelemetry.io/otel v1.7.0/go.mod h1:5BdUoMIz5WEs0vt0CUEMtSSaTSHBBVwrhnz7+nrD5xk=
19+
go.opentelemetry.io/otel/sdk v1.7.0 h1:4OmStpcKVOfvDOgCt7UriAPtKolwIhxpnSNI/yK+1B0=
20+
go.opentelemetry.io/otel/sdk v1.7.0/go.mod h1:uTEOTwaqIVuTGiJN7ii13Ibp75wJmYUDe374q6cZwUU=
21+
go.opentelemetry.io/otel/trace v1.7.0 h1:O37Iogk1lEkMRXewVtZ1BBTVn5JEp8GrJvP92bJqC6o=
22+
go.opentelemetry.io/otel/trace v1.7.0/go.mod h1:fzLSB9nqR2eXzxPXb2JW9IKE+ScyXA48yyE4TNvoHqU=
23+
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7 h1:iGu644GcxtEcrInvDsQRCwJjtCIOlT2V7IRt6ah2Whw=
24+
golang.org/x/sys v0.0.0-20210423185535-09eb48e85fd7/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
25+
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
26+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
27+
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
28+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
29+
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

0 commit comments

Comments
 (0)