Prometheus 是一款开源的系统监控和报警工具包,最初由 SoundCloud 开发。它现在是一个独立的开源项目,并且是云原生计算基金会(CNCF)的一部分。Prometheus 非常适合记录任何纯数字时间序列数据,这使得它非常适合用于监控系统的性能指标。它支持多种类型的图表和仪表板展示,可以非常方便地集成到各种环境中。
主要特点
- 多维度数据模型:Prometheus 使用标签来区分不同的时间序列数据。
- 灵活的查询语言:Prometheus 提供了一种强大的查询语言 PromQL (Prometheus Query Language),用于实时选择和聚合时间序列数据。
- 不依赖分布式存储:每个 Prometheus 服务器都是独立工作的,不需要依赖外部存储服务。
- 通过 HTTP 拉取指标:Prometheus 通常通过 HTTP 协议定期从被监控的服务拉取指标。
- 支持推送网关:对于一些不能直接暴露 HTTP 端点的情况,Prometheus 支持使用 Pushgateway 来接收临时任务或批处理作业的指标推送。
- 易于操作:安装和配置相对简单,同时提供了丰富的文档和支持社区。
监控堆外内存
当谈到“堆外”监控时,通常是指 Java 应用程序中不在 JVM 堆空间内分配的内存。在 Java 中,除了堆内存之外,还有其他形式的内存使用,比如直接内存、元空间等。为了监控这些堆外内存使用情况,可以通过以下几种方式结合 Prometheus 来实现:
JMX Exporter:如果你的应用程序运行在一个支持 JMX 的环境里,可以使用 Prometheus 的 JMX Exporter 将 JMX metrics 转换为 Prometheus 可以抓取的格式。对于 Java 应用来说,JMX 是一个非常强大的工具,可以用来获取包括堆外内存在内的各种内部状态信息。
Micrometer:这是一个库,旨在为Java应用程序提供度量标准收集功能,它支持多种监控系统作为后端,包括 Prometheus。Micrometer 可以与 Spring Boot 应用程序无缝集成,帮助开发者轻松地跟踪应用性能指标,包括但不限于堆外内存使用情况。
自定义Exporter:如果上述方法无法满足需求,也可以开发自己的 exporter,针对特定的应用场景收集并公开相关指标给 Prometheus。
配置示例
假设你已经选择了合适的 exporter,接下来你需要在 Prometheus 的配置文件 prometheus.yml
中添加相应的 job 来抓取目标服务的 metrics。例如,如果你使用的是 JMX Exporter,你的配置可能看起来像这样:
scrape_configs:
- job_name: 'java_applications'
static_configs:
- targets: ['localhost:9090'] # 假设你的exporter运行在此端口
记得根据实际情况调整目标地址和其他参数。