目录

1.spring-boot如何得知接口被调用了,以及调用是否成功??

2.搭建监控面板gafana

3. 在grafana添加mysql数据源


背景:

使用spring-boot框架开发了一个造数工程,通过将业务流程涉及的接口整合成一个接口,对外开放,使用者只需要调用该接口,就能快速得到想要的测试数据;由于推广需要,不知道这些接口开发后的使用情况,于是添加了一个简易的监控,并将监控数据上报至数据库,再结合grafana展示监控数据

1.spring-boot如何得知接口被调用了,以及调用是否成功??

spring-boot + AOP+MySQL实现访问量统计功能,spring-boot项目已经存在,需要引入AOP,首先添加AOP的pom依赖(以下我主要用groovy写的,直接用在java脚本里,需要根据编码工具提示微调),里面的SqlBuilderUtil和TimeUtil是我的sql执行类和时间处理类,你可以根据需求自己定制

<!-- AOP -->
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjrt</artifactId><version>1.9.4</version>
</dependency>
<dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>1.9.4</version>
</dependency>
<dependency><groupId>cglib</groupId><artifactId>cglib</artifactId><version>3.2.12</version>
</dependency>

再添加2个类文件ApiVisitHistory和AtomicCounter

ApiVisitHistory
import org.aspectj.lang.JoinPoint
import org.aspectj.lang.annotation.AfterReturning
import org.aspectj.lang.annotation.AfterThrowing
import org.aspectj.lang.annotation.Aspect
import org.aspectj.lang.annotation.Before
import org.aspectj.lang.annotation.Pointcut
import org.slf4j.Logger
import org.slf4j.LoggerFactory
import org.springframework.stereotype.Component
import org.springframework.web.context.request.ServletRequestAttributesimport javax.servlet.http.HttpServletRequest
import org.springframework.web.context.request.RequestContextHolder;/*** API访问历史统计*/
@Component
@Aspect
public class ApiVisitHistory {private Logger log = LoggerFactory.getLogger(ApiVisitHistory.class)private ThreadLocal<Long> startTime = new ThreadLocal<>();SqlBuilderUtil sqlBuilderUtilApiVisitHistory(){sqlBuilderUtil = new SqlBuilderUtil("demo")}/*** 定义切面* - 此处代表com.smile.demo.controller包下的所有接口都会被统计*/@Pointcut("execution(* com.demo.controller..*.*(..))")public void pointCut(){}/*** 在接口原有的方法执行前,将会首先执行此处的代码*/@Before("pointCut()")public void doBefore(JoinPoint joinPoint) {startTime.set(System.currentTimeMillis());//获取传入目标方法的参数Object[] args = joinPoint.getArgs();log.info("类名:{}", joinPoint.getSignature().getDeclaringType().getSimpleName());log.info("方法名:{}", joinPoint.getSignature().getName() );// 计数AtomicCounter.getInstance().increase();}/*** 只有正常返回才会执行此方法* 如果程序执行失败,则不执行此方法*/@AfterReturning(returning = "returnVal", pointcut = "pointCut()")public void doAfterReturning(JoinPoint joinPoint, Object returnVal) {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String today = TimeUtil.dateMonthDelay(0)String path = request.getRequestURI()Long cast = System.currentTimeMillis() - startTime.get()String sql = "INSERT INTO `akulaku8_test`.`req_api_info`(`date`,`path`,`success`,`cast`) VALUES('${today}', '${path}','true',${cast}) ON DUPLICATE KEY\n" +"UPDATE times=(times+1)"sqlBuilderUtil.execute(sql)log.info("URI:[{}], 耗费时间:[{}] ms, 访问次数:{}", path, cast, AtomicCounter.getInstance().getValue());}/*** 当接口报错时执行此方法*/@AfterThrowing(pointcut = "pointCut()")public void doAfterThrowing(JoinPoint joinPoint) {HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();String today = TimeUtil.dateMonthDelay(0)String path = request.getRequestURI()Long cast = System.currentTimeMillis() - startTime.get()String sql = "INSERT INTO `akulaku8_test`.`req_api_info`(`date`,`path`,`success`,`cast`) VALUES('${today}', '${path}','false',${cast}) ON DUPLICATE KEY\n" +"UPDATE times=(times+1)"sqlBuilderUtil.execute(sql)log.info("接口访问失败,URI:[{}], 耗费时间:[{}] ms", path, cast);}
}
        注意com.demo.controller.要替换成你自己的controller包名
AtomicCounter
import java.util.concurrent.atomic.AtomicInteger/*** 计数器,统计当前执行的任务数**/
public class AtomicCounter {private static final AtomicCounter atomicCounter = new AtomicCounter();/*** 单例,不允许外界主动实例化*/private AtomicCounter() {}public static AtomicCounter getInstance() {return atomicCounter;}private static AtomicInteger counter = new AtomicInteger();public int getValue() {return counter.get();}public int increase() {return counter.incrementAndGet();}public int decrease() {return counter.decrementAndGet();}}

以上操作接口相关数据就存到了数据库,选择数据库的原因是这个项目是部门内部使用,访问量不是特别大,性能问题不考虑

2.搭建监控面板gafana

官网下载gafana:Download Grafana | Grafana Labs

安装:

yum install grafana-enterprise-8.5.3-1.x86_64.rpm

设置grafana开机启动(确保机器的3000端口号不被占用):

systemctl enable grafana-server
systemctl start grafana-server
systemctl status grafana-server

操作完成后,访问机器所在的3000端口,账号密码都是admin

3. 在grafana添加mysql数据源

登录系统首页,添加数据源

选择mysql

编辑数据库信息

测试数据库连接情况检测

添加监控面板

 效果展示

grafana统计接口访问量相关推荐

  1. js实现精确统计网站访问量的代码分享

    JS 精确统计网站访问量. 代码如下: /** * vlstat 浏览器统计脚本 */ var statIdName = "vlstatId"; var xmlHttp; /** ...

  2. CH13,拍42,练习一。通过文本文件统计页面访问量

    index.php <?php error_reporting(E_ALL ^E_NOTICE); session_start(); //SESSION的目的就是防止访问后刷新,这样访问量不更新 ...

  3. linux统计大日志文件字符次数统计接口调用量

    一.背景 有个服务每天调用量特别大,每天10G+的日志,一般编辑文件无法打开并统计接口日志打印的数量. 二.解决方案 1)切割大日志文件 split -b 100M business.20210526 ...

  4. 这才是目前百度统计接口的正确打开方式20180322

    这才是目前百度统计接口的正确打开方式20180322 关于百度统计接口的说明 1.登陆接口网站找到的有2种方式 第一种调用(不能用) https://api.baidu.com/sem/common/ ...

  5. 【实时数仓】省份交易额统计接口、新老访客对比接口、访客分时统计接口

    文章目录 一 省份交易额统计接口 1 Sugar配置 (1)图表配置 (2)接口地址 (3)数据格式 (4)执行SQL 2 数据接口实现 (1)创建地区交易额统计实体类ProvinceStats (2 ...

  6. Servlet中统计网站访问量

    统计网站访问量 访问量 放入到servletContext里,,setAttribute("count"); 其他servlet获取该变量,然后进行自增 再重新放入到 servle ...

  7. AOP面向切面编程之全局日志打印/统计接口耗时

    目录 一.什么是AOP 二.AOP使用场景 三.使用AOP的好处 四.先举个例子理解AOP面向切面编程 五.Spring5.X的AOP切入点表达式有这些种写法 六.实战基于Spring的AOP快速实现 ...

  8. java 统计qps_统计接口QPS

    现在记录话单的时候想加一个参数:每秒接口调用的并发量,也就是所谓的QPS(Queries per second).QPS即每秒请求数,是对一个特定的接口在规定时间内请求流量的衡量标准.那么如何实现QP ...

  9. java web统计网站访问次数,实现一个统计网站访问量的效能

    实现一个统计网站访问量的功能 大神们              用JS,jquery,ajax怎么实现一个统计网站访问量的功能 谢谢 ------解决方案-------------------- 这里 ...

最新文章

  1. windows 64位 dll文件 位置及python包rtree shapely安装
  2. 【TypeScript】探索 var 和 let 关键字之间的差异
  3. ASCII Unicode GBK UTF的联系
  4. 懂编译真的可以为所欲为|不同前端框架下的代码转换
  5. C\C++语言,从编程语言到库、API、框架、引擎
  6. 利用jquery load 局部刷新数据
  7. Spring-Data-JPA--增删改查2——自定义接口查询
  8. .Net中的加密解密
  9. 转载--Ajax学习---DOM进行Web响应
  10. 20180810 突然发现自己不小心跑到了数据分析呈现岗位
  11. jQuery基础--选择器
  12. python运维脚本简书_Python运维篇:会Python的运维工程师价值多少?
  13. Oracle alter 语句用法
  14. VSTO程序基本知识(二)
  15. office办公哪个版本稳定好用
  16. EasyDarwin开源云平台接入海康威视EasyCamera摄像机之快照获取与上传
  17. Word中如何删除某一页的页眉与页眉中的横线
  18. NeurIPS十年高引学者TOP100榜单发布!这些大牛值得膜拜!
  19. 毕业季的你准备好面试了吗?(下)
  20. 大家身边有没有超级自恋的人

热门文章

  1. 中国围棋借应氏杯而涅槃
  2. 计算机动画类型中只有一维动画和二维动画,二维动画与计算机技术论文(2)
  3. Python基础之数据编码
  4. 更换SD卡 出现f_open 无法打开返回 FR_DISK_ERR 错误
  5. 永州动力电池实验室建设合理布局方案
  6. JavaScript是什么?第一章
  7. JAVA全栈简历技术栈
  8. 模拟考试——成绩查找
  9. VSCode插件开发 浅谈workspace问题
  10. 「面试必背」Spring Cloud面试题(2022最新版)