# qps-helper
**Repository Path**: hierarch_yang/qps-helper
## Basic Information
- **Project Name**: qps-helper
- **Description**: 通用的qps统计工具包,为项目中一些框架实现QPS限流提供支持,为项目中统计接口的QPS提供支持。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 4
- **Forks**: 0
- **Created**: 2021-11-02
- **Last Updated**: 2022-09-30
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# qps-helper
通用的qps、tps统计工具包
### 添加依赖配置
jdk1.8项目使用此依赖
```xml
com.github.wujiuye
qps-helper
1.1.2-RELEASE
```
jdk1.7项目使用此依赖
```xml
com.github.wujiuye
qps-helper
JDK7.1.1.2-RELEASE
```
### 使用qps-helper统计接口的QPS
```java
@RestController
@RequestMapping("/api/v1")
@Slf4j
public class DemoController {
private FlowHelper flowHelper = new FlowHelper(FlowType.HOUR);
@GetMapping("/test")
public ApiResponse testApi() {
try{
long startTime = TimeUtil.currentTimeMillis();
// 业务逻辑
// ......
// 计算耗时
long rt = TimeUtil.currentTimeMillis() - startTime;
flowHelper.incrSuccess(rt);
return ApiResponse.ok();
}catch (Exception e){
flowHelper.incrException();
return ApiResponse.error();
}
}
}
```
### 统计每秒钟
```java
public class Main{
private FlowHelper flowHelper = new FlowHelper(FlowType.Second);
}
```
输出最近一秒钟统计
```java
public class Main{
public static void print(){
Flower flower = flowHelper.getFlow(FlowType.Second);
System.out.println("总请求数:"+flower.total());
System.out.println("成功请求数:"+flower.totalSuccess());
System.out.println("异常请求数:"+flower.totalException());
System.out.println("平均请求耗时:"+flower.avgRt());
System.out.println("最大请求耗时:"+flower.maxRt());
System.out.println("最小请求耗时:"+flower.minRt());
System.out.println("平均请求成功数(每毫秒):"+flower.successAvg());
System.out.println("平均请求异常数(每毫秒):"+flower.exceptionAvg());
System.out.println();
}
}
```
### 统计每分钟
```java
public class Main{
private FlowHelper flowHelper = new FlowHelper(FlowType.Minute);
}
```
输出最近一分钟统计
```java
public class Main{
public static void print(){
Flower flower = flowHelper.getFlow(FlowType.Minute);
System.out.println("总请求数:"+flower.total());
System.out.println("成功请求数:"+flower.totalSuccess());
System.out.println("异常请求数:"+flower.totalException());
System.out.println("平均请求耗时:"+flower.avgRt());
System.out.println("最大请求耗时:"+flower.maxRt());
System.out.println("最小请求耗时:"+flower.minRt());
System.out.println("平均请求成功数(每秒钟):"+flower.successAvg());
System.out.println("平均请求异常数(每秒钟):"+flower.exceptionAvg());
System.out.println();
}
}
```
### 统计每小时
```java
public class Main{
private FlowHelper flowHelper = new FlowHelper(FlowType.HOUR);
}
```
输出最近一小时统计
```java
public class Main{
public static void print(){
Flower flower = flowHelper.getFlow(FlowType.HOUR);
System.out.println("总请求数:"+flower.total());
System.out.println("成功请求数:"+flower.totalSuccess());
System.out.println("异常请求数:"+flower.totalException());
System.out.println("平均请求耗时:"+flower.avgRt());
System.out.println("最大请求耗时:"+flower.maxRt());
System.out.println("最小请求耗时:"+flower.minRt());
System.out.println("平均请求成功数(每分钟):"+flower.successAvg());
System.out.println("平均请求异常数(每分钟):"+flower.exceptionAvg());
System.out.println();
}
}
```
### 组合统计
```java
public class Main{
// 可任意组合
private FlowHelper flowHelper = new FlowHelper(FlowType.HOUR,FlowType.Minute,FlowType.Second);
}
```
输出最近一小时、一分钟、一毫秒的统计
```java
public class Main{
public static void print(){
// 获取每秒钟统计
Flower secondFlower = flowHelper.getFlow(FlowType.Second);
// 获取每分钟统计
Flower minuteFlower = flowHelper.getFlow(FlowType.Minute);
// 获取每小时统计
Flower hourFlower = flowHelper.getFlow(FlowType.HOUR);
}
}
```
### 获取详情
以统计每分钟数据为例
```java
public class Main{
private FlowHelper flowHelper = new FlowHelper(FlowType.Minute);
public static void print(){
// 获取每分钟统计
Flower flower = flowHelper.getFlow(FlowType.Minute);
List> buckets = flower.windows();
for (WindowWrap bucket : buckets) {
System.out.print("开始时间戳:" + bucket.windowStart() + "\t");
System.out.print("成功数:" + bucket.value().success() + "\t");
System.out.print("失败数:" + bucket.value().exception() + "\t");
System.out.print("平均耗时:" + (bucket.value().rt() / bucket.value().success()) + "\t");
System.out.print("最大数:" + bucket.value().maxRt() + "\t");
System.out.print("最小数:" + bucket.value().minRt() + "\t");
System.out.println();
}
System.out.println();
}
}
```
### 指标数据持久化
1、在main方法中调用MetricPersistencer的init方法初始化指标数据持久化功能
```
MetricPersistencer.init("/tmp");
```
* 其中参数为用于存放指标数据文件的目录。
2、给MetricPersistencer注册需要持久化的资源Flower
```
MetricPersistencer.registerFlower("test-resource", flowHelper.getFlow(FlowType.Minute));
```
* 参数1:资源名称
* 参数2:Flower,目前仅支持MinuteFlower
### A&Q
* 1、平均请求数的统计有问题?
平均请求数的计算:如果统计一分钟的qps,那么平均就是当前成功请求数/60秒。\
所以要准确的话,前一分钟是准确的,当前分钟是不准确的。