Collectd 不接受带有 nginx-ingress 标签的指标
Collectd not accepting metrics with nginx-ingress tag
我是 运行 一个有两个容器的 pod:global-metrics-generator
和 collectd-statsd
。在容器 global-metrics-generator
中,我是 运行 作为 cron 的 python 脚本,它负责获取 k8s 集群中的所有 pods 并推送与 pod cpu 相关的指标和 localhost:28125
的内存,它正在被 collectd-statsd
容器内的 collectd 进程 运行 监听。我在脚本中使用 python statsd 客户端将这些指标从 global-metrics-generator
推送到 collectd-statsd
容器。
我已经使用这个设置将近 1 年了,它一直在无缝运行。但最近我在我的系统中引入了一个 nginx-ingress pod,尽管我看到 python 脚本将 nginx-ingress
pod 的 cpu/memory 指标发送到 collectd,但该指标并未在 /var/lib/collectd/
文件夹在 collectd-statsd
容器中。对于我的 k8s 集群中的任何其他 pod,它都按预期工作。
奇怪的事情:
当我将 nginx-ingress 的 pod 名称更改为任何其他名称以使其中没有单词 ingress
例如:nginx-ingres
(注意单个 s
),我我看到 /var/lib/collectd/
文件夹中收集了该指标。
带有自定义标签的最终指标的结构如下所示:
有效方法 - [container=nginx-ingres,name=nginx-ingres-6bf8b67bb7-ndmjn,replicaset=nginx-ingres-6bf8b67bb7,ip=100.101.28.65,host_ip=10.36.40.229,Namespace=nginx-ingress]container.cpu.usage
什么不起作用 - [container=nginx-ingress,name=nginx-ingress-599c78d7b6-psxns,replicaset=nginx-ingress-599c78d7b6,ip=100.102.33.199,Namespace=nginx-ingress,host_ip=10.36.40.170]container.cpu.usage
我在网上找不到与此相关的任何内容,但是 collectd/statsd 中是否保留了词入口?如果是这样,那么知道为什么我能够将 Namespace=nginx-ingress
标签与指标一起传递吗?
我真的想通了。有趣的是,这个问题与 ingress
.
这个词无关
我们向应用程序发出的任何指标添加了大量自定义维度。
Collectd 将指标名称和键、值对(维度)与指标一起传递,并将其作为文件存储在 /var/lib/collectd/
目录中,例如[container=nginx-ingres,name=nginx-ingres-6bf8b67bb7-ndmjn,replicaset=nginx-ingres-6bf8b67bb7,ip=100.101.28.65,host_ip=10.36.40.229,Namespace=nginx-ingress]container.cpu.usage
。
这些文件包含发出的指标的实际值。由于文件名中包含所有维度,因此文件名的长度通常很长。
Linux 文件名的长度限制为 255 个字符。阅读:https://unix.stackexchange.com/questions/32795/what-is-the-maximum-allowed-filename-and-folder-size-with-ecryptfs。由于我们将维度 container=nginx-ingress
与一些已经存在的维度一起添加到我们所有的指标中,我们最终达到了 256 个字符。在了解文件名长度限制之前调试问题时,我怀疑 ingress
可能是一个保留字,因此尝试使用 ingres
实际上有效,但它所做的只是减少了文件名的长度到 255 个字符。
我们通过从所有指标中删除一些不必要的自定义标签解决了这个问题。
我是 运行 一个有两个容器的 pod:global-metrics-generator
和 collectd-statsd
。在容器 global-metrics-generator
中,我是 运行 作为 cron 的 python 脚本,它负责获取 k8s 集群中的所有 pods 并推送与 pod cpu 相关的指标和 localhost:28125
的内存,它正在被 collectd-statsd
容器内的 collectd 进程 运行 监听。我在脚本中使用 python statsd 客户端将这些指标从 global-metrics-generator
推送到 collectd-statsd
容器。
我已经使用这个设置将近 1 年了,它一直在无缝运行。但最近我在我的系统中引入了一个 nginx-ingress pod,尽管我看到 python 脚本将 nginx-ingress
pod 的 cpu/memory 指标发送到 collectd,但该指标并未在 /var/lib/collectd/
文件夹在 collectd-statsd
容器中。对于我的 k8s 集群中的任何其他 pod,它都按预期工作。
奇怪的事情:
当我将 nginx-ingress 的 pod 名称更改为任何其他名称以使其中没有单词 ingress
例如:nginx-ingres
(注意单个 s
),我我看到 /var/lib/collectd/
文件夹中收集了该指标。
带有自定义标签的最终指标的结构如下所示:
有效方法 - [container=nginx-ingres,name=nginx-ingres-6bf8b67bb7-ndmjn,replicaset=nginx-ingres-6bf8b67bb7,ip=100.101.28.65,host_ip=10.36.40.229,Namespace=nginx-ingress]container.cpu.usage
什么不起作用 - [container=nginx-ingress,name=nginx-ingress-599c78d7b6-psxns,replicaset=nginx-ingress-599c78d7b6,ip=100.102.33.199,Namespace=nginx-ingress,host_ip=10.36.40.170]container.cpu.usage
我在网上找不到与此相关的任何内容,但是 collectd/statsd 中是否保留了词入口?如果是这样,那么知道为什么我能够将 Namespace=nginx-ingress
标签与指标一起传递吗?
我真的想通了。有趣的是,这个问题与 ingress
.
我们向应用程序发出的任何指标添加了大量自定义维度。
Collectd 将指标名称和键、值对(维度)与指标一起传递,并将其作为文件存储在 /var/lib/collectd/
目录中,例如[container=nginx-ingres,name=nginx-ingres-6bf8b67bb7-ndmjn,replicaset=nginx-ingres-6bf8b67bb7,ip=100.101.28.65,host_ip=10.36.40.229,Namespace=nginx-ingress]container.cpu.usage
。
这些文件包含发出的指标的实际值。由于文件名中包含所有维度,因此文件名的长度通常很长。
Linux 文件名的长度限制为 255 个字符。阅读:https://unix.stackexchange.com/questions/32795/what-is-the-maximum-allowed-filename-and-folder-size-with-ecryptfs。由于我们将维度 container=nginx-ingress
与一些已经存在的维度一起添加到我们所有的指标中,我们最终达到了 256 个字符。在了解文件名长度限制之前调试问题时,我怀疑 ingress
可能是一个保留字,因此尝试使用 ingres
实际上有效,但它所做的只是减少了文件名的长度到 255 个字符。
我们通过从所有指标中删除一些不必要的自定义标签解决了这个问题。