Uber分布式追踪系统Jaeger使用介绍和案例【PHP Hprose Go】

image

原文:Uber分布式追踪系统Jaeger使用介绍和案例【PHP Hprose Go】

前言

  随着公司的发展,业务不断增加,模块不断拆分,系统间业务调用变得越复杂,对定位线上故障带来很大困难。整个调用链不透明,犹如系统被蒙上一块黑纱,当线上遇到故障时,整个技术部就陷入痛苦的漩涡。这时候分布式追踪系统应运而生,如揭开了黑纱,让阳光照进黑暗。

分布式系统调用过程

image

opentracing 协议

 opentracing是一套分布式追踪协议,与平台,语言无关,统一接口,方便开发接入不同的分布式追踪系统。

image

简单理解opentracing

一个完整的opentracing调用链包含 Trace + span + 无限极分类

  • Trace:追踪对象,一个Trace代表了一个服务或者流程在系统中的执行过程,如:test.com,redis,mysql等执行过程。一个Trace由多个span组成
  • span:记录Trace在执行过程中的信息,如:查询的sql,请求的HTTP地址,RPC调用,开始、结束、间隔时间等。
  • 无限极分类:服务与服务之间使用无限极分类的方式,通过HTTP头部或者请求地址传输到最低层,从而把整个调用链串起来。

相关文档

分布式追踪系统Jaeger

Jaeger是Uber开发的一套分布式追踪系统,已在Uber大规模使用。并在2017-9-13 加入CNCF 开源组织。使用Jaeger可以非常直观的展示整个分布式系统的调用链,由此可以很好发现和解决问题:

image

作用

  • 分布式环境下信息传播
  • 分布式交易监控
  • 展示跨进程调用链
  • 性能优化
  • 定位问题

特性

  • 使用udp传输数据,相对于HTTP,优点在于,不用担心Jaeger服务宕机或者网络传输有问题而影响正常的业务。缺点就是丢包,影响了整条调用链。
  • 数据通过Thrift进行序列化,和json对比
接口 Thrift/byte json/byte 节省
接口1 987 2396 约1.5倍
接口2 1212 2916 约1.4倍
接口3 12830 18893 约40%
接口4 17158 22465 约24%
接口5 11025 14282 约23%

 从中可以看出thrift相对json减少了不少空间。在我们采集公司接口的数据大小都集中在10~20k,所以使用thrift会更有优势。

  • 采集策略

Jaeger 官方提供了多种采集策略,使用者可以按需选择使用

  1. ConstSampler,全量采集
  2. ProbabilisticSampler ,概率采集,默认万份之一
  3. RateLimitingSampler ,限速采集,每秒只能采集一定量的数据
  4. RemotelyControlledSampler ,一种动态采集策略,根据当前系统的访问量调节采集策略
  1. Go
  2. Java
  3. node
  4. python
  5. php

官方提供了 go,java,node,python客户端,其他客户端还在开放中,php客户端为个人开发【欢迎star】

部署

快速部署 ------ All in one Docker image

 all-in-one 是Uber官方打包好的镜像,可以直接部署使用,但是只能用于测试环境,不能用于线上,因为它把数据放入了内存。

docker run -d -e COLLECTOR_ZIPKIN_HTTP_PORT=9411 -p5775:5775/udp -p6831:6831/udp -p6832:6832/udp \
  -p5778:5778 -p16686:16686 -p14268:14268 -p9411:9411 jaegertracing/all-in-one:latest

通过 http://localhost:16686 可以在浏览器查看 Jaeger的后台

官方提供的使用例子,需要go环境

go get github.com/uber/jaeger
cd $GOPATH/src/github.com/uber/jaeger
make install_examples
cd examples/hotrod
go run ./main.go all

http://localhost:8080 浏览器打开查看

cassandra + docker 部署,单机模式

docker run -itd \
--name=cassandra -p9042:9042 \
-v /data/cassandra:/var/lib/cassandra \
cassandra

进入容器建立表空间

