通过正则表达式 logql 提取 loki ingress-nginx 标签
loki ingress-nginx label extraction via regexp logql
{namespace="ingress-nginx"} |= "gymauto-frontend" |~ "GET (/main)" | json
我得到这些条目
现在我需要从“log”标签中提取请求的持续时间,但我不确定如何构造 logql 查询,所以我可以做这样的事情
{namespace="ingress-nginx"} |= "gymauto-frontend" |~ "GET (/main)" | json | ...regexp () | duration > 10s
所以我只能过滤超过 10 秒的查询 GET /main*。
日志示例:
10.110.1.132 - - [27/Aug/2021:02:37:06 +0000] "GET /main.d8e010115d6aba1bd049.js.map HTTP/2.0" 200 10842370 "https://gym.com/students/edit/173" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15" 34 20.031 [gymauto-gymauto-frontend-service-v1-8080] [] 10.110.5.217:8080 10842370 20.035 200 a7c4299aaa7ea674e91d13315
如果您可以使用 Loki v2.3,您应该可以使用 newly introduced pattern
解析器表达式。
使用它代替旧的 regexp
解析器会更容易。在您的示例中,模式如下:
<_> - - <_> "<method> <path> <_>" <status> <_> "<_>" "<_>" <_> <duration> [<service>] [<_>] <_> <_> <_> <_> <_>
应该可以。在这种情况下,我们从日志中提取我们想要使用的部分:method
、path
、service
、duration
等。过滤查询 GET
对 gymauto-frontend
服务上 /main.*
路径的请求可能类似于:
{namespace="ingress-nginx"}
| pattern `<_> - - <_> "<method> <path> <_>" <status> <_> "<_>" "<_>" <_> <duration> [<service>] [<_>] <_> <_> <_> <_> <_>`
如果您检查(在 Grafana 中)提取的日志字段,您应该看到如下内容:
您可以注意到,仅提取命名字段,忽略日志行的其余部分。现在我们可以过滤您感兴趣的特定条目:
{namespace="ingress-nginx"}
| pattern `<_> - - <_> "<method> <path> <_>" <status> <_> "<_>" "<_>" <_> <duration> [<service>] [<_>] <_> <_> <_> <_> <_>`
| service=~".*gymauto-frontend.*"
| method="GET"
| path=~"/main.*"
| duration > 10
如果您使用的是旧版本的 Loki,那么您需要将 pattern
解析器表达式替换为 regexp
,并定义一个与您的日志条目匹配的正则表达式。
{namespace="ingress-nginx"} |= "gymauto-frontend" |~ "GET (/main)" | json
我得到这些条目
现在我需要从“log”标签中提取请求的持续时间,但我不确定如何构造 logql 查询,所以我可以做这样的事情
{namespace="ingress-nginx"} |= "gymauto-frontend" |~ "GET (/main)" | json | ...regexp () | duration > 10s
所以我只能过滤超过 10 秒的查询 GET /main*。
日志示例:
10.110.1.132 - - [27/Aug/2021:02:37:06 +0000] "GET /main.d8e010115d6aba1bd049.js.map HTTP/2.0" 200 10842370 "https://gym.com/students/edit/173" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15" 34 20.031 [gymauto-gymauto-frontend-service-v1-8080] [] 10.110.5.217:8080 10842370 20.035 200 a7c4299aaa7ea674e91d13315
如果您可以使用 Loki v2.3,您应该可以使用 newly introduced pattern
解析器表达式。
使用它代替旧的 regexp
解析器会更容易。在您的示例中,模式如下:
<_> - - <_> "<method> <path> <_>" <status> <_> "<_>" "<_>" <_> <duration> [<service>] [<_>] <_> <_> <_> <_> <_>
应该可以。在这种情况下,我们从日志中提取我们想要使用的部分:method
、path
、service
、duration
等。过滤查询 GET
对 gymauto-frontend
服务上 /main.*
路径的请求可能类似于:
{namespace="ingress-nginx"}
| pattern `<_> - - <_> "<method> <path> <_>" <status> <_> "<_>" "<_>" <_> <duration> [<service>] [<_>] <_> <_> <_> <_> <_>`
如果您检查(在 Grafana 中)提取的日志字段,您应该看到如下内容:
您可以注意到,仅提取命名字段,忽略日志行的其余部分。现在我们可以过滤您感兴趣的特定条目:
{namespace="ingress-nginx"}
| pattern `<_> - - <_> "<method> <path> <_>" <status> <_> "<_>" "<_>" <_> <duration> [<service>] [<_>] <_> <_> <_> <_> <_>`
| service=~".*gymauto-frontend.*"
| method="GET"
| path=~"/main.*"
| duration > 10
如果您使用的是旧版本的 Loki,那么您需要将 pattern
解析器表达式替换为 regexp
,并定义一个与您的日志条目匹配的正则表达式。