如何在K8S ingress-nginx指标中正确记录“路径”

时间:2019-02-03 14:09:24

标签: nginx kubernetes prometheus nginx-ingress

我正在将ingress-nginx用作在K8S上运行的一项服务的入口控制器(我正在使用Nginx-0.20.0发行映像,但K8S configmap中没有特定的指标配置入口控制器正在使用)。

nginx-ingress-controller吊舱已成功爬入我的Prometheus服务器,但是所有入口指标(例如nginx_ingress_controller_request_duration_seconds_bucket)都显示为path="/",无论已处理请求的实际路径如何。

值得一提的是,当我查看入口日志时-路径已正确记录。

如何获取导出的指标中记录的真实路径?

谢谢!

2 个答案:

答案 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: /