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 "(?<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 | 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_tasks
、queued_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 消息中绘制数据的主要内容,如果未能解决你的问题,请参考以下文章