Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Spring学习笔记(二十九)——SpringBoot Actuator指标监控

Spring学习笔记(二十九)——SpringBoot Actuator指标监控

作者头像
不愿意做鱼的小鲸鱼
发布于 2022-09-26 10:11:24
发布于 2022-09-26 10:11:24
1.2K00
代码可运行
举报
文章被收录于专栏:web全栈web全栈
运行总次数:0
代码可运行

SpringBoot Actuator简介&使用

简介

在项目上线后,或者未来每一个微服务在云上部署以后,我们都需要对其进行监控、追踪、审计、控制等。SpringBoot就抽取了Actuator场景,使得我们每个微服务快速引用即可获得生产级别的应用监控、审计等功能。

依赖坐标

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-actuator</artifactId>
        </dependency>

SpringBoot Actuator 1.x与2.x的不同

如何使用

  • 引入场景
  • 访问 http://localhost:8080/actuator/
  • 暴露所有监控信息为HTTP
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
management:
  endpoints:
    enabled-by-default: true #暴露所有端点信息
    web:
      exposure:
        include: '*'  #以web方式暴露
  • 测试引入是否成功
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
http://localhost:8080/actuator/beans
http://localhost:8080/actuator/configprops
http://localhost:8080/actuator/metrics
http://localhost:8080/actuator/metrics/jvm.gc.pause
http://localhost:8080/actuator/endpointName/detailPath

Actuator Endpoint指标端点

1. 最常使用的端点

最常用的Endpoint * Health:监控状况 * Metrics:运行时指标 * Loggers:日志记录

2、Health Endpoint

健康检查端点,我们一般用于在云平台,平台会定时的检查应用的健康状况,我们就需要Health Endpoint可以为平台返回当前应用的一系列组件健康状况的集合。

访问信息路径:http://localhost:8080/actuator/health

重要的几点: * health endpoint返回的结果,应该是一系列健康检查后的一个汇总报告 * 很多的健康检查默认已经自动配置好了,比如:数据库、redis等 * 可以很容易的添加自定义的健康检查机制

3. Metrics Endpoint

提供详细的、层级的、空间指标信息,这些信息可以被pull(主动推送)或者push(被动获取)方式得到; * 通过Metrics对接多种监控系统 * 简化核心Metrics开发 * 添加自定义Metrics或者扩展已有Metrics

访问信息路径:http://localhost:8080/actuator/metrics

4. 管理Endpoints

  1. 开启与禁用Endpoints

* 默认所有的Endpoint除了shutdown都是开启的。 * 需要开启或者禁用某个Endpoint。配置模式为 management.endpoint.<endpointName>.enabled = true

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
management:
  endpoint:
    beans:
      enabled: true
  • 或者禁用所有的Endpoint然后手动开启指定的Endpoint
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
management:
  endpoints:
    enabled-by-default: false
  endpoint:
    beans:
      enabled: true
    health:
      enabled: true
  1. 暴露Endpoints 支持的暴露方式

* HTTP:默认只暴露health和info Endpoint * JMX:默认暴露所有Endpoint * 除了health和info,剩下的Endpoint都应该进行保护访问。如果引入SpringSecurity,则会默认配置安全访问

开启Endpoints和暴露Endpoints可以做以下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## management 是所有actuator的配置
## management.endpoint.端点名.xxxx 对某个端点的具体配置
management:
  endpoints:
    #默认开启所有监控端点
    enabled-by-default: true
    web:
      exposure:
        ## 以web方式暴露所有端点
        include: '*'

  endpoint:   #对某个端点的具体配置
    health:
      show-details: always
      enabled: true

    info:
      enabled: true

    beans:
      enabled: true

    metrics:
      enabled: true

定制 Endpoint端点

在开发中,如果需要自己定义指标端点用于监控某一项功能或者模块,我们就可以使用自己定制 Endpoint端点,来达到自定义数据统计和指标监控的效果。 尝试定制四类端点信息 1. 定制 Health 信息 2. 定制info信息 3. 定制Metrics信息 4. 定制Endpoint

目录结构如下

