Skip to content

Commit 8a9e505

Browse files
committed
Merge branch 'feat/distributed-tracing'
Add OpenTelemetry tracing configuration guide
2 parents ef2e1a2 + 768ffb8 commit 8a9e505

3 files changed

Lines changed: 118 additions & 14 deletions

File tree

docs/tracing.md

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,104 @@
1+
# Distributed Tracing Configuration
2+
3+
Nantian Gateway supports OpenTelemetry distributed tracing via OTLP (gRPC).
4+
5+
## Control Plane
6+
7+
Enable tracing in the control plane config:
8+
9+
```yaml
10+
tracing:
11+
enabled: true
12+
endpoint: "otel-collector:4317"
13+
insecure: true
14+
samplerRatio: 0.1
15+
headers:
16+
x-api-key: "my-key"
17+
```
18+
19+
| Field | Type | Default | Description |
20+
|---|---|---|---|
21+
| `enabled` | bool | `false` | Enable OTLP tracing |
22+
| `endpoint` | string | — | OTLP gRPC collector endpoint |
23+
| `insecure` | bool | `false` | Use plaintext (no TLS) |
24+
| `samplerRatio` | float | `1.0` | Sampling ratio (0.0—1.0) |
25+
| `headers` | map | — | Custom gRPC metadata headers |
26+
27+
### Instrumented Operations
28+
29+
| Span Name | Component | Attributes |
30+
|---|---|---|
31+
| `admin GET/POST /v1/...` | HTTP Admin | http.method, http.route, http.status_code |
32+
| `controlplane.syncer.publish_snapshot` | Controller | scope, gateway/route/backend counts |
33+
| `controlplane.infrastructure.reconcile` | Infrastructure | managed_gateways, service/endpoint counts |
34+
| gRPC server spans | otelgrpc | rpc.service, rpc.method |
35+
36+
## Data Plane
37+
38+
Enable tracing in the data plane config:
39+
40+
```yaml
41+
observability:
42+
tracing:
43+
level: "info"
44+
format: "json"
45+
open_telemetry:
46+
enabled: true
47+
endpoint: "http://otel-collector:4317"
48+
protocol: "grpc"
49+
timeout_ms: 3000
50+
insecure: true
51+
sample_ratio: 0.1
52+
service_name: "nantian-dataplane"
53+
service_namespace: "production"
54+
service_instance_id: "dp-01"
55+
```
56+
57+
| Field | Type | Default | Description |
58+
|---|---|---|---|
59+
| `enabled` | bool | `false` | Enable OTLP tracing |
60+
| `endpoint` | string | — | OTLP collector URL |
61+
| `protocol` | string | `grpc` | OTLP protocol |
62+
| `sample_ratio` | float | `1.0` | Sampling ratio |
63+
| `service_name` | string | `nantian-dataplane` | Service name in traces |
64+
65+
### Instrumented Operations
66+
67+
| Span Name | Component | Attributes |
68+
|---|---|---|
69+
| Request span (auto) | Proxy | http.method, url.path, client.address, server.address |
70+
| Request enriched | Proxy | gateway.listener, route.name/namespace/kind, backend |
71+
| Response enriched | Proxy | http.status_code, retry.attempts, response_flags |
72+
| `ai.inference` | AI Gateway | ai.model, ai.format, ai.stream, prompt_tokens, completion_tokens |
73+
| `ai.first_token` | AI Gateway | ai.first_token_ms |
74+
75+
### W3C Trace Context Propagation
76+
77+
- Incoming `traceparent` headers are extracted and continued
78+
- Outgoing `traceparent` headers are injected to upstream backends
79+
- gRPC xDS streams propagate trace context (via otelgrpc)
80+
81+
## End-to-End Trace Flow
82+
83+
```
84+
Client Request (traceparent)
85+
→ Data Plane Proxy (extract + continue)
86+
→ AI Gateway Filter (child span: ai.inference)
87+
→ Upstream Backend (inject traceparent)
88+
← Data Plane Proxy (enrich + end)
89+
```
90+
91+
Control plane reconciliation traces independently:
92+
```
93+
CRD Change Event
94+
→ Controller Reconciler (span: publish_snapshot)
95+
→ Infrastructure Reconciler (span: reconcile)
96+
→ gRPC xDS Push (span: otelgrpc)
97+
```
98+
99+
## Viewing Traces
100+
101+
Use any OTLP-compatible backend:
102+
- **Jaeger**: `jaeger-all-in-one` with OTLP gRPC on port 4317
103+
- **Grafana Tempo**: OTLP endpoint
104+
- **OpenTelemetry Collector**: Forward to any backend

