如何在 K8S ingress-nginx 指标中正确记录 "Path"
How to properly log the "Path" in K8S ingress-nginx metrics
我在 K8S 上使用 ingress-nginx 作为我的一项服务 运行 的 Ingress 控制器(我使用的是 nginx-0.20.0 发布映像,在ingress-controller 正在使用的 K8S configmap)。
nginx-ingress-controller pods 已成功抓取到我的 Prometheus 服务器,但所有入口指标(例如 nginx_ingress_controller_request_duration_seconds_bucket
)都显示为 path="/"
,而不管真实路径已处理请求。
值得注意的是,当我查看入口日志时 - 路径记录正确。
如何获取导出指标中记录的真实路径?
谢谢!
如果我没理解错的话,这个标签因为导致高基数而被删除:https://github.com/kubernetes/ingress-nginx/issues/2924#issuecomment-424516095
这是更普遍的问题:https://github.com/kubernetes/ingress-nginx/pull/2701
不得不说我非常同意 - 想一想:如果您允许路由作为标签值,那么对您的 Prometheus 进行 DDoS 攻击会非常容易 - 只需使用大量不存在的路由调用您的服务即可。
所有这些调用都将转换为所有入口指标的标签值....
prometheus 收集的 NGINX 指标中的 Path
属性源自 Ingress 定义 yaml。
例如,如果您的入口是:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: <some-k8s-ingress-name>
namespace: <some-k8s-namespace-name>
spec:
rules:
- host: <hostname>
http:
paths:
- backend:
serviceName: <some-k8s-service-name>
servicePort: <some-port>
path: /
然后尽管 NGINX 会将任何 URL 匹配到您的服务,但它会全部记录在路径“/
”下(如 here 所示)。
如果您想要特定 URL 的指标,您需要像这样明确指定它(注意规则的顺序):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: <some-k8s-ingress-name>
namespace: <some-k8s-namespace-name>
spec:
rules:
- host: <hostname>
http:
paths:
- backend:
serviceName: <some-k8s-service-name>
servicePort: <some-port>
path: /more/specific/path
- backend:
serviceName: <some-k8s-service-name>
servicePort: <some-port>
path: /
我在 K8S 上使用 ingress-nginx 作为我的一项服务 运行 的 Ingress 控制器(我使用的是 nginx-0.20.0 发布映像,在ingress-controller 正在使用的 K8S configmap)。
nginx-ingress-controller pods 已成功抓取到我的 Prometheus 服务器,但所有入口指标(例如 nginx_ingress_controller_request_duration_seconds_bucket
)都显示为 path="/"
,而不管真实路径已处理请求。
值得注意的是,当我查看入口日志时 - 路径记录正确。
如何获取导出指标中记录的真实路径?
谢谢!
如果我没理解错的话,这个标签因为导致高基数而被删除:https://github.com/kubernetes/ingress-nginx/issues/2924#issuecomment-424516095
这是更普遍的问题:https://github.com/kubernetes/ingress-nginx/pull/2701
不得不说我非常同意 - 想一想:如果您允许路由作为标签值,那么对您的 Prometheus 进行 DDoS 攻击会非常容易 - 只需使用大量不存在的路由调用您的服务即可。
所有这些调用都将转换为所有入口指标的标签值....
prometheus 收集的 NGINX 指标中的 Path
属性源自 Ingress 定义 yaml。
例如,如果您的入口是:
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: <some-k8s-ingress-name>
namespace: <some-k8s-namespace-name>
spec:
rules:
- host: <hostname>
http:
paths:
- backend:
serviceName: <some-k8s-service-name>
servicePort: <some-port>
path: /
然后尽管 NGINX 会将任何 URL 匹配到您的服务,但它会全部记录在路径“/
”下(如 here 所示)。
如果您想要特定 URL 的指标,您需要像这样明确指定它(注意规则的顺序):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
annotations:
kubernetes.io/ingress.class: nginx
name: <some-k8s-ingress-name>
namespace: <some-k8s-namespace-name>
spec:
rules:
- host: <hostname>
http:
paths:
- backend:
serviceName: <some-k8s-service-name>
servicePort: <some-port>
path: /more/specific/path
- backend:
serviceName: <some-k8s-service-name>
servicePort: <some-port>
path: /