链路追踪学习二:Jaeger

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
应用实时监控服务-可观测链路OpenTelemetry版,每月50GB免费额度
简介: 链路追踪学习二:Jaeger

Jaeger

Jaeger是一个基于opentracing规范的链路追踪工具,官方地址:https://www.jaegertracing.io/

jaeger架构


jaeger分为5个模块,分别为:

1:Jaeger-client

jaeger-client即是代码层客户端,我们通过引入sdk,通过调用代码,将数据传输到agent层

2:Jaeger-Agent

jaeger-agent将client的数据收集,然后批量上传到Collector

3:Jaeger-Collector

将agent的数据进行收集,处理,索引,然后存储到数据库中

4:Data Store

最终存储链路数据,支持Cassandra,Elasticsearch,Kafka 和内存存储(生产环境不建议)方式

5:Query&UI

数据查询和展现层

6:jaeger-ingester

直接将kafka数据写入到数据存储端

安装

安装方式有很多,本文将使用docker Ubuntu环境手动安装,觉得麻烦的可以通过docker拉取镜像,一次性安装:

docker pull jaegertracing/all-in-one:1.12
docker run -d --name jaeger \
-e COLLECTOR\_ZIPKIN\_HTTP_PORT=9411 \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 9411:9411 \
jaegertracing/all-in-one:1.12

由上面的架构可看出,Jaeger只需要安装collector和query&ui就可以直接运行了,客户端不通过agent,直接到收集器

首先运行一个Ubuntu:

docker run -itd --name=jaeger-study \
-p 5775:5775/udp \
-p 6831:6831/udp \
-p 6832:6832/udp \
-p 5778:5778 \
-p 16686:16686 \
-p 14268:14268 \
-p 9411:9411 \
ubuntu  bash
docker exec -it jaeger-study bash

目前不清楚开放这些端口有啥用,先开着以备不时之需

初始化Ubuntu 包管理:

apt-get update
apt-get install -y wget

下载二进制执行包:

二进制包下载地址:https://github.com/jaegertracing/jaeger/releases/

wget https://github.com/jaegertracing/jaeger/releases/download/v1.32.0/jaeger-1.32.0-linux-amd64.tar.gz

解压后:

root@8f0790b17e84:/tmp/jaeger-1.32.0# tar -zvxf jaeger-1.32.0-linux-amd64.tar.gz 
jaeger-1.32.0-linux-amd64/
jaeger-1.32.0-linux-amd64/example-hotrod
jaeger-1.32.0-linux-amd64/jaeger-ingester
jaeger-1.32.0-linux-amd64/jaeger-collector
jaeger-1.32.0-linux-amd64/jaeger-agent
jaeger-1.32.0-linux-amd64/jaeger-query
jaeger-1.32.0-linux-amd64/jaeger-all-in-one

启动elasticsearch


docker pull elasticsearch:7.8.0
docker run -itd -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node"   --name elastic_search elasticsearch:7.8.0

启动elasticsearch成功后,需要与Jaeger 容器互通,通过创建个network实现:

(base) tioncico@appledeMacBook-Pro ~ % docker network create jaeger_network
ceec8b0ea1f40f12c0d7f7e3d2e4ee386351d8cb57d3203da8f4705b825aefd8
(base) tioncico@appledeMacBook-Pro ~ % docker network connect jaeger_network jaeger-study
(base) tioncico@appledeMacBook-Pro ~ % docker network connect jaeger\_network elastic\_search
(base) tioncico@appledeMacBook-Pro ~ %

启动collector:

./jaeger-collector --span-storage.type=elasticsearch --es.server-urls=http://elastic_search:9200

将监听以下端口:

  1. 14267 tcp agent发送jaeger.thrift格式数据
  2. 14250 tcp agent发送proto格式数据(背后gRPC)
  3. 14268 http 直接接受客户端数据
  4. 14269 http 健康检查

启动agent

./jaeger-agent --reporter.grpc.host-port=127.0.0.1:14250

启动成功后,将监听:

  1. 5775 UDP协议,接收兼容zipkin的协议数据
  2. 6831 UDP协议,接收兼容jaeger的兼容协议
  3. 6832 UDP协议,接收jaeger的二进制协议
  4. 5778 HTTP协议,数据量大不建议使用

通过Jaeger-client直接传输到agent:

package main
import (
   "context"
   "fmt"
   "io"
   "time"
   "github.com/opentracing/opentracing-go"
   "github.com/opentracing/opentracing-go/log"
   "github.com/uber/jaeger-client-go"
   "github.com/uber/jaeger-client-go/config"
)
/**
初始化
*/
func initJaeger(service string) (opentracing.Tracer, io.Closer) {
   cfg := &config.Configuration{
      Sampler: &config.SamplerConfig{
         Type:  "const",
         Param: 1,
      },
      Reporter: &config.ReporterConfig{
         LogSpans: true,
         LocalAgentHostPort: "127.0.0.1:6831",
      },
      ServiceName: service,
   }
   tracer, closer, err := cfg.NewTracer(config.Logger(jaeger.StdLogger))
   if err != nil {
      panic(fmt.Sprintf("Error: connot init Jaeger: %v\\n", err))
   }
   return tracer, closer
}
func main() {
   tracer, closer := initJaeger("jager-test-demo")
   defer closer.Close()
   //设置全局的tracer
   opentracing.SetGlobalTracer(tracer)
   //设置顶级span
   span := tracer.StartSpan("main")
   ctx := opentracing.ContextWithSpan(context.Background(), span)
   //调用栈1,例如查询数据
   _ = selectData("test", ctx)
   //调用栈2,例如写入日志
   _ = writeLog("log", ctx)
   span.Finish()
   fmt.Println("调用栈完成")
}
func selectData(data string, ctx context.Context) (reply string) {
   //创建子span
   span, _ := opentracing.StartSpanFromContext(ctx, "selectData")
   defer span.Finish() //结束后调用完成
   span.SetTag("data", data)
   span.SetTag("reply", reply)
   span.LogFields(
      log.String("event", "selectData"),
      log.String("value", "666666"),
   )
   time.Sleep(time.Second / 2) //模拟查询了2秒
   reply = "select data"
   return
}
func writeLog(data string, ctx context.Context) (reply string) {
   //创建子span
   span, _ := opentracing.StartSpanFromContext(ctx, "writeLog")
   defer span.Finish() //结束后调用完成
   span.LogFields(
      log.String("log", data),
   )
   reply = "writeLog"
   return
}

