Prometheus 监控 Nexus 全栈实战:从存储容量到组件健康的制品仓库可观测性
Nexus Repository Manager 是大多数企业不可或缺的制品仓库,托管着 Maven、Docker、npm、PyPI 等海量组件。一旦它的存储空间耗尽、Blob 存储异常、任务失败、GC 停顿或并发请求阻塞,整个 CI/CD 流水线和生产部署都可能瘫痪。Nexus 3.19 及以上版本原生内置了 Prometheus 指标端点,只需启用便可暴露 JVM、存储、仓库、任务等关键数据。本文将从启用端点、配置抓取,到解读指标、创建 Grafana 大屏与告警规则,让你像监控应用一样监控制品仓库的每一次呼吸。
1. 方案选型:内置端点 vs JMX Exporter
| 方案 | 适用版本 | 特点 |
|---|---|---|
| Nexus 内置 Prometheus 端点(推荐) | Nexus 3.19+ | 官方支持,开箱即用;暴露存储、Blob 存储、仓库、任务、Jetty 线程池等指标;无需额外插件 |
| JMX Exporter | 所有版本 | 通用 Java Agent,需手工编写 MBean 规则,无法直接获取 Nexus 业务指标(如仓库计数、任务状态) |
| 社区插件 (nexus-prometheus-plugin) | 3.19 之前 | 已不推荐,因内置功能已覆盖 |
明确选择:如果使用 Nexus 3.19 及以上版本,直接启用内置 Prometheus 端点;若为更早版本,建议升级或临时使用 JMX Exporter 过渡。本文以Nexus 3.x 内置端点为主线。
2. 启用 Nexus 内置 Prometheus 端点
2.1 配置 Nexus 暴露指标
Nexus 的 Prometheus 端点默认处于关闭状态,需要通过配置nexus.properties或环境变量开启。
编辑/opt/nexus/etc/nexus-default.properties(或nexus.properties),添加以下行:
nexus.metrics.export.prometheus.enabled=true nexus.metrics.export.prometheus.port=9101 nexus.metrics.export.prometheus.path=/metrics或者通过环境变量启动:
dockerrun-d\--namenexus\-p8081:8081\-p9101:9101\-eNEXUS_METRICS_EXPORT_PROMETHEUS_ENABLED=true\-eNEXUS_METRICS_EXPORT_PROMETHEUS_PORT=9101\sonatype/nexus3:latest重启 Nexus 后,访问http://nexus-host:9101/metrics,应看到nexus_storage_used_bytes、jvm_memory_used_bytes等指标。
2.2 安全与网络隔离
生产环境中,建议将 Prometheus 端点端口(如 9101)仅绑定至内网 IP,或通过防火墙限制访问来源。若需加密和认证,可在 Nexus 前部署 Nginx 反向代理。
3. 配置 Prometheus 抓取
scrape_configs:-job_name:'nexus'scrape_interval:30smetrics_path:'/metrics'static_configs:-targets:['nexus-host:9101']labels:env:'production'instance:'nexus-prod'如果 Nexus 使用了 HTTPS 和自签名证书,需配置scheme: https和tls_config。
4. 核心监控指标与 PromQL
Nexus 内置端点暴露的指标涵盖存储、Blob 存储、仓库、任务、Jetty (HTTP)、JVM、系统等类别。
4.1 存储与 Blob 存储
| 指标 | 含义 |
|---|---|
nexus_storage_used_bytes | 各存储(Blob 存储)已用字节数 |
nexus_storage_total_bytes | 总容量 |
nexus_blobstore_used_bytes | 按 Blob 存储名称的已用字节 |
PromQL 示例:
- 存储使用率:
nexus_storage_used_bytes / nexus_storage_total_bytes * 100 - 某个 Blob 存储接近满:
nexus_blobstore_used_bytes / on(blobstore) nexus_storage_total_bytes > 0.85
4.2 仓库统计
| 指标 | 含义 |
|---|---|
nexus_repository_count | 仓库数量(按类型type标签) |
nexus_repository_component_count | 组件总数 |
虽然后者可能不直接暴露,但有nexus_repository_status等指标。具体指标名可能因版本而异,可通过/metrics确认。常见指标如nexus_http_requests_total等。
按格式分组示例:nexus_repository_count{type="docker"}用于观察 Docker 仓库数量。
4.3 任务状态
| 指标 | 含义 |
|---|---|
nexus_task_last_run_duration_seconds | 任务最后一次运行耗时 |
nexus_task_last_run_status | 状态(0=成功, 1=失败, 2=运行中, 3=取消 等) |
nexus_task_last_run_timestamp_seconds | 最后运行时间戳 |
PromQL 示例:
- 任务失败:
nexus_task_last_run_status == 1 - 任务运行超时:
nexus_task_last_run_duration_seconds > 3600(超过 1 小时)
4.4 HTTP (Jetty) 指标
| 指标 | 含义 |
|---|---|
jetty_threads_busy | 忙碌的 Jetty 线程数 |
jetty_threads_max | 最大线程数 |
jetty_threads_idle | 空闲线程数 |
http_server_requests_seconds_count/sum(若暴露) | HTTP 请求计数与延迟 |
PromQL 示例:
- 线程池饱和度:
jetty_threads_busy / jetty_threads_max - 活跃请求数:
jetty_threads_busy
4.5 JVM 与系统
| 指标 | 含义 |
|---|---|
jvm_memory_used_bytes{area="heap"}/jvm_memory_max_bytes{area="heap"} | 堆内存使用/上限 |
jvm_gc_pause_seconds_count/sum | GC 暂停次数与总时间 |
process_cpu_seconds_total | CPU 使用时间 |
process_open_fds | 打开的文件描述符数 |
PromQL 示例:
- 堆使用率:
jvm_memory_used_bytes{area="heap"} / jvm_memory_max_bytes{area="heap"} * 100 - GC 平均暂停:
rate(jvm_gc_pause_seconds_sum[5m]) / rate(jvm_gc_pause_seconds_count[5m])
5. Grafana 仪表盘推荐
- Nexus Repository Manager Dashboard:Dashboard ID14642(社区适配),展示存储使用、Blob 存储、仓库统计、任务状态、JVM 堆、HTTP 线程池等。
- Nexus OSS:ID11512(备选)。
- 自定义制品仓库大屏:使用 Stat Panel 显示存储使用率,Table 展示失败任务,Time series 绘制 HTTP 请求延迟和 JVM 内存趋势。
导入后选择数据源,变量instance对应你的 Nexus 实例。
6. 告警规则实战
groups:-name:nexus_alertsrules:-alert:NexusDownexpr:up{job="nexus"}== 0for:1mlabels:severity:criticalannotations:summary:"Nexus 实例 {{ $labels.instance }} 不可达"-alert:NexusStorageSpaceLowexpr:(nexus_storage_used_bytes / nexus_storage_total_bytes) * 100>85for:10mlabels:severity:criticalannotations:summary:"Nexus 存储使用率超过 85%,当前 {{ $value }}%"-alert:NexusTaskFailedexpr:nexus_task_last_run_status == 1for:2mlabels:severity:criticalannotations:summary:"Nexus 任务 {{ $labels.task }} 执行失败"-alert:NexusHighHeapUsageexpr:(jvm_memory_used_bytes{area="heap"}/ jvm_memory_max_bytes{area="heap"}) * 100>85for:10mlabels:severity:warningannotations:summary:"Nexus 堆内存使用率超过 85%"-alert:NexusThreadPoolSaturationexpr:(jetty_threads_busy / jetty_threads_max)>0.8for:10mlabels:severity:warningannotations:summary:"Nexus HTTP 线程池使用率超过 80%"-alert:NexusBlobStoreFullexpr:(nexus_blobstore_used_bytes / on(blobstore) nexus_storage_total_bytes)>0.9for:10mlabels:severity:criticalannotations:summary:"Blob 存储 {{ $labels.blobstore }} 使用率超过 90%"7. 进阶:多实例、安全与旧版本方案
7.1 监控多个 Nexus 实例
每个 Nexus 实例独立启用 Prometheus 端点,Prometheus 中配置多个 target 并用instance标签区分。Grafana 面板通过变量切换。
7.2 安全加固
- 确保 Prometheus 端点端口(9101)仅被 Prometheus 服务器访问,使用防火墙或安全组。
- 可在 Nexus 前部署 Nginx,对
/metrics添加 Basic Auth,并在 Prometheus 中配置basic_auth。 - 定期轮换 Nexus 管理员密码,尽管指标端点无需认证。
7.3 旧版本 Nexus (3.19 之前)
如果无法升级,可选择部署JMX Exporter。下载jmx_prometheus_javaagent.jar,编写规则文件nexus_jmx.yml,然后在 Nexus 的 JVM 参数中添加:
-javaagent:/path/to/jmx_prometheus_javaagent.jar=9092:/path/to/nexus_jmx.ymlPrometheus 抓取nexus-host:9092/metrics。规则文件需手动定义感兴趣的 MBean,例如org.sonatype.nexus下的指标。这需要一定的手工调试。
8. 总结
借助 Nexus 3.19+ 的原生 Prometheus 端点,制品仓库的内部状态不再是一团迷雾。从存储容量到任务健康,从 Blob 存储到 HTTP 线程池,所有关键信号都实时进入 Prometheus,在 Grafana 中可视化,并通过 Alertmanager 及时告警。将 Nexus 纳入全栈可观测性体系,意味着你的 CI/CD 流水线和制品链路的最后一块拼图也被点亮,真正实现从代码提交到制品管理的全链路透明。部署它,让制品仓库也拥有属于自己的“健康手环”。