Commit 46345ff5 by 黄明步

调用页数统计

parent 21e950ad
...@@ -5,28 +5,31 @@ import org.springframework.context.annotation.Configuration; ...@@ -5,28 +5,31 @@ import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.PathSelectors;
import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.builders.RequestHandlerSelectors;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.spi.DocumentationType; import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2WebMvc; import springfox.documentation.swagger2.annotations.EnableSwagger2;
@Configuration @Configuration
@EnableSwagger2WebMvc @EnableSwagger2
public class SwaggerConfiguration { public class SwaggerConfiguration {
@Bean(value = "defaultApi2")
public Docket defaultApi2() { @Bean
Docket docket=new Docket(DocumentationType.SWAGGER_2) public Docket api() {
.apiInfo(new ApiInfoBuilder() return new Docket(DocumentationType.SWAGGER_2)
//.title("swagger-bootstrap-ui-demo RESTful APIs") .groupName("项目")
.description("#RESTful APIs") // 生产环境关闭
.version("1.0")
.build())
//分组名称
.groupName("1.X版本")
.select() .select()
//这里指定Controller扫描包路径 .apis(RequestHandlerSelectors.basePackage("com.gxmailu.ocrCloudPlatform.controller"))
.apis(RequestHandlerSelectors.basePackage("com.gxmailu.message.controller"))
.paths(PathSelectors.any()) .paths(PathSelectors.any())
.build()
.apiInfo(apiInfo());
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("后台接口文档")
.description("查看接口文档")
.build(); .build();
return docket;
} }
} }
package com.gxmailu.ocrCloudPlatform.controller;
import com.gxmailu.ocrCloudPlatform.service.impl.StatService;
import com.gxmailu.ocrCloudPlatform.vo.Result;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiImplicitParam;
import io.swagger.annotations.ApiImplicitParams;
import io.swagger.annotations.ApiOperation;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;
/**
* 统计相关
*
* @author Hmb
* @since 2024/4/9 16:46
*/
@Slf4j
@RestController
@RequestMapping("/stat")
@Api(tags = "统计相关接口")
public class StatController {
@Resource
private StatService statService;
@ApiOperation(value = "获取调用信息数据")
@ApiImplicitParams(value = {
@ApiImplicitParam(name = "interval",value = "时间间隔,可选值[year|month|day|hour|minute|second]",dataType = "String", required = false),
@ApiImplicitParam(name = "displayType",value = "展示类型,总体量或各法院使用量可选值[detailed|full]",dataType = "String",required = false),
})
@GetMapping("/getBrokenLineData")
public Result getBrokenLineData(@RequestParam(value = "interval", defaultValue = "minute") String interval,
@RequestParam(value = "displayType", defaultValue = "full") String displayType) {
return statService.getBrokenLineData(interval, displayType);
}
}
...@@ -824,7 +824,7 @@ public class RetransmissionService { ...@@ -824,7 +824,7 @@ public class RetransmissionService {
log.error("请求OCR接口错误{}, fileId={}", result, fileId); log.error("请求OCR接口错误{}, fileId={}", result, fileId);
} }
} catch (Exception e) { } catch (Exception e) {
log.error("数据{}保存发生异常!", result, e); log.error("数据保存发生异常!", e);
} }
} }
......
package com.gxmailu.ocrCloudPlatform.service.impl;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.util.ObjUtil;
import cn.hutool.core.util.StrUtil;
import co.elastic.clients.elasticsearch.ElasticsearchClient;
import co.elastic.clients.elasticsearch._types.aggregations.CalendarInterval;
import co.elastic.clients.elasticsearch._types.aggregations.DateHistogramAggregation;
import co.elastic.clients.elasticsearch._types.aggregations.DateHistogramBucket;
import co.elastic.clients.elasticsearch._types.aggregations.SumAggregation;
import co.elastic.clients.elasticsearch.core.SearchResponse;
import co.elastic.clients.json.JsonData;
import com.gxmailu.ocrCloudPlatform.entity.Court;
import com.gxmailu.ocrCloudPlatform.service.CourtService;
import com.gxmailu.ocrCloudPlatform.utils.IpUtils;
import com.gxmailu.ocrCloudPlatform.vo.BrokenLineData;
import com.gxmailu.ocrCloudPlatform.vo.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.io.IOException;
import java.util.*;
import java.util.stream.Collectors;
/**
* @author Hmb
* @since 2024/4/6 17:13
*/
@Slf4j
@Service
public class StatService {
@Resource
private RedisService redisService;
@Resource
private ElasticSearchService elasticSearchService;
@Resource
private CourtService courtService;
@Resource
private ElasticsearchClient client;
private static final String APP_ABILITY_RECORD_INDEX = "app_ability_record";
public Result getBrokenLineData(String interval, String displayType) {
try {
List<BrokenLineData> brokenLineData = new ArrayList<>();
if (displayType.equals("full")) {
return Result.success("获取折线数据成功", getLineData(interval, null));
} else {
List<Court> courtList = courtService.getCourtList()
.stream()
.filter(court -> StrUtil.isNotEmpty(court.getIpScope()))
.collect(Collectors.toList());
Map<String, Object> map = new HashMap<>();
for (Court court : courtList) {
List<BrokenLineData> lineData = getLineData(interval, court);
map.put(court.getForSort(), lineData);
}
return Result.success("成功", map);
}
// return Result.success("获取折线数据成功", brokenLineData);
} catch (Exception e) {
log.error("获取折线数据失败", e);
return Result.serverError("获取折线数据失败", e);
}
}
public List<BrokenLineData> getLineData(String interval, Court court) {
List<BrokenLineData> resultList = new ArrayList<>();
// String startTime = DateUtil.beginOfDay(DateUtil.date()).toString("yyyy-MM-dd HH:mm:ss");
// String endTime = DateUtil.beginOfDay(DateUtil.date()).toString("yyyy-MM-dd HH:mm:ss");
String startTime = DateUtil.beginOfDay(DateUtil.parseDate("2024-01-23")).toString("yyyy-MM-dd HH:mm:ss");
String endTime = DateUtil.endOfDay(DateUtil.parseDate("2024-01-23")).toString("yyyy-MM-dd HH:mm:ss");
CalendarInterval defaultInterval = CalendarInterval.Minute;
switch (interval) {
case "year":
startTime = DateUtil.beginOfYear(DateUtil.date()).toString("yyyy-MM-dd HH:mm:ss");
endTime = DateUtil.endOfYear(DateUtil.date()).toString("yyyy-MM-dd HH:mm:ss");
defaultInterval = CalendarInterval.Month;
break;
case "month":
// startTime = DateUtil.beginOfMonth(DateUtil.date()).toString("yyyy-MM-dd HH:mm:ss");
// endTime = DateUtil.endOfMonth(DateUtil.date()).toString("yyyy-MM-dd HH:mm:ss");
startTime = DateUtil.beginOfMonth(DateUtil.parseDate("2024-01-23")).toString("yyyy-MM-dd HH:mm:ss");
endTime = DateUtil.endOfMonth(DateUtil.parseDate("2024-01-23")).toString("yyyy-MM-dd HH:mm:ss");
defaultInterval = CalendarInterval.Day;
break;
case "day":
defaultInterval = CalendarInterval.Hour;
break;
case "hour":
break;
case "minute":
break;
case "second":
defaultInterval = CalendarInterval.Second;
break;
}
try {
String finalStartTime = startTime;
String finalEndTime = endTime;
CalendarInterval finalDefaultInterval = defaultInterval;
SearchResponse<Void> search = client.search(srBuilder -> srBuilder.index(APP_ABILITY_RECORD_INDEX).query(queryBuilder -> queryBuilder.bool(boolQuery -> {
// 日期范围查询
boolQuery.must(q -> q.range(rangeQueryBuilder -> rangeQueryBuilder
.field("callTime")
.gte(JsonData.of(finalStartTime))
.lte(JsonData.of(finalEndTime))
));
boolQuery.must(mustQuery -> mustQuery.bool(bq -> {
if (ObjUtil.isNotNull(court)) {
List<String> ipScopes = StrUtil.splitTrim(court.getIpScope(), "-");
try {
List<String> ipRange = ipScopes.size() != 2 ? Arrays.asList("255.255.255.255", "255.255.255.255") : IpUtils.getIPRange(ipScopes.get(0), ipScopes.get(1), 3);
ipRange.forEach(ip -> bq.should(q -> q.prefix(pq -> pq.field("ip.keyword").value(ip))));
} catch (Exception e) {
log.error("IP段解析错误", e);
}
}
return bq;
}));
return boolQuery;
// 聚合查询,按每一分钟为间隔查询每分钟的调用量
})).aggregations("record", agg -> agg.dateHistogram(DateHistogramAggregation.of(s -> s.field("callTime").calendarInterval(finalDefaultInterval)))
.aggregations("fileCount", fileCountAgg -> fileCountAgg.sum(SumAggregation.of(s -> s.field("fileCount")))))
.trackTotalHits(tb -> tb.enabled(true)), Void.class);
List<DateHistogramBucket> recordBcketList = search.aggregations().get("record").dateHistogram().buckets().array();
recordBcketList.forEach(recordBucket -> {
BrokenLineData brokenLineData = new BrokenLineData();
String time = StrUtil.isBlank(recordBucket.keyAsString()) ? "" : recordBucket.keyAsString();
brokenLineData.setTime(time);
long value = (long) recordBucket.aggregations().get("fileCount").sum().value();
brokenLineData.setValue(value);
resultList.add(brokenLineData);
});
return resultList;
} catch (IOException e) {
log.error("获取折线图数据失败", e);
return resultList;
}
}
}
package com.gxmailu.ocrCloudPlatform.vo; package com.gxmailu.ocrCloudPlatform.vo;
import lombok.Data;
@Data
public class BrokenLineData { public class BrokenLineData {
private Long id; private Long id;
private String name;
private String time; private String time;
private Long value; private Long value;
private String metric; private String metric;
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getTime() {
return time;
}
public void setTime(String time) {
this.time = time;
}
public Long getValue() {
return value;
}
public void setValue(Long value) {
this.value = value;
}
public String getMetric() {
return metric;
}
public void setMetric(String metric) {
this.metric = metric;
}
@Override
public String toString() {
return "BrokenLineData{" +
"id=" + id +
", time='" + time + '\'' +
", value=" + value +
", metric='" + metric + '\'' +
'}';
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment