Skip to content

Commit 2db5874

Browse files
committed
add otel and otlp example
1 parent 78dce55 commit 2db5874

5 files changed

Lines changed: 183 additions & 30 deletions

File tree

examples/go.mod

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,38 @@
11
module github.com/spdeepak/flowtracker/examples
22

3-
go 1.24
3+
go 1.24.0
4+
5+
toolchain go1.24.7
46

57
require (
68
github.com/confluentinc/confluent-kafka-go v1.9.2
79
github.com/spdeepak/flowtracker v0.0.3
810
github.com/spdeepak/flowtracker/confluent-kafka v0.0.1
911
github.com/spdeepak/flowtracker/otel v0.0.1
1012
go.opentelemetry.io/otel v1.38.0
13+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0
1114
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0
1215
go.opentelemetry.io/otel/sdk v1.38.0
1316
)
1417

1518
require (
19+
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
1620
github.com/go-logr/logr v1.4.3 // indirect
1721
github.com/go-logr/stdr v1.2.2 // indirect
1822
github.com/google/uuid v1.6.0 // indirect
23+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 // indirect
1924
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
25+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 // indirect
2026
go.opentelemetry.io/otel/metric v1.38.0 // indirect
2127
go.opentelemetry.io/otel/trace v1.38.0 // indirect
28+
go.opentelemetry.io/proto/otlp v1.7.1 // indirect
29+
golang.org/x/net v0.43.0 // indirect
2230
golang.org/x/sys v0.35.0 // indirect
31+
golang.org/x/text v0.28.0 // indirect
32+
google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba // indirect
33+
google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba // indirect
34+
google.golang.org/grpc v1.75.0 // indirect
35+
google.golang.org/protobuf v1.36.10 // indirect
2336
)
2437

