From c2a0574aa3d48d430106f54a8eb9c492f46fddba Mon Sep 17 00:00:00 2001 From: lensfrex Date: Tue, 7 May 2024 16:17:59 +0800 Subject: [PATCH] =?UTF-8?q?ref:=20=E6=95=B0=E6=8D=AE=E6=94=B6=E9=9B=86?= =?UTF-8?q?=E9=83=A8=E5=88=86=E6=94=B9=E5=86=99=E4=B8=BA=E5=BC=82=E6=AD=A5?= =?UTF-8?q?=E6=8E=A5=E5=8F=A3=E6=A8=A1=E5=BC=8F?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/DataCollectingController.java | 6 +- .../configure/RedisTemplateConfigure.java | 26 +++++++ .../service/MetricDataCollectingService.java | 43 ++++++++++-- .../api/src/main/resources/application.yml | 10 ++- .../dto/log/RequestProcessTraceRecord.java | 67 +++++++++++++++++++ rition-center/pom.xml | 4 ++ 6 files changed, 148 insertions(+), 8 deletions(-) create mode 100644 rition-center/api/src/main/java/rition/backend/configure/RedisTemplateConfigure.java create mode 100644 rition-center/common/src/main/java/rition/common/data/dto/log/RequestProcessTraceRecord.java diff --git a/rition-center/api/src/main/java/rition/backend/api/v1/DataCollectingController.java b/rition-center/api/src/main/java/rition/backend/api/v1/DataCollectingController.java index 5698815..50b5cb1 100644 --- a/rition-center/api/src/main/java/rition/backend/api/v1/DataCollectingController.java +++ b/rition-center/api/src/main/java/rition/backend/api/v1/DataCollectingController.java @@ -5,6 +5,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; import rition.backend.annotation.WithRequestIdResponse; +import rition.backend.annotation.paramter.RequestId; import rition.backend.api.v1.dto.request.MetricDataUploadRequest; import rition.backend.api.v1.dto.response.Response; import rition.backend.service.MetricDataCollectingService; @@ -27,7 +28,8 @@ public class DataCollectingController { @PostMapping("/put") @WithRequestIdResponse - public Response putData(@RequestBody List uploadDataList) { + public Response putData(@RequestBody List uploadDataList, + @RequestId String requestId) { // dto转换,按时间组装数据 Map metricDataTimestampMap = new HashMap<>(uploadDataList.size() / 20); for (MetricDataUploadRequest uploadData : uploadDataList) { @@ -46,7 +48,7 @@ public class DataCollectingController { ); } - metricDataCollectingService.receiveData(metricDataTimestampMap); + metricDataCollectingService.receiveData(requestId, metricDataTimestampMap); return Response.success(); } diff --git a/rition-center/api/src/main/java/rition/backend/configure/RedisTemplateConfigure.java b/rition-center/api/src/main/java/rition/backend/configure/RedisTemplateConfigure.java new file mode 100644 index 0000000..e9b9c39 --- /dev/null +++ b/rition-center/api/src/main/java/rition/backend/configure/RedisTemplateConfigure.java @@ -0,0 +1,26 @@ +package rition.backend.configure; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.connection.lettuce.LettuceConnectionFactory; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.serializer.RedisSerializer; + +@Configuration +public class RedisTemplateConfigure { + + @Bean + public RedisTemplate redisTemplate(LettuceConnectionFactory connectionFactory) { + RedisTemplate redisTemplate = new RedisTemplate<>(); + redisTemplate.setConnectionFactory(connectionFactory); + + redisTemplate.setKeySerializer(RedisSerializer.string()); + redisTemplate.setValueSerializer(RedisSerializer.json()); + redisTemplate.setHashKeySerializer(RedisSerializer.string()); + redisTemplate.setDefaultSerializer(RedisSerializer.json()); + + redisTemplate.afterPropertiesSet(); + + return redisTemplate; + } +} diff --git a/rition-center/api/src/main/java/rition/backend/service/MetricDataCollectingService.java b/rition-center/api/src/main/java/rition/backend/service/MetricDataCollectingService.java index accf019..65ccb95 100644 --- a/rition-center/api/src/main/java/rition/backend/service/MetricDataCollectingService.java +++ b/rition-center/api/src/main/java/rition/backend/service/MetricDataCollectingService.java @@ -1,9 +1,15 @@ package rition.backend.service; +import lombok.extern.slf4j.Slf4j; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import rition.common.data.dto.MetricDataDto; +import rition.common.data.dto.log.RequestProcessTraceRecord; import rition.service.collector.MetricCollectingService; +import java.time.Duration; +import java.time.temporal.ChronoUnit; import java.util.Map; /** @@ -12,20 +18,49 @@ import java.util.Map; * 这样做只是为了方便日后将collector等模块独立拆分出来, * 这种情况下实际上数据收集的入口应当直接放在collector里,而不是api部分 */ +@Slf4j @Service public class MetricDataCollectingService { private final MetricCollectingService metricCollectingService; + private final RedisTemplate redisTemplate; - public MetricDataCollectingService(MetricCollectingService metricCollectingService) { + public MetricDataCollectingService(MetricCollectingService metricCollectingService, + RedisTemplate redisTemplate) { this.metricCollectingService = metricCollectingService; + this.redisTemplate = redisTemplate; } + private static final String PROCESS_TRACE_REDIS_KEY_FORMAT = "rition:request:trace:%s"; + /** - * 接收处理好的监控指标数据 + * 接收处理好的监控指标数据,异步处理,请求发送后,处理状态使用requestId追踪,处理结果放置于redis + * + * @param requestId 此次的请求id,用于追踪处理结果 * @param collectedMetricData 监控指标数据,protobuf对象 */ - public void receiveData(Map collectedMetricData) { - metricCollectingService.receiveData(collectedMetricData); + @Async + public void receiveData(String requestId, Map collectedMetricData) { + RequestProcessTraceRecord record; + try { + var start = System.currentTimeMillis(); + metricCollectingService.receiveData(collectedMetricData); + var cost = System.currentTimeMillis() - start; + record = RequestProcessTraceRecord.success(requestId, "ok", cost, null); + } catch (Exception e) { + record = RequestProcessTraceRecord.builder() + .exception(e) + .requestId(requestId) + .message("process failed: " + e) + .status(RequestProcessTraceRecord.OperationStatus.FAIL) + .build(); + } + + try { + redisTemplate.opsForValue().set(PROCESS_TRACE_REDIS_KEY_FORMAT.formatted(requestId), record); + } catch (Exception e2) { + log.error("请求结果保存出现异常: ", e2); + log.error("请求结果:{}", record); + } } } diff --git a/rition-center/api/src/main/resources/application.yml b/rition-center/api/src/main/resources/application.yml index 6036c89..063bec5 100644 --- a/rition-center/api/src/main/resources/application.yml +++ b/rition-center/api/src/main/resources/application.yml @@ -1,7 +1,13 @@ server: - port: 22019 + port: 8000 servlet: context-path: /api + spring: profiles: - include: collector \ No newline at end of file + include: collector + data: + redis: + host: ${REDIS_HOST:127.0.0.1} + port: ${REDIS_PORT:6379} + password: ${REDIS_PASSWORD:Test2333!} diff --git a/rition-center/common/src/main/java/rition/common/data/dto/log/RequestProcessTraceRecord.java b/rition-center/common/src/main/java/rition/common/data/dto/log/RequestProcessTraceRecord.java new file mode 100644 index 0000000..1700bf0 --- /dev/null +++ b/rition-center/common/src/main/java/rition/common/data/dto/log/RequestProcessTraceRecord.java @@ -0,0 +1,67 @@ +package rition.common.data.dto.log; + +import com.fasterxml.jackson.annotation.JsonInclude; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; + +import java.time.Duration; + +@Data +@Builder +@NoArgsConstructor +@AllArgsConstructor +@JsonInclude(JsonInclude.Include.NON_NULL) +public class RequestProcessTraceRecord { + private String requestId; + + private OperationStatus status; + + private String message; + + private Exception exception; + + private long cost; + + private Object extra; + + public static RequestProcessTraceRecord success(String requestId, String message, Object extraData) { + return RequestProcessTraceRecord.builder() + .requestId(requestId) + .message(message) + .extra(extraData) + .status(OperationStatus.OK) + .build(); + } + + public static RequestProcessTraceRecord success(String requestId, + String message, + long cost, + Object extraData) { + return RequestProcessTraceRecord.builder() + .requestId(requestId) + .message(message) + .extra(extraData) + .cost(cost) + .status(OperationStatus.OK) + .build(); + } + + public enum OperationStatus { + /** + * 成功 + */ + OK, + + /** + * 失败 + */ + FAIL, + + /** + * 部分完成 + */ + PARTIALLY_FINISHED + } +} diff --git a/rition-center/pom.xml b/rition-center/pom.xml index 914b8f1..a08278a 100644 --- a/rition-center/pom.xml +++ b/rition-center/pom.xml @@ -62,6 +62,10 @@ com.fasterxml.jackson.core jackson-annotations + + com.fasterxml.jackson.datatype + jackson-datatype-jsr310 +