This is an automated email from the ASF dual-hosted git repository.

zhaoqingran pushed a commit to branch bulletin
in repository https://gitbox.apache.org/repos/asf/hertzbeat.git


The following commit(s) were added to refs/heads/bulletin by this push:
     new ad2684a92 feat(bulletin): modify metrics data processing and improve 
data structure
ad2684a92 is described below

commit ad2684a9214f4ec05b07ed7c40638d48e92b5d33
Author: zqr10159 <[email protected]>
AuthorDate: Sat Jul 27 00:20:12 2024 +0800

    feat(bulletin): modify metrics data processing and improve data structure
    
    - Refactor the metrics data retrieval and processing logic in 
BulletinController.
    - Replace the metrics data list construction with a more streamlined 
approach using map and collect.
    - Improve the BulletinMetricsData building process by extracting重复代码 into 
separate methods.
    - Use a HashSet to eliminate duplicates in metrics data processing.
    - Simplify the field value assignment in BulletinMetricsData construction.
    - Enhance the overall code readability and maintainability.
    
    BREAKING CHANGE: The modification in metrics data processing may affect 
downstream systems that rely on the previous data structure.
---
 .../manager/controller/BulletinController.java     | 172 ++++++++++-----------
 .../src/app/routes/bulletin/bulletin.component.ts  |   2 +-
 2 files changed, 83 insertions(+), 91 deletions(-)

diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/controller/BulletinController.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/controller/BulletinController.java
index 52a0ea6f5..5aeee76cf 100644
--- 
a/manager/src/main/java/org/apache/hertzbeat/manager/controller/BulletinController.java
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/controller/BulletinController.java
@@ -26,11 +26,13 @@ import jakarta.persistence.criteria.CriteriaBuilder;
 import jakarta.persistence.criteria.Predicate;
 import jakarta.validation.Valid;
 import java.util.ArrayList;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.Optional;
+import java.util.Set;
 import java.util.stream.Collectors;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.hertzbeat.common.constants.CommonConstants;
@@ -44,6 +46,7 @@ import 
org.apache.hertzbeat.common.entity.manager.bulletin.BulletinDto;
 import org.apache.hertzbeat.common.entity.manager.bulletin.BulletinMetricsData;
 import org.apache.hertzbeat.common.entity.manager.bulletin.BulletinVo;
 import org.apache.hertzbeat.common.entity.message.CollectRep;
+import org.apache.hertzbeat.common.util.Pair;
 import org.apache.hertzbeat.manager.service.BulletinService;
 import org.apache.hertzbeat.manager.service.MonitorService;
 import org.apache.hertzbeat.warehouse.store.realtime.RealTimeDataReader;
@@ -151,105 +154,94 @@ public class BulletinController {
         }
     }
 
