SpringBoot(审计) 统计接口调用次数及成功率

2023-11-09

介绍:

  很多时候会需要提供一些统计记录的,比如某个服务一个月的被调用量、接口的调用次数、成功调用次数等等。

优点:

  使用AOP+Hendler对业务逻辑代码无侵入,完全解耦。通过spring boot自带的健康检查接口(/health)方便、安全。

注意:

  数据没有被持久化,只保存在内存中,重启后数据将被重置。可按需自己实现 

代码:

  AOP:在AOP中调用Handler

@Component
@Aspect
public class ControllerAdvice {
    private static ILogger log = LoggerFactory.getLogger(ControllerAdvice.class);

    @Around("execution(public * *..*controller.*.*(..))")
    public Object handle(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
        Object result;
        try {
            Function<ProceedingJoinPoint, AbstractControllerHandler> build = AbstractControllerHandler.getBuild();
            if (null == build) {
                AbstractControllerHandler.registerBuildFunction(DefaultControllerHandler::new);
            }
            build = AbstractControllerHandler.getBuild();
            AbstractControllerHandler controllerHandler = build.apply(proceedingJoinPoint);
            if (null == controllerHandler) {
                log.warn(String.format("The method(%s) do not be handle by controller handler.", proceedingJoinPoint.getSignature().getName()));
                result = proceedingJoinPoint.proceed();
            } else {
                result = controllerHandler.handle();
            }
        } catch (Throwable throwable) {
            RuntimeHealthIndicator.failedRequestCount++;
            log.error(new Exception(throwable), "Unknown exception- -!");

            throw throwable;
        }

        return result;
    }
}

 Handler:执行记录的逻辑

    抽象类:AbstractControllerHandler 

public abstract class AbstractControllerHandler {
    private static ILogger log = LoggerFactory.getLogger(AbstractControllerHandler.class);

    private static Function<ProceedingJoinPoint, AbstractControllerHandler> build;

    public static Function<ProceedingJoinPoint, AbstractControllerHandler> getBuild() {
        return build;
    }

    public static void registerBuildFunction(Function<ProceedingJoinPoint, AbstractControllerHandler> build) {
        Assert.isNotNull(build, "build");

        AbstractControllerHandler.build = build;
    }

    protected ProceedingJoinPoint proceedingJoinPoint;
    protected HttpServletRequest httpServletRequest;
    protected String methodName;
    protected String uri;
    protected String requestBody;
    protected String ip;
    protected Method method;
    protected boolean inDataMasking;
    protected boolean outDataMasking;


