当存储端为 MySQL 时,在 Skywalking 的 UI 日志功能界面可以显示 TraceId (追踪 ID ),
但是,如果将存储端设置为 ES 时,TraceId 就无法显示,如下图:
我看了下 Skywalking 在 MySQL 和 ES 的数据结构,在 MySQL 中是这样的:
CREATE TABLE log
(
id varchar(512) NOT NULL
PRIMARY KEY,
unique_id varchar(200) NULL,
service_id varchar(200) NULL,
service_instance_id varchar(200) NULL,
endpoint_id varchar(200) NULL,
-- 这里存储了 trace_id
trace_id varchar(150) NULL,
trace_segment_id varchar(150) NULL,
span_id int NULL,
content_type int NULL,
content mediumtext NULL,
timestamp bigint NULL,
tags_raw_data mediumtext NULL,
tags_0 varchar(200) NULL,
tags_1 varchar(200) NULL,
tags_2 varchar(200) NULL,
tags_3 varchar(200) NULL,
tags_4 varchar(200) NULL,
tags_5 varchar(200) NULL,
tags_6 varchar(200) NULL,
tags_7 varchar(200) NULL,
tags_8 varchar(200) NULL,
tags_9 varchar(200) NULL,
tags_10 varchar(200) NULL,
tags_11 varchar(200) NULL,
tags_12 varchar(200) NULL,
tags_13 varchar(200) NULL,
tags_14 varchar(200) NULL,
tags_15 varchar(200) NULL,
tags_16 varchar(200) NULL,
tags_17 varchar(200) NULL,
tags_18 varchar(200) NULL,
tags_19 varchar(200) NULL,
time_bucket bigint NULL
);
但是,在 ES 中,是这样存储的:
{
"_index": "skywalking_log-20230321",
"_type": "_doc",
"_id": "bbdd208df28c4521aa436dbfd9a26a3a",
"_version": 1,
"_seq_no": 132,
"_primary_term": 1,
"found": true,
"_source": {
"unique_id": "bbdd208df28c4521aa436dbfd9a26a3a",
"span_id": 0,
"service_instance_id": "Z29sZGVuLXNlcnZpY2UtZmFjZQ==.1_MWJlOGE0N2QxOTM1NDM1NGEzMzJmMGNkM2ViYzQ4MzZAMTcyLjE3LjAuMQ==",
"content": "2023-03-21 16:31:46.935 [TID:ee137820a72441a4a119ede353229b10.92.16793875068960035] INFO",
"tags": [
"level=INFO"
],
"content_type": 1,
"tags_raw_data": "Cg0KBWxldmVsEgRJTkZPCi4KBmxvZ2dlchIkY29tLnprc2ouY29tbW9uLmxvZy5hc3BlY3QuTG9nQXNwZWN0Ch4KBnRocmVhZBIUaHR0cC1uaW8tOTIxMS1leGVjLTI=",
"service_id": "Z29sZGVuLXNlcnZpY2UtZmFjZQ==.1",
"time_bucket": 20230321163146,
"timestamp": 1679387506935
}
}
也就是说,其实日志在 ES 中的索引结构根本就没有 TraceId
这种情况下,需要修改什么设置才能让索引结构增加 TraceId 字段,使得 Skywalking 的 UI 界面中可以显示
TraceId ,方便搜索。
各位大佬用 Skywalking 集成 ES 时,是怎么解决这个问题的呢?
搜索了很多文章,似乎都没有提到这个问题,难道必须通过 Logstash 再处理一层才行嘛?