我正在将ingress-nginx用作在K8S上运行的一项服务的入口控制器(我正在使用Nginx-0.20.0发行映像,但K8S configmap中没有特定的指标配置入口控制器正在使用)。
nginx-ingress-controller吊舱已成功爬入我的Prometheus服务器,但是所有入口指标(例如nginx_ingress_controller_request_duration_seconds_bucket
)都显示为path="/"
,无论已处理请求的实际路径如何。
值得一提的是,当我查看入口日志时-路径已正确记录。
如何获取导出的指标中记录的真实路径?
谢谢!
答案 0 :(得分:1)
如果我理解正确,则此标签被删除,因为该标签会导致高基数:https://github.com/kubernetes/ingress-nginx/issues/2924#issuecomment-424516095
这是更普遍的问题:https://github.com/kubernetes/ingress-nginx/pull/2701
不得不说,我非常同意-想一想:如果您允许该路由成为标签值,则可以很容易地对您的Prometheus进行DDoS操作-只需使用很多不存在的路由来呼叫您的服务即可。
所有这些调用都将转换为所有入口指标的标签值。...
答案 1 :(得分:0)
普罗米修斯(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匹配到您的服务,但所有URL都将记录在路径“ /
”下(如here所示)。
如果您想要特定网址的指标,则需要像这样明确指定它(请注意规则的顺序):
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: /