分布式追踪系统Jaeger介绍.md
一、概述
Jaeger 是 Uber 公司开源的一个用于监视和诊断基于微服务的分布式系统。类似的软件还有zipkin、Skywalking等。
这里我们就不谈trace和span的概念了,本站另一篇文章有介绍。
我们主要谈下部署和实施的问题。
二、Jaeger的软件架构
Jaeger的软件架构图如下
主要部件是jaeger-agent、jaeger-collector用来收集数据
DB用来存储,目前官方支持ElasticSearch和Cassandra
jaeger-query用于查询和展示数据。
三、使用DockerCompose部署Jaeger
jaeger使用go语言编写,没什么安装步骤,下载下来就能用,一般我们都是用docker-compose方式部署。我们的配置文件如下,数据库选择了我们较为熟悉的ES
version: "3"
services:
# 即便设置了依赖关系, 让 es 先于其他容器启动,也会因为 es 容器启动成功但 es 服务本身初始化过慢问题导致 collector 和 query 在这段期间内连不上 es 而挂掉(agent不会挂,只是连不上collector)
# 解决方式:把 collector, agent, query 的重启策略改为 on-failure。 等 es 初始化成功后, collector,agent,query 也会在多次重启后趋于稳定
es:
image: "elasticsearch:7.16.2"
ports:
- "9200:9200"
- "9300:9300"
environment:
- "ES_JAVA_OPTS=-Xms4096m -Xmx4096m"
- "discovery.type=single-node"
- "xpack.security.enabled=false"
volumes:
# 这里注意,把ES数据写到宿主磁盘上,防止重启丢数据
- "/data/apps/jaeger/es:/usr/share/elasticsearch/data"
kibana:
image: "kibana:7.10.1"
ports:
- "5601:5601"
environment:
ELASTICSEARCH_HOSTS: http://es:9200
jaeger-agent:
image: "jaegertracing/jaeger-agent"
ports:
- "5775:5775/udp"
- "6831:6831/udp"
- "6832:6832/udp"
- "5778:5778"
command: ["--reporter.grpc.host-port=jaeger-collector:14250"]
restart: on-failure
depends_on:
- jaeger-collector
jaeger-collector:
image: "jaegertracing/jaeger-collector"
ports:
- "14269"
- "14268:14268"
- "14250"
- "9411:9411"
environment:
- "SPAN_STORAGE_TYPE=elasticsearch"
- "ES_SERVER_URLS=http://es:9200"
# tags 也作为field,便于在 es 中进行聚合分析时根据 tag 分析
- "ES_TAGS_AS_FIELDS_ALL=true"
depends_on:
- es
restart: on-failure
jaeger-query:
image: "jaegertracing/jaeger-query"
ports:
- "16686:16686"
- "16687"
environment:
- "SPAN_STORAGE_TYPE=elasticsearch"
- "ES_SERVER_URLS=http://es:9200"
# 根据 https://github.com/jaegertracing/jaeger/issues/2083
# jaeger query 默认会把自身的 span 抛给 agent ,所以也要配置 agent 变量
- "JAEGER_AGENT_HOST=jaeger-collector"
- "JAEGER_AGENT_PORT=6381"
command: ["--es.max-span-age=168h"]
restart: on-failure
depends_on:
- jaeger-agent
- jaeger-collector
- es
然后我们在浏览器打开16686端口就可以看到Jaeger的界面了。
四、【坑】超过2天的数据无法查询了
我们周五测试的数据,发现周一就看不了了,发现原来是官方有个默认设置。
jaeger by default queries data no older than 72h. This can be changed by the following flag:
--es.max-span-age duration The maximum lookback for spans in ElasticSearch (default 72h0m0s)
如上,官方说最多查询72小时,可以使用上面的参数修改。
五、使用阿里云SLS取代ES
阿里云自己开发了插件,地址是 https://github.com/aliyun/aliyun-log-jaeger (查看源码需要切换分支), 目前没有合并到jaeger官方。我们的compose文件如下。
version: '2'
services:
jaeger-collector:
image: registry.cn-hangzhou.aliyuncs.com/jaegertracing/jaeger-collector:0.3.1
environment:
- SPAN_STORAGE_TYPE=aliyun-log-otel
command: ["/go/bin/collector-linux", "--aliyun-log.project=${PROJECT}", "--aliyun-log.endpoint=${ENDPOINT}", "--aliyun-log.access-key-id=${ACCESS_KEY_ID}", "--aliyun-log.access-key-secret=${ACCESS_KEY_SECRET}", "--aliyun-log.span-logstore=${SPAN_LOGSTORE}", "--aliyun-log.init-resource-flag=false"]
ports:
- "14269"
- "14268:14268"
- "14267"
- "9411:9411"
restart: on-failure
jaeger-query:
image: registry.cn-hangzhou.aliyuncs.com/jaegertracing/jaeger-query:0.3.1
environment:
- SPAN_STORAGE_TYPE=aliyun-log-otel
command: ["/go/bin/query-linux", "--query.static-files=/go/jaeger-ui/", "--aliyun-log.project=${PROJECT}", "--aliyun-log.endpoint=${ENDPOINT}", "--aliyun-log.access-key-id=${ACCESS_KEY_ID}", "--aliyun-log.access-key-secret=${ACCESS_KEY_SECRET}", "--aliyun-log.span-logstore=${SPAN_LOGSTORE}", "--aliyun-log.span-dep-logstore=${SPAN_LOGSTORE}-deps", "--aliyun-log.init-resource-flag=false","--aliyun-log.max-query-duration=168h"]
ports:
- "16686:16686"
- "16687"
restart: on-failure
jaeger-agent:
image: jaegertracing/jaeger-agent:1.6.0
command: ["--collector.host-port=jaeger-collector:14267"]
ports:
- "5775:5775/udp"
- "6831:6831/udp"
- "6832:6832/udp"
- "5778:5778"
restart: on-failure
depends_on:
- jaeger-collector
里面的变量数据,我放在同级目录的.env文件中了。
这里需要注意的是查询最大跨度是--aliyun-log.max-query-duration=168h参数,不是es.max-span-age。
目前jaeger数据和阿里云SLS中的trace服务不通用,虽然也可以在trace服务中查看,但是一些字段比如StatusCode 会显示Unknown。
参考资料
https://github.com/jaegertracing/jaeger/issues/1377
https://github.com/aliyun/aliyun-log-jaeger/issues/22
转载请注明:IPCPU-网络之路 » 分布式追踪系统Jaeger介绍