1. 定制 Health 信息

  1. yml配置显示详细信息
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
management:
    health:
      enabled: true
      show-details: always #总是显示详细信息。可显示每个模块的状态信息
  1. 自定义健康组件 MyComHealthIndicator.java MyComHealthIndicator其中HealthIndicator是固定写法,必须要有,myCom 是该健康组件的名字
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.boot.actuate.health.AbstractHealthIndicator;
import org.springframework.boot.actuate.health.Health;
import org.springframework.boot.actuate.health.Status;
import org.springframework.stereotype.Component;

import java.util.HashMap;
import java.util.Map;
/**
 * @author tao
 * @date 2021-08-25 23:09
 * 概要:自定义健康组件
 */

//将组件放在容器中,其中 myCom 是该健康组件的名字
@Component
public class MyComHealthIndicator extends AbstractHealthIndicator {
    /**
     * 真实的检查方法
     *
     * @param builder
     * @throws Exception
     */
    @Override
    protected void doHealthCheck(Health.Builder builder) throws Exception {
        //mongodb 获取连接进行测试
        Map<String, Object> map = new HashMap<>();
        //检查完成
        if (1 == 1) {
            //健康
            //builder.up();
            builder.status(Status.UP);
            map.put("count", 1);
            map.put("ms", 200);
        } else {
            //宕机
            builder.down();
            builder.status(Status.OUT_OF_SERVICE);
            map.put("err", "连接超时");
            map.put("ms", 5000);
        }
        builder.withDetail("code", 100).withDetails(map);
    }
}
  1. 测试结果 访问路径:http://localhost:8080/actuator/health

2. 定制info信息

常用两种方式 1、编写配置文件

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#定制监控的info信息
info:
  appName: @project.name@
  version: 2.0.1
  #使用@@可以获取maven的pom文件值,需要在pom文件里面添加配置信息
  mavenProjectName: @project.artifactId@
  mavenProjectVersion: @project.version@

注意: 使用@@可以获取maven的pom文件值,需要在pom文件里面添加配置信息 但是如果使用@@表达式报错或者没有提示时,可能时因为pom.mxl中没有打开@@获取pom文件信息 需要如下操作: * 在<build>标签下加入以下配置

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
            <resources>
               <resource>
                  <directory>src/main/resources</directory>
                  <filtering>true</filtering>
               </resource>
            </resources>
  • 在<plugins>下加入以下配置
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!--允许使用@@获取pom文件信息-->
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-resources-plugin</artifactId>
                <configuration>
                    <delimiters>
                        <delimiter>@</delimiter>
                    </delimiters>
                    <useDefaultDelimiters>false</useDefaultDelimiters>
                </configuration>
            </plugin>

启用配置后就OK了。 2. 编写InfoContributor.java配置类

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.boot.actuate.info.Info;
import org.springframework.boot.actuate.info.InfoContributor;
import org.springframework.stereotype.Component;
import java.util.HashMap;
import java.util.Map;
/**
 * @author tao
 * @date 2021-08-25 23:42
 * 概要:
 */
@Component
public class AppInfoContributor implements InfoContributor {
    @Override
    public void contribute(Info.Builder builder) {
        builder.withDetail("msg", "你好");
        builder.withDetail("hello", "如我西沉");
        Map<String, Object> map = new HashMap<>();
        map.put("phoneNum", "1205529635");
        map.put("QQ", "1205529635");
        map.put("name", "Nick");
        builder.withDetails(map);
    }
}
  1. 测试结果 访问路径:http://localhost:8080/actuator/info

3. 定制Metrics信息

  1. SpringBoot支持自动适配的Metrics >Micrometer 为 Java 平台上的性能数据收集提供了一个通用的 API,它提供了多种度量指标类型(Timers、Guauges、Counters等),同时支持接入不同的监控系统,例如 Influxdb、Graphite、Prometheus 等。我们可以通过 Micrometer 收集 Java 性能数据,配合 Prometheus 监控系统实时获取数据,并最终在 Grafana 上展示出来,从而很容易实现应用的监控。 > Micrometer 提供了如下几种不同类型的计量器:

