简介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虚拟机监控指标收集BufferPoolsExportsJVM缓冲区监控指标。 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_bytesjvm缓冲区使用情况,包括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_totaljvm运行后卸载的类数量,这是一个Counter指标。生产环境一直是0。GarbageCollectorExports提供jvm 垃圾收集器指标,指标数据有GarbageCollectorMXBean列表提供。jvm_gc_collection_seconds这是一个Summary指标,与Histogram类似,可以对指标数据进行采样。MemoryAllocationExports内存分配情况指标,这个指标因java版本不兼容而没有做监控。MemoryPoolsExportsjvm 内存区域指标。jvm_memory_bytes_usedjvm已用内存区域。jvm_memory_bytes_committedCommitted (bytes) of a given JVM memory areajvm_memory_bytes_maxjvm内存区域的最大字节数jvm_memory_bytes_initjvm内存区域的初始化字节数jvm_memory_pool_bytes_usedjvm内存池使用情况jvm_memory_pool_bytes_committedCommitted bytes of a given JVM memory pool.jvm_memory_pool_bytes_maxjvm内存池最大数jvm_memory_pool_bytes_initjvm内存池初始化数ThreadExportsjvm线程区域监控。jvm_threads_currentjvm当前线程数。jvm_threads_daemonjvm后台线程数。jvm_threads_peakjvm线程峰值jvm_threads_started_totaljvm总启动线程数量,Counter指标。jvm_threads_deadlocked死锁线程数量jvm_threads_deadlocked_monitorCycles of JVM-threads that are in deadlock waiting to acquire object monitorsjvm_threads_state当前线程的状态VersionInfoExportsjvm版本信息jvm_info版本信息,可以看到生产环境使用的是:1.6.0.29-b11StandardExports所有prometheus 客户端共有的标准指标。process_cpu_seconds_total用户和系统的总cpu使用时间process_start_time_secondsStart time of the process since unix epoch in secondsprocess_open_fds打开的文件描述符数量process_max_fds看支持打开的最大文件描述符数量PromQLtodo参考资料Prometheus 入门与实践