Prometheus + Grafana + Micrometer 监控方案详解

这套组合是当前Java生态中最流行的监控解决方案之一,特别适合云原生环境下的微服务应用监控。下面我将从技术实现到最佳实践进行全面解析。

一、技术栈组成与协作

1. 组件分工

组件角色关键能力
Micrometer应用指标门面(Facade)统一指标采集API,对接多种监控系统
Prometheus时序数据库+采集器指标存储、查询、告警规则处理
Grafana可视化平台仪表盘展示、数据可视化分析

2. 数据流动

AppMicrometerPrometheusGrafana生成指标数据(JVM/HTTP等)暴露/metrics端点定期拉取指标数据存储和聚合数据查询数据渲染可视化图表AppMicrometerPrometheusGrafana

二、Micrometer 集成实践

1. Spring Boot 配置

Maven依赖

<dependency><groupId>io.micrometer</groupId><artifactId>micrometer-registry-prometheus</artifactId>
</dependency>
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

application.yml配置

management:endpoints:web:exposure:include: health,info,prometheusmetrics:export:prometheus:enabled: truetags:application: ${spring.application.name} # 统一添加应用标签

2. 自定义指标示例

业务指标采集

@Service
public class OrderService {private final Counter orderCounter;private final Timer orderProcessingTimer;public OrderService(MeterRegistry registry) {// 创建计数器orderCounter = Counter.builder("orders.total").description("Total number of orders").tag("type", "online").register(registry);// 创建计时器orderProcessingTimer = Timer.builder("orders.processing.time").description("Order processing time").publishPercentiles(0.5, 0.95) // 50%和95%分位.register(registry);}public void processOrder(Order order) {// 方法1: 手动计时long start = System.currentTimeMillis();try {// 业务逻辑...orderCounter.increment();} finally {long duration = System.currentTimeMillis() - start;orderProcessingTimer.record(duration, TimeUnit.MILLISECONDS);}// 方法2: 使用Lambda自动计时orderProcessingTimer.record(() -> {// 业务逻辑...orderCounter.increment();});}
}

三、Prometheus 配置优化

1. 抓取配置示例

# prometheus.yml
global:scrape_interval: 15sevaluation_interval: 30sscrape_configs:- job_name: 'spring-apps'metrics_path: '/actuator/prometheus'scrape_interval: 10s # 对应用更频繁采集static_configs:- targets: ['app1:8080', 'app2:8080']relabel_configs:- source_labels: [__address__]target_label: instance- source_labels: [__meta_service_name]target_label: service

2. 关键优化参数

存储配置

# 控制块存储行为
storage:tsdb:retention: 15d # 数据保留时间out_of_order_time_window: 1h # 允许乱序数据窗口# 限制内存使用
query:lookback-delta: 5mmax-concurrency: 20

四、Grafana 仪表盘设计

1. 核心监控仪表盘

JVM监控面板配置

Panel 1: Heap Memory Usage
Query: sum(jvm_memory_used_bytes{area="heap"}) by (instance) / sum(jvm_memory_max_bytes{area="heap"}) by (instance)
Visualization: Time series with % unitPanel 2: GC Pause Time
Query: rate(jvm_gc_pause_seconds_sum[1m])
Visualization: HeatmapPanel 3: Thread States
Query: jvm_threads_states_threads{instance=~"$instance"}
Visualization: Stacked bar chart

2. 业务指标可视化

订单业务看板

{"panels": [{"title": "Orders per Minute","targets": [{"expr": "rate(orders_total[1m])","legendFormat": "{{instance}}"}],"type": "graph","yaxes": [{"format": "ops"}]},{"title": "Processing Time (95%)","targets": [{"expr": "histogram_quantile(0.95, rate(orders_processing_time_seconds_bucket[1m]))","legendFormat": "P95"}],"type": "stat","unit": "s"}]
}

五、生产环境最佳实践

1. 指标命名规范

类型前缀示例
计数器_totalhttp_requests_total
计量器_currentqueue_size_current
计时器_secondsapi_latency_seconds
分布概要_summaryresponse_size_summary

2. 标签使用原则

