首页 理论教育 高效拉取、查询和可视化Prometheus指标

高效拉取、查询和可视化Prometheus指标

时间:2023-11-06 理论教育 版权反馈
【摘要】:Prometheus服务器旨在从测量服务中提取指标。为了实例化Prometheus服务,应该创建一个带有在集群中运行的exporters的配置文件。IP列表本身是不够的,需要告诉Prometheus应该以动态的方式使用它们。幸运的是,Prometheus可以通过dns_sd_configs进行配置,以将某个地址用于服务发现。最后一个prometheus作业将提供内部指标。请注意,我们将scrape_interval设置为五秒。创建Prometheus服务非常简单。为了使事情更加复杂,这也意味着我们需要更改Prometheus配置,或者仅为此目的添加单独的服务注册表。

高效拉取、查询和可视化Prometheus指标

Prometheus服务器旨在从测量服务中提取指标。然而,由于想避免不必要的耦合,所以使用exporters提供需要的指标。这些exporters已经作为Swarm服务正在运行,现在准备通过Prometheus来利用它们。

为了实例化Prometheus服务,应该创建一个带有在集群中运行的exporters的配置文件。在这样做之前,需要获取exporter服务所有实例的IP。如果你回想起第4章,那么可以通过在服务名前添加task.前缀得到所有的IP。

为了获取node-exporter服务的所有副本列表,可以从util服务的一个实例中得到它:

输出的相关部分如下:

现在得到了所有当前正在运行的服务副本的IP。

