Prometheus hotspot监控指标解读

团结

简介

Prometheus 是一套开源的系统监控报警框架。它启发于 Google 的 borgmon 监控系统,由工作在 SoundCloud 的 google 前员工在 2012 年创建,作为社区开源项目进行开发,并于 2015 年正式发布。2016 年,Prometheus 正式加入 Cloud Native Computing Foundation,成为受欢迎度仅次于 Kubernetes 的项目。

特性

  • 强大的多维度数据模型:

    1. 时间序列数据通过 metric 名和键值对来区分。
    2. 所有的 metrics 都可以设置任意的多维标签。
    3. 数据模型更随意,不需要刻意设置为以点分隔的字符串。
    4. 可以对数据模型进行聚合,切割和切片操作。
    5. 支持双精度浮点类型,标签可以设为全 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());
    }
}
  1. 获取Mean类对象
  2. 获取可访问的MBean实例并添加到成员变量中
  3. 获取getName方法Method对象(缓冲池名称)
  4. 获取getMemoryUsed方法的Method对象(估算的jvm已使用内存大小)
  5. 获取getTotalCapacity方法的Method对象(预估的总的缓冲池大小)
  6. 获取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类似,可以对指标数据进行采样。
count rate
平均耗时

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
(190918:登录发现有提醒,终于有个觉悟,所有的todo都是不可能完成的坑。。。。。。)

参考资料

Prometheus 入门与实践

阅读 3.7k

tuanjie
学习日记

诗酒趁年华

126 声望
2 粉丝
0 条评论

诗酒趁年华

126 声望
2 粉丝
宣传栏