求解: Skywalking 针对日志存储的数据结构在 MySQL 和 ES 中的不同,导致 UI 日志界面追踪 ID 无法显示的问题

2023-03-21 17:59:57 +08:00
 leeqingshui

Skywalking 可以将应用日志存储起来,默认为内存,可以修改为存储到 MySQL 或 ES 。

当存储端为 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 再处理一层才行嘛?

1041 次点击
所在节点    程序员
2 条回复
amwyyyy
2023-03-21 18:41:04 +08:00
去 github 提 issue 啊
leeqingshui
2023-03-22 11:01:08 +08:00
@amwyyyy 找到一圈 issue 终于找到原因了,不是数据结构的问题,原因是由于日志配置的问题引起的:日志配置不能配置为异步输出

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/925928

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX