常见问题
常规
什么是 Prometheus?
Prometheus 是一个开源的系统监控和告警工具包,拥有活跃的生态系统。它是唯一由 Kubernetes 直接支持的系统,也是 云原生生态系统 事实上的标准。请参阅 概述。
Prometheus 与其他监控系统相比如何?
请参阅 对比 页面。
Prometheus 有哪些依赖?
Prometheus 主服务器作为单个单体二进制文件独立运行,没有任何外部依赖。
这是云原生的吗?
是的。
云原生是一种灵活的运行模式,它打破了旧的服务边界,以实现更灵活、更具扩展性的部署。
Prometheus 的 服务发现 与大多数工具和云进行了集成。它的多维数据模型以及支持数千万活跃时间序列的规模,使其能够监控大型云原生部署。在运行服务时总需要进行权衡,而 Prometheus 认为最重要的事情是可靠地向人类发送告警。
Prometheus 可以实现高可用吗?
可以,在两台或多台独立的机器上运行相同的 Prometheus 服务器。
像 Thanos 这样的系统可以对数据进行去重。许多支持 远程写入 的 外部系统 也可以对数据进行去重。
相同的告警将由 Alertmanager 进行去重。
Alertmanager 通过互连多个 Alertmanager 实例来构建 Alertmanager 集群,从而支持 高可用 。
有人告诉我 Prometheus “无法扩展”。
这往往更多是一种营销说辞,而非事实。
单个 Prometheus 实例的性能可能比某些标榜为 Prometheus 长期存储解决方案的系统还要高。您可以可靠地运行拥有数千万活跃时间序列的 Prometheus。
如果您需要比这更大的规模,有几种选择。Robust Perception 博客上的 Scaling and Federating Prometheus 是一个很好的起点,我们 集成页面 上列出的长期存储系统也是不错的选择。
Prometheus 是用什么语言编写的?
大多数 Prometheus 组件都是用 Go 编写的。也有一些是用 Java、Python 和 Ruby 编写的。
Prometheus 的功能、存储格式和 API 的稳定性如何?
Prometheus GitHub 组织中所有已达到 1.0.0 版本的仓库都大致遵循 语义化版本规范 。破坏性变更通过主版本号的增加来体现。实验性组件可能会有例外,这些在公告中都会有明确的标记。
即使是尚未达到 1.0.0 版本的仓库,通常也相当稳定。我们的目标是为每个仓库建立适当的发布流程,并最终发布 1.0.0 版本。无论如何,破坏性变更都会在发布说明中指出(标记为 [CHANGE]),或者针对尚未正式发布的组件进行明确的沟通。
为什么你们使用拉取(pull)而不是推送(push)?
通过 HTTP 进行拉取提供了许多优势:
- 您可以根据需要启动额外的监控实例,例如在开发变更时在您的笔记本电脑上启动。
- 您可以更容易、更可靠地判断目标是否宕机。
- 您可以手动访问目标,并使用浏览器检查其健康状态。
总体而言,我们认为拉取比推送略好,但在选择监控系统时,这不应被视为一个决定性因素。
对于必须推送的情况,我们提供了 Pushgateway。
如何将日志输入到 Prometheus 中?
简短的回答:不要这样做!请改用像 Grafana Loki 或 OpenSearch 这样的系统。
更详细的回答:Prometheus 是一个收集和处理指标的系统,而不是事件日志系统。Grafana 博客文章 Logs and Metrics and Graphs, Oh My! 提供了有关日志和指标之间差异的更多细节。
如果您想从应用程序日志中提取 Prometheus 指标,Grafana Loki 正是为此而设计的。请参阅 Loki 的 指标查询 文档。
谁编写了 Prometheus?
Prometheus 最初是由 Matt T. Proud 和 Julius Volz 私下发起的。其早期的大部分开发工作由 SoundCloud 赞助。
Prometheus 是在什么许可证下发布的?
Prometheus 是在 Apache 2.0 许可证下发布的。
Prometheus 的复数形式是什么?
经过 深入研究 ,确定 “Prometheus” 的正确复数形式是 “Prometheis”。
如果您记不住,可以使用 “Prometheus 实例” 作为替代方案。
我可以重新加载 Prometheus 的配置吗?
可以,向 Prometheus 进程发送 SIGHUP 信号,或向 /-/reload 端点发送 HTTP POST 请求,都将重新加载并应用配置文件。各个组件会尝试优雅地处理失败的变更。
我可以发送告警吗?
可以,通过 Alertmanager 。
我们支持通过 电子邮件、各种原生集成,以及 任何人都可以添加集成的 Webhook 系统 发送告警。
我可以创建仪表盘吗?
可以,我们推荐在生产环境中使用 Grafana。此外,还有 控制台模板。
我可以更改时区吗?为什么一切都是 UTC 时间?
为了避免任何形式的时区混乱,特别是涉及到所谓的夏令时,我们决定在 Prometheus 的所有组件中,内部一律使用 Unix 时间,显示一律使用 UTC。未来可以在 UI 中引入精心设计的时区选择功能。欢迎贡献代码。关于此项工作的进展情况,请参见 issue #500 。
代码插桩
哪些语言拥有插桩库?
有许多客户端库可用于对您的服务进行插桩以收集 Prometheus 指标。详情请参阅 客户端库 文档。
如果您有兴趣为新语言贡献客户端库,请参阅 数据暴露格式。
我可以监控机器吗?
可以,Node Exporter 在 Linux 和其他 Unix 系统上暴露了大量的机器级指标,例如 CPU 使用率、内存、磁盘利用率、文件系统饱满度和网络带宽。
我可以监控网络设备吗?
可以,SNMP Exporter 允许监控支持 SNMP 的设备。对于工业网络,还有一个 Modbus exporter 。
我可以监控批处理任务吗?
可以,使用 Pushgateway。另请参阅监控批处理任务的 最佳实践。
Prometheus 开箱即用可以监控哪些应用程序?
请参阅 Exporter 和集成列表。
我可以通过 JMX 监控 JVM 应用程序吗?
可以,对于无法直接使用 Java 客户端进行插桩的应用程序,您可以单独使用 JMX Exporter ,或者将其作为 Java Agent 使用。
代码插桩对性能有什么影响?
不同客户端库和语言的性能可能会有所不同。对于 Java,基准测试 表明,使用 Java 客户端增加计数器(Counter)/仪表(Gauge)将耗时 12-17 纳秒,具体取决于竞争情况。除了对延迟要求极高的代码之外,这对于其他所有代码都是微不足道的。
实现
为什么所有样本值都是 64 位浮点数?
为了简化设计,我们仅限使用 64 位浮点数。IEEE 754 双精度二进制浮点格式 支持最高 253 的整数精度。只有当您需要高于 253 但低于 263 的整数精度时,支持原生 64 位整数才会有所帮助。原则上,可以实现对不同样本值类型(包括支持超过 64 位的某种大整数)的支持,但这目前不是优先事项。一个计数器即使每秒递增 100 万次,也只有在 285 年后才会遇到精度问题。