grafana统计接口访问量
背景:
使用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.ServletRequestAttributes
import 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 sqlBuilderUtil
ApiVisitHistory(){
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
编辑数据库信息
测试数据库连接情况检测
添加监控面板
效果展示
————————————————
版权声明:本文为CSDN博主「奔跑的开心果」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_39246324/article/details/125048428