使用 cAdvisor 和 Prometheus 监控未命名的容器

问题描述

我有一台运行 Docker 容器化应用程序的实验主机。 cAdvisor 和 Prometheus 容器也在运行。

应用生成容器以运行与一组命名空间(可能是数千个命名空间)中的一个相关的作业,并使用 uuid 命名容器。 cAdvisor 选择了这些 OK,我可以看到每个容器在 prometheus OK 中的指标使用情况。这些容器的运行时间从几秒钟到大约一个小时不等。

我需要能够将命名空间 ID(来自容器中的 API 调用)与 prometheus 中的指标相关联,因为容器名称对于运行而言是唯一的,我需要通过命名空间 ID 获得它。

This doc 表示不要使用大量不同的标签,因为它会生成大量单独的时间序列,但添加 kv 似乎是最方便的方法

This doc 表示将 pushgateway 用于服务级批处理作业,并且由于我的容器与命名空间相关而不是与整个服务相关,因此使用它似乎不正确。

我每天可能有 5-10 个容器,它们以不同的容器名称运行,这些名称对应于应用程序中的相同命名空间,我需要所有 5-10 个的时间序列。

进行这种关联的最佳方法是什么?
如何从容器内向 prometheus 发送一些任意数据?

解决方法

如果您需要通过某些特征区分一组相同的指标,那么除了使用标签之外,没有其他合理的方法。当标签过多或标签值过多时,就会出现标签和存储问题。请允许我向您展示此示例中的问题:

http_requests{code="200",client="8.8.8.8",uri="/hello"}

只有三个标签,但每个标签都可以产生大量不同的时间序列。每个响应代码、客户端地址和访问的 URL 的每个唯一组合。我想,您的命名空间 ID 具有有限且少量的可能值,因此不会造成任何伤害。唯一的容器名称(cAdvisor 将它们公开为标签)甚至可能比命名空间 ID 具有更大的影响。

还有一种方法可以使用 relabel_config 重写、添加或删除标签。但是,如果您决定重写,该解决方案有点难以掌握并且很容易在腿上射击。如果可能的命名空间数量很少,我建议继续添加新标签。