Prometheus面试-理论篇

监控生态面试通关秘籍

Posted by 白行简 on Friday, March 9, 2018
https://1cobot.com/docs/monitoring/3service_discover
https://www.cnblogs.com/crazymakercircle/p/18067451
https://www.cnblogs.com/love-DanDan/category/2420495.html?page=1
https://www.51cto.com/article/808858.html

1. 什么是 Prometheus?它的主要功能是什么?

Prometheus 是一个开源的系统监控和报警工具,主要用于收集和存储时序数据(metrics),并且提供查询语言(PromQL)来支持灵活的查询。它具有强大的可扩展性和灵活性,广泛用于监控微服务、容器和云原生应用。

主要功能:

  • 数据采集: 通过 Pull 模型定期从目标服务拉取数据
  • 时序数据存储: 高效地存储时序数据,并支持高吞吐量
  • 查询和报警: 使用 PromQL 进行数据查询,并通过 Alertmanager 配置报警
  • 自动发现: 通过配置自动发现机制(如 Kubernetes、Consul)来发现监控目标

2. Prometheus 生态系统组件有哪些? 它们的作用是什么?

Prometheus 生态系统包括多个工具,每个工具负责监控、存储、告警、可视化等不同任务。常见的工具包括:

  • Prometheus Server:负责收集和存储时间序列数据。
  • Prometheus targets: 静态收集的⽬标服务数据
  • Exporters:用于收集特定应用或系统的指标数据,并将其暴露给Prometheus进行抓取(例如,node_exporter 用于暴露操作系统指标,blackbox_exporter 用于服务可用性监控)
  • Alertmanager:管理 Prometheus 中的告警,提供告警去重、抑制、通知等功能(如邮件、飞书、钉钉等)
  • Exporters:用于将特定应用或硬件的指标暴露给 Prometheus
  • Pushgateway:数据收集代理服务器(类似于zabbix proxy)
  • Thanos: 提供 Prometheus 数据的长期存储和高可用性支持,扩展 Prometheus 的存储能力
  • Cortex: 一个分布式 Prometheus 后端,支持 Prometheus 数据的长期存储和查询

[!]架构图Prometheus.png


3.Prometheus中的时序数据是什么?它的存储方式是什么?

Prometheus 主要用于存储 时序数据,即时间与某些指标值的映射。 每个数据点包含了一个时间戳、一个值和一个时间序列标识符。 时序数据存储在 Prometheus 自带的时序数据库中,数据库使用 列式存储,每个时序数据被按标签(Label)进行索引,并存储在高效的时间序列格式中。


4.Prometheus 的工作流程

  • 数据采集(Scraping):Prometheus 定期从目标(targets)拉取监控数据(metrics)。
  • 存储(Storage):数据存入本地 TSDB(时间序列数据库)。
  • 查询(Querying):用户通过 PromQL 查询数据。
  • 告警(Alerting):Prometheus 评估规则并触发告警,告警管理器(Alertmanager)负责通知。
  • 自动发现:通过配置自动发现机制(如k8s、Consul)来发现监控目标
  • 数据可视化(Visualization):结合 Grafana 等工具展示数据。

4.Prometheus如何抓取数据?

Prometheus 通过 pull 模型 定期从被监控的目标(例如,应用程序或服务的端点)抓取指标数据。 每个目标需要暴露一个 HTTP 端点,通常是 /metrics 路径,Prometheus 会定期访问这个端点获取数据。 如果目标不支持暴露 /metrics,可以使用 exporter 工具(如 node_exporter、blackbox_exporter)将指标数据暴露出来。


5. Prometheus 中的目标(Targets)是什么?如何配置?

在 Prometheus 中,目标 是指 Prometheus 用来抓取指标数据的外部系统或服务。 目标通常是通过 静态配置 或 服务发现 来指定。 在 prometheus.yml 配置文件中,可以配置静态目标或通过 Kubernetes、Consul、EC2 等进行服务发现。 目标配置示例如下:

