简介
Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes 的项目。
特性
-
强大的多维度数据模型:
- 时间序列数据通过 metric 名和键值对来区分。
- 所有的 metrics 都可以设置任意的多维标签。
- 数据模型更随意,不需要刻意设置为以点分隔的字符串。
- 可以对数据模型进行聚合,切割和切片操作。
- 支持双精度浮点类型,标签可以设为全 unicode。
- 灵活而强大的查询语句(PromQL):在同一个查询语句,可以对多个 metrics 进行乘法、加法、连接、取分数位等操作。
- 易于管理: Prometheus server 是一个单独的二进制文件,可直接在本地工作,不依赖于分布式存储。
- 高效:平均每个采样点仅占 3.5 bytes,且一个 Prometheus server 可以处理数百万的 metrics。
- 使用 pull 模式采集时间序列数据,这样不仅有利于本机测试而且可以避免有问题的服务器推送坏的 metrics。
- 可以采用 push gateway 的方式把时间序列数据推送至 Prometheus server 端。
- 可以通过服务发现或者静态配置去获取监控的 targets。
- 有多种可视化图形界面。
- 易于伸缩。
架构
相关概念
hotspot 监控
Java Hotspot虚拟机监控指标收集
BufferPoolsExports
JVM缓冲区监控指标。
bufferPool指标是从MBean获取的,BufferPoolsExports构造函数:
public BufferPoolsExports() {
try {
final Class> bufferPoolMXBeanClass = Class.forName("java.lang.management.BufferPoolMXBean");
bufferPoolMXBeans.addAll(accessBufferPoolMXBeans(bufferPoolMXBeanClass));
getName = bufferPoolMXBeanClass.getMethod("getName");
getMemoryUsed = bufferPoolMXBeanClass.getMethod("getMemoryUsed");
getTotalCapacity = bufferPoolMXBeanClass.getMethod("getTotalCapacity");
getCount = bufferPoolMXBeanClass.getMethod("getCount");
} catch (ClassNotFoundException e) {
LOGGER.fine("BufferPoolMXBean not available, no metrics for buffer pools will be exported");
} catch (NoSuchMethodException e) {
LOGGER.fine("Can not get necessary accessor from BufferPoolMXBean: " + e.getMessage());
}
}
- 获取Mean类对象
- 获取可访问的MBean实例并添加到成员变量中
- 获取getName方法Method对象(缓冲池名称)
- 获取getMemoryUsed方法的Method对象(估算的jvm已使用内存大小)
- 获取getTotalCapacity方法的Method对象(预估的总的缓冲池大小)
- 获取getCount方法的Method对象(缓冲池中大致的数量)
collect()
方法返回buffer pool指标收集器收集的所有指标信息。
jvm_buffer_pool_used_bytes
jvm缓冲区使用情况,包括Code Cache(编译后的代码缓存,不同版本的jvm默认大小不同)、PS Old Gen(老年代)、PS Eden Space(伊甸园)、PS Survivor Space(幸存者)、PS Perm Gen(永久代)。
jvm_buffer_pool_capacity_bytes
给定jvm的估算缓冲区大小。这个metrics数据没有收集到,可能和jvm的版本有关,部署服务器使用的是jdk 6。
jvm_buffer_pool_used_buffers
给定jvm的已使用缓冲区大小。这个metrics没有收集到,可能和jvm的版本有关,部署服务器使用的是jdk 6。
ClassLoadingExports
提供jvm类加载指标。
jvm类加载指标数据由ClassLoadingMXBean
提供。
jvm_classes_loaded
jvm_classes_loaded_total
从jvm运行开始加载的类的数量,这是一个Counter指标,递增。
jvm_classes_unloaded_total
jvm运行后卸载的类数量,这是一个Counter指标。生产环境一直是0。
GarbageCollectorExports
提供jvm 垃圾收集器指标,指标数据有GarbageCollectorMXBean列表提供。
jvm_gc_collection_seconds
这是一个Summary指标,与Histogram类似,可以对指标数据进行采样。
MemoryAllocationExports
内存分配情况指标,这个指标因java版本不兼容而没有做监控。
MemoryPoolsExports
jvm 内存区域指标。
jvm_memory_bytes_used
jvm_memory_bytes_committed
Committed (bytes) of a given JVM memory area
jvm_memory_bytes_max
jvm内存区域的最大字节数
jvm_memory_bytes_init
jvm内存区域的初始化字节数
jvm_memory_pool_bytes_used
jvm内存池使用情况
jvm_memory_pool_bytes_committed
Committed bytes of a given JVM memory pool.
jvm_memory_pool_bytes_max
jvm内存池最大数
jvm_memory_pool_bytes_init
jvm内存池初始化数
ThreadExports
jvm线程区域监控。
jvm_threads_current
jvm当前线程数。
jvm_threads_daemon
jvm后台线程数。
jvm_threads_peak
jvm线程峰值
jvm_threads_started_total
jvm总启动线程数量,Counter指标。
jvm_threads_deadlocked
死锁线程数量
jvm_threads_deadlocked_monitor
Cycles of JVM-threads that are in deadlock waiting to acquire object monitors
jvm_threads_state
VersionInfoExports
jvm版本信息
jvm_info
版本信息,可以看到生产环境使用的是:1.6.0.29-b11
StandardExports
所有prometheus 客户端共有的标准指标。
process_cpu_seconds_total
用户和系统的总cpu使用时间
process_start_time_seconds
Start time of the process since unix epoch in seconds
process_open_fds
打开的文件描述符数量
process_max_fds
看支持打开的最大文件描述符数量
PromQL
todo
(190918:登录发现有提醒,终于有个觉悟,所有的todo都是不可能完成的坑。。。。。。)
参考资料
Prometheus 入门与实践