Splunk关联两次搜索按平台统计错误运行数方案咨询
Splunk查询修改方案
问题原因
你之前的查询存在两处核心问题:
- 第一个查询提前执行
stats count by Platform丢弃了RUNID字段,后续关联时没有主键,无法区分哪些RUNID存在错误 - 使用left join会保留全部平台的RUNID记录,就算没有匹配到错误日志也会留存,统计时自然会把无错误的运行也计入总数
实现方案
方案1:JOIN关联实现(适合数据量较小的场景)
先提取所有RUNID和对应平台的映射关系,再和有错误的RUNID做内连接,仅保留存在错误的RUNID后按平台统计:
index="myIndex" "started with profile" BD_L* | rex "Discovery run, (?<RUNID>.+) started with profile" | eval Platform=case(searchmatch("LINUX"),"LINUX",searchmatch("AIX"),"AIX",searchmatch("DB2"),"DB2", searchmatch("SQL"),"SQL", searchmatch("WEBSPHERE"),"WEBSPHERE", searchmatch("SYBASE"),"SYBASE", searchmatch("WINDOWS"),"WINDOWS", true(),"ZLINUX") | stats values(Platform) as Platform by RUNID | join type=inner RUNID [ search index="myIndex" source="/*/RUNID/*" CASE("ERROR") CTJT* | rex "Run ID: (?<RUNID>\d+)" | dedup RUNID | fields RUNID ] | stats count by Platform | rename count AS "错误运行总量"
方案2:单查询聚合实现(性能更优,适合大数据量场景)
一次性拉取两类日志,按RUNID聚合判断是否同时存在启动记录和错误记录,再统计各平台的错误运行数:
index="myIndex" (("started with profile" BD_L*) OR (source="/*/RUNID/*" CASE("ERROR") CTJT*)) | rex "Discovery run, (?<RUNID>.+) started with profile" | rex "Run ID: (?<RUNID>\d+)" | eval is_start_log=if(searchmatch("started with profile"),1,0) | eval is_error_log=if(searchmatch("ERROR") AND searchmatch("CTJT"),1,0) | eval Platform=case(searchmatch("LINUX"),"LINUX",searchmatch("AIX"),"AIX",searchmatch("DB2"),"DB2", searchmatch("SQL"),"SQL", searchmatch("WEBSPHERE"),"WEBSPHERE", searchmatch("SYBASE"),"SYBASE", searchmatch("WINDOWS"),"WINDOWS", true(),"ZLINUX") | stats max(is_start_log) as has_start, max(is_error_log) as has_error, values(Platform) as Platform by RUNID | where has_start=1 AND has_error=1 | stats count by Platform | rename count AS "错误运行总量"
逻辑说明
两种方案的核心逻辑一致:
- 先建立RUNID和对应平台的唯一映射
- 提取所有存在错误的RUNID并去重,保证每个有错误的运行只计数1次
- 仅保留同时存在启动记录和错误记录的RUNID,最后按平台统计数量
内容的提问来源于stack exchange,提问作者Niek Jonkman
相关产品推荐
相关产品推荐

