coldsmog开发笔记
JS 事件笔记
Ckeditor 上传WPS图片失败问题
Springboot
SpringBoot 统一异常处理
Springboot 引入外部jar包
Springboot 打成war包
Springboot 多环境配置
SpringBoot @Scope注解学习
Springboot 快速生成项目API文档
SpringCache 缓存
Spring jetcache 二级缓存
Springboot 按条件装配类
FastJson的JsonPath语法
正则表达式语法
Spring 路径匹配
Feign 基础数据操作
监控Feign调用metrics
Springboot feign的性能优化
Jackson 设置序列化属性
SpringBoot 集成 Spring Data Mongodb 操作 MongoDB
MongoDB 的一些注意事项
MongoDB 指令对比
Jackson 解析XML
Springboot Redis注册
SpringBoot RedisTemplate批量插入
Springboot 指标监控Micrometer
springboot validation 注解校验
springboot 引入配置
Springboot 静态文件处理
Springboot 导出csv文件
Springboot 事件驱动(发布/订阅模式)
Springboot 启动过程和扩展点
Springboot 优化停机上下线
Spring自动装配 - 干饭角度学习
Springboot ShardingJDBC
Springboot的重试
springboot 动态修改端口
Oracle
Oracle 中实现自增ID
Oracle 定时任务
Oracle 解锁临时表
Oracle 检查连接数
Oracle 表空间
Oracle 解释执行SQL
markdown作图(适用typora)
服务器压测
业务对象层和数据层
并发限流处理
中间件
Yarn的使用
Dubbo学习笔记-RPC扩展和本地Mock
Dubbo学习笔记-泛化实现进行mock
Redis缓存穿透,缓存击穿,缓存雪崩
Galera 集群说明
Pip 镜像
pip 使用
MySQL命令行
数据库缓存双写方案
Git相关操作
Redis 操作时间复杂度一览
nacos 杂记
mybatis 散记
shardingjdbc
一次线上事故排查发现的Caffeine缓存死锁问题
设计模式
重新讲讲单例模式和几种实现
更优雅地实现策略模式
Http-headers
Prometheus 杂散笔记
JAVA 散记
CompletableFuture
Gson、FastJson、Jackson、json-lib对比总结
jackson 时间的序列化踩坑
JVM
自定义注解
mysql类型和java类型 转换一览表
枚举维护一个Map<value, Enum>的映射
Java中String +、concat、StringBuilder、StringBuffer 性能对比
TraceId 使用
MySQL 多数据源处理
Mybatis-plus 流式查询
JAVA发送win 桌面通知
idea 启动项目失败非代码问题杂记
Lambda 简述
Arthas 使用笔记
一种链式更新数据的数据模式
Skywalking 新增中间件插件
Redission 使用
数据导出为图片
IDEA 的热重启
Netty 工具类
maven 插件
本文档使用 MrDoc 发布
-
+
首页
Springboot 指标监控Micrometer
## 1. 什么是Micrometer? 现代成熟的公司中,监控指标系统是必不可少的。springboot的指标监控底层即为 [Micrometer](https://micrometer.io/)。 Micrometer 为大部分流行的监控系统提供了一个简单指标监控门面,允许您监控在JVM上运行的应用程序代码。如果说SLF4J是日志门面,那么Micrometer就是指标监控门面。 Spring Boot Actuator为 Micrometer 提供依赖管理和自动配置。国内比较常见的为 Prometheus(最多)、Elastic、Influx、JMX... [Springboot支持自动装配的组件清单](https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#actuator.metrics) [对应的组件依赖maven清单](https://mvnrepository.com/search?q=micrometer-registry) 要注册自定义指标,请将 MeterRegistry 注入您的组件 ``` @Component public class MyBean { private final Dictionary dictionary; public MyBean(MeterRegistry registry) { this.dictionary = Dictionary.load(); registry.gauge("dictionary.size", Tags.empty(), this.dictionary.getWords().size()); } } ``` 如果您的指标依赖于其他 bean,我们建议您使用 MeterBinder 来注册它们: ``` public class MyMeterBinderConfiguration { @Bean public MeterBinder queueSize(Queue queue) { return (registry) -> Gauge.builder("queueSize", queue::size).register(registry); } } ``` 使用 MeterBinder 可确保设置正确的依赖关系,并确保在检索度量值时 bean 可用。如果您发现您反复检测跨组件或应用程序的一组指标,MeterBinder 实现也很有用。 ## 2. 快速开始 从1的清单中,我们需要挑选一个组件用户指标的收集展示。我们以互联网最常见的Prometheus进行举例, ### 2.1 在pom.xml中添加依赖 ``` <!-- springboot提供的自动配置和依赖注入 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency> <!-- 以prometheus需要的格式暴露指标 --> <dependency> <groupId>io.micrometer</groupId> <artifactId>micrometer-registry-prometheus</artifactId> <version>1.8.4</version> </dependency> ``` ### 2.2 添加配置文件 application.yml ``` spring: application: name: cn-coldsmog-metrics-demo server: port: 80 management: server: # 默认是${server.port},但是如果项目接口暴露到公网会被扫描到,故建议另起端口并只对内网开放 port: 6888 metrics: tags: # 这里添加全局指标tag application: ${spring.application.name} master-host: "coldsmog.cn" endpoints: web: # prometheus默认暴露/actuator/prometheus,也许你要修改actuator这个前缀路径 base-path: /actuator exposure: include: # 支持暴露多个指标端点 - health - metrics - prometheus ``` ### 2.3 启动项目,访问指标端口配置的路径 检查项目存活的health接口 http://localhost:6888/actuator/health 提供所有可用的指标列表 http://localhost:6888/actuator/metrics 提供给Prometheus的指标 http://localhost:6888/actuator/prometheus ### 2.4 一些简单监控 ``` # 平均耗时 sum by(app,uri) (irate(http_server_requests_seconds_sum{pod_name=~"mobileweb-eq-etf.*",uri!~".*actuator.*",uri!~".*/readiness"}[2m])) / sum by(app,uri) (irate(http_server_requests_seconds_count{pod_name=~"mobileweb-eq-etf.*",uri!~".*actuator.*",uri!~".*/readiness"}[2m])) # 请求QPS 新增情况,用户检查突增流量 sum by(app,uri) (irate(http_server_requests_seconds_count{pod_name=~"mobileweb-eq-etf.*",uri!~".*actuator.*",uri!~".*/readiness"}[2m])) # 6小时内请求量前10 topk(10,sum(increase(http_server_requests_seconds_count{pod_name=~"my_pod_name.*",uri!~".*actuator.*",uri!~".*/readiness"}[6h])) by (uri,method) ) # 慢请求top10的接口 topk(10,max(http_server_requests_seconds_max{pod_name=~"my_pod_name.*",uri!~".*actuator.*",uri!~".*/readiness"}) by (uri,method,app)) ``` 参考 https://www.cnblogs.com/xuweiqiang/p/16451862.html ## 3. Springboot集成openfeign指标监控 springboot项目有很多发出请求的组件,从原始的httpClient,到后面hutool封装的请求组件,再到我们自己组装的各种轮子,花样繁多。 而目前行业趋势是逐渐使用feign这一声明式的Client客户端。不仅适用于微服务,也适用了传统的单体应用。 我们今天的目标是:监控feign请求数据源的情况。笔者一般用于评估数据源的可靠性和请求性能,方便定位问题(甩锅)。 ### 3.1 我们需要加入openfeign的相关依赖 ``` <!-- openfeign --> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-openfeign</artifactId> <version>3.1.1</version> </dependency> <!-- Micrometer 支持 okhttp --> <dependency> <groupId>io.github.openfeign</groupId> <artifactId>feign-okhttp</artifactId> <version>11.8</version> </dependency> ``` ### 3.2 修改配置,让openfeign底层换为okhttp ``` # 将feign底层换成okhttp feign: httpclient: enabled: false okhttp: enabled: true ``` ### 3.3 完成openfeign的自动配置 - Application类需要添加@EnableFeignClients注解开启feign - 添加自动配置类如下 ``` @Configuration public class OpenFeignConfig { @Bean public Client feignClient(MeterRegistry registry) { OkHttpMetricsEventListener listener = OkHttpMetricsEventListener.builder(registry, "okhttp.requests") // 你也可以用Tags.of指定指标 .tags(Tags.empty()) .build(); okhttp3.OkHttpClient okHttpClient = new okhttp3.OkHttpClient.Builder() .eventListener(listener) .build(); // 注意此处两个OkHttpClient的不同 return new feign.okhttp.OkHttpClient(okHttpClient); } } ``` ### 3.4 用一个小demo验证 ColdsmogFeign调用数据源 ``` /** * 尝试请求我的博客首页 寒烟濡雨: https://www.cnblogs.com/hyry/ */ @FeignClient(value = "coldsmog", url = "https://www.cnblogs.com") public interface ColdSmogFeign { @GetMapping(value = "/hyry/") String getData(); } ``` MyController 做一个对外暴露的接口 ``` @RestController public class MyController { @Resource private ColdSmogFeign coldSmogFeign; @GetMapping(value = "/index") public String getData() { return coldSmogFeign.getData(); } } ``` ### 3.5 简单监控 ``` ## 请求平均耗时 util_http_exec_avg_mills{app="my_pod_name"} ## 请求最慢耗时 util_http_exec_max_mills{app="my_pod_name"} ## 请求执行每分钟执行情况 (根据name细分) util_http_exec_count{app="my_pod_name"} ``` ## 4. Springboot集成Cache指标监控 SpringCache 就是我们熟悉的@Cacheabel系列注解,本地缓存一般我们会使用google的guave,但是国内比较推荐中文文档齐全,性能更佳的caffeine 我们今天的目标是:通过监控本地cache的情况,可以较好地评估数据缓存情况 ### 4.1 引入caffeine依赖 ``` <!-- caffeine 2.X为jdk8版 3.X为jdk11版 --> <dependency> <groupId>com.github.ben-manes.caffeine</groupId> <artifactId>caffeine</artifactId> <version>2.9.3</version> </dependency> ``` ### 4.2 注册caffeine ``` @Configurable public class CaffeineConfig { @Bean public CaffeineCache userCache(){ Cache<Object,Object> cache = Caffeine.newBuilder() .maximumSize(800) .expireAfterWrite(20, TimeUnit.SECONDS) .recordStats() .build(); return new CaffeineCache("user", cache); } } @Cacheable(cacheNames = "user", key = "#id") public String selectById(Long id) { log.info("selectById"); return "selectById:" + id; } ``` ### 4.3 简单监控 ``` # 缓存命中率 sum (cache_gets_total{app="my_pod_name",result="hit"}) by (app,name) / sum (cache_gets_total{app="my_pod_name"}) by (app,name) # 缓存数量 cache_size{app="my_pod_name"} ``` ## 5. 自定义Actuator端点 ``` // 在management.endpoints.web.exposure.include 里加上alive @Endpoint(id="alive") @Component public class AlivenessEndPoint { @ReadOperation public ResponseEntity getCustomWebInfo() { // TODO 完成要干得事情,把信息放ResponseEntity里返回 } } ``` 更多的一些操作,可以参加下面的文章, 比如 实现`InfoContributor`来扩充`info`端点;实现`HealthIndicator`来新增`health`检查等等 https://www.oomspot.com/post/torzujianshixianxitongjiankong
寒烟濡雨
2024年3月7日 14:08
转发文档
收藏文档
上一篇
下一篇
手机扫码
复制链接
手机扫一扫转发分享
复制链接
关于 MrDoc
觅思文档MrDoc
是
州的先生
开发并开源的在线文档系统,其适合作为个人和小型团队的云笔记、文档和知识库管理工具。
如果觅思文档给你或你的团队带来了帮助,欢迎对作者进行一些打赏捐助,这将有力支持作者持续投入精力更新和维护觅思文档,感谢你的捐助!
>>>捐助鸣谢列表
微信
支付宝
QQ
PayPal
Markdown文件
分享
链接
类型
密码
更新密码