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]