2538
replace (

examples/go.sum

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@ github.com/actgardner/gogen-avro/v10 v10.1.0/go.mod h1:o+ybmVjEa27AAr35FRqU98DJu
55
github.com/actgardner/gogen-avro/v10 v10.2.1/go.mod h1:QUhjeHPchheYmMDni/Nx7VB0RsT/ee8YIgGY/xpEQgQ=
66
github.com/actgardner/gogen-avro/v9 v9.1.0/go.mod h1:nyTj6wPqDJoxM3qdnjcLv+EnMDSDFqE0qDpva2QRmKc=
77
github.com/antihax/optional v1.0.0/go.mod h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
8+
github.com/cenkalti/backoff/v5 v5.0.3 h1:ZN+IMa753KfX5hd8vVaMixjnqRZ3y8CuJKRKj1xcsSM=
9+
github.com/cenkalti/backoff/v5 v5.0.3/go.mod h1:rkhZdG3JZukswDf7f0cwqPNk4K0sa+F97BxZthm/crw=
810
github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU=
911
github.com/cespare/xxhash/v2 v2.1.1/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
1012
github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI=
@@ -55,6 +57,8 @@ github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw
5557
github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI=
5658
github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk=
5759
github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY=
60+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
61+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
5862
github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
5963
github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
6064
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
@@ -75,6 +79,8 @@ github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+
7579
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
7680
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
7781
github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw=
82+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2 h1:8Tjv8EJ+pM1xP8mK6egEbD1OgnVTyacbefKhmbLhIhU=
83+
github.com/grpc-ecosystem/grpc-gateway/v2 v2.27.2/go.mod h1:pkJQ2tZHJ0aFOVEEot6oZmaVEZcRme73eIFmhiVuRWs=
7884
github.com/hamba/avro v1.5.6/go.mod h1:3vNT0RLXXpFm2Tb/5KC71ZRJlOroggq1Rcitb6k4Fr8=
7985
github.com/heetch/avro v0.3.1/go.mod h1:4xn38Oz/+hiEUTpbVfGVLfvOg0yKLlRP7Q9+gJJILgA=
8086
github.com/iancoleman/orderedmap v0.0.0-20190318233801-ac98e3ecb4b0/go.mod h1:N0Wam8K1arqPXNWjMo21EXnBPOPp36vB07FNRdD2geA=
@@ -125,6 +131,10 @@ go.opentelemetry.io/auto/sdk v1.1.0 h1:cH53jehLUN6UFLY71z+NDOiNJqDdPRaXzTel0sJyS
125131
go.opentelemetry.io/auto/sdk v1.1.0/go.mod h1:3wSPjt5PWp2RhlCcmmOial7AvC4DQqZb7a7wCow3W8A=
126132
go.opentelemetry.io/otel v1.38.0 h1:RkfdswUDRimDg0m2Az18RKOsnI8UDzppJAtj01/Ymk8=
127133
go.opentelemetry.io/otel v1.38.0/go.mod h1:zcmtmQ1+YmQM9wrNsTGV/q/uyusom3P8RxwExxkZhjM=
134+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0 h1:GqRJVj7UmLjCVyVJ3ZFLdPRmhDUp2zFmQe3RHIOsw24=
135+
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.38.0/go.mod h1:ri3aaHSmCTVYu2AWv44YMauwAQc0aqI9gHKIcSbI1pU=
136+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0 h1:aTL7F04bJHUlztTsNGJ2l+6he8c+y/b//eR0jjjemT4=
137+
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp v1.38.0/go.mod h1:kldtb7jDTeol0l3ewcmd8SDvx3EmIE7lyvqbasU3QC4=
128138
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0 h1:kJxSDN4SgWWTjG/hPp3O7LCGLcHXFlvS2/FFOrwL+SE=
129139
go.opentelemetry.io/otel/exporters/stdout/stdouttrace v1.38.0/go.mod h1:mgIOzS7iZeKJdeB8/NYHrJ48fdGc71Llo5bJ1J4DWUE=
130140
go.opentelemetry.io/otel/metric v1.38.0 h1:Kl6lzIYGAh5M159u9NgiRkmoMKjvbsKtYRwgfrA6WpA=
@@ -136,6 +146,8 @@ go.opentelemetry.io/otel/sdk/metric v1.38.0/go.mod h1:dg9PBnW9XdQ1Hd6ZnRz689Cbtr
136146
go.opentelemetry.io/otel/trace v1.38.0 h1:Fxk5bKrDZJUH+AMyyIXGcFAPah0oRcT+LuNtJrmcNLE=
137147
go.opentelemetry.io/otel/trace v1.38.0/go.mod h1:j1P9ivuFsTceSWe1oY+EeW3sc+Pp42sO++GHkg4wwhs=
138148
go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI=
149+
go.opentelemetry.io/proto/otlp v1.7.1 h1:gTOMpGDb0WTBOP8JaO72iL3auEZhVmAQg4ipjOVAtj4=
150+
go.opentelemetry.io/proto/otlp v1.7.1/go.mod h1:b2rVh6rfI/s2pHWNlB7ILJcRALpcNDzKhACevjI+ZnE=
139151
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=
140152
go.uber.org/goleak v1.3.0/go.mod h1:CoHD4mav9JJNrW/WLlf7HGZPjdw8EucARQHekz1X6bE=
141153
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
@@ -159,6 +171,8 @@ golang.org/x/net v0.0.0-20200625001655-4c5254603344/go.mod h1:/O7V0waA8r7cgGh81R
159171
golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA=
160172
golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU=
161173
golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
174+
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
175+
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
162176
golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
163177
golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
164178
golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
@@ -184,6 +198,8 @@ golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
184198
golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
185199
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
186200
golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
201+
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
202+
golang.org/x/text v0.28.0/go.mod h1:U8nCwOR8jO/marOQ0QbDiOngZVEBB7MAiitBuMjXiNU=
187203
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
188204
golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
189205
golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY=
@@ -195,13 +211,19 @@ golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8T
195211
golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
196212
golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
197213
golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
214+
gonum.org/v1/gonum v0.16.0 h1:5+ul4Swaf3ESvrOnidPp4GZbzf0mxVQpDCYUQE7OJfk=
215+
gonum.org/v1/gonum v0.16.0/go.mod h1:fef3am4MQ93R2HHpKnLk4/Tbh/s0+wqD5nfa6Pnwy4E=
198216
google.golang.org/appengine v1.1.0/go.mod h1:EbEs0AVv82hx2wNQdGPgUI5lhzA/G0D9YwlJXL52JkM=
199217
google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4=
200218
google.golang.org/genproto v0.0.0-20180817151627-c66870c02cf8/go.mod h1:JiN7NxoALGmiZfu7CAH4rXhgtRTLTxftemlI0sWmxmc=
201219
google.golang.org/genproto v0.0.0-20190819201941-24fa4b261c55/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc=
202220
google.golang.org/genproto v0.0.0-20200513103714-09dca8ec2884/go.mod h1:55QSHmfGQM9UVYDPBsyGGes0y52j32PQ3BqQfXhyH3c=
203221
google.golang.org/genproto v0.0.0-20200526211855-cb27e3aa2013/go.mod h1:NbSheEEYHJ7i3ixzK3sjbqSGDJWnxyFXZblF3eUsNvo=
204222
google.golang.org/genproto v0.0.0-20220503193339-ba3ae3f07e29/go.mod h1:RAyBrSAP7Fh3Nc84ghnVLDPuV51xc9agzmm4Ph6i0Q4=
223+
google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba h1:B14OtaXuMaCQsl2deSvNkyPKIzq3BjfxQp8d00QyWx4=
224+
google.golang.org/genproto/googleapis/api v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:G5IanEx8/PgI9w6CFcYQf7jMtHQhZruvfM1i3qOqk5U=
225+
google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba h1:UKgtfRM7Yh93Sya0Fo8ZzhDP4qBckrrxEr2oF5UIVb8=
226+
google.golang.org/genproto/googleapis/rpc v0.0.0-20251111163417-95abcf5c77ba/go.mod h1:7i2o+ce6H/6BluujYR+kqX3GKH+dChPTQU19wjRPiGk=
205227
google.golang.org/grpc v1.19.0/go.mod h1:mqu4LbDTu4XGKhr4mRzUsmM4RtVoemTSY81AxZiDr8c=
206228
google.golang.org/grpc v1.23.0/go.mod h1:Y5yQAOtifL1yxbo5wqy6BxZv8vAUGQwXBOALyacEbxg=
207229
google.golang.org/grpc v1.25.1/go.mod h1:c3i+UQWmh7LiEpx4sFZnkU36qjEYZ0imhYfXVyQciAY=
@@ -210,6 +232,8 @@ google.golang.org/grpc v1.33.1/go.mod h1:fr5YgcSWrqhRRxogOsw7RzIpsmvOZ6IcH4kBYTp
210232
google.golang.org/grpc v1.36.0/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU=
211233
google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM=
212234
google.golang.org/grpc v1.46.0/go.mod h1:vN9eftEi1UMyUsIF80+uQXhHjbXYbm0uXoFCACuMGWk=
235+
google.golang.org/grpc v1.75.0 h1:+TW+dqTd2Biwe6KKfhE5JpiYIBWq865PhKGSXiivqt4=
236+
google.golang.org/grpc v1.75.0/go.mod h1:JtPAzKiq4v1xcAB2hydNlWI2RnF85XXcV0mhKXr2ecQ=
213237
google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8=
214238
google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0=
215239
google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM=
@@ -223,6 +247,8 @@ google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp0
223247
google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
224248
google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc=
225249
google.golang.org/protobuf v1.28.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I=
250+
google.golang.org/protobuf v1.36.10 h1:AYd7cD/uASjIL6Q9LiTjz8JLcrh/88q5UObnmY3aOOE=
251+
google.golang.org/protobuf v1.36.10/go.mod h1:HTf+CrKn2C3g5S8VImy6tdcUvCska2kB7j23XfzDpco=
226252
gopkg.in/avro.v0 v0.0.0-20171217001914-a730b5802183/go.mod h1:FvqrFXt+jCsyQibeRv4xxEJBL5iG2DDW5aeJwzDiq4A=
227253
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
228254
gopkg.in/check.v1 v1.0.0-20180628173108-788fd7840127/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

examples/otel/otel.go

Lines changed: 29 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -16,35 +16,6 @@ import (
1616
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
1717
)
1818

19-
func initTracer() *sdktrace.TracerProvider {
20-
// 1. Create an OTel Exporter (e.g., Stdout, OTLP, Jaeger)
21-
// Here we use Stdout for demonstration
22-
exporter, err := stdouttrace.New(stdouttrace.WithPrettyPrint())
23-
if err != nil {
24-
log.Fatal(err)
25-
}
26-
27-
// 2. Create Resource (Metadata about your app)
28-
res, _ := resource.Merge(
29-
resource.Default(),
30-
resource.NewWithAttributes(
31-
semconv.SchemaURL,
32-
semconv.ServiceName("my-flowtracker-app"),
33-
),
34-
)
35-
36-
// 3. Create Tracer Provider
37-
tp := sdktrace.NewTracerProvider(
38-
sdktrace.WithBatcher(exporter),
39-
sdktrace.WithResource(res),
40-
)
41-
42-
// 4. Set as Global (Optional, but good practice)
43-
otel.SetTracerProvider(tp)
44-
45-
return tp
46-
}
47-
4819
func main() {
4920
// Setup OTel
5021
tp := initTracer()
@@ -74,3 +45,32 @@ func main() {
7445
log.Println("Server running on :8080")
7546
http.ListenAndServe(":8080", mw(mux))
7647
}
48+
49+
func initTracer() *sdktrace.TracerProvider {
50+
// 1. Create an OTel Exporter (e.g., Stdout, OTLP, Jaeger)
51+
// Here we use Stdout for demonstration
52+
exporter, err := stdouttrace.New(stdouttrace.WithPrettyPrint())
53+
if err != nil {
54+
log.Fatal(err)
55+
}
56+
57+
// 2. Create Resource (Metadata about your app)
58+
res, _ := resource.Merge(
59+
resource.Default(),
60+
resource.NewWithAttributes(
61+
semconv.SchemaURL,
62+
semconv.ServiceName("my-flowtracker-app"),
63+
),
64+
)
65+
66+
// 3. Create Tracer Provider
67+
tp := sdktrace.NewTracerProvider(
68+
sdktrace.WithBatcher(exporter),
69+
sdktrace.WithResource(res),
70+
)
71+
72+
// 4. Set as Global (Optional, but good practice)
73+
otel.SetTracerProvider(tp)
74+
75+
return tp
76+
}

examples/otlp/docker-compose.yaml

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
version: "3.8"
2+
3+
services:
4+
jaeger:
5+
image: docker.io/jaegertracing/all-in-one:latest
6+
container_name: jaeger
7+
environment:
8+
COLLECTOR_ZIPKIN_HOST_PORT: ":9411"
9+
ports:
10+
- "5775:5775/udp"
11+
- "6831:6831/udp"
12+
- "6832:6832/udp"
13+
- "5778:5778"
14+
- "16686:16686"
15+
- "14250:14250"
16+
- "14268:14268"
17+
- "14269:14269"
18+
- "4317:4317"
19+
- "4318:4318"
20+
- "9411:9411"
21+
restart: unless-stopped

examples/otlp/otlp.go

Lines changed: 93 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,93 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log"
6+
"net/http"
7+
"time"
8+
9+
"github.com/spdeepak/flowtracker"
10+
otelexporter "github.com/spdeepak/flowtracker/otel"
11+
12+
"go.opentelemetry.io/otel"
13+
"go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracehttp"
14+
"go.opentelemetry.io/otel/sdk/resource"
15+
sdktrace "go.opentelemetry.io/otel/sdk/trace"
16+
semconv "go.opentelemetry.io/otel/semconv/v1.17.0"
17+
)
18+
19+
func main() {
20+
ctx := context.Background()
21+
22+
// Initialize Tracer to Jaeger
23+
tp := initTracer(ctx)
24+
defer func() {
25+
// FLUSH data before exiting
26+
if err := tp.Shutdown(ctx); err != nil {
27+
log.Printf("Error shutting down tracer provider: %v", err)
28+
}
29+
}()
30+
31+
// Initialize the Bridge Addon
32+
bridgeExporter := otelexporter.New(tp)
33+
34+
// Use Middleware
35+
mw := flowtracker.NewMiddleware(flowtracker.WithExporter(bridgeExporter))
36+
37+
// Define Handler
38+
mux := http.NewServeMux()
39+
mux.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
40+
// Start FlowTracker Span
41+
ctx, finish := flowtracker.StartSpan(r.Context(), "ProcessRequest")
42+
43+
// Add tags (these will show up in Jaeger tags!)
44+
flowtracker.AddTag(ctx, "user.id", "12345")
45+
flowtracker.AddTag(ctx, "environment", "local-dev")
46+
47+
// Simulate work
48+
time.Sleep(50 * time.Millisecond)
49+
50+
// Nested Span
51+
_, subFinish := flowtracker.StartSpan(ctx, "DB:FetchUser")
52+
time.Sleep(200 * time.Millisecond)
53+
subFinish()
54+
55+
finish()
56+
w.Write([]byte("Trace sent to Jaeger! Check http://localhost:16686"))
57+
})
58+
59+
log.Println("Server running on :8080")
60+
log.Println("Visit localhost:16686 to see the Jaeger UI")
61+
http.ListenAndServe(":8080", mw(mux))
62+
}
63+
64+
func initTracer(ctx context.Context) *sdktrace.TracerProvider {
65+
// 1. Create the OTLP HTTP Exporter
66+
// Jaeger accepts OTLP over HTTP on port 4318 by default.
67+
// We use "Insecure" because we are running locally without TLS.
68+
exporter, err := otlptracehttp.New(ctx,
69+
otlptracehttp.WithEndpoint("localhost:4318"),
70+
otlptracehttp.WithInsecure(),
71+
)
72+
if err != nil {
73+
log.Fatalf("Failed to create exporter: %v", err)
74+
}
75+
76+
// 2. Define Resource (Service Name appears in Jaeger)
77+
res, _ := resource.Merge(
78+
resource.Default(),
79+
resource.NewWithAttributes(
80+
semconv.SchemaURL,
81+
semconv.ServiceName("my-flowtracker-service"), // <--- Look for this in Jaeger dropdown
82+
),
83+
)
84+
85+
// 3. Create Provider
86+
tp := sdktrace.NewTracerProvider(
87+
sdktrace.WithBatcher(exporter),
88+
sdktrace.WithResource(res),
89+
)
90+
91+
otel.SetTracerProvider(tp)
92+
return tp
93+
}

0 commit comments

Comments
 (0)