如何在 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: /