常见问题

一般问题

1. Prometheus是什么?

Prometheus是一款高活跃生态系统的开源系统监控和警告工具包。详见概览

2. Prometheus与其他的监控系统比较

详见比较

3. Prometheus有什么依赖?

Prometheus服务独立运行,没有其他依赖

4. Prometheus有高可用的保证吗?

是的,在多台服务器上运行相同的Prometheus服务,相同的报警会由警告管理器删除
警告管理器当前不能保证高可用,但高可用是目标

5. 我被告知Prometheus”不能水平扩展”

事实上,有许多方式可以扩展Prometheus。 阅读Robust Percetion的博客关于Prometheus的扩展

5. Prometheus是什么语言写的?

大多数Prometheus组件是由Go语言写的。还有一些是由Java,Python和Ruby写的

6. Prometheus的特性、存储格式和APIs有多稳定?

Prometheus从v1.0.0版本开始就非常稳定了,我们现在有一些版本功能规划,详见路线图

7. 为什么是使用的是pull而不是push?

基于Http方式的拉模型提供了一下优点:

  • 当开发变化时,你可以在笔记本上运行你的监控
  • 如果目标实例挂掉,你可以很容易地知道
  • 你可以手动指定一个目标,并通过浏览器检查该目标实例的监控状况

总体来说,我们相信拉模式比推模式要好一地啊你,但是当考虑一个监控系统时,它不是主要的考虑点
Push vs. Pull监控在Brian Brazil的博客中被详细的描述

如果你必须要用Push模式,我们提供Pushgateway

8. 怎么样把日志推送到Prometheus系统中?

简单地回答:千万别这样做,你可以使用ELK栈去实现
比较详细的回答:Prometheus是一款收集和处理度量指标的系统,并非事件日志系统。Raintank的博客有关日志、度量指标和图表在日志和度量指标之间,进行了详尽地阐述。

如果你想要从应用日志中提取Prometheus度量指标中。 谷歌的mtail可能会更有帮助

9. 谁写的Prometheus?

Prometheus项目发起人是Matt T. Proud和Julius Volz。 一开始大部分的开发是由SoundCloud赞助的
现在它由许多公司和个人维护和扩展

10. 当前Prometheus的许可证是用的哪个?

Apache 2.0

11. Prometheus单词的复数是什么?

Prometheis

12. 我能够动态地加载Prometheus的配置吗?

是的,通过发送SIGHUP信号量给Prometheus进行,将会重载配置文件。不同的组件会优雅地处理失败的更改

13. 我能发送告警吗?

