如何在Splunk中无需子查询过滤出占99.9%流量的请求详情
单遍数据处理实现保留99.9%流量请求分类的散点图数据生成
问题描述
我需要基于服务访问日志构建散点图:X轴为每小时总请求数,Y轴为特定请求分类每小时的请求次数,最终输出格式为requestDetails, per_hour, count。
当前使用的查询语句为:
<base query setting requestDetails>| bucket _time span=1h| stats count by _time, requestDetails| eventstats sum(count) as per_hour by _time| table requestDetails, per_hour, count
但存在低频请求干扰图表的问题,希望仅保留占99.9%流量的requestDetails。尝试过子查询方案,但两次提取数据成本高,且预过滤会导致per_hour值缺失被过滤行的数据,因此想通过eventstats或streamstats单遍处理数据实现后过滤,请问是否可行?若可行,查询语句是什么?
解决方案
可行,通过eventstats结合累积百分比计算可以实现单遍处理后过滤。具体查询语句如下:
<base query setting requestDetails> | bucket _time span=1h | stats count as req_count by _time, requestDetails | eventstats sum(req_count) as per_hour by _time | eventstats sum(req_count) as total_by_req by requestDetails | eventstats sum(total_by_req) as global_total | eval req_pct = total_by_req / global_total | sort -req_pct | streamstats sum(req_pct) as cumulative_pct | where cumulative_pct <= 0.999 | table requestDetails, per_hour, req_count | rename req_count as count
语句解释
- 先按小时和请求分类统计每类请求的小时次数
req_count,同时用eventstats计算每小时总请求数per_hour。 - 再用
eventstats统计每个requestDetails的全局总请求量total_by_req,以及所有请求的全局总流量global_total。 - 计算每个请求分类的流量占比
req_pct,按占比降序排序后,用streamstats计算累积占比cumulative_pct。 - 过滤累积占比≤99.9%的请求分类,最后调整字段名并输出所需格式。
这种方式仅遍历一次原始数据,避免了子查询的重复提取,同时per_hour基于完整小时数据计算,不会因过滤出现数据缺失。
内容的提问来源于stack exchange,提问作者John Arrowwood
相关产品推荐
相关产品推荐