scrape_configs:
job_name: 'node'
static_configs:

6. Prometheus 如何进行数据查询?

Prometheus 提供了一个强大的查询语言 PromQL,用于从时序数据库中查询和操作数据。通过 PromQL,用户可以进行数据聚合、计算、过滤等操作。常见的查询方式包括:

  • 获取单个时序数据: http_requests_total{status=“200”}
  • 计算聚合值: avg(http_requests_total{status=“200”})
  • 时间范围选择: http_requests_total[5m] 获取过去5分钟的数据

7. Prometheus 如何进行告警管理?

Prometheus 使用 Alertmanager 进行告警管理。 Alertmanager 负责接收 Prometheus 中触发的告警并将它们转发到不同的通知渠道,如电子邮件、钉钉、飞书等。 告警规则在 prometheus.yml 配置文件中定义,告警条件可以基于 PromQL 查询结果设定。例如:

alerting:
  alertmanagers:
    -static_configs:
      -targets: ['localhost:9093']
rule_files:
"alert.rules"
alerts:
alert:HighCpuUsage
expr:avg(rate(cpu_usage[5m]))>0.9
for:1m
annotations:
summary: "CPU usage is high"

8.如何在 Prometheus 中使用标签(Labels)?

标签是 Prometheus 用来区分同一时间序列不同维度的标识符。 每个时间序列可以有多个标签,标签键值对可以帮助用户区分不同的资源和维度。 例如,http_requests_total{status=“200”, method=“GET”},其中 status 和 method 是标签键,分别表示 HTTP 状态和请求方法。 标签使得 Prometheus 能够执行高效的维度查询。


9. Prometheus 如何与其他监控系统(如 Grafana)集成?

Prometheus 通常与 Grafana 配合使用,Grafana 用于可视化 Prometheus 收集的指标数据。 在 Grafana 中,用户可以配置 Prometheus 作为数据源,并创建仪表盘来展示监控数据。 通过 Prometheus 的查询结果,Grafana 可以绘制各种类型的图表(如折线图、柱状图等)来帮助监控系统的健康和性能。


10. 如何扩展 Prometheus?

Prometheus 本身不提供水平扩展机制,但可以通过以下几种方式扩展其功能:

  • Prometheus Federation: 通过 Prometheus 联邦机制,将多个 Prometheus 实例聚合在一起,提供更大的数据处理能力
  • 分布式存储: 通过外部存储后端(如 Cortex、Thanos、 GreptimeDB 等等)实现 Prometheus 数据的长期存储和扩展
  • 使用多个 Prometheus 实例: 针对不同的监控目标,使用多个 Prometheus 实例分担数据抓取任务,然后通过聚合和查询多个实例的数据来提高性能

11. Prometheus 如何与 Kubernetes 集成?

Prometheus 与 Kubernetes 的集成通常通过以下方式实现:

  • 服务发现: Prometheus 使用 Kubernetes API 进行服务发现,自动发现 Kubernetes 集群中的 Pod 和服务
  • Kubernetes Exporter: 如 kube-state-metrics、node-exporter 等 Exporter 用于暴露 Kubernetes 集群的各种监控指标(如 Pod 状态、节点资源使用情况等)
  • Prometheus Operator: 一个 Kubernetes原生的Prometheus 配置和管理工具,简化 Prometheus 的部署、配置和维护

12. Prometheus 如何与其他工具(如 Grafana、Alertmanager)协作?

Prometheus 作为时序数据收集和存储工具,通常与其他生态工具协作,以实现全面的监控解决方案。

  • Grafana: 用于数据的可视化。Prometheus 提供的时序数据可以通过 Grafana 进行图表化展示,Grafana 提供了丰富的仪表板和自定义视图,用于实时监控数据。

    集成方式: Grafana 可以作为 Prometheus 的数据源,使用 PromQL 查询 Prometheus 存储的时序数据并进行可视化。

  • Alertmanager: 负责 Prometheus 生成的警报。Alertmanager 可以对告警进行聚合、分组、抑制等操作,并发送通知(如通过邮件、Slack、PagerDuty 等)。

  • 集成方式: Prometheus 将触发的报警发送到 Alertmanager,Alertmanager 进一步处理并通知用户。

