Hi,阿金 ...

OpenTracing

发表: 2020-05-22 分类:

[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的opentracingjaeger,几个经典分布式追踪场景的使用和查询.

  • Http
  • DB
  • MQ
  • Cache
  • Task
  • Thread
  • RPC
  • 前端App

有很多优先的支持opentrcing平台,如zipkin,阿里云等.
我这里使用 Jaeger.
基于docker的部署环境,数据存储使用es.

环境要求:

  • docker
  • jaeger,服务端
  • jaeger-agent,客户端
  • jaeger存储,使用ES
  • php-opentracing 包

演示的php框架,使用的是hpyerflaravel

安装部署Jaeger

todo:持续更新中…

本文作者:阿金

本文链接:http://www.hi-arkin.com/2020/05/22/DevOps/opentracing/

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

Tags: PHP

扫描二维码,分享此文章