Skip to main content
Version: 3.10.x

a7-plugin-zipkin

Overview

The zipkin plugin sends distributed traces to Zipkin-compatible collectors using the Zipkin v2 HTTP API. It supports B3 propagation headers for trace context across services. Compatible backends include Zipkin, Jaeger, and SkyWalking (via Zipkin receiver).

When to Use

  • Distributed tracing with Zipkin, Jaeger, or compatible collectors
  • B3 header propagation across microservices
  • Per-request sampling control via headers
  • Trace ID injection into access logs

Plugin Configuration Reference

FieldTypeRequiredDefaultDescription
endpointstringYesZipkin collector URL (e.g. http://zipkin:9411/api/v2/spans)
sample_rationumberYesSampling rate from 0.00001 to 1
service_namestringNo"APISIX"Service name in Zipkin UI
server_addrstringNo$server_addrIPv4 address for span reporting
span_versionintegerNo2Span format: 1 (legacy) or 2 (default)

B3 Propagation Headers

The plugin uses B3 propagation format:

Injected to upstream

HeaderDescription
x-b3-traceidTrace ID (16 or 32 hex chars)
x-b3-spanidSpan ID (16 hex chars)
x-b3-parentspanidParent span ID
x-b3-sampledSampling decision (1 or 0)

Extracted from client

HeaderDescription
b3Single-header format: {traceid}-{spanid}-{sampled}-{parentspanid}
x-b3-sampled1 = force sample, 0 = skip, d = debug
x-b3-flags1 = force debug sampling

Clients can override sampling per-request by setting x-b3-sampled: 1.

Step-by-Step: Enable Zipkin Tracing

1. Create a service and route with zipkin

Replace <gateway-group-id> with the ID returned by a7 gateway-group list -o json, then enable tracing:

a7 service create --gateway-group <gateway-group-id> -f - <<'EOF'
{
"id": "traced-api-service",
"name": "Traced API service",
"upstream": {
"type": "roundrobin",
"nodes": [{"host": "backend", "port": 8080, "weight": 1}]
}
}
EOF

a7 route create --gateway-group <gateway-group-id> -f - <<'EOF'
{
"id": "traced-api",
"name": "Traced API route",
"paths": ["/api/*"],
"service_id": "traced-api-service",
"plugins": {
"zipkin": {
"endpoint": "http://zipkin:9411/api/v2/spans",
"sample_ratio": 1,
"service_name": "my-gateway",
"span_version": 2
}
}
}
EOF

2. Send a request

curl http://localhost:9080/api/hello

3. View traces in Zipkin UI

Open the Zipkin UI and search for service my-gateway.

Common Patterns

Send traces to Jaeger

Jaeger supports the Zipkin v2 API:

{
"plugins": {
"zipkin": {
"endpoint": "http://jaeger-collector:9411/api/v2/spans",
"sample_ratio": 1,
"service_name": "my-gateway"
}
}
}

Production sampling (10%)

{
"plugins": {
"zipkin": {
"endpoint": "http://zipkin:9411/api/v2/spans",
"sample_ratio": 0.1,
"service_name": "production-gateway"
}
}
}

Enable globally via Global Rule

Do not set an id in the create payload. The CLI derives the Global Rule ID from the plugin name.

a7 global-rule create --gateway-group <gateway-group-id> -f - <<'EOF'
{
"plugins": {
"zipkin": {
"endpoint": "http://zipkin:9411/api/v2/spans",
"sample_ratio": 0.5,
"service_name": "prod-gateway"
}
}
}
EOF

Troubleshooting

SymptomCauseFix
No traces in Zipkin UIWrong endpoint URLVerify collector is reachable; must include /api/v2/spans
Traces not connectedB3 headers strippedEnsure intermediate proxies forward x-b3-* headers
All requests sampledsample_ratio: 1Lower for production (e.g. 0.01-0.1)
400 from collectorSpan version mismatchTry span_version: 1 if collector only supports v1
Config not appliedWrong gateway group specifiedEnsure --gateway-group matches the desired cluster

Config Sync Example

Save the following as zipkin.yaml:

version: "1"
services:
- id: traced-api-service
name: Traced API service
upstream:
type: roundrobin
nodes:
- host: backend
port: 8080
weight: 1
routes:
- id: traced-api
name: Traced API route
paths:
- /api/*
service_id: traced-api-service
plugins:
zipkin:
endpoint: http://zipkin:9411/api/v2/spans
sample_ratio: 1
service_name: my-gateway
span_version: 2

Validate and apply this partial configuration to the target gateway group:

a7 config validate -f zipkin.yaml
a7 config sync -g <gateway-group-id> -f zipkin.yaml --delete=false

Disabling deletion preserves resources that are not included in this partial configuration.


This page is generated from a7-plugin-zipkin/SKILL.md in the api7/a7 repository. Browse all skills on the AI Agent Skills page.