一、opentelemetry span 结构
Name:Span 的名称
Parent span ID (empty for root spans):父级 Span
Start and End Timestamps:Span 开始和结束的时间戳
Span Context
Attributes
Span Events
Span Links
Span Status
Span Context
是每个跨度上的一个不可变对象,包含以下内容:
-
Trace ID:表示 Span 所属的 Trace
-
Span ID:表示 Span 的 ID
-
Trace Flags:一种包含有关 Trace 信息的二进制编码
-
Trace State:键值对的列表,可以携带 vendor-specific trace 信息
Attributes
Attributes 是包含元数据的键值对,常用的一些属性都会放在这里,例如服务名、实例ip、请求头、请求地址、业务标识、用户ID、异常类型、数据库类型、数据库地址等
Span Event
一般用来存放错误、异常信息。
Span Links
可以将一个 Span 与一个或多个 Span 相关联,从而暗示因果关系。一般用在消息队列的场景。
Span Status
当应用程序代码中存在已知错误时将设置 Span Status。 Span Status 将标记为以下值之一:Unset Ok Error
Span Kind
创建 Span 时,它是Client
, Server
, Internal
, Producer
, 或 Consumer
之一。这种 span 类型为跟踪后端提供了一个关于应该如何组装跟踪的提示。根据 OpenTelemetry 规范,服务器 Span 的父 Span 通常是远程客户端 Span,客户端 Span 的子 Span 通常是服务器 Span。类似地,消费者 Span 的父 Span 代始终是生产者,生产者 Span 的子代始终是消费者。如果未提供,则假定 Span Kind 为Internal
。
二、提取常用的属性
经过对span的分析,常用的属性都默认放到Attributes这个大map里面了,如果直接存到ck里面的话对搜索是极度不友好的,因此我们需要把常用的属性都提取出来,综合三大云厂商,常用属性如下:
参数 | 类型 | 说明 |
---|---|---|
attributes |
Map |
用于索引的自定义属性。 |
duration |
Int64 |
耗时,单位为纳秒。 |
hostname |
String |
主机名。 |
ip |
String |
主机IP地址。 |
kind |
String |
SPAN类型,SPAN类型包括以下几种:
|
parentSpanId |
String |
父SPAN分配的ID,表示SPAN之间的关系。 |
resources |
Map |
SPAN的资源信息,包括进程ID、JVM版本号等。 |
serviceName |
Map |
服务名,用于多租户。 |
spanId |
String |
SPAN分配的ID,表示SPAN之间关系。 |
spanName |
String |
SPAN的名称。 |
spanType | String | 组件的类型,例如http、grpc、db、local、message等 |
startTime |
Int64 |
开始时间,单位为纳秒。 |
statusCode |
Int64 |
SPAN状态,SPAN状态包括以下几种:
|
statusMessage |
String |
状态附加信息。 |
net |
Map |
远程调用的通用属性 |
http | Map | http调用的通用属性 |
rpc | Map | rpc调用的通用属性 |
db | Map | db调用的通用属性 |
traceId |
String |
调用链的唯一标识。 |
三、表结构
CREATE TABLE traces
(
`service_name` String,
`instance_id` String,
`trace_id` String,
`timestamp` DateTime64(3),
`duration` UInt64,
`transaction_name` String, //操作名例如http接口, grpc方法、数据库操作等
`parent_span_id` String,
`status_code` String,
`status_message` String,
`span_kind` String,
`span_id` String,
`span_name` String,
`span_type` String,
`span_result` String,
`sampled` Nullable(Bool),
`host` Map(LowCardinality(String), String) KV,
`os` Map(LowCardinality(String), String) KV,
`process` Map(LowCardinality(String), String) KV,
`service` Map(LowCardinality(String), String) KV,
`telemetry` Map(LowCardinality(String), String) KV,
`net` Map(LowCardinality(String), String) KV,
`thread` Map(LowCardinality(String), String) KV,
`http` Map(LowCardinality(String), String) KV,
`rpc` Map(LowCardinality(String), String) KV,
`db` Map(LowCardinality(String), String) KV,
`messaging` Map(LowCardinality(String), String) KV,
`faas` Map(LowCardinality(String), String) KV,
`exception` Array(Map(LowCardinality(String), String)),
`ref` Map(LowCardinality(String), String) KV,
`source` Map(LowCardinality(String), String) KV,
`other` Map(LowCardinality(String), String) KV, //自定义的attribute属性
`update_time` DateTime DEFAULT now(),
INDEX traceIdx trace_id TYPE bloom_filter(0.01) GRANULARITY 1,
)
ENGINE = CnchMergeTree
PARTITION BY toStartOfInterval(timestamp, toIntervalHour(12))
PRIMARY KEY (tenant_code, project_code, deployment, service_name, timestamp)
ORDER BY (tenant_code, project_code, deployment, service_name, timestamp, trace_id)
TTL toStartOfInterval(timestamp, toIntervalHour(12)) + toIntervalMonth(1)
SETTINGS index_granularity = 8192, storage_policy = 'cnch_default_s3', enable_local_disk_cache = 1 │
我们目前表结构常用属性都已经提取出来了,但是缺乏了必要的索引,下面我们加上必要的索引:
自定义属性加索引:
-
alter table carms_traces__paasTenant add INDEX attribute_idx mapKeys(other) TYPE bloom_filter GRANULARITY 1;
-
alter table carms_traces__paasTenant add INDEX attribute_val_idx mapValues(other) TYPE bloom_filter GRANULARITY 1;
服务名、实例ip、操作名、span_name加索引
-
alter table carms_traces__paasTenant add INDEX service_name_idx service_name TYPE bloom_filter GRANULARITY 1;
-
alter table carms_traces__paasTenant add INDEX instance_id_idx instance_id TYPE bloom_filter GRANULARITY 1;
-
alter table carms_traces__paasTenant add INDEX transaction_name_idx transaction_name TYPE bloom_filter GRANULARITY 1;
-
alter table carms_traces__paasTenant add INDEX span_name_idx span_name TYPE bloom_filter GRANULARITY 1
时间和耗时字段加索引
-
alter table carms_traces__paasTenant add INDEX timestamp_idx timestamp TYPE minmax GRANULARITY 1;
-
alter table carms_traces__paasTenant add INDEX duration_idx duration TYPE minmax GRANULARITY 1;
net和db字段加索引
-
alter table carms_traces__paasTenant add INDEX net_idx mapKeys(net) TYPE bloom_filter GRANULARITY 1;
-
alter table carms_traces__paasTenant add INDEX net_val_idx mapValues(net) TYPE bloom_filter GRANULARITY 1;
-
alter table carms_traces__paasTenant add INDEX db_idx mapKeys(db) TYPE bloom_filter GRANULARITY 1;
-
alter table carms_traces__paasTenant add INDEX net_val_idx mapValues(db) TYPE bloom_filter GRANULARITY 1;