[toc]
关键字
- Span
- SpanId
- SpanContext
- TraceId
- Tags
- from_of
- child_of
开始
什么是分布式跟踪?
分布式跟踪(也称分布式请求跟踪)是一种用于应用程序进行概要分析和监视的方法.尤其是使用微服务架构构建的应用程序.分布式跟踪有助于查明哪里发生故障以及什么原因导致性能下降.
谁在使用分布式跟踪?
IT和DevOps团队可以使用分布式跟踪应用程序.分布式跟踪特别适合调试和监视现代分布式软件体系. 如微服务.
可以帮助开发人员调试和优化代码.
什么是OpenTracing?
OpenTracing由Api规范,规范框架和文档组成.不用关心特定的供应商.
组成
- Trace
- Span
- SpanContext
结构图:
graph TD; subgraph service1 A[span1]-- span4 child of span3 --> A1[span3] A1 --> A2[span4] A1 --> A3[span5] A --> B[span2] end subgraph Network C((Trace-Context)) B -.-> C end subgraph service3 C -.-> D[span] D --> D1[span] D1--> D2[span] D --> E[span] end
trace
一次完整的跟踪,由多个span组成.
trace主要由,trace-id和span组成.
span
span
是分布式跟踪的主要构成模块,代表分布式的一个工作单元.
分布式系统的每个组件都有一个命名的span.比如”request”,”db”
span 可以包含其它span的引用,从而组成一个完整生命周期跟踪图.如上.
通常一个span的内容规范.
- name,记录点的名称,用于分类
- time,记录的开始时间戳和结束时间戳
- tags,标记. key:value组成
- logs,记录, key:value组成
- spanContext, 上下文
name
由字符串组成成的标识,可以用于过滤和标识.
time
时间,由开始时间和结束时间
tag
标签,可以存放多个.
用于过滤.包含一些常用的规范标签.
行业约定
如:
Span tag name | Type | Notes and examples |
---|---|---|
component |
string | 框架,组件,模块. E.g., "grpc" , "django" , "JDBI" . |
db.instance |
string | 数据库实例名. E.g., jdbc.url="jdbc:mysql://127.0.0.1:3306/customers" , 实例 "customers" . |
db.statement |
string | 语句 E.g., for db.type="sql" , "SELECT * FROM wuser_table" ; for db.type="redis" , "SET mykey 'WuValue'" . |
db.type |
string | 数据库类库类型分类,普通数据库用"sql" . 其他使用小写, e.g. "cassandra" , "hbase" , or "redis" . |
db.user |
string | 数据库用户名. E.g., "readonly_user" or "reporting_user" |
error |
bool | true 当且只当应用程序认为这块操作失败时,才返True |
http.method |
string | Http请求的方法. E.g., "GET" , "POST" |
http.status_code |
integer | HTTP 状态码. E.g., 200, 503, 404 |
http.url |
string | URL. E.g., "https://domain.com/path/to?resource=here" |
message_bus.destination |
string | 消息队列标识. E.g. 如kafaka的 "topic name" 生产者或消息者都可以. |
peer.address |
string | 远程地址,如网络客户端库 "ip:port" , a bare "hostname" , 甚至可以使用DJBC的"mysql://prod-db:3306" |
peer.hostname |
string | 远程主机名. E.g., "www.baidu.com" |
peer.ipv4 |
string | 远程IPv4地址. E.g., "127.0.0.1" |
peer.ipv6 |
string | 远程IPv6地址. E.g., "2001:0db8:85a3:0000:0000:8a2e:0370:7334" |
peer.port |
integer | 远程端口. E.g., 80 |
peer.service |
string | 远程服务名称 (未指定使用 "service" 定义). E.g., "elasticsearch" , "a_custom_microservice" , "memcache" |
sampling.priority |
integer | 如果>0,则尽可能捕捉,==0不再跟踪 |
span.kind |
string | 种类, Rpc使用 "client" ,消息队列使用 "server" , and "producer" or "consumer" 表示 |
log
日志,用于调试和信息记录.
日志的准备字段,参考上面的约定链接.
Span log field name | Type | Notes and examples |
---|---|---|
error.kind |
string | 种类 (仅适用于 event="error" 的日志). E.g., "Exception" , "OSError" |
error.object |
object | 异常对象 (e.g., Java, Python), Throwable/Exception/Error . E.g., A java.lang.UnsupportedOperationException |
event |
string | 事件标识, Performance.timing specification. E.g., from Zipkin, "cs" , "sr" , "ss" , or "cr" . Or, more generally, "initialized" or "timed out" . For errors, "error" |
message |
string | 消息内容 |
stack |
string | 堆栈跟踪 |
SpanContext
span的描述,上下文信息,
必须的trace-id,span-id,span-kind
Trace-Context
传播上下文,通过Http传播给其他平台.
W3C Trace-Context规范
现在各种平台规范不一样.Jaeger使用的是.
Jaeger标记
Key:uber-trace-id
不区分大小写,使用
Value :
值由几部份组成.
{trace-id}:{span-id}:{parent-span-id}:{flags}
- trace-id : 64位或128位 的 随机 base16 数
- span-id: 64位或128位 的 随机 base16 数
- parent-span-id: 0,代表根级
- flags: 标记,2个字节.
- 第1位,1:采样,0:不采样
- 第2位,调试标记
使用
下面结合 php的opentracing
和 jaeger
,几个经典分布式追踪场景的使用和查询.
- Http
- DB
- MQ
- Cache
- Task
- Thread
- RPC
- 前端App
有很多优先的支持opentrcing平台,如zipkin
,阿里云
等.
我这里使用 Jaeger.
基于docker的部署环境,数据存储使用es.
环境要求:
- docker
- jaeger,服务端
- jaeger-agent,客户端
- jaeger存储,使用ES
- php-opentracing 包
演示的php框架,使用的是hpyerf
和 laravel
安装部署Jaeger
todo:持续更新中…
本文作者:阿金
本文链接:http://www.hi-arkin.com/2020/05/22/DevOps/opentracing/
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
扫描二维码,分享此文章