go.mod

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@ require (
99
github.com/prometheus/client_model v0.6.2
1010
github.com/stretchr/testify v1.11.1
1111
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0
12-
go.opentelemetry.io/otel v1.43.0
12+
go.opentelemetry.io/otel v1.44.0
1313
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0
14-
go.opentelemetry.io/otel/sdk v1.43.0
14+
go.opentelemetry.io/otel/sdk v1.44.0
1515
go.uber.org/goleak v1.3.0
1616
golang.org/x/net v0.55.0
1717
golang.org/x/sync v0.21.0
@@ -66,8 +66,8 @@ require (
6666
github.com/x448/float16 v0.8.4 // indirect
6767
go.opentelemetry.io/auto/sdk v1.2.1 // indirect
6868
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 // indirect
69-
go.opentelemetry.io/otel/metric v1.43.0 // indirect
70-
go.opentelemetry.io/otel/trace v1.43.0 // indirect
69+
go.opentelemetry.io/otel/metric v1.44.0 // indirect
70+
go.opentelemetry.io/otel/trace v1.44.0 // indirect
7171
go.opentelemetry.io/proto/otlp v1.9.0 // indirect
7272
go.uber.org/multierr v1.11.0 // indirect
7373
go.uber.org/zap v1.27.1 // indirect

go.sum

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -117,20 +117,20 @@ go.opentelemetry.io/auto/sdk v1.2.1 h1:jXsnJ4Lmnqd11kwkBV2LgLoFMZKizbCi5fNZ/ipaZ
117117
go.opentelemetry.io/auto/sdk v1.2.1/go.mod h1:KRTj+aOaElaLi+wW1kO/DZRXwkF4C5xPbEe3ZiIhN7Y=
118118
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0 h1:XmiuHzgJt067+a6kwyAzkhXooYVv3/TOw9cM2VfJgUM=
119119
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.65.0/go.mod h1:KDgtbWKTQs4bM+VPUr6WlL9m/WXcmkCcBlIzqxPGzmI=
120-
go.opentelemetry.io/otel v1.43.0 h1:mYIM03dnh5zfN7HautFE4ieIig9amkNANT+xcVxAj9I=
121-
go.opentelemetry.io/otel v1.43.0/go.mod h1:JuG+u74mvjvcm8vj8pI5XiHy1zDeoCS2LB1spIq7Ay0=
120+
go.opentelemetry.io/otel v1.44.0 h1:JjwHmHpA4iZ3wBxluu2fbbE7j4kqlE8jXyAyPXH7HqU=
121+
go.opentelemetry.io/otel v1.44.0/go.mod h1:BMgjTHL9WPRlRjL2oZCBTL4whCGtXch2H4BhOPIAyYc=
122122
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0 h1:QKdN8ly8zEMrByybbQgv8cWBcdAarwmIPZ6FThrWXJs=
123123
go.opentelemetry.io/otel/exporters/otlp/otlptrace v1.40.0/go.mod h1:bTdK1nhqF76qiPoCCdyFIV+N/sRHYXYCTQc+3VCi3MI=
124124
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0 h1:DvJDOPmSWQHWywQS6lKL+pb8s3gBLOZUtw4N+mavW1I=
125125
go.opentelemetry.io/otel/exporters/otlp/otlptrace/otlptracegrpc v1.40.0/go.mod h1:EtekO9DEJb4/jRyN4v4Qjc2yA7AtfCBuz2FynRUWTXs=
126-
go.opentelemetry.io/otel/metric v1.43.0 h1:d7638QeInOnuwOONPp4JAOGfbCEpYb+K6DVWvdxGzgM=
127-
go.opentelemetry.io/otel/metric v1.43.0/go.mod h1:RDnPtIxvqlgO8GRW18W6Z/4P462ldprJtfxHxyKd2PY=
128-
go.opentelemetry.io/otel/sdk v1.43.0 h1:pi5mE86i5rTeLXqoF/hhiBtUNcrAGHLKQdhg4h4V9Dg=
129-
go.opentelemetry.io/otel/sdk v1.43.0/go.mod h1:P+IkVU3iWukmiit/Yf9AWvpyRDlUeBaRg6Y+C58QHzg=
130-
go.opentelemetry.io/otel/sdk/metric v1.43.0 h1:S88dyqXjJkuBNLeMcVPRFXpRw2fuwdvfCGLEo89fDkw=
131-
go.opentelemetry.io/otel/sdk/metric v1.43.0/go.mod h1:C/RJtwSEJ5hzTiUz5pXF1kILHStzb9zFlIEe85bhj6A=
132-
go.opentelemetry.io/otel/trace v1.43.0 h1:BkNrHpup+4k4w+ZZ86CZoHHEkohws8AY+WTX09nk+3A=
133-
go.opentelemetry.io/otel/trace v1.43.0/go.mod h1:/QJhyVBUUswCphDVxq+8mld+AvhXZLhe+8WVFxiFff0=
126+
go.opentelemetry.io/otel/metric v1.44.0 h1:1w0gILTcHdr3YI+ixLyjemwrVnsMURbTZFrSYCdDdmc=
127+
go.opentelemetry.io/otel/metric v1.44.0/go.mod h1:8O7hanEPBNgEMmybD3s2VBKcgWOCsA6tzHBPODAiquo=
128+
go.opentelemetry.io/otel/sdk v1.44.0 h1:nHYwb9lK+fJPU/dnT6s7W7Z8itMWyqrnVfbheVYrZ58=
129+
go.opentelemetry.io/otel/sdk v1.44.0/go.mod h1:Osuydd3Se74nqjAKxid74N5eC+jfEqfTegHRnq58oK0=
130+
go.opentelemetry.io/otel/sdk/metric v1.44.0 h1:3LlKgI+VjbVsjNRFZJZAJ30WjXC5VkNRks6si09iEfI=
131+
go.opentelemetry.io/otel/sdk/metric v1.44.0/go.mod h1:5B5pMARnXxKhltooO4xUuCBorl65a4EpnTalObqOigA=
132+
go.opentelemetry.io/otel/trace v1.44.0 h1:jxF5CsGYCe74MCRx2X4g7WsY/VBKRqqpNvXlX/6gtIk=
133+
go.opentelemetry.io/otel/trace v1.44.0/go.mod h1:oLl1jrMQAVo6v3GAggN+1VH9VIz9iUSvW53sW1Q8PIE=
134134
go.opentelemetry.io/proto/otlp v1.9.0 h1:l706jCMITVouPOqEnii2fIAuO3IVGBRPV5ICjceRb/A=
135135
go.opentelemetry.io/proto/otlp v1.9.0/go.mod h1:xE+Cx5E/eEHw+ISFkwPLwCZefwVjY+pqKg1qcK03+/4=
136136
go.uber.org/goleak v1.3.0 h1:2K3zAYmnTNqV73imy9J1T3WC+gmCePx2hEGkimedGto=

0 commit comments

Comments
 (0)