是的,通过警告管理器
当前,下面列表的外部系统都是被支持的

  • Email
  • General Webhooks
  • PagerDuty(http://www.pagerduty.com/)
  • HipChat(https://www.hipchat.com/)
  • Slack(https://slack.com/)
  • Pushover(https://pushover.net/)
  • Flowdock(https://www.flowdock.com/)

    14. 我能创建Dashboard吗?

    是的,但是在生产使用中,我们推荐用GrafanaPromDashConsole templates也可以

    15. 我能改变timezone和UTC吗?

    不行。为了避免任何时区的困惑和混乱,我们用了UTC这个通用单位

    工具库

    1. 哪些语言有工具库?

    这里有很多客户端库,用Prometheus的度量指标度量你的服务。详见客户库
    如果你对功能工具库非常感兴趣,详见exposition formats

    2. 我能监控机器吗?

    是的。Node Exporter暴露了很多机器度量指标,包括CPU使用率、内存使用率和磁盘利用率、文件系统的余量和网络带宽等数据

    3. 我能监控网络数据吗?

    是的。SNMP Exporter允许监控网络设备

    4. 我能监控批量任务吗?

    是的,通过Pushgateway. 详见最佳实践

    5. Prometheus的第三方工具有哪些?

    详见exporters for third-party systems

    6. 我能通过JMX监控JVM应用程序吗?

    是的。不能直接使用Java客户端进行测试的应用程序,你可以将JMX Exporter单独使用或者Java代理使用

    7. 工具对性能的影响是什么?

    客户端和语言的性能可能不同。对于Java,基准表明使用Java客户端递增计数器需要12~17ns,具体依赖于竞争。最关键的延迟关键代码之外的所有代码都是可以忽略的。

    故障排除

    1. 当服务崩溃恢复后,我的服务需要很多时间启动和清理垃圾日志。

    你的服务可能遭到了不干净的关闭。Prometheus必须在SIGTERM后彻底关闭,特别地对于一些重量级服务可能需要比较长的时间去。如果服务器崩溃或者司机(如:在等待Prometheus关闭时,内核的OOM杀死你的Prometheus服务),必须执行崩溃恢复,这在正常情况下需要不到一分钟。详见崩溃恢复

    2. 我在Linux上使用ZFS,单元测试TestPersistLoadDropChunks失败。尽管测试失败,我运行Prometheus服务,奇怪的事情会发生。

    你在Linux上有bug的ZFS文件系统运行Prometheus服务。详见Issue #484, 在linux v.0.6.4上升级ZFS应该可以解决该问题。

实现

1. 为什么所有样品值都是float64数据类型?我想要integer数据类型。

我们限制了float64以简化设计,IEEE 754双精度二进制浮点格式支持高达253的值的整数精度。如果您需要高于253但低于263的整数精度,支持本地64位整数将有帮助。原则上,支持不同的样本值类型 (包括某种大整数,支持甚至超过64位)可以实现,但它现在不是一个优先级。 注意,一个计数器,即使每秒增加100万次,只有在超过285年后才会出现精度问题。

2. 为什么Prometheus使用自定义的存储后端,而不是使用其他的存储方法?是不是“一个时间序列一个文件”会大大地伤害性能?

一开始,Prometheus是在LevelDB上存储事件序列数据,但不能达到比较好的性能,我们必须改变大量时间序列的存储方式。我们评估了当时可用的许多存储系统,但是没有得到满意的结果。所以我们实现了我们需要的部分。同时保持LevelDB的索引和大量使用文件系统功能。我们最重要的要求是对于常见查询的可接受查询速度,以及每秒数千个样本的可持续速率。后者取决于样本数据的可压缩性和样本所属的时间序列数,但是给你一个想法,这里有一些基准的结果:

  • 在具有Intel Core i7 CPU,8GiB RAM和两个旋转磁盘(三星HD753LJ)的老式8核机器上,Prometheus在每个RAID-1设置中的吞吐速率为34k样本,属于170k时间序列, 600个目标。
  • 在具有64GiB RAM,32个CPU内核和SSD的现代服务器上,Prometheus的每秒吞吐率为525k样本,属于1.4M时间序列,从1650个目标中剔除。

在这两种情况下,没有明显的瓶颈。在相同的流入速度下,各个阶段的处理管道或多或少都会达到他们的限度。

在通常的设置中,不可能使用inode。 有一个可能的缺点:如果你想删除Prometheus的存储目录,你会注意到,一些文件系统在删除文件时非常慢。

3. 为什么Prometheus服务器组件不支持TLS或身份验证? 我可以添加这些吗?

虽然TLS和身份验证是经常请求的功能,但我们有意不在Prometheus的任何服务器端组件中实现它们。 有这么多不同的选项和参数(仅限TLS的10多个选项),我们决定专注于建立最佳的监控系统,而不是在每个服务器组件中支持完全通用的TLS和身份验证解决方案。

如果您需要TLS或身份验证,我们建议将反向代理放在Prometheus前面。 参见例如使用Nginx添加对Prometheus的基本认证。

请注意,这仅适用于入站连接。 Prometheus确实支持删除TLS-和auth启用的目标,以及其他创建出站连接的Prometheus组件具有类似的支持。