Prometheus hotspot监控指标解读

46次阅读

共计 3256 个字符,预计需要花费 9 分钟才能阅读完成。

简介
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 已加载类数量。
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 已用内存区域。
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
参考资料
Prometheus 入门与实践

正文完
 0