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 0eaf08b0a [feat(bulletin)] dynamically generate columns for metrics 
data
0eaf08b0a is described below

commit 0eaf08b0a0026bbb146800d093391a7c6d47689d
Author: zqr10159 <[email protected]>
AuthorDate: Fri Jul 12 17:35:03 2024 +0800

    [feat(bulletin)] dynamically generate columns for metrics data
    
    Refactor the bulletin component to support dynamic column generation in 
tables
---
 .../manager/controller/BulletinController.java     | 72 ++++++++++++++++++++++
 .../hertzbeat/manager/service/BulletinService.java |  7 +++
 .../manager/service/impl/BulletinServiceImpl.java  | 11 +++-
 .../app/routes/bulletin/bulletin.component.html    | 12 +---
 .../src/app/routes/bulletin/bulletin.component.ts  | 49 +++++++++------
 5 files changed, 120 insertions(+), 31 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 19c35691a..7f17bd053 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
@@ -19,17 +19,32 @@
 package org.apache.hertzbeat.manager.controller;
 
 import static org.apache.hertzbeat.common.constants.CommonConstants.FAIL_CODE;
+import io.swagger.v3.oas.annotations.Operation;
 import io.swagger.v3.oas.annotations.Parameter;
 import jakarta.persistence.criteria.CriteriaBuilder;
 import jakarta.persistence.criteria.Predicate;
 import jakarta.validation.Valid;
 import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.LinkedList;
 import java.util.List;
+import java.util.Map;
+import java.util.Optional;
+import java.util.stream.Collectors;
+import org.apache.hertzbeat.common.constants.CommonConstants;
+import org.apache.hertzbeat.common.entity.dto.Field;
 import org.apache.hertzbeat.common.entity.dto.Message;
+import org.apache.hertzbeat.common.entity.dto.MetricsData;
+import org.apache.hertzbeat.common.entity.dto.Value;
+import org.apache.hertzbeat.common.entity.dto.ValueRow;
 import org.apache.hertzbeat.common.entity.manager.bulletin.Bulletin;
 import org.apache.hertzbeat.common.entity.manager.bulletin.BulletinDto;
 import org.apache.hertzbeat.common.entity.manager.bulletin.BulletinVo;
+import org.apache.hertzbeat.common.entity.message.CollectRep;
 import org.apache.hertzbeat.manager.service.BulletinService;
+import org.apache.hertzbeat.warehouse.store.history.HistoryDataReader;
+import org.apache.hertzbeat.warehouse.store.realtime.RealTimeDataReader;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.data.domain.Page;
 import org.springframework.data.domain.PageRequest;
@@ -39,6 +54,7 @@ import org.springframework.http.ResponseEntity;
 import org.springframework.stereotype.Controller;
 import org.springframework.util.StringUtils;
 import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
 import org.springframework.web.bind.annotation.PostMapping;
 import org.springframework.web.bind.annotation.RequestBody;
 import org.springframework.web.bind.annotation.RequestMapping;
@@ -54,6 +70,8 @@ public class BulletinController {
     @Autowired
     private BulletinService bulletinService;
 
+    @Autowired
+    private RealTimeDataReader realTimeDataReader;
     /**
      * add a new bulletin
      */
@@ -111,4 +129,58 @@ public class BulletinController {
          return ResponseEntity.ok(Message.success(bulletinsPage));
     }
 
+    @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 LinkedList<>();
+        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));
+        }
+
+
 }
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/BulletinService.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/BulletinService.java
index ac2308620..e362c5b1c 100644
--- 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/BulletinService.java
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/BulletinService.java
@@ -18,6 +18,7 @@
 package org.apache.hertzbeat.manager.service;
 
 import java.util.List;
+import java.util.Optional;
 import org.apache.hertzbeat.common.entity.manager.bulletin.Bulletin;
 import org.apache.hertzbeat.common.entity.manager.bulletin.BulletinDto;
 import org.apache.hertzbeat.common.entity.manager.bulletin.BulletinVo;
@@ -40,6 +41,12 @@ public interface BulletinService {
      */
     List<Bulletin> listBulletin();
 
+    /**
+     * Get Bulletin by id
+     */
+    Optional<Bulletin> getBulletinById(Long id);
+
+
     /**
      * Save Bulletin
      */
diff --git 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/BulletinServiceImpl.java
 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/BulletinServiceImpl.java
index 2a7f885dd..db93d68b9 100644
--- 
a/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/BulletinServiceImpl.java
+++ 
b/manager/src/main/java/org/apache/hertzbeat/manager/service/impl/BulletinServiceImpl.java
@@ -23,6 +23,7 @@ package org.apache.hertzbeat.manager.service.impl;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.Optional;
 import java.util.stream.Collectors;
 import lombok.extern.slf4j.Slf4j;
 import org.apache.hertzbeat.common.entity.manager.bulletin.BulletinDto;
@@ -134,5 +135,13 @@ public class BulletinServiceImpl implements 
BulletinService {
         return new PageImpl<>(voList, pageRequest, total);
     }
 
-
+    /**
+     * Get Bulletin by id
+     *
+     * @param id
+     */
+    @Override
+    public Optional<Bulletin> getBulletinById(Long id) {
+        return bulletinDao.findById(id);
+    }
 }
diff --git a/web-app/src/app/routes/bulletin/bulletin.component.html 
b/web-app/src/app/routes/bulletin/bulletin.component.html
index 74ed14b40..081355aa7 100644
--- a/web-app/src/app/routes/bulletin/bulletin.component.html
+++ b/web-app/src/app/routes/bulletin/bulletin.component.html
@@ -59,6 +59,7 @@
 <nz-tabset nzType="card">
   <nz-tab *ngFor="let d of this.tabDefines" [nzTitle]="d.app">
     <nz-table
+      *ngIf="d.app === this.app"
       #fixedTable
       [nzData]="listOfData"
       [nzPageIndex]="pageIndex"
@@ -88,18 +89,7 @@
           <ng-container *ngFor="let column of listOfColumns">
             <td>{{ data[column.key] }}</td>
           </ng-container>
-          <td nzAlign="center" nzLeft></td>
           <td nzAlign="center">
-            <button
-              nz-button
-              nzType="primary"
-              (click)="onOpenConnectModal(data.id, data.app)"
-              nz-tooltip
-              [disabled]="data.app"
-              [nzTooltipTitle]="'alert.setting.connect' | i18n"
-            >
-              <i nz-icon nzType="link" nzTheme="outline"></i>
-            </button>
             <button
               nz-button
               nzType="primary"
diff --git a/web-app/src/app/routes/bulletin/bulletin.component.ts 
b/web-app/src/app/routes/bulletin/bulletin.component.ts
index d1005a857..71531e70f 100644
--- a/web-app/src/app/routes/bulletin/bulletin.component.ts
+++ b/web-app/src/app/routes/bulletin/bulletin.component.ts
@@ -20,7 +20,6 @@
 import { Component, Inject, OnInit } from '@angular/core';
 import { I18NService } from '@core';
 import { ALAIN_I18N_TOKEN } from '@delon/theme';
-import { NzCascaderFilter } from 'ng-zorro-antd/cascader';
 import { ModalButtonOptions, NzModalService } from 'ng-zorro-antd/modal';
 import { NzNotificationService } from 'ng-zorro-antd/notification';
 import { NzTableQueryParams } from 'ng-zorro-antd/table';
@@ -40,7 +39,6 @@ import { BulletinDefineService } from 
'../../service/bulletin-define.service';
 import { MonitorService } from '../../service/monitor.service';
 import { TagService } from '../../service/tag.service';
 
-
 @Component({
   selector: 'app-bulletin',
   templateUrl: './bulletin.component.html',
@@ -76,16 +74,17 @@ export class BulletinComponent implements OnInit {
   monitors: Monitor[] = [];
   loading: boolean = false;
   listOfData: any[] = [];
-  listOfColumns: { key: string, title: string }[] = [];
+  listOfColumns: Array<{ key: string; title: string }> = [];
   metrics: string[] = [];
 
-
-
+  id: any;
+  app: any;
+  metric: any;
+  fields: any;
+  valueRows: any;
   ngOnInit(): void {
     this.loadBulletinDefineTable();
     this.tabDefines = this.defines;
-    this.loadData(399136249983232, "basic");
-
   }
 
   sync() {
@@ -665,18 +664,30 @@ export class BulletinComponent implements OnInit {
           metricData$.unsubscribe();
           if (message.code === 0 && message.data) {
             const { id, app, metrics, fields, valueRows } = message.data;
-            this.listOfColumns = fields.map((field: { name: string; unit: any; 
}) => ({
-              key: field.name,
-              title: field.name.toUpperCase() + (field.unit ? ` 
(${field.unit})` : '')
-            }));
-            this.listOfData = valueRows.map((row: { labels: any; values: 
any[]; }) => {
-              const rowData: any = { ...row.labels };
-              row.values.forEach((value, index) => {
-                rowData[fields[index].name] = value.origin;
-              });
-              return rowData;
-            });
-
+            this.id = id;
+            this.app = app;
+            this.metric = metrics;
+            this.fields = fields;
+            this.valueRows = valueRows;
+
+            this.listOfColumns.push(
+              fields.map((field: { name: string; unit: any }) => ({
+                key: field.name,
+                title: field.name.toUpperCase() + (field.unit ? ` 
(${field.unit})` : '')
+              }))
+            );
+
+            this.listOfData.push(
+              valueRows.map((row: { labels: any; values: any[] }) => {
+                const rowData: any = { ...row.labels };
+                row.values.forEach((value, index) => {
+                  rowData[fields[index].name] = value.origin;
+                });
+                return rowData;
+              })
+            );
+
+            console.info(this.listOfData);
           } else if (message.code !== 0) {
             this.notifySvc.warning(`${metric}:${message.msg}`, '');
             console.info(`${metric}:${message.msg}`);


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

Reply via email to