最新消息:

分布式追踪系统Jaeger介绍

IT技术 ipcpu 1190浏览 0评论

分布式追踪系统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

来自为知笔记(Wiz)

转载请注明:IPCPU-网络之路 » 分布式追踪系统Jaeger介绍

发表我的评论
取消评论
表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址