searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

调用链表结构设计

2024-08-15 10:17:51
4
0

一、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 时,它是ClientServerInternalProducer, 或 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类型包括以下几种:

  • 0:未指定SPAN_KIND_UNSPECIFIED

  • 1:内部方法SPAN_KIND_INTERNAL

  • 2:服务端SPAN_KIND_SERVER

  • 3:客户端SPAN_KIND_CLIENT

  • 4:生产者SPAN_KIND_PRODUCER

  • 5:消费者SPAN_KIND_CONSUMER

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状态包括以下几种:

  • 0:未设置STATUS_CODE_UNSET

  • 1:正常STATUS_CODE_OK

  • 2:错误STATUS_CODE_ERROR

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;

 

 

 

 

 

 

 

 

0条评论
作者已关闭评论
李****涛
13文章数
0粉丝数
李****涛
13 文章 | 0 粉丝
原创

调用链表结构设计

2024-08-15 10:17:51
4
0

一、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 时,它是ClientServerInternalProducer, 或 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类型包括以下几种:

  • 0:未指定SPAN_KIND_UNSPECIFIED

  • 1:内部方法SPAN_KIND_INTERNAL

  • 2:服务端SPAN_KIND_SERVER

  • 3:客户端SPAN_KIND_CLIENT

  • 4:生产者SPAN_KIND_PRODUCER

  • 5:消费者SPAN_KIND_CONSUMER

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状态包括以下几种:

  • 0:未设置STATUS_CODE_UNSET

  • 1:正常STATUS_CODE_OK

  • 2:错误STATUS_CODE_ERROR

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;

 

 

 

 

 

 

 

 

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0