联邦机制允许一个 Prometheus 服务器从另一个 Prometheus 服务器抓取选定的时间序列。
Prometheus 联邦机制是一种用于管理多个独立 Prometheus 实例的方法。通过这种机制,可以将多个 Prometheus 实例连接在一起,使它们能够相互交换数据并共同查询和展示监控指标。这种机制有助于用户在不同环境中集中监控和管理多个 Prometheus 实例,以实现更全面和统一的监控视图。
联邦机制可以理解为 Prometheus 内置支持的一种集群方式,其核心是 Prometheus 数据的级联抓取。它通过将不同的 Prometheus 数据聚拢到一个中心的 Prometheus 中,实现了数据的集中管理和查询。这样,原本由单个 Prometheus 实例难以处理的大量数据可以被分散到多个 Prometheus 实例中处理,从而提高了系统的可扩展性和稳定性。
在联邦机制中,中心的 Prometheus 负责抓取边缘 Prometheus 的数据,但并不意味着将所有数据都抓取到中心。实际上,为了减轻中心的 Prometheus 的负担并提高数据处理的效率,通常只会抓取那些需要做聚合计算或其他团队也关注的指标。大部分数据仍然会下沉在各个边缘 Prometheus 内部消化掉。这样,既实现了数据的集中管理,又保持了各个 Prometheus 实例的独立性和灵活性。
Prometheus 的联邦机制分为两种:分层联邦机制和跨服务联邦机制。通常,它用于实现可扩展的 Prometheus 监控设置,或将相关指标从一个 Prometheus 服务拉取到另一个 Prometheus 服务。
分层联邦机制使 Prometheus 能够扩展到拥有数十个数据中心和数百万个节点的环境。在这种使用案例中,联邦机制拓扑结构类似于一棵树,上级 Prometheus 服务器从更多的下级服务器收集汇总的时间序列数据。
例如:一个可能包括许多按数据中心收集详细数据(实例级钻取)的 Prometheus 服务器,以及一组全局 Prometheus 服务器,它们只收集和存储来自这些本地服务器的汇总数据(作业级钻取)。这样就可以提供汇总的全局视图和详细的本地视图。如下图:
注意:重点是在多个数据中心或节点间进行数据的分层收集和汇聚,有分而治之的思想。
在跨服务联邦机制中,一个服务的 Prometheus 服务器被配置为从另一个服务的 Prometheus 服务器中抓取选定数据,以便在单个服务器中针对两个数据集进行警报和查询。
在跨服务联邦机制中,每个服务或组件都有自己的 Prometheus 实例进行监控。这些实例可能位于不同的物理位置或云环境中。通过 Prometheus 的联邦功能,您可以在一个中央 Prometheus 实例中查询和聚合所有服务实例的监控数据。
例如:运行多个服务的群集调度程序可能会公开群集上运行的服务实例的资源使用信息(如内存和 CPU 使用率)。如下图:
另一方面,在该集群上运行的服务将只公开特定于应用程序的服务指标。通常情况下,这两组指标是由不同的 Prometheus 服务器采集的。使用联邦机制技术,包含服务级指标的 Prometheus 服务器可以从群集 Prometheus 中获取有关其特定服务的群集资源使用指标,这样两套指标都可以在该服务器中使用。如下图:
注意:跨服务联邦侧重于在不同服务间进行数据共享和聚合
在任何给定的 Prometheus 服务器上,/federate 接口允许检索该服务器上所选时间序列集的当前值。必须指定至少一个 match[] 参数来选择要公开的序列。每个 match[] 参数都需要指定一个即时向量选择器,如:up 或 {job="api-server"}。如果提供多个 match[] 参数,则会选择所有匹配系列的联合。
要将度量指标从一个服务器联合到另一个服务器,需要配置目标 Prometheus 服务器,以便从源服务器的 /federate 端点进行抓取,同时启用 honor_labels 抓取选项(不覆盖源服务器暴露的任何标签),并传递所需的 match[] 参数。
例如:下面的 scrape_configs 会将任何带有 job="prometheus" 标签或以 job: 开头的指标名称的序列从 source-prometheus-{1,2,3}:9090 的 Prometheus 服务器抓取到目标 Prometheus 中:
scrape_configs: - job_name: 'federate' scrape_interval: 15s # 不覆盖源服务器暴露的任何标签 honor_labels: true metrics_path: '/federate' params: 'match[]': - '{job="prometheus"}' - '{__name__=~"job:.*"}' static_configs: - targets: - 'source-prometheus-1:9090' - 'source-prometheus-2:9090' - 'source-prometheus-3:9090'
在 192.168.0.32 机器上部署了一个 Prometheus,如下图:
现在将在本地安装另一个 Prometheus,该 Prometheus 通过联邦机制从 192.168.0.32 的 Prometheus 服务抓取数据。
配置步骤如下:
(1)打开本地 Prometheus 的 prometheus.yml 文件,修改配置如下:
... scrape_configs: .... # 联邦机制配置 - job_name: 'federate' scrape_interval: 15s # 不覆盖源服务器暴露的任何标签 honor_labels: true metrics_path: '/federate' params: 'match[]': - '{job="prometheus"}' - '{__name__=~"job:.*"}' static_configs: - targets: - 'http://192.168.0.32:9090'
(2)重启本地的 Prometheus。
(3)使用浏览器访问 Prometheus,如下图: