spring boot Actuator之自定义Endpoint_springboot actuator 自定义endpoint_龚厂长的博客-程序员宅基地

技术标签: spring boot  actuator  endpoint  监控  

本文基于spring boot 2.2.0 release版本。

在上一篇文章《spring boot Actuator原理详解之启动》详细介绍了在web环境下,Actuator是如何启动的,这里对流程做一个简单的总结:

  1. 扫描所有@Endpoint注解的类,这些类都是Endpoint;
  2. 使用过滤器对Endpoint对象进行过滤,没有被过滤掉的才可以进入下一步;
  3. 读取Endpoint对象的每个方法,判断是否有@ReadOperation、@WriteOperation、@DeleteOperation三个注解,如果有,则针对每个被注解的方法创建操作对象Operation;
  4. 根据操作对象、Endpoint对象、Endpoint名创建为RequestMappingInfo,并将其注册到spring mvc中;
  5. 注册成功之后,Endpoint对象便可以对外提供服务。

明白了上面整个启动流程之后,我们也可以编写一个自定义的Endpoint。
自定义Endpoint的关键点:

  1. 类上必须有注解@Endpoint,注解必须设置id值,否则启动抛出如下异常:Caused by: java.lang.IllegalStateException: No @Endpoint id attribute specified for XXXClass
  2. 必须指定方法注解为下面三个中一个:@ReadOperation、@WriteOperation、@DeleteOperation
  3. 注解@Selector可以指定路径参数,比如/actuator/caches/{cache}花括号里面的内容是路径参数,我们可以在方法入参上添加@Selector来指定路径参数,比如public String counters(@Selector int value)
  4. 默认Endpoint对象的方法都是以json格式返回客户端,可以通过设置@ReadOperation、@WriteOperation、@DeleteOperation的produces属性指定其他格式。

下面给出一个自定义Endpoint的例子:

/**
 * 统计方法该Endpoint对象的次数
 */
@Component
@Endpoint(id="counter")
public class Counter  {
    
    private AtomicInteger cnt=new AtomicInteger(0);
    @ReadOperation
    public int counter() {
    
        return cnt.getAndAdd(1);
    }
    @ReadOperation
    public int counters(@Selector int value) {
    
        return cnt.getAndAdd(value);
    }
}

上面这个类只是一个示例,并没有实际意义。运行起来后,访问http://localhost:8079/actuator/counter,每次访问都会返回一个比之前大1的数字。

我们还可以使用注解@EndpointWebExtension扩展已有的Endpoint。
下面是spring提供的对EnvironmentEndpoint的扩展:

@EndpointWebExtension(endpoint = EnvironmentEndpoint.class)
public class EnvironmentEndpointWebExtension {
    
	private final EnvironmentEndpoint delegate;
	public EnvironmentEndpointWebExtension(EnvironmentEndpoint delegate) {
    
		this.delegate = delegate;
	}

	@ReadOperation
	public WebEndpointResponse<EnvironmentEntryDescriptor> environmentEntry(@Selector String toMatch) {
    
		EnvironmentEntryDescriptor descriptor = this.delegate.environmentEntry(toMatch);
		return new WebEndpointResponse<>(descriptor, getStatus(descriptor));
	}

	private int getStatus(EnvironmentEntryDescriptor descriptor) {
    
		if (descriptor.getProperty() == null) {
    
			return WebEndpointResponse.STATUS_NOT_FOUND;
		}
		return WebEndpointResponse.STATUS_OK;
	}
}

就web环境下来说,如果扩展类的方法有与原类相同的http请求路径,那么扩展类会替换掉原来的方法,也就是说,访问该路径时,不会访问到原类的方法,而是访问到扩展类。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_38308374/article/details/114422004

智能推荐

main之前-程序员宅基地

文章浏览阅读733次。前面写过一篇北极之北之main函数之前,这篇文章其实解决的问题是main函数并不是第一个执行的函数,在main之前,函数的入口点是_start, _start会调用glibc里的__libc_start_main,main函数只是这个函数的入参。 在__libc_start_main中某一步,会执行main函数。这是上面一篇博文获取到的知识。 前两天,CU的gongping11写了一

[springboot]使用log4j2异步日志提升性能_log4j2性能优化_普通网友的博客-程序员宅基地

文章浏览阅读903次。同步日志的业务流程处理和日志打印是在同一个线程,日志打印的过程实际上是写文件IO的过程,这个过程是相对耗时的,并且会阻塞主线程的执行,只有日志打印完成后才会继续执行业务处理代码。如果日志量比较大,会影响主业务流程的处理效率。异步日志实现方式:将日志存入一个单独的队列中,有一个单独的线程从队列中获取日志并写入磁盘文件。Log4j2基于LMAX公司开发Disruptor(一个开源的无锁并发框架),改善了Log4j和Logback在架构设计方面的缺陷,具有超高的吞吐量和低延迟。所以我们想获取log4j2异步日志带_log4j2性能优化

java查漏补缺_java lambda 补缺少-程序员宅基地

文章浏览阅读230次。挖掘java之路_java lambda 补缺少

语音指令_语音响应指令-程序员宅基地

