diff --git a/collector/src/main/java/org/apache/hertzbeat/collector/collect/telnet/TelnetCollectImpl.java b/collector/src/main/java/org/apache/hertzbeat/collector/collect/telnet/TelnetCollectImpl.java index 7f867a6907b..134e3d54d26 100644 --- a/collector/src/main/java/org/apache/hertzbeat/collector/collect/telnet/TelnetCollectImpl.java +++ b/collector/src/main/java/org/apache/hertzbeat/collector/collect/telnet/TelnetCollectImpl.java @@ -64,7 +64,7 @@ public void collect(CollectRep.MetricsData.Builder builder, long monitorId, Stri if (telnetClient.isConnected()) { long responseTime = System.currentTimeMillis() - startTime; List aliasFields = metrics.getAliasFields(); - Map resultMap = execCmdAndParseResult(telnetClient, telnet.getCmd()); + Map resultMap = execCmdAndParseResult(telnetClient, telnet.getCmd(), app); resultMap.put(CollectorConstants.RESPONSE_TIME, Long.toString(responseTime)); if (resultMap.size() < aliasFields.size()) { log.error("telnet response data not enough: {}", resultMap); @@ -115,7 +115,7 @@ public String supportProtocol() { return DispatchConstants.PROTOCOL_TELNET; } - private static Map execCmdAndParseResult(TelnetClient telnetClient, String cmd) throws IOException { + private static Map execCmdAndParseResult(TelnetClient telnetClient, String cmd, String app) throws IOException { if (cmd == null || cmd.trim().length() == 0) { return new HashMap<>(16); } @@ -124,6 +124,11 @@ private static Map execCmdAndParseResult(TelnetClient telnetClie outputStream.flush(); String result = new String(telnetClient.getInputStream().readAllBytes()); String[] lines = result.split("\n"); + if (CollectorConstants.ZOOKEEPER_APP.equals(app) && CollectorConstants.ZOOKEEPER_ENVI_HEAD.equals(lines[0])) { + lines = Arrays.stream(lines) + .skip(1) + .toArray(String[]::new); + } boolean contains = lines[0].contains("="); return Arrays.stream(lines) .map(item -> { diff --git a/common/src/main/java/org/apache/hertzbeat/common/constants/CollectorConstants.java b/common/src/main/java/org/apache/hertzbeat/common/constants/CollectorConstants.java index daa08f27012..ace1ea800bb 100644 --- a/common/src/main/java/org/apache/hertzbeat/common/constants/CollectorConstants.java +++ b/common/src/main/java/org/apache/hertzbeat/common/constants/CollectorConstants.java @@ -49,4 +49,8 @@ public interface CollectorConstants { * MongoDB Atlas model */ String MONGO_DB_ATLAS_MODEL = "mongodb-atlas"; + + String ZOOKEEPER_APP = "zookeeper"; + + String ZOOKEEPER_ENVI_HEAD = "Environment:"; } diff --git a/common/src/main/java/org/apache/hertzbeat/common/util/IntervalExpressionUtil.java b/common/src/main/java/org/apache/hertzbeat/common/util/IntervalExpressionUtil.java index 21901f87485..4fffd211277 100644 --- a/common/src/main/java/org/apache/hertzbeat/common/util/IntervalExpressionUtil.java +++ b/common/src/main/java/org/apache/hertzbeat/common/util/IntervalExpressionUtil.java @@ -49,7 +49,7 @@ private IntervalExpressionUtil() { * @return true-yes false-no */ public static boolean validNumberIntervalExpress(Double numberValue, String expression) { - if (expression == null || "".equals(expression)) { + if (expression == null || expression.isEmpty()) { return true; } if (numberValue == null) { @@ -64,12 +64,12 @@ public static boolean validNumberIntervalExpress(Double numberValue, String expr } Double[] doubleValues = new Double[2]; if (NEGATIVE.equals(values[0])) { - doubleValues[0] = Double.MIN_VALUE; + doubleValues[0] = Double.NEGATIVE_INFINITY; } else { doubleValues[0] = Double.parseDouble(values[0]); } if (POSITIVE.equals(values[1])) { - doubleValues[1] = Double.MAX_VALUE; + doubleValues[1] = Double.POSITIVE_INFINITY; } else { doubleValues[1] = Double.parseDouble(values[1]); } diff --git a/common/src/main/java/org/apache/hertzbeat/common/util/IpDomainUtil.java b/common/src/main/java/org/apache/hertzbeat/common/util/IpDomainUtil.java index 21d8d57dea1..886a5200e18 100644 --- a/common/src/main/java/org/apache/hertzbeat/common/util/IpDomainUtil.java +++ b/common/src/main/java/org/apache/hertzbeat/common/util/IpDomainUtil.java @@ -29,7 +29,7 @@ import org.springframework.util.StringUtils; /** - * ipv4 ipv6 domain util + * ipv4 ipv6 domain util. */ @Slf4j public final class IpDomainUtil { @@ -40,7 +40,7 @@ public final class IpDomainUtil { private static final String LOCALHOST = "localhost"; /** - * HTTP header schema + * HTTP header schema. */ private static final Pattern DOMAIN_SCHEMA = Pattern.compile("^([hH][tT]{2}[pP]://|[hH][tT]{2}[pP][sS]://){1}[^\\s]*"); @@ -48,7 +48,7 @@ private IpDomainUtil() { } /** - * whether it is ip or domain + * whether it is ip or domain. * @param ipDomain ip domain string * @return true-yes false-no */ @@ -70,7 +70,7 @@ public static boolean validateIpDomain(String ipDomain) { } /** - * if domain or ip has http / https schema + * if domain or ip has http / https schema. * @param domainIp host * @return true or false */ @@ -82,7 +82,7 @@ public static boolean isHasSchema(String domainIp) { } /** - * get localhost IP + * get localhost IP. * @return ip */ public static String getLocalhostIp() { @@ -108,7 +108,7 @@ public static String getLocalhostIp() { } /** - * + * check IP address type. * @param ipDomain ip domain * @return IP address type */ @@ -120,7 +120,7 @@ public static String checkIpAddressType(String ipDomain){ } /** - * get current local host name + * get current local host name. * @return hostname */ public static String getCurrentHostName() { diff --git a/common/src/test/java/org/apache/hertzbeat/common/util/IntervalExpressionUtilTest.java b/common/src/test/java/org/apache/hertzbeat/common/util/IntervalExpressionUtilTest.java index c6abaf34d1c..91c8e0314a3 100644 --- a/common/src/test/java/org/apache/hertzbeat/common/util/IntervalExpressionUtilTest.java +++ b/common/src/test/java/org/apache/hertzbeat/common/util/IntervalExpressionUtilTest.java @@ -17,19 +17,54 @@ package org.apache.hertzbeat.common.util; -import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + /** * Test case for {@link IntervalExpressionUtil} */ class IntervalExpressionUtilTest { - @BeforeEach - void setUp() { - } + @Test + public void testValidNumberIntervalExpress() { + + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(5.0, null)); + + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(5.0, "")); + + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(null, "(3,7)")); + + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(5.0, "(3,7)")); + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(3.0, "(3,7)")); + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(7.0, "(3,7)")); + + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(3.0, "[3,7]")); + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(7.0, "[3,7]")); + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(2.0, "[3,7]")); + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(8.0, "[3,7]")); + + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(3.0, "[3,7)")); + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(6.9999, "[3,7)")); + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(7.0, "[3,7)")); + + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(4.0, "(3,7]")); + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(7.0, "(3,7]")); + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(3.0, "(3,7]")); + + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(-1000.0, "(-∞,5)")); + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(-1.0, "(-∞,5)")); + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(5.0, "(-∞,5)")); + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(10.0, "(-∞,5)")); + + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(1000.0, "(5,+∞)")); + assertTrue(IntervalExpressionUtil.validNumberIntervalExpress(10.0, "(5,+∞)")); + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(5.0, "(5,+∞)")); + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(0.0, "(5,+∞)")); + + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(5.0, "(3,7")); + assertFalse(IntervalExpressionUtil.validNumberIntervalExpress(5.0, "[3,7)3,7]")); + } - @Test - void validNumberIntervalExpress() { - } } diff --git a/common/src/test/java/org/apache/hertzbeat/common/util/IpDomainUtilTest.java b/common/src/test/java/org/apache/hertzbeat/common/util/IpDomainUtilTest.java index 4e182a91a9d..a711d6515d8 100644 --- a/common/src/test/java/org/apache/hertzbeat/common/util/IpDomainUtilTest.java +++ b/common/src/test/java/org/apache/hertzbeat/common/util/IpDomainUtilTest.java @@ -17,9 +17,24 @@ package org.apache.hertzbeat.common.util; +import java.net.Inet4Address; +import java.net.InetAddress; +import java.net.NetworkInterface; +import java.net.SocketException; +import java.util.Collections; +import java.util.Enumeration; + +import org.apache.hertzbeat.common.constants.CollectorConstants; +import org.junit.jupiter.api.Test; +import org.mockito.MockedStatic; +import org.mockito.Mockito; + +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertNull; import static org.junit.jupiter.api.Assertions.assertTrue; -import org.junit.jupiter.api.Test; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.when; /** * Test case for {@link IpDomainUtil} @@ -56,4 +71,63 @@ void isHasSchema() { assertFalse(IpDomainUtil.isHasSchema("www.baidu.com")); assertFalse(IpDomainUtil.isHasSchema("https_www.baidu.com")); } + + @Test + void testGetLocalhostIp() throws SocketException { + + // Success + InetAddress mockedInetAddress = mock(Inet4Address.class); + when(mockedInetAddress.getHostAddress()).thenReturn("192.168.1.100"); + + NetworkInterface mockedNetworkInterface = mock(NetworkInterface.class); + when(mockedNetworkInterface.isLoopback()).thenReturn(false); + when(mockedNetworkInterface.isVirtual()).thenReturn(false); + when(mockedNetworkInterface.isUp()).thenReturn(true); + + Enumeration inetAddresses = Collections.enumeration(Collections.singletonList(mockedInetAddress)); + when(mockedNetworkInterface.getInetAddresses()).thenReturn(inetAddresses); + + Enumeration successNetworkInterfaces = Collections.enumeration(Collections.singletonList(mockedNetworkInterface)); + + try (MockedStatic mockedStaticNetworkInterface = Mockito.mockStatic(NetworkInterface.class)) { + mockedStaticNetworkInterface.when(NetworkInterface::getNetworkInterfaces).thenReturn(successNetworkInterfaces); + String localhostIp = IpDomainUtil.getLocalhostIp(); + + assertEquals("192.168.1.100", localhostIp); + } + + // no network interface + Enumeration noNetworkIFNetworkInterfaces = Collections.enumeration(Collections.emptyList()); + + try (MockedStatic mockedStaticNetworkInterface = Mockito.mockStatic(NetworkInterface.class)) { + mockedStaticNetworkInterface.when(NetworkInterface::getNetworkInterfaces).thenReturn(noNetworkIFNetworkInterfaces); + String localhostIp = IpDomainUtil.getLocalhostIp(); + + assertNull(localhostIp); + } + + // throw exception + try (MockedStatic mockedStaticNetworkInterface = Mockito.mockStatic(NetworkInterface.class)) { + mockedStaticNetworkInterface.when(NetworkInterface::getNetworkInterfaces).thenThrow(new RuntimeException("Test exception")); + String localhostIp = IpDomainUtil.getLocalhostIp(); + + assertNull(localhostIp); + } + + } + + @Test + void testCheckIpAddressType() { + + assertEquals(CollectorConstants.IPV4, IpDomainUtil.checkIpAddressType("192.168.1.1")); + assertEquals(CollectorConstants.IPV4, IpDomainUtil.checkIpAddressType("127.0.0.1")); + + assertEquals(CollectorConstants.IPV6, IpDomainUtil.checkIpAddressType("2001:0db8:85a3:0000:0000:8a2e:0370:7334")); + assertEquals(CollectorConstants.IPV6, IpDomainUtil.checkIpAddressType("::1")); + + assertEquals(CollectorConstants.IPV4, IpDomainUtil.checkIpAddressType("")); + assertEquals(CollectorConstants.IPV4, IpDomainUtil.checkIpAddressType(null)); + assertEquals(CollectorConstants.IPV4, IpDomainUtil.checkIpAddressType("invalid-ip")); + + } } diff --git a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/contribution.md b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/contribution.md index bd711d8e23a..8cd528bb7e5 100644 --- a/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/contribution.md +++ b/home/i18n/zh-cn/docusaurus-plugin-content-docs/current/community/contribution.md @@ -27,15 +27,15 @@ sidebar_position: 0 > 在 HertzBeat 社区,贡献方式有很多: -- 💻**代码**:可以帮助社区完成一些任务、编写新的feature或者是修复一些bug; +- 💻**代码**:可以帮助社区完成一些任务、编写新的 feature 或者是修复一些 bug; -- ⚠️**测试**:可以来参与测试代码的编写,包括了单元测试、集成测试、e2e测试; +- ⚠️**测试**:可以来参与测试代码的编写,包括了单元测试、集成测试、e2e 测试; - 📖**文档**:可以编写或完善文档,来帮助用户更好地了解和使用 HertzBeat; - 📝**博客**:可以撰写 HertzBeat 的相关文章,来帮助社区更好地推广; -- 🤔**讨论**:可以参与 HertzBeat 新的feature的讨论,将您的想法跟 HertzBeat 融合; +- 🤔**讨论**:可以参与 HertzBeat 新的 feature 的讨论,将您的想法跟 HertzBeat 融合; - 💡**布道**:可以帮助宣传或推广 HertzBeat 社区,在 meetup 或 summit 中演讲; @@ -62,31 +62,31 @@ sidebar_position: 0 #### 前端启动 -1. 需要 `nodejs yarn` 环境, Make sure `Node.js >= 18` +1. 需要 `nodejs yarn` 环境, 确保 `Node.js >= 18` 2. 进入 `web-app` 目录: `cd web-app` -3. 安装yarn: `npm install -g yarn` +3. 安装 yarn: `npm install -g yarn` 4. 在前端工程目录 `web-app` 下执行: `yarn install` or `yarn install --registry=https://registry.npmmirror.com` in `web-app` 5. 全局安装 `angular-cli`: `yarn global add @angular/cli@15` or `yarn global add @angular/cli@15 --registry=https://registry.npmmirror.com` -6. 待本地后端启动后,在web-app目录下启动本地前端 `ng serve --open` +6. 待本地后端启动后,在 web-app 目录下启动本地前端 `ng serve --open` 7. 浏览器访问 localhost:4200 即可开始,默认账号密码 **admin/hertzbeat** ### 寻找任务 -寻找您感兴趣的Issue!在我们的GitHub仓库和邮件列表中,我们经常会发布一些带有 good first issue 或者 status: volunteer wanted 标签的issue,这些issue都欢迎贡献者的帮助。 -其中good first issue往往门槛较低、适合新手。 +寻找您感兴趣的 Issue!在我们的 GitHub 仓库和邮件列表中,我们经常会发布一些带有 good first issue 或者 status: volunteer wanted 标签的 issue,这些issue都欢迎贡献者的帮助。 +其中 good first issue 往往门槛较低、适合新手。 -当然,如果您有好的想法,也可以直接在GitHub Discussion 中提出或者联系社区。 +当然,如果您有好的想法,也可以直接在 GitHub Discussion 中提出或者联系社区。 ### 提交 Pull Request 1. 首先您需要 Fork 目标仓库 [hertzbeat repository](https://github.com/apache/hertzbeat). -2. 然后 用git命令 将代码下载到本地: +2. 然后 用 git 命令 将代码下载到本地: ```shell git clone git@github.com:${YOUR_USERNAME}/hertzbeat.git #Recommended ``` @@ -95,7 +95,7 @@ git clone git@github.com:${YOUR_USERNAME}/hertzbeat.git #Recommended ```shell git checkout -b a-feature-branch #Recommended ``` -5. 提交 commit , commit 描述信息需要符合约定格式: [module name or type name]feature or bugfix or doc: custom message. +5. 提交 commit, commit 描述信息需要符合约定格式: [module name or type name]feature or bugfix or doc: custom message. ```shell git add git commit -m '[docs]feature: necessary instructions' #Recommended @@ -135,7 +135,7 @@ git checkout master git pull upstream master ``` -### 如何成为Committer? +### 如何成为 Committer? 通过上述步骤,您就是 HertzBeat 的贡献者了。重复前面的步骤,在社区中保持活跃,坚持下去,您就能成为 Committer! diff --git a/manager/src/main/resources/define/app-zookeeper.yml b/manager/src/main/resources/define/app-zookeeper.yml index dea1f4e8dd5..7708c94beef 100644 --- a/manager/src/main/resources/define/app-zookeeper.yml +++ b/manager/src/main/resources/define/app-zookeeper.yml @@ -242,3 +242,119 @@ metrics: port: ^_^port^_^ timeout: ^_^timeout^_^ cmd: mntr + - name: envi + priority: 1 + fields: + - field: zk_version + type: 1 + i18n: + zh-CN: ZooKeeper版本 + en-US: ZooKeeper Version + - field: hostname + type: 1 + i18n: + zh-CN: 主机名 + en-US: Host Name + - field: java_version + type: 1 + i18n: + zh-CN: Java版本 + en-US: Java Version + - field: java_vendor + type: 1 + i18n: + zh-CN: Java供应商 + en-US: Java Vendor + - field: java_home + type: 1 + i18n: + zh-CN: Java主目录 + en-US: Java Home + - field: java_class_path + type: 1 + i18n: + zh-CN: Java类路径 + en-US: Java Class Path + - field: java_library_path + type: 1 + i18n: + zh-CN: Java库路径 + en-US: Java Library Path + - field: java_io_tmpdir + type: 1 + i18n: + zh-CN: Java临时目录 + en-US: Java IO Temp Directory + - field: java_compiler + type: 1 + i18n: + zh-CN: Java编译器 + en-US: Java Compiler + - field: os_name + type: 1 + i18n: + zh-CN: 操作系统名称 + en-US: OS Name + - field: os_arch + type: 1 + i18n: + zh-CN: 操作系统架构 + en-US: OS Architecture + - field: os_version + type: 1 + i18n: + zh-CN: 操作系统版本 + en-US: OS Version + - field: user_name + type: 1 + i18n: + zh-CN: 用户名 + en-US: User Name + - field: user_home + type: 1 + i18n: + zh-CN: 用户主目录 + en-US: User Home + - field: user_dir + type: 1 + i18n: + zh-CN: 用户当前目录 + en-US: User Directory + aliasFields: + - zookeeper.version + - host.name + - java.version + - java.vendor + - user.dir + - java.home + - java.class.path + - java.library.path + - java.io.tmpdir + - java.compiler + - os.name + - os.arch + - os.version + - user.name + - user.home + calculates: + - zk_version=zookeeper.version + - hostname=host.name + - java_version=java.version + - java_vendor=java.vendor + - user_dir=user.dir + - java_home=java.home + - java_class_path=java.class.path + - java_library_path=java.library.path + - java_io_tmpdir=java.io.tmpdir + - java_compiler=java.compiler + - os_name=os.name + - os_arch=os.arch + - os_version=os.version + - user_name=user.name + - user_home=user.home + protocol: telnet + telnet: + host: ^_^host^_^ + port: ^_^port^_^ + timeout: ^_^timeout^_^ + cmd: envi \ No newline at end of file diff --git a/web-app/src/app/routes/alert/alert-center/alert-center.component.html b/web-app/src/app/routes/alert/alert-center/alert-center.component.html index 651b40f45cb..84203ac8ba3 100644 --- a/web-app/src/app/routes/alert/alert-center/alert-center.component.html +++ b/web-app/src/app/routes/alert/alert-center/alert-center.component.html @@ -75,16 +75,12 @@ - diff --git a/web-app/src/app/routes/alert/alert-converge/alert-converge.component.html b/web-app/src/app/routes/alert/alert-converge/alert-converge.component.html index 29f3a0f6985..a7a86cc73c3 100644 --- a/web-app/src/app/routes/alert/alert-converge/alert-converge.component.html +++ b/web-app/src/app/routes/alert/alert-converge/alert-converge.component.html @@ -41,18 +41,12 @@ - - diff --git a/web-app/src/app/routes/alert/alert-setting/alert-setting.component.html b/web-app/src/app/routes/alert/alert-setting/alert-setting.component.html index 4bd07dd0d51..b25c9978b1d 100755 --- a/web-app/src/app/routes/alert/alert-setting/alert-setting.component.html +++ b/web-app/src/app/routes/alert/alert-setting/alert-setting.component.html @@ -63,18 +63,12 @@ - - @@ -501,27 +495,16 @@ - - - {{ 'tag.bind' | i18n }} - - - - {{ sliceTagName(tag) }} - - - - - {{ 'tag.new' | i18n }} - - - - + {{ 'alert.setting.default' | i18n }} @@ -555,52 +538,6 @@ - - -
- - - - - - - {{ 'tag' | i18n }} - - - - - - - {{ data.name }} - - {{ data.name + ':' + data.tagValue }} - - - - - -
-
- item !== tag); - } - } - - sliceTagName(tag: TagItem): string { - if (tag.value != undefined && tag.value.trim() != '') { - return `${tag.name}:${tag.value}`; - } else { - return tag.name; - } - } - // end 新增修改告警定义model - // start Tag model - isTagManageModalVisible = false; - isTagManageModalOkLoading = false; - tagCheckedAll: boolean = false; - tagTableLoading = false; - tagSearch!: string; - tags!: Tag[]; - checkedTags = new Set(); - loadTagsTable() { - this.tagTableLoading = true; - let tagsReq$ = this.tagSvc.loadTags(this.tagSearch, 1, 0, 1000).subscribe( - message => { - this.tagTableLoading = false; - this.tagCheckedAll = false; - this.checkedTags.clear(); - if (message.code === 0) { - let page = message.data; - this.tags = page.content; - } else { - console.warn(message.msg); - } - tagsReq$.unsubscribe(); - }, - error => { - this.tagTableLoading = false; - tagsReq$.unsubscribe(); - } - ); - } - onShowTagsModal() { - this.isTagManageModalVisible = true; - this.loadTagsTable(); - } - onTagManageModalCancel() { - this.isTagManageModalVisible = false; - } - onTagManageModalOk() { - this.isTagManageModalOkLoading = true; - this.checkedTags.forEach(item => { - if (this.define.tags.find(tag => tag.name == item.name && tag.value == item.tagValue) == undefined) { - this.define.tags.push({ name: item.name, value: item.tagValue }); - } - }); - this.isTagManageModalOkLoading = false; - this.isTagManageModalVisible = false; - } - onTagAllChecked(checked: boolean) { - if (checked) { - this.tags.forEach(tag => this.checkedTags.add(tag)); - } else { - this.checkedTags.clear(); - } - } - onTagItemChecked(tag: Tag, checked: boolean) { - if (checked) { - this.checkedTags.add(tag); - } else { - this.checkedTags.delete(tag); - } - } - // end tag model - // start 告警定义与监控关联model isConnectModalVisible = false; isConnectModalOkLoading = false; diff --git a/web-app/src/app/routes/alert/alert-silence/alert-silence.component.html b/web-app/src/app/routes/alert/alert-silence/alert-silence.component.html index f20ebb7989b..728c9e8b26a 100755 --- a/web-app/src/app/routes/alert/alert-silence/alert-silence.component.html +++ b/web-app/src/app/routes/alert/alert-silence/alert-silence.component.html @@ -41,18 +41,12 @@ - - diff --git a/web-app/src/app/routes/monitor/monitor-data-table/monitor-data-table.component.html b/web-app/src/app/routes/monitor/monitor-data-table/monitor-data-table.component.html index b1228176c06..019ef5535a2 100644 --- a/web-app/src/app/routes/monitor/monitor-data-table/monitor-data-table.component.html +++ b/web-app/src/app/routes/monitor/monitor-data-table/monitor-data-table.component.html @@ -23,7 +23,7 @@ [nzBordered]="true" [nzBodyStyle]="{ overflow: !monitor ? 'hidden' : 'auto' }" [nzTitle]="card_title" - [nzLoading]="loading" + [nzLoading]="!app || loading" [nzExtra]="!monitor ? metrics_card_extra : monitor_card_extra" >
diff --git a/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.html b/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.html index 1509f88c7ab..03cf5e9b86e 100755 --- a/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.html +++ b/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.html @@ -35,7 +35,7 @@ {{ 'monitors.detail' | i18n }} - + {{ 'monitor.app.' + app | i18n }} @@ -43,6 +43,7 @@ + diff --git a/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.ts b/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.ts index 31f8c08f199..228557ecbb0 100644 --- a/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.ts +++ b/web-app/src/app/routes/monitor/monitor-detail/monitor-detail.component.ts @@ -61,9 +61,8 @@ export class MonitorDetailComponent implements OnInit, OnDestroy { showBasic = true; ngOnInit(): void { - this.loadRealTimeMetric(); this.countDownTime = this.deadline; - this.interval$ = setInterval(this.countDown.bind(this), 1000); + this.loadRealTimeMetric(); } loadMetricChart() { @@ -157,6 +156,9 @@ export class MonitorDetailComponent implements OnInit, OnDestroy { } else { console.warn(message.msg); } + if (this.interval$ === undefined) { + this.interval$ = setInterval(this.countDown.bind(this), 1000); + } this.isSpinning = false; }, error => { @@ -166,10 +168,6 @@ export class MonitorDetailComponent implements OnInit, OnDestroy { ); } - showBasicStatus(show: boolean) { - this.showBasic = show; - } - countDown() { if (this.deadline > 0) { this.countDownTime = Math.max(0, this.countDownTime - 1); diff --git a/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html b/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html index ec345670462..172ead21410 100755 --- a/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html +++ b/web-app/src/app/routes/monitor/monitor-list/monitor-list.component.html @@ -30,6 +30,7 @@ [module_name]="'menu.monitor.center'" [icon_name]="'laptop'" > + @@ -102,8 +103,7 @@ - diff --git a/web-app/src/app/routes/setting/collector/collector.component.html b/web-app/src/app/routes/setting/collector/collector.component.html index 477759ebcb1..b2db37b778b 100644 --- a/web-app/src/app/routes/setting/collector/collector.component.html +++ b/web-app/src/app/routes/setting/collector/collector.component.html @@ -53,19 +53,13 @@ - - diff --git a/web-app/src/app/routes/setting/tags/tags.component.html b/web-app/src/app/routes/setting/tags/tags.component.html index 84d8c5e395c..3c7d26eed88 100644 --- a/web-app/src/app/routes/setting/tags/tags.component.html +++ b/web-app/src/app/routes/setting/tags/tags.component.html @@ -42,19 +42,13 @@ - - diff --git a/web-app/src/app/shared/components/form-item/form-item.component.html b/web-app/src/app/shared/components/form-item/form-item.component.html index 3865f54a448..934d6286dac 100644 --- a/web-app/src/app/shared/components/form-item/form-item.component.html +++ b/web-app/src/app/shared/components/form-item/form-item.component.html @@ -205,7 +205,7 @@
- - + + + + + + + + diff --git a/web-app/src/app/shared/components/toolbar/toolbar.component.less b/web-app/src/app/shared/components/toolbar/toolbar.component.less index a347662c5e3..f8b2c082ba6 100755 --- a/web-app/src/app/shared/components/toolbar/toolbar.component.less +++ b/web-app/src/app/shared/components/toolbar/toolbar.component.less @@ -11,5 +11,10 @@ .container:first-child { gap: 0px; + justify-content: flex-start; + } + + .container:last-child { + justify-content: flex-end; } }