## 常见问题
### 一般问题
#### 1. Prometheus是什么?
> Prometheus是一款高活跃生态系统的开源系统监控和警告工具包。详见[概览](https://prometheus.io/docs/introduction/overview/)
#### 2. Prometheus与其他的监控系统比较
> 详见[比较](https://prometheus.io/docs/introduction/comparison/)
#### 3. Prometheus有什么依赖?
> Prometheus服务独立运行,没有其他依赖
#### 4. Prometheus有高可用的保证吗?
> 是的,在多台服务器上运行相同的Prometheus服务,相同的报警会由警告管理器删除
> 警告管理器当前不能保证高可用,但高可用是目标
#### 5. 我被告知Prometheus"不能水平扩展"
> 事实上,有许多方式可以扩展Prometheus。 阅读Robust Percetion的博客关于Prometheus的[扩展](https://www.robustperception.io/scaling-and-federating-prometheus/)
#### 5. Prometheus是什么语言写的?
> 大多数Prometheus组件是由Go语言写的。还有一些是由Java,Python和Ruby写的
#### 6. Prometheus的特性、存储格式和APIs有多稳定?
> Prometheus从v1.0.0版本开始就非常稳定了,我们现在有一些版本功能规划,详见[路线图](https://prometheus.io/docs/introduction/roadmap/)
#### 7. 为什么是使用的是pull而不是push?
基于Http方式的拉模型提供了一下优点:
- 当开发变化时,你可以在笔记本上运行你的监控
- 如果目标实例挂掉,你可以很容易地知道
- 你可以手动指定一个目标,并通过浏览器检查该目标实例的监控状况
总体来说,我们相信拉模式比推模式要好一地啊你,但是当考虑一个监控系统时,它不是主要的考虑点
[Push vs. Pull](http://www.boxever.com/push-vs-pull-for-monitoring)监控在Brian Brazil的博客中被详细的描述
如果你必须要用Push模式,我们提供[Pushgateway](https://prometheus.io/docs/instrumenting/pushing/)
#### 8. 怎么样把日志推送到Prometheus系统中?
> 简单地回答:千万别这样做,你可以使用ELK栈去实现
> 比较详细的回答:Prometheus是一款收集和处理度量指标的系统,并非事件日志系统。Raintank的博客有关[日志、度量指标和图表](https://blog.raintank.io/logs-and-metrics-and-graphs-oh-my/)在日志和度量指标之间,进行了详尽地阐述。
如果你想要从应用日志中提取Prometheus度量指标中。 谷歌的[mtail](https://github.com/google/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吗?
> 是的,但是在生产使用中,我们推荐用[Grafana](https://prometheus.io/docs/visualization/grafana/)。[PromDash](https://prometheus.io/docs/visualization/promdash/)和[Console templates](https://prometheus.io/docs/visualization/consoles/)也可以
#### 15. 我能改变timezone和UTC吗?
> 不行。为了避免任何时区的困惑和混乱,我们用了UTC这个通用单位
### 工具库
#### 1. 哪些语言有工具库?
> 这里有很多客户端库,用Prometheus的度量指标度量你的服务。详见[客户库](https://prometheus.io/docs/instrumenting/clientlibs/)
> 如果你对功能工具库非常感兴趣,详见[exposition formats](https://prometheus.io/docs/instrumenting/exposition_formats/)
#### 2. 我能监控机器吗?
> 是的。[Node Exporter](https://github.com/prometheus/node_exporter)暴露了很多机器度量指标,包括CPU使用率、内存使用率和磁盘利用率、文件系统的余量和网络带宽等数据
#### 3. 我能监控网络数据吗?
> 是的。[SNMP Exporter](https://github.com/prometheus/snmp_exporter)允许监控网络设备
#### 4. 我能监控批量任务吗?
> 是的,通过[Pushgateway](https://prometheus.io/docs/instrumenting/pushing/). 详见[最佳实践](https://prometheus.io/docs/practices/instrumentation/#batch-jobs)
#### 5. Prometheus的第三方工具有哪些?
> 详见[exporters for third-party systems](https://prometheus.io/docs/instrumenting/exporters/)
#### 6. 我能通过JMX监控JVM应用程序吗?
> 是的。不能直接使用Java客户端进行测试的应用程序,你可以将[JMX Exporter](https://github.com/prometheus/jmx_exporter)单独使用或者Java代理使用
#### 7. 工具对性能的影响是什么?
> 客户端和语言的性能可能不同。对于Java,基准表明使用Java客户端递增计数器需要12~17ns,具体依赖于竞争。最关键的延迟关键代码之外的所有代码都是可以忽略的。
### 故障排除
#### 1. 当服务崩溃恢复后,我的服务需要很多时间启动和清理垃圾日志。
> 你的服务可能遭到了不干净的关闭。Prometheus必须在SIGTERM后彻底关闭,特别地对于一些重量级服务可能需要比较长的时间去。如果服务器崩溃或者司机(如:在等待Prometheus关闭时,内核的OOM杀死你的Prometheus服务),必须执行崩溃恢复,这在正常情况下需要不到一分钟。详见[崩溃恢复](https://prometheus.io/docs/operating/storage/#crash-recovery)
#### 2. 我在Linux上使用ZFS,单元测试TestPersistLoadDropChunks失败。尽管测试失败,我运行Prometheus服务,奇怪的事情会发生。
你在Linux上有bug的ZFS文件系统运行Prometheus服务。详见[Issue #484](https://github.com/prometheus/prometheus/issues/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组件具有类似的支持。