如何使用 AWS Cloudwatch Log Insights 的 replace 功能?
文档没有给出工作示例。
给定的日志包含诸如
/api/lumberjack/123/axe/456/fashion
之类的路径
我正在努力:
fields message
| parse message "path=* " as path
| fields replace(path, /[0123456789]+/, 'ID') as uniqpath
| stats count(*) by uniqpath
我希望得到这样的结果:
uniqpath | count
/api/lumberjack/ID/axe/ID/fashion | 12
/api/lumberjack/ID/beardedness | 44
但它却抱怨“无效的参数,收到:(路径)但预期:(str:字符串,searchValue:字符串,replaceValue:字符串)”
你不能一步用正则表达式替换,这是理想的情况。相反,您必须梳理出可能的 id,合并为其提供默认值,然后用占位符替换该显式值。这将允许您获取端点计数,而不考虑特定的记录 ID。
这个简单版本适用于最多具有一个 id 的端点:
filter path like /\/api\/v/
| parse path /(?<@id1>\/[0-9]+)(\/|$)/
| fields coalesce(@id1, "") as id1
| fields replace(path, id1, "/{id}") as unique_path
| stats count(*) as requests by unique_path
| sort requests desc
| display unique_path, requests
如果您的记录 ID 更复杂,您可以相应地更新正则表达式。我必须这样做,因为我们的一些应用程序端点接受 ids 作为十六进制字符串,即“0x04f5”。
下一个版本最多可支持 2 个 ID。有关更多信息,您可以查看如何重复给定的模式,但我没有在 URL 路径中找到 n 计数 id 的快捷方式。
filter path like /\/api\/v/
| parse path /(?<@id1>\/[0-9]+)(\/|$)/
| fields coalesce(@id1, "") as id1
| fields replace(path, id1, "/{id}") as unique_path1
| parse unique_path1 /(?<@id2>\/[0-9]+)(\/|$)/
| fields coalesce(@id2, "") as id2
| fields replace(unique_path1, id2, "/{id2}") as unique_path
| stats count(*) as requests by unique_path
| sort requests desc
| display unique_path, requests
错误消息非常不言自明。
replace
函数需要第一个参数的字符串类型输入。您提供的字段名称path
是不可接受的。
编辑:令我惊讶的是,
replace
函数接受路径作为第一个参数,文档中没有提到这一点。请参阅上面奥马尔的回答。
还没有测试过,但我曾经做过类似的东西,所以你的应该如下所示:
fields @message
| parse @message "path=* " as path
| parse path /(?<@endpt>(\/[0123456789]+\/?))/
| fields replace(path, coalesce(@endpt, ''), '/{id}/') as uniqpath
| stats count(*) by uniqpath
Log Insights 推出了 OpenSearch Sql。您现在可以通过以下方式执行此操作:
SELECT
count(*) as req_count,
regexp_replace(path, '(\/\\d+\/*)', '/<id>/') as regex_path
FROM your-log-group
GROUP BY regexp_replace(path, '(\/\\d+\/*)', '/<id>/')