  • 避免高基数标签:如用户ID、订单号等
  • 统一标签命名:团队内保持一致(如env vs environment
  • 重要维度标记regionazservice_version

3. 资源优化技巧

Micrometer配置

@Bean
MeterRegistryCustomizer<MeterRegistry> metricsCommonTags() {return registry -> registry.config().meterFilter(MeterFilter.deny(id -> {// 过滤不需要的指标return id.getName().startsWith("jvm_classes");})).commonTags("region", System.getenv("AWS_REGION"));
}

Prometheus资源限制

# 容器部署时设置资源限制
resources:limits:memory: 8Girequests:cpu: 2memory: 4Gi

六、高级功能实现

1. 自定义Collector

public class CustomMetricsCollector extends Collector {@Overridepublic List<MetricFamilySamples> collect() {List<MetricFamilySamples> samples = new ArrayList<>();// 添加自定义指标samples.add(new MetricFamilySamples("custom_metric",Type.GAUGE,"Custom metric description",Collections.singletonList(new MetricFamilySamples.Sample("custom_metric",List.of("label1"),List.of("value1"),getCurrentValue()))));return samples;}
}// 注册Collector
new CustomMetricsCollector().register();

2. 告警规则示例

groups:
- name: application-alertsrules:- alert: HighErrorRateexpr: rate(http_server_requests_errors_total[5m]) / rate(http_server_requests_total[5m]) > 0.05for: 10mlabels:severity: criticalannotations:summary: "High error rate on {{ $labels.instance }}"description: "Error rate is {{ $value }}"- alert: GCTooLongexpr: rate(jvm_gc_pause_seconds_sum[1h]) > 0.1labels:severity: warning

这套监控组合的优势在于:

  1. 云原生友好:完美契合Kubernetes环境
  2. 低侵入性:Micrometer作为抽象层减少代码耦合
  3. 高效存储:Prometheus的TSDB压缩比高
  4. 丰富可视化:Grafana社区提供大量现成仪表盘

建议实施路径:

  1. 先搭建基础监控(JVM/HTTP指标)
  2. 逐步添加业务指标
  3. 最后实现自定义告警和自动化处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/91107.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/91107.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

实习小记(个人中心的编辑模块)

实习小记&#xff08;个人中心的编辑模块&#xff09; 项目需要加一个个人中心的编辑模块&#xff0c;也是差不多搞了一天下来&#xff0c;其中遇到了很多问题&#xff0c;也是来记录、分享一下。 技术栈&#xff1a;React、antd、TypeScript 需求 点击编辑&#xff0c;弹出编…

【7】串口编程三种模式(查询/中断/DMA)韦东山老师学习笔记(课程听不懂的话试着来看看我的学习笔记吧)

<1>前置概念补充在深入拆解三种模式前&#xff0c;先通过提供的 “函数对比表” 建立整体认知&#xff1a;这张表是串口收发的「武器库索引」&#xff0c;清晰标注了查询、中断、DMA 三种模式下&#xff0c;收发 / 回调函数的对应关系。后续会结合实际代码&#xff0c;讲…

【Kubernetes 指南】基础入门——Kubernetes 201(二)

二、滚动升级- 滚动升级&#xff08;Rolling Update&#xff09;通过逐个容器替代升级的方式来实现无中断的服务升级&#xff1a;- 在滚动升级的过程中&#xff0c;如果发现了失败或者配置错误&#xff0c;还可以随时回滚&#xff1a;- 需要注意的是&#xff0c; kubectl rolli…

网络资源模板--基于Android Studio 实现的图书商城App

目录 一、测试环境说明 二、项目简介 三、项目演示 四、部设计详情&#xff08;部分) 登录注册页 首页 五、项目源码 一、测试环境说明 电脑环境 Windows 11 编写语言 JAVA 开发软件 Android Studio (2020) 开发软件只要大于等于测试版本即可(近几年官网直接下载…

JavaWeb 进阶:Vue.js 与 Spring Boot 全栈开发实战(Java 开发者视角)

作为一名 Java 开发工程师&#xff0c;当你掌握了 HTML、CSS 和 JavaScript 的基础后&#xff0c;是时候接触现代前端框架了。Vue.js 以其简洁的 API、渐进式的设计和优秀的中文文档&#xff0c;成为众多 Java 开发者入门前端框架的首选。Vue.js 让你能快速构建响应式、组件化的…

智能体产品化的关键突破:企业智能化转型的“最后一公里”如何迈过?

智能体产品化的关键突破&#xff1a;企业智能化转型的“最后一公里”如何迈过&#xff1f; 在人工智能迅猛发展的当下&#xff0c;智能体&#xff08;Agent&#xff09;成为企业数字化转型的新引擎。无论是市场分析、客户服务&#xff0c;还是自动化办公&#xff0c;智能体都被…

Rust × Elasticsearch官方 `elasticsearch` crate 上手指南

1 为什么选择官方 Rust 客户端&#xff1f; 语义化兼容&#xff1a;客户端 主版本 与 ES 主版本 严格对应&#xff0c;8.x 客户端可对接任何 8.x 服务器&#xff1b;不存在跨主版本兼容承诺 (docs.rs)100% API 覆盖&#xff1a;稳定 API 全量映射&#xff0c;Beta/实验特性可按…

怎样画流程图?符号与流程解构教程

在数字化办公和项目管理日益复杂的当下&#xff0c;流程图早已不是工程师、项目经理的专属工具&#xff0c;它正快速成为每一位职场人提升表达效率、理清工作逻辑的利器。无论是软件开发中的流程规范、产品设计阶段的用户路径&#xff0c;还是企业内部的审批流程、团队协作机制…

vue3 + vite || Vue3 + Webpack创建项目

1.vue3 vite搭建项目方法 &#xff08;需要提前装node,js&#xff09; 1. 使用官方 create-vite 工具&#xff08;推荐&#xff09; 1.使用npm----------------------------- npm create vuelatest2.使用pnpm----------------------------- pnpm create vuelatest3.使用yarn--…

Vue2-封装一个含所有表单控件且支持动态增减行列的表格组件

效果1. 无编辑权限&#xff1a;显示普通表格2. 有编辑权限&#xff1a;根据配置显示编辑控件3. 可以动态新增行&#xff0c;也可以动态新增列 核心代码无权限情况的核心代码<!-- 无编辑权限时显示普通表格 --><el-tablev-if"!hasEditPermission"ref"ta…

网络原理 - TCP/IP(一)

目录 1. 应用层&#xff1a;用户与网络的 “交互窗口” 1.1 应用层协议&#xff1a;规范交互的 “通用语言” 1.2 自定义协议&#xff1a;适配特殊需求的 “专属规则” 1.3 应用层数据格式&#xff1a;让数据 “说得明白” 1.3.1 XML&#xff1a;结构化但繁琐的 “老…

Orange的运维学习日记--16.Linux时间管理

Orange的运维学习日记–16. Linux时间管理 文章目录Orange的运维学习日记--16. Linux时间管理系统与硬件时钟时钟类型对比查看内核支持的时钟源本地时间调整使用 date 查看与设置一次性同步&#xff1a;ntpdate同步到硬件时钟&#xff1a;hwclock基于 systemd 的 timedatectl交…

Git 与 GitHub 的对比与使用指南

Git 与 GitHub 的对比与使用指南 在软件开发中&#xff0c;Git 和 GitHub 是两个密切相关但本质不同的工具。下面我将逐步解释它们的定义、区别、核心概念以及如何协同使用&#xff0c;确保内容真实可靠&#xff0c;基于广泛的技术实践。 1. 什么是 Git&#xff1f; Git 是一个…

20250726-4-Kubernetes 网络-Service DNS名称解析_笔记

一、Service DNS名称 1. 例题:通信需求 通信场景:项目A中的Pod需要与项目B中的Pod进行通信,直接使用Pod IP不可行,因为Pod IP会随着Pod生命周期变化。 解决方案:通过Service提供的稳定IP地址进行通信,不受Pod重建、扩容/缩容等操作影响。 2. CoreDNS介绍  基本功能…

vscode 登录ssh记住密码直接登录设置

第一种情况在系统已经生成密钥对的情况下&#xff1a;点击这里的设置第二步&#xff1a;第三步&#xff1a;没有填写的给填写一下第四步骤&#xff1a;保存后进入选择这个点开第五步&#xff1a;去Linux终端下输入这个命令就OK了echo "ssh-rsa内容" >> ~/.ssh/…

Nginx 动静分离配置(详细版)

本文介绍了Nginx 动静分离相关配置&#xff0c;主要包括了配置文件创建、配置示例、配置原理解析以及重新启用配置文件等等 本文目录1. 创建 Nginx 配置文件2. 配置示例3. 配置原理解析4. 启用配置文件并重新加载 Nginx1. 创建 Nginx 配置文件 在 /etc/nginx/sites-available …

C# CAN通信上位机系统设计与实现

C# CAN通信上位机系统设计与实现 C# CAN通信上位机程序&#xff0c;支持多种CAN适配器&#xff0c;提供数据收发、协议解析、数据可视化等功能。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; usi…

Ubuntu20.04子系统

常用 # 导出分发版到 E盘 wsl --export Ubuntu-20.04 E:\wsl-ubuntu20.04.tar # 注销原有分发版 wsl --unregister Ubuntu-20.04 # 导入到 E盘的新路径&#xff08;例如 E:\WSL\Ubuntu-20.04&#xff09; wsl --import Ubuntu-20.04 E:\WSL\Ubuntu-20.04 E:\wsl-ubuntu20.04.t…

【设计模式】状态模式 (状态对象(Objects for States))

状态模式&#xff08;State Pattern&#xff09;详解一、状态模式简介 状态模式&#xff08;State Pattern&#xff09; 是一种 行为型设计模式(对象行为型模式)&#xff0c;它允许一个对象在其内部状态改变时改变其行为。换句话说&#xff0c;对象看起来好像修改了它的类。 你…

工业前端组件库重构心法:如何让开发效率提升60%的交互模块设计逻辑

工业前端组件库重构心法&#xff1a;如何让开发效率提升60%的交互模块设计逻辑内容摘要在工业项目开发中&#xff0c;前端组件库是提升开发效率的关键。然而&#xff0c;许多团队的组件库存在设计不合理、维护困难等问题&#xff0c;导致开发效率低下。如果能够重构组件库&…