V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
leeqingshui
V2EX  ›  程序员

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

  •  
  •   leeqingshui · 2023-03-21 17:59:57 +08:00 · 1084 次点击
    这是一个创建于 647 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

    当存储端为 MySQL 时,在 Skywalking 的 UI 日志功能界面可以显示 TraceId (追踪 ID ),

    但是,如果将存储端设置为 ES 时,TraceId 就无法显示,如下图:

    image-20230321175144875

    我看了下 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 再处理一层才行嘛?

    amwyyyy
        1
    amwyyyy  
       2023-03-21 18:41:04 +08:00
    去 github 提 issue 啊
    leeqingshui
        2
    leeqingshui  
    OP
       2023-03-22 11:01:08 +08:00
    @amwyyyy 找到一圈 issue 终于找到原因了,不是数据结构的问题,原因是由于日志配置的问题引起的:日志配置不能配置为异步输出
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2118 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 00:51 · PVG 08:51 · LAX 16:51 · JFK 19:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.