* 计数器(Counter): 表示收集的数据是按照某个趋势(增加/减少)一直变化的,也是最常用的一种计量器,例如接口请求总数、请求错误总数、队列数量变化等。 * 计量仪(Gauge): 表示搜集的瞬时的数据,可以任意变化的,例如常用的 CPU Load、Mem 使用量、Network 使用量、实时在线人数统计等, * 计时器(Timer): 用来记录事件的持续时间,这个用的比较少。 * 分布概要(Distribution summary): 用来记录事件的分布情况,表示一段时间范围内对数据进行采样,可以用于统计网络请求平均延迟、请求延迟占比等。

在SpringBoot集成的Actuator中,MeterRegistry提供的方法如下

2. 增加定制Metrics 场景: 在自己编写了一个查询所有用户的接口后,想统计这个接口被调用的次数,因此在Actuator增加一个定制的Metrics指标,来监控接口的使用情况。 步骤: * 定义一个计量器(Counter) * 在构造方法中传入MeterRegistry * 使用meterRegistry构造一个计量器(counter) * 使用计量器进行增加数据:counter.increment();

因此可以在Service层编写定制Metrics的逻辑。 实现代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
 * @author tao
 * @date 2021-08-16 22:33
 * 概要:
 */
@Service
public class UserServiceImpl extends ServiceImpl<UserMapper, User> implements UserService {
    @Autowired
    private UserMapper userMapper;
    private Counter counter;

    //在构造方法中传入MeterRegistry
    public UserServiceImpl(MeterRegistry meterRegistry) {
        counter = meterRegistry.counter("UserService.findAll.count");
    }

    @Override
    public List<User> findAll() {
        //增加数据
        counter.increment();
        return userMapper.selectList(null);
    }
}
  1. 测试效果

* 访问路径:http://localhost:8080/actuator/metrics 会发现多了一个指标

这个是定制的metrics * 可以访问:http://localhost:8080/actuator/metrics/UserService.findAll.count 拿到计量监控数据

* 调用几次接口后

4. 自定义Endpoint

  1. 可以通过下面路径查看所有的Endpoint http://localhost:8080/actuator
  1. 自定义Endpoint 场景:开发ReadinessEndpoint来管理程序是否就绪,或者LivenessEndpoint来管理程序是否存活;
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import org.springframework.boot.actuate.endpoint.annotation.Endpoint;
import org.springframework.boot.actuate.endpoint.annotation.ReadOperation;
import org.springframework.boot.actuate.endpoint.annotation.WriteOperation;
import org.springframework.stereotype.Component;
import java.util.Collections;
import java.util.Map;
/**
 * @author tao
 * @date 2021-08-26 0:45
 * 概要:自定义监控端点
 */
@Component
@Endpoint(id = "myService")
public class MyServiceEndpoint {
    @ReadOperation
    public Map getDockerInfo() {
        return Collections.singletonMap("info", "docker started...");
    }

    @WriteOperation
    private void stopDocker() {
        System.out.println("docker stop....");
    }
}

注意:@Spring Boot会去扫描@EndPoint注解下的@ReadOperation, @WriteOperation, @DeleteOperation注解,分别对应生成Get/Post/Delete的Mapping。注解中有个produces参数,可以指定media type, 如:application/json等。 3. 测试效果 配置好自定义EndPoint后,查看:http://localhost:8080/actuator 会发现已经出现有自己配置的EndPoint端点

SpringBoot Actuator指标监控可视化

SpringBoot提供了一个开源的SpringBoot Actuator指标监控可视化项目,可以点击下面链接进行下载学习,也可以拿到我文章末尾的代码源码。 https://github.com/codecentric/spring-boot-admin

搭建指标监控可视化项目

  1. 建立新SpringBoot工程
  2. 导入下面两个坐标依赖就可以
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>de.codecentric</groupId>
            <artifactId>spring-boot-admin-starter-server</artifactId>
            <version>2.3.1</version>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
    </dependencies>
  1. 更改配置文件
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
## 应用名称
spring.application.name=springboot-adminserver
## 应用服务 WEB 访问端口
server.port=8888
  1. 在启动类东添加注解@EnableAdminServer运行启动AdminServer
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@SpringBootApplication
@EnableAdminServer
public class SpringbootAdminserverApplication {
    public static void main(String[] args) {
        SpringApplication.run(SpringbootAdminserverApplication.class, args);
    }
}
  1. 直接启动项目
  2. 访问 http://localhost:8888/就可以进入指标监控可视化页面
  1. 需要在客户端那边配置上可视化项目的路径,才能获取到要监控项目的指标数据
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
spring:
  boot:
    admin:
      client:
        url: http://localhost:8888
        instance:
          prefer-ip: true #使用IP将可视化项目注册进来
  1. 注册好之后就可以看到有应用数据进入可视化面板