13. 什么是 Prometheus 的数据模型?

Prometheus 的数据模型是以 时序数据(Time Series)为核心的。时序数据由 指标(Metric)和时间戳组成,每个指标都有一个唯一的名称和相关的标签(labels)。

  • Metric(指标): 一个数据点,表示某个时间点的某种度量(如 CPU 使用率、内存占用)
  • Labels(标签): 用来区分不同维度的指标。例如,instance=“localhost” 或 job=“nginx” 可以作为标签来描述不同的度量来源。
  • Time Series(时序数据): 由指标名称和标签组合标识,每个时序数据点都有一个时间戳和数值。

14. Prometheus 的数据抓取(Scraping)是如何工作的?

Prometheus 使用 Pull 模型 来抓取数据,它定期从配置好的目标(如应用程序、主机或容器)拉取时序数据。 数据抓取的流程如下:

    1. 配置目标: 通过配置文件 prometheus.yml,定义需要抓取数据的目标(例如,应用程序的端点、Node Exporter、Kubernetes 等)。
    1. Scraping: Prometheus 会按照配置的时间间隔(通常为每 15 秒)定期访问这些目标的 /metrics 端点,拉取最新的指标数据。
    1. 数据存储: 拉取的数据被存储在 Prometheus 的本地时序数据库中,并按时间戳、指标名称和标签索引。

15.什么是 PromQL?它的主要用途是什么?

PromQL(Prometheus Query Language)是 Prometheus 提供的查询语言,用于从时序数据库中提取和处理数据。

主要用途:

  • 数据查询: PromQL 允许用户基于指标名称、标签、时间区间等条件进行灵活的查询。
  • 聚合和计算: 支持对查询结果进行聚合(如求和、平均、最大值、最小值)以及计算(如比率、变化率等)。
  • 数据可视化: PromQL 查询结果可用于生成图表,或者通过 Grafana 进行展示。
  • 报警规则: 在 Prometheus 中,报警规则是基于 PromQL 编写的,告警会在满足查询条件时触发。

16.Prometheus 如何处理高可用性?

Prometheus 本身并不内置高可用性机制,但可以通过以下方式实现高可用性:

  • 多实例配置: 通过部署多个 Prometheus 实例,每个实例都抓取相同的数据源。为了避免重复报警和存储数据,可以配置 Prometheus 的 federation(联邦)和 Alertmanager 来整合多个实例的数据和警报。
  • 跨区域冗余: 在分布式系统中,可以部署多个 Prometheus 实例,将不同区域的指标聚合到一个主 Prometheus 实例中。
  • 数据备份: 通过备份和恢复策略,确保 Prometheus 数据的安全。

17. 如何优化 Prometheus 的性能,特别是在处理大量指标时?

优化 Prometheus 性能时,可以从以下几个方面入手:

  • 数据压缩: Prometheus 对存储的数据进行压缩,可以节省存储空间并提高存取效率
  • 合理配置抓取频率: 根据需求合理配置抓取频率。如果某些数据不需要频繁采集,可以将采集频率降低,减少系统负载
  • 存储分区和限制数据保留: 通过配置 Prometheus 的存储策略(如数据保留时间、存储文件大小)来限制不必要的老旧数据占用存储空间。
  • 外部存储解决方案: 对于长期存储和高容量数据,可以将数据迁移到外部存储系统(如 Thanos、Cortex、 GreptimeDB 等等),这可以提高 Prometheus 的可扩展性。