-    @GetMapping("/metrics/{id}")
-    @Operation(summary = "Query Bulletin Real Time Metrics Data",
-            description = "Query Bulletin real-time metrics data of monitoring 
indicators")
-    public ResponseEntity<Message<List<MetricsData>>> getMetricsData(
-            @Parameter(description = "Bulletin Id", example = 
"402372614668544")
-            @PathVariable Long id) {
-        boolean available = realTimeDataReader.isServerAvailable();
-        if (!available) {
-            return ResponseEntity.ok(Message.fail(FAIL_CODE, "real time store 
not available"));
-        }
-        Optional<Bulletin> bulletinOptional = 
bulletinService.getBulletinById(id);
-        if (bulletinOptional.isEmpty()) {
-            return ResponseEntity.ok(Message.success("query metrics data is 
empty"));
-        }
-        Bulletin bulletin = bulletinOptional.get();
-        List<String> metrics = bulletin.getMetrics().stream().map(metric ->  
metric.split("-")[0]).distinct().toList();
-        List<CollectRep.MetricsData> metricsDataList = 
metrics.stream().map(metric -> 
realTimeDataReader.getCurrentMetricsData(bulletin.getMonitorId(), 
metric)).toList();
-        List<MetricsData> dataList = new ArrayList<>();
-        for (CollectRep.MetricsData storageData : metricsDataList) {
-            MetricsData.MetricsDataBuilder dataBuilder = MetricsData.builder();
-            
dataBuilder.id(storageData.getId()).app(storageData.getApp()).metrics(storageData.getMetrics())
-                    .time(storageData.getTime());
-            List<Field> fields = 
storageData.getFieldsList().stream().map(tmpField ->
-                            Field.builder().name(tmpField.getName())
-                                    
.type(Integer.valueOf(tmpField.getType()).byteValue())
-                                    .label(tmpField.getLabel())
-                                    .unit(tmpField.getUnit())
-                                    .build())
-                    .collect(Collectors.toList());
-            dataBuilder.fields(fields);
-            List<ValueRow> valueRows = new LinkedList<>();
-            for (CollectRep.ValueRow valueRow : storageData.getValuesList()) {
-                Map<String, String> labels = new HashMap<>(8);
-                List<Value> values = new LinkedList<>();
-                for (int i = 0; i < fields.size(); i++) {
-                    Field field = fields.get(i);
-                    String origin = valueRow.getColumns(i);
-                    if (CommonConstants.NULL_VALUE.equals(origin)) {
-                        values.add(new Value());
-                    } else {
-                        values.add(new Value(origin));
-                        if (field.getLabel()) {
-                            labels.put(field.getName(), origin);
-                        }
-                    }
-                }
-                
valueRows.add(ValueRow.builder().labels(labels).values(values).build());
-            }
-            dataBuilder.valueRows(valueRows);
-            dataList.add(dataBuilder.build());
-        }
-        return ResponseEntity.ok(Message.success(dataList));
-        }
-
     @GetMapping("/metrics")
     @Operation(summary = "Query All Bulletin Real Time Metrics Data", 
description = "Query All Bulletin real-time metrics data of monitoring 
indicators")
     public ResponseEntity<Message<List<BulletinMetricsData>>> 
getAllMetricsData() {
-        boolean available = realTimeDataReader.isServerAvailable();
-        if (!available) {
+        if (!realTimeDataReader.isServerAvailable()) {
             return ResponseEntity.ok(Message.fail(FAIL_CODE, "real time store 
not available"));
         }
+
         List<Bulletin> bulletinList = bulletinService.listBulletin();
-        List<BulletinMetricsData> dataList = new ArrayList<>();
-        for (Bulletin bulletin : bulletinList) {
-            BulletinMetricsData.BulletinMetricsDataBuilder dataBuilder = 
BulletinMetricsData.builder();
-            
dataBuilder.id(bulletin.getId()).name(bulletin.getName()).app(bulletin.getApp());
-
-            BulletinMetricsData.Content.ContentBuilder contentBuilder = 
BulletinMetricsData.Content.builder();
-            
contentBuilder.monitorId(bulletin.getMonitorId()).host(monitorService.getMonitor(bulletin.getMonitorId()).getHost());
-
-            BulletinMetricsData.Metric.MetricBuilder metricBuilder = 
BulletinMetricsData.Metric.builder();
-            List<BulletinMetricsData.Metric> metrics = new ArrayList<>();
-            for (String metric : bulletin.getMetrics().stream().map(metric -> 
metric.split("-")[0]).distinct().toList()){
-                metricBuilder.name(metric);
-                CollectRep.MetricsData currentMetricsData = 
realTimeDataReader.getCurrentMetricsData(bulletin.getMonitorId(), metric);
-
-                List<List<BulletinMetricsData.Field>> fieldsList = new 
ArrayList<>();
-                List<CollectRep.ValueRow> valuesList = 
currentMetricsData.getValuesList();
-                for (CollectRep.ValueRow valueRow : valuesList) {
-                    List<BulletinMetricsData.Field> fields = new ArrayList<>();
-                    for (CollectRep.Field field : 
currentMetricsData.getFieldsList()) {
-                        
fields.add(BulletinMetricsData.Field.builder().key(field.getName()).unit(field.getUnit()).build());
-                    }
+        List<BulletinMetricsData> dataList = bulletinList.stream()
+                .map(this::buildBulletinMetricsData)
+                .collect(Collectors.toList());
+
+        return ResponseEntity.ok(Message.success(dataList));
+    }
+
+    private BulletinMetricsData buildBulletinMetricsData(Bulletin bulletin) {
+        BulletinMetricsData.BulletinMetricsDataBuilder dataBuilder = 
BulletinMetricsData.builder()
+                .id(bulletin.getId())
+                .name(bulletin.getName())
+                .app(bulletin.getApp());
+
+        BulletinMetricsData.Content.ContentBuilder contentBuilder = 
BulletinMetricsData.Content.builder()
+                .monitorId(bulletin.getMonitorId())
+                
.host(monitorService.getMonitor(bulletin.getMonitorId()).getHost());
+
+        List<BulletinMetricsData.Metric> metrics = buildMetrics(bulletin);
+        contentBuilder.metrics(metrics);
+        dataBuilder.content(contentBuilder.build());
+
+        return dataBuilder.build();
+    }
+
+    private List<BulletinMetricsData.Metric> buildMetrics(Bulletin bulletin) {
+        Set<String> metricSet = bulletin.getMetrics().stream()
+                .map(metric -> metric.split("\\$\\$\\$")[0])
+                .collect(Collectors.toSet());
+
+        List<Pair<String, String>> metricFieldList = 
bulletin.getMetrics().stream()
+                .map(metric -> metric.split("\\$\\$\\$"))
+                .map(arr -> new Pair<>(arr[0], arr[1]))
+                .collect(Collectors.toList());
+
+        return metricSet.stream()
+                .map(metric -> buildMetric(bulletin.getMonitorId(), metric, 
metricFieldList))
+                .collect(Collectors.toList());
+    }
+
+    private BulletinMetricsData.Metric buildMetric(Long monitorId, String 
metric, List<Pair<String, String>> metricFieldList) {
+        BulletinMetricsData.Metric.MetricBuilder metricBuilder = 
BulletinMetricsData.Metric.builder()
+                .name(metric);
+
+        CollectRep.MetricsData currentMetricsData = 
realTimeDataReader.getCurrentMetricsData(monitorId, metric);
+        List<List<BulletinMetricsData.Field>> fieldsList = (currentMetricsData 
!= null) ?
+                buildFieldsListFromCurrentData(currentMetricsData) :
+                buildFieldsListFromMetricFieldList(metricFieldList);
+
+        metricBuilder.fields(fieldsList);
+        return metricBuilder.build();
+    }
+
+    private List<List<BulletinMetricsData.Field>> 
buildFieldsListFromCurrentData(CollectRep.MetricsData currentMetricsData) {
+        return currentMetricsData.getValuesList().stream()
+                .map(valueRow -> {
+                    List<BulletinMetricsData.Field> fields = 
currentMetricsData.getFieldsList().stream()
+                            .map(field -> BulletinMetricsData.Field.builder()
+                                    .key(field.getName())
+                                    .unit(field.getUnit())
+                                    .build())
+                            .collect(Collectors.toList());
+
                     for (int i = 0; i < fields.size(); i++) {
-                        String origin = valueRow.getColumns(i);
-                        fields.get(i).setValue(origin);
+                        fields.get(i).setValue(valueRow.getColumns(i));
                     }
-                    fieldsList.add(fields);
-                }
-                metricBuilder.fields(fieldsList);
-                metrics.add(metricBuilder.build());
-            }
-
-            contentBuilder.metrics(metrics);
-            dataBuilder.content(contentBuilder.build());
-            dataList.add(dataBuilder.build());
-        }
+                    return fields;
+                })
+                .collect(Collectors.toList());
+    }
 
-        return ResponseEntity.ok(Message.success(dataList));
+    private List<List<BulletinMetricsData.Field>> 
buildFieldsListFromMetricFieldList(List<Pair<String, String>> metricFieldList) {
+        List<BulletinMetricsData.Field> fields = metricFieldList.stream()
+                .map(pair -> BulletinMetricsData.Field.builder()
+                        .key(pair.getLeft())
+                        .unit("")
+                        .value(pair.getRight())
+                        .build())
+                .toList();
+
+        return Collections.singletonList(fields);
     }
 
 }
diff --git a/web-app/src/app/routes/bulletin/bulletin.component.ts 
b/web-app/src/app/routes/bulletin/bulletin.component.ts
index d2dccb4e3..1edf13a84 100644
--- a/web-app/src/app/routes/bulletin/bulletin.component.ts
+++ b/web-app/src/app/routes/bulletin/bulletin.component.ts
@@ -249,7 +249,7 @@ export class BulletinComponent implements OnInit {
 
     const traverse = (nodes: any[], parentKey: string | null = null, parentId: 
number | null = null) => {
       nodes.forEach(node => {
-        const key = parentKey ? `${parentKey}-${node.value}` : node.value;
+        const key = parentKey ? `${parentKey}$$$${node.value}` : node.value;
         const isRootNode = parentId === null;
         const item: NzTreeNodeOptions = {
           id: currentId++,


---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to