如何使用NRQL统计单条日志中指定ID的出现次数?
统计JSON数组中指定ID的出现次数方法
当然可以实现,具体分两种场景处理:
一、日志查询引擎支持JSON解析(推荐)
如果用的是BigQuery、Splunk、Elasticsearch这类支持JSON字段处理的日志系统,直接解析数组再统计是最准确的方式:
步骤逻辑
- 把
my.failures字段解析为JSON数组 - 将数组拆分成单行记录(每条数组元素对应一行)
- 过滤出
id等于"one"的条目,最后统计总数
各引擎示例
- BigQuery:
SELECT COUNT(*) AS total_one_count FROM Log, UNNEST(JSON_EXTRACT_ARRAY(my.failures)) AS failure WHERE JSON_VALUE(failure, '$.id') = 'one'
- Splunk:
| from Log | spath input=my.failures output=failure path={} | mvexpand failure | spath input=failure output=id path=id | search id="one" | stats count AS total_one_count
- Elasticsearch:
{ "query": { "match": { "my.failures.id": "one" } }, "aggs": { "total_one_count": { "nested": { "path": "my.failures" }, "aggs": { "filtered_ids": { "filter": { "match": { "my.failures.id": "one" } }, "aggs": { "count": { "value_count": { "field": "my.failures.id" } } } } } } } }
二、仅支持基础字符串操作的场景
如果你的查询工具不支持JSON解析,只能用字符串处理来近似统计:
核心是通过计算"id": "one"的出现次数——把字符串中所有该子串替换为空,用原长度减替换后的长度,再除以子串长度,得到单条日志里的出现次数,最后求和所有符合条件的日志。
示例SQL(不同引擎函数名可能略有差异,REPLACE和LENGTH是通用的):
SELECT SUM( (LENGTH(my.failures) - LENGTH(REPLACE(my.failures, '"id": "one"', ''))) / LENGTH('"id": "one"') ) AS total_one_count FROM Log WHERE my.failures LIKE '%one%'
⚠️ 注意:这种方法要保证"id": "one"不会出现在其他字段(比如file的文件名)里,否则会统计错误。
内容的提问来源于stack exchange,提问作者Harts
相关产品推荐
相关产品推荐