18. Prometheus 与其他监控工具(如 Nagios 或 Zabbix)有何不同?

  • 架构: Prometheus 基于 Pull 模式(主动拉取数据),而 Nagios 和 Zabbix 通常基于 Push 模式(被动接收数据)。
  • 数据存储: Prometheus 使用时序数据库来存储数据,特别适合监控和分析指标数据,而 Nagios 和 Zabbix 使用传统的数据库管理数据。
  • 灵活性: Prometheus 提供强大的查询语言 PromQL,能够进行复杂的数据聚合和分析,而 Nagios 和 Zabbix 更侧重于告警管理和事件处理。
  • 扩展性: Prometheus 设计上更适合云原生和微服务架构,支持多种插件和与 Kubernetes、Docker 等工具的集成,而 Nagios 和 Zabbix 更适合传统的 IT 基础设施。

19. 什么是 Prometheus的Exporters?

Exporters 是用于暴露应用程序或基础设施的监控指标的组件。 Prometheus 通过 Scraping 来获取这些 Exporters 暴露的指标数据。

常见 Exporters:

  • Node Exporter: 用于暴露 Linux 主机的硬件和操作系统指标,如 CPU、内存、磁盘、网络等
  • Blackbox Exporter: 用于对外部服务进行可用性监控,如 HTTP、TCP、DNS 等协议
  • MySQL Exporter: 用于暴露 MySQL 数据库的指标,如查询数、连接数、缓存命中率等
  • Docker Exporter: 用于暴露 Docker 容器的监控指标

Exporters 提供了与 Prometheus 兼容的 /metrics 端点,Prometheus会定期抓取这些端点并收集数据

20.Alertmanager 是什么?它的主要功能是什么?

Alertmanager 是 Prometheus 的一个组件,负责接收 Prometheus 发送的报警,并对报警进行处理、分组、抑制、路由和通知。

主要功能:

  • 报警分组: 将相似的报警合并,减少通知的噪声
  • 报警抑制: 根据用户设置的规则,当某些报警触发时,自动抑制其他相关报警
  • 通知渠道: 支持将报警通过多种通知渠道(如电子邮件、Slack、PagerDuty)发送给相关人员
  • 多级通知: 支持根据报警的严重性或紧急程度进行不同的通知策略

21. Prometheus支持哪些数据存储后端?

Prometheus 默认使用本地存储来存储时序数据。然而,对于长期存储或高可用性的需求,Prometheus 支持通过以下后端扩展:

  • Thanos: 提供持久化存储和高可用性支持,适合大规模分布式系统
  • Cortex: 分布式的 Prometheus 存储解决方案,支持跨多个集群的数据存储和查询
  • InfluxDB: 可以将 Prometheus 的时序数据推送到 InfluxDB 进行长期存储
  • GreptimeDB: 一个新兴的云原生时序数据库,

22. Prometheus 与 Thanos 和 Cortex 的关系是什么?

Thanos 和 Cortex 都是 Prometheus 的扩展工具,主要用于解决 Prometheus 的长期存储和多集群查询问题。

  • Thanos: 通过将多个 Prometheus 实例的数据集中存储,提供了 全球查询、持久化存储 和 高可用性 支持。它允许用户查询跨多个 Prometheus 实例的历史数据,并将 Prometheus 的数据存储能力扩展到长期存储。
  • Cortex: 是一个分布式 Prometheus 后端,支持跨多个集群存储和查询 Prometheus 数据。它实现了 Prometheus 的 多租户支持 和 可扩展性,适用于大规模的云原生环境。

23. Prometheus 中的标签(Labels)有什么作用?

标签是 Prometheus 用于区分同一时序数据不同维度的标识符。 每个时序数据都有一个或多个标签,标签可以用来区分相同指标的不同实例,例如:

  • http_requests_total{method=“GET”, status=“200”} 表示 HTTP 请求总数,其中 method 和 status 是标签,用于区分不同的请求类型。
  • 标签可以帮助用户根据不同维度筛选和聚合数据,进行更精确的监控和分析

25. 什么是 Prometheus 查询语言(PromQL)?举例说明。

PromQL 是 Prometheus 的查询语言,用于从时序数据库中提取、聚合、过滤数据。它支持基本的数学运算、聚合函数和时间范围选择。

