Metrics/Tracing/Logging
Metrics:聚合指标,例如http请求数是一个counter,队列长度是一个gauge,请求时间是一个histogram
Logging:离散的events
Tracing:request-scoped.一个请求范围内的调用关系
OpenTracing通过一个spc定义了实体和实体能力,解耦应用和后端tracing系统.
OpenTracing Specification
模型
span定义
链路通过span定义,每个span包括如下状态:
- 名称
- 开始时间
- 结束时间
- 0或多个Span Tags
- 0或多个Span Logs.key/value pairs附加一个时间戳
- 一个SpanContext.
- 0或多个关联的Span
SpanContext包括如下状态: - trace 和 span ids
- Baggage items:key/value paires
标准的Span Tags如下:
基础tag:
- component: “grpc” or “django” or “JDBI”
- error: “true” or “false”
- span.kind :”client” or “server” or “producer” or “consumer”
- sampling.priority : 0 or 1 or 2
- peer.ipv4 : “127.0.0.1”
- peer.hostname : “ke.com”
db相关:
- db.instance: “db1” or “db2”
- db.type : “redis” or “mysql”
- db.statement : “set mykey myvalue” or “select * from tb1 where id =1 “
- db.user : “readonly” or “writer_user1”
http相关:
- http.method :”get” or “post”
- http.status_code : 200 or 404 or 503
- http.url : “https://ke.com"
mq相关:
- message_bus.destination : “tpoic name”
标准的:Log Fields
Log除了一个时间戳外有如下一些标准fields:
- error.kind : “Exception” or “OSError”
- error.object : “java.lang.UnsupportedOperationException” or “exceptions.NameError”
- event: “initialized” or “timed out”
- message: “Could not connect to backend” or “Cache invalidation succeeded”
- stack: 调用栈
span间的关系
ChildOf:parent span依赖于child span时是child of 关系.例如:
- server 端rpc的span与客户端的一个rpc调用是child of
- sql insert的一个span与orm中的save方法关系是child of
- 一个父span并发执行许多子span,然后合并子请求的结果,关系也是child of
followsfrom:父span不依赖于子span的结果.
例如生产者消费者关系
API
有三个关键概念:Tracer,Span,SpanContext
Tracer有如下能力:
- 开启一个Span
- 将一个SpanContext注入一个载体
- 将一个SpanContext从一个载体中解析出
载体可以有如下几种类型:
- Text Map:key/value
- HTTP Headers
- Binary
Span:
- 覆盖span名字
- finish span
- set span tag
- set log fields
- set/get baggage item
SpanContext:
- 遍历baggage items