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

查看 19|回复 0
作者: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 再处理一层才行嘛?
您需要登录后才可以回帖 登录 | 立即注册

返回顶部