基于应用日志JSON数据在Splunk中创建Pie chart的方法
问题描述
我的应用每日生成包含饼图所需映射的JSON格式日志,示例数据如下:
{ "telemetryEventName": "active-deliveries", "telemetryData": [ { "id": "1", "name": "repo-01", "gitTextsInformation": [ { "key": "es-ES", "value": "47" }, { "key": "pt-BR", "value": "46" } ] }, { "id": "2", "name": "repo-02", "gitTextsInformation": [ { "key": "es-ES", "value": "12" }, { "key": "pt-BR", "value": "13" } ] } ] }
该数据来自日志消息,我希望为每个gitTextsInformation生成饼图。曾尝试使用以下搜索语句创建表格:
"index"="main" "kubernetes.container_name"="..." logger_name=telemetryLogger message.telemetryEventName="..." | head 1 | table message.telemetryData{}.gitTextsInformation{}.key message.telemetryData{}.gitTextsInformation{}.value
但该搜索语句无法用于创建饼图,请求可行的解决方案。
解决方案
问题根源是嵌套数组没被正确展平——Splunk饼图要求每行对应一个「类别-数值」对的结构化数据,而不是数组形式的字段。按以下步骤调整搜索语句就能解决:
- 用
spath提取嵌套字段,确保能访问到telemetryData数组里的每个元素 - 用
mvexpand展开telemetryData数组,让每个仓库单独占一行 - 把
gitTextsInformation里的key和value配对后再展开,拆成独立的行 - 转换数值类型,适配饼图的格式要求
完整搜索语句:
index="main" kubernetes.container_name="..." logger_name=telemetryLogger message.telemetryEventName="..." | head 1 | spath path=message.telemetryData output=telemetryData | mvexpand telemetryData | spath input=telemetryData path=name output=repo_name | spath input=telemetryData path=gitTextsInformation{}.key output=lang_keys | spath input=telemetryData path=gitTextsInformation{}.value output=lang_values | eval lang_pairs=mvzip(lang_keys, lang_values, "|") | mvexpand lang_pairs | eval lang=mvindex(split(lang_pairs, "|"), 0), count=mvindex(split(lang_pairs, "|"), 1) | convert num(count) | table repo_name lang count
关键步骤说明
spath:从JSON里精准提取仓库名、语言标识和对应数值mvexpand:两次展开数组——先把每个仓库拆成单独行,再把每个语言-数值对拆成单独行mvzip:把对应的语言和数值绑定成字符串,避免拆分时错位convert num(count):把字符串类型的数值转成数字,保证饼图能正确计算占比
生成表格后,直接切换到可视化面板选择饼图即可,还能通过repo_name筛选特定仓库,生成对应单独的饼图。
内容的提问来源于stack exchange,提问作者Padovani
相关产品推荐
相关产品推荐