query&ui查看链路追踪日志

启动query:

./jaeger-query --span-storage.type=elasticsearch --es.server-urls=http://elastic_search:9200

打开:http://127.0.0.1:16686/ 网页

image.png

即可查看到链路追踪日志

image.png


相关实践学习
基于OpenTelemetry构建全链路追踪与监控
本实验将带领您快速上手可观测链路OpenTelemetry版,包括部署并接入多语言应用、体验TraceId自动注入至日志以实现调用链与日志的关联查询、以及切换调用链透传协议以满足全链路打通的需求。
分布式链路追踪Skywalking
Skywalking是一个基于分布式跟踪的应用程序性能监控系统,用于从服务和云原生等基础设施中收集、分析、聚合以及可视化数据,提供了一种简便的方式来清晰地观测分布式系统,具有分布式追踪、性能指标分析、应用和服务依赖分析等功能。 分布式追踪系统发展很快,种类繁多,给我们带来很大的方便。但在数据采集过程中,有时需要侵入用户代码,并且不同系统的 API 并不兼容,这就导致了如果希望切换追踪系统,往往会带来较大改动。OpenTracing为了解决不同的分布式追踪系统 API 不兼容的问题,诞生了 OpenTracing 规范。OpenTracing 是一个轻量级的标准化层,它位于应用程序/类库和追踪或日志分析程序之间。Skywalking基于OpenTracing规范开发,具有性能好,支持多语言探针,无侵入性等优势,可以帮助我们准确快速的定位到线上故障和性能瓶颈。 在本套课程中,我们将全面的讲解Skywalking相关的知识。从APM系统、分布式调用链等基础概念的学习加深对Skywalking的理解,从0开始搭建一套完整的Skywalking环境,学会对各类应用进行监控,学习Skywalking常用插件。Skywalking原理章节中,将会对Skywalking使用的agent探针技术进行深度剖析,除此之外还会对OpenTracing规范作整体上的介绍。通过对本套课程的学习,不止能学会如何使用Skywalking,还将对其底层原理和分布式架构有更深的理解。本课程由黑马程序员提供。
目录
相关文章
|
中间件
链路追踪学习四:gin集成jaeger
链路追踪学习四:gin集成jaeger
587 0
|
存储 Kubernetes 监控
基于 Jaeger 进行微服务链路追踪
基于解决不同行业、业务应用的可扩展性、可用性等一系列问题,由此而生的微服务架构得到了各大厂商的、组织以及个人的青睐,随之而来便广泛应用于各种行业场景应用中。然而,随着时间的推移,越来越多的问题慢慢地呈现在大众的视野中。
314 0
|
存储 消息中间件 NoSQL
浅谈分布式链路追踪之Jaeger
随着微服务生态的盛行,在基于不同的业务场景中,一个简单的请求往往可能会涉及到多个不同服务类型,此时,若某个服务所提供的业务出现异常,从而可能会导致整个业务处理链路中的问题跟踪、定位及其分析较为困难,服务之间的依赖梳理、组件排查就变得尤为复杂。
1061 0
|
存储 Prometheus 监控
(16)go-micro微服务jaeger链路追踪
(16)go-micro微服务jaeger链路追踪
234 0
|
运维 前端开发 程序员
基于Dapper的分布式链路追踪入门——Opencensus+Zipkin+Jaeger
最近做了一些分布式链路追踪有关的东西,写篇文章来梳理一下思路,或许可以帮到想入门的同学。下面我将从原理到demo为大家一一进行讲解,欢迎评论区交流~。
300 0
基于Dapper的分布式链路追踪入门——Opencensus+Zipkin+Jaeger
|
监控 Cloud Native 关系型数据库
链路追踪学习一:OpenTracing
链路追踪学习一:OpenTracing
200 0
链路追踪学习一:OpenTracing
链路追踪学习三:跨服务,跨进程追踪
链路追踪学习三:跨服务,跨进程追踪
187 0
链路追踪学习三:跨服务,跨进程追踪
|
存储 分布式计算 运维
分布式链路追踪Jaeger + 微服务Pig在Rainbond上的实践分享
随着微服务架构的流行,客户端发起的一次请求可能需要涉及到多个或 N 个服务,致使我们对服务之间的监控和排查变得更加复杂。
|
3月前
|
存储 监控 开发者
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决
分布式链路监控系统问题之系统拆分后链路追踪技术的问题如何解决