示例:

  • 查询过去 5 分钟内 http_requests_total 指标的平均值:avg(http_requests_total[5m])
  • 查询状态为 200 的请求总数:http_requests_total{status=“200”}
  • 查询 1 分钟内 cpu_usage 的 rate:rate(cpu_usage[1m])

26. Prometheus 如何处理动态环境中的目标(Targets)?

Prometheus 支持通过 服务发现 自动发现动态环境中的目标(如 Kubernetes、Consul、EC2 等)。Prometheus 可以自动发现和抓取新添加的服务或应用的指标,而无需手动更新配置。通过服务发现,Prometheus 可以适应云平台和容器化环境中的动态扩展。

27. 如何避免告警风暴?

  • 分组(Grouping): 合并相似告警(如按服务分组)
  • 抑制(Inhibition): 主告警触发时抑制相关子告警
  • 静默(Silences): 临时屏蔽预期内的告警(如维护窗口)

28. Prometheus 存储数据有哪些优化策略?

  • 压缩(Compaction): 合并小块数据为更大块,减少查询开销
  • 降采样(Downsampling): 长期数据保留低精度样本(如 1 小时粒度)
  • 调整保留时间: 根据需求设置 –storage.tsdb.retention.time(默认 15 天)

29. Prometheus 的 Pull 模型与 Push 模型有何区别?适用场景是什么?

  • Pull: Prometheus 主动拉取目标暴露的指标(默认方式),适合可控内网环境
  • Push: 应用主动推送指标到 Pushgateway(如短暂任务),可能引入单点瓶颈

30. Thanos 如何解决 Prometheus 的长期存储问题?

  • Sidecar 模式: 与 Prometheus 实例共存,上传数据到对象存储(如 S3)
  • 全局查询: 通过 Thanos Query 统一查询多个 Prometheus 或历史数据

31. 如何通过 Prometheus 监控 Kubernetes 的 GPU 资源?

  • 部署 DCGM Exporter 或 NVIDIA GPU Operator,暴露 GPU 指标
  • Prometheus 抓取对应指标并配置告警规则。

32. 解释 Prometheus 的 rate() 和 irate() 函数的区别

  • rate(): 计算时间范围内每秒平均增长率(适合缓慢变化计数器)
  • irate(): 基于最后两个样本计算瞬时增长率(适合快速变化但可能丢失峰值)

33. Prometheus 的 up 指标为 0,如何排查?

  • 检查目标状态: 目标服务是否存活,端口是否开放
  • 网络连通性: Prometheus 是否能访问目标(防火墙、DNS 解析)
  • 指标路径: 检查 metrics_path 配置是否正确

34. Alertmanager 如何处理告警?支持哪些通知方式?

  • 流程: 告警触发 → 分组 → 抑制 → 静默 → 发送通知
  • 支持方式: Email、Slack、PagerDuty、Webhook等。

35. Prometheus 与 Grafana 的集成有哪些最佳实践?

  • 模板化仪表盘: 使用变量(如 $instance)实现动态筛选
  • 告警集成: Grafana 直接配置 Alert Rules 或对接 Alertmanager。

36. 如何监控一个自定义的 Java 应用?

  • 暴露指标: 集成 Prometheus 客户端库(如 micrometer)暴露 /actuator/prometheus 端点
  • 配置抓取: 在 Prometheus 中添加对应 Job。

37. Prometheus 的局限性是什么?如何在大规模场景下替代或增强?

  • 局限性: 单机存储限制、无原生长期存储、高基数问题
  • 增强方案: Thanos/Cortex/GreptimeDB 实现水平扩展,VictoriaMetrics 优化存储效率。

38.未来 3 年,Prometheus 生态可能面临哪些挑战?

  • 云原生混合环境: 跨云、边缘设备的统一监控
  • AIOps 集成: 指标与日志、Trace 的关联分析
  • 成本优化: 海量数据下的存储与计算效率

「真诚赞赏,手留余香」

观测猿

真诚赞赏,感谢认可

使用微信扫描二维码完成支付