可视化监控指标展示

  • 点击应用就可以进入监控数据面板
  • 可以看到将监控的数据都进行了可视化(包括自定义数据)
  • 也可以看到其他的一些信息

源码下载

链接:https://pan.baidu.com/s/1ZWzb3dNo-YnInyBdjTXRqw 提取码:50ap

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
大数据:Hadoop-MapReduce练习
第9、10、11、12字符为年份,第20、21、22、23字符代表温度,求每年的最高温度
许喜朝
2020/10/26
4160
MapReduce操作实例
要点:有一个combiner方法,可以在执行完map时调用,从而对数据进行先一步的处理,降低Reduce的IO压力。
曼路
2018/10/18
1.6K0
Hadoop: MapReduce2的几个基本示例
1) WordCount  这个就不多说了,满大街都是,网上有几篇对WordCount的详细分析 http://www.sxt.cn/u/235/blog/5809 http://www.cnblogs.com/zhanghuijunjava/archive/2013/04/27/3036549.html 这二篇都写得不错, 特别几张图画得很清晰 2) 去重处理(Distinct) 类似于db中的select distinct(x) from table , 去重处理甚至比WordCount还要简单,假如我
菩提树下的杨过
2018/01/19
1.1K0
Hadoop基础教程-第7章 MapReduce进阶(7.6 MapReduce 二次排序)
MapReduce框架对处理结果的输出会根据key值进行默认的排序,这个默认排序可以满足一部分需求,但是也是十分有限的。在我们实际的需求当中,往往有要对reduce输出结果进行二次排序的需求。所谓二次排序,先按第1个字段进行排序,然后对第1个字段相同的数据,再按第2个字段进行排序。
程裕强
2022/05/06
2290
几个关于MapReduce的小例子
上一篇文章通过写一个WordCount学习了MapReduce的入门操作,那么这篇文章继续通过多一些例子来学习MapReduce。下面介绍几种比较常见的操作:排序,去重,求和,求平均数,TopK查询(查询排名前K名的记录)
java技术爱好者
2022/03/15
4770
几个关于MapReduce的小例子
hadoop_入门1
该文介绍了如何使用 Hadoop 进行单词计数和排序。首先介绍了 Hadoop 的整体架构,然后详细讲解了如何使用 Hadoop 进行单词计数和排序。最后,通过一个实例展示了如何使用 Hadoop 进行排序操作。
用户1147754
2018/01/03
6340
hadoop_入门1
Hadoop(十五)MapReduce程序实例
一、统计好友对数(去重) 1.1、数据准备 joe, jon joe , kia joe, bob joe ,ali kia, joe kia ,jim kia, dee dee ,kia dee, ali ali ,dee ali, jim ali ,bob ali, joe ali ,jon jon, joe jon ,ali bob, joe bob ,ali b
用户1195962
2018/01/18
1.3K0
Hadoop(十五)MapReduce程序实例
MapReduce
(4) ReduceTask进程对每-组相同k的<K,V>组调用一次reduce()方法
CBeann
2023/12/25
4380
MapReduce
MapReduce词频统计【自定义复杂类型、自定义Partitioner、NullWritable使用介绍】
InputFormat读数据,通过Split将数据切片成InputSplit,通过RecordReader读取记录,再交给map处理,处理后输出一个临时的<k,v>键值对,再将结果交给shuffle处理,最终在reduce中将最后处理后的<k,v>键值对结果通过OutputFormat重新写回到HDFS中。
Java架构师必看
2021/05/14
9150
MapReduce词频统计【自定义复杂类型、自定义Partitioner、NullWritable使用介绍】
使用Eclipse编译运行MapReduce程序
mapreduce也是比较久学的,详细的内容和操作可以看下面的文档。 点击下载 链接:https://pan.baidu.com/s/1BIBpClKy2xcqAJtxUJoYVA 提取码:ctca
不愿意做鱼的小鲸鱼
2022/09/24
8640
使用Eclipse编译运行MapReduce程序
hadoop系列之MR的经典代码案例一
七、MapReduce经典案例 1、网站分析案例 1)分析 省份访问 procinceId --> Key 1 -->Value <procinceId,lis
Spark学习技巧
2018/01/31
2.2K0
hadoop系列之MR的经典代码案例一
《快学BigData》--Hadoop总结(G)(40)
Hadoop总结 - - - - - - - - - - - - - - - - - - - - - - - - - - - - 210
小徐
2019/08/05
4250
《快学BigData》--Hadoop总结(G)(40)
Hadoop学习:深入解析MapReduce的大数据魔力(二)
1、问题引出 要求将统计结果按照条件输出到不同文件中(分区)。比如:将统计结果按照手机 归属地不同省份输出到不同文件中(分区) 2、默认Partitioner分区
老虎也淘气
2024/01/30
1540
Hadoop学习:深入解析MapReduce的大数据魔力(二)
Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四)
压缩方式选择时重点考虑:压缩/解压缩速度、压缩率(压缩后存储大小)、压缩后是否 可以支持切片。
老虎也淘气
2024/01/30
2400
Hadoop学习:深入解析MapReduce的大数据魔力之数据压缩(四)
Hadoop Partitioner使用教程
partitioner在处理输入数据集时就像条件表达式(condition)一样工作。分区阶段发生在Map阶段之后,Reduce阶段之前。partitioner的个数等于reducer的个数(The number of partitioners is equal to the number of reducers)。这就意味着一个partitioner将根据reducer的个数来划分数据(That means a partitioner will divide the data according to the number of reducers)。因此,从一个单独partitioner传递过来的数据将会交由一个单独的reducer处理(the data passed from a single partitioner is processed by a single Reducer)。
smartsi
2019/08/07
7700
Java编写Hadoop第一个MapReduce任务
因为在做网站案例的时候,想学习如何处理海量数据,所以想接触大数据相关的知识,之前对于大数据的了解,仅仅是停留在知道Hadoop,Hive,HBase,Spark的层面上,所以如何学习确实对我造成了困扰,所幸我所在公司部门存在大数据开发,于是不断的请教大佬,大佬说第一步是学一点Linux和Java,然后Hadoop,再然后......。再然后就先不说了,对于Linux和Java我这里可以直接跨过了,然后就是学Hadoop。这周利用散碎的时间,学会了Hadoop的安装使用,使用Java写一个Hadoop任务。安装这里我就不说了,大家可以去网上搜索,或者来我的网站文章模块看我如何安装(Mac): 网址:www.study-java.cn来看一下(需要打开微信小程序:每天学Java进行扫码登录)
每天学Java
2020/06/01
1.5K0
大数据技术之_05_Hadoop学习_04_MapReduce_Hadoop企业优化(重中之重)+HDFS小文件优化方法+MapReduce扩展案例+倒排索引案例(多job串联)+TopN案例+找博客
  MapReduce优化方法主要从六个方面考虑:数据输入、Map阶段、Reduce阶段、IO传输、数据倾斜问题和常用的调优参数。
黑泽君
2019/03/08
6150
hadoop案例实现之WordCount (计算单词出现的频数)
一、编写java代码,实现map函数以及reduce函数 package com.paic.elis.test; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apa
MickyInvQ
2020/09/27
7800
hadoop案例实现之WordCount (计算单词出现的频数)
2021年大数据Hadoop(十九):​​​​​​​MapReduce分区
在 MapReduce 中, 通过我们指定分区, 会将同一个分区的数据发送到同一个Reduce当中进行处理。例如: 为了数据的统计, 可以把一批类似的数据发送到同一个 Reduce 当中, 在同一个 Reduce 当中统计相同类型的数据, 就可以实现类似的数据分区和统计等
Lansonli
2021/10/11
5970
MapReduce工作原理
这篇文章是我之前在自学 MapReduce 的笔记,想着最近再回顾一下 MapReduce 的原理,于是就整理了一下。
create17
2019/07/19
4.2K0
推荐阅读
相关推荐
大数据:Hadoop-MapReduce练习
更多 >
LV.0
这个人很懒,什么都没有留下~
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验