SumoLogic — 从日志中的“状态”json 消息中绘制数据

Posted

技术标签:

【中文标题】SumoLogic — 从日志中的“状态”json 消息中绘制数据【英文标题】:SumoLogic — Plotting data from a "status" json message in the log 【发布时间】:2021-09-13 08:47:21 【问题描述】:

我有一个接受和处理任务的服务。任务有一个状态:排队、运行、失败、取消或完成。有时,该服务会使用 json 输出一个日志条目,如下所示:

2021-09-09 00:30:46,742 [Timer-0] INFO -  "env": "test_environment", "capacity": 10, "available_ec2": 10, "failed_ec2": 0, "running_tasks": 0, "queued_tasks": 0, "finished_tasks": 0, "failed_tasks": 0, "cancelled_tasks": 3,"queue_wait_minutes" :  "max": 0, "mean": -318990, "max_started": 0, "mean_started": -29715 ,"processing_time": "max": 0, "mean": 0 

我想绘制一个饼图,按状态显示任务的细分(json 消息中的“running_tasks”、“queued_tasks”、“finished_tasks”、“failed_tasks”:、“cancelled_tasks”)。到目前为止,我还没有这样做,因为我无法想出如何根据此类消息构建表格。任何线索将不胜感激 - 提前致谢!

【问题讨论】:

【参考方案1】:

试试这样的。基本上,您必须对数据进行反转置。我希望这是有道理的!

...
| parse field=some_log_line "INFO - *" as jsonMessage
| json field=jsonMessage "running_tasks"
| json field=jsonMessage "queued_tasks"
| json field=jsonMessage "finished_tasks"
| "running_tasks,queued_tasks,finished_tasks," as message_keys
| parse regex field=message_keys "(?<message_key>.*?)," multi
| if (message_key="running_tasks", running_tasks, 0) as message_value
| if (message_key="queued_tasks", queued_tasks, message_value) as message_value
| if (message_key="finished_tasks", finished_tasks, message_value) as message_value
| fields message_key, message_value
| max(message_value) by message_key

【讨论】:

这似乎可以解决问题,谢谢!但是,我有一些问题: 1. 即使我删除了 3 个“json field=...”子句(第 3-5 行),它似乎也可以工作 2. 为什么“if (message_key= “运行任务”,运行任务,0)“? 3. 如果我按原样运行查询,running_tasks 显示“1”。如果我添加另一个字段“cancelled_tasks”,running_tasks 显示为 0。到目前为止,我无法弄清楚为什么......任何线索? 没问题! 1:我认为这些行只是我试图在我自己的环境中测试的产物。我认为你可以放心地放弃这些。 2: 0 是初始默认值,因为计数总是从 0 开始。 3: 我想在你添加了额外的字段之后我必须查看查询。我想知道您是否没有在复制/粘贴中的某处更新某些内容? 这是我想出的:| "running_tasks,queued_tasks,finished_tasks,cancelled_tasks," as message_keys | parse regex field=message_keys "(?&lt;message_key&gt;.*?)," multi | if (message_key="running_tasks", running_tasks, 0) as message_value | if (message_key="queued_tasks", queued_tasks, message_value) as message_value | if (message_key="finished_tasks", finished_tasks, message_value) as message_value | if (message_key="cancelled_tasks", cancelled_tasks, message_value) as message_value | fields message_key, message_value | max(message_value) by message_key 嗯,这对我来说是正确的。如果无法看到您的日志行,很难分辨。我唯一能想到的是,您在添加新字段的情况下运行它的时间范围碰巧遇到了显示 running_tasks: 0 的稍后日志行(或者没有 running_tasks 键)。确保在进行故障排除时在绝对时间范围内运行它,这样您就知道您正在查看恒定数据。【参考方案2】:

首先,Sumo Logic supports parsing JSON into fields。在您的示例中,并非整行都是 JSON,而是“-”之后的部分,因此您可以将其添加到查询中:

...
| parse "INFO - *" as jsonMessage
| json auto

那么,可以将running_tasksqueued_tasks等作为普通字段使用,例如

...
| timeslice 1m
| max(running_tasks), max(queued_tasks) by _timeslice

