Compare commits
11 Commits
bugfix#ora
...
feature#ro
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
2026d0e34f | ||
|
|
39d31ad196 | ||
|
|
70c31f1db7 | ||
|
|
589d178586 | ||
|
|
7c54bf0203 | ||
|
|
2bb8cee087 | ||
|
|
d660879cc9 | ||
|
|
9d8106fcdf | ||
|
|
c8d2b1ed48 | ||
|
|
b7eaabad1d | ||
|
|
08a70092ee |
@@ -6,7 +6,7 @@
|
||||
|
||||
[comment]: <> (<img alt="sureness" src="https://cdn.jsdelivr.net/gh/dromara/hertzbeat/home/static/img/hertzbeat-brand.svg" width="300">)
|
||||
|
||||
## HertzBeat 赫兹跳动
|
||||
## HertzBeat 赫兹跳动 | [English Documentation](README_EN.md)
|
||||
|
||||
> 易用友好的监控告警系统。
|
||||
|
||||
@@ -62,6 +62,8 @@
|
||||
- 如果您不想部署而是直接使用,我们提供SAAS监控云-[TanCloud探云](https://console.tancloud.cn),即刻 **[登录注册](https://console.tancloud.cn)** 免费使用。
|
||||
- 如果您是想将HertzBeat部署到内网环境搭建监控系统,请参考下面的 [部署文档](https://hertzbeat.com/docs/start/quickstart) 进行操作。
|
||||
|
||||
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
|
||||
|
||||
### 🐵 依赖服务部署
|
||||
|
||||
> HertzBeat最少依赖于 关系型数据库[MYSQL5+](https://www.mysql.com/) 和 时序性数据库[TDengine2+](https://www.taosdata.com/getting-started)
|
||||
|
||||
148
README_EN.md
Normal file
148
README_EN.md
Normal file
@@ -0,0 +1,148 @@
|
||||
<p align="center">
|
||||
<a href="https://hertzbeat.com">
|
||||
<img alt="hertzbeat" src="https://cdn.jsdelivr.net/gh/dromara/hertzbeat/home/static/img/hertzbeat-brand.svg" width="260">
|
||||
</a>
|
||||
</p>
|
||||
|
||||
[comment]: <> (<img alt="sureness" src="https://cdn.jsdelivr.net/gh/dromara/hertzbeat/home/static/img/hertzbeat-brand.svg" width="300">)
|
||||
|
||||
## HertzBeat | [中文文档](README.md)
|
||||
|
||||
> Friendly cloud monitoring system.
|
||||
|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||

|
||||
|
||||
**Home: [hertzbeat.com](https://hertzbeat.com) | [tancloud.cn](https://tancloud.cn)**
|
||||
|
||||
## 🎡 <font color="green">Introduction</font>
|
||||
|
||||
> [HertzBeat](https://github.com/dromara/hertzbeat) is an opensource monitoring and alarm project incubated by [Dromara](https://dromara.org) and open sourced by [TanCloud](https://tancloud.cn), which supports Website, API, PING, Port, Database, OS Monitor etc.
|
||||
> We also provide **[Monitoring Cloud For Saas](https://console.tancloud.cn)**, people no longer need to deploy a cumbersome monitoring system in order to monitor their website resources. **[Sign in to get started for free](https://console.tancloud.cn)**.
|
||||
> HertzBeat supports more liberal threshold alarm configuration (calculation expression), supports alarm notification, alarm template, email, DingDing, WeChat FeiShu and WebHook.
|
||||
> Most important is HertzBeat supports [Custom Monitoring](https://hertzbeat.com/docs/advanced/extend-point), just by configuring the YML file, we can customize the monitoring types and metrics what we need.
|
||||
> HertzBeat is modular, `manager, collector, scheduler, warehouse, alerter` modules are decoupled for easy understanding and custom development.
|
||||
> Welcome to HertzBeat's [Cloud Environment TanCloud](https://console.tancloud.cn) to try and discover more.
|
||||
> Welcome to join us to build hertzbeat together.
|
||||
|
||||
> `HertzBeat`'s multi-type support, easy expansion, low coupling, hope to help developers and micro teams to quickly build their own monitoring system.
|
||||
|
||||
----
|
||||
|
||||
[](https://www.bilibili.com/video/BV1DY4y1i7ts)
|
||||
|
||||
----
|
||||
|
||||
## 🥐 Architecture
|
||||
|
||||
- **[manager](https://github.com/dromara/hertzbeat/tree/master/manager)** Provide monitoring management, system management basic services.
|
||||
> Provides monitoring management, monitoring configuration management, system user management, etc.
|
||||
- **[collector](https://github.com/dromara/hertzbeat/tree/master/collector)** Provide metrics data collection services.
|
||||
> Use common protocols to remotely collect and obtain peer-to-peer metrics data.
|
||||
- **[scheduler](https://github.com/dromara/hertzbeat/tree/master/scheduler)** Provide monitoring task scheduling service.
|
||||
> Collection task management, scheduling and distribution of one-time tasks and periodic tasks.
|
||||
- **[warehouse](https://github.com/dromara/hertzbeat/tree/master/warehouse)** Provide monitoring data warehousing services.
|
||||
> Metrics data management, data query, calculation and statistics.
|
||||
- **[alerter](https://github.com/dromara/hertzbeat/tree/master/alerter)** Provide alert service.
|
||||
> Alarm calculation trigger, monitoring status linkage, alarm configuration, and alarm notification.
|
||||
- **[web-app](https://github.com/dromara/hertzbeat/tree/master/web-app)** Provide web ui.
|
||||
> Angular Web UI.
|
||||
|
||||

|
||||
|
||||
|
||||
## 🐕 Quick Start
|
||||
|
||||
- If you don’t want to deploy but use it directly, we provide [SAAS Monitoring Cloud-TanCloud](https://console.tancloud.cn), **[Log In And Register For Free](https://console.tancloud.cn) **.
|
||||
- If you want to deploy HertzBeat local, please refer to the following [Deployment Documentation](https://hertzbeat.com/docs/start/quickstart) for operation.
|
||||
|
||||
### 🐵 Dependency Service Deployment
|
||||
|
||||
> HertzBeat depends at least on relational database [MYSQL5+](https://www.mysql.com/) and time series database [TDengine2+](https://www.taosdata.com/getting-started)
|
||||
|
||||
##### Install MYSQL
|
||||
1. Install mysql with docker
|
||||
`docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7`
|
||||
2. Create database names `hertzbeat`
|
||||
3. Run the database sql script [schema.sql](https://gitee.com/dromara/hertzbeat/raw/master/script/sql/schema.sql) located in the project repository `/script/sql/` directory.
|
||||
|
||||
For detailed steps, refer to [MYSQL Installation And Initialization](https://hertzbeat.com/docs/start/mysql-init)
|
||||
|
||||
##### Install TDengine
|
||||
1. Install TDengine with docker
|
||||
`docker run -d -p 6030-6049:6030-6049 -p 6030-6049:6030-6049/udp --name tdengine tdengine/tdengine:2.4.0.12`
|
||||
2. Create database names `hertzbeat`
|
||||
|
||||
For detailed steps, refer to [TDengine Installation And Initialization](https://hertzbeat.com/docs/start/tdengine-init).
|
||||
|
||||
### 🍞 Install HertzBeat
|
||||
|
||||
> HertzBeat supports installation through source code, docker or package.
|
||||
|
||||
##### 1:Install quickly via docker
|
||||
`docker run -d -p 1157:1157 -v /opt/application.yml:/opt/hertzbeat/config/application.yml --name hertzbeat tancloud/hertzbeat:[版本tag]`
|
||||
|
||||
Detailed steps refer to [Install HertzBeat via Docker](https://hertzbeat.com/docs/start/docker-deploy)
|
||||
|
||||
##### 2:Install via package
|
||||
1. Download the installation package [GITEE Release](https://gitee.com/dromara/hertzbeat/releases) [GITHUB Release](https://github.com/dromara/hertzbeat/releases)
|
||||
2. Configure the HertzBeat configuration yml file `hertzbeat/config/application.yml`
|
||||
3. Run shell `$ ./startup.sh `
|
||||
4. Access `localhost:1157` to start, default account: `admin/admin`
|
||||
|
||||
Detailed steps refer to [Install HertzBeat via package](https://hertzbeat.com/docs/start/package-deploy)
|
||||
|
||||
##### 3:Start via source code
|
||||
1. Local source code debugging needs to start the back-end project manager and the front-end project web-app.
|
||||
2. Backend:need `maven3+`, `java8+`, start the manager service.
|
||||
3. Web:need `nodejs npm angular-cli` environment, Run `ng serve --open` in `web-app` directory after backend startup.
|
||||
4. Access `localhost:4200` to start, default account: `admin/admin`
|
||||
|
||||
Detailed steps refer to [CONTRIBUTING](CONTRIBUTING.md)
|
||||
|
||||
##### 4:Install All(mysql+tdengine+hertzbeat) via Docker-compose
|
||||
|
||||
Install and deploy the mysql database, tdengine database and hertzbeat at one time through [docker-compose deployment script](script/docker-compose).
|
||||
|
||||
Detailed steps refer to [docker-compose install](script/docker-compose/README.md)
|
||||
|
||||
**HAVE FUN**
|
||||
|
||||
## 💬 Join discussion
|
||||
|
||||
HertzBeat is an incubation project of [Dromara Open Source Community](https://dromara.org/).
|
||||
|
||||
##### WeChat Group
|
||||
|
||||
Add WeChat account `tan-cloud` or scan the QR code below to pull you into the WeChat group.
|
||||
|
||||
<img alt="tan-cloud" src="https://cdn.jsdelivr.net/gh/dromara/hertzbeat@gh-pages/img/docs/help/tan-cloud-wechat.jpg" width="200"/>
|
||||
|
||||
##### QQ Group
|
||||
|
||||
QQ group number `718618151` or scan the group QR code below, verify code: `tancloud`
|
||||
|
||||
<img alt="tan-cloud" src="https://cdn.jsdelivr.net/gh/dromara/hertzbeat@gh-pages/img/docs/help/qq-qr.jpg" width="200"/>
|
||||
|
||||
##### Github Discussion
|
||||
|
||||
Welcome to Discuss in [Github Discussion](https://github.com/dromara/hertzbeat/discussions)
|
||||
|
||||
##### Public WeChat
|
||||
|
||||
<img alt="tan-cloud" src="https://cdn.jsdelivr.net/gh/dromara/hertzbeat/home/static/img/wechat.png" width="400"/>
|
||||
|
||||
##### Sponsor
|
||||
|
||||
Thanks [吉实信息(构建全新的微波+光交易网络)](https://www.flarespeed.com) sponsored server node.
|
||||
Thanks [天上云计算(全新智慧上云)](https://www.tsyvps.com/aff/BZBEGYLX) sponsored server node.
|
||||
|
||||
## 🛡️ License
|
||||
[`Apache License, Version 2.0`](https://www.apache.org/licenses/LICENSE-2.0.html)
|
||||
@@ -1,10 +1,12 @@
|
||||
package com.usthe.alert;
|
||||
|
||||
import org.springframework.beans.factory.annotation.Value;
|
||||
import org.springframework.boot.context.properties.ConfigurationProperties;
|
||||
import org.springframework.stereotype.Component;
|
||||
|
||||
/**
|
||||
* 数据仓储配置属性
|
||||
*
|
||||
* @author tom
|
||||
* @date 2021/11/24 10:38
|
||||
*/
|
||||
@@ -12,11 +14,22 @@ import org.springframework.stereotype.Component;
|
||||
@ConfigurationProperties(prefix = "alerter")
|
||||
public class AlerterProperties {
|
||||
|
||||
private String consoleUrl = "https://console.tancloud.cn";
|
||||
|
||||
public String getConsoleUrl() {
|
||||
return consoleUrl;
|
||||
}
|
||||
|
||||
public void setConsoleUrl(String url) {
|
||||
this.consoleUrl = url;
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据入口配置属性
|
||||
*/
|
||||
private EntranceProperties entrance;
|
||||
|
||||
|
||||
public EntranceProperties getEntrance() {
|
||||
return entrance;
|
||||
}
|
||||
@@ -25,6 +38,7 @@ public class AlerterProperties {
|
||||
this.entrance = entrance;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* 数据入口配置属性
|
||||
* 入口可以是从kafka rabbitmq rocketmq等消息中间件获取数据
|
||||
@@ -98,4 +112,5 @@ public class AlerterProperties {
|
||||
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -7,34 +7,43 @@ import org.springframework.data.jpa.repository.JpaSpecificationExecutor;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* AlertDefineBind 数据库操作
|
||||
* AlertDefineBind database operations 数据库操作
|
||||
*
|
||||
* @author tom
|
||||
* @date 2021/12/9 10:03
|
||||
*/
|
||||
public interface AlertDefineBindDao extends JpaRepository<AlertDefineMonitorBind, Long>, JpaSpecificationExecutor<AlertDefineMonitorBind> {
|
||||
|
||||
/**
|
||||
* Delete the alarm definition and monitor association based on the alarm definition ID
|
||||
* 根据告警定义ID删除告警定义与监控关联
|
||||
* @param alertDefineId 告警定义ID
|
||||
*
|
||||
* @param alertDefineId Alarm Definition ID 告警定义ID
|
||||
*/
|
||||
void deleteAlertDefineBindsByAlertDefineIdEquals(Long alertDefineId);
|
||||
|
||||
/**
|
||||
* Deleting alarms based on monitoring IDs defines monitoring associations
|
||||
* 根据监控ID删除告警定义监控关联
|
||||
* @param monitorId 监控ID
|
||||
*
|
||||
* @param monitorId Monitor Id 监控ID
|
||||
*/
|
||||
void deleteAlertDefineMonitorBindsByMonitorIdEquals(Long monitorId);
|
||||
|
||||
/**
|
||||
* Delete alarm definition monitoring association based on monitoring ID list
|
||||
* 根据监控ID列表删除告警定义监控关联
|
||||
* @param monitorIds 监控ID列表
|
||||
*
|
||||
* @param monitorIds Monitoring ID List 监控ID列表
|
||||
*/
|
||||
void deleteAlertDefineMonitorBindsByMonitorIdIn(List<Long> monitorIds);
|
||||
|
||||
/**
|
||||
* Query monitoring related information based on alarm definition ID
|
||||
* 根据告警定义ID查询监控关联信息
|
||||
* @param alertDefineId 告警定义ID
|
||||
* @return 关联监控信息
|
||||
*
|
||||
* @param alertDefineId Alarm Definition ID 告警定义ID
|
||||
* @return Associated monitoring information 关联监控信息
|
||||
*/
|
||||
List<AlertDefineMonitorBind> getAlertDefineBindsByAlertDefineIdEquals(Long alertDefineId);
|
||||
}
|
||||
|
||||
@@ -115,6 +115,11 @@
|
||||
<artifactId>ojdbc8</artifactId>
|
||||
<version>21.5.0.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.oracle.database.nls</groupId>
|
||||
<artifactId>orai18n</artifactId>
|
||||
<version>21.5.0.0</version>
|
||||
</dependency>
|
||||
</dependencies>
|
||||
|
||||
</project>
|
||||
@@ -15,6 +15,7 @@ import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* 采集job管理提供api接口
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/6 13:58
|
||||
*/
|
||||
@@ -26,9 +27,11 @@ public class CollectJobService {
|
||||
private TimerDispatch timerDispatch;
|
||||
|
||||
/**
|
||||
* Execute a one-time collection task and get the collected data response
|
||||
* 执行一次性采集任务,获取采集数据响应
|
||||
* @param job 采集任务详情
|
||||
* @return 采集结果
|
||||
*
|
||||
* @param job Collect task details 采集任务详情
|
||||
* @return Collection results 采集结果
|
||||
*/
|
||||
public List<CollectRep.MetricsData> collectSyncJobData(Job job) {
|
||||
final List<CollectRep.MetricsData> metricsData = new LinkedList<>();
|
||||
@@ -52,9 +55,11 @@ public class CollectJobService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Issue periodic asynchronous collection tasks
|
||||
* 下发周期性异步采集任务
|
||||
* @param job 采集任务详情
|
||||
* @return long 任务ID
|
||||
*
|
||||
* @param job Collect task details 采集任务详情
|
||||
* @return long Job ID 任务ID
|
||||
*/
|
||||
public long addAsyncCollectJob(Job job) {
|
||||
if (job.getId() == 0L) {
|
||||
@@ -66,8 +71,10 @@ public class CollectJobService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Update the periodic asynchronous collection tasks that have been delivered
|
||||
* 更新已经下发的周期性异步采集任务
|
||||
* @param modifyJob 采集任务详情
|
||||
*
|
||||
* @param modifyJob Collect task details 采集任务详情
|
||||
*/
|
||||
public void updateAsyncCollectJob(Job modifyJob) {
|
||||
timerDispatch.deleteJob(modifyJob.getId(), true);
|
||||
@@ -75,8 +82,10 @@ public class CollectJobService {
|
||||
}
|
||||
|
||||
/**
|
||||
* Cancel periodic asynchronous collection tasks
|
||||
* 取消周期性异步采集任务
|
||||
* @param jobId 任务ID
|
||||
*
|
||||
* @param jobId Job ID 任务ID
|
||||
*/
|
||||
public void cancelAsyncCollectJob(Long jobId) {
|
||||
timerDispatch.deleteJob(jobId, true);
|
||||
|
||||
@@ -10,20 +10,24 @@ import java.util.concurrent.TimeUnit;
|
||||
|
||||
/**
|
||||
* 时间轮调度接口
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/10/17 22:14
|
||||
*/
|
||||
public interface TimerDispatch {
|
||||
|
||||
/**
|
||||
* Add new job
|
||||
* 增加新的job
|
||||
*
|
||||
* @param addJob job
|
||||
* @param eventListener 一次性同步任务监听器,异步任务不需要listener
|
||||
* @param eventListener One-time synchronous task listener, asynchronous task does not need listener一次性同步任务监听器,异步任务不需要listener
|
||||
*/
|
||||
void addJob(Job addJob, CollectResponseEventListener eventListener);
|
||||
|
||||
/**
|
||||
* 调度循环周期性job
|
||||
*
|
||||
* @param timerTask timerTask
|
||||
* @param interval 开始调度的间隔时间
|
||||
* @param timeUnit 时间单位
|
||||
@@ -31,14 +35,18 @@ public interface TimerDispatch {
|
||||
void cyclicJob(WheelTimerTask timerTask, long interval, TimeUnit timeUnit);
|
||||
|
||||
/**
|
||||
* Delete existing job
|
||||
* 删除存在的job
|
||||
*
|
||||
* @param jobId jobId
|
||||
* @param isCyclic 是否是周期性任务,true是, false为临时性任务
|
||||
* @param isCyclic Whether it is a periodic task, true is, false is a temporary task
|
||||
* 是否是周期性任务,true是, false为临时性任务
|
||||
*/
|
||||
void deleteJob(long jobId, boolean isCyclic);
|
||||
|
||||
/**
|
||||
* 一次性同步采集任务采集结果通知监听器
|
||||
*
|
||||
* @param jobId jobId
|
||||
* @param metricsDataTemps 采集结果数据
|
||||
*/
|
||||
|
||||
@@ -18,18 +18,22 @@ import java.util.concurrent.TimeUnit;
|
||||
public class TimerDispatcher implements TimerDispatch {
|
||||
|
||||
/**
|
||||
* time round schedule
|
||||
* 时间轮调度
|
||||
*/
|
||||
private Timer wheelTimer;
|
||||
/**
|
||||
* Existing periodic scheduled tasks
|
||||
* 已存在的周期性调度任务
|
||||
*/
|
||||
private Map<Long, Timeout> currentCyclicTaskMap;
|
||||
/**
|
||||
* Existing temporary scheduled tasks
|
||||
* 已存在的临时性调度任务
|
||||
*/
|
||||
private Map<Long, Timeout> currentTempTaskMap;
|
||||
/**
|
||||
* One-time task response listener holds
|
||||
* 一次性任务响应监听器持有
|
||||
* jobId - listener
|
||||
*/
|
||||
|
||||
@@ -22,7 +22,9 @@ import java.util.Map;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Timer Task implementation
|
||||
* TimerTask实现
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/1 17:18
|
||||
*/
|
||||
@@ -36,12 +38,15 @@ public class WheelTimerTask implements TimerTask {
|
||||
public WheelTimerTask(Job job) {
|
||||
this.metricsTaskDispatch = SpringContextHolder.getBean(MetricsTaskDispatch.class);
|
||||
this.job = job;
|
||||
// The initialization job will monitor the actual parameter value and replace the collection field
|
||||
// 初始化job 将监控实际参数值对采集字段进行替换
|
||||
initJobMetrics(job);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initialize job fill information
|
||||
* 初始化job填充信息
|
||||
*
|
||||
* @param job job
|
||||
*/
|
||||
private void initJobMetrics(Job job) {
|
||||
@@ -73,9 +78,10 @@ public class WheelTimerTask implements TimerTask {
|
||||
}
|
||||
|
||||
/**
|
||||
* json参数替换
|
||||
* json parameter replacement json参数替换
|
||||
*
|
||||
* @param jsonElement json
|
||||
* @param configmap 参数map
|
||||
* @param configmap parameter map 参数map
|
||||
* @return json
|
||||
*/
|
||||
private JsonElement replaceSpecialValue(JsonElement jsonElement, Map<String, Configmap> configmap) {
|
||||
@@ -86,6 +92,7 @@ public class WheelTimerTask implements TimerTask {
|
||||
Map.Entry<String, JsonElement> entry = iterator.next();
|
||||
JsonElement element = entry.getValue();
|
||||
String key = entry.getKey();
|
||||
// Replace the attributes of the KEY-VALUE case such as http headers params
|
||||
// 替换KEY-VALUE情况的属性 比如http headers params
|
||||
if (key != null && key.startsWith("^_^") && key.endsWith("^_^")) {
|
||||
key = key.replaceAll("\\^_\\^", "");
|
||||
@@ -104,8 +111,10 @@ public class WheelTimerTask implements TimerTask {
|
||||
iterator.remove();
|
||||
continue;
|
||||
}
|
||||
// Replace normal VALUE value
|
||||
// 替换正常的VALUE值
|
||||
if (element.isJsonPrimitive()) {
|
||||
// Check if there are special characters Replace
|
||||
// 判断是否含有特殊字符 替换
|
||||
String value = element.getAsString();
|
||||
if (value.startsWith("^_^") && value.endsWith("^_^")) {
|
||||
@@ -129,6 +138,7 @@ public class WheelTimerTask implements TimerTask {
|
||||
while (iterator.hasNext()) {
|
||||
JsonElement element = iterator.next();
|
||||
if (element.isJsonPrimitive()) {
|
||||
// Check if there are special characters Replace
|
||||
// 判断是否含有特殊字符 替换
|
||||
String value = element.getAsString();
|
||||
if (value.startsWith("^_^") && value.endsWith("^_^")) {
|
||||
|
||||
@@ -6,8 +6,12 @@ import lombok.Data;
|
||||
import lombok.NoArgsConstructor;
|
||||
|
||||
/**
|
||||
* Monitoring configuration parameter properties and values
|
||||
* 监控配置参数属性及值
|
||||
* During the process, you need to replace the content with the identifier ^_^key^_^
|
||||
* in the protocol configuration parameter with the real value in the configuration parameter
|
||||
* 过程中需要将协议配置参数里面的标识符为^_^key^_^的内容替换为配置参数里的真实值
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/10/29 22:04
|
||||
*/
|
||||
@@ -18,16 +22,20 @@ import lombok.NoArgsConstructor;
|
||||
public class Configmap {
|
||||
|
||||
/**
|
||||
* Parameter key, replace the content with the identifier ^^_key_^^ in the protocol
|
||||
* configuration parameter with the real value in the configuration parameter
|
||||
* <p>
|
||||
* 参数key,将协议配置参数里面的标识符为^^_key_^^的内容替换为配置参数里的真实值
|
||||
*/
|
||||
private String key;
|
||||
|
||||
/**
|
||||
* 参数value
|
||||
* parameter value 参数value
|
||||
*/
|
||||
private Object value;
|
||||
|
||||
/**
|
||||
* Parameter type 0: number 1: string 2: encrypted string 3: json string mapped by map
|
||||
* 参数类型 0:数字 1:字符串 2:加密串 3:map映射的json串
|
||||
* number,string,secret
|
||||
* 数字,非加密字符串,加密字符串
|
||||
|
||||
@@ -21,7 +21,9 @@ import java.util.Set;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* Collect task details
|
||||
* 采集任务详情
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/10/17 21:19
|
||||
*/
|
||||
@@ -35,61 +37,72 @@ public class Job {
|
||||
private static final String AVAILABILITY = "availability";
|
||||
|
||||
/**
|
||||
* 任务ID
|
||||
* Task id 任务ID
|
||||
*/
|
||||
private long id;
|
||||
/**
|
||||
* Monitoring ID Application ID
|
||||
* 监控ID 应用ID
|
||||
*/
|
||||
private long monitorId;
|
||||
/**
|
||||
* 监控的大类别
|
||||
* Large categories of monitoring 监控的大类别
|
||||
* service-application service monitoring db-database monitoring custom-custom monitoring os-operating system monitoring
|
||||
* service-应用服务监控 db-数据库监控 custom-自定义监控 os-操作系统监控
|
||||
*/
|
||||
private String category;
|
||||
/**
|
||||
* Type of monitoring eg: linux | mysql | jvm
|
||||
* 监控的类型 eg: linux | mysql | jvm
|
||||
*/
|
||||
private String app;
|
||||
/**
|
||||
* 监控类型的国际化名称
|
||||
* The internationalized name of the monitoring type 监控类型的国际化名称
|
||||
* zh-CN: PING连通性
|
||||
* en-US: PING CONNECT
|
||||
*/
|
||||
private Map<String, String> name;
|
||||
/**
|
||||
* Task dispatch start timestamp
|
||||
* 任务派发开始时间戳
|
||||
*/
|
||||
private long timestamp;
|
||||
/**
|
||||
* Task collection time interval (unit: second) eg: 30,60,600
|
||||
* 任务采集时间间隔(单位秒) eg: 30,60,600
|
||||
*/
|
||||
private long interval = 600L;
|
||||
/**
|
||||
* Whether it is a recurring periodic task true is yes, false is no
|
||||
* 是否是循环周期性任务 true为是,false为否
|
||||
*/
|
||||
private boolean isCyclic = false;
|
||||
/**
|
||||
* Indicator group configuration eg: cpu memory
|
||||
* 指标组配置 eg: cpu memory
|
||||
*/
|
||||
private List<Metrics> metrics;
|
||||
/**
|
||||
* Monitoring configuration parameter properties and values eg: username password timeout host
|
||||
* 监控配置参数属性及值 eg: username password timeout host
|
||||
*/
|
||||
private List<Configmap> configmap;
|
||||
|
||||
/**
|
||||
* collector use - timestamp when the task was scheduled by the time wheel
|
||||
* collector使用 - 任务被时间轮开始调度的时间戳
|
||||
*/
|
||||
@JsonIgnore
|
||||
private transient long dispatchTime;
|
||||
|
||||
/**
|
||||
* collector use - task version, this field is not stored in etcd
|
||||
* collector使用 - 任务版本,此字段不存储于etcd
|
||||
*/
|
||||
@JsonIgnore
|
||||
private transient long version;
|
||||
/**
|
||||
* collector usage - metric group task execution priority view
|
||||
* collector使用 - 指标组任务执行优先级视图
|
||||
* 0 - availability
|
||||
* 1 - cpu | memory
|
||||
@@ -103,27 +116,32 @@ public class Job {
|
||||
private transient List<Set<Metrics>> priorMetrics;
|
||||
|
||||
/**
|
||||
* collector use - Temporarily store one-time task indicator group response data
|
||||
* collector使用 - 临时存储一次性任务指标组响应数据
|
||||
*/
|
||||
@JsonIgnore
|
||||
private transient List<CollectRep.MetricsData> responseDataTemp;
|
||||
|
||||
/**
|
||||
* collector uses - construct to initialize metrics group execution view
|
||||
* collector使用 - 构造初始化指标组执行视图
|
||||
*/
|
||||
public synchronized void constructPriorMetrics() {
|
||||
Map<Byte, List<Metrics>> map = metrics.stream()
|
||||
.peek(metric -> {
|
||||
// Determine whether to configure aliasFields If not, configure the default
|
||||
// 判断是否配置aliasFields 没有则配置默认
|
||||
if (metric.getAliasFields() == null || metric.getAliasFields().isEmpty()) {
|
||||
metric.setAliasFields(metric.getFields().stream().map(Metrics.Field::getField).collect(Collectors.toList()));
|
||||
}
|
||||
// Set the default indicator group execution priority, if not filled, the default last priority
|
||||
// 设置默认的指标组执行优先级,不填则默认最后优先级
|
||||
if (metric.getPriority() == null) {
|
||||
metric.setPriority(Byte.MAX_VALUE);
|
||||
}
|
||||
})
|
||||
.collect(Collectors.groupingBy(Metrics::getPriority));
|
||||
// Construct a linked list of task execution order of the indicator group
|
||||
// 构造指标组任务执行顺序链表
|
||||
priorMetrics = new LinkedList<>();
|
||||
map.values().forEach(metric -> {
|
||||
@@ -141,12 +159,18 @@ public class Job {
|
||||
}
|
||||
|
||||
/**
|
||||
* collector use - to get the next set of priority metric group tasks
|
||||
* collector使用 - 获取下一组优先级的指标组任务
|
||||
* @param metrics 当前指标组
|
||||
* @param first 是否是第一次获取
|
||||
* @return 指标组任务
|
||||
*
|
||||
* @param metrics Current indicator group 当前指标组
|
||||
* @param first Is it the first time to get 是否是第一次获取
|
||||
* @return Metric Group Tasks 指标组任务
|
||||
* Returning null means: the job has been completed, and the collection of all indicator groups has ended
|
||||
* 返回null表示:job已完成,所有指标组采集结束
|
||||
* Returning the empty set indicates that there are still indicator group collection tasks at the current
|
||||
* level that have not been completed,and the next level indicator group task collection cannot be performed.
|
||||
* 返回empty的集合表示:当前级别下还有指标组采集任务未结束,无法进行下一级别的指标组任务采集
|
||||
* Returns a set of data representation: get the next set of priority index group tasks
|
||||
* 返回有数据集合表示:获取到下一组优先级的指标组任务
|
||||
*/
|
||||
public synchronized Set<Metrics> getNextCollectMetrics(Metrics metrics, boolean first) {
|
||||
@@ -189,7 +213,7 @@ public class Job {
|
||||
|
||||
@Override
|
||||
public Job clone() {
|
||||
// 深度克隆
|
||||
// deep clone 深度克隆
|
||||
return GsonUtil.fromJson(GsonUtil.toJson(this), Job.class);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -15,7 +15,10 @@ import java.util.List;
|
||||
import java.util.Objects;
|
||||
|
||||
/**
|
||||
* Details of the collection of indicators collected by monitoring
|
||||
* eg: cpu | memory | health
|
||||
* 监控采集的指标集合详情 eg: cpu | memory | health
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/10/17 21:24
|
||||
*/
|
||||
@@ -26,6 +29,7 @@ import java.util.Objects;
|
||||
public class Metrics {
|
||||
|
||||
/**
|
||||
* public property-name eg: cpu | memory | health
|
||||
* 公共属性-名称 eg: cpu | memory | health
|
||||
*/
|
||||
private String name;
|
||||
@@ -34,20 +38,27 @@ public class Metrics {
|
||||
*/
|
||||
private String protocol;
|
||||
/**
|
||||
* Range (0-127) indicator group scheduling priority, the smaller the value, the higher the priority
|
||||
* The collection task of the next priority indicator group will be scheduled only after the scheduled collection with the higher priority is completed.
|
||||
* The default priority of the availability indicator group is 0, and the range of other common indicator groups is 1-127, that is,
|
||||
* the subsequent indicator group tasks will only be scheduled after the availability is collected successfully.
|
||||
* 范围(0-127)指标组调度优先级,数值越小优先级越高
|
||||
* 优先级高的调度采集完成后才会调度下一优先级的指标组采集任务
|
||||
* 可用性指标组(availability)默认优先级为0,其它普通指标组范围为1-127,即需要等availability采集成功后才会调度后面的指标组任务
|
||||
*/
|
||||
private Byte priority;
|
||||
/**
|
||||
* Public attribute - collection and monitoring final result attribute set eg: speed | times | size
|
||||
* 公共属性-采集监控的最终结果属性集合 eg: speed | times | size
|
||||
*/
|
||||
private List<Field> fields;
|
||||
/**
|
||||
* Public attribute - collection and monitoring pre-query attribute set eg: size1 | size2 | speedSize
|
||||
* 公共属性-采集监控的前置查询属性集合 eg: size1 | size2 | speedSize
|
||||
*/
|
||||
private List<String> aliasFields;
|
||||
/**
|
||||
* Public attribute - expression calculation, map the pre-query attribute (pre Fields) with the final attribute (fields), and calculate the final attribute (fields) value
|
||||
* 公共属性-表达式计算,将前置查询属性(preFields)与最终属性(fields)映射,计算出最终属性(fields)值
|
||||
* eg: size = size1 + size2, speed = speedSize
|
||||
* https://www.yuque.com/boyan-avfmj/aviatorscript/ban32m
|
||||
@@ -55,26 +66,32 @@ public class Metrics {
|
||||
private List<String> calculates;
|
||||
|
||||
/**
|
||||
* Monitoring configuration information using the http protocol
|
||||
* 使用http协议的监控配置信息
|
||||
*/
|
||||
private HttpProtocol http;
|
||||
/**
|
||||
* Monitoring configuration information for ping using the icmp protocol
|
||||
* 使用icmp协议进行ping的监控配置信息
|
||||
*/
|
||||
private IcmpProtocol icmp;
|
||||
/**
|
||||
* Monitoring configuration information using the telnet protocol
|
||||
* 使用telnet协议的监控配置信息
|
||||
*/
|
||||
private TelnetProtocol telnet;
|
||||
/**
|
||||
* Use tcp or ucp implemented by socket for service port detection configuration information
|
||||
* 使用socket实现的tcp或ucp进行服务端口探测配置信息
|
||||
*/
|
||||
private TcpUdpProtocol tcpUdp;
|
||||
/**
|
||||
* Database configuration information implemented using the public jdbc specification
|
||||
* 使用公共的jdbc规范实现的数据库配置信息
|
||||
*/
|
||||
private JdbcProtocol jdbc;
|
||||
/**
|
||||
* Monitoring configuration information using the public ssh protocol
|
||||
* 使用公共的ssh协议的监控配置信息
|
||||
*/
|
||||
private SshProtocol ssh;
|
||||
@@ -101,18 +118,22 @@ public class Metrics {
|
||||
@NoArgsConstructor
|
||||
public static class Field {
|
||||
/**
|
||||
* Indicator name
|
||||
* 指标名称
|
||||
*/
|
||||
private String field;
|
||||
/**
|
||||
* Indicator type 0-number: number 1-string: string
|
||||
* 指标类型 0-number:数字 1-string:字符串
|
||||
*/
|
||||
private byte type = 1;
|
||||
/**
|
||||
* Whether this field is the instance primary key
|
||||
* 此字段是否为实例主键
|
||||
*/
|
||||
private boolean instance = false;
|
||||
/**
|
||||
* Indicator unit
|
||||
* 指标单位
|
||||
*/
|
||||
private String unit;
|
||||
|
||||
@@ -22,7 +22,9 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_ONLY;
|
||||
import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||
|
||||
/**
|
||||
* Monitor Entity
|
||||
* 监控实体
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/14 9:53
|
||||
*/
|
||||
@@ -32,10 +34,11 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@ApiModel(description = "监控实体")
|
||||
@ApiModel(description = "en: Monitor Entity,zh: 监控实体")
|
||||
public class Monitor {
|
||||
|
||||
/**
|
||||
* Monitor ID
|
||||
* 主键ID
|
||||
*/
|
||||
@Id
|
||||
@@ -43,12 +46,14 @@ public class Monitor {
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* Job ID
|
||||
* 监控对应下发的任务ID
|
||||
*/
|
||||
@ApiModelProperty(value = "任务ID", example = "43243543543", accessMode = READ_ONLY, position = 1)
|
||||
private Long jobId;
|
||||
|
||||
/**
|
||||
* Monitor Name
|
||||
* 监控的名称
|
||||
*/
|
||||
@ApiModelProperty(value = "监控名称", example = "Api-TanCloud.cn", accessMode = READ_WRITE, position = 2)
|
||||
@@ -56,6 +61,7 @@ public class Monitor {
|
||||
private String name;
|
||||
|
||||
/**
|
||||
* Type of monitoring: linux, mysql, jvm...
|
||||
* 监控的类型:linux,mysql,jvm...
|
||||
*/
|
||||
@ApiModelProperty(value = "监控类型", example = "TanCloud", accessMode = READ_WRITE, position = 3)
|
||||
@@ -63,6 +69,7 @@ public class Monitor {
|
||||
private String app;
|
||||
|
||||
/**
|
||||
* Monitored peer host: ipv4, ipv6, domain name
|
||||
* 监控的对端host:ipv4,ipv6,域名
|
||||
*/
|
||||
@ApiModelProperty(value = "监控的对端host", example = "192.167.25.11", accessMode = READ_WRITE, position = 4)
|
||||
@@ -71,6 +78,7 @@ public class Monitor {
|
||||
private String host;
|
||||
|
||||
/**
|
||||
* Monitoring collection interval time, in seconds
|
||||
* 监控的采集间隔时间,单位秒
|
||||
*/
|
||||
@ApiModelProperty(value = "监控的采集间隔时间,单位秒", example = "600", accessMode = READ_WRITE, position = 5)
|
||||
@@ -78,6 +86,7 @@ public class Monitor {
|
||||
private Integer intervals;
|
||||
|
||||
/**
|
||||
* Monitoring status 0: Unmonitored, 1: Available, 2: Unavailable, 3: Unreachable, 4: Suspended
|
||||
* 监控状态 0:未监控,1:可用,2:不可用,3:不可达,4:挂起
|
||||
*/
|
||||
@ApiModelProperty(value = "监控状态 0:未监控,1:可用,2:不可用,3:不可达,4:挂起", accessMode = READ_WRITE, position = 6)
|
||||
@@ -86,6 +95,7 @@ public class Monitor {
|
||||
private byte status;
|
||||
|
||||
/**
|
||||
* Monitoring note description
|
||||
* 监控备注描述
|
||||
*/
|
||||
@ApiModelProperty(value = "监控备注描述", example = "对SAAS网站TanCloud的可用性监控", accessMode = READ_WRITE, position = 7)
|
||||
@@ -93,18 +103,21 @@ public class Monitor {
|
||||
private String description;
|
||||
|
||||
/**
|
||||
* The creator of this record
|
||||
* 此条记录创建者
|
||||
*/
|
||||
@ApiModelProperty(value = "此条记录创建者", example = "tom", accessMode = READ_ONLY, position = 8)
|
||||
private String creator;
|
||||
|
||||
/**
|
||||
* This record was last modified by
|
||||
* 此条记录最新修改者
|
||||
*/
|
||||
@ApiModelProperty(value = "此条记录最新修改者", example = "tom", accessMode = READ_ONLY, position = 9)
|
||||
private String modifier;
|
||||
|
||||
/**
|
||||
* record creation time (millisecond timestamp)
|
||||
* 记录创建时间
|
||||
*/
|
||||
@ApiModelProperty(value = "记录创建时间(毫秒时间戳)", example = "1612198922000", accessMode = READ_ONLY, position = 10)
|
||||
@@ -112,6 +125,7 @@ public class Monitor {
|
||||
private LocalDateTime gmtCreate;
|
||||
|
||||
/**
|
||||
* Record the latest modification time (timestamp in milliseconds)
|
||||
* 记录最新修改时间
|
||||
*/
|
||||
@ApiModelProperty(value = "记录最新修改时间(毫秒时间戳)", example = "1612198444000", accessMode = READ_ONLY, position = 11)
|
||||
|
||||
@@ -23,7 +23,9 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_ONLY;
|
||||
import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||
|
||||
/**
|
||||
* Monitor parameter values
|
||||
* 监控参数值
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/13 22:19
|
||||
*/
|
||||
@@ -33,21 +35,26 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@ApiModel(description = "参数实体")
|
||||
@ApiModel(description = "嗯: Parameter Entity,zh: 参数实体")
|
||||
public class Param {
|
||||
|
||||
/**
|
||||
* Parameter primary key index ID
|
||||
*/
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@ApiModelProperty(value = "参数主键索引ID", example = "87584674384", accessMode = READ_ONLY, position = 0)
|
||||
private Long id;
|
||||
|
||||
/**
|
||||
* Monitor ID
|
||||
* 监控ID
|
||||
*/
|
||||
@ApiModelProperty(value = "监控ID", example = "875846754543", accessMode = READ_WRITE, position = 1)
|
||||
private Long monitorId;
|
||||
|
||||
/**
|
||||
* Parameter Field Identifier
|
||||
* 参数字段标识符
|
||||
*/
|
||||
@ApiModelProperty(value = "参数标识符字段", example = "port", accessMode = READ_WRITE, position = 2)
|
||||
@@ -56,6 +63,7 @@ public class Param {
|
||||
private String field;
|
||||
|
||||
/**
|
||||
* Param Value
|
||||
* 参数值
|
||||
*/
|
||||
@ApiModelProperty(value = "参数值", example = "8080", accessMode = READ_WRITE, position = 3)
|
||||
@@ -63,6 +71,7 @@ public class Param {
|
||||
private String value;
|
||||
|
||||
/**
|
||||
* Parameter type 0: number 1: string 2: encrypted string 3: json string mapped by map
|
||||
* 参数类型 0:数字 1:字符串 2:加密串 3:map映射的json串
|
||||
*/
|
||||
@ApiModelProperty(value = "参数类型 0:数字 1:字符串 2:加密串 3:map映射的json串", accessMode = READ_WRITE, position = 4)
|
||||
@@ -71,6 +80,7 @@ public class Param {
|
||||
private byte type;
|
||||
|
||||
/**
|
||||
* Record Creation Time
|
||||
* 记录创建时间
|
||||
*/
|
||||
@ApiModelProperty(value = "记录创建时间(毫秒时间戳)", example = "1612198922000", accessMode = READ_ONLY, position = 5)
|
||||
@@ -78,6 +88,7 @@ public class Param {
|
||||
private LocalDateTime gmtCreate;
|
||||
|
||||
/**
|
||||
* Record the latest modification time
|
||||
* 记录最新修改时间
|
||||
*/
|
||||
@ApiModelProperty(value = "记录最新修改时间(毫秒时间戳)", example = "1612198444000", accessMode = READ_ONLY, position = 6)
|
||||
|
||||
@@ -1,175 +1,208 @@
|
||||
package com.usthe.common.util;
|
||||
|
||||
/**
|
||||
* Public Constant
|
||||
* 公共常量
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/14 12:06
|
||||
*/
|
||||
public interface CommonConstants {
|
||||
|
||||
/**
|
||||
* Response status code: generic success
|
||||
* 响应状态码: 通用成功
|
||||
*/
|
||||
byte SUCCESS_CODE = 0x00;
|
||||
|
||||
/**
|
||||
* Response status code: generic failure
|
||||
* 响应状态码: 通用失败
|
||||
*/
|
||||
byte FAIL_CODE = 0x0F;
|
||||
|
||||
/**
|
||||
* Response status code: Parameter verification failed
|
||||
* 响应状态码: 参数校验失败
|
||||
*/
|
||||
byte PARAM_INVALID_CODE = 0x01;
|
||||
|
||||
/**
|
||||
* Response Status Code: Probe Failed
|
||||
* 响应状态码: 探测失败
|
||||
*/
|
||||
byte DETECT_FAILED_CODE = 0x02;
|
||||
|
||||
/**
|
||||
* Response status code: monitoring does not exist
|
||||
* 响应状态码: 监控不存在
|
||||
*/
|
||||
byte MONITOR_NOT_EXIST_CODE = 0x03;
|
||||
|
||||
/**
|
||||
* Response Status Code: Monitor Service Conflict
|
||||
* 响应状态码: 监控服务冲突
|
||||
*/
|
||||
byte MONITOR_CONFLICT_CODE = 0x04;
|
||||
|
||||
/**
|
||||
* Response status code: Incorrect login account password
|
||||
* 响应状态码: 登录账户密码错误
|
||||
*/
|
||||
byte MONITOR_LOGIN_FAILED_CODE = 0x05;
|
||||
|
||||
/**
|
||||
* Response status code: Registration failed exception
|
||||
* 响应状态码: 注册失败异常
|
||||
*/
|
||||
byte MONITOR_REGISTER_FAILED_CODE = 0x06;
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Monitoring Status Code: Unmanaged
|
||||
* 监控状态码: 未管理
|
||||
*/
|
||||
byte UN_MANAGE_CODE = 0x00;
|
||||
|
||||
/**
|
||||
* Monitoring Status Code: Available
|
||||
* 监控状态码: 可用
|
||||
*/
|
||||
byte AVAILABLE_CODE = 0x01;
|
||||
|
||||
/**
|
||||
* Monitoring Status Code: Not Available
|
||||
* 监控状态码: 不可用
|
||||
*/
|
||||
byte UN_AVAILABLE_CODE = 0x02;
|
||||
|
||||
/**
|
||||
* Monitoring Status Code: Unreachable
|
||||
* 监控状态码: 不可达
|
||||
*/
|
||||
byte UN_REACHABLE_CODE = 0x03;
|
||||
|
||||
/**
|
||||
* Monitoring Status Code: Pending
|
||||
* 监控状态码: 挂起
|
||||
*/
|
||||
byte SUSPENDING_CODE = 0x04;
|
||||
|
||||
/**
|
||||
* Alarm status: 0 - normal alarm (to be processed)
|
||||
* 告警状态: 0-正常告警(待处理)
|
||||
*/
|
||||
byte ALERT_STATUS_CODE_PENDING = 0x00;
|
||||
|
||||
/**
|
||||
* Alarm Status: 1 - Threshold triggered but not reached the number of alarms
|
||||
* 告警状态: 1-阈值触发但未达到告警次数
|
||||
*/
|
||||
byte ALERT_STATUS_CODE_NOT_REACH = 0x01;
|
||||
|
||||
/**
|
||||
* Alarm Status: 2-Restore Alarm
|
||||
* 告警状态: 2-恢复告警
|
||||
*/
|
||||
byte ALERT_STATUS_CODE_RESTORED = 0x02;
|
||||
|
||||
/**
|
||||
* Alert Status: 3-Handled
|
||||
* 告警状态: 3-已处理
|
||||
*/
|
||||
byte ALERT_STATUS_CODE_SOLVED = 0x03;
|
||||
|
||||
/**
|
||||
* Alarm level: 0: high-emergency-emergency-red
|
||||
* 告警级别: 0:高-emergency-紧急告警-红色
|
||||
*/
|
||||
byte ALERT_PRIORITY_CODE_EMERGENCY = 0x00;
|
||||
|
||||
/**
|
||||
* Alarm severity: 1: medium-critical-critical alarm-orange
|
||||
* 告警级别: 1:中-critical-严重告警-橙色
|
||||
*/
|
||||
byte ALERT_PRIORITY_CODE_CRITICAL = 0x01;
|
||||
|
||||
/**
|
||||
* Warning level: 2: low-warning-warning warning-yellow
|
||||
* 告警级别: 2:低-warning-警告告警-黄色
|
||||
*/
|
||||
byte ALERT_PRIORITY_CODE_WARNING = 0x02;
|
||||
|
||||
/**
|
||||
* Field parameter type: number
|
||||
* 字段参数类型: 数字
|
||||
*/
|
||||
byte TYPE_NUMBER = 0;
|
||||
|
||||
/**
|
||||
* Field parameter type: String
|
||||
* 字段参数类型: 字符串
|
||||
*/
|
||||
byte TYPE_STRING = 1;
|
||||
|
||||
/**
|
||||
* Field parameter type: encrypted string
|
||||
* 字段参数类型: 加密字符串
|
||||
*/
|
||||
byte TYPE_SECRET = 2;
|
||||
|
||||
/**
|
||||
* Collection indicator value: null placeholder for empty value
|
||||
* 采集指标值:null空值占位符
|
||||
*/
|
||||
String NULL_VALUE = " ";
|
||||
|
||||
/**
|
||||
* Availability Object
|
||||
* 可用性对象
|
||||
*/
|
||||
String AVAILABLE = "available";
|
||||
|
||||
/**
|
||||
* 可达性对象
|
||||
* Reachability Object可达性对象
|
||||
*/
|
||||
String REACHABLE = "reachable";
|
||||
|
||||
/**
|
||||
* Parameter Type Number
|
||||
* 参数类型 数字
|
||||
*/
|
||||
byte PARAM_TYPE_NUMBER = 0;
|
||||
|
||||
/**
|
||||
* Parameter Type String
|
||||
* 参数类型 字符串
|
||||
*/
|
||||
byte PARAM_TYPE_STRING = 1;
|
||||
|
||||
/**
|
||||
* Parameter Type Password
|
||||
* 参数类型 密码
|
||||
*/
|
||||
byte PARAM_TYPE_PASSWORD = 2;
|
||||
|
||||
/**
|
||||
* Authentication type Account password
|
||||
* 认证类型 账户密码
|
||||
*/
|
||||
byte AUTH_TYPE_PASSWORD = 1;
|
||||
|
||||
/**
|
||||
* Authentication type GITHUB three-party login
|
||||
* 认证类型 GITHUB三方登录
|
||||
*/
|
||||
byte AUTH_TYPE_GITHUB = 2;
|
||||
|
||||
/**
|
||||
* Authentication type WeChat three-party login
|
||||
* 认证类型 微信三方登录
|
||||
*/
|
||||
byte AUTH_TYPE_WEIXIN = 3;
|
||||
|
||||
/**
|
||||
* Authentication type GITEE three-party login
|
||||
* 认证类型 GITEE三方登录
|
||||
*/
|
||||
byte AUTH_TYPE_GITEE = 5;
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
package com.usthe.common.util;
|
||||
|
||||
/**
|
||||
* Snowflake Algorithm Generator Tool
|
||||
* 雪花算法生成器工具
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/10 11:04
|
||||
*/
|
||||
|
||||
18
home/docs/help/alert_console.md
Normal file
18
home/docs/help/alert_console.md
Normal file
@@ -0,0 +1,18 @@
|
||||
---
|
||||
id: alert_console
|
||||
title: 告警模板中自定义的控制台地址
|
||||
sidebar_label: 告警模板登录台地址
|
||||
---
|
||||
|
||||
> 阈值触发后发送告警信息,通过钉钉/企业微信/飞书机器人通知或者使用邮箱通知的时候,告警内容中有登录控制台的详情链接
|
||||
|
||||
|
||||
### 自定义设置
|
||||
|
||||
在我们的启动配置文件application.yml中,找到下面的配置
|
||||
```yml
|
||||
alerter:
|
||||
console-url: #这里就是我们的自定义控制台地址
|
||||
```
|
||||
|
||||
默认值是赫兹跳动的官方控制台地址
|
||||
@@ -6,6 +6,8 @@ sidebar_label: Docker方式部署
|
||||
|
||||
> 推荐使用docker部署HertzBeat
|
||||
|
||||
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
|
||||
|
||||
1. 下载安装Docker环境
|
||||
Docker 工具自身的下载请参考 [Docker官网文档](https://docs.docker.com/get-docker/)。
|
||||
安装完毕后终端查看Docker版本是否正常输出。
|
||||
@@ -47,71 +49,101 @@ sidebar_label: Docker方式部署
|
||||
|
||||
```yaml
|
||||
|
||||
resourceRole:
|
||||
- /account/auth/refresh===post===[role1,role2,role3,role4]
|
||||
resourceRole:
|
||||
- /account/auth/refresh===post===[admin,user,guest]
|
||||
- /apps/**===get===[admin,user,guest]
|
||||
- /monitor/**===get===[admin,user,guest]
|
||||
- /monitor/**===post===[admin,user]
|
||||
- /monitor/**===put===[admin,user]
|
||||
- /monitor/**===delete==[admin]
|
||||
- /monitors/**===get===[admin,user,guest]
|
||||
- /monitors/**===post===[admin,user]
|
||||
- /monitors/**===put===[admin,user]
|
||||
- /monitors/**===delete===[admin]
|
||||
- /alert/**===get===[admin,user,guest]
|
||||
- /alert/**===post===[admin,user]
|
||||
- /alert/**===put===[admin,user]
|
||||
- /alert/**===delete===[admin]
|
||||
- /alerts/**===get===[admin,user,guest]
|
||||
- /alerts/**===post===[admin,user]
|
||||
- /alerts/**===put===[admin,user]
|
||||
- /alerts/**===delete===[admin]
|
||||
- /notice/**===get===[admin,user,guest]
|
||||
- /notice/**===post===[admin,user]
|
||||
- /notice/**===put===[admin,user]
|
||||
- /notice/**===delete===[admin]
|
||||
- /summary/**===get===[admin,user,guest]
|
||||
- /summary/**===post===[admin,user]
|
||||
- /summary/**===put===[admin,user]
|
||||
- /summary/**===delete===[admin]
|
||||
|
||||
excludedResource:
|
||||
- /account/auth/**===*
|
||||
- /===get
|
||||
- /i18n/**===get
|
||||
- /apps/hierarchy===get
|
||||
- /console/**===get
|
||||
- /**/*.html===get
|
||||
- /**/*.js===get
|
||||
- /**/*.css===get
|
||||
- /**/*.ico===get
|
||||
- /**/*.ttf===get
|
||||
- /**/*.png===get
|
||||
- /**/*.gif===get
|
||||
excludedResource:
|
||||
- /account/auth/**===*
|
||||
- /===get
|
||||
- /i18n/**===get
|
||||
- /apps/hierarchy===get
|
||||
# web ui 静态资源
|
||||
- /console/**===get
|
||||
- /**/*.html===get
|
||||
- /**/*.js===get
|
||||
- /**/*.css===get
|
||||
- /**/*.ico===get
|
||||
- /**/*.ttf===get
|
||||
- /**/*.png===get
|
||||
- /**/*.gif===get
|
||||
- /**/*.png===*
|
||||
- /swagger-resources/**===get
|
||||
- /v2/api-docs===get
|
||||
- /v3/api-docs===get
|
||||
# swagger ui 资源
|
||||
- /swagger-resources/**===get
|
||||
- /v2/api-docs===get
|
||||
- /v3/api-docs===get
|
||||
|
||||
# 用户账户信息
|
||||
# 下面有 admin tom lili 三个账户
|
||||
# eg: admin 拥有[role1,role2]角色,密码为admin
|
||||
# eg: tom 拥有[role1,role2,role3],密码为tom@123
|
||||
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
|
||||
account:
|
||||
- appId: admin
|
||||
account:
|
||||
- appId: admin
|
||||
credential: admin
|
||||
role: [role1,role2]
|
||||
- appId: tom
|
||||
role: [admin,user]
|
||||
- appId: tom
|
||||
credential: tom@123
|
||||
role: [role1,role2,role3]
|
||||
- appId: lili
|
||||
role: [user]
|
||||
- appId: guest
|
||||
credential: guest
|
||||
role: [guest]
|
||||
- appId: lili
|
||||
# 注意 Digest认证不支持加盐加密的密码账户
|
||||
# 加盐加密的密码,通过 MD5(password+salt)计算
|
||||
# 此账户的原始密码为 lili
|
||||
credential: 1A676730B0C7F54654B0E09184448289
|
||||
salt: 123
|
||||
role: [role1,role2]
|
||||
role: [guest]
|
||||
|
||||
```
|
||||
|
||||
修改sureness.yml的如下**部分参数**:**[注意⚠️sureness配置的其它默认参数需保留]**
|
||||
|
||||
```yaml
|
||||
|
||||
# 用户账户信息
|
||||
# 下面有 admin tom lili 三个账户
|
||||
# eg: admin 拥有[role1,role2]角色,密码为admin
|
||||
# eg: tom 拥有[role1,role2,role3],密码为tom@123
|
||||
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
|
||||
account:
|
||||
- appId: admin
|
||||
# 用户账户信息
|
||||
# 下面有 admin tom lili 三个账户
|
||||
# eg: admin 拥有[admin,user]角色,密码为admin
|
||||
# eg: tom 拥有[user],密码为tom@123
|
||||
# eg: lili 拥有[guest],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
|
||||
account:
|
||||
- appId: admin
|
||||
credential: admin
|
||||
role: [role1,role2]
|
||||
- appId: tom
|
||||
role: [admin,user]
|
||||
- appId: tom
|
||||
credential: tom@123
|
||||
role: [role1,role2,role3]
|
||||
- appId: lili
|
||||
role: [user]
|
||||
- appId: guest
|
||||
credential: guest
|
||||
role: [guest]
|
||||
- appId: lili
|
||||
# 注意 Digest认证不支持加盐加密的密码账户
|
||||
# 加盐加密的密码,通过 MD5(password+salt)计算
|
||||
# 此账户的原始密码为 lili
|
||||
credential: 1A676730B0C7F54654B0E09184448289
|
||||
salt: 123
|
||||
role: [role1,role2]
|
||||
role: [guest]
|
||||
|
||||
```
|
||||
|
||||
6. 启动HertzBeat Docker容器
|
||||
|
||||
@@ -5,6 +5,8 @@ sidebar_label: MYSQL安装初始化
|
||||
---
|
||||
MYSQL是一款值得信赖的关系型数据库,HertzBeat使用其存储监控信息,告警信息,配置信息等结构化关系数据。
|
||||
|
||||
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
|
||||
|
||||
> 如果您已有MYSQL环境,可直接跳到SQL脚本执行那一步。
|
||||
|
||||
### 通过Docker方式安装MYSQL
|
||||
|
||||
@@ -3,7 +3,9 @@ id: package-deploy
|
||||
title: 通过安装包安装HertzBeat
|
||||
sidebar_label: 安装包方式部署
|
||||
---
|
||||
> HertzBeat支持在Linux Windows Mac系统安装运行,CPU支持X64/ARM64。由于安装包自身不包含JAVA运行环境,需您提前准备JAVA运行环境。
|
||||
> HertzBeat支持在Linux Windows Mac系统安装运行,CPU支持X86/ARM64。由于安装包自身不包含JAVA运行环境,需您提前准备JAVA运行环境。
|
||||
|
||||
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
|
||||
|
||||
1. 安装JAVA运行环境-可参考[官方网站](http://www.oracle.com/technetwork/java/javase/downloads/index.html)
|
||||
要求:JDK8+(已验证JDK8)
|
||||
@@ -49,25 +51,30 @@ sidebar_label: 安装包方式部署
|
||||
修改sureness.yml的如下**部分参数**:**[注意⚠️sureness配置的其它默认参数需保留]**
|
||||
|
||||
```yaml
|
||||
# 用户账户信息
|
||||
# 下面有 admin tom lili 三个账户
|
||||
# eg: admin 拥有[role1,role2]角色,密码为admin
|
||||
# eg: tom 拥有[role1,role2,role3],密码为tom@123
|
||||
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
|
||||
account:
|
||||
- appId: admin
|
||||
|
||||
# 用户账户信息
|
||||
# 下面有 admin tom lili 三个账户
|
||||
# eg: admin 拥有[admin,user]角色,密码为admin
|
||||
# eg: tom 拥有[user],密码为tom@123
|
||||
# eg: lili 拥有[guest],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
|
||||
account:
|
||||
- appId: admin
|
||||
credential: admin
|
||||
role: [role1,role2]
|
||||
- appId: tom
|
||||
role: [admin,user]
|
||||
- appId: tom
|
||||
credential: tom@123
|
||||
role: [role1,role2,role3]
|
||||
- appId: lili
|
||||
role: [user]
|
||||
- appId: guest
|
||||
credential: guest
|
||||
role: [guest]
|
||||
- appId: lili
|
||||
# 注意 Digest认证不支持加盐加密的密码账户
|
||||
# 加盐加密的密码,通过 MD5(password+salt)计算
|
||||
# 此账户的原始密码为 lili
|
||||
credential: 1A676730B0C7F54654B0E09184448289
|
||||
salt: 123
|
||||
role: [role1,role2]
|
||||
role: [guest]
|
||||
|
||||
```
|
||||
|
||||
5. 部署启动
|
||||
|
||||
@@ -9,6 +9,8 @@ sidebar_label: 快速开始
|
||||
- 如果您不想部署而是直接使用,我们提供SAAS监控云-[TanCloud探云](https://console.tancloud.cn),即刻[登录注册](https://console.tancloud.cn)免费使用。
|
||||
- 如果您是想将HertzBeat部署到内网环境搭建监控系统,请参考下面的部署文档进行操作。
|
||||
|
||||
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
|
||||
|
||||
### 🐵 依赖服务部署
|
||||
|
||||
> HertzBeat最少依赖于 关系型数据库[MYSQL5+](https://www.mysql.com/) 和 时序性数据库[TDengine2+](https://www.taosdata.com/getting-started)
|
||||
|
||||
@@ -5,8 +5,11 @@ sidebar_label: TDengine安装初始化
|
||||
---
|
||||
TDengine是一款国产的开源物联网时序型数据库,我们使用其替换了InfluxDb,来存储采集到的监控指标数据。
|
||||
|
||||
安装部署视频教程: [HertzBeat安装部署-BiliBili](https://www.bilibili.com/video/BV1GY41177YL)
|
||||
|
||||
> 如果您已有TDengine环境,可直接跳到创建数据库实例那一步。
|
||||
|
||||
|
||||
### 通过Docker方式安装TDengine
|
||||
> 可参考官方网站[安装教程](https://www.taosdata.com/docs/cn/v2.0/getting-started/docker)
|
||||
1. 下载安装Docker环境
|
||||
|
||||
14
home/i18n/en/docusaurus-plugin-content-blog/options.json
Normal file
14
home/i18n/en/docusaurus-plugin-content-blog/options.json
Normal file
@@ -0,0 +1,14 @@
|
||||
{
|
||||
"title": {
|
||||
"message": "Blog",
|
||||
"description": "The title for the blog used in SEO"
|
||||
},
|
||||
"description": {
|
||||
"message": "Blog",
|
||||
"description": "The description for the blog used in SEO"
|
||||
},
|
||||
"sidebar.title": {
|
||||
"message": "Recent posts",
|
||||
"description": "The label for the left sidebar"
|
||||
}
|
||||
}
|
||||
1
home/static/img/docs/hertzbeat-stru-en.svg
Normal file
1
home/static/img/docs/hertzbeat-stru-en.svg
Normal file
File diff suppressed because one or more lines are too long
|
After Width: | Height: | Size: 31 KiB |
@@ -1,6 +1,7 @@
|
||||
package com.usthe.manager.component.alerter;
|
||||
|
||||
import com.usthe.alert.AlerterDataQueue;
|
||||
import com.usthe.alert.AlerterProperties;
|
||||
import com.usthe.alert.AlerterWorkerPool;
|
||||
import com.usthe.common.util.CommonUtil;
|
||||
import com.usthe.common.entity.alerter.Alert;
|
||||
@@ -24,6 +25,7 @@ import org.springframework.stereotype.Component;
|
||||
import org.springframework.web.client.ResourceAccessException;
|
||||
import org.springframework.web.client.RestTemplate;
|
||||
|
||||
import javax.annotation.Resource;
|
||||
import javax.mail.internet.MimeMessage;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Date;
|
||||
@@ -48,6 +50,8 @@ public class DispatchAlarm {
|
||||
private JavaMailSender javaMailSender;
|
||||
private RestTemplate restTemplate;
|
||||
private MailService mailService;
|
||||
@Resource
|
||||
private AlerterProperties alerterProperties;
|
||||
|
||||
@Value("${spring.mail.username}")
|
||||
private String emailFromUser;
|
||||
@@ -177,13 +181,13 @@ public class DispatchAlarm {
|
||||
"\n所属监控ID :" + alert.getMonitorId() +
|
||||
"\n所属监控名称 :" + alert.getMonitorName() +
|
||||
"\n告警级别 :" + CommonUtil.transferAlertPriority(alert.getPriority()) +
|
||||
"\n内容详情 : " + alert.getContent();
|
||||
"\n内容详情 : " + alert.getContent() + "\n";
|
||||
flyBookContent.setText(text);
|
||||
contents1.add(flyBookContent);
|
||||
FlyBookWebHookDto.FlyBookContent bookContent = new FlyBookWebHookDto.FlyBookContent();
|
||||
bookContent.setTag("a");
|
||||
bookContent.setText("登入控制台");
|
||||
bookContent.setHref("https://www.tancloud.cn");
|
||||
bookContent.setHref(alerterProperties.getConsoleUrl());
|
||||
contents1.add(bookContent);
|
||||
contents.add(contents1);
|
||||
zhCn.setTitle("[TanCloud探云告警通知]");
|
||||
@@ -214,14 +218,16 @@ public class DispatchAlarm {
|
||||
private void sendDingTalkRobotAlert(NoticeReceiver receiver, Alert alert) {
|
||||
DingTalkWebHookDto dingTalkWebHookDto = new DingTalkWebHookDto();
|
||||
DingTalkWebHookDto.MarkdownDTO markdownDTO = new DingTalkWebHookDto.MarkdownDTO();
|
||||
String content = "#### [TanCloud探云告警通知]\n##### **告警目标对象** : " +
|
||||
StringBuilder content = new StringBuilder();
|
||||
content.append("#### [TanCloud探云告警通知]\n##### **告警目标对象** : " +
|
||||
alert.getTarget() + "\n " +
|
||||
"##### **所属监控ID** : " + alert.getMonitorId() + "\n " +
|
||||
"##### **所属监控名称** : " + alert.getMonitorName() + "\n " +
|
||||
"##### **告警级别** : " +
|
||||
CommonUtil.transferAlertPriority(alert.getPriority()) + "\n " +
|
||||
"##### **内容详情** : " + alert.getContent();
|
||||
markdownDTO.setText(content);
|
||||
"##### **内容详情** : " + alert.getContent());
|
||||
content.append("[点击跳转查看详情](" + alerterProperties.getConsoleUrl() + ")");
|
||||
markdownDTO.setText(content.toString());
|
||||
markdownDTO.setTitle("TanCloud探云告警通知");
|
||||
dingTalkWebHookDto.setMarkdown(markdownDTO);
|
||||
String webHookUrl = DingTalkWebHookDto.WEBHOOK_URL + receiver.getAccessToken();
|
||||
@@ -261,8 +267,10 @@ public class DispatchAlarm {
|
||||
content.append("告警级别 : <font color=\"comment\">")
|
||||
.append(CommonUtil.transferAlertPriority(alert.getPriority())).append("</font>\n");
|
||||
}
|
||||
content.append("内容详情 : ").append(alert.getContent());
|
||||
content.append("内容详情 : ").append(alert.getContent() + "\n");
|
||||
content.append("[点击跳转查看详情](" + alerterProperties.getConsoleUrl() + ")");
|
||||
markdownDTO.setContent(content.toString());
|
||||
//TODO 增加控制台地址登录可控制
|
||||
weWorkWebHookDTO.setMarkdown(markdownDTO);
|
||||
String webHookUrl = WeWorkWebHookDto.WEBHOOK_URL + receiver.getWechatId();
|
||||
try {
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package com.usthe.manager.controller;
|
||||
|
||||
import com.usthe.common.entity.dto.Message;
|
||||
import com.usthe.common.entity.manager.Monitor;
|
||||
import com.usthe.manager.pojo.dto.MonitorDto;
|
||||
import com.usthe.manager.service.MonitorService;
|
||||
import io.swagger.annotations.Api;
|
||||
@@ -23,11 +24,13 @@ import static com.usthe.common.util.CommonConstants.MONITOR_NOT_EXIST_CODE;
|
||||
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
|
||||
|
||||
/**
|
||||
* Monitoring management API
|
||||
* 监控管理API
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/14 10:57
|
||||
*/
|
||||
@Api(tags = "监控管理API")
|
||||
@Api(tags = "en: Monitoring management API,zh: 监控管理API")
|
||||
@RestController
|
||||
@RequestMapping(path = "/monitor", produces = {APPLICATION_JSON_VALUE})
|
||||
public class MonitorController {
|
||||
@@ -36,12 +39,12 @@ public class MonitorController {
|
||||
private MonitorService monitorService;
|
||||
|
||||
@PostMapping
|
||||
@ApiOperation(value = "新增监控", notes = "新增一个监控应用")
|
||||
@ApiOperation(value = "Add a monitoring application", notes = "新增一个监控应用")
|
||||
public ResponseEntity<Message<Void>> addNewMonitor(@Valid @RequestBody MonitorDto monitorDto) {
|
||||
// 校验请求数据
|
||||
// Verify request data 校验请求数据
|
||||
monitorService.validate(monitorDto, false);
|
||||
if (monitorDto.isDetected()) {
|
||||
// 进行探测
|
||||
// Probe 进行探测
|
||||
monitorService.detectMonitor(monitorDto.getMonitor(), monitorDto.getParams());
|
||||
}
|
||||
monitorService.addMonitor(monitorDto.getMonitor(), monitorDto.getParams());
|
||||
@@ -49,12 +52,12 @@ public class MonitorController {
|
||||
}
|
||||
|
||||
@PutMapping
|
||||
@ApiOperation(value = "修改监控", notes = "修改一个已存在监控应用")
|
||||
@ApiOperation(value = "Modify an existing monitoring application", notes = "修改一个已存在监控应用")
|
||||
public ResponseEntity<Message<Void>> modifyMonitor(@Valid @RequestBody MonitorDto monitorDto) {
|
||||
// 校验请求数据
|
||||
// Verify request data 校验请求数据
|
||||
monitorService.validate(monitorDto, true);
|
||||
if (monitorDto.isDetected()) {
|
||||
// 进行探测
|
||||
// Probe 进行探测
|
||||
monitorService.detectMonitor(monitorDto.getMonitor(), monitorDto.getParams());
|
||||
}
|
||||
monitorService.modifyMonitor(monitorDto.getMonitor(), monitorDto.getParams());
|
||||
@@ -62,9 +65,10 @@ public class MonitorController {
|
||||
}
|
||||
|
||||
@GetMapping(path = "/{id}")
|
||||
@ApiOperation(value = "查询监控", notes = "根据监控ID获取监控信息")
|
||||
@ApiOperation(value = "Obtain monitoring information based on monitoring ID", notes = "根据监控ID获取监控信息")
|
||||
public ResponseEntity<Message<MonitorDto>> getMonitor(
|
||||
@ApiParam(value = "监控ID", example = "6565463543") @PathVariable("id") final long id) {
|
||||
// Get monitoring information
|
||||
// 获取监控信息
|
||||
MonitorDto monitorDto = monitorService.getMonitorDto(id);
|
||||
Message.MessageBuilder<MonitorDto> messageBuilder = Message.builder();
|
||||
@@ -77,16 +81,20 @@ public class MonitorController {
|
||||
}
|
||||
|
||||
@DeleteMapping(path = "/{id}")
|
||||
@ApiOperation(value = "删除监控", notes = "根据监控ID删除监控应用,监控不存在也是删除成功")
|
||||
@ApiOperation(value = "Delete monitoring application based on monitoring ID", notes = "根据监控ID删除监控应用")
|
||||
public ResponseEntity<Message<Void>> deleteMonitor(
|
||||
@ApiParam(value = "监控ID", example = "6565463543") @PathVariable("id") final long id) {
|
||||
// 删除监控,监控不存在或删除成功都返回成功
|
||||
@ApiParam(value = "en: Monitor ID,zh: 监控ID", example = "6565463543") @PathVariable("id") final long id) {
|
||||
// delete monitor 删除监控
|
||||
Monitor monitor = monitorService.getMonitor(id);
|
||||
if (monitor == null) {
|
||||
return ResponseEntity.ok(new Message<>("The specified monitoring was not queried, please check whether the parameters are correct"));
|
||||
}
|
||||
monitorService.deleteMonitor(id);
|
||||
return ResponseEntity.ok(new Message<>("Delete success"));
|
||||
}
|
||||
|
||||
@PostMapping(path = "/detect")
|
||||
@ApiOperation(value = "探测监控", notes = "根据监控信息去对此监控进行可用性探测")
|
||||
@ApiOperation(value = "Perform availability detection on this monitoring based on monitoring information", notes = "根据监控信息去对此监控进行可用性探测")
|
||||
public ResponseEntity<Message<Void>> detectMonitor(@Valid @RequestBody MonitorDto monitorDto) {
|
||||
monitorService.validate(monitorDto, null);
|
||||
monitorService.detectMonitor(monitorDto.getMonitor(), monitorDto.getParams());
|
||||
|
||||
@@ -29,11 +29,13 @@ import java.util.List;
|
||||
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
|
||||
|
||||
/**
|
||||
* Monitor and manage batch API
|
||||
* 监控管理批量API
|
||||
*
|
||||
* @author tom
|
||||
* @date 2021/12/1 20:43
|
||||
*/
|
||||
@Api(tags = "监控列表API")
|
||||
@Api(tags = "en: Monitor and manage batch API,zh: 监控列表API")
|
||||
@RestController
|
||||
@RequestMapping(path = "/monitors", produces = {APPLICATION_JSON_VALUE})
|
||||
public class MonitorsController {
|
||||
@@ -44,22 +46,23 @@ public class MonitorsController {
|
||||
private MonitorService monitorService;
|
||||
|
||||
@GetMapping
|
||||
@ApiOperation(value = "查询监控列表", notes = "根据查询过滤项获取监控信息列表")
|
||||
@ApiOperation(value = "Obtain a list of monitoring information based on query filter items",
|
||||
notes = "根据查询过滤项获取监控信息列表")
|
||||
public ResponseEntity<Message<Page<Monitor>>> getMonitors(
|
||||
@ApiParam(value = "监控ID", example = "6565463543") @RequestParam(required = false) final List<Long> ids,
|
||||
@ApiParam(value = "监控类型", example = "linux") @RequestParam(required = false) final String app,
|
||||
@ApiParam(value = "监控名称,模糊查询", example = "linux-127.0.0.1") @RequestParam(required = false) final String name,
|
||||
@ApiParam(value = "监控Host,模糊查询", example = "127.0.0.1") @RequestParam(required = false) final String host,
|
||||
@ApiParam(value = "监控状态 0:未监控,1:可用,2:不可用,3:不可达,4:挂起,9:全部状态", example = "1") @RequestParam(required = false) final Byte status,
|
||||
@ApiParam(value = "排序字段,默认id", example = "name") @RequestParam(defaultValue = "id") final String sort,
|
||||
@ApiParam(value = "排序方式,asc:升序,desc:降序", example = "desc") @RequestParam(defaultValue = "desc") final String order,
|
||||
@ApiParam(value = "列表当前分页", example = "0") @RequestParam(defaultValue = "0") int pageIndex,
|
||||
@ApiParam(value = "列表分页数量", example = "8") @RequestParam(defaultValue = "8") int pageSize) {
|
||||
@ApiParam(value = "en: Monitor ID,zh: 监控ID", example = "6565463543") @RequestParam(required = false) final List<Long> ids,
|
||||
@ApiParam(value = "en: Monitor Type,zh: 监控类型", example = "linux") @RequestParam(required = false) final String app,
|
||||
@ApiParam(value = "en: Monitor Name,zh: 监控名称,模糊查询", example = "linux-127.0.0.1") @RequestParam(required = false) final String name,
|
||||
@ApiParam(value = "en: Monitor Host,zh: 监控Host,模糊查询", example = "127.0.0.1") @RequestParam(required = false) final String host,
|
||||
@ApiParam(value = "en: Monitor Status,zh: 监控状态 0:未监控,1:可用,2:不可用,3:不可达,4:挂起,9:全部状态", example = "1") @RequestParam(required = false) final Byte status,
|
||||
@ApiParam(value = "en: Sort Field,default id,zh: 排序字段,默认id", example = "name") @RequestParam(defaultValue = "id") final String sort,
|
||||
@ApiParam(value = "en: Sort by,zh: 排序方式,asc:升序,desc:降序", example = "desc") @RequestParam(defaultValue = "desc") final String order,
|
||||
@ApiParam(value = "en: List current page,zh: 列表当前分页", example = "0") @RequestParam(defaultValue = "0") int pageIndex,
|
||||
@ApiParam(value = "en: Number of list pagination,zh: 列表分页数量", example = "8") @RequestParam(defaultValue = "8") int pageSize) {
|
||||
|
||||
Specification<Monitor> specification = (root, query, criteriaBuilder) -> {
|
||||
List<Predicate> andList = new ArrayList<>();
|
||||
if (ids != null && !ids.isEmpty()) {
|
||||
CriteriaBuilder.In<Long> inPredicate= criteriaBuilder.in(root.get("id"));
|
||||
CriteriaBuilder.In<Long> inPredicate = criteriaBuilder.in(root.get("id"));
|
||||
for (long id : ids) {
|
||||
inPredicate.value(id);
|
||||
}
|
||||
@@ -95,10 +98,10 @@ public class MonitorsController {
|
||||
} else if (orPredicate.getExpressions().isEmpty()) {
|
||||
return query.where(andPredicate).getRestriction();
|
||||
} else {
|
||||
return query.where(andPredicate,orPredicate).getRestriction();
|
||||
return query.where(andPredicate, orPredicate).getRestriction();
|
||||
}
|
||||
};
|
||||
// 分页是必须的
|
||||
// Pagination is a must 分页是必须的
|
||||
Sort sortExp = Sort.by(new Sort.Order(Sort.Direction.fromString(order), sort));
|
||||
PageRequest pageRequest = PageRequest.of(pageIndex, pageSize, sortExp);
|
||||
Page<Monitor> monitorPage = monitorService.getMonitors(specification, pageRequest);
|
||||
@@ -107,18 +110,20 @@ public class MonitorsController {
|
||||
}
|
||||
|
||||
@GetMapping(path = "/{app}")
|
||||
@ApiOperation(value = "查询指定监控类型的监控列表", notes = "根据查询过滤指定监控类型的所有获取监控信息列表")
|
||||
@ApiOperation(value = "Filter all acquired monitoring information lists of the specified monitoring type according to the query",
|
||||
notes = "根据查询过滤指定监控类型的所有获取监控信息列表")
|
||||
public ResponseEntity<Message<List<Monitor>>> getAppMonitors(
|
||||
@ApiParam(value = "监控类型", example = "linux") @PathVariable(required = false) final String app) {
|
||||
@ApiParam(value = "en: Monitoring type,zh: 监控类型", example = "linux") @PathVariable(required = false) final String app) {
|
||||
List<Monitor> monitors = monitorService.getAppMonitors(app);
|
||||
Message<List<Monitor>> message = new Message<>(monitors);
|
||||
return ResponseEntity.ok(message);
|
||||
}
|
||||
|
||||
@DeleteMapping
|
||||
@ApiOperation(value = "批量删除监控", notes = "根据监控ID列表批量删除监控项")
|
||||
@ApiOperation(value = "Delete monitoring items in batches according to the monitoring ID list",
|
||||
notes = "根据监控ID列表批量删除监控项")
|
||||
public ResponseEntity<Message<Void>> deleteMonitors(
|
||||
@ApiParam(value = "监控IDs", example = "6565463543") @RequestParam(required = false) List<Long> ids
|
||||
@ApiParam(value = "en: Monitoring ID List,zh: 监控ID列表", example = "6565463543") @RequestParam(required = false) List<Long> ids
|
||||
) {
|
||||
if (ids != null && !ids.isEmpty()) {
|
||||
monitorService.deleteMonitors(new HashSet<>(ids));
|
||||
@@ -128,9 +133,10 @@ public class MonitorsController {
|
||||
}
|
||||
|
||||
@DeleteMapping("manage")
|
||||
@ApiOperation(value = "批量取消纳管监控", notes = "根据监控ID列表批量取消纳管监控项")
|
||||
@ApiOperation(value = "Unmanaged monitoring items in batches according to the monitoring ID list",
|
||||
notes = "根据监控ID列表批量取消纳管监控项")
|
||||
public ResponseEntity<Message<Void>> cancelManageMonitors(
|
||||
@ApiParam(value = "监控IDs", example = "6565463543") @RequestParam(required = false) List<Long> ids
|
||||
@ApiParam(value = "en: Monitoring ID List,zh: 监控ID列表", example = "6565463543") @RequestParam(required = false) List<Long> ids
|
||||
) {
|
||||
if (ids != null && !ids.isEmpty()) {
|
||||
monitorService.cancelManageMonitors(new HashSet<>(ids));
|
||||
@@ -140,9 +146,10 @@ public class MonitorsController {
|
||||
}
|
||||
|
||||
@GetMapping("manage")
|
||||
@ApiOperation(value = "批量启动纳管监控", notes = "根据监控ID列表批量启动纳管监控项")
|
||||
@ApiOperation(value = "Start the managed monitoring items in batches according to the monitoring ID list",
|
||||
notes = "根据监控ID列表批量启动纳管监控项")
|
||||
public ResponseEntity<Message<Void>> enableManageMonitors(
|
||||
@ApiParam(value = "监控IDs", example = "6565463543") @RequestParam(required = false) List<Long> ids
|
||||
@ApiParam(value = "en: Monitor ID List,zh: 监控ID列表", example = "6565463543") @RequestParam(required = false) List<Long> ids
|
||||
) {
|
||||
if (ids != null && !ids.isEmpty()) {
|
||||
monitorService.enableManageMonitors(new HashSet<>(ids));
|
||||
|
||||
@@ -60,8 +60,10 @@ public class NoticeConfigController {
|
||||
@ApiOperation(value = "Delete existing recipient information", notes = "删除已存在的接收人信息")
|
||||
public ResponseEntity<Message<Void>> deleteNoticeReceiver(
|
||||
@ApiParam(value = "en: Recipient ID,zh: 接收人ID", example = "6565463543") @PathVariable("id") final Long receiverId) {
|
||||
// Returns success if it does not exist or if the deletion is successful
|
||||
// todo 不存在或删除成功都返回成功
|
||||
NoticeReceiver noticeReceiver = noticeConfigService.getReceiverById(receiverId);
|
||||
if (noticeReceiver == null) {
|
||||
return ResponseEntity.ok(new Message<>("The relevant information of the recipient could not be found, please check whether the parameters are correct"));
|
||||
}
|
||||
noticeConfigService.deleteReceiver(receiverId);
|
||||
return ResponseEntity.ok(new Message<>("Delete success"));
|
||||
}
|
||||
@@ -72,7 +74,6 @@ public class NoticeConfigController {
|
||||
public ResponseEntity<Message<List<NoticeReceiver>>> getReceivers(
|
||||
@ApiParam(value = "en: Recipient name,zh: 接收人名称,模糊查询", example = "tom") @RequestParam(required = false) final String name) {
|
||||
|
||||
//todo Writing can be optimized 写法可优化
|
||||
Specification<NoticeReceiver> specification = (root, query, criteriaBuilder) -> {
|
||||
Predicate predicate = criteriaBuilder.conjunction();
|
||||
if (name != null && !"".equals(name)) {
|
||||
@@ -107,6 +108,10 @@ public class NoticeConfigController {
|
||||
@ApiParam(value = "en: Notification Policy ID,zh: 通知策略ID", example = "6565463543") @PathVariable("id") final Long ruleId) {
|
||||
// Returns success if it does not exist or if the deletion is successful
|
||||
// todo 不存在或删除成功都返回成功
|
||||
NoticeRule noticeRule = noticeConfigService.getNoticeRulesById(ruleId);
|
||||
if (noticeRule == null) {
|
||||
return ResponseEntity.ok(new Message<>("The specified notification rule could not be queried, please check whether the parameters are correct"));
|
||||
}
|
||||
noticeConfigService.deleteNoticeRule(ruleId);
|
||||
return ResponseEntity.ok(new Message<>("Delete success"));
|
||||
}
|
||||
|
||||
@@ -22,33 +22,37 @@ public interface MonitorDao extends JpaRepository<Monitor, Long>, JpaSpecificati
|
||||
|
||||
|
||||
/**
|
||||
* Delete monitor based on monitor ID list
|
||||
* 根据监控ID列表删除监控
|
||||
*
|
||||
* @param monitorIds 监控ID列表
|
||||
* @param monitorIds Monitoring ID List 监控ID列表
|
||||
*/
|
||||
void deleteAllByIdIn(Set<Long> monitorIds);
|
||||
|
||||
/**
|
||||
* Query monitoring based on monitoring ID list
|
||||
* 根据监控ID列表查询监控
|
||||
*
|
||||
* @param monitorIds 监控ID列表
|
||||
* @return 监控列表
|
||||
* @param monitorIds Monitoring ID List 监控ID列表
|
||||
* @return Monitor List 监控列表
|
||||
*/
|
||||
List<Monitor> findMonitorsByIdIn(Set<Long> monitorIds);
|
||||
|
||||
/**
|
||||
* Query monitoring by monitoring type
|
||||
* 根据监控类型查询监控
|
||||
*
|
||||
* @param app 监控类型
|
||||
* @return 监控列表
|
||||
* @param app Monitor Type 监控类型
|
||||
* @return Monitor List 监控列表
|
||||
*/
|
||||
List<Monitor> findMonitorsByAppEquals(String app);
|
||||
|
||||
/**
|
||||
* Querying Monitoring of Sent Collection Tasks
|
||||
* 查询已下发采集任务的监控
|
||||
*
|
||||
* @param status 监控状态
|
||||
* @return 监控列表
|
||||
* @param status Monitor Status 监控状态
|
||||
* @return Monitor List 监控列表
|
||||
*/
|
||||
List<Monitor> findMonitorsByStatusNotInAndAndJobIdNotNull(List<Byte> status);
|
||||
|
||||
|
||||
@@ -8,27 +8,34 @@ import java.util.Set;
|
||||
|
||||
/**
|
||||
* ParamDao 数据库操作
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/14 11:26
|
||||
*/
|
||||
public interface ParamDao extends JpaRepository<Param, Long> {
|
||||
|
||||
/**
|
||||
* Query the list of parameters associated with the monitoring ID'
|
||||
* 根据监控ID查询与之关联的参数列表
|
||||
* @param monitorId 监控ID
|
||||
* @return 参数值列表
|
||||
*
|
||||
* @param monitorId Monitor ID 监控ID
|
||||
* @return list of parameter values 参数值列表
|
||||
*/
|
||||
List<Param> findParamsByMonitorId(long monitorId);
|
||||
|
||||
/**
|
||||
* Remove the parameter list associated with the monitoring ID based on it
|
||||
* 根据监控ID删除与之关联的参数列表
|
||||
* @param monitorId 监控ID
|
||||
*
|
||||
* @param monitorId Monitor Id 监控ID
|
||||
*/
|
||||
void deleteParamsByMonitorId(long monitorId);
|
||||
|
||||
/**
|
||||
* Remove the parameter list associated with the monitoring ID list based on it
|
||||
* 根据监控ID列表删除与之关联的参数列表
|
||||
* @param monitorIds 监控ID列表
|
||||
*
|
||||
* @param monitorIds Monitoring ID List 监控ID列表
|
||||
*/
|
||||
void deleteParamsByMonitorIdIn(Set<Long> monitorIds);
|
||||
}
|
||||
|
||||
@@ -14,15 +14,18 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_ONLY;
|
||||
import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||
|
||||
/**
|
||||
* Monitoring Information External Interaction Entities
|
||||
* 监控信息对外交互实体
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/14 10:13
|
||||
*/
|
||||
@Data
|
||||
@ApiModel(description = "监控信息实体")
|
||||
@ApiModel(description = "en: Monitoring information entities,zh: 监控信息实体")
|
||||
public class MonitorDto {
|
||||
|
||||
/**
|
||||
* Monitoring entity
|
||||
* 监控实体
|
||||
*/
|
||||
@ApiModelProperty(value = "监控实体", accessMode = READ_WRITE, position = 0)
|
||||
@@ -31,17 +34,22 @@ public class MonitorDto {
|
||||
private Monitor monitor;
|
||||
|
||||
/**
|
||||
* 参数
|
||||
* Params 参数
|
||||
*/
|
||||
@ApiModelProperty(value = "监控参数", accessMode = READ_WRITE, position = 1)
|
||||
@NotNull
|
||||
@Valid
|
||||
private List<Param> params;
|
||||
|
||||
/**
|
||||
* List of indicator groups
|
||||
* 指标组列表
|
||||
*/
|
||||
@ApiModelProperty(value = "指标组列表", accessMode = READ_ONLY, position = 2)
|
||||
private List<String> metrics;
|
||||
|
||||
/**
|
||||
* Whether to detect
|
||||
* 是否探测
|
||||
*/
|
||||
@ApiModelProperty(value = "是否进行探测", accessMode = READ_WRITE, position = 3)
|
||||
|
||||
@@ -9,6 +9,7 @@ import java.util.Map;
|
||||
|
||||
/**
|
||||
* 监控类型管理接口
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/14 17:12
|
||||
*/
|
||||
@@ -16,21 +17,26 @@ public interface AppService {
|
||||
|
||||
/**
|
||||
* 根据监控类型查询定义的参数结构
|
||||
*
|
||||
* @param app 监控类型
|
||||
* @return 参数结构列表
|
||||
*/
|
||||
List<ParamDefine> getAppParamDefines(String app);
|
||||
|
||||
/**
|
||||
* Get monitor structure definition based on monitor type name
|
||||
* 根据监控类型名称获取监控结构定义
|
||||
* @param app 监控类型名称
|
||||
* @return 监控结构定义
|
||||
* @throws IllegalArgumentException 当不存在即不支持对应名称的监控类型时抛出
|
||||
*
|
||||
* @param app Monitoring type name 监控类型名称
|
||||
* @return Monitoring Structure Definition 监控结构定义
|
||||
* @throws IllegalArgumentException Thrown when there is no monitoring type with the corresponding name that is not supported
|
||||
* 当不存在即不支持对应名称的监控类型时抛出
|
||||
*/
|
||||
Job getAppDefine(String app) throws IllegalArgumentException;
|
||||
|
||||
/**
|
||||
* 获取定义的监控I18N资源
|
||||
*
|
||||
* @param lang 语言类型
|
||||
* @return I18N资源
|
||||
*/
|
||||
@@ -38,6 +44,7 @@ public interface AppService {
|
||||
|
||||
/**
|
||||
* 查询所有监控的类型-指标组-指标层级
|
||||
*
|
||||
* @param lang 语言
|
||||
* @return 层级信息
|
||||
*/
|
||||
|
||||
@@ -23,93 +23,103 @@ public interface MonitorService {
|
||||
|
||||
|
||||
/**
|
||||
* Monitoring Availability Probes
|
||||
* 监控可用性探测
|
||||
*
|
||||
* @param monitor 监控实体信息
|
||||
* @param params 参数信息
|
||||
* @throws MonitorDetectException 探测失败抛出
|
||||
* @param monitor Monitoring entity information 监控实体信息
|
||||
* @param params Parameter information 参数信息
|
||||
* @throws MonitorDetectException Probe failure throws 探测失败抛出
|
||||
*/
|
||||
void detectMonitor(Monitor monitor, List<Param> params) throws MonitorDetectException;
|
||||
|
||||
/**
|
||||
* 新增监控
|
||||
* Add monitoring 新增监控
|
||||
*
|
||||
* @param monitor 监控实体
|
||||
* @param params 参数信息
|
||||
* @throws RuntimeException 新增过程异常抛出
|
||||
* @param monitor Monitoring Entity 监控实体
|
||||
* @param params Parameter information 参数信息
|
||||
* @throws RuntimeException Add process exception throw 新增过程异常抛出
|
||||
*/
|
||||
void addMonitor(Monitor monitor, List<Param> params) throws RuntimeException;
|
||||
|
||||
/**
|
||||
* Verify the correctness of request data parameters
|
||||
* 校验请求数据参数正确性
|
||||
*
|
||||
* @param monitorDto monitorDto
|
||||
* @param isModify 是否是修改监控
|
||||
* @throws IllegalArgumentException 校验参数错误抛出
|
||||
* @param isModify Whether it is a modification monitoring 是否是修改监控
|
||||
* @throws IllegalArgumentException Validation parameter error thrown 校验参数错误抛出
|
||||
*/
|
||||
void validate(MonitorDto monitorDto, Boolean isModify) throws IllegalArgumentException;
|
||||
|
||||
/**
|
||||
* Modify update monitoring
|
||||
* 修改更新监控
|
||||
*
|
||||
* @param monitor 监控实体
|
||||
* @param params 参数信息
|
||||
* @throws RuntimeException 修改过程中异常抛出
|
||||
* @param monitor Monitor Entity 监控实体
|
||||
* @param params Parameter information 参数信息
|
||||
* @throws RuntimeException Exception thrown during modification 修改过程中异常抛出
|
||||
*/
|
||||
void modifyMonitor(Monitor monitor, List<Param> params) throws RuntimeException;
|
||||
|
||||
/**
|
||||
* Delete Monitor
|
||||
* 删除监控
|
||||
*
|
||||
* @param id 监控ID
|
||||
* @throws RuntimeException 删除过程中异常抛出
|
||||
* @param id Monitor ID 监控ID
|
||||
* @throws RuntimeException Exception thrown during deletion 删除过程中异常抛出
|
||||
*/
|
||||
void deleteMonitor(long id) throws RuntimeException;
|
||||
|
||||
/**
|
||||
* Batch delete monitoring
|
||||
* 批量删除监控
|
||||
*
|
||||
* @param ids 监控ID
|
||||
* @throws RuntimeException 删除过程中异常抛出
|
||||
* @param ids Monitoring ID List 监控ID列表
|
||||
* @throws RuntimeException Exception thrown during deletion 删除过程中异常抛出
|
||||
*/
|
||||
void deleteMonitors(Set<Long> ids) throws RuntimeException;
|
||||
|
||||
/**
|
||||
* Get monitoring information
|
||||
* 获取监控信息
|
||||
*
|
||||
* @param id 监控ID
|
||||
* @return MonitorDto
|
||||
* @throws RuntimeException 查询过程中异常抛出
|
||||
* @param id Monitor ID 监控ID
|
||||
* @return MonitorDto Monitor Entity 監控实体
|
||||
* @throws RuntimeException Exception thrown during query 查询过程中异常抛出
|
||||
*/
|
||||
MonitorDto getMonitorDto(long id) throws RuntimeException;
|
||||
|
||||
/**
|
||||
* Dynamic conditional query
|
||||
* 动态条件查询
|
||||
*
|
||||
* @param specification 查询条件
|
||||
* @param pageRequest 分页参数
|
||||
* @return 查询结果
|
||||
* @param specification Query conditions 查询条件
|
||||
* @param pageRequest Pagination parameters 分页参数
|
||||
* @return Search Result 查询结果
|
||||
*/
|
||||
Page<Monitor> getMonitors(Specification<Monitor> specification, PageRequest pageRequest);
|
||||
|
||||
/**
|
||||
* Unmanaged monitoring items in batches according to the monitoring ID list
|
||||
* 根据监控ID列表批量取消纳管监控项
|
||||
*
|
||||
* @param ids 监控IDs
|
||||
* @param ids Monitoring ID List 监控ID列表
|
||||
*/
|
||||
void cancelManageMonitors(HashSet<Long> ids);
|
||||
|
||||
/**
|
||||
* Start the managed monitoring items in batches according to the monitoring ID list
|
||||
* 根据监控ID列表批量启动纳管监控项
|
||||
*
|
||||
* @param ids 监控IDs
|
||||
* @param ids Monitoring ID List 监控ID列表
|
||||
*/
|
||||
void enableManageMonitors(HashSet<Long> ids);
|
||||
|
||||
/**
|
||||
* Query the monitoring category and its corresponding monitoring quantity
|
||||
* 查询监控类别及其对应的监控数量
|
||||
*
|
||||
* @return 监控类别与监控数量映射
|
||||
* @return Monitoring Category and Monitoring Quantity Mapping 监控类别与监控数量映射
|
||||
*/
|
||||
List<AppCount> getAllAppMonitorsCount();
|
||||
|
||||
@@ -132,10 +142,11 @@ public interface MonitorService {
|
||||
void updateMonitorStatus(Long monitorId, byte status);
|
||||
|
||||
/**
|
||||
* Query the list of all monitoring information under the specified monitoring type
|
||||
* 查询指定监控类型下的所有监控信息列表
|
||||
*
|
||||
* @param app 监控类型
|
||||
* @return 监控列表
|
||||
* @param app Monitor Type 监控类型
|
||||
* @return Monitor Entity List 监控列表
|
||||
*/
|
||||
List<Monitor> getAppMonitors(String app);
|
||||
}
|
||||
|
||||
@@ -90,4 +90,22 @@ public interface NoticeConfigService {
|
||||
* @return Receiver 接收人
|
||||
*/
|
||||
List<NoticeReceiver> getReceiverFilterRule(Alert alert);
|
||||
|
||||
/**
|
||||
* Query recipient information based on recipient ID (primary key Id)
|
||||
* 根据接收人ID(主键Id)查询接收人信息
|
||||
*
|
||||
* @param receiverId Receiver ID (primary key ID) 接收人ID(主键ID)
|
||||
* @return Recipient Entity 接收人实体
|
||||
*/
|
||||
NoticeReceiver getReceiverById(Long receiverId);
|
||||
|
||||
/**
|
||||
* Query specific notification rules according to the rule ID (primary key ID)
|
||||
* 根据规则ID(主键ID)查询具体通知规则
|
||||
*
|
||||
* @param ruleId Rule ID 规则ID(主键ID)
|
||||
* @return Notification Rule Entity 通知规则实体
|
||||
*/
|
||||
NoticeRule getNoticeRulesById(Long ruleId);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package com.usthe.manager.service.impl;
|
||||
|
||||
import com.usthe.alert.AlerterProperties;
|
||||
import com.usthe.common.entity.alerter.Alert;
|
||||
import com.usthe.common.util.CommonUtil;
|
||||
import com.usthe.manager.service.MailService;
|
||||
@@ -11,6 +12,7 @@ import org.thymeleaf.context.Context;
|
||||
import javax.annotation.Resource;
|
||||
|
||||
/**
|
||||
* Mailbox sending service interface implementation class
|
||||
* 邮箱发送服务接口实现类
|
||||
*
|
||||
* @author 花城
|
||||
@@ -23,16 +25,20 @@ public class MailServiceImpl implements MailService {
|
||||
|
||||
@Resource
|
||||
private TemplateEngine templateEngine;
|
||||
@Resource
|
||||
private AlerterProperties alerterProperties;
|
||||
|
||||
@Override
|
||||
public String buildAlertHtmlTemplate(final Alert alert) {
|
||||
// Introduce thymeleaf context parameters to render pages
|
||||
// 引入thymeleaf上下文参数渲染页面
|
||||
Context context = new Context();
|
||||
context.setVariable("target",alert.getTarget());
|
||||
context.setVariable("monitorId",alert.getMonitorId());
|
||||
context.setVariable("monitorName",alert.getMonitorName());
|
||||
context.setVariable("target", alert.getTarget());
|
||||
context.setVariable("monitorId", alert.getMonitorId());
|
||||
context.setVariable("monitorName", alert.getMonitorName());
|
||||
context.setVariable("priority", CommonUtil.transferAlertPriority(alert.getPriority()));
|
||||
context.setVariable("content",alert.getContent());
|
||||
context.setVariable("content", alert.getContent());
|
||||
context.setVariable("consoleUrl", alerterProperties.getConsoleUrl());
|
||||
return templateEngine.process("mailAlarm", context);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -22,7 +22,6 @@ import com.usthe.manager.service.AppService;
|
||||
import com.usthe.manager.service.MonitorService;
|
||||
import com.usthe.manager.support.exception.MonitorDatabaseException;
|
||||
import com.usthe.manager.support.exception.MonitorDetectException;
|
||||
import jdk.nashorn.internal.runtime.regexp.joni.constants.Traverse;
|
||||
import lombok.extern.slf4j.Slf4j;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.data.domain.Page;
|
||||
@@ -81,11 +80,13 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
List<Configmap> configmaps = params.stream().map(param ->
|
||||
new Configmap(param.getField(), param.getValue(), param.getType())).collect(Collectors.toList());
|
||||
appDefine.setConfigmap(configmaps);
|
||||
// To detect availability, you only need to collect the set of availability indicators with a priority of 0.
|
||||
// 探测可用性只需要采集优先级为0的可用性指标集合
|
||||
List<Metrics> availableMetrics = appDefine.getMetrics().stream()
|
||||
.filter(item -> item.getPriority() == 0).collect(Collectors.toList());
|
||||
appDefine.setMetrics(availableMetrics);
|
||||
List<CollectRep.MetricsData> collectRep = collectJobService.collectSyncJobData(appDefine);
|
||||
// If the detection result fails, a detection exception is thrown
|
||||
// 判断探测结果 失败则抛出探测异常
|
||||
if (collectRep == null || collectRep.isEmpty()) {
|
||||
throw new MonitorDetectException("No collector response");
|
||||
@@ -98,9 +99,9 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void addMonitor(Monitor monitor, List<Param> params) throws RuntimeException {
|
||||
// 申请 monitor id
|
||||
// Apply for monitor id 申请 monitor id
|
||||
long monitorId = SnowFlakeIdGenerator.generateId();
|
||||
// 构造采集任务Job实体
|
||||
// Construct the collection task Job entity 构造采集任务Job实体
|
||||
Job appDefine = appService.getAppDefine(monitor.getApp());
|
||||
appDefine.setMonitorId(monitorId);
|
||||
appDefine.setInterval(monitor.getIntervals());
|
||||
@@ -111,8 +112,10 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
return new Configmap(param.getField(), param.getValue(), param.getType());
|
||||
}).collect(Collectors.toList());
|
||||
appDefine.setConfigmap(configmaps);
|
||||
// Send the collection task to get the job ID
|
||||
// 下发采集任务得到jobId
|
||||
long jobId = collectJobService.addAsyncCollectJob(appDefine);
|
||||
// Brush the library after the download is successful
|
||||
// 下发成功后刷库
|
||||
try {
|
||||
monitor.setId(monitorId);
|
||||
@@ -122,6 +125,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
paramDao.saveAll(params);
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
// Repository brushing abnormally cancels the previously delivered task
|
||||
// 刷库异常取消之前的下发任务
|
||||
collectJobService.cancelAsyncCollectJob(jobId);
|
||||
throw new MonitorDatabaseException(e.getMessage());
|
||||
@@ -131,6 +135,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
@Override
|
||||
@Transactional(readOnly = true)
|
||||
public void validate(MonitorDto monitorDto, Boolean isModify) throws IllegalArgumentException {
|
||||
// The request monitoring parameter matches the monitoring parameter definition mapping check
|
||||
// 请求监控参数与监控参数定义映射校验匹配
|
||||
Monitor monitor = monitorDto.getMonitor();
|
||||
monitor.setHost(monitor.getHost().trim());
|
||||
@@ -143,7 +148,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
param.setValue(value);
|
||||
})
|
||||
.collect(Collectors.toMap(Param::getField, param -> param));
|
||||
// 校验名称唯一性
|
||||
// Check name uniqueness 校验名称唯一性
|
||||
if (isModify != null) {
|
||||
Optional<Monitor> monitorOptional = monitorDao.findMonitorByNameEquals(monitor.getName());
|
||||
if (monitorOptional.isPresent()) {
|
||||
@@ -158,7 +163,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
}
|
||||
}
|
||||
|
||||
// 参数定义结构校验
|
||||
// Parameter definition structure verification 参数定义结构校验
|
||||
List<ParamDefine> paramDefines = appService.getAppParamDefines(monitorDto.getMonitor().getApp());
|
||||
if (paramDefines != null) {
|
||||
for (ParamDefine paramDefine : paramDefines) {
|
||||
@@ -204,6 +209,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
}
|
||||
break;
|
||||
case "password":
|
||||
// The plaintext password needs to be encrypted for transmission and storage
|
||||
// 明文密码需加密传输存储
|
||||
String passwordValue = param.getValue();
|
||||
if (!AesUtil.isCiphertext(passwordValue)) {
|
||||
@@ -213,7 +219,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
param.setType(CommonConstants.PARAM_TYPE_PASSWORD);
|
||||
break;
|
||||
case "boolean":
|
||||
// boolean校验
|
||||
// boolean check
|
||||
String booleanValue = param.getValue();
|
||||
try {
|
||||
Boolean.parseBoolean(booleanValue);
|
||||
@@ -223,7 +229,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
}
|
||||
break;
|
||||
case "radio":
|
||||
// radio单选值校验
|
||||
// radio single value check radio单选值校验
|
||||
List<ParamDefine.Option> options = paramDefine.getOptions();
|
||||
boolean invalid = true;
|
||||
if (options != null) {
|
||||
@@ -245,7 +251,8 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
case "key-value":
|
||||
// todo key-value校验
|
||||
break;
|
||||
// todo 更多参数定义与实际值格式校验
|
||||
// todo More parameter definitions and actual value format verification
|
||||
// 更多参数定义与实际值格式校验
|
||||
default:
|
||||
throw new IllegalArgumentException("ParamDefine type " + paramDefine.getType() + " is invalid.");
|
||||
}
|
||||
@@ -255,8 +262,10 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
}
|
||||
|
||||
@Override
|
||||
@Transactional(rollbackFor = Exception.class)
|
||||
public void modifyMonitor(Monitor monitor, List<Param> params) throws RuntimeException {
|
||||
long monitorId = monitor.getId();
|
||||
// Check to determine whether the monitor corresponding to the monitor Id exists
|
||||
// 查判断monitorId对应的此监控是否存在
|
||||
Optional<Monitor> queryOption = monitorDao.findById(monitorId);
|
||||
if (!queryOption.isPresent()) {
|
||||
@@ -264,9 +273,11 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
}
|
||||
Monitor preMonitor = queryOption.get();
|
||||
if (!preMonitor.getApp().equals(monitor.getApp())) {
|
||||
// The type of monitoring cannot be modified
|
||||
// 监控的类型不能修改
|
||||
throw new IllegalArgumentException("Can not modify monitor's app type");
|
||||
}
|
||||
// Construct the collection task Job entity
|
||||
// 构造采集任务Job实体
|
||||
Job appDefine = appService.getAppDefine(monitor.getApp());
|
||||
appDefine.setId(preMonitor.getJobId());
|
||||
@@ -277,14 +288,16 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
List<Configmap> configmaps = params.stream().map(param ->
|
||||
new Configmap(param.getField(), param.getValue(), param.getType())).collect(Collectors.toList());
|
||||
appDefine.setConfigmap(configmaps);
|
||||
// 更新采集任务
|
||||
collectJobService.updateAsyncCollectJob(appDefine);
|
||||
// After the update is successfully released, refresh the library
|
||||
// 下发更新成功后刷库
|
||||
try {
|
||||
monitor.setJobId(preMonitor.getJobId());
|
||||
monitor.setStatus(preMonitor.getStatus());
|
||||
monitorDao.save(monitor);
|
||||
paramDao.saveAll(params);
|
||||
// Update the collection task after the storage is completed
|
||||
// 入库完成后更新采集任务
|
||||
collectJobService.updateAsyncCollectJob(appDefine);
|
||||
} catch (Exception e) {
|
||||
log.error(e.getMessage(), e);
|
||||
throw new MonitorDatabaseException(e.getMessage());
|
||||
@@ -345,7 +358,9 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
|
||||
@Override
|
||||
public void cancelManageMonitors(HashSet<Long> ids) {
|
||||
// Update monitoring status Delete corresponding monitoring periodic task
|
||||
// 更新监控状态 删除对应的监控周期性任务
|
||||
// The jobId is not deleted, and the jobId is reused again after the management is started.
|
||||
// jobId不删除 待启动纳管之后再次复用jobId
|
||||
List<Monitor> managedMonitors = monitorDao.findMonitorsByIdIn(ids)
|
||||
.stream().filter(monitor ->
|
||||
@@ -362,6 +377,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
|
||||
@Override
|
||||
public void enableManageMonitors(HashSet<Long> ids) {
|
||||
// Update monitoring status Add corresponding monitoring periodic task
|
||||
// 更新监控状态 新增对应的监控周期性任务
|
||||
List<Monitor> unManagedMonitors = monitorDao.findMonitorsByIdIn(ids)
|
||||
.stream().filter(monitor ->
|
||||
@@ -371,6 +387,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
if (!unManagedMonitors.isEmpty()) {
|
||||
monitorDao.saveAll(unManagedMonitors);
|
||||
for (Monitor monitor : unManagedMonitors) {
|
||||
// Construct the collection task Job entity
|
||||
// 构造采集任务Job实体
|
||||
Job appDefine = appService.getAppDefine(monitor.getApp());
|
||||
appDefine.setMonitorId(monitor.getId());
|
||||
@@ -381,7 +398,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
List<Configmap> configmaps = params.stream().map(param ->
|
||||
new Configmap(param.getField(), param.getValue(), param.getType())).collect(Collectors.toList());
|
||||
appDefine.setConfigmap(configmaps);
|
||||
// 下发采集任务
|
||||
// Issue collection tasks 下发采集任务
|
||||
collectJobService.addAsyncCollectJob(appDefine);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -18,6 +18,7 @@ import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 消息通知配置实现
|
||||
*
|
||||
* @author tom
|
||||
* @date 2021/12/16 16:16
|
||||
*/
|
||||
@@ -74,13 +75,24 @@ public class NoticeConfigServiceImpl implements NoticeConfigService {
|
||||
|
||||
@Override
|
||||
public List<NoticeReceiver> getReceiverFilterRule(Alert alert) {
|
||||
// todo 使用缓存
|
||||
// todo use cache 使用缓存
|
||||
List<NoticeRule> rules = noticeRuleDao.findNoticeRulesByEnableTrue();
|
||||
// todo 暂时规则是全部转发 后面实现更多匹配规则:告警状态选择 监控类型选择等
|
||||
// todo The temporary rule is to forward all, and then implement more matching rules: alarm status selection, monitoring type selection, etc.
|
||||
// 暂时规则是全部转发 后面实现更多匹配规则:告警状态选择 监控类型选择等
|
||||
Set<Long> receiverIds = rules.stream()
|
||||
.filter(NoticeRule::isFilterAll)
|
||||
.map(NoticeRule::getReceiverId)
|
||||
.collect(Collectors.toSet());
|
||||
return noticeReceiverDao.findAllById(receiverIds);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NoticeReceiver getReceiverById(Long receiverId) {
|
||||
return noticeReceiverDao.getOne(receiverId);
|
||||
}
|
||||
|
||||
@Override
|
||||
public NoticeRule getNoticeRulesById(Long ruleId) {
|
||||
return noticeRuleDao.getOne(ruleId);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -69,3 +69,8 @@ warehouse:
|
||||
url: jdbc:TAOS-RS://localhost:6041/hertzbeat
|
||||
username: root
|
||||
password: taosdata
|
||||
|
||||
#自定义告警控制台地址
|
||||
alerter:
|
||||
#这里就是我们的自定义控制台地址
|
||||
console-url: https://console.tancloud.cn
|
||||
|
||||
@@ -4,7 +4,7 @@ category: custom
|
||||
app: example
|
||||
name:
|
||||
zh-CN: 模拟应用类型
|
||||
en-US: EXAMPLE APP
|
||||
en-US: EXAMPLE
|
||||
# 参数映射map. type是参数类型: 0-number数字, 1-string明文字符串, 2-secret加密字符串, 3-map映射的json串
|
||||
# 强制固定必须参数 - host
|
||||
configmap:
|
||||
|
||||
@@ -2,7 +2,7 @@ category: service
|
||||
app: fullsite
|
||||
name:
|
||||
zh-CN: 全站监控
|
||||
en-US: FULL WEBSITE MONITOR
|
||||
en-US: SITE MAP
|
||||
configmap:
|
||||
- key: host
|
||||
type: 1
|
||||
|
||||
@@ -2,7 +2,7 @@ category: service
|
||||
app: website
|
||||
name:
|
||||
zh-CN: 网站监测
|
||||
en-US: WEBSITE MONITOR
|
||||
en-US: WEBSITE
|
||||
configmap:
|
||||
- key: host
|
||||
type: 1
|
||||
|
||||
@@ -2,10 +2,35 @@
|
||||
|
||||
# 加载到匹配字典的资源,也就是需要被保护的,设置了所支持角色访问的资源
|
||||
# 没有配置的资源也默认被认证保护,但不鉴权
|
||||
# eg: /api/v1/source1===get===[role2] 表示 /api/v2/host===post 这条资源支持 role2 这一种角色访问
|
||||
# eg: /api/v1/source1===get===[admin] 表示 /api/v2/host===post 这条资源支持 admin 这一种角色访问
|
||||
# eg: /api/v1/source2===get===[] 表示 /api/v1/source2===get 这条资源不支持任何角色访问
|
||||
resourceRole:
|
||||
- /account/auth/refresh===post===[role1,role2,role3,role4]
|
||||
- /account/auth/refresh===post===[admin,user,guest]
|
||||
- /apps/**===get===[admin,user,guest]
|
||||
- /monitor/**===get===[admin,user,guest]
|
||||
- /monitor/**===post===[admin,user]
|
||||
- /monitor/**===put===[admin,user]
|
||||
- /monitor/**===delete==[admin]
|
||||
- /monitors/**===get===[admin,user,guest]
|
||||
- /monitors/**===post===[admin,user]
|
||||
- /monitors/**===put===[admin,user]
|
||||
- /monitors/**===delete===[admin]
|
||||
- /alert/**===get===[admin,user,guest]
|
||||
- /alert/**===post===[admin,user]
|
||||
- /alert/**===put===[admin,user]
|
||||
- /alert/**===delete===[admin]
|
||||
- /alerts/**===get===[admin,user,guest]
|
||||
- /alerts/**===post===[admin,user]
|
||||
- /alerts/**===put===[admin,user]
|
||||
- /alerts/**===delete===[admin]
|
||||
- /notice/**===get===[admin,user,guest]
|
||||
- /notice/**===post===[admin,user]
|
||||
- /notice/**===put===[admin,user]
|
||||
- /notice/**===delete===[admin]
|
||||
- /summary/**===get===[admin,user,guest]
|
||||
- /summary/**===post===[admin,user]
|
||||
- /summary/**===put===[admin,user]
|
||||
- /summary/**===delete===[admin]
|
||||
|
||||
# 需要被过滤保护的资源,不认证鉴权直接访问
|
||||
# /api/v1/source3===get 表示 /api/v1/source3===get 可以被任何人访问 无需登录认证鉴权
|
||||
@@ -31,20 +56,23 @@ excludedResource:
|
||||
|
||||
# 用户账户信息
|
||||
# 下面有 admin tom lili 三个账户
|
||||
# eg: admin 拥有[role1,role2]角色,密码为admin
|
||||
# eg: tom 拥有[role1,role2,role3],密码为tom@123
|
||||
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
|
||||
# eg: admin 拥有[admin,user]角色,密码为admin
|
||||
# eg: tom 拥有[user],密码为tom@123
|
||||
# eg: lili 拥有[guest],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
|
||||
account:
|
||||
- appId: admin
|
||||
credential: admin
|
||||
role: [role1,role2]
|
||||
role: [admin,user]
|
||||
- appId: tom
|
||||
credential: tom@123
|
||||
role: [role1,role2,role3]
|
||||
role: [user]
|
||||
- appId: guest
|
||||
credential: guest
|
||||
role: [guest]
|
||||
- appId: lili
|
||||
# 注意 Digest认证不支持加盐加密的密码账户
|
||||
# 加盐加密的密码,通过 MD5(password+salt)计算
|
||||
# 此账户的原始密码为 lili
|
||||
credential: 1A676730B0C7F54654B0E09184448289
|
||||
salt: 123
|
||||
role: [role1,role2]
|
||||
role: [guest]
|
||||
|
||||
@@ -700,7 +700,7 @@
|
||||
<span style="font-family:Arial, Verdana; font-size:14px;color:#FFFFFF;"><a
|
||||
target="_blank"
|
||||
style="color:#FFFFFF;text-decoration:none;"
|
||||
href="https://console.tancloud.cn"
|
||||
th:href="${consoleUrl}"
|
||||
data-link-type="web">登入控制台</a></span>
|
||||
</td>
|
||||
</tr>
|
||||
|
||||
@@ -2,11 +2,9 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
rem 项目名称
|
||||
set SERVER_NAME="${project.artifactId}"
|
||||
|
||||
|
||||
rem 应用的端口号
|
||||
set SERVER_PORT=1157
|
||||
|
||||
echo Start shutdown HertzBeat %SERVER_NAME%
|
||||
|
||||
@@ -2,25 +2,21 @@
|
||||
@echo off
|
||||
setlocal enabledelayedexpansion
|
||||
|
||||
rem 项目名称
|
||||
set SERVER_NAME=${project.artifactId}
|
||||
|
||||
rem jar名称
|
||||
set JAR_NAME=${project.build.finalName}.jar
|
||||
|
||||
rem 进入bin目录
|
||||
rem enter the bin directory
|
||||
cd /d %~dp0
|
||||
rem 返回到上一级项目根目录路径
|
||||
|
||||
cd ..
|
||||
rem 打印项目安装根目录绝对路径
|
||||
|
||||
set DEPLOY_DIR=%~dp0..
|
||||
echo %DEPLOY_DIR%
|
||||
rem 外部配置文件绝对目录,如果是目录需要/结尾,也可以直接指定文件
|
||||
rem 如果指定的是目录,spring则会读取目录中的所有配置文件
|
||||
|
||||
set CONF_DIR=%DEPLOY_DIR%\config
|
||||
echo %CONF_DIR%
|
||||
|
||||
rem 应用的端口号
|
||||
set SERVER_PORT=1157
|
||||
|
||||
for /f "tokens=1-5" %%i in ('netstat -ano^|findstr "0.0.0.0:%SERVER_PORT%"') do (
|
||||
@@ -29,8 +25,6 @@ for /f "tokens=1-5" %%i in ('netstat -ano^|findstr "0.0.0.0:%SERVER_PORT%"') do
|
||||
goto q
|
||||
)
|
||||
|
||||
|
||||
rem 项目日志输出绝对路径
|
||||
set LOGS_DIR=%DEPLOY_DIR%\logs
|
||||
|
||||
rem JVM Configuration
|
||||
@@ -38,9 +32,9 @@ set JAVA_OPTS= -Duser.timezone=Asia/Shanghai
|
||||
|
||||
set JAVA_MEM_OPTS= -server -XX:SurvivorRatio=6 -XX:+UseParallelGC
|
||||
|
||||
rem 加载外部log文件的配置
|
||||
|
||||
set LOGGING_CONFIG=-Dlogging.config=%CONF_DIR%\logback-spring.xml
|
||||
rem 注意配置文件目录最后的后缀需为 / 而不是 windows \
|
||||
|
||||
set CONFIG_FILES= -Dlogging.path=%LOGS_DIR% %LOGGING_CONFIG% -Dspring.config.location=%CONF_DIR%/
|
||||
echo Starting the %SERVER_NAME% ...
|
||||
|
||||
|
||||
@@ -2,10 +2,35 @@
|
||||
|
||||
# 加载到匹配字典的资源,也就是需要被保护的,设置了所支持角色访问的资源
|
||||
# 没有配置的资源也默认被认证保护,但不鉴权
|
||||
# eg: /api/v1/source1===get===[role2] 表示 /api/v2/host===post 这条资源支持 role2 这一种角色访问
|
||||
# eg: /api/v1/source1===get===[admin] 表示 /api/v2/host===post 这条资源支持 admin 这一种角色访问
|
||||
# eg: /api/v1/source2===get===[] 表示 /api/v1/source2===get 这条资源不支持任何角色访问
|
||||
resourceRole:
|
||||
- /account/auth/refresh===post===[role1,role2,role3,role4]
|
||||
- /account/auth/refresh===post===[admin,user,guest]
|
||||
- /apps/**===get===[admin,user,guest]
|
||||
- /monitor/**===get===[admin,user,guest]
|
||||
- /monitor/**===post===[admin,user]
|
||||
- /monitor/**===put===[admin,user]
|
||||
- /monitor/**===delete==[admin]
|
||||
- /monitors/**===get===[admin,user,guest]
|
||||
- /monitors/**===post===[admin,user]
|
||||
- /monitors/**===put===[admin,user]
|
||||
- /monitors/**===delete===[admin]
|
||||
- /alert/**===get===[admin,user,guest]
|
||||
- /alert/**===post===[admin,user]
|
||||
- /alert/**===put===[admin,user]
|
||||
- /alert/**===delete===[admin]
|
||||
- /alerts/**===get===[admin,user,guest]
|
||||
- /alerts/**===post===[admin,user]
|
||||
- /alerts/**===put===[admin,user]
|
||||
- /alerts/**===delete===[admin]
|
||||
- /notice/**===get===[admin,user,guest]
|
||||
- /notice/**===post===[admin,user]
|
||||
- /notice/**===put===[admin,user]
|
||||
- /notice/**===delete===[admin]
|
||||
- /summary/**===get===[admin,user,guest]
|
||||
- /summary/**===post===[admin,user]
|
||||
- /summary/**===put===[admin,user]
|
||||
- /summary/**===delete===[admin]
|
||||
|
||||
# 需要被过滤保护的资源,不认证鉴权直接访问
|
||||
# /api/v1/source3===get 表示 /api/v1/source3===get 可以被任何人访问 无需登录认证鉴权
|
||||
@@ -31,20 +56,23 @@ excludedResource:
|
||||
|
||||
# 用户账户信息
|
||||
# 下面有 admin tom lili 三个账户
|
||||
# eg: admin 拥有[role1,role2]角色,密码为admin
|
||||
# eg: tom 拥有[role1,role2,role3],密码为tom@123
|
||||
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
|
||||
# eg: admin 拥有[admin,user]角色,密码为admin
|
||||
# eg: tom 拥有[user],密码为tom@123
|
||||
# eg: lili 拥有[guest],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
|
||||
account:
|
||||
- appId: admin
|
||||
credential: admin
|
||||
role: [role1,role2]
|
||||
role: [admin,user]
|
||||
- appId: tom
|
||||
credential: tom
|
||||
role: [role1,role2,role3]
|
||||
credential: tom@123
|
||||
role: [user]
|
||||
- appId: guest
|
||||
credential: guest
|
||||
role: [guest]
|
||||
- appId: lili
|
||||
# 注意 Digest认证不支持加盐加密的密码账户
|
||||
# 加盐加密的密码,通过 MD5(password+salt)计算
|
||||
# 此账户的原始密码为 lili
|
||||
credential: 1A676730B0C7F54654B0E09194448289
|
||||
credential: 1A676730B0C7F54654B0E09184448289
|
||||
salt: 123
|
||||
role: [role1,role2]
|
||||
role: [guest]
|
||||
|
||||
@@ -26,6 +26,8 @@ services:
|
||||
container_name: tdengine
|
||||
hostname: tdengine
|
||||
restart: always
|
||||
environment:
|
||||
TZ: Asia/Shanghai
|
||||
ports:
|
||||
- "6030-6049:6030-6049"
|
||||
- "6030-6049:6030-6049/udp"
|
||||
|
||||
@@ -2,10 +2,35 @@
|
||||
|
||||
# 加载到匹配字典的资源,也就是需要被保护的,设置了所支持角色访问的资源
|
||||
# 没有配置的资源也默认被认证保护,但不鉴权
|
||||
# eg: /api/v1/source1===get===[role2] 表示 /api/v2/host===post 这条资源支持 role2 这一种角色访问
|
||||
# eg: /api/v1/source1===get===[admin] 表示 /api/v2/host===post 这条资源支持 admin 这一种角色访问
|
||||
# eg: /api/v1/source2===get===[] 表示 /api/v1/source2===get 这条资源不支持任何角色访问
|
||||
resourceRole:
|
||||
- /account/auth/refresh===post===[role1,role2,role3,role4]
|
||||
- /account/auth/refresh===post===[admin,user,guest]
|
||||
- /apps/**===get===[admin,user,guest]
|
||||
- /monitor/**===get===[admin,user,guest]
|
||||
- /monitor/**===post===[admin,user]
|
||||
- /monitor/**===put===[admin,user]
|
||||
- /monitor/**===delete==[admin]
|
||||
- /monitors/**===get===[admin,user,guest]
|
||||
- /monitors/**===post===[admin,user]
|
||||
- /monitors/**===put===[admin,user]
|
||||
- /monitors/**===delete===[admin]
|
||||
- /alert/**===get===[admin,user,guest]
|
||||
- /alert/**===post===[admin,user]
|
||||
- /alert/**===put===[admin,user]
|
||||
- /alert/**===delete===[admin]
|
||||
- /alerts/**===get===[admin,user,guest]
|
||||
- /alerts/**===post===[admin,user]
|
||||
- /alerts/**===put===[admin,user]
|
||||
- /alerts/**===delete===[admin]
|
||||
- /notice/**===get===[admin,user,guest]
|
||||
- /notice/**===post===[admin,user]
|
||||
- /notice/**===put===[admin,user]
|
||||
- /notice/**===delete===[admin]
|
||||
- /summary/**===get===[admin,user,guest]
|
||||
- /summary/**===post===[admin,user]
|
||||
- /summary/**===put===[admin,user]
|
||||
- /summary/**===delete===[admin]
|
||||
|
||||
# 需要被过滤保护的资源,不认证鉴权直接访问
|
||||
# /api/v1/source3===get 表示 /api/v1/source3===get 可以被任何人访问 无需登录认证鉴权
|
||||
@@ -31,20 +56,23 @@ excludedResource:
|
||||
|
||||
# 用户账户信息
|
||||
# 下面有 admin tom lili 三个账户
|
||||
# eg: admin 拥有[role1,role2]角色,密码为admin
|
||||
# eg: tom 拥有[role1,role2,role3],密码为tom@123
|
||||
# eg: lili 拥有[role1,role2],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
|
||||
# eg: admin 拥有[admin,user]角色,密码为admin
|
||||
# eg: tom 拥有[user],密码为tom@123
|
||||
# eg: lili 拥有[guest],明文密码为lili, 加盐密码为1A676730B0C7F54654B0E09184448289
|
||||
account:
|
||||
- appId: admin
|
||||
credential: admin
|
||||
role: [role1,role2]
|
||||
role: [admin,user]
|
||||
- appId: tom
|
||||
credential: tom@123
|
||||
role: [role1,role2,role3]
|
||||
role: [user]
|
||||
- appId: guest
|
||||
credential: guest
|
||||
role: [guest]
|
||||
- appId: lili
|
||||
# 注意 Digest认证不支持加盐加密的密码账户
|
||||
# 加盐加密的密码,通过 MD5(password+salt)计算
|
||||
# 此账户的原始密码为 lili
|
||||
credential: 1A676730B0C7F54654B0E09184448289
|
||||
salt: 123
|
||||
role: [role1,role2]
|
||||
role: [guest]
|
||||
|
||||
@@ -26,8 +26,8 @@ const CODE_MESSAGE: { [key: number]: string } = {
|
||||
202: '一个请求已经进入后台排队(异步任务)。',
|
||||
204: '删除数据成功。',
|
||||
400: '发出的请求有错误,服务器没有进行新建或修改数据的操作。',
|
||||
401: '用户没有权限(令牌、用户名、密码错误)。',
|
||||
403: '用户无权限访问此资源。',
|
||||
401: '用户认证信息异常。',
|
||||
403: '用户无此操作权限。',
|
||||
404: '发出的请求针对的是不存在的记录,服务器没有进行操作。',
|
||||
406: '请求的格式不可得。',
|
||||
409: '请求与服务器端目标资源的当前状态相冲突',
|
||||
@@ -65,8 +65,12 @@ export class DefaultInterceptor implements HttpInterceptor {
|
||||
private checkStatus(ev: HttpResponseBase): void {
|
||||
const errorText = CODE_MESSAGE[ev.status] || ev.statusText;
|
||||
console.warn(` ${ev.status}: ${ev.url}`, errorText);
|
||||
if (ev.status == 403) {
|
||||
this.notification.error(` ${ev.status}: ${errorText}`, '');
|
||||
} else {
|
||||
this.notification.error(` ${ev.status}: ${ev.url}`, errorText);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* 刷新 Token 请求
|
||||
|
||||
@@ -71,9 +71,9 @@ import { environment } from '@env/environment';
|
||||
<setting-drawer *ngIf="showSettingDrawer"></setting-drawer>
|
||||
<theme-btn
|
||||
[types]="[
|
||||
{ key: 'default', text: '浅色主题' },
|
||||
{ key: 'dark', text: '深色主题' },
|
||||
{ key: 'compact', text: '紧凑主题' }
|
||||
{ key: 'default', text: 'app.theme.default' | i18n },
|
||||
{ key: 'dark', text: 'app.theme.dark' | i18n },
|
||||
{ key: 'compact', text: 'app.theme.compact' | i18n }
|
||||
]"
|
||||
></theme-btn>
|
||||
`
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import { ChangeDetectionStrategy, Component, HostListener } from '@angular/core';
|
||||
import { ChangeDetectionStrategy, Component, HostListener, Inject } from '@angular/core';
|
||||
import { I18NService } from '@core';
|
||||
import { ALAIN_I18N_TOKEN } from '@delon/theme';
|
||||
import { NzMessageService } from 'ng-zorro-antd/message';
|
||||
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||
|
||||
@@ -14,15 +16,19 @@ import { NzModalService } from 'ng-zorro-antd/modal';
|
||||
changeDetection: ChangeDetectionStrategy.OnPush
|
||||
})
|
||||
export class HeaderClearStorageComponent {
|
||||
constructor(private modalSrv: NzModalService, private messageSrv: NzMessageService) {}
|
||||
constructor(
|
||||
private modalSrv: NzModalService,
|
||||
private messageSrv: NzMessageService,
|
||||
@Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService
|
||||
) {}
|
||||
|
||||
@HostListener('click')
|
||||
_click(): void {
|
||||
this.modalSrv.confirm({
|
||||
nzTitle: '请确认是否清理缓存?',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.clear-cache'),
|
||||
nzOnOk: () => {
|
||||
localStorage.clear();
|
||||
this.messageSrv.success('清理成功!');
|
||||
this.messageSrv.success(this.i18nSvc.fanyi('common.notify.clear-success'));
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -26,11 +26,11 @@ import { AlertService } from '../../../service/alert.service';
|
||||
export class HeaderNotifyComponent implements OnInit {
|
||||
data: NoticeItem[] = [
|
||||
{
|
||||
title: '近期未处理告警',
|
||||
title: this.i18nSvc.fanyi('dashboard.alerts.title-no'),
|
||||
list: [],
|
||||
emptyText: '暂无未处理告警',
|
||||
emptyText: this.i18nSvc.fanyi('dashboard.alerts.no'),
|
||||
emptyImage: 'https://gw.alipayobjects.com/zos/rmsportal/wAhyIChODzsoKIOBHcBk.svg',
|
||||
clearText: '进入告警中心'
|
||||
clearText: this.i18nSvc.fanyi('dashboard.alerts.enter')
|
||||
}
|
||||
];
|
||||
count = 0;
|
||||
@@ -54,7 +54,7 @@ export class HeaderNotifyComponent implements OnInit {
|
||||
return;
|
||||
}
|
||||
this.loading = true;
|
||||
let loadAlerts$ = this.alertSvc.searchAlerts(0, undefined, undefined, 0, 5).subscribe(
|
||||
let loadAlerts$ = this.alertSvc.loadAlerts(0, undefined, undefined, 0, 5).subscribe(
|
||||
message => {
|
||||
loadAlerts$.unsubscribe();
|
||||
if (message.code === 0) {
|
||||
@@ -69,10 +69,10 @@ export class HeaderNotifyComponent implements OnInit {
|
||||
let item = {
|
||||
id: alert.id,
|
||||
avatar: 'https://gw.alipayobjects.com/zos/rmsportal/ThXAXghbEsBCCSDihZxY.png',
|
||||
title: `监控-${alert.monitorName}-发出${this.i18nSvc.fanyi(`alert.priority.${alert.priority}`)}`,
|
||||
title: `${alert.monitorName}--${this.i18nSvc.fanyi(`alert.priority.${alert.priority}`)}`,
|
||||
datetime: alert.gmtCreate,
|
||||
color: 'blue',
|
||||
type: '近期未处理告警'
|
||||
type: this.i18nSvc.fanyi('dashboard.alerts.title-no')
|
||||
};
|
||||
this.data[0].list.push(item);
|
||||
});
|
||||
|
||||
@@ -40,8 +40,8 @@ import { MonitorService } from '../../../service/monitor.service';
|
||||
<nz-autocomplete nzBackfill="false" nzDefaultActiveFirstOption #auto>
|
||||
<nz-auto-option *ngFor="let option of options" [nzValue]="option.id" [nzLabel]="option.name">
|
||||
<a [routerLink]="['/monitors/' + option.id]">
|
||||
监控名称: {{ option.name }}
|
||||
<span style="left:50% ; position: absolute;">监控Host: {{ option.host }}</span>
|
||||
{{ 'monitor.name' | i18n }} : {{ option.name }}
|
||||
<span style="left:50% ; position: absolute;">{{ 'monitor.host' | i18n }} : {{ option.host }}</span>
|
||||
<span style="right: 10px; position: absolute;"><i nz-icon nzType="arrow-right" nzTheme="outline"></i></span>
|
||||
</a>
|
||||
</nz-auto-option>
|
||||
|
||||
@@ -6,15 +6,15 @@
|
||||
<img class="logo" src="./assets/logo.svg" alt="" />
|
||||
<span class="title">HertzBeat</span>
|
||||
</div>
|
||||
<div class="desc">TanCloud-易用友好的高性能监控云服务</div>
|
||||
<div class="desc">{{ 'app.passport.desc' | i18n }}</div>
|
||||
</div>
|
||||
<router-outlet></router-outlet>
|
||||
<global-footer [links]="links">
|
||||
Copyright
|
||||
<i nz-icon nzType="copyright" nzTheme="outline"></i>
|
||||
2022
|
||||
<a href="https://tancloud.cn" target="_blank">探云 tancloud.cn | </a>
|
||||
<a href="https://hertzbeat.com" target="_blank">赫兹跳动 hertzbeat.com</a>
|
||||
<a href="https://tancloud.cn" target="_blank">TanCloud tancloud.cn | </a>
|
||||
<a href="https://hertzbeat.com" target="_blank">HertzBeat hertzbeat.com</a>
|
||||
</global-footer>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
import { I18NService } from '@core';
|
||||
import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth';
|
||||
import { ALAIN_I18N_TOKEN } from '@delon/theme';
|
||||
|
||||
@Component({
|
||||
selector: 'layout-passport',
|
||||
@@ -9,12 +11,12 @@ import { DA_SERVICE_TOKEN, ITokenService } from '@delon/auth';
|
||||
export class LayoutPassportComponent implements OnInit {
|
||||
links = [
|
||||
{
|
||||
title: '欢迎使用TanCloud探云-监控云服务-tancloud.cn',
|
||||
title: this.i18nSvc.fanyi('app.passport.welcome'),
|
||||
href: 'https://tancloud.cn'
|
||||
}
|
||||
];
|
||||
|
||||
constructor(@Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService) {}
|
||||
constructor(@Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService, @Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.tokenService.clear();
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
<nz-breadcrumb-item>
|
||||
<a [routerLink]="['/']">
|
||||
<i nz-icon nzType="home"></i>
|
||||
<span>仪表盘</span>
|
||||
<span>{{ 'menu.dashboard' | i18n }}</span>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
<nz-breadcrumb-item>
|
||||
<i nz-icon nzType="alert"></i>
|
||||
<span>告警中心</span>
|
||||
<span>{{ 'menu.alert.center' | i18n }}</span>
|
||||
</nz-breadcrumb-item>
|
||||
</nz-breadcrumb>
|
||||
<nz-divider></nz-divider>
|
||||
@@ -16,50 +16,53 @@
|
||||
<div>
|
||||
<button nz-button nzType="primary" (click)="onDeleteAlerts()">
|
||||
<i nz-icon nzType="delete" nzTheme="outline"></i>
|
||||
删除告警
|
||||
{{ 'alert.center.delete' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onMarkReadAlerts()">
|
||||
<i nz-icon nzType="down-circle" nzTheme="outline"></i>
|
||||
标记已处理
|
||||
{{ 'alert.center.deal' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onMarkUnReadAlerts()">
|
||||
<i nz-icon nzType="up-circle" nzTheme="outline"></i>
|
||||
标记未处理
|
||||
{{ 'alert.center.no-deal' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="sync()" nz-tooltip nzTooltipTitle="刷新">
|
||||
<button nz-button nzType="primary" (click)="sync()" nz-tooltip [nzTooltipTitle]="'common.refresh' | i18n">
|
||||
<i nz-icon nzType="sync" nzTheme="outline"></i>
|
||||
</button>
|
||||
|
||||
<button style="margin-right: 25px; float: right" nz-button nzType="primary" (click)="onFilterSearchAlerts()"> 搜索 </button>
|
||||
<button style="margin-right: 25px; float: right" nz-button nzType="primary" (click)="loadAlertsTable()">
|
||||
{{ 'common.search' | i18n }}
|
||||
</button>
|
||||
<input
|
||||
style="margin-right: 5px; float: right; width: 150px; border-radius: 9px; text-align: center"
|
||||
nz-input
|
||||
type="text"
|
||||
placeholder="搜索告警内容"
|
||||
[placeholder]="'alert.center.search' | i18n"
|
||||
nzSize="default"
|
||||
(keyup.enter)="onFilterSearchAlerts()"
|
||||
(keyup.enter)="loadAlertsTable()"
|
||||
[(ngModel)]="filterContent"
|
||||
/>
|
||||
<nz-select
|
||||
style="margin-right: 10px; float: right; width: 120px"
|
||||
nzAllowClear
|
||||
[nzPlaceHolder]="'告警状态过滤'"
|
||||
[nzPlaceHolder]="'alert.center.filter-status' | i18n"
|
||||
[(ngModel)]="filterStatus"
|
||||
>
|
||||
<nz-option nzLabel="全部状态" nzValue="9"></nz-option>
|
||||
<nz-option nzLabel="未处理" nzValue="0"></nz-option>
|
||||
<nz-option nzLabel="已处理" nzValue="3"></nz-option>
|
||||
<nz-option [nzLabel]="'alert.status.all' | i18n" nzValue="9"></nz-option>
|
||||
<nz-option [nzLabel]="'alert.status.0' | i18n" nzValue="0"></nz-option>
|
||||
<nz-option [nzLabel]="'alert.status.2' | i18n" nzValue="2"></nz-option>
|
||||
<nz-option [nzLabel]="'alert.status.3' | i18n" nzValue="3"></nz-option>
|
||||
</nz-select>
|
||||
<nz-select
|
||||
style="margin-right: 10px; float: right; width: 120px"
|
||||
nzAllowClear
|
||||
[nzPlaceHolder]="'告警级别过滤'"
|
||||
[nzPlaceHolder]="'alert.center.filter-priority' | i18n"
|
||||
[(ngModel)]="filterPriority"
|
||||
>
|
||||
<nz-option nzLabel="全部级别" nzValue="9"></nz-option>
|
||||
<nz-option nzLabel="警告级别" nzValue="2"></nz-option>
|
||||
<nz-option nzLabel="严重级别" nzValue="1"></nz-option>
|
||||
<nz-option nzLabel="紧急级别" nzValue="0"></nz-option>
|
||||
<nz-option [nzLabel]="'alert.priority.all' | i18n" nzValue="9"></nz-option>
|
||||
<nz-option [nzLabel]="'alert.priority.2' | i18n" nzValue="2"></nz-option>
|
||||
<nz-option [nzLabel]="'alert.priority.1' | i18n" nzValue="1"></nz-option>
|
||||
<nz-option [nzLabel]="'alert.priority.0' | i18n" nzValue="0"></nz-option>
|
||||
</nz-select>
|
||||
</div>
|
||||
|
||||
@@ -81,13 +84,13 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th nzAlign="center" nzLeft nzWidth="4%" [(nzChecked)]="checkedAll" (nzCheckedChange)="onAllChecked($event)"></th>
|
||||
<th nzAlign="center" nzLeft>告警指标</th>
|
||||
<th nzAlign="center">所属监控</th>
|
||||
<th nzAlign="center">级别</th>
|
||||
<th nzAlign="center">告警内容</th>
|
||||
<th nzAlign="center">状态</th>
|
||||
<th nzAlign="center">告警时间</th>
|
||||
<th nzAlign="center">操作</th>
|
||||
<th nzAlign="center" nzLeft>{{ 'alert.center.target' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'alert.center.monitor' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'alert.center.priority' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'alert.center.content' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'alert.center.status' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'alert.center.time' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'common.edit' | i18n }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -102,30 +105,36 @@
|
||||
<td nzAlign="center">
|
||||
<nz-tag *ngIf="data.priority == 0" nzColor="red">
|
||||
<i nz-icon nzType="bell" nzTheme="outline"></i>
|
||||
<span>紧急告警</span>
|
||||
<span>{{ 'alert.priority.0' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.priority == 1" nzColor="orange">
|
||||
<i nz-icon nzType="bell" nzTheme="outline"></i>
|
||||
<span>严重告警</span>
|
||||
<span>{{ 'alert.priority.1' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.priority == 2" nzColor="yellow">
|
||||
<i nz-icon nzType="bell" nzTheme="outline"></i>
|
||||
<span>警告告警</span>
|
||||
<span>{{ 'alert.priority.2' | i18n }}</span>
|
||||
</nz-tag>
|
||||
</td>
|
||||
<td nzAlign="center">{{ data.content }}</td>
|
||||
<td nzAlign="center">
|
||||
{{ data.status === 0 ? '未处理' : '已处理' }}
|
||||
{{ 'alert.status.' + data.status | i18n }}
|
||||
</td>
|
||||
<td nzAlign="center">{{ data.gmtCreate | date: 'YYYY-MM-dd HH:mm:ss' }}</td>
|
||||
<td nzAlign="center">
|
||||
<button nz-button nzType="primary" (click)="onDeleteOneAlert(data.id)" nz-tooltip nzTooltipTitle="删除告警">
|
||||
<button nz-button nzType="primary" (click)="onDeleteOneAlert(data.id)" nz-tooltip [nzTooltipTitle]="'alert.center.delete' | i18n">
|
||||
<i nz-icon nzType="delete" nzTheme="outline"></i>
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onMarkReadOneAlert(data.id)" nz-tooltip nzTooltipTitle="标记已处理">
|
||||
<button nz-button nzType="primary" (click)="onMarkReadOneAlert(data.id)" nz-tooltip [nzTooltipTitle]="'alert.center.deal' | i18n">
|
||||
<i nz-icon nzType="down-circle" nzTheme="outline"></i>
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onMarkUnReadOneAlert(data.id)" nz-tooltip nzTooltipTitle="标记未处理">
|
||||
<button
|
||||
nz-button
|
||||
nzType="primary"
|
||||
(click)="onMarkUnReadOneAlert(data.id)"
|
||||
nz-tooltip
|
||||
[nzTooltipTitle]="'alert.center.no-deal' | i18n"
|
||||
>
|
||||
<i nz-icon nzType="up-circle" nzTheme="outline"></i>
|
||||
</button>
|
||||
</td>
|
||||
@@ -133,4 +142,4 @@
|
||||
</tbody>
|
||||
</nz-table>
|
||||
|
||||
<ng-template #rangeTemplate> 总量 {{ total }} </ng-template>
|
||||
<ng-template #rangeTemplate> {{ 'common.total' | i18n }} {{ total }} </ng-template>
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
import { I18NService } from '@core';
|
||||
import { ALAIN_I18N_TOKEN } from '@delon/theme';
|
||||
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||
import { NzNotificationService } from 'ng-zorro-antd/notification';
|
||||
import { NzTableQueryParams } from 'ng-zorro-antd/table';
|
||||
@@ -12,7 +14,12 @@ import { AlertService } from '../../../service/alert.service';
|
||||
styles: []
|
||||
})
|
||||
export class AlertCenterComponent implements OnInit {
|
||||
constructor(private notifySvc: NzNotificationService, private modal: NzModalService, private alertSvc: AlertService) {}
|
||||
constructor(
|
||||
private notifySvc: NzNotificationService,
|
||||
private modal: NzModalService,
|
||||
private alertSvc: AlertService,
|
||||
@Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService
|
||||
) {}
|
||||
|
||||
pageIndex: number = 1;
|
||||
pageSize: number = 8;
|
||||
@@ -29,40 +36,15 @@ export class AlertCenterComponent implements OnInit {
|
||||
this.loadAlertsTable();
|
||||
}
|
||||
|
||||
onFilterSearchAlerts() {
|
||||
this.tableLoading = true;
|
||||
let filterAlerts$ = this.alertSvc
|
||||
.searchAlerts(this.filterStatus, this.filterPriority, this.filterContent, this.pageIndex - 1, this.pageSize)
|
||||
.subscribe(
|
||||
message => {
|
||||
filterAlerts$.unsubscribe();
|
||||
this.tableLoading = false;
|
||||
this.checkedAll = false;
|
||||
this.checkedAlertIds.clear();
|
||||
if (message.code === 0) {
|
||||
let page = message.data;
|
||||
this.alerts = page.content;
|
||||
this.pageIndex = page.number + 1;
|
||||
this.total = page.totalElements;
|
||||
} else {
|
||||
console.warn(message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.tableLoading = false;
|
||||
filterAlerts$.unsubscribe();
|
||||
console.error(error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
sync() {
|
||||
this.loadAlertsTable();
|
||||
}
|
||||
|
||||
loadAlertsTable() {
|
||||
this.tableLoading = true;
|
||||
let alertsInit$ = this.alertSvc.getAlerts(this.pageIndex - 1, this.pageSize).subscribe(
|
||||
let alertsInit$ = this.alertSvc
|
||||
.loadAlerts(this.filterStatus, this.filterPriority, this.filterContent, this.pageIndex - 1, this.pageSize)
|
||||
.subscribe(
|
||||
message => {
|
||||
this.tableLoading = false;
|
||||
this.checkedAll = false;
|
||||
@@ -87,13 +69,13 @@ export class AlertCenterComponent implements OnInit {
|
||||
|
||||
onDeleteAlerts() {
|
||||
if (this.checkedAlertIds == null || this.checkedAlertIds.size === 0) {
|
||||
this.notifySvc.warning('未选中任何待删除项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('alert.center.notify.no-delete'), '');
|
||||
return;
|
||||
}
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否批量删除!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('alert.center.confirm.delete-batch'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.deleteAlerts(this.checkedAlertIds)
|
||||
@@ -102,13 +84,13 @@ export class AlertCenterComponent implements OnInit {
|
||||
|
||||
onMarkReadAlerts() {
|
||||
if (this.checkedAlertIds == null || this.checkedAlertIds.size === 0) {
|
||||
this.notifySvc.warning('未选中任何待标记项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('alert.center.notify.no-mark'), '');
|
||||
return;
|
||||
}
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否批量标记已处理!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('alert.center.confirm.mark-done-batch'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.updateAlertsStatus(this.checkedAlertIds, 3)
|
||||
@@ -116,13 +98,13 @@ export class AlertCenterComponent implements OnInit {
|
||||
}
|
||||
onMarkUnReadAlerts() {
|
||||
if (this.checkedAlertIds == null || this.checkedAlertIds.size === 0) {
|
||||
this.notifySvc.warning('未选中任何待标记项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('alert.center.notify.no-mark'), '');
|
||||
return;
|
||||
}
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否批量标记未处理!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('alert.center.confirm.mark-no-batch'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.updateAlertsStatus(this.checkedAlertIds, 0)
|
||||
@@ -133,9 +115,9 @@ export class AlertCenterComponent implements OnInit {
|
||||
let alerts = new Set<number>();
|
||||
alerts.add(alertId);
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否删除!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.delete'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.deleteAlerts(alerts)
|
||||
@@ -146,9 +128,9 @@ export class AlertCenterComponent implements OnInit {
|
||||
let alerts = new Set<number>();
|
||||
alerts.add(alertId);
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否标记已处理!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('alert.center.confirm.mark-done'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.updateAlertsStatus(alerts, 3)
|
||||
@@ -159,9 +141,9 @@ export class AlertCenterComponent implements OnInit {
|
||||
let alerts = new Set<number>();
|
||||
alerts.add(alertId);
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否标记未处理!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('alert.center.confirm.mark-no'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.updateAlertsStatus(alerts, 0)
|
||||
@@ -174,17 +156,17 @@ export class AlertCenterComponent implements OnInit {
|
||||
message => {
|
||||
deleteAlerts$.unsubscribe();
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('删除成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.delete-success'), '');
|
||||
this.loadAlertsTable();
|
||||
} else {
|
||||
this.tableLoading = false;
|
||||
this.notifySvc.error('删除失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.delete-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.tableLoading = false;
|
||||
deleteAlerts$.unsubscribe();
|
||||
this.notifySvc.error('删除失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.delete-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -195,17 +177,17 @@ export class AlertCenterComponent implements OnInit {
|
||||
message => {
|
||||
markAlertsStatus$.unsubscribe();
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('标记成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.mark-success'), '');
|
||||
this.loadAlertsTable();
|
||||
} else {
|
||||
this.tableLoading = false;
|
||||
this.notifySvc.error('标记失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.mark-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.tableLoading = false;
|
||||
markAlertsStatus$.unsubscribe();
|
||||
this.notifySvc.error('标记失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.mark-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -3,14 +3,14 @@
|
||||
<nz-breadcrumb-item>
|
||||
<a [routerLink]="['/']">
|
||||
<i nz-icon nzType="home"></i>
|
||||
<span>仪表盘</span>
|
||||
<span>{{ 'menu.dashboard' | i18n }}</span>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
<nz-breadcrumb-item>
|
||||
<i nz-icon nzType="alert"></i>
|
||||
<span>告警通知配置</span>
|
||||
<span>{{ 'menu.alert.dispatch' | i18n }}</span>
|
||||
<a href="https://tancloud.cn/docs/help/alert_email" target="_blank" style="float: right; margin-right: 5%">
|
||||
<span>帮助 </span>
|
||||
<span>{{ 'common.button.help' | i18n }} </span>
|
||||
<i nz-icon nzType="question-circle" nzTheme="outline"></i>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
@@ -18,12 +18,12 @@
|
||||
<nz-divider></nz-divider>
|
||||
|
||||
<nz-tabset nzSize="large">
|
||||
<nz-tab nzTitle="告警接收人">
|
||||
<nz-tab [nzTitle]="'alert.notice.receiver' | i18n">
|
||||
<button nz-button nzType="primary" (click)="onNewNoticeReceiver()">
|
||||
<i nz-icon nzType="appstore-add" nzTheme="outline"></i>
|
||||
新增接收人
|
||||
{{ 'alert.notice.receiver.new' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="syncReceiver()" nz-tooltip nzTooltipTitle="刷新">
|
||||
<button nz-button nzType="primary" (click)="syncReceiver()" nz-tooltip [nzTooltipTitle]="'common.refresh' | i18n">
|
||||
<i nz-icon nzType="sync" nzTheme="outline"></i>
|
||||
</button>
|
||||
<nz-table
|
||||
@@ -35,11 +35,11 @@
|
||||
>
|
||||
<thead>
|
||||
<tr>
|
||||
<th nzAlign="center" nzWidth="10%">接收人</th>
|
||||
<th nzAlign="center" nzWidth="20%">通知方式</th>
|
||||
<th nzAlign="center" nzWidth="20%">配置</th>
|
||||
<th nzAlign="center" nzWidth="20%">最新修改时间</th>
|
||||
<th nzAlign="center" nzWidth="30%">操作</th>
|
||||
<th nzAlign="center" nzWidth="10%">{{ 'alert.notice.receiver.people' | i18n }}</th>
|
||||
<th nzAlign="center" nzWidth="20%">{{ 'alert.notice.receiver.type' | i18n }}</th>
|
||||
<th nzAlign="center" nzWidth="20%">{{ 'alert.notice.receiver.setting' | i18n }}</th>
|
||||
<th nzAlign="center" nzWidth="20%">{{ 'common.edit-time' | i18n }}</th>
|
||||
<th nzAlign="center" nzWidth="30%">{{ 'common.edit' | i18n }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -50,11 +50,11 @@
|
||||
<td nzAlign="center">
|
||||
<nz-tag *ngIf="data.type == 0" nzColor="orange">
|
||||
<i nz-icon nzType="notification" nzTheme="outline"></i>
|
||||
<span>短信</span>
|
||||
<span>{{ 'alert.notice.type.sms' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.type == 1" nzColor="orange">
|
||||
<i nz-icon nzType="notification" nzTheme="outline"></i>
|
||||
<span>邮件</span>
|
||||
<span>{{ 'alert.notice.type.email' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.type == 2" nzColor="orange">
|
||||
<i nz-icon nzType="notification" nzTheme="outline"></i>
|
||||
@@ -62,19 +62,19 @@
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.type == 3" nzColor="orange">
|
||||
<i nz-icon nzType="notification" nzTheme="outline"></i>
|
||||
<span>微信公众号</span>
|
||||
<span>{{ 'alert.notice.type.wechat' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.type == 4" nzColor="orange">
|
||||
<i nz-icon nzType="notification" nzTheme="outline"></i>
|
||||
<span>企业微信机器人</span>
|
||||
<span>{{ 'alert.notice.type.wework' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.type == 5" nzColor="orange">
|
||||
<i nz-icon nzType="notification" nzTheme="outline"></i>
|
||||
<span>钉钉机器人</span>
|
||||
<span>{{ 'alert.notice.type.ding' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.type == 6" nzColor="orange">
|
||||
<i nz-icon nzType="notification" nzTheme="outline"></i>
|
||||
<span>飞书机器人</span>
|
||||
<span>{{ 'alert.notice.type.fei-shu' | i18n }}</span>
|
||||
</nz-tag>
|
||||
</td>
|
||||
<td nzAlign="center">
|
||||
@@ -88,10 +88,22 @@
|
||||
</td>
|
||||
<td nzAlign="center">{{ (data.gmtUpdate ? data.gmtUpdate : data.gmtCreate) | date: 'YYYY-MM-dd HH:mm:ss' }}</td>
|
||||
<td nzAlign="center">
|
||||
<button nz-button nzType="primary" (click)="onEditOneNoticeReceiver(data)" nz-tooltip nzTooltipTitle="修改接收人">
|
||||
<button
|
||||
nz-button
|
||||
nzType="primary"
|
||||
(click)="onEditOneNoticeReceiver(data)"
|
||||
nz-tooltip
|
||||
[nzTooltipTitle]="'alert.notice.receiver.edit' | i18n"
|
||||
>
|
||||
<i nz-icon nzType="edit" nzTheme="outline"></i>
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onDeleteOneNoticeReceiver(data.id)" nz-tooltip nzTooltipTitle="删除接收人">
|
||||
<button
|
||||
nz-button
|
||||
nzType="primary"
|
||||
(click)="onDeleteOneNoticeReceiver(data.id)"
|
||||
nz-tooltip
|
||||
[nzTooltipTitle]="'alert.notice.receiver.delete' | i18n"
|
||||
>
|
||||
<i nz-icon nzType="delete" nzTheme="outline"></i>
|
||||
</button>
|
||||
</td>
|
||||
@@ -99,12 +111,12 @@
|
||||
</tbody>
|
||||
</nz-table>
|
||||
</nz-tab>
|
||||
<nz-tab nzTitle="告警通知策略">
|
||||
<nz-tab [nzTitle]="'alert.notice.rule' | i18n">
|
||||
<button nz-button nzType="primary" (click)="onNewNoticeRule()">
|
||||
<i nz-icon nzType="appstore-add" nzTheme="outline"></i>
|
||||
新增通知策略
|
||||
{{ 'alert.notice.rule.new' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="syncRule()" nz-tooltip nzTooltipTitle="刷新">
|
||||
<button nz-button nzType="primary" (click)="syncRule()" nz-tooltip [nzTooltipTitle]="'common.refresh' | i18n">
|
||||
<i nz-icon nzType="sync" nzTheme="outline"></i>
|
||||
</button>
|
||||
<nz-table
|
||||
@@ -116,12 +128,12 @@
|
||||
>
|
||||
<thead>
|
||||
<tr>
|
||||
<th nzAlign="center" nzWidth="15%">策略名称</th>
|
||||
<th nzAlign="center" nzWidth="12%">接收人</th>
|
||||
<th nzAlign="center" nzWidth="12%">转发所有</th>
|
||||
<th nzAlign="center" nzWidth="15%">是否启用</th>
|
||||
<th nzAlign="center" nzWidth="15%">最新修改时间</th>
|
||||
<th nzAlign="center" nzWidth="25%">操作</th>
|
||||
<th nzAlign="center" nzWidth="15%">{{ 'alert.notice.rule.name' | i18n }}</th>
|
||||
<th nzAlign="center" nzWidth="12%">{{ 'alert.notice.receiver.people' | i18n }}</th>
|
||||
<th nzAlign="center" nzWidth="12%">{{ 'alert.notice.rule.all' | i18n }}</th>
|
||||
<th nzAlign="center" nzWidth="15%">{{ 'alert.notice.rule.enable' | i18n }}</th>
|
||||
<th nzAlign="center" nzWidth="15%">{{ 'common.edit-time' | i18n }}</th>
|
||||
<th nzAlign="center" nzWidth="25%">{{ 'common.edit' | i18n }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -134,26 +146,38 @@
|
||||
</td>
|
||||
<td nzAlign="center">
|
||||
<nz-tag *ngIf="data.filterAll" nzColor="green">
|
||||
<span>是</span>
|
||||
<span>{{ 'common.yes' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="!data.filterAll" nzColor="orange">
|
||||
<span>否</span>
|
||||
<span>{{ 'common.no' | i18n }}</span>
|
||||
</nz-tag>
|
||||
</td>
|
||||
<td nzAlign="center">
|
||||
<nz-tag *ngIf="data.enable" nzColor="green">
|
||||
<span>开启</span>
|
||||
<span>{{ 'common.enable' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="!data.enable" nzColor="orange">
|
||||
<span>关闭</span>
|
||||
<span>{{ 'common.disable' | i18n }}</span>
|
||||
</nz-tag>
|
||||
</td>
|
||||
<td nzAlign="center">{{ (data.gmtUpdate ? data.gmtUpdate : data.gmtCreate) | date: 'YYYY-MM-dd HH:mm:ss' }}</td>
|
||||
<td nzAlign="center">
|
||||
<button nz-button nzType="primary" (click)="onEditOneNoticeRule(data)" nz-tooltip nzTooltipTitle="修改告警策略">
|
||||
<button
|
||||
nz-button
|
||||
nzType="primary"
|
||||
(click)="onEditOneNoticeRule(data)"
|
||||
nz-tooltip
|
||||
[nzTooltipTitle]="'alert.notice.rule.edit' | i18n"
|
||||
>
|
||||
<i nz-icon nzType="edit" nzTheme="outline"></i>
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onDeleteOneNoticeRule(data.id)" nz-tooltip nzTooltipTitle="删除告警策略">
|
||||
<button
|
||||
nz-button
|
||||
nzType="primary"
|
||||
(click)="onDeleteOneNoticeRule(data.id)"
|
||||
nz-tooltip
|
||||
[nzTooltipTitle]="'alert.notice.rule.delete' | i18n"
|
||||
>
|
||||
<i nz-icon nzType="delete" nzTheme="outline"></i>
|
||||
</button>
|
||||
</td>
|
||||
@@ -166,7 +190,7 @@
|
||||
<!-- 新增或修改通知接收人弹出框 -->
|
||||
<nz-modal
|
||||
[(nzVisible)]="isManageReceiverModalVisible"
|
||||
[nzTitle]="isManageReceiverModalAdd ? '新增接收人' : '修改接收人'"
|
||||
[nzTitle]="isManageReceiverModalAdd ? ('alert.notice.receiver.new' | i18n) : ('alert.notice.receiver.edit' | i18n)"
|
||||
(nzOnCancel)="onManageReceiverModalCancel()"
|
||||
(nzOnOk)="onManageReceiverModalOk()"
|
||||
nzMaskClosable="false"
|
||||
@@ -176,27 +200,27 @@
|
||||
<div *nzModalContent class="-inner-content">
|
||||
<form nz-form #receiverForm="ngForm">
|
||||
<nz-form-item>
|
||||
<nz-form-label [nzSpan]="7" nzFor="name" nzRequired="true">接收人名称</nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="name" nzRequired="true">{{ 'alert.notice.receiver.people.name' | i18n }}</nz-form-label>
|
||||
<nz-form-control [nzSpan]="12" [nzErrorTip]="'validation.required' | i18n">
|
||||
<input [(ngModel)]="receiver.name" nz-input required name="name" type="text" id="name" />
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="type">通知方式 </nz-form-label>
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="type">{{ 'alert.notice.receiver.type' | i18n }} </nz-form-label>
|
||||
<nz-form-control nzSpan="12" [nzErrorTip]="'validation.required' | i18n">
|
||||
<nz-select [(ngModel)]="receiver.type" nzPlaceHolder="Choose" required name="type" id="type">
|
||||
<nz-option [nzValue]="0" nzDisabled nzLabel="短信"></nz-option>
|
||||
<nz-option [nzValue]="1" nzLabel="邮箱"></nz-option>
|
||||
<nz-option [nzValue]="0" nzDisabled [nzLabel]="'alert.notice.type.sms' | i18n"></nz-option>
|
||||
<nz-option [nzValue]="1" [nzLabel]="'alert.notice.type.email' | i18n"></nz-option>
|
||||
<nz-option [nzValue]="2" nzLabel="WebHook"></nz-option>
|
||||
<nz-option [nzValue]="3" nzDisabled nzLabel="微信公众号"></nz-option>
|
||||
<nz-option [nzValue]="4" nzLabel="企业微信机器人"></nz-option>
|
||||
<nz-option [nzValue]="5" nzLabel="钉钉机器人"></nz-option>
|
||||
<nz-option [nzValue]="6" nzLabel="飞书机器人"></nz-option>
|
||||
<nz-option [nzValue]="3" nzDisabled [nzLabel]="'alert.notice.type.wechat' | i18n"></nz-option>
|
||||
<nz-option [nzValue]="4" [nzLabel]="'alert.notice.type.wework' | i18n"></nz-option>
|
||||
<nz-option [nzValue]="5" [nzLabel]="'alert.notice.type.ding' | i18n"></nz-option>
|
||||
<nz-option [nzValue]="6" [nzLabel]="'alert.notice.type.fei-shu' | i18n"></nz-option>
|
||||
</nz-select>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item *ngIf="receiver.type === 0">
|
||||
<nz-form-label [nzSpan]="7" nzFor="phone" [nzRequired]="receiver.type === 0">手机号</nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="phone" [nzRequired]="receiver.type === 0">{{ 'alert.notice.type.phone' | i18n }}</nz-form-label>
|
||||
<nz-form-control [nzSpan]="12" [nzErrorTip]="'validation.phone.invalid' | i18n">
|
||||
<input
|
||||
[(ngModel)]="receiver.phone"
|
||||
@@ -210,37 +234,45 @@
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item *ngIf="receiver.type === 1">
|
||||
<nz-form-label [nzSpan]="7" nzFor="email" [nzRequired]="receiver.type === 1">邮箱</nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="email" [nzRequired]="receiver.type === 1">{{ 'alert.notice.type.email' | i18n }}</nz-form-label>
|
||||
<nz-form-control [nzSpan]="12" [nzErrorTip]="'validation.email.invalid' | i18n">
|
||||
<input [(ngModel)]="receiver.email" nz-input [required]="receiver.type === 1" email name="email" type="email" id="email" />
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item *ngIf="receiver.type === 2">
|
||||
<nz-form-label [nzSpan]="7" nzFor="hookUrl" [nzRequired]="receiver.type === 2">URL地址</nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="hookUrl" [nzRequired]="receiver.type === 2">{{ 'alert.notice.type.url' | i18n }}</nz-form-label>
|
||||
<nz-form-control [nzSpan]="12" [nzErrorTip]="'validation.required' | i18n">
|
||||
<input [(ngModel)]="receiver.hookUrl" nz-input [required]="receiver.type === 2" name="hookUrl" type="url" id="hookUrl" />
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item *ngIf="receiver.type === 3">
|
||||
<nz-form-label [nzSpan]="7" nzFor="wechatId" [nzRequired]="receiver.type === 3">微信OPENID</nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="wechatId" [nzRequired]="receiver.type === 3">{{
|
||||
'alert.notice.type.wechat-id' | i18n
|
||||
}}</nz-form-label>
|
||||
<nz-form-control [nzSpan]="12" [nzErrorTip]="'validation.required' | i18n">
|
||||
<input [(ngModel)]="receiver.wechatId" nz-input [required]="receiver.type === 3" name="wechatId" type="text" />
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item *ngIf="receiver.type === 4">
|
||||
<nz-form-label [nzSpan]="7" nzFor="wechatId" [nzRequired]="receiver.type === 4">企业微信机器人KEY</nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="wechatId" [nzRequired]="receiver.type === 4">{{
|
||||
'alert.notice.type.wework-key' | i18n
|
||||
}}</nz-form-label>
|
||||
<nz-form-control [nzSpan]="12" [nzErrorTip]="'validation.required' | i18n">
|
||||
<input [(ngModel)]="receiver.wechatId" nz-input [required]="receiver.type === 4" name="wechatId" type="text" />
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item *ngIf="receiver.type === 5">
|
||||
<nz-form-label [nzSpan]="7" nzFor="accessToken" [nzRequired]="receiver.type === 5">机器人ACCESS_TOKEN</nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="accessToken" [nzRequired]="receiver.type === 5">{{
|
||||
'alert.notice.type.access-token' | i18n
|
||||
}}</nz-form-label>
|
||||
<nz-form-control [nzSpan]="12" [nzErrorTip]="'validation.required' | i18n">
|
||||
<input [(ngModel)]="receiver.accessToken" nz-input [required]="receiver.type === 5" name="accessToken" type="text" />
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item *ngIf="receiver.type === 6">
|
||||
<nz-form-label [nzSpan]="7" nzFor="wechatId" [nzRequired]="receiver.type === 6">飞书机器人KEY</nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="wechatId" [nzRequired]="receiver.type === 6">{{
|
||||
'alert.notice.type.fei-shu-key' | i18n
|
||||
}}</nz-form-label>
|
||||
<nz-form-control [nzSpan]="12" [nzErrorTip]="'validation.required' | i18n">
|
||||
<input [(ngModel)]="receiver.wechatId" nz-input [required]="receiver.type === 6" name="wechatId" type="text" />
|
||||
</nz-form-control>
|
||||
@@ -252,7 +284,7 @@
|
||||
<!-- 新增或修改通知策略弹出框 -->
|
||||
<nz-modal
|
||||
[(nzVisible)]="isManageRuleModalVisible"
|
||||
[nzTitle]="isManageRuleModalAdd ? '新增策略' : '修改策略'"
|
||||
[nzTitle]="isManageRuleModalAdd ? ('alert.notice.rule.new' | i18n) : ('alert.notice.rule.edit' | i18n)"
|
||||
(nzOnCancel)="onManageRuleModalCancel()"
|
||||
(nzOnOk)="onManageRuleModalOk()"
|
||||
nzMaskClosable="false"
|
||||
@@ -262,19 +294,19 @@
|
||||
<div *nzModalContent class="-inner-content">
|
||||
<form nz-form #ruleForm="ngForm">
|
||||
<nz-form-item>
|
||||
<nz-form-label [nzSpan]="7" nzFor="rule_name" nzRequired="true">策略名称</nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="rule_name" nzRequired="true">{{ 'alert.notice.rule.name' | i18n }}</nz-form-label>
|
||||
<nz-form-control [nzSpan]="8" [nzErrorTip]="'validation.required' | i18n">
|
||||
<input [(ngModel)]="rule.name" nz-input required name="rule_name" type="text" id="rule_name" />
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="filterAll">转发所有</nz-form-label>
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="filterAll">{{ 'alert.notice.rule.all' | i18n }}</nz-form-label>
|
||||
<nz-form-control nzSpan="8">
|
||||
<nz-switch [(ngModel)]="rule.filterAll" disabled name="filterAll" id="filterAll"></nz-switch>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="receiver">接收人</nz-form-label>
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="receiver">{{ 'alert.notice.receiver.people' | i18n }}</nz-form-label>
|
||||
<nz-form-control nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
||||
<nz-select
|
||||
[(ngModel)]="rule.receiverId"
|
||||
@@ -291,7 +323,7 @@
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="enable">是否启用</nz-form-label>
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="enable">{{ 'alert.notice.rule.enable' | i18n }}</nz-form-label>
|
||||
<nz-form-control nzSpan="8">
|
||||
<nz-switch [(ngModel)]="rule.enable" name="enable" id="enable"></nz-switch>
|
||||
</nz-form-control>
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
import { I18NService } from '@core';
|
||||
import { ALAIN_I18N_TOKEN } from '@delon/theme';
|
||||
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||
import { NzNotificationService } from 'ng-zorro-antd/notification';
|
||||
import { finalize } from 'rxjs/operators';
|
||||
@@ -18,7 +20,8 @@ export class AlertNoticeComponent implements OnInit {
|
||||
private notifySvc: NzNotificationService,
|
||||
private noticeReceiverSvc: NoticeReceiverService,
|
||||
private modal: NzModalService,
|
||||
private noticeRuleSvc: NoticeRuleService
|
||||
private noticeRuleSvc: NoticeRuleService,
|
||||
@Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService
|
||||
) {}
|
||||
|
||||
receivers!: NoticeReceiver[];
|
||||
@@ -78,9 +81,9 @@ export class AlertNoticeComponent implements OnInit {
|
||||
|
||||
onDeleteOneNoticeReceiver(receiveId: number) {
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否删除!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.delete'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.deleteOneNoticeReceiver(receiveId)
|
||||
@@ -98,23 +101,23 @@ export class AlertNoticeComponent implements OnInit {
|
||||
.subscribe(
|
||||
message => {
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('删除成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.delete-success'), '');
|
||||
this.loadReceiversTable();
|
||||
} else {
|
||||
this.notifySvc.error('删除失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.delete-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.notifySvc.error('删除失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.delete-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
onDeleteOneNoticeRule(ruleId: number) {
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否删除!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.delete'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.deleteOneNoticeRule(ruleId)
|
||||
@@ -132,14 +135,14 @@ export class AlertNoticeComponent implements OnInit {
|
||||
.subscribe(
|
||||
message => {
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('删除成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.delete-success'), '');
|
||||
this.loadRulesTable();
|
||||
} else {
|
||||
this.notifySvc.error('删除失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.delete-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.notifySvc.error('删除失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.delete-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -179,14 +182,14 @@ export class AlertNoticeComponent implements OnInit {
|
||||
message => {
|
||||
if (message.code === 0) {
|
||||
this.isManageReceiverModalVisible = false;
|
||||
this.notifySvc.success('新增成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.new-success'), '');
|
||||
this.loadReceiversTable();
|
||||
} else {
|
||||
this.notifySvc.error('新增失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.new-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.notifySvc.error('新增失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.new-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
} else {
|
||||
@@ -202,14 +205,14 @@ export class AlertNoticeComponent implements OnInit {
|
||||
message => {
|
||||
if (message.code === 0) {
|
||||
this.isManageReceiverModalVisible = false;
|
||||
this.notifySvc.success('修改成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.edit-success'), '');
|
||||
this.loadReceiversTable();
|
||||
} else {
|
||||
this.notifySvc.error('修改失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.edit-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.notifySvc.error('修改失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.edit-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -310,14 +313,14 @@ export class AlertNoticeComponent implements OnInit {
|
||||
message => {
|
||||
if (message.code === 0) {
|
||||
this.isManageRuleModalVisible = false;
|
||||
this.notifySvc.success('新增成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.new-success'), '');
|
||||
this.loadRulesTable();
|
||||
} else {
|
||||
this.notifySvc.error('新增失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.new-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.notifySvc.error('新增失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.new-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
} else {
|
||||
@@ -333,14 +336,14 @@ export class AlertNoticeComponent implements OnInit {
|
||||
message => {
|
||||
if (message.code === 0) {
|
||||
this.isManageRuleModalVisible = false;
|
||||
this.notifySvc.success('修改成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.edit-success'), '');
|
||||
this.loadRulesTable();
|
||||
} else {
|
||||
this.notifySvc.error('修改失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.edit-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.notifySvc.error('修改失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.edit-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -3,14 +3,14 @@
|
||||
<nz-breadcrumb-item>
|
||||
<a [routerLink]="['/']">
|
||||
<i nz-icon nzType="home"></i>
|
||||
<span>仪表盘</span>
|
||||
<span>{{ 'menu.dashboard' | i18n }}</span>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
<nz-breadcrumb-item>
|
||||
<i nz-icon nzType="alert"></i>
|
||||
<span>告警阈值配置</span>
|
||||
<span>{{ 'menu.alert.setting' | i18n }}</span>
|
||||
<a href="https://tancloud.cn/docs/help/alert_threshold" target="_blank" style="float: right; margin-right: 5%">
|
||||
<span>帮助 </span>
|
||||
<span>{{ 'common.button.help' | i18n }} </span>
|
||||
<i nz-icon nzType="question-circle" nzTheme="outline"></i>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
@@ -19,17 +19,17 @@
|
||||
|
||||
<button nz-button nzType="primary" (click)="onNewAlertDefine()">
|
||||
<i nz-icon nzType="appstore-add" nzTheme="outline"></i>
|
||||
新增阈值
|
||||
{{ 'alert.setting.new' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onEditAlertDefine()">
|
||||
<i nz-icon nzType="edit" nzTheme="outline"></i>
|
||||
编辑
|
||||
{{ 'common.button.edit' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onDeleteAlertDefines()">
|
||||
<i nz-icon nzType="delete" nzTheme="outline"></i>
|
||||
删除
|
||||
{{ 'common.button.delete' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="sync()" nz-tooltip nzTooltipTitle="刷新">
|
||||
<button nz-button nzType="primary" (click)="sync()" nz-tooltip [nzTooltipTitle]="'common.refresh' | i18n">
|
||||
<i nz-icon nzType="sync" nzTheme="outline"></i>
|
||||
</button>
|
||||
|
||||
@@ -51,14 +51,14 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th nzAlign="center" nzLeft nzWidth="4%" [(nzChecked)]="checkedAll" (nzCheckedChange)="onAllChecked($event)"></th>
|
||||
<th nzAlign="center" nzLeft>指标对象</th>
|
||||
<th nzAlign="center">阈值触发表达式</th>
|
||||
<th nzAlign="center">告警级别</th>
|
||||
<th nzAlign="center">触发次数</th>
|
||||
<th nzAlign="center">通知模版</th>
|
||||
<th nzAlign="center">全局默认</th>
|
||||
<th nzAlign="center">最新修改时间</th>
|
||||
<th nzAlign="center">操作</th>
|
||||
<th nzAlign="center" nzLeft>{{ 'alert.setting.target' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'alert.setting.expr' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'alert.priority' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'alert.setting.times' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'alert.setting.template' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'alert.setting.default' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'common.edit-time' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'common.edit' | i18n }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -73,36 +73,54 @@
|
||||
<td nzAlign="center">
|
||||
<nz-tag *ngIf="data.priority == 0" nzColor="red">
|
||||
<i nz-icon nzType="bell" nzTheme="outline"></i>
|
||||
<span>紧急告警</span>
|
||||
<span>{{ 'alert.priority.0' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.priority == 1" nzColor="orange">
|
||||
<i nz-icon nzType="bell" nzTheme="outline"></i>
|
||||
<span>严重告警</span>
|
||||
<span>{{ 'alert.priority.1' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.priority == 2" nzColor="yellow">
|
||||
<i nz-icon nzType="bell" nzTheme="outline"></i>
|
||||
<span>警告告警</span>
|
||||
<span>{{ 'alert.priority.2' | i18n }}</span>
|
||||
</nz-tag>
|
||||
</td>
|
||||
<td nzAlign="center">{{ data.times }}</td>
|
||||
<td nzAlign="center">{{ data.template }}</td>
|
||||
<td nzAlign="center">
|
||||
<nz-tag *ngIf="data.preset" nzColor="green">
|
||||
<span>是</span>
|
||||
<span>{{ 'common.yes' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="!data.preset" nzColor="orange">
|
||||
<span>否</span>
|
||||
<span>{{ 'common.no' | i18n }}</span>
|
||||
</nz-tag>
|
||||
</td>
|
||||
<td nzAlign="center">{{ (data.gmtUpdate ? data.gmtUpdate : data.gmtCreate) | date: 'YYYY-MM-dd HH:mm:ss' }}</td>
|
||||
<td nzAlign="center">
|
||||
<button nz-button nzType="primary" (click)="onOpenConnectModal(data.id, data.app)" nz-tooltip nzTooltipTitle="配置关联监控">
|
||||
<button
|
||||
nz-button
|
||||
nzType="primary"
|
||||
(click)="onOpenConnectModal(data.id, data.app)"
|
||||
nz-tooltip
|
||||
[nzTooltipTitle]="'alert.setting.connect' | i18n"
|
||||
>
|
||||
<i nz-icon nzType="link" nzTheme="outline"></i>
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onEditOneAlertDefine(data.id)" nz-tooltip nzTooltipTitle="修改告警配置">
|
||||
<button
|
||||
nz-button
|
||||
nzType="primary"
|
||||
(click)="onEditOneAlertDefine(data.id)"
|
||||
nz-tooltip
|
||||
[nzTooltipTitle]="'alert.setting.edit' | i18n"
|
||||
>
|
||||
<i nz-icon nzType="edit" nzTheme="outline"></i>
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onDeleteOneAlertDefine(data.id)" nz-tooltip nzTooltipTitle="删除告警配置">
|
||||
<button
|
||||
nz-button
|
||||
nzType="primary"
|
||||
(click)="onDeleteOneAlertDefine(data.id)"
|
||||
nz-tooltip
|
||||
[nzTooltipTitle]="'alert.setting.delete' | i18n"
|
||||
>
|
||||
<i nz-icon nzType="delete" nzTheme="outline"></i>
|
||||
</button>
|
||||
</td>
|
||||
@@ -110,12 +128,12 @@
|
||||
</tbody>
|
||||
</nz-table>
|
||||
|
||||
<ng-template #rangeTemplate> 总量 {{ total }} </ng-template>
|
||||
<ng-template #rangeTemplate> {{ 'common.total' | i18n }} {{ total }} </ng-template>
|
||||
|
||||
<!-- 新增或修改告警定义弹出框 -->
|
||||
<nz-modal
|
||||
[(nzVisible)]="isManageModalVisible"
|
||||
[nzTitle]="isManageModalAdd ? '新增告警阈值' : '修改告警阈值'"
|
||||
[nzTitle]="isManageModalAdd ? ('alert.setting.new' | i18n) : ('alert.setting.edit' | i18n)"
|
||||
(nzOnCancel)="onManageModalCancel()"
|
||||
(nzOnOk)="onManageModalOk()"
|
||||
nzMaskClosable="false"
|
||||
@@ -125,7 +143,7 @@
|
||||
<div *nzModalContent class="-inner-content">
|
||||
<form nz-form #defineForm="ngForm">
|
||||
<nz-form-item>
|
||||
<nz-form-label [nzSpan]="7" nzFor="target" nzRequired="true">指标对象</nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="target" nzRequired="true">{{ 'alert.setting.target' | i18n }}</nz-form-label>
|
||||
<nz-form-control [nzSpan]="8" [nzErrorTip]="'validation.required' | i18n">
|
||||
<nz-cascader
|
||||
required
|
||||
@@ -140,19 +158,19 @@
|
||||
<nz-form-item>
|
||||
<nz-col [nzSpan]="8" nzOffset="7">
|
||||
<nz-collapse>
|
||||
<nz-collapse-panel [nzActive]="isManageModalAdd" nzHeader="支持的阈值触发表达式环境变量与操作符">
|
||||
<nz-collapse-panel [nzActive]="isManageModalAdd" [nzHeader]="'alert.setting.expr.tip' | i18n">
|
||||
<nz-list nzSize="small" nzSplit="false">
|
||||
<nz-list-item *ngIf="cascadeValues.length == 3">
|
||||
<code>{{ cascadeValues[2] }} : 选中的指标对象</code>
|
||||
<code>{{ cascadeValues[2] }} : {{ 'alert.setting.target.tip' | i18n }}</code>
|
||||
</nz-list-item>
|
||||
<nz-list-item *ngFor="let item of otherMetrics">
|
||||
<code>{{ item }} : 所属行其它指标对象</code>
|
||||
<code>{{ item }} : {{ 'alert.setting.target.other' | i18n }}</code>
|
||||
</nz-list-item>
|
||||
<nz-list-item *ngIf="otherMetrics.length != 0">
|
||||
<code>instance : 所属行实例</code>
|
||||
<code>instance : {{ 'alert.setting.target.instance' | i18n }}</code>
|
||||
</nz-list-item>
|
||||
<nz-list-item>
|
||||
<code>支持操作符函数 : equals(str1,str2), ==, <, <=, >, >=, !=, ( ), +, -, &&, ||</code>
|
||||
<code>{{ 'alert.setting.operator' | i18n }} : equals(str1,str2), ==, <, <=, >, >=, !=, ( ), +, -, &&, ||</code>
|
||||
</nz-list-item>
|
||||
</nz-list>
|
||||
</nz-collapse-panel>
|
||||
@@ -160,13 +178,8 @@
|
||||
</nz-col>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label
|
||||
[nzSpan]="7"
|
||||
nzFor="expr"
|
||||
nzRequired="true"
|
||||
nzTooltipTitle="根据此表达式来计算判断是否触发阈值,表达式环境变量和操作符见上方"
|
||||
>
|
||||
阈值触发表达式
|
||||
<nz-form-label [nzSpan]="7" nzFor="expr" nzRequired="true" [nzTooltipTitle]="'alert.setting.expr.label' | i18n">
|
||||
{{ 'alert.setting.expr' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control [nzSpan]="8" [nzErrorTip]="'validation.required' | i18n">
|
||||
<nz-textarea-count [nzMaxCharacterCount]="100">
|
||||
@@ -177,32 +190,27 @@
|
||||
nz-input
|
||||
name="expr"
|
||||
id="expr"
|
||||
placeholder="根据此表达式计算判断是否触发阈值. 示例: responseTime>40"
|
||||
[placeholder]="('alert.setting.expr.example' | i18n) + ': responseTime>40'"
|
||||
>
|
||||
</textarea>
|
||||
</nz-textarea-count>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label
|
||||
nzSpan="7"
|
||||
nzRequired="true"
|
||||
nzFor="priority"
|
||||
nzTooltipTitle="触发阈值的告警级别,从低到高依次为:警告-warning,严重-critical,紧急-emergency"
|
||||
>
|
||||
告警级别
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="priority" [nzTooltipTitle]="'alert.setting.priority.tip' | i18n">
|
||||
{{ 'alert.priority' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
||||
<nz-select [(ngModel)]="define.priority" nzPlaceHolder="Choose" name="priority" id="priority">
|
||||
<nz-option [nzValue]="0" nzLabel="紧急告警"></nz-option>
|
||||
<nz-option [nzValue]="1" nzLabel="严重告警"></nz-option>
|
||||
<nz-option [nzValue]="2" nzLabel="警告告警"></nz-option>
|
||||
<nz-option [nzValue]="0" [nzLabel]="'alert.priority.0' | i18n"></nz-option>
|
||||
<nz-option [nzValue]="1" [nzLabel]="'alert.priority.1' | i18n"></nz-option>
|
||||
<nz-option [nzValue]="2" [nzLabel]="'alert.priority.2' | i18n"></nz-option>
|
||||
</nz-select>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="duration" nzTooltipTitle="设置触发阈值多少次之后才会发送告警">
|
||||
触发次数
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="duration" [nzTooltipTitle]="'alert.setting.times.tip' | i18n">
|
||||
{{ 'alert.setting.times' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
||||
<nz-input-number [(ngModel)]="define.times" [nzMin]="1" [nzMax]="10" [nzStep]="1" required name="duration" id="duration">
|
||||
@@ -212,25 +220,25 @@
|
||||
<nz-form-item>
|
||||
<nz-col [nzSpan]="8" nzOffset="7">
|
||||
<nz-collapse>
|
||||
<nz-collapse-panel [nzActive]="isManageModalAdd" nzHeader="支持的通知模版环境变量">
|
||||
<nz-collapse-panel [nzActive]="isManageModalAdd" [nzHeader]="'alert.setting.template.tip' | i18n">
|
||||
<nz-list nzSize="small" nzSplit="false">
|
||||
<nz-list-item>
|
||||
<code>${app} : 监控类型名称</code>
|
||||
<code>${app} : {{ 'alert.setting.template.monitor-type' | i18n }}</code>
|
||||
</nz-list-item>
|
||||
<nz-list-item>
|
||||
<code>${metrics} : 监控指标集合名称</code>
|
||||
<code>${metrics} : {{ 'alert.setting.template.metrics-name' | i18n }}</code>
|
||||
</nz-list-item>
|
||||
<nz-list-item *ngIf="cascadeValues.length == 3">
|
||||
<code>${metric} : 监控指标名称</code>
|
||||
<code>${metric} : {{ 'alert.setting.template.metric-name' | i18n }}</code>
|
||||
</nz-list-item>
|
||||
<nz-list-item *ngIf="cascadeValues.length == 3">
|
||||
<code>${{ '{' + cascadeValues[2] + '}' }} : 监控指标对象值</code>
|
||||
<code>${{ '{' + cascadeValues[2] + '}' }} : {{ 'alert.setting.template.metric-value' | i18n }}</code>
|
||||
</nz-list-item>
|
||||
<nz-list-item *ngFor="let item of otherMetrics">
|
||||
<code>${{ '{' + item + '}' }} : 所属行其它指标值</code>
|
||||
<code>${{ '{' + item + '}' }} : {{ 'alert.setting.template.other-value' | i18n }}</code>
|
||||
</nz-list-item>
|
||||
<nz-list-item>
|
||||
<code>${instance} : 所属行实例值</code>
|
||||
<code>${instance} : {{ 'alert.setting.template.instance-value' | i18n }}</code>
|
||||
</nz-list-item>
|
||||
</nz-list>
|
||||
</nz-collapse-panel>
|
||||
@@ -238,8 +246,8 @@
|
||||
</nz-col>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label [nzSpan]="7" nzFor="template" nzRequired="true" nzTooltipTitle="告警触发后发送的通知信息模版,模版环境变量见上方">
|
||||
通知模版
|
||||
<nz-form-label [nzSpan]="7" nzFor="template" nzRequired="true" [nzTooltipTitle]="'alert.setting.template.label' | i18n">
|
||||
{{ 'alert.setting.template' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control [nzSpan]="8" [nzErrorTip]="'validation.required' | i18n">
|
||||
<nz-textarea-count [nzMaxCharacterCount]="200">
|
||||
@@ -250,20 +258,24 @@
|
||||
required
|
||||
name="template"
|
||||
id="template"
|
||||
placeholder="请输入告警的通知模版. 示例: ${app}.${metrics}.${metric}'s value is too high"
|
||||
[placeholder]="'alert.setting.template.example' | i18n"
|
||||
>
|
||||
</textarea>
|
||||
</nz-textarea-count>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label nzSpan="7" nzFor="preset" nzTooltipTitle="此告警阈值配置是否应用于全局所有此类型监控"> 全局默认 </nz-form-label>
|
||||
<nz-form-label nzSpan="7" nzFor="preset" [nzTooltipTitle]="'alert.setting.default.tip' | i18n">
|
||||
{{ 'alert.setting.default' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control nzSpan="8">
|
||||
<nz-switch [(ngModel)]="define.preset" name="preset" id="preset"></nz-switch>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="enable" nzTooltipTitle="此告警阈值配置开启生效或关闭"> 启用告警 </nz-form-label>
|
||||
<nz-form-label nzSpan="7" nzRequired="true" nzFor="enable" [nzTooltipTitle]="'alert.setting.enable.tip' | i18n">
|
||||
{{ 'alert.setting.enable' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control nzSpan="8">
|
||||
<nz-switch [(ngModel)]="define.enable" [ngModelOptions]="{ standalone: true }" name="enable" id="enable"></nz-switch>
|
||||
</nz-form-control>
|
||||
@@ -276,7 +288,7 @@
|
||||
|
||||
<nz-modal
|
||||
[(nzVisible)]="isConnectModalVisible"
|
||||
nzTitle="告警定义关联监控"
|
||||
[nzTitle]="'alert.setting.connect' | i18n"
|
||||
(nzOnCancel)="onConnectModalCancel()"
|
||||
(nzOnOk)="onConnectModalOk()"
|
||||
nzMaskClosable="false"
|
||||
@@ -303,8 +315,8 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th [nzChecked]="stat.checkAll" [nzIndeterminate]="stat.checkHalf" (nzCheckedChange)="onItemSelectAll($event)"></th>
|
||||
<th *ngIf="direction == 'left'">未关联监控</th>
|
||||
<th *ngIf="direction == 'right'">已关联监控</th>
|
||||
<th *ngIf="direction == 'left'">{{ 'alert.setting.connect.left' | i18n }}</th>
|
||||
<th *ngIf="direction == 'right'">{{ 'alert.setting.connect.right' | i18n }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
import { I18NService } from '@core';
|
||||
import { ALAIN_I18N_TOKEN } from '@delon/theme';
|
||||
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||
import { NzNotificationService } from 'ng-zorro-antd/notification';
|
||||
import { NzTableQueryParams } from 'ng-zorro-antd/table';
|
||||
@@ -25,7 +27,8 @@ export class AlertSettingComponent implements OnInit {
|
||||
private notifySvc: NzNotificationService,
|
||||
private appDefineSvc: AppDefineService,
|
||||
private monitorSvc: MonitorService,
|
||||
private alertDefineSvc: AlertDefineService
|
||||
private alertDefineSvc: AlertDefineService,
|
||||
@Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService
|
||||
) {}
|
||||
|
||||
pageIndex: number = 1;
|
||||
@@ -98,7 +101,7 @@ export class AlertSettingComponent implements OnInit {
|
||||
|
||||
onEditOneAlertDefine(alertDefineId: number) {
|
||||
if (alertDefineId == null) {
|
||||
this.notifySvc.warning('未选中任何待编辑项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.no-select-edit'), '');
|
||||
return;
|
||||
}
|
||||
this.editAlertDefine(alertDefineId);
|
||||
@@ -107,11 +110,11 @@ export class AlertSettingComponent implements OnInit {
|
||||
onEditAlertDefine() {
|
||||
// 编辑时只能选中一个
|
||||
if (this.checkedDefineIds == null || this.checkedDefineIds.size === 0) {
|
||||
this.notifySvc.warning('未选中任何待编辑项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.no-select-edit'), '');
|
||||
return;
|
||||
}
|
||||
if (this.checkedDefineIds.size > 1) {
|
||||
this.notifySvc.warning('只能对一个选中项进行编辑!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.one-select-edit'), '');
|
||||
return;
|
||||
}
|
||||
let alertDefineId = 0;
|
||||
@@ -138,24 +141,24 @@ export class AlertSettingComponent implements OnInit {
|
||||
this.cascadeValues = [this.define.app, this.define.metric, this.define.field];
|
||||
this.cascadeOnChange(this.cascadeValues);
|
||||
} else {
|
||||
this.notifySvc.error('查询此监控定义详情失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.monitor-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.notifySvc.error('查询此监控定义详情失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.monitor-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
onDeleteAlertDefines() {
|
||||
if (this.checkedDefineIds == null || this.checkedDefineIds.size === 0) {
|
||||
this.notifySvc.warning('未选中任何待删除项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.no-select-delete'), '');
|
||||
return;
|
||||
}
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否批量删除!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.delete-batch'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.deleteAlertDefines(this.checkedDefineIds)
|
||||
@@ -166,9 +169,9 @@ export class AlertSettingComponent implements OnInit {
|
||||
let defineIds = new Set<number>();
|
||||
defineIds.add(alertDefineId);
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否删除!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.delete'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.deleteAlertDefines(defineIds)
|
||||
@@ -177,7 +180,7 @@ export class AlertSettingComponent implements OnInit {
|
||||
|
||||
deleteAlertDefines(defineIds: Set<number>) {
|
||||
if (defineIds == null || defineIds.size == 0) {
|
||||
this.notifySvc.warning('未选中任何待删除项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.no-select-delete'), '');
|
||||
return;
|
||||
}
|
||||
this.tableLoading = true;
|
||||
@@ -185,17 +188,17 @@ export class AlertSettingComponent implements OnInit {
|
||||
message => {
|
||||
deleteDefines$.unsubscribe();
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('删除成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.delete-success'), '');
|
||||
this.loadAlertDefineTable();
|
||||
} else {
|
||||
this.tableLoading = false;
|
||||
this.notifySvc.error('删除失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.delete-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.tableLoading = false;
|
||||
deleteDefines$.unsubscribe();
|
||||
this.notifySvc.error('删除失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.delete-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -242,7 +245,7 @@ export class AlertSettingComponent implements OnInit {
|
||||
}
|
||||
this.appHierarchies.forEach(hierarchy => {
|
||||
if (hierarchy.value == values[0]) {
|
||||
hierarchy.children.forEach((metrics: { value: string; children: any[]}) => {
|
||||
hierarchy.children.forEach((metrics: { value: string; children: any[] }) => {
|
||||
if (metrics.value == values[1]) {
|
||||
this.otherMetrics = [];
|
||||
metrics.children.forEach(item => {
|
||||
@@ -276,14 +279,14 @@ export class AlertSettingComponent implements OnInit {
|
||||
message => {
|
||||
if (message.code === 0) {
|
||||
this.isManageModalVisible = false;
|
||||
this.notifySvc.success('新增成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.new-success'), '');
|
||||
this.loadAlertDefineTable();
|
||||
} else {
|
||||
this.notifySvc.error('新增失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.new-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.notifySvc.error('新增失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.new-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
} else {
|
||||
@@ -299,14 +302,14 @@ export class AlertSettingComponent implements OnInit {
|
||||
message => {
|
||||
if (message.code === 0) {
|
||||
this.isManageModalVisible = false;
|
||||
this.notifySvc.success('修改成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.edit-success'), '');
|
||||
this.loadAlertDefineTable();
|
||||
} else {
|
||||
this.notifySvc.error('修改失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.edit-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.notifySvc.error('修改失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.edit-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -373,16 +376,16 @@ export class AlertSettingComponent implements OnInit {
|
||||
message => {
|
||||
this.isConnectModalOkLoading = false;
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('应用成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.apply-success'), '');
|
||||
this.isConnectModalVisible = false;
|
||||
this.loadAlertDefineTable();
|
||||
} else {
|
||||
this.notifySvc.error('应用失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.apply-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.isConnectModalOkLoading = false;
|
||||
this.notifySvc.error('应用失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.apply-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -10,16 +10,19 @@
|
||||
</div>
|
||||
<div nz-col nzSpan="14" class="p-md text-white">
|
||||
<nz-tag class="mb-xs">
|
||||
<span>正常 </span><span style="font-weight: bolder">{{ appCountService.availableSize }}</span>
|
||||
<span>{{ 'monitor.status.available' | i18n }} </span
|
||||
><span style="font-weight: bolder">{{ appCountService.availableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>不可用 </span><span style="font-weight: bolder">{{ appCountService.unAvailableSize }}</span>
|
||||
<span>{{ 'monitor.status.unavailable' | i18n }} </span
|
||||
><span style="font-weight: bolder">{{ appCountService.unAvailableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>不可达 </span><span style="font-weight: bolder">{{ appCountService.unReachableSize }}</span>
|
||||
<span>{{ 'monitor.status.unreachable' | i18n }} </span
|
||||
><span style="font-weight: bolder">{{ appCountService.unReachableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>未监控 </span><span style="font-weight: bolder">{{ appCountService.unManageSize }}</span>
|
||||
<span>{{ 'monitor.status.un-manage' | i18n }} </span><span style="font-weight: bolder">{{ appCountService.unManageSize }}</span>
|
||||
</nz-tag>
|
||||
</div>
|
||||
</div>
|
||||
@@ -35,16 +38,16 @@
|
||||
</div>
|
||||
<div nz-col nzSpan="14">
|
||||
<nz-tag class="mb-xs">
|
||||
<span>正常 </span><span style="font-weight: bolder">{{ appCountDb.availableSize }}</span>
|
||||
<span>{{ 'monitor.status.available' | i18n }} </span><span style="font-weight: bolder">{{ appCountDb.availableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>不可用 </span><span style="font-weight: bolder">{{ appCountDb.unAvailableSize }}</span>
|
||||
<span>{{ 'monitor.status.unavailable' | i18n }} </span><span style="font-weight: bolder">{{ appCountDb.unAvailableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>不可达 </span><span style="font-weight: bolder">{{ appCountDb.unReachableSize }}</span>
|
||||
<span>{{ 'monitor.status.unreachable' | i18n }} </span><span style="font-weight: bolder">{{ appCountDb.unReachableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>未监控 </span><span style="font-weight: bolder">{{ appCountDb.unManageSize }}</span>
|
||||
<span>{{ 'monitor.status.un-manage' | i18n }} </span><span style="font-weight: bolder">{{ appCountDb.unManageSize }}</span>
|
||||
</nz-tag>
|
||||
</div>
|
||||
</div>
|
||||
@@ -60,16 +63,16 @@
|
||||
</div>
|
||||
<div nz-col nzSpan="14">
|
||||
<nz-tag class="mb-xs">
|
||||
<span>正常 </span><span style="font-weight: bolder">{{ appCountOs.availableSize }}</span>
|
||||
<span>{{ 'monitor.status.available' | i18n }} </span><span style="font-weight: bolder">{{ appCountOs.availableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>不可用 </span><span style="font-weight: bolder">{{ appCountOs.unAvailableSize }}</span>
|
||||
<span>{{ 'monitor.status.unavailable' | i18n }} </span><span style="font-weight: bolder">{{ appCountOs.unAvailableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>不可达 </span><span style="font-weight: bolder">{{ appCountOs.unReachableSize }}</span>
|
||||
<span>{{ 'monitor.status.unreachable' | i18n }} </span><span style="font-weight: bolder">{{ appCountOs.unReachableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>未监控 </span><span style="font-weight: bolder">{{ appCountOs.unManageSize }}</span>
|
||||
<span>{{ 'monitor.status.un-manage' | i18n }} </span><span style="font-weight: bolder">{{ appCountOs.unManageSize }}</span>
|
||||
</nz-tag>
|
||||
</div>
|
||||
</div>
|
||||
@@ -85,16 +88,16 @@
|
||||
</div>
|
||||
<div nz-col nzSpan="14">
|
||||
<nz-tag class="mb-xs">
|
||||
<span>正常 </span><span style="font-weight: bolder">{{ appCountCustom.availableSize }}</span>
|
||||
<span>{{ 'monitor.status.available' | i18n }} </span><span style="font-weight: bolder">{{ appCountCustom.availableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>不可用 </span><span style="font-weight: bolder">{{ appCountCustom.unAvailableSize }}</span>
|
||||
<span>{{ 'monitor.status.unavailable' | i18n }} </span><span style="font-weight: bolder">{{ appCountCustom.unAvailableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>不可达 </span><span style="font-weight: bolder">{{ appCountCustom.unReachableSize }}</span>
|
||||
<span>{{ 'monitor.status.unreachable' | i18n }} </span><span style="font-weight: bolder">{{ appCountCustom.unReachableSize }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag class="mb-xs">
|
||||
<span>未监控 </span><span style="font-weight: bolder">{{ appCountCustom.unManageSize }}</span>
|
||||
<span>{{ 'monitor.status.un-manage' | i18n }} </span><span style="font-weight: bolder">{{ appCountCustom.unManageSize }}</span>
|
||||
</nz-tag>
|
||||
</div>
|
||||
</div>
|
||||
@@ -114,21 +117,21 @@
|
||||
|
||||
<div nz-row nzGutter="16" style="margin-top: 10px">
|
||||
<div nz-col nzXs="24" nzSm="24" nzMd="12" class="mb-md">
|
||||
<nz-card nzHoverable nzTitle="最近告警列表" [nzExtra]="extraTemplate">
|
||||
<nz-card nzHoverable [nzTitle]="'dashboard.alerts.title' | i18n" [nzExtra]="extraTemplate">
|
||||
<nz-timeline nzMode="left">
|
||||
<nz-timeline-item *ngFor="let alert of alerts; let i = index" [nzLabel]="(alert.gmtCreate | date: 'YYYY-MM-dd HH:mm:ss')?.trim()">
|
||||
<p style="font-weight: 400">
|
||||
<nz-tag *ngIf="alert.priority == 0" nzColor="red">
|
||||
<i nz-icon nzType="bell" nzTheme="outline"></i>
|
||||
<span>紧急告警</span>
|
||||
<span>{{ 'alert.priority.0' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="alert.priority == 1" nzColor="orange">
|
||||
<i nz-icon nzType="bell" nzTheme="outline"></i>
|
||||
<span>严重告警</span>
|
||||
<span>{{ 'alert.priority.1' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="alert.priority == 2" nzColor="yellow">
|
||||
<i nz-icon nzType="bell" nzTheme="outline"></i>
|
||||
<span>警告告警</span>
|
||||
<span>{{ 'alert.priority.2' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<span>[{{ alert.monitorName }}] </span>
|
||||
{{ alert.content }}
|
||||
@@ -162,5 +165,5 @@
|
||||
</div>
|
||||
|
||||
<ng-template #extraTemplate>
|
||||
<a [routerLink]="['/alert/center']">进入告警中心</a>
|
||||
<a [routerLink]="['/alert/center']">{{ 'dashboard.alerts.enter' | i18n }}</a>
|
||||
</ng-template>
|
||||
|
||||
@@ -48,13 +48,13 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
||||
ngOnInit(): void {
|
||||
this.appsCountTheme = {
|
||||
title: {
|
||||
text: '监控总览',
|
||||
subtext: '监控类型纳管数量分布',
|
||||
text: this.i18nSvc.fanyi('dashboard.monitors.title'),
|
||||
subtext: this.i18nSvc.fanyi('dashboard.monitors.sub-title'),
|
||||
left: 'center'
|
||||
},
|
||||
tooltip: {
|
||||
trigger: 'item',
|
||||
formatter: '{a} <br/>{b} : {c}个监控 占比({d}%)'
|
||||
formatter: `{a} <br/>{b} : {c}${this.i18nSvc.fanyi('dashboard.monitors.formatter')}({d}%)`
|
||||
},
|
||||
legend: {
|
||||
show: false,
|
||||
@@ -66,7 +66,7 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
||||
calculable: true,
|
||||
series: [
|
||||
{
|
||||
name: '总量',
|
||||
name: this.i18nSvc.fanyi('dashboard.monitors.total'),
|
||||
type: 'pie',
|
||||
selectedMode: 'single',
|
||||
color: '#722ED1',
|
||||
@@ -81,10 +81,10 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
||||
labelLine: {
|
||||
show: false
|
||||
},
|
||||
data: [{ value: 0, name: '监控总量' }]
|
||||
data: [{ value: 0, name: this.i18nSvc.fanyi('dashboard.monitors.total') }]
|
||||
},
|
||||
{
|
||||
name: '纳管数量分布',
|
||||
name: this.i18nSvc.fanyi('dashboard.monitors.distribute'),
|
||||
type: 'pie',
|
||||
radius: ['45%', '65%'],
|
||||
labelLine: {
|
||||
@@ -127,7 +127,7 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
||||
};
|
||||
this.alertsTheme = {
|
||||
title: {
|
||||
subtext: '告警分布',
|
||||
subtext: this.i18nSvc.fanyi('dashboard.alerts.distribute'),
|
||||
left: 'center'
|
||||
},
|
||||
tooltip: {
|
||||
@@ -138,14 +138,14 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
||||
},
|
||||
xAxis: {
|
||||
type: 'category',
|
||||
data: ['警告告警', '严重告警', '紧急告警']
|
||||
data: [this.i18nSvc.fanyi('alert.priority.2'), this.i18nSvc.fanyi('alert.priority.1'), this.i18nSvc.fanyi('alert.priority.0')]
|
||||
},
|
||||
yAxis: {
|
||||
type: 'value'
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '告警数量',
|
||||
name: this.i18nSvc.fanyi('dashboard.alerts.num'),
|
||||
type: 'bar',
|
||||
data: [
|
||||
{
|
||||
@@ -176,7 +176,7 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
||||
};
|
||||
this.alertsDealTheme = {
|
||||
title: {
|
||||
subtext: '告警处理',
|
||||
subtext: this.i18nSvc.fanyi('dashboard.alerts.deal'),
|
||||
left: 'center'
|
||||
},
|
||||
tooltip: {
|
||||
@@ -184,7 +184,7 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
||||
},
|
||||
series: [
|
||||
{
|
||||
name: '告警处理率',
|
||||
name: this.i18nSvc.fanyi('dashboard.alerts.deal-percent'),
|
||||
type: 'gauge',
|
||||
progress: {
|
||||
show: true
|
||||
@@ -196,7 +196,7 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
||||
data: [
|
||||
{
|
||||
value: 100,
|
||||
name: '告警处理率'
|
||||
name: this.i18nSvc.fanyi('dashboard.alerts.deal-percent')
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -279,7 +279,7 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
||||
}
|
||||
});
|
||||
// @ts-ignore
|
||||
this.appsCountTheme.series[0].data = [{ value: total, name: '监控总量' }];
|
||||
this.appsCountTheme.series[0].data = [{ value: total, name: this.i18nSvc.fanyi('dashboard.monitors.total') }];
|
||||
// @ts-ignore
|
||||
this.appsCountTheme.series[1].data = this.appsCountTableData;
|
||||
this.appsCountEChartOption = this.appsCountTheme;
|
||||
@@ -347,7 +347,7 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
||||
alertsDealLoading: boolean = true;
|
||||
|
||||
refreshAlertContentList(): void {
|
||||
let alertsInit$ = this.alertSvc.getAlerts(0, 4).subscribe(
|
||||
let alertsInit$ = this.alertSvc.loadAlerts(undefined, undefined, undefined, 0, 4).subscribe(
|
||||
message => {
|
||||
if (message.code === 0) {
|
||||
let page = message.data;
|
||||
@@ -397,7 +397,7 @@ export class DashboardComponent implements OnInit, OnDestroy {
|
||||
this.alertsDealTheme.series[0].data = [
|
||||
{
|
||||
value: summary.rate,
|
||||
name: '告警处理率'
|
||||
name: this.i18nSvc.fanyi('dashboard.alerts.deal-percent')
|
||||
}
|
||||
];
|
||||
this.alertsEChartOption = this.alertsTheme;
|
||||
|
||||
@@ -1,4 +1,6 @@
|
||||
import { Component, Input, OnInit } from '@angular/core';
|
||||
import { Component, Inject, Input, OnInit } from '@angular/core';
|
||||
import { I18NService } from '@core';
|
||||
import { ALAIN_I18N_TOKEN } from '@delon/theme';
|
||||
import { EChartsOption } from 'echarts';
|
||||
import { finalize } from 'rxjs/operators';
|
||||
|
||||
@@ -32,7 +34,7 @@ export class MonitorDataChartComponent implements OnInit {
|
||||
echartsInstance!: any;
|
||||
// 查询历史数据时间段 默认最近6小时
|
||||
timePeriod: string = '6h';
|
||||
constructor(private monitorSvc: MonitorService) {}
|
||||
constructor(private monitorSvc: MonitorService, @Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService) {}
|
||||
|
||||
ngOnInit(): void {
|
||||
this.lineHistoryTheme = {
|
||||
@@ -51,8 +53,8 @@ export class MonitorDataChartComponent implements OnInit {
|
||||
dataZoom: {
|
||||
yAxisIndex: 'none',
|
||||
title: {
|
||||
zoom: '区域缩放',
|
||||
back: '缩放还原'
|
||||
zoom: this.i18nSvc.fanyi('monitors.detail.chart.zoom'),
|
||||
back: this.i18nSvc.fanyi('monitors.detail.chart.back')
|
||||
},
|
||||
emphasis: {
|
||||
iconStyle: {
|
||||
@@ -61,7 +63,7 @@ export class MonitorDataChartComponent implements OnInit {
|
||||
}
|
||||
},
|
||||
saveAsImage: {
|
||||
title: '保存图片',
|
||||
title: this.i18nSvc.fanyi('monitors.detail.chart.save'),
|
||||
emphasis: {
|
||||
iconStyle: {
|
||||
textPosition: 'left'
|
||||
@@ -70,7 +72,7 @@ export class MonitorDataChartComponent implements OnInit {
|
||||
},
|
||||
myPeriod1h: {
|
||||
show: true,
|
||||
title: '查询近1小时',
|
||||
title: this.i18nSvc.fanyi('monitors.detail.chart.query-1h'),
|
||||
icon: 'path://M827.871087 196.128913C743.498468 111.756293 631.321596 65.290005 512 65.290005c-119.319549 0-231.499491 46.465265-315.871087 130.837884S65.290005 392.680451 65.290005 512s46.465265 231.499491 130.837884 315.871087 196.551538 130.837884 315.871087 130.837884c119.321596 0 231.499491-46.465265 315.871087-130.837884S958.708971 631.319549 958.708971 512 912.243707 280.500509 827.871087 196.128913zM531.556405 917.246651l0-74.145697c0-11.31572-9.174963-20.491707-20.491707-20.491707-11.316743 0-20.491707 9.174963-20.491707 20.491707l0 74.059739C283.276738 906.322857 116.693746 739.164766 106.755396 531.634176l72.351841 0c11.31572 0 20.491707-9.174963 20.491707-20.491707 0-11.31572-9.174963-20.491707-20.491707-20.491707l-72.273047 0c10.769274-206.737528 177.01253-373.005342 383.740848-383.813502l0 72.346725c0 11.316743 9.174963 20.491707 20.491707 20.491707 11.31572 0 20.491707-9.17394 20.491707-20.491707L531.558451 106.752326c207.593012 9.901511 374.807385 176.539762 385.609405 383.89946l-74.142627 0c-11.316743 0-20.491707 9.174963-20.491707 20.491707 0 11.316743 9.174963 20.491707 20.491707 20.491707l74.220399 0C907.275555 739.78796 739.720422 907.317511 531.556405 917.246651z;M532.098757 503.118726 532.098757 258.240529c0-11.316743-9.174963-20.491707-20.491707-20.491707-11.31572 0-20.491707 9.17394-20.491707 20.491707l0 254.66612c0 7.858992 4.429893 14.677281 10.924817 18.114566L693.447539 722.42757c4.002151 4.000104 9.245572 6.001691 14.490016 6.001691s10.487865-2.001587 14.490016-6.001691c8.002254-8.002254 8.002254-20.977777 0-28.980032L532.098757 503.118726z',
|
||||
emphasis: {
|
||||
iconStyle: {
|
||||
@@ -83,7 +85,7 @@ export class MonitorDataChartComponent implements OnInit {
|
||||
},
|
||||
myPeriod6h: {
|
||||
show: true,
|
||||
title: '查询近6小时',
|
||||
title: this.i18nSvc.fanyi('monitors.detail.chart.query-6h'),
|
||||
icon: 'path://M827.871087 196.128913C743.498468 111.756293 631.321596 65.290005 512 65.290005c-119.319549 0-231.499491 46.465265-315.871087 130.837884S65.290005 392.680451 65.290005 512s46.465265 231.499491 130.837884 315.871087 196.551538 130.837884 315.871087 130.837884c119.321596 0 231.499491-46.465265 315.871087-130.837884S958.708971 631.319549 958.708971 512 912.243707 280.500509 827.871087 196.128913zM531.556405 917.246651l0-74.145697c0-11.31572-9.174963-20.491707-20.491707-20.491707-11.316743 0-20.491707 9.174963-20.491707 20.491707l0 74.059739C283.276738 906.322857 116.693746 739.164766 106.755396 531.634176l72.351841 0c11.31572 0 20.491707-9.174963 20.491707-20.491707 0-11.31572-9.174963-20.491707-20.491707-20.491707l-72.273047 0c10.769274-206.737528 177.01253-373.005342 383.740848-383.813502l0 72.346725c0 11.316743 9.174963 20.491707 20.491707 20.491707 11.31572 0 20.491707-9.17394 20.491707-20.491707L531.558451 106.752326c207.593012 9.901511 374.807385 176.539762 385.609405 383.89946l-74.142627 0c-11.316743 0-20.491707 9.174963-20.491707 20.491707 0 11.316743 9.174963 20.491707 20.491707 20.491707l74.220399 0C907.275555 739.78796 739.720422 907.317511 531.556405 917.246651z;M532.098757 503.118726 532.098757 258.240529c0-11.316743-9.174963-20.491707-20.491707-20.491707-11.31572 0-20.491707 9.17394-20.491707 20.491707l0 254.66612c0 7.858992 4.429893 14.677281 10.924817 18.114566L693.447539 722.42757c4.002151 4.000104 9.245572 6.001691 14.490016 6.001691s10.487865-2.001587 14.490016-6.001691c8.002254-8.002254 8.002254-20.977777 0-28.980032L532.098757 503.118726z',
|
||||
emphasis: {
|
||||
iconStyle: {
|
||||
@@ -96,7 +98,7 @@ export class MonitorDataChartComponent implements OnInit {
|
||||
},
|
||||
myPeriod1d: {
|
||||
show: true,
|
||||
title: '查询近1天',
|
||||
title: this.i18nSvc.fanyi('monitors.detail.chart.query-1d'),
|
||||
icon: 'path://M827.871087 196.128913C743.498468 111.756293 631.321596 65.290005 512 65.290005c-119.319549 0-231.499491 46.465265-315.871087 130.837884S65.290005 392.680451 65.290005 512s46.465265 231.499491 130.837884 315.871087 196.551538 130.837884 315.871087 130.837884c119.321596 0 231.499491-46.465265 315.871087-130.837884S958.708971 631.319549 958.708971 512 912.243707 280.500509 827.871087 196.128913zM531.556405 917.246651l0-74.145697c0-11.31572-9.174963-20.491707-20.491707-20.491707-11.316743 0-20.491707 9.174963-20.491707 20.491707l0 74.059739C283.276738 906.322857 116.693746 739.164766 106.755396 531.634176l72.351841 0c11.31572 0 20.491707-9.174963 20.491707-20.491707 0-11.31572-9.174963-20.491707-20.491707-20.491707l-72.273047 0c10.769274-206.737528 177.01253-373.005342 383.740848-383.813502l0 72.346725c0 11.316743 9.174963 20.491707 20.491707 20.491707 11.31572 0 20.491707-9.17394 20.491707-20.491707L531.558451 106.752326c207.593012 9.901511 374.807385 176.539762 385.609405 383.89946l-74.142627 0c-11.316743 0-20.491707 9.174963-20.491707 20.491707 0 11.316743 9.174963 20.491707 20.491707 20.491707l74.220399 0C907.275555 739.78796 739.720422 907.317511 531.556405 917.246651z;M532.098757 503.118726 532.098757 258.240529c0-11.316743-9.174963-20.491707-20.491707-20.491707-11.31572 0-20.491707 9.17394-20.491707 20.491707l0 254.66612c0 7.858992 4.429893 14.677281 10.924817 18.114566L693.447539 722.42757c4.002151 4.000104 9.245572 6.001691 14.490016 6.001691s10.487865-2.001587 14.490016-6.001691c8.002254-8.002254 8.002254-20.977777 0-28.980032L532.098757 503.118726z',
|
||||
emphasis: {
|
||||
iconStyle: {
|
||||
@@ -109,7 +111,7 @@ export class MonitorDataChartComponent implements OnInit {
|
||||
},
|
||||
myPeriod1w: {
|
||||
show: true,
|
||||
title: '查询近1周',
|
||||
title: this.i18nSvc.fanyi('monitors.detail.chart.query-1w'),
|
||||
icon: 'path://M827.871087 196.128913C743.498468 111.756293 631.321596 65.290005 512 65.290005c-119.319549 0-231.499491 46.465265-315.871087 130.837884S65.290005 392.680451 65.290005 512s46.465265 231.499491 130.837884 315.871087 196.551538 130.837884 315.871087 130.837884c119.321596 0 231.499491-46.465265 315.871087-130.837884S958.708971 631.319549 958.708971 512 912.243707 280.500509 827.871087 196.128913zM531.556405 917.246651l0-74.145697c0-11.31572-9.174963-20.491707-20.491707-20.491707-11.316743 0-20.491707 9.174963-20.491707 20.491707l0 74.059739C283.276738 906.322857 116.693746 739.164766 106.755396 531.634176l72.351841 0c11.31572 0 20.491707-9.174963 20.491707-20.491707 0-11.31572-9.174963-20.491707-20.491707-20.491707l-72.273047 0c10.769274-206.737528 177.01253-373.005342 383.740848-383.813502l0 72.346725c0 11.316743 9.174963 20.491707 20.491707 20.491707 11.31572 0 20.491707-9.17394 20.491707-20.491707L531.558451 106.752326c207.593012 9.901511 374.807385 176.539762 385.609405 383.89946l-74.142627 0c-11.316743 0-20.491707 9.174963-20.491707 20.491707 0 11.316743 9.174963 20.491707 20.491707 20.491707l74.220399 0C907.275555 739.78796 739.720422 907.317511 531.556405 917.246651z;M532.098757 503.118726 532.098757 258.240529c0-11.316743-9.174963-20.491707-20.491707-20.491707-11.31572 0-20.491707 9.17394-20.491707 20.491707l0 254.66612c0 7.858992 4.429893 14.677281 10.924817 18.114566L693.447539 722.42757c4.002151 4.000104 9.245572 6.001691 14.490016 6.001691s10.487865-2.001587 14.490016-6.001691c8.002254-8.002254 8.002254-20.977777 0-28.980032L532.098757 503.118726z',
|
||||
emphasis: {
|
||||
iconStyle: {
|
||||
@@ -122,7 +124,7 @@ export class MonitorDataChartComponent implements OnInit {
|
||||
},
|
||||
myPeriod4w: {
|
||||
show: true,
|
||||
title: '查询近1月',
|
||||
title: this.i18nSvc.fanyi('monitors.detail.chart.query-1m'),
|
||||
icon: 'path://M827.871087 196.128913C743.498468 111.756293 631.321596 65.290005 512 65.290005c-119.319549 0-231.499491 46.465265-315.871087 130.837884S65.290005 392.680451 65.290005 512s46.465265 231.499491 130.837884 315.871087 196.551538 130.837884 315.871087 130.837884c119.321596 0 231.499491-46.465265 315.871087-130.837884S958.708971 631.319549 958.708971 512 912.243707 280.500509 827.871087 196.128913zM531.556405 917.246651l0-74.145697c0-11.31572-9.174963-20.491707-20.491707-20.491707-11.316743 0-20.491707 9.174963-20.491707 20.491707l0 74.059739C283.276738 906.322857 116.693746 739.164766 106.755396 531.634176l72.351841 0c11.31572 0 20.491707-9.174963 20.491707-20.491707 0-11.31572-9.174963-20.491707-20.491707-20.491707l-72.273047 0c10.769274-206.737528 177.01253-373.005342 383.740848-383.813502l0 72.346725c0 11.316743 9.174963 20.491707 20.491707 20.491707 11.31572 0 20.491707-9.17394 20.491707-20.491707L531.558451 106.752326c207.593012 9.901511 374.807385 176.539762 385.609405 383.89946l-74.142627 0c-11.316743 0-20.491707 9.174963-20.491707 20.491707 0 11.316743 9.174963 20.491707 20.491707 20.491707l74.220399 0C907.275555 739.78796 739.720422 907.317511 531.556405 917.246651z;M532.098757 503.118726 532.098757 258.240529c0-11.316743-9.174963-20.491707-20.491707-20.491707-11.31572 0-20.491707 9.17394-20.491707 20.491707l0 254.66612c0 7.858992 4.429893 14.677281 10.924817 18.114566L693.447539 722.42757c4.002151 4.000104 9.245572 6.001691 14.490016 6.001691s10.487865-2.001587 14.490016-6.001691c8.002254-8.002254 8.002254-20.977777 0-28.980032L532.098757 503.118726z',
|
||||
emphasis: {
|
||||
iconStyle: {
|
||||
@@ -135,7 +137,7 @@ export class MonitorDataChartComponent implements OnInit {
|
||||
},
|
||||
myRefresh: {
|
||||
show: true,
|
||||
title: '刷新',
|
||||
title: this.i18nSvc.fanyi('common.refresh'),
|
||||
icon: 'path://M663.881 339.763l274.021-0.742 0.058-13.271 0.699 0c-0.204-0.48-0.495-0.945-0.699-1.426L938.658 65l-23.776 0.044L914.3 280.41C835.9 151.374 694.321 65 532.342 65c-246.869 0-447 200.132-447 447 0 246.84 200.131 447 447 447 180.343 0 335.657-106.919 406.316-260.75l-33.176 0C836.948 835.027 695.456 929.2 532.342 929.2c-230.048 0-417.2-187.152-417.2-417.2s187.152-417.2 417.2-417.2c158.895 0 297.068 89.487 367.466 220.547l-235.868 0.64L663.881 339.763z',
|
||||
emphasis: {
|
||||
iconStyle: {
|
||||
@@ -183,7 +185,7 @@ export class MonitorDataChartComponent implements OnInit {
|
||||
};
|
||||
if (this.unit != undefined || this.unit != null) {
|
||||
// @ts-ignore
|
||||
this.lineHistoryTheme.title?.subtext = `单位 ${this.unit}`;
|
||||
this.lineHistoryTheme.title?.subtext = `${this.i18nSvc.fanyi('monitors.detail.chart.unit')} ${this.unit}`;
|
||||
}
|
||||
this.loadData();
|
||||
}
|
||||
@@ -251,7 +253,7 @@ export class MonitorDataChartComponent implements OnInit {
|
||||
} else {
|
||||
this.eChartOption = this.lineHistoryTheme;
|
||||
this.eChartOption.title = {
|
||||
text: `${this.metrics}.${this.metric}` + '\n\n\n' + '暂无数据',
|
||||
text: `${`${this.metrics}.${this.metric}` + '\n\n\n'}${this.i18nSvc.fanyi('monitors.detail.chart.no-data')}`,
|
||||
textStyle: {
|
||||
fontSize: 16,
|
||||
fontFamily: 'monospace',
|
||||
|
||||
@@ -17,8 +17,8 @@
|
||||
<nz-table #smallTable nzSize="small" nzNoResult="No Metrics Data" nzFrontPagination="false" [nzData]="valueRows">
|
||||
<thead>
|
||||
<tr>
|
||||
<th style="text-align: center">属性</th>
|
||||
<th style="text-align: center">值</th>
|
||||
<th style="text-align: center">{{ 'common.name' | i18n }}</th>
|
||||
<th style="text-align: center">{{ 'common.value' | i18n }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -33,17 +33,11 @@
|
||||
<ng-template #monitor_metrics_card_title>
|
||||
<p style="font-size: small; text-align: center; margin-bottom: 3px">{{ metrics }}</p>
|
||||
<div>
|
||||
<a nz-popover [nzPopoverContent]="'最近采集时间 ' + (time | _date: 'yyyy-MM-dd HH:mm:ss')">
|
||||
<a nz-popover [nzPopoverContent]="'Last Collect Time ' + (time | _date: 'yyyy-MM-dd HH:mm:ss')">
|
||||
<i nz-icon nzType="field-time" nzTheme="outline"></i
|
||||
></a>
|
||||
<i style="font-size: 0.3px; font-weight: normal; color: rgba(112,112,112,0.89)">采集时间:{{ time | _date: 'HH:mm:ss' }}</i>
|
||||
<i style="font-size: 0.3px; font-weight: normal; color: rgba(112, 112, 112, 0.89)">
|
||||
{{ 'monitors.collect.time' | i18n }}:{{ time | _date: 'HH:mm:ss' }}
|
||||
</i>
|
||||
</div>
|
||||
</ng-template>
|
||||
|
||||
<!--<nz-card *ngIf="!isTable" nzHoverable style="height:auto;margin-left: 14px;" [nzBordered]="true"-->
|
||||
<!-- [nzTitle]="monitor_metrics_card_title" >-->
|
||||
<!-- <div *ngFor="let field of fields;let i = index;" nz-row nzGutter="16">-->
|
||||
<!-- <div nz-col nzSpan="10"><p style="text-align: right">{{field.name}}</p></div>-->
|
||||
<!-- <div nz-col nzSpan="14"><p style="text-align: left">{{rowValues[i].origin}}</p></div>-->
|
||||
<!-- </div>-->
|
||||
<!--</nz-card>-->
|
||||
|
||||
@@ -3,20 +3,20 @@
|
||||
<nz-breadcrumb-item>
|
||||
<a [routerLink]="['/']">
|
||||
<i nz-icon nzType="home"></i>
|
||||
<span>仪表盘</span>
|
||||
<span>{{ 'menu.dashboard' | i18n }}</span>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
<nz-breadcrumb-item>
|
||||
<a [routerLink]="['/monitors']" [queryParams]="{ app: app ? app : '' }">
|
||||
<i nz-icon nzType="monitor"></i>
|
||||
<span>监控列表</span>
|
||||
<span>{{ 'monitors.list' | i18n }}</span>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
<nz-breadcrumb-item>
|
||||
<i nz-icon nzType="pie-chart"></i>
|
||||
<span>{{ 'monitor.app.' + app | i18n }} 监控详情</span>
|
||||
<span>{{ 'monitor.app.' + app | i18n }} {{ 'monitors.detail' | i18n }}</span>
|
||||
<a [href]="'https://tancloud.cn/docs/help/' + monitor.app" target="_blank" style="float: right; margin-right: 5%">
|
||||
<span>帮助 </span>
|
||||
<span>{{ 'common.button.help' | i18n }} </span>
|
||||
<i nz-icon nzType="question-circle" nzTheme="outline"></i>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
@@ -33,7 +33,9 @@
|
||||
>
|
||||
</div>
|
||||
<div nz-row nzGutter="16">
|
||||
<div nz-col nzSpan="8"><p style="text-align: right">名称</p></div>
|
||||
<div nz-col nzSpan="8"
|
||||
><p style="text-align: right">{{ 'monitors.detail.name' | i18n }}</p></div
|
||||
>
|
||||
<div nz-col nzSpan="16"
|
||||
><p style="text-align: left">{{ monitor?.name }}</p></div
|
||||
>
|
||||
@@ -45,56 +47,64 @@
|
||||
>
|
||||
</div>
|
||||
<div nz-row nzGutter="16">
|
||||
<div nz-col nzSpan="8"><p style="text-align: right">端口</p></div>
|
||||
<div nz-col nzSpan="8"
|
||||
><p style="text-align: right">{{ 'monitors.detail.port' | i18n }}</p></div
|
||||
>
|
||||
<div nz-col nzSpan="16"
|
||||
><p style="text-align: left">{{ port }}</p></div
|
||||
>
|
||||
</div>
|
||||
<div nz-row nzGutter="16">
|
||||
<div nz-col nzSpan="8"><p style="text-align: right">描述</p></div>
|
||||
<div nz-col nzSpan="8"
|
||||
><p style="text-align: right">{{ 'monitors.detail.description' | i18n }}</p></div
|
||||
>
|
||||
<div nz-col nzSpan="16"
|
||||
><p style="text-align: left">{{ monitor?.description }}</p></div
|
||||
>
|
||||
</div>
|
||||
<div nz-row nzGutter="16">
|
||||
<div nz-col nzSpan="8"><p style="text-align: right">状态</p></div>
|
||||
<div nz-col nzSpan="8"
|
||||
><p style="text-align: right">{{ 'monitors.detail.status' | i18n }}</p></div
|
||||
>
|
||||
<div nz-col nzSpan="16">
|
||||
<nz-tag *ngIf="monitor?.status == 0" nzColor="default">
|
||||
<i nz-icon nzType="robot" nzTheme="outline"></i>
|
||||
<span>未监控</span>
|
||||
<span>{{ 'monitor.status.un-manage' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="monitor?.status == 1" nzColor="success">
|
||||
<i nz-icon nzType="smile" nzTheme="outline"></i>
|
||||
<span>正常监控</span>
|
||||
<span>{{ 'monitor.status.available' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="monitor?.status == 2" nzColor="warning">
|
||||
<i nz-icon nzType="meh" nzTheme="outline"></i>
|
||||
<span>监控不可用</span>
|
||||
<span>{{ 'monitor.status.unavailable' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="monitor?.status == 3" nzColor="error">
|
||||
<i nz-icon nzType="frown" nzTheme="outline"></i>
|
||||
<span>监控不可达</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="monitor?.status == 4" nzColor="default">
|
||||
<i nz-icon nzType="sync"></i>
|
||||
<span>监控已挂起</span>
|
||||
<span>{{ 'monitor.status.unreachable' | i18n }}</span>
|
||||
</nz-tag>
|
||||
</div>
|
||||
</div>
|
||||
<div nz-row nzGutter="16">
|
||||
<div nz-col nzSpan="8"><p style="text-align: right">采集间隔</p></div>
|
||||
<div nz-col nzSpan="8"
|
||||
><p style="text-align: right">{{ 'monitor.intervals' | i18n }}</p></div
|
||||
>
|
||||
<div nz-col nzSpan="16"
|
||||
><p style="text-align: left">{{ monitor?.intervals }}s</p></div
|
||||
>
|
||||
</div>
|
||||
<div nz-row nzGutter="16">
|
||||
<div nz-col nzSpan="8"><p style="text-align: right">创建时间</p></div>
|
||||
<div nz-col nzSpan="8"
|
||||
><p style="text-align: right">{{ 'common.new-time' | i18n }}</p></div
|
||||
>
|
||||
<div nz-col nzSpan="16"
|
||||
><p style="text-align: left">{{ monitor?.gmtCreate | date: 'YYYY-MM-dd HH:mm:ss' }}</p></div
|
||||
>
|
||||
</div>
|
||||
<div nz-row nzGutter="16">
|
||||
<div nz-col nzSpan="8"><p style="text-align: right">更新时间</p></div>
|
||||
<div nz-col nzSpan="8"
|
||||
><p style="text-align: right">{{ 'common.edit-time' | i18n }}</p></div
|
||||
>
|
||||
<div nz-col nzSpan="16"
|
||||
><p style="text-align: left">{{ monitor?.gmtUpdate | date: 'YYYY-MM-dd HH:mm:ss' }}</p></div
|
||||
>
|
||||
@@ -107,7 +117,7 @@
|
||||
<nz-tab [nzTitle]="titleTemplate">
|
||||
<ng-template #titleTemplate>
|
||||
<i nz-icon nzType="pic-right" style="margin-left: 10px"></i>
|
||||
监控实时数据详情
|
||||
{{ 'monitors.detail.realtime' | i18n }}
|
||||
</ng-template>
|
||||
<div style="display: flex; justify-content: flex-start; flex-wrap: wrap">
|
||||
<div *ngFor="let metric of metrics; let i = index">
|
||||
@@ -118,7 +128,7 @@
|
||||
<nz-tab [nzTitle]="title2Template" (nzClick)="initMetricChart()">
|
||||
<ng-template #title2Template>
|
||||
<i nz-icon nzType="pic-right" style="margin-left: 10px"></i>
|
||||
监控历史图表详情
|
||||
{{ 'monitors.detail.history' | i18n }}
|
||||
</ng-template>
|
||||
<div style="display: flex; justify-content: flex-start; flex-wrap: wrap">
|
||||
<div *ngFor="let item of chartMetrics; let i = index">
|
||||
@@ -138,5 +148,5 @@
|
||||
</nz-layout>
|
||||
|
||||
<ng-template #monitor_basic_card_title>
|
||||
<p style="font-size: small; text-align: left; margin-bottom: 3px">监控基本属性</p>
|
||||
<p style="font-size: small; text-align: left; margin-bottom: 3px">{{ 'monitors.detail.basic' | i18n }}</p>
|
||||
</ng-template>
|
||||
|
||||
@@ -3,20 +3,20 @@
|
||||
<nz-breadcrumb-item>
|
||||
<a [routerLink]="['/']">
|
||||
<i nz-icon nzType="home"></i>
|
||||
<span>仪表盘</span>
|
||||
<span>{{ 'menu.dashboard' | i18n }}</span>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
<nz-breadcrumb-item>
|
||||
<a [routerLink]="['/monitors']" [queryParams]="{ app: monitor.app ? monitor.app : '' }">
|
||||
<i nz-icon nzType="monitor"></i>
|
||||
<span>监控列表</span>
|
||||
<span>{{ 'monitors.list' | i18n }}</span>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
<nz-breadcrumb-item>
|
||||
<i nz-icon nzType="edit"></i>
|
||||
<span>修改 {{ 'monitor.app.' + monitor.app | i18n }} 监控</span>
|
||||
<span>{{ 'monitors.edit' | i18n }} {{ 'monitor.app.' + monitor.app | i18n }} {{ 'monitor' | i18n }}</span>
|
||||
<a [href]="'https://tancloud.cn/docs/help/' + monitor.app" target="_blank" style="float: right; margin-right: 5%">
|
||||
<span>帮助 </span>
|
||||
<span>{{ 'common.button.help' | i18n }} </span>
|
||||
<i nz-icon nzType="question-circle" nzTheme="outline"></i>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
@@ -27,17 +27,19 @@
|
||||
<div class="-inner-content">
|
||||
<form nz-form #editForm="ngForm">
|
||||
<nz-form-item>
|
||||
<nz-form-label [nzSpan]="7" nzFor="host" nzRequired="true" nzTooltipTitle="被监控的对端IP或域名"> 监控Host </nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="host" nzRequired="true" [nzTooltipTitle]="'monitor.host.tip' | i18n">
|
||||
{{ 'monitor.host' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control [nzSpan]="8" [nzErrorTip]="'validation.required' | i18n">
|
||||
<input [(ngModel)]="monitor.host" nz-input name="host" type="text" id="host" required placeholder="请输入域名或IP" />
|
||||
<input [(ngModel)]="monitor.host" nz-input name="host" type="text" id="host" required [placeholder]="'monitor.host.tip' | i18n" />
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label [nzSpan]="7" nzFor="name" nzRequired="true" nzTooltipTitle="标识此监控的名称,名称需要保证唯一性">
|
||||
监控名称
|
||||
<nz-form-label [nzSpan]="7" nzFor="name" nzRequired="true" [nzTooltipTitle]="'monitor.name.tip' | i18n">
|
||||
{{ 'monitor.name' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control [nzSpan]="8" [nzErrorTip]="'validation.required' | i18n">
|
||||
<input [(ngModel)]="monitor.name" nz-input required name="name" type="text" id="name" placeholder="监控名称需要保证唯一性" />
|
||||
<input [(ngModel)]="monitor.name" nz-input required name="name" type="text" id="name" [placeholder]="'monitor.name.tip' | i18n" />
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
|
||||
@@ -163,7 +165,7 @@
|
||||
</nz-form-item>
|
||||
|
||||
<nz-collapse [nzGhost]="true">
|
||||
<nz-collapse-panel nzHeader="高级" [nzHeader]="extraColHeader" [nzShowArrow]="false">
|
||||
<nz-collapse-panel [nzHeader]="extraColHeader" [nzShowArrow]="false">
|
||||
<nz-form-item *ngFor="let paramDefine of advancedParamDefines; let i = index">
|
||||
<nz-form-label
|
||||
*ngIf="paramDefine.field !== 'host' && paramDefine.type === 'text'"
|
||||
@@ -296,8 +298,8 @@
|
||||
</nz-collapse-panel>
|
||||
</nz-collapse>
|
||||
<ng-template #extraColHeader>
|
||||
<button style="top: -10px; margin-left: 40%" nz-button nzType="dashed" nz-tooltip nzTooltipTitle="设置高级可选参数">
|
||||
<span>高级设置</span>
|
||||
<button style="top: -10px; margin-left: 40%" nz-button nzType="dashed" nz-tooltip [nzTooltipTitle]="'monitors.advanced.tip' | i18n">
|
||||
<span>{{ 'monitors.advanced' | i18n }}</span>
|
||||
<i nz-icon nzType="down-circle" nzTheme="outline"></i>
|
||||
</button>
|
||||
</ng-template>
|
||||
@@ -305,7 +307,9 @@
|
||||
<nz-divider></nz-divider>
|
||||
|
||||
<nz-form-item>
|
||||
<nz-form-label nzSpan="7" nzFor="intervals" nzTooltipTitle="监控周期性采集数据间隔时间,单位秒"> 采集间隔 </nz-form-label>
|
||||
<nz-form-label nzSpan="7" nzFor="intervals" [nzTooltipTitle]="'monitor.intervals.tip' | i18n">
|
||||
{{ 'monitor.intervals' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control nzSpan="8">
|
||||
<nz-input-number [(ngModel)]="monitor.intervals" [nzMin]="10" [nzMax]="604800" [nzStep]="60" name="intervals" id="intervals">
|
||||
</nz-input-number>
|
||||
@@ -313,14 +317,18 @@
|
||||
</nz-form-item>
|
||||
|
||||
<nz-form-item>
|
||||
<nz-form-label nzSpan="7" nzFor="detect" nzTooltipTitle="新增监控前是否先探测检查监控可用性"> 测试连接 </nz-form-label>
|
||||
<nz-form-label nzSpan="7" nzFor="detect" [nzTooltipTitle]="'monitors.detect.tip' | i18n">
|
||||
{{ 'monitors.detect' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control nzSpan="8">
|
||||
<nz-switch [(ngModel)]="detected" name="detect" id="detect"></nz-switch>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
|
||||
<nz-form-item>
|
||||
<nz-form-label [nzSpan]="7" nzFor="description" nzTooltipTitle="更多标识和描述此监控的备注信息"> 描述备注 </nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="description" [nzTooltipTitle]="'monitor.description.tip' | i18n">
|
||||
{{ 'monitor.description' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control [nzSpan]="8">
|
||||
<nz-textarea-count [nzMaxCharacterCount]="100">
|
||||
<textarea [(ngModel)]="monitor.description" rows="3" nz-input name="description" id="description"></textarea>
|
||||
@@ -330,9 +338,9 @@
|
||||
|
||||
<div nz-row>
|
||||
<div nz-col nzSpan="8" nzOffset="9">
|
||||
<button nz-button nzType="primary" type="submit" (click)="onDetect(editForm.form)"> 测试 </button>
|
||||
<button nz-button nzType="primary" type="submit" (click)="onSubmit(editForm.form)"> 确定 </button>
|
||||
<button nz-button nzType="primary" type="reset" (click)="onCancel()"> 取消 </button>
|
||||
<button nz-button nzType="primary" type="submit" (click)="onDetect(editForm.form)"> {{ 'common.button.detect' | i18n }} </button>
|
||||
<button nz-button nzType="primary" type="submit" (click)="onSubmit(editForm.form)"> {{ 'common.button.ok' | i18n }} </button>
|
||||
<button nz-button nzType="primary" type="reset" (click)="onCancel()"> {{ 'common.button.cancel' | i18n }} </button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -1,7 +1,8 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
import { FormGroup } from '@angular/forms';
|
||||
import { ActivatedRoute, ParamMap, Router } from '@angular/router';
|
||||
import { TitleService } from '@delon/theme';
|
||||
import { I18NService } from '@core';
|
||||
import { ALAIN_I18N_TOKEN, TitleService } from '@delon/theme';
|
||||
import { NzNotificationService } from 'ng-zorro-antd/notification';
|
||||
import { throwError } from 'rxjs';
|
||||
import { switchMap } from 'rxjs/operators';
|
||||
@@ -25,7 +26,8 @@ export class MonitorEditComponent implements OnInit {
|
||||
private route: ActivatedRoute,
|
||||
private router: Router,
|
||||
private titleSvc: TitleService,
|
||||
private notifySvc: NzNotificationService
|
||||
private notifySvc: NzNotificationService,
|
||||
@Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService
|
||||
) {}
|
||||
|
||||
paramDefines!: ParamDefine[];
|
||||
@@ -64,8 +66,8 @@ export class MonitorEditComponent implements OnInit {
|
||||
this.detected = message.data.detected ? message.data.detected : true;
|
||||
} else {
|
||||
console.warn(message.msg);
|
||||
this.notifySvc.error('查询异常,此监控不存在', message.msg);
|
||||
return throwError('查询此监控异常');
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('monitors.not-found'), message.msg);
|
||||
return throwError(this.i18nSvc.fanyi('monitors.not-found'));
|
||||
}
|
||||
return this.appDefineSvc.getAppParamsDefine(this.monitor.app);
|
||||
})
|
||||
@@ -168,15 +170,15 @@ export class MonitorEditComponent implements OnInit {
|
||||
message => {
|
||||
this.isSpinning = false;
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('修改监控成功', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('monitors.edit.success'), '');
|
||||
this.router.navigateByUrl(`/monitors?app=${this.monitor.app}`);
|
||||
} else {
|
||||
this.notifySvc.error('修改监控失败', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('monitors.edit.failed'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.isSpinning = false;
|
||||
this.notifySvc.error('修改监控失败', error.error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('monitors.edit.failed'), error.error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -217,14 +219,14 @@ export class MonitorEditComponent implements OnInit {
|
||||
message => {
|
||||
this.isSpinning = false;
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('探测成功', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('monitors.detect.success'), '');
|
||||
} else {
|
||||
this.notifySvc.error('探测失败', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('monitors.detect.failed'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.isSpinning = false;
|
||||
this.notifySvc.error('探测异常', error.error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('monitors.detect.failed'), error.error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -3,12 +3,12 @@
|
||||
<nz-breadcrumb-item>
|
||||
<a [routerLink]="['/']">
|
||||
<i nz-icon nzType="home"></i>
|
||||
<span>仪表盘</span>
|
||||
<span>{{ 'menu.dashboard' | i18n }}</span>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
<nz-breadcrumb-item>
|
||||
<i nz-icon nzType="monitor"></i>
|
||||
<span>{{ 'monitor.app.' + app | i18n }} 监控列表</span>
|
||||
<span>{{ 'monitor.app.' + app | i18n }} {{ 'monitors.list' | i18n }}</span>
|
||||
</nz-breadcrumb-item>
|
||||
</nz-breadcrumb>
|
||||
<nz-divider></nz-divider>
|
||||
@@ -17,35 +17,37 @@
|
||||
<button nz-button nzType="primary">
|
||||
<a routerLink="/monitors/new" [queryParams]="{ app: app }">
|
||||
<i nz-icon nzType="appstore-add" nzTheme="outline"></i>
|
||||
新增 {{ 'monitor.app.' + app | i18n }}
|
||||
{{ 'monitors.new' | i18n }} {{ 'monitor.app.' + app | i18n }}
|
||||
</a>
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onEditMonitor()">
|
||||
<i nz-icon nzType="edit" nzTheme="outline"></i>
|
||||
编辑
|
||||
{{ 'monitors.edit' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onDeleteMonitors()">
|
||||
<i nz-icon nzType="delete" nzTheme="outline"></i>
|
||||
删除
|
||||
{{ 'monitors.delete' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onEnableManageMonitors()">
|
||||
<i nz-icon nzType="up-circle" nzTheme="outline"></i>
|
||||
启用监控
|
||||
{{ 'monitors.enable' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onCancelManageMonitors()">
|
||||
<i nz-icon nzType="down-circle" nzTheme="outline"></i>
|
||||
取消监控
|
||||
{{ 'monitors.cancel' | i18n }}
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="sync()" nz-tooltip nzTooltipTitle="刷新">
|
||||
<button nz-button nzType="primary" (click)="sync()" nz-tooltip [nzTooltipTitle]="'common.refresh' | i18n">
|
||||
<i nz-icon nzType="sync" nzTheme="outline"></i>
|
||||
</button>
|
||||
|
||||
<button style="margin-right: 25px; float: right" nz-button nzType="primary" (click)="onFilterSearchMonitors()"> 搜索 </button>
|
||||
<button style="margin-right: 25px; float: right" nz-button nzType="primary" (click)="onFilterSearchMonitors()">
|
||||
{{ 'common.search' | i18n }}
|
||||
</button>
|
||||
<input
|
||||
style="margin-right: 5px; float: right; width: 150px; border-radius: 9px; text-align: center"
|
||||
nz-input
|
||||
type="text"
|
||||
placeholder="搜索监控"
|
||||
[placeholder]="'monitors.search.placeholder' | i18n"
|
||||
nzSize="default"
|
||||
(keyup.enter)="onFilterSearchMonitors()"
|
||||
[(ngModel)]="filterContent"
|
||||
@@ -53,14 +55,14 @@
|
||||
<nz-select
|
||||
style="margin-right: 10px; float: right; width: 120px"
|
||||
nzAllowClear
|
||||
[nzPlaceHolder]="'监控状态过滤'"
|
||||
[nzPlaceHolder]="'monitors.search.filter' | i18n"
|
||||
[(ngModel)]="filterStatus"
|
||||
>
|
||||
<nz-option nzLabel="全部状态" nzValue="9"></nz-option>
|
||||
<nz-option nzLabel="监控正常" nzValue="1"></nz-option>
|
||||
<nz-option nzLabel="不可用" nzValue="2"></nz-option>
|
||||
<nz-option nzLabel="不可达" nzValue="3"></nz-option>
|
||||
<nz-option nzLabel="未监控" nzValue="0"></nz-option>
|
||||
<nz-option [nzLabel]="'monitor.status.all' | i18n" nzValue="9"></nz-option>
|
||||
<nz-option [nzLabel]="'monitor.status.available' | i18n" nzValue="1"></nz-option>
|
||||
<nz-option [nzLabel]="'monitor.status.unavailable' | i18n" nzValue="2"></nz-option>
|
||||
<nz-option [nzLabel]="'monitor.status.unreachable' | i18n" nzValue="3"></nz-option>
|
||||
<nz-option [nzLabel]="'monitor.status.un-manage' | i18n" nzValue="0"></nz-option>
|
||||
</nz-select>
|
||||
</div>
|
||||
|
||||
@@ -82,12 +84,12 @@
|
||||
<thead>
|
||||
<tr>
|
||||
<th nzAlign="center" nzLeft nzWidth="4%" [(nzChecked)]="checkedAll" (nzCheckedChange)="onAllChecked($event)"></th>
|
||||
<th nzAlign="center" nzLeft>监控名称</th>
|
||||
<th nzAlign="center">监控状态</th>
|
||||
<th nzAlign="center">监控Host</th>
|
||||
<th nzAlign="center">监控类型</th>
|
||||
<th nzAlign="center">最新修改时间</th>
|
||||
<th nzAlign="center">操作</th>
|
||||
<th nzAlign="center" nzLeft>{{ 'monitor.name' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'monitor.status' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'monitor.host' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'monitor.app' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'common.edit-time' | i18n }}</th>
|
||||
<th nzAlign="center">{{ 'common.edit' | i18n }}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
@@ -101,23 +103,19 @@
|
||||
<td nzAlign="center">
|
||||
<nz-tag *ngIf="data.status == 0" nzColor="default">
|
||||
<i nz-icon nzType="robot" nzTheme="outline"></i>
|
||||
<span>未监控</span>
|
||||
<span>{{ 'monitor.status.un-manage' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.status == 1" nzColor="success">
|
||||
<i nz-icon nzType="smile" nzTheme="outline"></i>
|
||||
<span>正常监控</span>
|
||||
<span>{{ 'monitor.status.available' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.status == 2" nzColor="warning">
|
||||
<i nz-icon nzType="meh" nzTheme="outline"></i>
|
||||
<span>监控不可用</span>
|
||||
<span>{{ 'monitor.status.unavailable' | i18n }}</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.status == 3" nzColor="error">
|
||||
<i nz-icon nzType="frown" nzTheme="outline"></i>
|
||||
<span>监控不可达</span>
|
||||
</nz-tag>
|
||||
<nz-tag *ngIf="data.status == 4" nzColor="default">
|
||||
<i nz-icon nzType="sync"></i>
|
||||
<span>监控已挂起</span>
|
||||
<span>{{ 'monitor.status.unreachable' | i18n }}</span>
|
||||
</nz-tag>
|
||||
</td>
|
||||
<td nzAlign="center">{{ data.host }}</td>
|
||||
@@ -129,16 +127,34 @@
|
||||
</td>
|
||||
<td nzAlign="center">{{ (data.gmtUpdate ? data.gmtUpdate : data.gmtCreate) | date: 'YYYY-MM-dd HH:mm:ss' }}</td>
|
||||
<td nzAlign="center">
|
||||
<button nz-button nzType="primary" (click)="onEditOneMonitor(data.id)" nz-tooltip nzTooltipTitle="修改监控">
|
||||
<button nz-button nzType="primary" (click)="onEditOneMonitor(data.id)" nz-tooltip [nzTooltipTitle]="'monitors.edit-monitor' | i18n">
|
||||
<i nz-icon nzType="edit" nzTheme="outline"></i>
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onDeleteOneMonitor(data.id)" nz-tooltip nzTooltipTitle="删除监控">
|
||||
<button
|
||||
nz-button
|
||||
nzType="primary"
|
||||
(click)="onDeleteOneMonitor(data.id)"
|
||||
nz-tooltip
|
||||
[nzTooltipTitle]="'monitors.delete-monitor' | i18n"
|
||||
>
|
||||
<i nz-icon nzType="delete" nzTheme="outline"></i>
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onEnableManageOneMonitor(data.id)" nz-tooltip nzTooltipTitle="启用监控">
|
||||
<button
|
||||
nz-button
|
||||
nzType="primary"
|
||||
(click)="onEnableManageOneMonitor(data.id)"
|
||||
nz-tooltip
|
||||
[nzTooltipTitle]="'monitors.enable' | i18n"
|
||||
>
|
||||
<i nz-icon nzType="up-circle" nzTheme="outline"></i>
|
||||
</button>
|
||||
<button nz-button nzType="primary" (click)="onCancelManageOneMonitor(data.id)" nz-tooltip nzTooltipTitle="取消监控">
|
||||
<button
|
||||
nz-button
|
||||
nzType="primary"
|
||||
(click)="onCancelManageOneMonitor(data.id)"
|
||||
nz-tooltip
|
||||
[nzTooltipTitle]="'monitors.cancel' | i18n"
|
||||
>
|
||||
<i nz-icon nzType="down-circle" nzTheme="outline"></i>
|
||||
</button>
|
||||
</td>
|
||||
@@ -146,4 +162,4 @@
|
||||
</tbody>
|
||||
</nz-table>
|
||||
|
||||
<ng-template #rangeTemplate> 总量 {{ total }} </ng-template>
|
||||
<ng-template #rangeTemplate> {{ 'common.total' | i18n }} {{ total }} </ng-template>
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
import { Component, OnInit } from '@angular/core';
|
||||
import { Component, Inject, OnInit } from '@angular/core';
|
||||
import { ActivatedRoute, Router } from '@angular/router';
|
||||
import { I18NService } from '@core';
|
||||
import { ALAIN_I18N_TOKEN } from '@delon/theme';
|
||||
import { NzMessageService } from 'ng-zorro-antd/message';
|
||||
import { NzModalService } from 'ng-zorro-antd/modal';
|
||||
import { NzNotificationService } from 'ng-zorro-antd/notification';
|
||||
@@ -20,7 +22,8 @@ export class MonitorListComponent implements OnInit {
|
||||
private modal: NzModalService,
|
||||
private notifySvc: NzNotificationService,
|
||||
private msg: NzMessageService,
|
||||
private monitorSvc: MonitorService
|
||||
private monitorSvc: MonitorService,
|
||||
@Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService
|
||||
) {}
|
||||
|
||||
app!: string;
|
||||
@@ -102,7 +105,7 @@ export class MonitorListComponent implements OnInit {
|
||||
|
||||
onEditOneMonitor(monitorId: number) {
|
||||
if (monitorId == null) {
|
||||
this.notifySvc.warning('未选中任何待编辑项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.no-select-edit'), '');
|
||||
return;
|
||||
}
|
||||
this.router.navigateByUrl(`/monitors/${monitorId}/edit`);
|
||||
@@ -113,11 +116,11 @@ export class MonitorListComponent implements OnInit {
|
||||
onEditMonitor() {
|
||||
// 编辑时只能选中一个监控
|
||||
if (this.checkedMonitorIds == null || this.checkedMonitorIds.size === 0) {
|
||||
this.notifySvc.warning('未选中任何待编辑项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.no-select-edit'), '');
|
||||
return;
|
||||
}
|
||||
if (this.checkedMonitorIds.size > 1) {
|
||||
this.notifySvc.warning('只能对一个选中项进行编辑!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.one-select-edit'), '');
|
||||
return;
|
||||
}
|
||||
let monitorId = 0;
|
||||
@@ -129,9 +132,9 @@ export class MonitorListComponent implements OnInit {
|
||||
let monitors = new Set<number>();
|
||||
monitors.add(monitorId);
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否删除!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.delete'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.deleteMonitors(monitors)
|
||||
@@ -140,13 +143,13 @@ export class MonitorListComponent implements OnInit {
|
||||
|
||||
onDeleteMonitors() {
|
||||
if (this.checkedMonitorIds == null || this.checkedMonitorIds.size === 0) {
|
||||
this.notifySvc.warning('未选中任何待删除项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.no-select-delete'), '');
|
||||
return;
|
||||
}
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否批量删除!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.delete-batch'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.deleteMonitors(this.checkedMonitorIds)
|
||||
@@ -155,7 +158,7 @@ export class MonitorListComponent implements OnInit {
|
||||
|
||||
deleteMonitors(monitors: Set<number>) {
|
||||
if (monitors == null || monitors.size == 0) {
|
||||
this.notifySvc.warning('未选中任何待删除项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.no-select-delete'), '');
|
||||
return;
|
||||
}
|
||||
this.tableLoading = true;
|
||||
@@ -163,30 +166,30 @@ export class MonitorListComponent implements OnInit {
|
||||
message => {
|
||||
deleteMonitors$.unsubscribe();
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('删除成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.delete-success'), '');
|
||||
this.loadMonitorTable();
|
||||
} else {
|
||||
this.tableLoading = false;
|
||||
this.notifySvc.error('删除失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.delete-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.tableLoading = false;
|
||||
deleteMonitors$.unsubscribe();
|
||||
this.notifySvc.error('删除失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.delete-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
onCancelManageMonitors() {
|
||||
if (this.checkedMonitorIds == null || this.checkedMonitorIds.size === 0) {
|
||||
this.notifySvc.warning('未选中任何待取消项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.no-select-cancel'), '');
|
||||
return;
|
||||
}
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否批量取消监控!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.cancel-batch'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.cancelManageMonitors(this.checkedMonitorIds)
|
||||
@@ -197,9 +200,9 @@ export class MonitorListComponent implements OnInit {
|
||||
let monitors = new Set<number>();
|
||||
monitors.add(monitorId);
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否取消监控!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.cancel'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.cancelManageMonitors(monitors)
|
||||
@@ -212,30 +215,30 @@ export class MonitorListComponent implements OnInit {
|
||||
message => {
|
||||
cancelManage$.unsubscribe();
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('取消监控成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.cancel-success'), '');
|
||||
this.loadMonitorTable();
|
||||
} else {
|
||||
this.tableLoading = false;
|
||||
this.notifySvc.error('取消监控失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.cancel-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.tableLoading = false;
|
||||
cancelManage$.unsubscribe();
|
||||
this.notifySvc.error('取消监控失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.cancel-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
onEnableManageMonitors() {
|
||||
if (this.checkedMonitorIds == null || this.checkedMonitorIds.size === 0) {
|
||||
this.notifySvc.warning('未选中任何待启用监控项!', '');
|
||||
this.notifySvc.warning(this.i18nSvc.fanyi('common.notify.no-select-enable'), '');
|
||||
return;
|
||||
}
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否批量启用监控!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.enable-batch'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.enableManageMonitors(this.checkedMonitorIds)
|
||||
@@ -246,9 +249,9 @@ export class MonitorListComponent implements OnInit {
|
||||
let monitors = new Set<number>();
|
||||
monitors.add(monitorId);
|
||||
this.modal.confirm({
|
||||
nzTitle: '请确认是否启用监控!',
|
||||
nzOkText: '确定',
|
||||
nzCancelText: '取消',
|
||||
nzTitle: this.i18nSvc.fanyi('common.confirm.enable'),
|
||||
nzOkText: this.i18nSvc.fanyi('common.button.ok'),
|
||||
nzCancelText: this.i18nSvc.fanyi('common.button.cancel'),
|
||||
nzOkDanger: true,
|
||||
nzOkType: 'primary',
|
||||
nzOnOk: () => this.enableManageMonitors(monitors)
|
||||
@@ -261,17 +264,17 @@ export class MonitorListComponent implements OnInit {
|
||||
message => {
|
||||
enableManage$.unsubscribe();
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('启用监控成功!', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('common.notify.enable-success'), '');
|
||||
this.loadMonitorTable();
|
||||
} else {
|
||||
this.tableLoading = false;
|
||||
this.notifySvc.error('启用监控失败!', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.enable-fail'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.tableLoading = false;
|
||||
enableManage$.unsubscribe();
|
||||
this.notifySvc.error('启用监控失败!', error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('common.notify.enable-fail'), error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -3,20 +3,20 @@
|
||||
<nz-breadcrumb-item>
|
||||
<a [routerLink]="['/']">
|
||||
<i nz-icon nzType="home"></i>
|
||||
<span>仪表盘</span>
|
||||
<span>{{ 'menu.dashboard' | i18n }}</span>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
<nz-breadcrumb-item>
|
||||
<a [routerLink]="['/monitors']" [queryParams]="{ app: monitor.app ? monitor.app : '' }">
|
||||
<i nz-icon nzType="monitor"></i>
|
||||
<span>监控列表</span>
|
||||
<span>{{ 'monitors.list' | i18n }}</span>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
<nz-breadcrumb-item>
|
||||
<i nz-icon nzType="plus-circle"></i>
|
||||
<span>新增 {{ 'monitor.app.' + monitor.app | i18n }} 监控</span>
|
||||
<span>{{ 'monitors.new' | i18n }} {{ 'monitor.app.' + monitor.app | i18n }} {{ 'monitor' | i18n }}</span>
|
||||
<a [href]="'https://tancloud.cn/docs/help/' + monitor.app" target="_blank" style="float: right; margin-right: 5%">
|
||||
<span>帮助 </span>
|
||||
<span>{{ 'common.button.help' | i18n }} </span>
|
||||
<i nz-icon nzType="question-circle" nzTheme="outline"></i>
|
||||
</a>
|
||||
</nz-breadcrumb-item>
|
||||
@@ -27,7 +27,9 @@
|
||||
<div class="-inner-content">
|
||||
<form nz-form #newForm="ngForm">
|
||||
<nz-form-item>
|
||||
<nz-form-label [nzSpan]="7" nzFor="host" nzRequired="true" nzTooltipTitle="被监控的对端IP或域名"> 监控Host </nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="host" nzRequired="true" [nzTooltipTitle]="'monitor.host.tip' | i18n">
|
||||
{{ 'monitor.host' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control [nzSpan]="8" [nzErrorTip]="'validation.required' | i18n">
|
||||
<input
|
||||
[(ngModel)]="monitor.host"
|
||||
@@ -36,17 +38,17 @@
|
||||
type="text"
|
||||
id="host"
|
||||
required
|
||||
placeholder="请输入域名或IP"
|
||||
[placeholder]="'monitor.host.tip' | i18n"
|
||||
(ngModelChange)="onHostChange($event)"
|
||||
/>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-label [nzSpan]="7" nzFor="name" nzRequired="true" nzTooltipTitle="标识此监控的名称,名称需要保证唯一性">
|
||||
监控名称
|
||||
<nz-form-label [nzSpan]="7" nzFor="name" nzRequired="true" [nzTooltipTitle]="'monitor.name.tip' | i18n">
|
||||
{{ 'monitor.name' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control [nzSpan]="8" [nzErrorTip]="'validation.required' | i18n">
|
||||
<input [(ngModel)]="monitor.name" nz-input required name="name" type="text" id="name" placeholder="监控名称需要保证唯一性" />
|
||||
<input [(ngModel)]="monitor.name" nz-input required name="name" type="text" id="name" [placeholder]="'monitor.name.tip' | i18n" />
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
|
||||
@@ -172,7 +174,7 @@
|
||||
</nz-form-item>
|
||||
|
||||
<nz-collapse [nzGhost]="true">
|
||||
<nz-collapse-panel nzHeader="高级" [nzHeader]="extraColHeader" [nzShowArrow]="false">
|
||||
<nz-collapse-panel [nzHeader]="extraColHeader" [nzShowArrow]="false">
|
||||
<nz-form-item *ngFor="let paramDefine of advancedParamDefines; let i = index">
|
||||
<nz-form-label
|
||||
*ngIf="paramDefine.field !== 'host' && paramDefine.type === 'text'"
|
||||
@@ -305,8 +307,8 @@
|
||||
</nz-collapse-panel>
|
||||
</nz-collapse>
|
||||
<ng-template #extraColHeader>
|
||||
<button style="top: -10px; margin-left: 40%" nz-button nzType="dashed" nz-tooltip nzTooltipTitle="设置高级可选参数">
|
||||
<span>高级设置</span>
|
||||
<button style="top: -10px; margin-left: 40%" nz-button nzType="dashed" nz-tooltip [nzTooltipTitle]="'monitors.advanced.tip' | i18n">
|
||||
<span>{{ 'monitors.advanced' | i18n }}</span>
|
||||
<i nz-icon nzType="down-circle" nzTheme="outline"></i>
|
||||
</button>
|
||||
</ng-template>
|
||||
@@ -314,7 +316,9 @@
|
||||
<nz-divider></nz-divider>
|
||||
|
||||
<nz-form-item>
|
||||
<nz-form-label nzSpan="7" nzFor="intervals" nzTooltipTitle="监控周期性采集数据间隔时间,单位秒"> 采集间隔 </nz-form-label>
|
||||
<nz-form-label nzSpan="7" nzFor="intervals" [nzTooltipTitle]="'monitor.intervals.tip' | i18n">
|
||||
{{ 'monitor.intervals' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control nzSpan="8">
|
||||
<nz-input-number [(ngModel)]="monitor.intervals" [nzMin]="10" [nzMax]="604800" [nzStep]="60" name="intervals" id="intervals">
|
||||
</nz-input-number>
|
||||
@@ -322,14 +326,18 @@
|
||||
</nz-form-item>
|
||||
|
||||
<nz-form-item>
|
||||
<nz-form-label nzSpan="7" nzFor="detect" nzTooltipTitle="新增监控前是否先探测检查监控可用性"> 测试连接 </nz-form-label>
|
||||
<nz-form-label nzSpan="7" nzFor="detect" [nzTooltipTitle]="'monitors.detect.tip' | i18n">
|
||||
{{ 'monitors.detect' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control nzSpan="8">
|
||||
<nz-switch [(ngModel)]="detected" name="detect" id="detect"></nz-switch>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
|
||||
<nz-form-item>
|
||||
<nz-form-label [nzSpan]="7" nzFor="description" nzTooltipTitle="更多标识和描述此监控的备注信息"> 描述备注 </nz-form-label>
|
||||
<nz-form-label [nzSpan]="7" nzFor="description" [nzTooltipTitle]="'monitor.description.tip' | i18n">
|
||||
{{ 'monitor.description' | i18n }}
|
||||
</nz-form-label>
|
||||
<nz-form-control [nzSpan]="8">
|
||||
<nz-textarea-count [nzMaxCharacterCount]="100">
|
||||
<textarea [(ngModel)]="monitor.description" rows="3" nz-input name="description" id="description"></textarea>
|
||||
@@ -339,9 +347,9 @@
|
||||
|
||||
<div nz-row>
|
||||
<div nz-col nzSpan="8" nzOffset="9">
|
||||
<button nz-button nzType="primary" type="submit" (click)="onDetect(newForm.form)"> 测试 </button>
|
||||
<button nz-button nzType="primary" type="submit" (click)="onSubmit(newForm.form)"> 确定 </button>
|
||||
<button nz-button nzType="primary" type="reset" (click)="onCancel()"> 取消 </button>
|
||||
<button nz-button nzType="primary" type="submit" (click)="onDetect(newForm.form)"> {{ 'common.button.detect' | i18n }} </button>
|
||||
<button nz-button nzType="primary" type="submit" (click)="onSubmit(newForm.form)"> {{ 'common.button.ok' | i18n }} </button>
|
||||
<button nz-button nzType="primary" type="reset" (click)="onCancel()"> {{ 'common.button.cancel' | i18n }} </button>
|
||||
</div>
|
||||
</div>
|
||||
</form>
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
import { ChangeDetectorRef, Component, OnInit } from '@angular/core';
|
||||
import { ChangeDetectorRef, Component, Inject, OnInit } from '@angular/core';
|
||||
import { FormBuilder, FormGroup } from '@angular/forms';
|
||||
import { ActivatedRoute, ParamMap, Router } from '@angular/router';
|
||||
import { I18NService } from '@core';
|
||||
import { TitleService } from '@delon/theme';
|
||||
import { ALAIN_I18N_TOKEN, TitleService } from '@delon/theme';
|
||||
import { NzNotificationService } from 'ng-zorro-antd/notification';
|
||||
import { switchMap } from 'rxjs/operators';
|
||||
|
||||
@@ -34,7 +34,7 @@ export class MonitorNewComponent implements OnInit {
|
||||
private router: Router,
|
||||
private notifySvc: NzNotificationService,
|
||||
private cdr: ChangeDetectorRef,
|
||||
private i18n: I18NService,
|
||||
@Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService,
|
||||
private titleSvc: TitleService,
|
||||
private formBuilder: FormBuilder
|
||||
) {
|
||||
@@ -150,15 +150,15 @@ export class MonitorNewComponent implements OnInit {
|
||||
message => {
|
||||
this.isSpinning = false;
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('新增监控成功', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('monitors.new.success'), '');
|
||||
this.router.navigateByUrl(`/monitors?app=${this.monitor.app}`);
|
||||
} else {
|
||||
this.notifySvc.error('新增监控失败', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('monitors.new.failed'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.isSpinning = false;
|
||||
this.notifySvc.error('新增监控失败', error.error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('monitors.new.failed'), error.error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
@@ -199,14 +199,14 @@ export class MonitorNewComponent implements OnInit {
|
||||
message => {
|
||||
this.isSpinning = false;
|
||||
if (message.code === 0) {
|
||||
this.notifySvc.success('探测成功', '');
|
||||
this.notifySvc.success(this.i18nSvc.fanyi('monitors.detect.success'), '');
|
||||
} else {
|
||||
this.notifySvc.error('探测失败', message.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('monitors.detect.failed'), message.msg);
|
||||
}
|
||||
},
|
||||
error => {
|
||||
this.isSpinning = false;
|
||||
this.notifySvc.error('探测异常', error.error.msg);
|
||||
this.notifySvc.error(this.i18nSvc.fanyi('monitors.detect.failed'), error.error.msg);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
import { NgModule, Type } from '@angular/core';
|
||||
import { SharedModule } from '@shared';
|
||||
import { NzBreadCrumbModule } from 'ng-zorro-antd/breadcrumb';
|
||||
import { NzCollapseModule } from 'ng-zorro-antd/collapse';
|
||||
import { NzDividerModule } from 'ng-zorro-antd/divider';
|
||||
import { NzLayoutModule } from 'ng-zorro-antd/layout';
|
||||
import { NzRadioModule } from 'ng-zorro-antd/radio';
|
||||
@@ -16,7 +17,6 @@ import { MonitorEditComponent } from './monitor-edit/monitor-edit.component';
|
||||
import { MonitorListComponent } from './monitor-list/monitor-list.component';
|
||||
import { MonitorNewComponent } from './monitor-new/monitor-new.component';
|
||||
import { MonitorRoutingModule } from './monitor-routing.module';
|
||||
import { NzCollapseModule } from 'ng-zorro-antd/collapse';
|
||||
|
||||
const COMPONENTS: Array<Type<void>> = [
|
||||
MonitorNewComponent,
|
||||
|
||||
@@ -7,11 +7,11 @@
|
||||
<nz-form-item>
|
||||
<nz-form-control [nzErrorTip]="'validation.password.required' | i18n">
|
||||
<nz-input-group nzSuffixIcon="lock">
|
||||
<input type="text" nz-input formControlName="password" placeholder="输入任意解锁" />
|
||||
<input type="text" nz-input formControlName="password" [placeholder]="'app.lock.placeholder' | i18n" />
|
||||
</nz-input-group>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-row nzType="flex" nzAlign="middle">
|
||||
<nz-row nzAlign="middle">
|
||||
<nz-col [nzOffset]="12" [nzSpan]="12" style="text-align: right">
|
||||
<button nz-button [disabled]="!f.valid" nzType="primary">{{ 'app.lock' | i18n }}</button>
|
||||
</nz-col>
|
||||
|
||||
@@ -3,16 +3,16 @@
|
||||
<nz-tab [nzTitle]="'app.login.tab-login-credentials' | i18n">
|
||||
<nz-alert *ngIf="error" [nzType]="'error'" [nzMessage]="error" [nzShowIcon]="true" class="mb-lg"></nz-alert>
|
||||
<nz-form-item>
|
||||
<nz-form-control nzErrorTip="请输入用户名">
|
||||
<nz-form-control [nzErrorTip]="'app.login.message-need-identifier' | i18n">
|
||||
<nz-input-group nzSize="large" nzPrefixIcon="user">
|
||||
<input nz-input formControlName="userName" placeholder="请输入用户名" />
|
||||
<input nz-input formControlName="userName" [placeholder]="'app.login.message-need-identifier' | i18n" />
|
||||
</nz-input-group>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
<nz-form-item>
|
||||
<nz-form-control nzErrorTip="请输入密码">
|
||||
<nz-form-control [nzErrorTip]="'app.login.message-need-credential' | i18n">
|
||||
<nz-input-group nzSize="large" nzPrefixIcon="lock">
|
||||
<input nz-input type="password" formControlName="password" placeholder="请输入密码" />
|
||||
<input nz-input type="password" formControlName="password" [placeholder]="'app.login.message-need-credential' | i18n" />
|
||||
</nz-input-group>
|
||||
</nz-form-control>
|
||||
</nz-form-item>
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import { ChangeDetectionStrategy, ChangeDetectorRef, Component, Inject, OnDestroy, Optional } from '@angular/core';
|
||||
import { AbstractControl, FormBuilder, FormGroup, Validators } from '@angular/forms';
|
||||
import { Router } from '@angular/router';
|
||||
import { StartupService } from '@core';
|
||||
import { I18NService, StartupService } from '@core';
|
||||
import { ReuseTabService } from '@delon/abc/reuse-tab';
|
||||
import { DA_SERVICE_TOKEN, ITokenService, SocialOpenType, SocialService } from '@delon/auth';
|
||||
import { SettingsService, _HttpClient } from '@delon/theme';
|
||||
import { DA_SERVICE_TOKEN, ITokenService, SocialService } from '@delon/auth';
|
||||
import { SettingsService, _HttpClient, ALAIN_I18N_TOKEN } from '@delon/theme';
|
||||
import { User } from '@delon/theme/src/services/settings/types';
|
||||
import { NzTabChangeEvent } from 'ng-zorro-antd/tabs';
|
||||
import { finalize } from 'rxjs/operators';
|
||||
@@ -29,6 +29,7 @@ export class UserLoginComponent implements OnDestroy {
|
||||
@Inject(ReuseTabService)
|
||||
private reuseTabService: ReuseTabService,
|
||||
@Inject(DA_SERVICE_TOKEN) private tokenService: ITokenService,
|
||||
@Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService,
|
||||
private startupSrv: StartupService,
|
||||
private http: _HttpClient,
|
||||
private cdr: ChangeDetectorRef,
|
||||
@@ -125,7 +126,7 @@ export class UserLoginComponent implements OnDestroy {
|
||||
let user: User = {
|
||||
name: this.userName.value,
|
||||
avatar: './assets/img/avatar.svg',
|
||||
email: '管理员'
|
||||
email: this.i18nSvc.fanyi('app.role.admin')
|
||||
};
|
||||
this.settingsService.setUser(user);
|
||||
// 重新获取 StartupService 内容,我们始终认为应用信息一般都会受当前用户授权范围而影响
|
||||
|
||||
@@ -16,22 +16,7 @@ const alerts_status_uri = '/alerts/status';
|
||||
export class AlertService {
|
||||
constructor(private http: HttpClient) {}
|
||||
|
||||
public getAlerts(pageIndex: number, pageSize: number): Observable<Message<Page<Alert>>> {
|
||||
pageIndex = pageIndex ? pageIndex : 0;
|
||||
pageSize = pageSize ? pageSize : 8;
|
||||
// 注意HttpParams是不可变对象 需要保存set后返回的对象为最新对象
|
||||
let httpParams = new HttpParams();
|
||||
httpParams = httpParams.appendAll({
|
||||
sort: 'id',
|
||||
order: 'desc',
|
||||
pageIndex: pageIndex,
|
||||
pageSize: pageSize
|
||||
});
|
||||
const options = { params: httpParams };
|
||||
return this.http.get<Message<Page<Alert>>>(alerts_uri, options);
|
||||
}
|
||||
|
||||
public searchAlerts(
|
||||
public loadAlerts(
|
||||
status: number | undefined,
|
||||
priority: number | undefined,
|
||||
content: string | undefined,
|
||||
|
||||
@@ -1,138 +1,296 @@
|
||||
{
|
||||
"menu.search.placeholder": "Search for people, file, photos...",
|
||||
"menu.fullscreen": "Fullscreen",
|
||||
"menu.fullscreen.exit": "Exit Fullscreen",
|
||||
"menu.clear.local.storage": "Clear Local Storage",
|
||||
"menu.lang": "Language",
|
||||
"menu.main": "Main Navigation",
|
||||
"menu.dashboard": "Dashboard",
|
||||
"menu.dashboard.v1": "Default",
|
||||
"menu.dashboard.analysis": "Analysis",
|
||||
"menu.dashboard.monitor": "Monitor",
|
||||
"menu.dashboard.workplace": "Workplace",
|
||||
"menu.shortcut": "Shortcut",
|
||||
"menu.widgets": "Widgets",
|
||||
"menu.alain": "Alain",
|
||||
"menu.style": "Style",
|
||||
"menu.style.typography": "Typography",
|
||||
"menu.style.gridmasonry": "Grid Masonry",
|
||||
"menu.style.colors": "Colors",
|
||||
"menu.delon": "Delon Lib",
|
||||
"menu.delon.form": "Dynamic Form",
|
||||
"menu.delon.table": "Simple table",
|
||||
"menu.delon.util": "Util",
|
||||
"menu.delon.print": "Print",
|
||||
"menu.delon.guard": "Route Guard",
|
||||
"menu.delon.cache": "Cache",
|
||||
"menu.delon.qr": "QR",
|
||||
"menu.delon.acl": "ACL",
|
||||
"menu.delon.downfile": "Download File",
|
||||
"menu.delon.xlsx": "Excel",
|
||||
"menu.delon.zip": "Zip",
|
||||
"menu.pro": "Antd Pro",
|
||||
"menu.form": "Form",
|
||||
"menu.form.basicform": "Basic Form",
|
||||
"menu.form.stepform": "Step Form",
|
||||
"menu.form.stepform.info": "Step Form(write transfer information)",
|
||||
"menu.form.stepform.confirm": "Step Form(confirm transfer information)",
|
||||
"menu.form.stepform.result": "Step Form(finished)",
|
||||
"menu.form.advancedform": "Advanced Form",
|
||||
"menu.list": "List",
|
||||
"menu.list.searchtable": "Search Table",
|
||||
"menu.list.basiclist": "Basic List",
|
||||
"menu.list.cardlist": "Card List",
|
||||
"menu.list.searchlist": "Search List",
|
||||
"menu.list.searchlist.articles": "Search List(articles)",
|
||||
"menu.list.searchlist.projects": "Search List(projects)",
|
||||
"menu.list.searchlist.applications": "Search List(applications)",
|
||||
"menu.profile": "Profile",
|
||||
"menu.profile.basic": "Basic Profile",
|
||||
"menu.profile.advanced": "Advanced Profile",
|
||||
"menu.result": "Result",
|
||||
"menu.result.success": "Success",
|
||||
"menu.result.fail": "Fail",
|
||||
"menu.exception": "Exception",
|
||||
"menu.exception.not-permission": "403",
|
||||
"menu.exception.not-find": "404",
|
||||
"menu.exception.server-error": "500",
|
||||
"menu.account": "Account",
|
||||
"menu.account.center": "Account Center",
|
||||
"menu.account.settings": "Account Settings",
|
||||
"menu.account.trigger": "Trigger Error",
|
||||
"menu.account.logout": "Logout",
|
||||
"menu.more": "More",
|
||||
"menu.report": "Report",
|
||||
"menu.report.relation": "Relation Map",
|
||||
"menu.extras": "Extra",
|
||||
"menu.extras.helpcenter": "Help Center",
|
||||
"menu.extras.settings": "Settings",
|
||||
"menu.extras.poi": "Poi",
|
||||
"app.analysis.test": "Gongzhuan No.{{no}} shop",
|
||||
"app.analysis.introduce": "Introduce",
|
||||
"app.analysis.total-sales": "Total Sales",
|
||||
"app.analysis.day-sales": "Day Sales",
|
||||
"app.analysis.visits": "Visits",
|
||||
"app.analysis.visits-trend": "Visits Trend",
|
||||
"app.analysis.visits-ranking": "Visits Ranking",
|
||||
"app.analysis.day-visits": "Day Visits",
|
||||
"app.analysis.week": "Week Ratio",
|
||||
"app.analysis.day": "Day Ratio",
|
||||
"app.analysis.payments": "Payments",
|
||||
"app.analysis.conversion-rate": "Conversion Rate",
|
||||
"app.analysis.operational-effect": "Operational Effect",
|
||||
"app.analysis.sales-trend": "Stores Sales Trend",
|
||||
"app.analysis.sales-ranking": "Sales Ranking",
|
||||
"app.analysis.all-year": "All Year",
|
||||
"app.analysis.all-month": "All Month",
|
||||
"app.analysis.all-week": "All Week",
|
||||
"app.analysis.all-today": "All day",
|
||||
"app.analysis.search-users": "Search Users",
|
||||
"app.analysis.per-capita-search": "Per Capita Search",
|
||||
"app.analysis.online-top-search": "Online Top Search",
|
||||
"app.analysis.the-proportion-of-sales": "The Proportion Of Sales",
|
||||
"app.analysis.channel.all": "ALL",
|
||||
"app.analysis.channel.online": "Online",
|
||||
"app.analysis.channel.stores": "Stores",
|
||||
"app.analysis.sales": "Sales",
|
||||
"app.analysis.traffic": "Traffic",
|
||||
"app.analysis.table.rank": "Rank",
|
||||
"app.analysis.table.search-keyword": "Keyword",
|
||||
"app.analysis.table.users": "Users",
|
||||
"app.analysis.table.weekly-range": "Weekly Range",
|
||||
"app.monitor.trading-activity": "Real-Time Trading Activity",
|
||||
"app.monitor.total-transactions": "Total transactions today",
|
||||
"app.monitor.sales-target": "Sales target completion rate",
|
||||
"app.monitor.remaining-time": "Remaining time of activity",
|
||||
"app.monitor.total-transactions-per-second": "Total transactions per second",
|
||||
"app.monitor.activity-forecast": "Activity forecast",
|
||||
"app.monitor.efficiency": "Efficiency",
|
||||
"app.monitor.ratio": "Ratio",
|
||||
"app.monitor.proportion-per-category": "Proportion Per Category",
|
||||
"app.monitor.fast-food": "Fast food",
|
||||
"app.monitor.western-food": "Western food",
|
||||
"app.monitor.hot-pot": "Hot pot",
|
||||
"app.monitor.waiting-for-implementation": "Waiting for implementation",
|
||||
"app.monitor.popular-searches": "Popular Searches",
|
||||
"app.monitor.resource-surplus": "Resource Surplus",
|
||||
"app.monitor.fund-surplus": "Fund Surplus",
|
||||
"menu": {
|
||||
"main": "Main",
|
||||
"lang": "Language",
|
||||
"dashboard": "DashBoard",
|
||||
"search.placeholder": "Search:Monitor Name、IP",
|
||||
"fullscreen": "Full Screen",
|
||||
"fullscreen.exit": "Exit",
|
||||
"clear.local.storage": "Clear Local Storage",
|
||||
"monitor": {
|
||||
"": "Monitor",
|
||||
"service": "Service Monitor",
|
||||
"db": "DB Monitor",
|
||||
"os": "OS Monitor",
|
||||
"mid": "Mid Monitor",
|
||||
"custom": "Custom Monitor"
|
||||
},
|
||||
"account": {
|
||||
"": "Personal",
|
||||
"center": "Personal Center",
|
||||
"settings": "Account Setting",
|
||||
"security": "Security Setting",
|
||||
"binding": "Account Binding",
|
||||
"trigger": "Trigger Error",
|
||||
"logout": "Logout"
|
||||
},
|
||||
"alert": {
|
||||
"": "Alert",
|
||||
"center": "Alert Center",
|
||||
"setting": "Alert Setting",
|
||||
"dispatch": "Alert Notify"
|
||||
},
|
||||
"extras": {
|
||||
"": "More",
|
||||
"help": "Help Center",
|
||||
"setting": "Setting"
|
||||
},
|
||||
"more": "More"
|
||||
},
|
||||
"monitor": {
|
||||
"": "Monitor",
|
||||
"name": "Monitor Name",
|
||||
"name.tip": "Monitor name, the name needs to be unique",
|
||||
"host": "Monitor Host",
|
||||
"host.tip": "The monitored peer IP or domain name",
|
||||
"description": "Description",
|
||||
"description.tip": "Description and remarks",
|
||||
"intervals": "Intervals",
|
||||
"intervals.tip": "Monitor the interval time of periodic collection of data, second",
|
||||
"category": {
|
||||
"": "Category",
|
||||
"service": "Service",
|
||||
"db": "Database",
|
||||
"os": "OS",
|
||||
"mid": "Middleware",
|
||||
"custom": "Custom"
|
||||
},
|
||||
"app": {
|
||||
"": "Monitor Type",
|
||||
"website": "Website Monitor",
|
||||
"api": "HTTP API",
|
||||
"http": "HTTP API",
|
||||
"ping": "PING Connect",
|
||||
"port": "Port Available",
|
||||
"mysql": "Mysql",
|
||||
"oracle": "Oracle",
|
||||
"redis": "Redis",
|
||||
"fullsite": "SiteMap Monitor"
|
||||
},
|
||||
"status": {
|
||||
"": "Monitor Status",
|
||||
"all": "All Status",
|
||||
"available": "Available",
|
||||
"unavailable": "UnAvailable",
|
||||
"unreachable": "UnReachable",
|
||||
"un-manage": "UnManaged"
|
||||
}
|
||||
},
|
||||
"alert": {
|
||||
"": "Alert",
|
||||
"status": {
|
||||
"": "Alert Status",
|
||||
"all": "All Status",
|
||||
"0": "Pending",
|
||||
"2": "Restored",
|
||||
"3": "Processed"
|
||||
},
|
||||
"priority": {
|
||||
"": "Alarm Priority",
|
||||
"all": "All Priority",
|
||||
"0": "Emergency",
|
||||
"1": "Critical",
|
||||
"2": "Warning"
|
||||
}
|
||||
},
|
||||
"alert.setting.new": "New Threshold",
|
||||
"alert.setting.edit": "Edit Threshold",
|
||||
"alert.setting.delete": "Delete Threshold",
|
||||
"alert.setting.target": "Metric Target",
|
||||
"alert.setting.expr": "Threshold Trigger Expr",
|
||||
"alert.setting.times": "Trigger Times",
|
||||
"alert.setting.times.tip": "Set how many times the threshold is triggered before sending an alert",
|
||||
"alert.setting.template": "Notice Template",
|
||||
"alert.setting.template.tip": "Supported notification template environment variables",
|
||||
"alert.setting.template.label": "The notification information template sent after the alarm is triggered, see the template environment variable above",
|
||||
"alert.setting.template.example": "Please input notice template.Eg: ${app}.${metrics}.${metric}'s value is too high",
|
||||
"alert.setting.template.monitor-type": "Monitor Type Name",
|
||||
"alert.setting.template.metrics-name": "Metrics Name",
|
||||
"alert.setting.template.metric-name": "Metric Name",
|
||||
"alert.setting.template.metric-value": "Metric Target Value",
|
||||
"alert.setting.template.other-value": "Other Metric Value",
|
||||
"alert.setting.template.instance-value": "Instance Value",
|
||||
"alert.setting.default": "Global Default",
|
||||
"alert.setting.default.tip": "Whether this alarm threshold configuration applies to all this type of monitoring globally",
|
||||
"alert.setting.enable": "Enable Alert",
|
||||
"alert.setting.enable.tip": "This alarm threshold configuration is enabled or disabled",
|
||||
"alert.setting.connect": "Alert Associate Monitors",
|
||||
"alert.setting.connect.left": "No Associate",
|
||||
"alert.setting.connect.right": "Associated",
|
||||
"alert.setting.expr.tip": "Supported Threshold Trigger Expression Environment Variables and Operators",
|
||||
"alert.setting.expr.label": "Calculate and judge whether the threshold is triggered according to this expression. The expression environment variables and operators are shown above.",
|
||||
"alert.setting.expr.example": "Calculate whether to trigger the threshold according to this expression.Eg",
|
||||
"alert.setting.priority.tip": "The alarm level that triggers the threshold, from low to high:Warning,Critical,Emergency",
|
||||
"alert.setting.target.tip": "The selected metric object",
|
||||
"alert.setting.target.other": "Other metric objects of the row",
|
||||
"alert.setting.target.instance": "Instance of the row",
|
||||
"alert.setting.operator": "Supported operator functions",
|
||||
"alert.center.delete": "Delete Alerts",
|
||||
"alert.center.deal": "Mark Processed",
|
||||
"alert.center.no-deal": "Mark Pending",
|
||||
"alert.center.search": "Search Alert Content",
|
||||
"alert.center.filter-status": "Filter Alert Status",
|
||||
"alert.center.filter-priority": "Filter Alert Priority",
|
||||
"alert.center.target": "Metric Target",
|
||||
"alert.center.monitor": "Belong Monitor",
|
||||
"alert.center.priority": "Priority",
|
||||
"alert.center.content": "Alert Content",
|
||||
"alert.center.status": "Status",
|
||||
"alert.center.time": "Alert Time",
|
||||
"alert.center.notify.no-delete": "No items selected for deletion!",
|
||||
"alert.center.confirm.delete": "Please confirm whether to delete!",
|
||||
"alert.center.confirm.delete-batch": "Please confirm whether to delete in batch!",
|
||||
"alert.center.notify.no-mark": "No items selected for mark!",
|
||||
"alert.center.confirm.mark-done-batch": "Please confirm whether to mark processed in batch!",
|
||||
"alert.center.confirm.mark-done": "Please confirm whether to mark processed!",
|
||||
"alert.center.confirm.mark-no-batch": "Please confirm whether to mark Pending in batch!",
|
||||
"alert.center.confirm.mark-no": "Please confirm whether to mark Pending!",
|
||||
"alert.notice.receiver": "Alert Receiver",
|
||||
"alert.notice.receiver.new": "New Receiver",
|
||||
"alert.notice.receiver.edit": "Edit Receiver",
|
||||
"alert.notice.receiver.delete": "Delete Receiver",
|
||||
"alert.notice.receiver.people": "Receiver",
|
||||
"alert.notice.receiver.people.name": "Receiver Name",
|
||||
"alert.notice.receiver.type": "Notice Type",
|
||||
"alert.notice.receiver.setting": "Setting",
|
||||
"alert.notice.type.sms": "SMS",
|
||||
"alert.notice.type.phone": "Phone",
|
||||
"alert.notice.type.email": "Email",
|
||||
"alert.notice.type.url": "URL",
|
||||
"alert.notice.type.wechat": "Open WeChat",
|
||||
"alert.notice.type.wechat-id": "WeChat OPENID",
|
||||
"alert.notice.type.wework": "WeWork Robot",
|
||||
"alert.notice.type.wework-key": "WeWork Robot KEY",
|
||||
"alert.notice.type.access-token": "Robot ACCESS_TOKEN",
|
||||
"alert.notice.type.ding": "DingDing Robot",
|
||||
"alert.notice.type.fei-shu": "FeiShu Robot",
|
||||
"alert.notice.type.fei-shu-key": "FeiShu Robot KEY",
|
||||
"alert.notice.rule": "Alert Notice Rule",
|
||||
"alert.notice.rule.new": "New Notice Rule",
|
||||
"alert.notice.rule.edit": "Edit Notice Rule",
|
||||
"alert.notice.rule.delete": "Delete Notice Rule",
|
||||
"alert.notice.rule.name": "Rule Name",
|
||||
"alert.notice.rule.all": "Dispatch ALl",
|
||||
"alert.notice.rule.enable": "Enable",
|
||||
"dashboard.alerts.title": "Recently Alerts List",
|
||||
"dashboard.alerts.title-no": "Recently Pending Alerts",
|
||||
"dashboard.alerts.no": "No Pending Alerts",
|
||||
"dashboard.alerts.enter": "Go Alert Center",
|
||||
"dashboard.alerts.distribute": "The Distribution Of Alerts",
|
||||
"dashboard.alerts.num": "Alerts Num",
|
||||
"dashboard.alerts.deal": "Alerts Dealing",
|
||||
"dashboard.alerts.deal-percent": "Dealing Rate",
|
||||
"dashboard.monitors.total": "Monitor Total",
|
||||
"dashboard.monitors.title": "Monitoring Overview",
|
||||
"dashboard.monitors.sub-title": "The Distribution Of Monitors",
|
||||
"dashboard.monitors.formatter": " Monitors ",
|
||||
"dashboard.monitors.distribute": "Monitor Distribution",
|
||||
"monitors.list": "Monitor List",
|
||||
"monitors.new": "New",
|
||||
"monitors.new.success": "New Monitor Success",
|
||||
"monitors.new.failed": "New Monitor Failed",
|
||||
"monitors.edit": "Edit",
|
||||
"monitors.edit.success": "Update Monitor Success",
|
||||
"monitors.edit.failed": "Update Monitor Failed",
|
||||
"monitors.not-found": "This Monitor Not Found",
|
||||
"monitors.delete": "Delete",
|
||||
"monitors.edit-monitor": "Edit Monitor",
|
||||
"monitors.delete-monitor": "Delete Monitor",
|
||||
"monitors.enable": "Enable Monitor",
|
||||
"monitors.cancel": "Cancel Monitor",
|
||||
"monitors.search.placeholder": "Search Monitor",
|
||||
"monitors.search.filter": "Filter Monitor Status",
|
||||
"monitors.total": "Total",
|
||||
"monitors.advanced": "Advanced",
|
||||
"monitors.advanced.tip": "Setting Advanced Param",
|
||||
"monitors.detect": "Detect",
|
||||
"monitors.detect.success": "Detect Success",
|
||||
"monitors.detect.failed": "Detect Failed",
|
||||
"monitors.detect.tip": "Detect monitor available before apply",
|
||||
"monitors.detail": "Monitor Detail",
|
||||
"monitors.detail.name": "Name",
|
||||
"monitors.detail.port": "Port",
|
||||
"monitors.detail.description": "Desc",
|
||||
"monitors.detail.status": "Status",
|
||||
"monitors.detail.basic": "Monitor Basic",
|
||||
"monitors.detail.realtime": "Monitor Real-Time Detail",
|
||||
"monitors.detail.history": "Monitor Historical Chart Detail",
|
||||
"monitors.collect.time": "Collect Time",
|
||||
"monitors.collect.time.tip": "Last collect time",
|
||||
"monitors.detail.chart.zoom": "Zoom In",
|
||||
"monitors.detail.chart.back": "Zoom restore",
|
||||
"monitors.detail.chart.save": "Save as Image",
|
||||
"monitors.detail.chart.query-1h": "Query 1 Hour",
|
||||
"monitors.detail.chart.query-6h": "Query 6 Hours",
|
||||
"monitors.detail.chart.query-1d": "Query 1 Day",
|
||||
"monitors.detail.chart.query-1w": "Query 1 Week",
|
||||
"monitors.detail.chart.query-1m": "Query 1 Month",
|
||||
"monitors.detail.chart.no-data": "No Metrics Data",
|
||||
"monitors.detail.chart.unit": "Unit",
|
||||
"common.name": "Name",
|
||||
"common.value": "Value",
|
||||
"common.search": "Search",
|
||||
"common.refresh": "Refresh",
|
||||
"common.edit-time": "Last Update Time",
|
||||
"common.new-time": "Create Time",
|
||||
"common.edit": "Operate",
|
||||
"common.total": "Total",
|
||||
"common.yes": "Yes",
|
||||
"common.no": "No",
|
||||
"common.enable": "Enable",
|
||||
"common.disable": "Disable",
|
||||
"common.notify.no-select-edit": "No items selected for editing!",
|
||||
"common.notify.one-select-edit": "Only one selection can be edited!",
|
||||
"common.confirm.delete": "Please confirm whether to delete!",
|
||||
"common.notify.no-select-delete": "No items selected for deletion!",
|
||||
"common.confirm.delete-batch": "Please confirm whether to delete in batches!",
|
||||
"common.notify.delete-success": "Delete Success!",
|
||||
"common.notify.delete-fail": "Delete Failed!",
|
||||
"common.notify.new-success": "Add Success!",
|
||||
"common.notify.new-fail": "Add Failed!",
|
||||
"common.notify.apply-success": "Apply Success!",
|
||||
"common.notify.apply-fail": "Apply Failed!",
|
||||
"common.notify.monitor-fail": "Query Monitor Failed!",
|
||||
"common.notify.edit-success": "Edit Success!",
|
||||
"common.notify.edit-fail": "Edit Failed!",
|
||||
"common.notify.no-select-cancel": "No items selected for cancel!",
|
||||
"common.confirm.cancel-batch": "Please confirm whether to cancel monitor in batches!",
|
||||
"common.confirm.cancel": "Please confirm whether to cancel monitor!",
|
||||
"common.notify.cancel-success": "Cancel Success!",
|
||||
"common.notify.cancel-fail": "Cancel Failed!",
|
||||
"common.notify.mark-success": "Mark Success!",
|
||||
"common.notify.mark-fail": "Mark Failed!",
|
||||
"common.notify.no-select-enable": "No items selected for enable!",
|
||||
"common.confirm.enable-batch": "Please confirm whether to enable monitor in batches!",
|
||||
"common.confirm.enable": "Please confirm whether to enable monitor!",
|
||||
"common.notify.enable-success": "Enable Success!",
|
||||
"common.notify.enable-fail": "Enable Failed!",
|
||||
"common.confirm.clear-cache": "Please confirm whether to clear cache!",
|
||||
"common.notify.clear-success": "Clear Success!",
|
||||
"common.button.ok": "OK",
|
||||
"common.button.cancel": "Cancel",
|
||||
"common.button.help": "Help",
|
||||
"common.button.edit": "Edit",
|
||||
"common.button.delete": "Delete",
|
||||
"common.button.detect": "Detect",
|
||||
"validation.email.invalid": "Invalid email!",
|
||||
"validation.phone.invalid": "Invalid phone number!",
|
||||
"validation.verification-code.invalid": "Invalid verification code, should be 6 digits!",
|
||||
"validation.required": "Please fill in the required fields! ",
|
||||
"app.theme.default": "Light Theme",
|
||||
"app.theme.dark": "Dark Theme",
|
||||
"app.theme.compact": "Compact Theme",
|
||||
"app.role.admin": "Administrator",
|
||||
"app.lock": "Lock",
|
||||
"app.login.message-invalid-credentials": "Invalid username or password(admin/ant.design)",
|
||||
"app.login.message-invalid-verification-code": "Invalid verification code",
|
||||
"app.lock.placeholder": "Enter Any To Unlock",
|
||||
"app.passport.desc": "TanCloud-Friendly High Performance Monitoring Cloud Service",
|
||||
"app.passport.welcome": "Welcome To Use TanCloud-Monitoring Cloud Service-tancloud.cn",
|
||||
"app.login.message-need-identifier": "Please enter your username",
|
||||
"app.login.message-need-credential": "Please enter password",
|
||||
"app.login.message-invalid-credentials": "Invalid username or password",
|
||||
"app.login.tab-login-credentials": "Credentials",
|
||||
"app.login.tab-login-mobile": "Mobile number",
|
||||
"app.login.remember-me": "Remember me",
|
||||
"app.login.forgot-password": "Forgot your password?",
|
||||
"app.login.sign-in-with": "Sign in with",
|
||||
"app.login.signup": "Sign up",
|
||||
"app.login.login": "Login",
|
||||
"app.register.register": "Register",
|
||||
"app.register.get-verification-code": "Get code",
|
||||
"app.register.sign-in": "Already have an account?",
|
||||
"app.register-result.msg": "Account:registered at {{email}}",
|
||||
"app.register-result.activation-email":
|
||||
"The activation email has been sent to your email address and is valid for 24 hours. Please log in to the email in time and click on the link in the email to activate the account.",
|
||||
"app.register-result.back-home": "Back to home",
|
||||
"app.register-result.view-mailbox": "View mailbox",
|
||||
"validation.email.required": "Please enter your email!",
|
||||
"validation.email.wrong-format": "The email address is in the wrong format!",
|
||||
"validation.password.required": "Please enter your password!",
|
||||
|
||||
@@ -27,7 +27,7 @@
|
||||
"alert": {
|
||||
"": "告警",
|
||||
"center": "告警中心",
|
||||
"setting": "告警配置",
|
||||
"setting": "告警阈值",
|
||||
"dispatch": "告警通知"
|
||||
},
|
||||
"extras": {
|
||||
@@ -39,6 +39,14 @@
|
||||
},
|
||||
"monitor": {
|
||||
"": "监控",
|
||||
"name": "监控名称",
|
||||
"name.tip": "标识监控的名称,名称需要保证唯一性",
|
||||
"host": "监控Host",
|
||||
"host.tip": "被监控的对端IP或域名",
|
||||
"description": "描述备注",
|
||||
"description.tip": "更多标识和描述此监控的备注信息",
|
||||
"intervals": "采集间隔",
|
||||
"intervals.tip": "监控周期性采集数据间隔时间,单位秒",
|
||||
"category": {
|
||||
"": "监控类别",
|
||||
"service": "应用服务",
|
||||
@@ -58,46 +66,227 @@
|
||||
"oracle": "Oracle",
|
||||
"redis": "Redis",
|
||||
"fullsite": "全站监控"
|
||||
},
|
||||
"status": {
|
||||
"": "监控状态",
|
||||
"all": "全部状态",
|
||||
"available": "正常监控",
|
||||
"unavailable": "不可用",
|
||||
"unreachable": "不可达",
|
||||
"un-manage": "未管理"
|
||||
}
|
||||
},
|
||||
"alert": {
|
||||
"": "告警",
|
||||
"status": {
|
||||
"": "告警状态",
|
||||
"0": "待处理",
|
||||
"all": "全部状态",
|
||||
"0": "未处理",
|
||||
"2": "已恢复",
|
||||
"3": "已处理"
|
||||
},
|
||||
"priority": {
|
||||
"": "告警级别",
|
||||
"all": "全部级别",
|
||||
"0": "紧急告警",
|
||||
"1": "严重告警",
|
||||
"2": "警告告警"
|
||||
}
|
||||
},
|
||||
"alert.setting.new": "新增阈值",
|
||||
"alert.setting.edit": "编辑阈值",
|
||||
"alert.setting.delete": "删除阈值",
|
||||
"alert.setting.target": "指标对象",
|
||||
"alert.setting.expr": "阈值触发表达式",
|
||||
"alert.setting.times": "触发次数",
|
||||
"alert.setting.times.tip": "设置触发阈值多少次之后才会发送告警",
|
||||
"alert.setting.template": "通知模版",
|
||||
"alert.setting.template.tip": "支持的通知模版环境变量",
|
||||
"alert.setting.template.label": "告警触发后发送的通知信息模版,模版环境变量见上方",
|
||||
"alert.setting.template.example": "请输入告警的通知模版.示例: ${app}.${metrics}.${metric}'s value is too high",
|
||||
"alert.setting.template.monitor-type": "监控类型名称",
|
||||
"alert.setting.template.metrics-name": "监控指标集合名称",
|
||||
"alert.setting.template.metric-name": "监控指标名称",
|
||||
"alert.setting.template.metric-value": "监控指标对象值",
|
||||
"alert.setting.template.other-value": "所属行其它指标值",
|
||||
"alert.setting.template.instance-value": "所属行实例值",
|
||||
"alert.setting.default": "全局默认",
|
||||
"alert.setting.default.tip": "此告警阈值配置是否应用于全局所有此类型监控",
|
||||
"alert.setting.enable": "启用告警",
|
||||
"alert.setting.enable.tip": "此告警阈值配置开启生效或关闭",
|
||||
"alert.setting.connect": "告警定义关联监控",
|
||||
"alert.setting.connect.left": "未关联监控",
|
||||
"alert.setting.connect.right": "已关联监控",
|
||||
"alert.setting.expr.tip": "支持的阈值触发表达式环境变量与操作符",
|
||||
"alert.setting.expr.label": "根据此表达式来计算判断是否触发阈值,表达式环境变量和操作符见上方",
|
||||
"alert.setting.expr.example": "根据此表达式计算判断是否触发阈值.示例",
|
||||
"alert.setting.priority.tip": "触发阈值的告警级别,从低到高依次为:警告-warning,严重-critical,紧急-emergency",
|
||||
"alert.setting.target.tip": "选中的指标对象",
|
||||
"alert.setting.target.other": "所属行其它指标对象",
|
||||
"alert.setting.target.instance": "所属行实例",
|
||||
"alert.setting.operator": "支持操作符函数",
|
||||
"alert.center.delete": "删除告警",
|
||||
"alert.center.deal": "标记已处理",
|
||||
"alert.center.no-deal": "标记未处理",
|
||||
"alert.center.search": "搜索告警内容",
|
||||
"alert.center.filter-status": "告警状态过滤",
|
||||
"alert.center.filter-priority": "告警级别过滤",
|
||||
"alert.center.target": "告警指标",
|
||||
"alert.center.monitor": "所属监控",
|
||||
"alert.center.priority": "级别",
|
||||
"alert.center.content": "告警内容",
|
||||
"alert.center.status": "状态",
|
||||
"alert.center.time": "告警时间",
|
||||
"alert.center.notify.no-delete": "未选中任何待删除项!",
|
||||
"alert.center.confirm.delete": "请确认是否删除!",
|
||||
"alert.center.confirm.delete-batch": "请确认是否批量删除!",
|
||||
"alert.center.notify.no-mark": "未选中任何待标记项!",
|
||||
"alert.center.confirm.mark-done-batch": "请确认是否批量标记已处理!",
|
||||
"alert.center.confirm.mark-done": "请确认是否标记已处理!",
|
||||
"alert.center.confirm.mark-no-batch": "请确认是否批量标记未处理!",
|
||||
"alert.center.confirm.mark-no": "请确认是否标记未处理!",
|
||||
"alert.notice.receiver": "告警接收人",
|
||||
"alert.notice.receiver.new": "新增接收人",
|
||||
"alert.notice.receiver.edit": "编辑接收人",
|
||||
"alert.notice.receiver.delete": "删除接收人",
|
||||
"alert.notice.receiver.people": "接收人",
|
||||
"alert.notice.receiver.people.name": "接收人名称",
|
||||
"alert.notice.receiver.type": "通知方式",
|
||||
"alert.notice.receiver.setting": "配置",
|
||||
"alert.notice.type.sms": "短信",
|
||||
"alert.notice.type.phone": "手机号",
|
||||
"alert.notice.type.email": "邮箱",
|
||||
"alert.notice.type.url": "URL地址",
|
||||
"alert.notice.type.wechat": "微信公众号",
|
||||
"alert.notice.type.wechat-id": "微信OPENID",
|
||||
"alert.notice.type.wework": "企业微信机器人",
|
||||
"alert.notice.type.wework-key": "企业微信机器人KEY",
|
||||
"alert.notice.type.access-token": "机器人ACCESS_TOKEN",
|
||||
"alert.notice.type.ding": "钉钉机器人",
|
||||
"alert.notice.type.fei-shu": "飞书机器人",
|
||||
"alert.notice.type.fei-shu-key": "飞书机器人KEY",
|
||||
"alert.notice.rule": "告警通知策略",
|
||||
"alert.notice.rule.new": "新增通知策略",
|
||||
"alert.notice.rule.edit": "编辑通知策略",
|
||||
"alert.notice.rule.delete": "删除通知策略",
|
||||
"alert.notice.rule.name": "策略名称",
|
||||
"alert.notice.rule.all": "转发所有",
|
||||
"alert.notice.rule.enable": "是否启用",
|
||||
"dashboard.alerts.title": "最近告警列表",
|
||||
"dashboard.alerts.title-no": "最近未处理告警",
|
||||
"dashboard.alerts.no": "暂无未处理告警",
|
||||
"dashboard.alerts.enter": "进入告警中心",
|
||||
"dashboard.alerts.distribute": "告警分布",
|
||||
"dashboard.alerts.num": "告警数量",
|
||||
"dashboard.alerts.deal": "告警处理",
|
||||
"dashboard.alerts.deal-percent": "告警处理率",
|
||||
"dashboard.monitors.total": "监控总量",
|
||||
"dashboard.monitors.title": "监控总览",
|
||||
"dashboard.monitors.sub-title": "监控类型纳管数量分布",
|
||||
"dashboard.monitors.formatter": "个监控 占比",
|
||||
"dashboard.monitors.distribute": "纳管数量分布",
|
||||
"monitors.list": "监控列表",
|
||||
"monitors.new": "新增",
|
||||
"monitors.new.success": "新增监控成功",
|
||||
"monitors.new.failed": "新增监控失败",
|
||||
"monitors.edit": "编辑",
|
||||
"monitors.edit.success": "修改监控成功",
|
||||
"monitors.edit.failed": "修改监控失败",
|
||||
"monitors.not-found": "查询异常,此监控不存在",
|
||||
"monitors.delete": "删除",
|
||||
"monitors.edit-monitor": "编辑监控",
|
||||
"monitors.delete-monitor": "删除监控",
|
||||
"monitors.enable": "启用监控",
|
||||
"monitors.cancel": "取消监控",
|
||||
"monitors.search.placeholder": "搜索监控",
|
||||
"monitors.search.filter": "监控状态过滤",
|
||||
"monitors.total": "总量",
|
||||
"monitors.advanced": "高级设置",
|
||||
"monitors.advanced.tip": "设置高级可选参数",
|
||||
"monitors.detect": "测试连接",
|
||||
"monitors.detect.success": "测试连接成功",
|
||||
"monitors.detect.failed": "测试连接失败",
|
||||
"monitors.detect.tip": "新增监控前是否先探测检查监控可用性",
|
||||
"monitors.detail": "监控详情",
|
||||
"monitors.detail.name": "名称",
|
||||
"monitors.detail.port": "端口",
|
||||
"monitors.detail.description": "描述",
|
||||
"monitors.detail.status": "状态",
|
||||
"monitors.detail.basic": "监控基本属性",
|
||||
"monitors.detail.realtime": "监控实时数据详情",
|
||||
"monitors.detail.history": "监控历史图表详情",
|
||||
"monitors.collect.time": "采集时间",
|
||||
"monitors.collect.time.tip": "最近采集时间",
|
||||
"monitors.detail.chart.zoom": "区域缩放",
|
||||
"monitors.detail.chart.back": "缩放还原",
|
||||
"monitors.detail.chart.save": "保存图片",
|
||||
"monitors.detail.chart.query-1h": "查询近1小时",
|
||||
"monitors.detail.chart.query-6h": "查询近6小时",
|
||||
"monitors.detail.chart.query-1d": "查询近1天",
|
||||
"monitors.detail.chart.query-1w": "查询近1周",
|
||||
"monitors.detail.chart.query-1m": "查询近1月",
|
||||
"monitors.detail.chart.no-data": "暂无数据",
|
||||
"monitors.detail.chart.unit": "单位",
|
||||
"common.name": "名称",
|
||||
"common.value": "值",
|
||||
"common.search": "搜索",
|
||||
"common.refresh": "刷新",
|
||||
"common.edit-time": "更新时间",
|
||||
"common.new-time": "创建时间",
|
||||
"common.edit": "操作",
|
||||
"common.total": "总量",
|
||||
"common.yes": "是",
|
||||
"common.no": "否",
|
||||
"common.enable": "开启",
|
||||
"common.disable": "关闭",
|
||||
"common.notify.no-select-edit": "未选中任何待编辑项!",
|
||||
"common.notify.one-select-edit": "只能对一个选中项进行编辑!",
|
||||
"common.confirm.delete": "请确认是否删除!",
|
||||
"common.notify.no-select-delete": "未选中任何待删除项!",
|
||||
"common.confirm.delete-batch": "请确认是否批量删除!",
|
||||
"common.notify.delete-success": "删除成功!",
|
||||
"common.notify.delete-fail": "删除失败!",
|
||||
"common.notify.new-success": "新增成功!",
|
||||
"common.notify.new-fail": "新增失败!",
|
||||
"common.notify.apply-success": "应用成功!",
|
||||
"common.notify.apply-fail": "应用失败!",
|
||||
"common.notify.monitor-fail": "查询此监控定义详情失败!",
|
||||
"common.notify.edit-success": "修改成功!",
|
||||
"common.notify.edit-fail": "修改失败!",
|
||||
"common.notify.mark-success": "标记成功!",
|
||||
"common.notify.mark-fail": "标记失败!",
|
||||
"common.notify.no-select-cancel": "未选中任何待取消项!",
|
||||
"common.confirm.cancel-batch": "请确认是否批量取消监控!",
|
||||
"common.confirm.cancel": "请确认是否取消监控!",
|
||||
"common.notify.cancel-success": "取消监控成功!",
|
||||
"common.notify.cancel-fail": "取消监控失败!",
|
||||
"common.notify.no-select-enable": "未选中任何待启用监控项!",
|
||||
"common.confirm.enable-batch": "请确认是否批量启用监控!",
|
||||
"common.confirm.enable": "请确认是否启用监控!",
|
||||
"common.notify.enable-success": "启用监控成功!",
|
||||
"common.notify.enable-fail": "启用监控失败!",
|
||||
"common.confirm.clear-cache": "请确认是否清理缓存!",
|
||||
"common.notify.clear-success": "清理成功!",
|
||||
"common.button.ok": "确定",
|
||||
"common.button.detect": "测试",
|
||||
"common.button.cancel": "取消",
|
||||
"common.button.help": "帮助",
|
||||
"common.button.edit": "编辑",
|
||||
"common.button.delete": "删除",
|
||||
"app.theme.default": "浅色主题",
|
||||
"app.theme.dark": "深色主题",
|
||||
"app.theme.compact": "紧凑主题",
|
||||
"app.role.admin": "管理员",
|
||||
"app.lock": "锁屏",
|
||||
"app.login.message-need-identifier": "请输入邮箱或手机号",
|
||||
"app.lock.placeholder": "输入任意解锁",
|
||||
"app.passport.desc": "TanCloud-易用友好的高性能监控云服务",
|
||||
"app.passport.welcome": "欢迎使用TanCloud探云-监控云服务-tancloud.cn",
|
||||
"app.login.message-need-identifier": "请输入用户名",
|
||||
"app.login.message-need-credential": "请输入密码",
|
||||
"app.login.message-invalid-credentials": "账户或密码错误",
|
||||
"app.login.message-invalid-verification-code": "验证码错误",
|
||||
"app.login.tab-login-credentials": "账户密码登录",
|
||||
"app.login.tab-login-mobile": "手机号登录",
|
||||
"app.login.remember-me": "自动登录",
|
||||
"app.login.forgot-password": "忘记密码",
|
||||
"app.login.sign-in-with": "其他登录方式",
|
||||
"app.login.signup": "注册账户",
|
||||
"app.login.login": "登录",
|
||||
"app.password.forgot": "忘记密码",
|
||||
"app.password.reset": "重置密码",
|
||||
"app.register.register": "注册",
|
||||
"app.register.get-verification-code": "获取验证码",
|
||||
"app.register.sign-in": "使用已有账户登录",
|
||||
"app.register-result.msg": "你的账户:{{email}} 注册成功",
|
||||
"app.register-result.activation-email":
|
||||
"额外赠送监控额度邮件已发送到你的邮箱中。请及时登录邮箱,点击邮件中的链接领取。",
|
||||
"app.register-result.login": "开始登录",
|
||||
"app.register-result.back-home": "返回首页",
|
||||
"app.register-result.view-mailbox": "查看邮箱",
|
||||
"validation.email.required": "请输入邮箱地址!",
|
||||
"validation.email.wrong-format": "邮箱地址格式错误!",
|
||||
"validation.email.invalid": "无效的邮箱地址!",
|
||||
|
||||
Reference in New Issue
Block a user