前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mac 上学习k8s系列(47)分布式追踪jaeger+es

mac 上学习k8s系列(47)分布式追踪jaeger+es

作者头像
golangLeetcode
发布2022-12-17 16:20:20
8130
发布2022-12-17 16:20:20
举报
文章被收录于专栏:golang算法架构leetcode技术php

实现de 分布式链路追踪成了微服务的标配,随着opentracing标准的推出,jaeger+es几乎成了标配。它的架构如下

具体参考如下:https://www.jaegertracing.io/docs/1.38/architecture/,重要的组件如下:

  • jaeger-query: 用于客户端查询和检索组件,并包含了一个基础的 UI
  • jaeger-collector: 接收来自 jaeger-agent 的 trace 数据,并通过处理管道来执行。当前的处理管道包含验证 trace 数据,创建索引,执行数据转换以及将数据存储到对应的后端
  • jaeger-agent: 一个网络守护进程,侦听通过 UDP 发送的 spans ,它对其进行批处理并发送给收集器。它被设计为作为基础设施组件部署到所有主机。代理将收集器的路由和发现从客户机抽象出来
  • backend-storage: 用于指标数据存储的可插拔式后端存储,支持 Cassandra, Elasticsearch and Kafka
  • ingester: 可选组件,用于从 kafka 中消费数据并写入到可直接读取的 Cassandra 或 Elasticsearch 存储中
代码语言:javascript
复制
version: "3"

services:
  elasticsearch:
    image: docker.io/elasticsearch:7.17.6
    networks:
      - elastic-jaeger
    ports:
      - "127.0.0.1:9200:9200"
      - "127.0.0.1:9300:9300"
    restart: on-failure
    environment:
      - cluster.name=jaeger-cluster
      - discovery.type=single-node
      - http.host=0.0.0.0
      - transport.host=127.0.0.1
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
      - xpack.security.enabled=false
    volumes:
      - ~/bilibili/live/learn/elasticsearch/esdata:/usr/share/elasticsearch/data

  jaeger-collector:
    image: jaegertracing/jaeger-collector
    ports:
      - "14269:14269"
      - "14268:14268"
      - "14267:14267"
      - "9411:9411"
    networks:
      - elastic-jaeger
    restart: on-failure
    environment:
      - SPAN_STORAGE_TYPE=elasticsearch
      - METRICS_STORAGE_TYPE=prometheus
      - PROMETHEUS_SERVER_URL=http://localhost:9090
    command: [
      "--es.server-urls=http://elasticsearch:9200",
      "--es.num-shards=1",
      "--es.num-replicas=0",
      "--log-level=error"
    ]
    depends_on:
      - elasticsearch

  jaeger-agent:
    image: jaegertracing/jaeger-agent
    hostname: jaeger-agent
    command: ["--collector.host-port=jaeger-collector:14267"]
    ports:
      - "5775:5775/udp"
      - "6831:6831/udp"
      - "6832:6832/udp"
      - "5778:5778"
    networks:
      - elastic-jaeger
    restart: on-failure
    environment:
      - SPAN_STORAGE_TYPE=elasticsearch
      - METRICS_STORAGE_TYPE=prometheus
      - PROMETHEUS_SERVER_URL=http://localhost:9090
    depends_on:
      - jaeger-collector

  jaeger-query:
    image: jaegertracing/jaeger-query
    environment:
      - SPAN_STORAGE_TYPE=elasticsearch
      - no_proxy=localhost
      - METRICS_STORAGE_TYPE=prometheus
      - PROMETHEUS_SERVER_URL=http://localhost:9090
    ports:
      - "16686:16686"
      - "16687:16687"
    networks:
      - elastic-jaeger
    restart: on-failure
    command: [
      "--es.server-urls=http://elasticsearch:9200",
      "--span-storage.type=elasticsearch",
      "--log-level=debug"
    ]
    depends_on:
      - jaeger-agent

volumes:
  esdata:
    driver: local

networks:
  elastic-jaeger:
    driver: bridge

使用depends_on进行容器排序时并不能完美的解决容器之间的依赖问题,原因是因为 depends_on只能保证容器进入到 运行状态而不是完全状态,依赖容器只能判断被容器是否启动,不能判断容器里的进程是否活跃,即没有k8s的探活机制,所以直接启动会报错。网上已经列出来了解决方法,使用 wait-for-it或者 wait-for。实现比较麻烦。所以需要单独先启动es,判断下是否启动成功,然后启动jaeger

代码语言:javascript
复制
% docker compose -f learn/elasticsearch/docker-compose-jager-es.yml up elasticsearch
% nc -v 127.0.0.1 9200

启动jager-all-in-one,由于docker for mac并不是直接在linux上运行的中间有一层x-hyve虚拟机,所以在duoker内部没法直接访问宿主机。解决办法是在在 Docker 20.10 及以上版本中,在 Docker 命令行中,添加:

代码语言:javascript
复制
--add-host=host.docker.internal:host-gateway

在 docker-compose 中,添加:

代码语言:javascript
复制
extra_hosts:
- host.docker.internal:host-gateway

即可通过 host.docker.internal 域名访问宿主机。此操作会在容器内部,添加一行/etc/hosts。实践发现在docker-compose中并不work,采用前一种方式。

代码语言:javascript
复制
docker run --name jaeger-es \
  -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 \
  -e SPAN_STORAGE_TYPE=elasticsearch \
  -e ES_SERVER_URLS=http://host.docker.internal:9200 \
  -e METRICS_STORAGE_TYPE=prometheus \
  -e PROMETHEUS_SERVER_URL=http://host.docker.internal:9090/prometheus \
  -p 5775:5775/udp \
  -p 6831:6831/udp \
  -p 6832:6832/udp \
  -p 5778:5778 \
  -p 16686:16686 \
  -p 16685:16685 \
  -p 14268:14268 \
  -p 14250:14250 \
  -p 9411:9411 \
  --add-host=host.docker.internal:host-gateway \
  jaegertracing/all-in-one:latest

测试下

代码语言:javascript
复制
% nc -v 127.0.0.1 16687
Connection to 127.0.0.1 port 16687 [tcp/*] succeeded!

部署完ageent、collector 和es后我们还需要在业务代码中引入jaeger客户端,做trace的传接和日志的采样上报。

代码语言:javascript
复制
https://pkg.go.dev/github.com/jaegertracing/jaeger-client-go@v2.30.0+incompatible

这个包由于不符合opentracing标准,已经不兼容详细可见官网

https://www.jaegertracing.io/docs/1.38/client-libraries/#deprecating-jaeger-clients

代码语言:javascript
复制
 ../../go/pkg/mod/github.com/jaegertracing/jaeger-client-go@v2.30.0+incompatible/zipkin_thrift_span.go:24:2: use of internal package github.com/uber/jaeger-client-go/internal/spanlog not allowed

解决方案是用uber的库替换

代码语言:javascript
复制
 import "github.com/uber/jaeger-client-go"
❌ import "github.com/jaegertracing/jaeger-client-go"

部署完毕后测试下:

代码语言:javascript
复制
http://127.0.0.1:16686/

至此安装成功,关于client如何介入http和grpc服务,下一篇详细分析。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-10-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 golang算法架构leetcode技术php 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
容器服务
腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档