文章浏览阅读6.4k次。前言:该技术会用到特定于移动设备的API,Microsoft Phone 已经被微软砍掉,读者悉知。语音指令就是通过语音来完成一些常规操作,如启动某个应用,打开或关闭飞行模式等,随着智能助理Cortana的推出,语音操作的重要地位也逐渐显现。若能在应用程序中提供适当的语音操作支持,不仅能够提升应用的用户体验,也给用户的使用带来不少便捷。语音指令是通过一种名为VoiceCommandDefinition(VCD)文件来定义,当应用程序运行后通过相关API进行安装注册。VCD文件安装成功后,开发者为应._语音响应指令

win10分屏设置一边竖屏_Win10多窗口“二分屏/三分屏/四分屏”显示技巧_win10三屏配置-程序员宅基地

文章浏览阅读7.1k次,点赞2次,收藏2次。有时候,我们在同时运行多个任务时,需要把这几个窗口同时显示在屏幕上,这样操作分比较方便,而且可以避免频繁切换窗口的麻烦。例如:我们想要把一个文件夹中的个别文件移动到另一个文件夹中,这时同时打开这两个文件夹窗口并二分屏显示就比较方便;或者同时,我们想要打开QQ窗口与对方交谈,这时可以三分屏同时显示三个窗口;又或者我们同时还想忙里偷闲看看视频,这时可以再打开优酷视频窗口,这时就需要让四个窗口四分屏同时显示。那么如何才能快捷地让多个窗口实现“二分屏/三分屏/四分屏”显示呢?窗口的二分之一屏显示技巧(二分屏)_win10三屏配置

SQL优化-explain的用法(实例解析)_sql explain 用法-程序员宅基地

文章浏览阅读4.8k次,点赞10次,收藏44次。前面写了两篇博客,关于单表和多表的优化,这两篇博客的基础其实就是explain,explain是必须掌握的知识点,我曾尝试过死记硬背,但效果甚微,还是实践来的实在。本文就一些实例来解析explain的用法。..._sql explain 用法

随便推点

org.hibernate.hql.internal.ast.QuerySyntaxException-程序员宅基地

文章浏览阅读572次。org.hibernate.hql.internal.ast.QuerySyntaxException: customer is not mapped [from customer where name like ?] at org.hibernate.hql.internal.ast.util.SessionFactoryHelper.requireClassPersister(Sessi

word交叉引用——在正文中给参考文献做链接_word 引用链接到引用-程序员宅基地

文章浏览阅读1.1w次,点赞4次,收藏20次。word交叉引用只需两步即可,3分钟即会第一步: 插入编号文档中有如下参考文献,但还没有[1],[2],[3]等编号。那么先给参考文献编号序号,使用word—>开始—>编号接下来给参考文献标好序号,光标选到某参考文献前,点编号即可自动编号,如下图所示标完序号如图所示第二步:正文引用编号将光标定位在正文中需要插入参考文献上标的地方,点击“..._word 引用链接到引用

Web开发基础(一)-程序员宅基地

文章浏览阅读309次。由于最近开发公司的后台管理系统和服务器的需求,所以临时学点WEB开发基础,因为是内部人员使用的,要求不是很高。所以也没有学得很精通,就随便学习一下基础就开始上手做。一、HTML1、图片标签&lt;img src="链接" width="150px" height="30px" alt="logo图片"/&gt;2、超链接标签&lt;a href="链接地址&q

python 的继承 直接调用父类方法及super-程序员宅基地

文章浏览阅读112次。class Person(object): def __init__(self,name): self.name = name def getname(self): print self.nameclass Student(Person): def __init__(self,name,age): #P...

QGC地面站PC桥接px4(QGC+wifi+机载计算机+px4)_qgc连接 串口 无线_硬梆梆的马里奥的博客-程序员宅基地

文章浏览阅读3k次,点赞6次,收藏40次。QGC地面站PC桥接px4(QGC+wifi+机载计算机+px4)1 在机载计算机上安装ubuntu2 安装ros3 机载计算机上安装mavros1安装mavros2 安装安装mavros相关的 geographiclib dataset4 安装ssh服务5 连接px4和机载计算机6 地面站PC用ssh控制机载计算机7 QGC上建立通讯连接用px4做的无人机,由于手头没有数传,需要进行无人机姿态环和位置环调参,通过QGC地面站PC桥接px4实现读取飞控状态参数的功能。1 在机载计算机上安装ubuntu_qgc连接 串口 无线

python numpy库求数列的和-程序员宅基地

文章浏览阅读760次。π=41−43+45−47+49−...\pi=\frac{4}{1}-\frac{4}{3}+\frac{4}{5}-\frac{4}{7}+\frac{4}{9}-...π=14​−34​+54​−74​+94​−...这个数列的分子不变,分母变化其通项公式为n=4(2n−1)×(−1)n−1n=\frac{4}{(2n-1)\times (-1)^{n-1}}n=(2n−1)×(−1)n−14​首先自己写一段傻乎乎的计算代码这样,计算n=50000n=50000n=50000时这个式子的值常规

推荐文章

热门文章

相关标签