IP列表本身是不够的,需要告诉Prometheus应该以动态的方式使用它们。每次拉取新数据时都应该咨询task.<SERVICE_NAME>。幸运的是,Prometheus可以通过dns_sd_configs进行配置,以将某个地址用于服务发现。有关可用选项的更多信息,请参阅文档的配置(https://prometheus.io/docs/operating/configuration/)部分。

知道了dns_sd_configs选项的存在,可以继续下去并定义Prometheus配置。下面将使用为本章准备的配置文件,它位于conf/prometheus.yml(https://github.com/ vfarcic/cloud-provisioning/blob/master/conf/prometheus.yml)。

下面快速浏览一下:

输出如下:

我们定义了三个作业,前两个作业node和cadvisor使用了dns_sd_configs(DNS服务发现配置)选项。两者都将tasks.<SERVICE_NAME>定义为名字,类型为A(你可以从drill输出中找到类型),并定义了内部端口。最后一个prometheus作业将提供内部指标。

请注意,我们将scrape_interval设置为五秒。在生产中,你可能需要更细化的数据并将其更改为例如1秒的时间间隔。注意,间隔越短,成本越高。如果越频繁地拉取指标,就需要更多的资源来完成这些工作、查询这些结果,乃至存储数据。尽量在数据粒度和资源使用之间找到平衡点。创建Prometheus服务非常简单(就像几乎所有其他Swarm服务一样)。

下面将从创建一个用于持久化Prometheus数据的目录开始:

现在可以创建服务:

我们创建了docker/prometheus目录用于持久化Prometheus状态。

这项服务非常普通。它用于连接到代理网络、公开端口9090,并挂载配置文件和状态目录。

service ps命令的输出如下(为了简洁,删除了ID和ERROR列):

请注意,扩展此服务毫无意义,Prometheus被设计作为单实例工作。大多数情况下,这不会有什么问题,因为它可以轻松地存储和处理海量数据。如果失败,Swarm就会将其重新安排在别的地方,这种情况下,只会丢失几秒钟的数据。

让我们打开它的用户界面并探索可以做些什么。

给Windows用户的说明

Git Bash可能不支持open命令,如果真是这样,则请执行docker-machine ip <SERVER_NAME>来查找机器的IP,然后直接在浏览器里打开URL,比如上面的命令应该被替换为docker-machine ip swarm-1,如果命令输出的是1.2.3.4,则应该在浏览器里打开http://1.2.3.4:9090/。

我们应该做的第一件事是检查它是否注册了所有导出的目标。

请单击顶部菜单中的“Status”按钮,然后选择“Target”。你应该可以看到与构成集群的五个服务器相匹配的五个cadvisor目标。同样,有五个node目标,最后注册了一个prometheus目标,如图10-2所示。

图10-2 注册在Prometheus中的目标

现在确认所有目标确实已经注册并且Prometheus开始抓取它们提供的指标,我们可以探索获取的数据并通过即时查询可视化方法。

请单击顶部菜单中的“Graph”按钮,从光标列表中的“插入度量”列表中选择node_memory_MemAvailable,然后单击“Execute”按钮。

你应该看到一个表格,其中包含指标列表以及每个指标的值。大多数人更喜欢数据的直观表示,可以通过单击列表上方的“Graph”选项卡获得,请点击它。

你应该可以看到五个服务器中每个服务器的可用内存。内存显示为指定时间段内的演变,可以使用位于图形上方的字段和按钮进行调整。我们创建prometheus服务并没有多久,所以应该将时间缩短到5~15分钟。

通过在“Expression”字段中键入查询(或本例中为指标的名称),可以实现相同的结果。稍后将执行一些更复杂的查询,这些查询无法通过从光标列表的-insert指标中选择单个指标来定义,如图10-3所示。

图10-3 Prometheus可用内存图

现在可能是讨论迄今建立的系统的一个主要缺点的好时机,我们没有可以轻松把数据与特定服务器相关联的信息。由于地址列表是通过Docker网络检索的,Docker网络为每个副本创建一个虚拟IP,所以这些地址不是服务器的地址。没有简单的解决方法(据我所知),所以有两种选择,一种方法是将exporters作为“普通”容器运行(例如,docker run),而不是作为服务,这种方法的优点是可以将网络类型设置为主机并获取服务器的IP,这种方式的问题是需要分别为每个服务器运行exporters。

除了每次向集群添加新服务器,还需要再次运行所有导出程序,这么做还不算太糟糕。为了使事情更加复杂,这也意味着我们需要更改Prometheus配置,或者仅为此目的添加单独的服务注册表

另一种方法就是等待。无法从服务副本中检索主机IP是众所周知的限制。它记录在几个地方,其中之一是问题25526(https://github.com/docker/docker/ issues/25526)。与此同时,社区已经决定从Docker Engine原生提供Prometheus指标。这将去除我们作为服务创建的exporters(如果不是全部)的需要。我相信其中一个很快就会实现。在此之前,你必须做出决定,忽略IP是虚拟的,或者将容器替换为集群中每台服务器上分别运行的容器。不管做出什么选择,稍后会告诉大家如何找到虚拟IP和主机之间的关系。

现在回头查询Prometheus指标。(www.xing528.com)

node_memory_MemAvailable的示例仅使用指标,因此我们获得了所有时间序列。

现在稍微调整一下,并创建一个将返回空闲CPU的图表。查询为node_cpu {mode="idle"}。使用mode="idle"会将node_cpu指标仅限于标记为空闲的数据。试试看,你会发现图中包括五条几乎垂直向上的直线。这看起来并不正确。

现在通过引入irate函数来创建更精确的图像,它用于计算时间序列的每秒即时增长率。这是基于最后两个数据点。要使用irate功能,还需要指定测量持续时间,修改后的查询如下所示:

由于正在从cadvisor服务中抽取指标,所以也可以查询别的容器指标。例如,可以查看每个容器的内存使用情况。

请执行以下查询:

请执行查询并查看结果。你会看到每节点5分钟测量一次的CPU空闲使用率,如图10-4所示。

图10-4 Prometheus CPU空闲使用率图

如果通过图表浏览结果,则会发现cadvisor使用的内存最多(在我的计算机上大约为800 MB),这看起来不太对,该服务应该有更小的开销。如果查看它的标签,则会注意到ID是/。这是通过cadvisor传递的所有容器的总内存的累积结果。我们应该使用!=运算符将其从结果中排除。

请执行以下查询:

这一次,结果更有意义,使用最多内存的服务是Prometheus本身。

以前的查询使用标签id来过滤数据。与!=运算符结合使用时,它会排除id设置为/的所有指标。

即使这样一个小集群,容器的数量可能对单个图表来说还是太大,所以我们可能希望将结果限制为单个服务。这可以通过使用container_label_com_docker_ swarm_service_name过滤数据来完成。

下面来看看所有cadvisor副本的内存使用情况:

所有这些看起来不错,但作为监控系统并不是很有用。Prometheus专门针对即时查询,而不是作为一种创建让我们了解整个系统的看板的工具。为此,需要再添加一项服务。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