按照官方脚本整理了一份建表语句jaeger_tables,进入cassandra,执行语句即可创建所需的表。

keyspaces:jaeger_v1_dc

运行 jaeger-query

docker run -itd --network=bridge \
--name=jaeger-query \
-p16686:16686 \
jaegertracing/jaeger-query \
/go/bin/query-linux \
--span-storage.type=cassandra \
--cassandra.keyspace=jaeger_v1_dc \
--cassandra.servers={{ cassandra }}:9042 \
--query.static-files=/go/jaeger-ui/

运行 jaeger-collector

docker run -itd --network=bridge \
--name=jaeger-collector \
-p14267:14267 \
-p14268:14268 \
-p9411:9411 \
jaegertracing/jaeger-collector \
/go/bin/collector-linux \
--span-storage.type=cassandra \
--cassandra.keyspace=jaeger_v1_dc \
--cassandra.servers={{ cassandra }}:9042

运行 jaeger-agent

docker run \
-itd --network=bridge \
--name=jaeger-agent \
-p5775:5775/udp \
-p6831:6831/udp \
-p6832:6832/udp \
-p5778:5778/tcp \
jaegertracing/jaeger-agent \
/go/bin/agent-linux --collector.host-port={{ jaeger-collector }}:14267

跨语言调用案例

  • php
  • Hprose
  • Go【beego】

beego

  • install beego
go get github.com/astaxie/beego
  • Download trace_example
git clone git@github.com:jukylin/trace_example.git
cd  trace_example
bee run trace_example

PHP

cd vendor/jukylin/jaeger-php/example
php Hprose.php

Trace Result View

image

PS

122 声望
29 粉丝
0 条评论
推荐阅读
微服务业务架构的探索
原文:微服务业务架构的探索 提示 阅读这篇文章,需要有以下准备: 在微服务下挣扎过 需要了解DDD和COLA架构思想 本篇文章围绕业务架构进行讨论 前言     公司在开始探索微服务架构时,使用的是三层架构(control...

小卜邪1阅读 1.7k

怎样用 PHP 来实现枚举?
在数学和计算机科学理论中,一个集的枚举是列出某些有穷序列集的所有成员的程序,或者是一种特定类型对象的计数。这两种类型经常(但不总是)重叠。枚举是一个被命名的整型常数的集合,枚举在日常生活中很常见,...

唯一丶25阅读 6.4k评论 4

前端如何入门 Go 语言
类比法是一种学习方法,它是通过将新知识与已知知识进行比较,从而加深对新知识的理解。在学习 Go 语言的过程中,我发现,通过类比已有的前端知识,可以更好地理解 Go 语言的特性。

robin21阅读 2.9k评论 3

封面图
Golang 中 []byte 与 string 转换
string 类型和 []byte 类型是我们编程时最常使用到的数据结构。本文将探讨两者之间的转换方式,通过分析它们之间的内在联系来拨开迷雾。

机器铃砍菜刀22阅读 55k评论 1

年度最佳【golang】map详解
这篇文章主要讲 map 的赋值、删除、查询、扩容的具体执行过程,仍然是从底层的角度展开。结合源码,看完本文一定会彻底明白 map 底层原理。

去去100214阅读 11k评论 2

年度最佳【golang】GMP调度详解
Golang最大的特色可以说是协程(goroutine)了, 协程让本来很复杂的异步编程变得简单, 让程序员不再需要面对回调地狱, 虽然现在引入了协程的语言越来越多, 但go中的协程仍然是实现的是最彻底的. 这篇文章将通过分析...

去去100213阅读 11.2k评论 4

【已结束】SegmentFault 思否技术征文丨浅谈 Go 语言框架
亲爱的开发者们:我们的 11 月技术征文如期而来,这次主题围绕 「 Go 」 语言,欢迎大家来参与分享~征文时间11 月 4 日 - 11 月 27 日 23:5911 月 28 日 18:00 前发布中奖名单参与条件新老思否作者均可参加征文...

SegmentFault思否11阅读 4.7k评论 11

封面图
122 声望
29 粉丝
宣传栏