Skip to content

Commit 9070a20

Browse files
committed
chore: improve OpenTelemetry example
1 parent f6940c8 commit 9070a20

File tree

6 files changed

+459
-24
lines changed

6 files changed

+459
-24
lines changed

example/otel/README.md

Lines changed: 20 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,40 +1,47 @@
11
# Example for go-redis OpenTelemetry instrumentation
22

3+
This example demonstrates how to monitor Redis using OpenTelemetry and
4+
[Uptrace](https://github.com/uptrace/uptrace). It requires Docker to start Redis Server and Uptrace.
5+
36
See
47
[Monitoring Go Redis Performance and Errors](https://redis.uptrace.dev/guide/go-redis-monitoring.html)
58
for details.
69

7-
This example requires Redis Server on port `:6379`. You can start Redis Server using Docker:
10+
**Step 1**. Download the example using Git:
811

912
```shell
10-
docker-compose up -d
13+
git clone https://github.com/go-redis/redis.git
14+
cd example/otel
1115
```
1216

13-
You can run this example with different OpenTelemetry exporters by providing environment variables.
14-
15-
**Stdout** exporter (default):
17+
**Step 2**. Start the services using Docker:
1618

1719
```shell
18-
go run .
20+
docker-compose pull
21+
docker-compose up -d
1922
```
2023

21-
[Uptrace](https://github.com/uptrace/uptrace) exporter:
24+
**Step 3**. Make sure Uptrace is running:
2225

2326
```shell
24-
UPTRACE_DSN="https://<token>@uptrace.dev/<project_id>" go run .
27+
docker-compose logs uptrace
2528
```
2629

27-
**Jaeger** exporter:
30+
**Step 4**. Run the Redis client example:
2831

2932
```shell
30-
OTEL_EXPORTER_JAEGER_ENDPOINT=http://localhost:14268/api/traces go run .
33+
UPTRACE_DSN=http://project2_secret_token@localhost:14317/2 go run client.go
3134
```
3235

33-
To instrument Redis Cluster client, see
34-
[go-redis-cluster](https://github.com/uptrace/opentelemetry-go-extra/tree/main/example/go-redis-cluster)
35-
example.
36+
**Step 5**. Follow the link from the CLI to view the trace:
37+
38+
```shell
39+
UPTRACE_DSN=http://project2_secret_token@localhost:14317/2 go run client.go
40+
trace: http://localhost:14318/traces/ee029d8782242c8ed38b16d961093b35
41+
```
3642

3743
## Links
3844

45+
- [Uptrace open-source APM](https://uptrace.dev/get/open-source-apm.html)
3946
- [OpenTelemetry Go instrumentations](https://uptrace.dev/opentelemetry/instrumentations/?lang=go)
4047
- [OpenTelemetry Go Tracing API](https://uptrace.dev/opentelemetry/go-tracing.html)

example/otel/main.go renamed to example/otel/client.go

Lines changed: 29 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,41 +2,59 @@ package main
22

33
import (
44
"context"
5+
"fmt"
56
"log"
67
"sync"
8+
"time"
79

8-
"github.com/uptrace/opentelemetry-go-extra/otelplay"
10+
"github.com/uptrace/uptrace-go/uptrace"
911
"go.opentelemetry.io/otel"
1012
"go.opentelemetry.io/otel/codes"
1113

1214
"github.com/go-redis/redis/extra/redisotel/v9"
1315
"github.com/go-redis/redis/v9"
1416
)
1517

16-
var tracer = otel.Tracer("redisexample")
18+
var tracer = otel.Tracer("github.com/go-redis/redis/example/otel")
1719

1820
func main() {
1921
ctx := context.Background()
2022

21-
shutdown := otelplay.ConfigureOpentelemetry(ctx)
22-
defer shutdown()
23+
uptrace.ConfigureOpentelemetry(
24+
// copy your project DSN here or use UPTRACE_DSN env var
25+
// uptrace.WithDSN("https://[email protected]/1"),
26+
27+
uptrace.WithServiceName("myservice"),
28+
uptrace.WithServiceVersion("v1.0.0"),
29+
)
30+
defer uptrace.Shutdown(ctx)
2331

2432
rdb := redis.NewClient(&redis.Options{
2533
Addr: ":6379",
2634
})
2735
if err := redisotel.InstrumentTracing(rdb); err != nil {
2836
panic(err)
2937
}
38+
if err := redisotel.InstrumentMetrics(rdb); err != nil {
39+
panic(err)
40+
}
3041

31-
ctx, span := tracer.Start(ctx, "handleRequest")
32-
defer span.End()
42+
for i := 0; i < 1e6; i++ {
43+
ctx, rootSpan := tracer.Start(ctx, "handleRequest")
3344

34-
if err := handleRequest(ctx, rdb); err != nil {
35-
span.RecordError(err)
36-
span.SetStatus(codes.Error, err.Error())
37-
}
45+
if err := handleRequest(ctx, rdb); err != nil {
46+
rootSpan.RecordError(err)
47+
rootSpan.SetStatus(codes.Error, err.Error())
48+
}
3849

39-
otelplay.PrintTraceID(ctx)
50+
rootSpan.End()
51+
52+
if i == 0 {
53+
fmt.Printf("view trace: %s\n", uptrace.TraceURL(rootSpan))
54+
}
55+
56+
time.Sleep(time.Second)
57+
}
4058
}
4159

4260
func handleRequest(ctx context.Context, rdb *redis.Client) error {

example/otel/docker-compose.yml

Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,65 @@
11
version: '3'
22

33
services:
4+
clickhouse:
5+
image: clickhouse/clickhouse-server:22.7
6+
restart: on-failure
7+
environment:
8+
CLICKHOUSE_DB: uptrace
9+
healthcheck:
10+
test: ['CMD', 'wget', '--spider', '-q', 'localhost:8123/ping']
11+
interval: 1s
12+
timeout: 1s
13+
retries: 30
14+
volumes:
15+
- ch_data:/var/lib/clickhouse
16+
ports:
17+
- '8123:8123'
18+
- '9000:9000'
19+
20+
uptrace:
21+
image: 'uptrace/uptrace:latest'
22+
#image: 'uptrace/uptrace-dev:latest'
23+
volumes:
24+
- uptrace_data:/var/lib/uptrace
25+
- ./uptrace.yml:/etc/uptrace/uptrace.yml
26+
#environment:
27+
# - DEBUG=2
28+
ports:
29+
- '14317:14317'
30+
- '14318:14318'
31+
depends_on:
32+
clickhouse:
33+
condition: service_healthy
34+
35+
otel-collector:
36+
image: otel/opentelemetry-collector-contrib:0.58.0
37+
restart: on-failure
38+
user: '0:0' # required for logs
39+
volumes:
40+
- ./otel-collector.yaml:/etc/otelcol-contrib/config.yaml
41+
- /var/lib/docker/containers:/var/lib/docker/containers:ro
42+
- /var/log:/var/log:ro
43+
ports:
44+
- '4317:4317'
45+
- '4318:4318'
46+
47+
vector:
48+
image: timberio/vector:0.24.X-alpine
49+
volumes:
50+
- ./vector.toml:/etc/vector/vector.toml:ro
51+
452
redis-server:
553
image: redis
654
ports:
755
- '6379:6379'
856
redis-cli:
957
image: redis
58+
59+
volumes:
60+
uptrace_data:
61+
driver: local
62+
ch_data:
63+
driver: local
64+
alertmanager_data:
65+
driver: local

example/otel/otel-collector.yaml

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,68 @@
1+
extensions:
2+
health_check:
3+
pprof:
4+
endpoint: 0.0.0.0:1777
5+
zpages:
6+
endpoint: 0.0.0.0:55679
7+
8+
receivers:
9+
otlp:
10+
protocols:
11+
grpc:
12+
http:
13+
hostmetrics:
14+
collection_interval: 10s
15+
scrapers:
16+
cpu:
17+
disk:
18+
load:
19+
filesystem:
20+
memory:
21+
network:
22+
paging:
23+
redis:
24+
endpoint: 'redis-server:6379'
25+
collection_interval: 10s
26+
jaeger:
27+
protocols:
28+
grpc:
29+
30+
processors:
31+
resourcedetection:
32+
detectors: ['system']
33+
batch:
34+
send_batch_size: 10000
35+
timeout: 10s
36+
37+
exporters:
38+
logging:
39+
logLevel: debug
40+
otlp:
41+
endpoint: uptrace:14317
42+
tls:
43+
insecure: true
44+
headers: { 'uptrace-dsn': 'http://project2_secret_token@localhost:14317/2' }
45+
46+
service:
47+
# telemetry:
48+
# logs:
49+
# level: DEBUG
50+
pipelines:
51+
traces:
52+
receivers: [otlp, jaeger]
53+
processors: [batch]
54+
exporters: [otlp, logging]
55+
metrics:
56+
receivers: [otlp]
57+
processors: [batch]
58+
exporters: [otlp]
59+
metrics/hostmetrics:
60+
receivers: [hostmetrics, redis]
61+
processors: [batch, resourcedetection]
62+
exporters: [otlp]
63+
logs:
64+
receivers: [otlp]
65+
processors: [batch]
66+
exporters: [otlp]
67+
68+
extensions: [health_check, pprof, zpages]

0 commit comments

Comments
 (0)