grafana统计接口访问量
目录
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统计接口访问量相关推荐
- js实现精确统计网站访问量的代码分享
JS 精确统计网站访问量. 代码如下: /** * vlstat 浏览器统计脚本 */ var statIdName = "vlstatId"; var xmlHttp; /** ...
- CH13,拍42,练习一。通过文本文件统计页面访问量
index.php <?php error_reporting(E_ALL ^E_NOTICE); session_start(); //SESSION的目的就是防止访问后刷新,这样访问量不更新 ...
- linux统计大日志文件字符次数统计接口调用量
一.背景 有个服务每天调用量特别大,每天10G+的日志,一般编辑文件无法打开并统计接口日志打印的数量. 二.解决方案 1)切割大日志文件 split -b 100M business.20210526 ...
- 这才是目前百度统计接口的正确打开方式20180322
这才是目前百度统计接口的正确打开方式20180322 关于百度统计接口的说明 1.登陆接口网站找到的有2种方式 第一种调用(不能用) https://api.baidu.com/sem/common/ ...
- 【实时数仓】省份交易额统计接口、新老访客对比接口、访客分时统计接口
文章目录 一 省份交易额统计接口 1 Sugar配置 (1)图表配置 (2)接口地址 (3)数据格式 (4)执行SQL 2 数据接口实现 (1)创建地区交易额统计实体类ProvinceStats (2 ...
- Servlet中统计网站访问量
统计网站访问量 访问量 放入到servletContext里,,setAttribute("count"); 其他servlet获取该变量,然后进行自增 再重新放入到 servle ...
- AOP面向切面编程之全局日志打印/统计接口耗时
目录 一.什么是AOP 二.AOP使用场景 三.使用AOP的好处 四.先举个例子理解AOP面向切面编程 五.Spring5.X的AOP切入点表达式有这些种写法 六.实战基于Spring的AOP快速实现 ...
- java 统计qps_统计接口QPS
现在记录话单的时候想加一个参数:每秒接口调用的并发量,也就是所谓的QPS(Queries per second).QPS即每秒请求数,是对一个特定的接口在规定时间内请求流量的衡量标准.那么如何实现QP ...
- java web统计网站访问次数,实现一个统计网站访问量的效能
实现一个统计网站访问量的功能 大神们 用JS,jquery,ajax怎么实现一个统计网站访问量的功能 谢谢 ------解决方案-------------------- 这里 ...
最新文章
- windows 64位 dll文件 位置及python包rtree shapely安装
- 【TypeScript】探索 var 和 let 关键字之间的差异
- ASCII Unicode GBK UTF的联系
- 懂编译真的可以为所欲为|不同前端框架下的代码转换
- C\C++语言,从编程语言到库、API、框架、引擎
- 利用jquery load 局部刷新数据
- Spring-Data-JPA--增删改查2——自定义接口查询
- .Net中的加密解密
- 转载--Ajax学习---DOM进行Web响应
- 20180810 突然发现自己不小心跑到了数据分析呈现岗位
- jQuery基础--选择器
- python运维脚本简书_Python运维篇:会Python的运维工程师价值多少?
- Oracle alter 语句用法
- VSTO程序基本知识(二)
- office办公哪个版本稳定好用
- EasyDarwin开源云平台接入海康威视EasyCamera摄像机之快照获取与上传
- Word中如何删除某一页的页眉与页眉中的横线
- NeurIPS十年高引学者TOP100榜单发布!这些大牛值得膜拜!
- 毕业季的你准备好面试了吗?(下)
- 大家身边有没有超级自恋的人