免责声明:我目前受雇于 Sumo Logic。

【讨论】:

感谢您的建议!但是,当我尝试此操作时,我收到以下警告:``` 查询中的数据无法在所选面板类型中绘制。请更改面板类型。 ``` 并且饼图只显示第一个值(“running_tasks”)我怀疑要绘制值,“running_tasks”等应该是rows,而不是columns i> 在结果表中,但我不知道如何制作它。 P.S.:时间序列上的折线图工作正常,但我想将 当前状态 显示为饼图,而不是时间。 @Denethor 你能把你的查询粘贴到这里吗?听起来您的饼图聚合太多。我相信你只能拥有一个(除非我没有关注你)。 当然,是这样的:``` _sourcecategory = "Map-ConflationService" AND _sourcehost = "173.225.29.126" |将“INFO - *”解析为 jsonMessage | json 自动 | max(running_tasks) as r, max(cancelled_tasks) as c, max(queued_tasks) as q by _timeslice ``` 让我知道如何将这 3 个数字挤进饼图中。 噢,我现在明白了。我会发布一个可能会有所帮助的答案...【参考方案3】:

下面是一个纯 python 解决方案,可以绘制数据。

输出 (entries) 是一个字典,其中键是时间戳,值是包含有趣信息的字典。 log_lines 保存日志消息的集合并用作输入。

import json
import pprint

log_lines = [
    '2021-09-09 00:30:46,742 [Timer-0] INFO -  "env": "test_environment", "capacity": 10, "available_ec2": 10, "failed_ec2": 0, "running_tasks": 2, "queued_tasks": 0, "finished_tasks": 0, "failed_tasks": 0, "cancelled_tasks": 3,"queue_wait_minutes" :  "max": 0, "mean": -318990, "max_started": 0, "mean_started": -29715 ,"processing_time": "max": 0, "mean": 0 ',
    '2021-09-09 00:31:46,742 [Timer-0] INFO -  "env": "test_environment", "capacity": 10, "available_ec2": 10, "failed_ec2": 0, "running_tasks": 5, "queued_tasks": 0, "finished_tasks": 0, "failed_tasks": 0, "cancelled_tasks": 3,"queue_wait_minutes" :  "max": 0, "mean": -318990, "max_started": 0, "mean_started": -29715 ,"processing_time": "max": 0, "mean": 0 '
]
entries = dict()

for line in log_lines:
    date = line[:line.find('[') - 1]
    data = json.loads(line[line.find(''):])
    sub_set = k: data.get(k,0) for k in
               ["running_tasks", "queued_tasks", "finished_tasks", "failed_tasks", "cancelled_tasks"]
    entries[date] = sub_set
pprint.pprint(entries)

输出

'2021-09-09 00:30:46,742': 'cancelled_tasks': 3,
                             'failed_tasks': 0,
                             'finished_tasks': 0,
                             'queued_tasks': 0,
                             'running_tasks': 2,
 '2021-09-09 00:31:46,742': 'cancelled_tasks': 3,
                             'failed_tasks': 0,
                             'finished_tasks': 0,
                             'queued_tasks': 0,
                             'running_tasks': 5

【讨论】:

感谢您的回答!有没有办法将 python sn-ps 包含到 Sunologic 查询中? OP 专门询问 Sumo Logic。 @the-nick-wilson - OP 在帖子中究竟在哪里要求 Sunologic?你能分享吗?如果你不能 - 请删除反对票。 嗯,标题以“SumoLogic”开头,帖子也标记为“sumologic”;) 但帖子正文中没有任何内容表明它必须使用 SumoLogic 特定技术。这就是为什么我花了一些时间写我的答案..

以上是关于SumoLogic — 从日志中的“状态”json 消息中绘制数据的主要内容,如果未能解决你的问题,请参考以下文章

Sumologic - 将 JSON 数组拆分为多条记录

是否可以在 sumologic 中解析嵌套的 json?

如何从 SumoLogic 警报中排除尖峰?

如何将 PM2 日志写入 sumologic?

如何在 Sumologic 中重新处理原始日志

Sumologic 中的聚合通配符