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

posted @ 2023-05-10 17:40  GaoYanbing  阅读(562)  评论(0编辑  收藏  举报