如何解决在整个生命周期中跟踪请求……通过 Docker 容器? Traefik:入口控制器Jaeger:开放追踪/开放遥测
跟踪使查找代码中的部分变得更加容易,值得开发人员花费时间和精力。出于这个原因,我将 Jaeger 作为跟踪器附加到 Docker 容器内的一组微服务。我使用 Traefik 作为入口控制器/服务网格来路由和代理请求。
我面临的问题是,Traefik 中的 tracing
配置有问题。 Jaeger 无法找到将单个/服务相关跨度连接到整个跟踪的跨度上下文。
日志中出现以下行:
{
"level":"debug","middlewareName":"tracing","middlewareType":"TracingEntryPoint","msg":"Failed to extract the context: opentracing: SpanContext not found in Extract carrier","time":"2021-02-02T23:16:51+01:00"
}
到目前为止我尝试/搜索/确认的内容:
- 我已经检查了端口(它们在 Docker 主机网络内打开)并且一切都可以访问。所以互连性不是这里的问题。
- 标头的转发是通过 Docker Compose
labels
:loadbalancer.passhostheader=true
设置的。
以下片段描述了 Docker Compose 设置。
Traefik:入口控制器
这是一个精简版的 traefik 容器。
# Network
ROOT_DOMAIN=example.test
DEFAULT_NETWORK=traefik
---
version: '3'
services:
image: "traefik:2.4.2"
hostname: "controller"
restart: on-failure
security_opt:
- no-new-privileges:true
ports:
- "443:443"
- "80:80"
# The Web UI (enabled by --api.insecure=true)
- "8080:8080"
- "8082:8082"
- "8083:8083"
networks:
- default
working_dir: /etc/traefik
volumes:
- /private/etc/localtime:/etc/localtime:ro
- ${PWD}/controller/static.yml:/etc/traefik/traefik.yml:ro
- ${PWD}/controller/dynamic.yml:/etc/traefik/dynamic.yml:ro
- /var/run/docker.sock:/var/run/docker.sock:ro
- cert-storage:/usr/local/share/ca-certificates:ro
- ${PWD}/logs/traefik:/var/log/traefik
volumes:
cert-storage:
driver_opts:
type: none
o: bind
device: ${PWD}/certs/certs
networks:
default:
external: true
name: ${DEFAULT_NETWORK}
Traefik 是使用 file provider 作为基础和 Docker Compose 标签来设置的:
# static.yaml (Traefik conf)
debug: true
log:
level: DEBUG
filePath: /var/log/traefik/error.log
format: json
serversTransport:
insecureSkipVerify: true
api:
dashboard: true
insecure: true
debug: true
providers:
docker:
exposedByDefault: false
swarmMode: false
watch: true
defaultRule: "Host(`{{ normalize .Name }}.example.test`)"
endpoint: "unix:///var/run/docker.sock"
network: traefik
file:
filename: /etc/traefik/dynamic.yml
watch: true
tracing:
serviceName: "controller"
spanNameLimit: 250
jaeger:
samplingType: const
samplingParam: 1.0
samplingServerURL: http://tracer:5778/sampling
localAgentHostPort: 127.0.0.1:6831
gen128Bit: true
propagation: jaeger
traceContextHeaderName: "traefik-trace-id"
collector:
endpoint: http://tracer:14268/api/traces?format=jaeger.thrift
Jaeger:开放追踪/开放遥测
---
version: '3'
services:
tracer:
image: "jaegertracing/all-in-one:1.21.0"
hostname: "tracer"
command:
- "--log-level=info"
- "--admin.http.host-port=:14269"
- "--query.ui-config=/usr/local/share/jaeger/ui/conf.json"
environment:
SPAN_STORAGE_TYPE: memory
restart: on-failure
security_opt:
- no-new-privileges:true
expose:
- 5775/udp
- 6831/udp
- 6832/udp
- 5778
- 14250
- 14268
- 14269
- 14271
- 16686
- 16687
volumes:
- /private/etc/localtime:/etc/localtime:ro
- ${PWD}/tracer/conf:/usr/local/share/jaeger
- ${PWD}/logs/jaeger:/var/log/@TODO
- cert-storage:/usr/local/share/ca-certificates
networks:
- default
labels:
- "traefik.enable=true"
- "traefik.docker.network=${DEFAULT_NETWORK}"
# Admin UI router
- "traefik.http.routers.tracer-router.rule=Host(`tracer.$ROOT_DOMAIN`)"
- "traefik.http.routers.tracer-router.entrypoints=https"
- "traefik.http.routers.tracer-router.tls=true"
- "traefik.http.routers.tracer-router.tls.options=default"
- "traefik.http.routers.tracer-router.service=tracer"
# Service/ Load Balancer
- "traefik.http.services.tracer.loadbalancer.passhostheader=true"
- "traefik.http.services.tracer.loadbalancer.server.port=16686"
- "traefik.http.services.tracer.loadbalancer.server.scheme=http"
解决方法
我不能 100% 确定您遇到的问题是什么,但有一些事情需要考虑。
根据this post on the Traefik forums,您看到的消息是debug
级,因为这不是您应该担心的事情。它只是记录没有找到跟踪上下文,因此将创建一个新的。第二部分不在消息中,但显然就是这样。
您应该检查是否在 Jaeger 中获取数据。如果是的话,那条消息可能没什么好担心的。
如果你在 Jaeger 中获取数据,但它没有连接,那是因为 Traefik 只能处理已经在入站请求中的跟踪上下文,但它不能向出站请求添加跟踪上下文。在您的应用程序中,您需要实现跟踪传播,以便您的出站请求包含作为传入请求的一部分接收的跟踪上下文。如果不这样做,每个请求都将在没有跟踪上下文的情况下发送,并在下一个 Traefik 入口点收到时开始新的跟踪。
,问题实际上出在 traceContextHeaderName
上。遗憾的是,我无法确切地说出问题是什么,因为 git diff
仅显示在我修复它时 traefik 和 jaeger 周围没有任何变化。我认为配置以某种方式“卡住”了。我找到了 related lines in source,但由于我不是 Go-Dev,所以我只能猜测是否存在错误。
我所做的是切换回 uber-trace-id
,它神奇地“修复”了它。在我运行了一些跟踪并连接了另一个服务(节点,npm jaeger-client
,其中 process.env.TRACER_STATE_HEADER_NAME
设置为相同的值)之后,我切换回 traefik-trace-id
并且一切正常。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。