    public AbstractControllerHandler(ProceedingJoinPoint proceedingJoinPoint) {
        Assert.isNotNull(proceedingJoinPoint, "proceedingJoinPoint");

        this.proceedingJoinPoint = proceedingJoinPoint;
        Signature signature = this.proceedingJoinPoint.getSignature();
        this.httpServletRequest = this.getHttpServletRequest(this.proceedingJoinPoint.getArgs());
        this.methodName = signature.getName();
        this.uri = null == this.httpServletRequest ? null : this
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

SpringBoot(审计) 统计接口调用次数及成功率 的相关文章

  • 如何在 JFace 的 TableViewer 中创建复选框?

    我创建了一个包含两列的 tableViewer 我想将其中一列设为复选框 为此 我创建了一个 CheckBoxCellEditor 但我不知道为什么它不起作用 名为 tableName 的列显示其值正常 色谱柱规格如下 String COL
  • 如何在一行中将字符串数组转换为双精度数组

    我有一个字符串数组 String guaranteedOutput Arrays copyOf values values length String class 所有字符串值都是数字 数据应转换为Double QuestionJava 中
  • 如何测试 JUnit 测试的 Comparator?

    我需要测试 Compare 方法 但我对如何测试感到困惑 我可以看看该怎么做吗 public class MemberComparator implements Comparator
  • 解决错误:日志已在具有多个实例的atomikos中使用

    我仅在使用atomikos的实时服务器上遇到问题 在我的本地服务器上它工作得很好 我在服务器上面临的问题是 init 中出错 日志已在使用中 完整的异常堆栈跟踪 java lang RuntimeException Log already
  • manifest.mf 文件的附加内容的约定?

    Java JAR 中的 MANIFEST MF 文件是否有任何超出 MANIFEST MF 约定的约定 JAR规范 http download oracle com javase 1 4 2 docs guide jar jar html
  • HDFS:使用 Java / Scala API 移动多个文件

    我需要使用 Java Scala 程序移动 HDFS 中对应于给定正则表达式的多个文件 例如 我必须移动所有名称为 xml从文件夹a到文件夹b 使用 shell 命令我可以使用以下命令 bin hdfs dfs mv a xml b 我可以
  • Java 页面爬行和解析之 Crawler4j 与 Jsoup

    我想获取页面的内容并提取其中的特定部分 据我所知 此类任务至少有两种解决方案 爬虫4j https github com yasserg crawler4j and Jsoup http jsoup org 它们都能够检索页面的内容并提取其
  • OnClick 事件中的 finish() 如何工作?

    我有一个Activity一键退出Activity 通过layout xml我必须设置OnClick事件至cmd exit调用 this finish 效果很好 public void cmd exit View editLayout thi
  • 反思 Groovy 脚本中声明的函数

    有没有一种方法可以获取 Groovy 脚本中声明的函数的反射数据 该脚本已通过GroovyShell目的 具体来说 我想枚举脚本中的函数并访问附加到它们的注释 Put this到 Groovy 脚本的最后一行 它将作为脚本的返回值 a la
  • 将 Long 转换为 DateTime 从 C# 日期到 Java 日期

    我一直尝试用Java读取二进制文件 而二进制文件是用C 编写的 其中一些数据包含日期时间数据 当 DateTime 数据写入文件 以二进制形式 时 它使用DateTime ToBinary on C 为了读取 DateTime 数据 它将首
  • 使用 AWS Java SDK 为现有 S3 对象设置 Expires 标头

    我正在更新 Amazon S3 存储桶中的现有对象以设置一些元数据 我想设置 HTTPExpires每个对象的标头以更好地处理 HTTP 1 0 客户端 我们正在使用AWS Java SDK http aws amazon com sdkf
  • Java直接内存:在自定义类中使用sun.misc.Cleaner

    在 Java 中 NIO 直接缓冲区分配的内存通过以下方式释放 sun misc Cleaner实例 一些比对象终结更有效的特殊幻像引用 这种清洁器机制是否仅针对直接缓冲区子类硬编码在 JVM 中 或者是否也可以在自定义组件中使用清洁器 例
  • 应用程序关闭时的倒计时问题

    我制作了一个 CountDownTimer 代码 我希望 CountDownTimer 在完成时重新启动 即使应用程序已关闭 但它仅在应用程序正在运行或重新启动应用程序时重新启动 因此 如果我在倒计时为 00 10 分钟 秒 时关闭应用程序
  • Tomcat 6找不到mysql驱动

    这里有一个类似的问题 但关于类路径 ClassNotFoundException com mysql jdbc Driver https stackoverflow com questions 1585811 classnotfoundex
  • Windows 上的 Nifi 命令

    在我当前的项目中 我一直在Windows操作系统上使用apache nifi 我已经提取了nifi 0 7 0 bin zip文件输入C 现在 当我跑步时 bin run nifi bat as 管理员我在命令行上看到以下消息 但无法运行
  • Springs 元素“beans”不能具有字符 [children],因为该类型的内容类型是仅元素

    我在 stackoverflow 中搜索了一些页面来解决这个问题 确实遵循了一些正确的答案 但不起作用 我是春天的新人 对不起 这是我的调度程序 servlet
  • 将 JTextArea 内容写入文件

    我在 Java Swing 中有一个 JTextArea 和一个 提交 按钮 需要将textarea的内容写入一个带有换行符的文件中 我得到的输出是这样的 它被写为文件中的一个字符串 try BufferedWriter fileOut n
  • android Accessibility-service 突然停止触发事件

    我有一个 AccessibilityService 工作正常 但由于开发过程中的某些原因它停止工作 我似乎找不到这个原因 请看一下我的代码并告诉我为什么它不起作用 public class MyServicee extends Access
  • KeyPressed 和 KeyTyped 混淆[重复]

    这个问题在这里已经有答案了 我搜索过之间的区别KeyPressedand KeyTyped事件 但我仍然不清楚 我发现的一件事是 Keypressed 比 KeyTyped 首先被触发 请澄清一下这些事件何时被准确触发 哪个适合用于哪个目的
  • java8 Collectors.toMap() 限制?

    我正在尝试使用java8Collectors toMap on a Stream of ZipEntry 这可能不是最好的想法 因为在处理过程中可能会发生异常 但我想这应该是可能的 我现在收到一个我不明白的编译错误 我猜是类型推理引擎 这是

随机推荐

  • M - Mountaineers (MST+树上倍增)

    将原图中点每个点四连通方向的点建边 权值为两点权值中较大者的值 对这个图建立最小生成树 那么最小生成树上任意两点之间路径上的最大点权即为答案 因为是树 所以任意两点间的简单路径唯一 通过树上倍增维护维护树上区间最值求出最大值即可 pragm
  • pid算法控制

    一 先来彻底搞懂PID到底是啥 啥是PID PID 就是 比例 proportional 积分 integral 微分 derivative 是一种很常见的控制算法 在工程实际中 应用最为广泛的调节器控制规律为比例 积分 微分控制 简称PI
  • 数据结构_串的匹配(BF和KMP算法)

    数据结构 串的匹配 BF和KMP算法 BF brute force 算法 算法定义 代码实现 算法分析 KMP算法 算法详解 代码实现 算法分析 子串的定位运算通常被称为串的模式匹配或串匹配 BF brute force 算法 算法定义 一
  • cmd pc如何开多个微信_多个合伙人开公司,股权应该如何分配

    伴随着互联网发展的越来越快 不少的创业型的公司在这快节奏的时代以惊人的速度展现在世人面前 但是这个同时创业的道路也是艰辛的 不过有着志同道合的小伙伴或许能够在成功的道路上又多了几分把握 有句俗话说的好你能走多远 将取决于是谁与你同行 虽然说
  • 【已成功解决】使用vpn/代理后无法正常上网/无法正常访问网站

    文章目录 一 问题描述 二 解决步骤 三 原因分析 一 问题描述 很多同学在学习访问学校提供的资源时或者一些小伙伴在公司办公时需要使用VPN 但是当我们关闭VPN后 却发现没有办法正常连接到互联网了 可以尝试以下方法解决 至于导致这种情况发
  • ANSI是个啥???

    来自 https blog csdn net imxiangzi article details 77370160 http www cnblogs com malecrab p 5300486 html 用Notepad 创建一个文本文件
  • 解决Android 8.1 获取不到wifi名称

    在安卓8 1版本中 用 WifiInfo getSSID 可能出现 unknown ssid 或者什么也没读出来 解决方案 用ConnectivityManager 这个类解决 代码如下 获取SSID param return WIFI 的
  • 前端传JSON嵌套类,且属性名首字母大写时后端接收的一些坑

    因为开发腾讯云业务 要写一个回调函数 规范文档上说会传一个json传给我 EventType ComposeMediaComplete ComposeMediaCompleteEvent TaskId 1256768367 ComposeM
  • stm32局部变量过大,导致栈溢出

    在做一个以stm32为主控的项目时发现自己程序中一个机构体里面的数据总是一运行就被改变 刚开始以为是自己不小心在哪个地方用了extern扩展了变量的作用域 重新赋了值 自己忘记了 后来查找了好久都没有其他地方使用这个结构体变量 于是开始单步
  • 配置文件及其解析

    配置文件 properties xml 配置文件可以解决我们在编程中遇到的硬编码问题 那么什么是硬编码呢 硬编码 将一些经常调用修改的数据代码直接写死在了java源代码程序中 就会产生硬编码问题 一般情况下 通过配置文件来解决硬编码问题 在
  • 在vue3中使用codemirror

    文章目录 前言 引入 在vue3中使用 基本配置 更改编辑框的外部样式 高度 宽度 获取和修改内容 添加删除事件 实现markdown过程中遇到的bug 前言 最近为了完成学校的大作业 需要制作markdown编辑器 为了用户输入方便 使用
  • MyBatis 配置 typeAliases 详解

    0x00 前言参考 之前的 MyBatis 中 SqlMapConfig 配置文件详解 记了一下 MyBatis 中的核心配置文件各个标签的作用和使用场景 这篇文章细说一下配置文件中 typeAliases 标签的详细使用 0x01 标签介
  • FOXBORO FBM233 电源模块

    FOXBORO FBM233 是一种电源模块 通常用于工业自动化和控制系统中 为其他设备和模块提供所需的电源供应 以下是可能与这种电源模块相关的一些常见功能 电压输出 FBM233 电源模块通常提供稳定的电压输出 以供其他设备和模块使用 这
  • 把握机器人教育朝AI智能化发展的趋势

    一般机器人是指不具有智能 只具有一般编程能力和操作功能的机器人 到目前为止 在世界范围内还没有一个统一的智能机器人定义 大多数专家认为智能机器人至少要具备以下三个要素 一是感觉要素 用来认识周围环境状态 二是运 动要素 对外界做出反应性动作
  • 百度网盘PC端扫描二维码登录时无法加载二维码问题解决方法

    问题 今天在PC端扫描登录百度网盘时 二维码无法加载出来 具体情况如图 解决方法 1 打开IE浏览器 2 打开工具 3 打开Internet选项 4 打开高级选项 重置IE设置 5 点击确定 打开百度网盘 重新扫描登录 写在后面 好了 现在
  • 基于机器学习之模型树短期负荷预测(Matlab代码实现)

    欢迎来到本博客 目前更新 电力系统相关知识 期刊论文 算法 机器学习和人工智能学习 支持 如果觉得博主的文章还不错或者您用得到的话 可以关注一下博主 如果三连收藏支持就更好啦 这就是给予我最大的支持 本文目录如下 目录 1 概述 2 数学模
  • 家庭记账本小程序之删(java web基础版四)

    实现删除消费账单 1 main left jsp中该部分 调用Servlet中delete方法 2 Servlet中delete方法 调用Dao层list方法 跳转到del jsp页面 3 Dao层list方法 4 del jsp 调用Se
  • Unity动画状态机Animator使用解析

    Unity可以用两种方式控制动画 1 Animations 这种方式简单 直接 Play Idle 或者 CorssFade Idle 就可以播放动画 2 Animator 5 x之后推荐使用这种方式 因为里面可以加上混合动画 让动画切换更
  • mysql 添加用户、修改权限,修改登陆权限ip

    MySQL 赋予用户权限命令的简单格式可归纳为 数据库 grant 权限 on 数据库对象 to 用户 1 grant 普通数据用户 查询 插入 更新 删除 数据库中全部表数据的权利 apache grant select on testd
  • SpringBoot(审计) 统计接口调用次数及成功率

    介绍 很多时候会需要提供一些统计记录的 比如某个服务一个月的被调用量 接口的调用次数 成功调用次数等等 优点 使用AOP Hendler对业务逻辑代码无侵入 完全解耦 通过spring boot自带的健康检查接口 health 方便 安全