Compare commits
11 Commits
bugfix#ora
...
feature#en
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0281e5f0c2 | ||
|
|
89efd96448 | ||
|
|
1126d2e41e | ||
|
|
b78f463ed1 | ||
|
|
2de1aa4069 | ||
|
|
95a062eff4 | ||
|
|
7fbf112240 | ||
|
|
a3d1f08b39 | ||
|
|
f685298741 | ||
|
|
a7658624ab | ||
|
|
69af6d2a12 |
@@ -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)
|
||||
|
||||
> 易用友好的监控告警系统。
|
||||
|
||||
|
||||
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)
|
||||
@@ -30,12 +30,11 @@ import java.util.List;
|
||||
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
|
||||
|
||||
/**
|
||||
* Alarm Management API 告警管理API
|
||||
*
|
||||
* 告警管理API
|
||||
* @author tom
|
||||
* @date 2021/12/9 10:32
|
||||
*/
|
||||
@Api(tags = "en: Alarm batch management API, zh:告警批量管理API")
|
||||
@Api(tags = "告警批量管理API")
|
||||
@RestController
|
||||
@RequestMapping(path = "/alerts", produces = {APPLICATION_JSON_VALUE})
|
||||
public class AlertsController {
|
||||
@@ -44,23 +43,23 @@ public class AlertsController {
|
||||
private AlertService alertService;
|
||||
|
||||
@GetMapping
|
||||
@ApiOperation(value = "Get a list of alarm information based on query filter items", notes = "根据查询过滤项获取告警信息列表")
|
||||
@ApiOperation(value = "查询告警列表", notes = "根据查询过滤项获取告警信息列表")
|
||||
public ResponseEntity<Message<Page<Alert>>> getAlerts(
|
||||
@ApiParam(value = "en: Alarm ID List,zh: 告警IDS", example = "6565466456") @RequestParam(required = false) List<Long> ids,
|
||||
@ApiParam(value = "en: Alarm monitor object ID,zh: 告警监控对象ID", example = "6565463543") @RequestParam(required = false) Long monitorId,
|
||||
@ApiParam(value = "en: Alarm level,zh: 告警级别", example = "6565463543") @RequestParam(required = false) Byte priority,
|
||||
@ApiParam(value = "en: Alarm Status,zh: 告警状态", example = "6565463543") @RequestParam(required = false) Byte status,
|
||||
@ApiParam(value = "en: Alarm content fuzzy query,zh:告警内容模糊查询", example = "linux") @RequestParam(required = false) String content,
|
||||
@ApiParam(value = "en: Sort field, default id,zh: 排序字段,默认id", example = "name") @RequestParam(defaultValue = "id") String sort,
|
||||
@ApiParam(value = "en: Sort Type,zh: 排序方式,asc:升序,desc:降序", example = "desc") @RequestParam(defaultValue = "desc") 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) {
|
||||
@ApiParam(value = "告警ID", example = "6565466456") @RequestParam(required = false) List<Long> ids,
|
||||
@ApiParam(value = "告警监控对象ID", example = "6565463543") @RequestParam(required = false) Long monitorId,
|
||||
@ApiParam(value = "告警级别", example = "6565463543") @RequestParam(required = false) Byte priority,
|
||||
@ApiParam(value = "告警状态", example = "6565463543") @RequestParam(required = false) Byte status,
|
||||
@ApiParam(value = "告警内容模糊查询", example = "linux") @RequestParam(required = false) String content,
|
||||
@ApiParam(value = "排序字段,默认id", example = "name") @RequestParam(defaultValue = "id") String sort,
|
||||
@ApiParam(value = "排序方式,asc:升序,desc:降序", example = "desc") @RequestParam(defaultValue = "desc") String order,
|
||||
@ApiParam(value = "列表当前分页", example = "0") @RequestParam(defaultValue = "0") int pageIndex,
|
||||
@ApiParam(value = "列表分页数量", example = "8") @RequestParam(defaultValue = "8") int pageSize) {
|
||||
|
||||
Specification<Alert> 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);
|
||||
}
|
||||
@@ -93,9 +92,10 @@ public class AlertsController {
|
||||
}
|
||||
|
||||
@DeleteMapping
|
||||
@ApiOperation(value = "Delete alarms in batches", notes = "根据告警ID列表批量删除告警")
|
||||
@ApiOperation(value = "批量删除告警", notes = "根据告警ID列表批量删除告警")
|
||||
public ResponseEntity<Message<Void>> deleteAlertDefines(
|
||||
@ApiParam(value = "en:Alarm List ID,zh: 告警IDs", example = "6565463543") @RequestParam(required = false) List<Long> ids) {
|
||||
@ApiParam(value = "告警IDs", example = "6565463543") @RequestParam(required = false) List<Long> ids
|
||||
) {
|
||||
if (ids != null && !ids.isEmpty()) {
|
||||
alertService.deleteAlerts(new HashSet<>(ids));
|
||||
}
|
||||
@@ -104,10 +104,10 @@ public class AlertsController {
|
||||
}
|
||||
|
||||
@PutMapping(path = "/status/{status}")
|
||||
@ApiOperation(value = "Batch modify alarm status, set read and unread", notes = "批量修改告警状态,设置已读未读")
|
||||
@ApiOperation(value = "批量修改告警状态", notes = "批量修改告警状态,设置已读未读")
|
||||
public ResponseEntity<Message<Void>> applyAlertDefinesStatus(
|
||||
@ApiParam(value = "en:Alarm status value,zh: 告警状态值", example = "0") @PathVariable Byte status,
|
||||
@ApiParam(value = "en:Alarm List IDS,zh: 告警IDS", example = "6565463543") @RequestParam(required = false) List<Long> ids) {
|
||||
@ApiParam(value = "告警状态值", example = "0") @PathVariable Byte status,
|
||||
@ApiParam(value = "告警IDs", example = "6565463543") @RequestParam(required = false) List<Long> ids) {
|
||||
if (ids != null && status != null && !ids.isEmpty()) {
|
||||
alertService.editAlertStatus(status, ids);
|
||||
}
|
||||
@@ -116,7 +116,7 @@ public class AlertsController {
|
||||
}
|
||||
|
||||
@GetMapping(path = "/summary")
|
||||
@ApiOperation(value = "Get alarm statistics", notes = "获取告警统计信息")
|
||||
@ApiOperation(value = "获取告警统计信息", notes = "获取告警统计信息")
|
||||
public ResponseEntity<Message<AlertSummary>> getAlertsSummary() {
|
||||
AlertSummary alertSummary = alertService.getAlertsSummary();
|
||||
Message<AlertSummary> message = new Message<>(alertSummary);
|
||||
|
||||
@@ -12,35 +12,30 @@ import java.util.List;
|
||||
import java.util.Set;
|
||||
|
||||
/**
|
||||
* Alert Database Operations Alert数据库表操作
|
||||
*
|
||||
* Alert 数据库操作
|
||||
* @author tom
|
||||
* @date 2021/12/9 10:03
|
||||
*/
|
||||
public interface AlertDao extends JpaRepository<Alert, Long>, JpaSpecificationExecutor<Alert> {
|
||||
|
||||
/**
|
||||
* Delete alerts based on ID list 根据ID列表删除告警
|
||||
*
|
||||
* @param alertIds Alert ID List 告警ID列表
|
||||
* 根据ID列表删除告警
|
||||
* @param alertIds 告警ID列表
|
||||
*/
|
||||
void deleteAlertsByIdIn(Set<Long> alertIds);
|
||||
|
||||
/**
|
||||
* 根据告警ID-状态值 更新告警状态
|
||||
*
|
||||
* @param status 状态值
|
||||
* @param ids 告警ID列表
|
||||
* @param ids 告警ID列表
|
||||
*/
|
||||
@Modifying
|
||||
@Query("update Alert set status = :status where id in :ids")
|
||||
void updateAlertsStatus(@Param(value = "status") Byte status, @Param(value = "ids") List<Long> ids);
|
||||
|
||||
/**
|
||||
* Query the number of unhandled alarms of each alarm severity
|
||||
* 查询各个告警级别的未处理告警数量
|
||||
*
|
||||
* @return Number of alerts 告警数量
|
||||
* @return 告警数量
|
||||
*/
|
||||
@Query("select new com.usthe.alert.dto.AlertPriorityNum(mo.priority, count(mo.id)) from Alert mo where mo.status = 0 group by mo.priority")
|
||||
List<AlertPriorityNum> findAlertPriorityNum();
|
||||
|
||||
@@ -4,8 +4,7 @@ import lombok.AllArgsConstructor;
|
||||
import lombok.Data;
|
||||
|
||||
/**
|
||||
* Number of monitoring level alarms 监控级别告警数量
|
||||
*
|
||||
* 监控级别告警数量
|
||||
* @author tom
|
||||
* @date 2022/3/6 19:52
|
||||
*/
|
||||
@@ -13,13 +12,7 @@ import lombok.Data;
|
||||
@AllArgsConstructor
|
||||
public class AlertPriorityNum {
|
||||
|
||||
/**
|
||||
* Alarm level 告警级别
|
||||
*/
|
||||
private byte priority;
|
||||
|
||||
/**
|
||||
* count 数量
|
||||
*/
|
||||
private long num;
|
||||
}
|
||||
|
||||
@@ -9,43 +9,31 @@ import lombok.NoArgsConstructor;
|
||||
import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_ONLY;
|
||||
|
||||
/**
|
||||
* Alarm Statistics Information 告警统计信息
|
||||
*
|
||||
* 告警统计信息
|
||||
* @author tom
|
||||
* @date 2022/3/6 19:25
|
||||
*/
|
||||
@Data
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@ApiModel(description = "en:Alarm Statistics Information,zh: 告警统计信息")
|
||||
@ApiModel(description = "告警统计信息")
|
||||
public class AlertSummary {
|
||||
|
||||
@ApiModelProperty(value = "Total number of alerts (including processed and unprocessed alerts)",
|
||||
notes = "告警总数量(包括已处理未处理告警)",
|
||||
example = "134", accessMode = READ_ONLY, position = 0)
|
||||
@ApiModelProperty(value = "告警总数量(包括已处理未处理告警)", example = "134", accessMode = READ_ONLY, position = 0)
|
||||
private long total;
|
||||
|
||||
@ApiModelProperty(value = "Number of alerts handled",
|
||||
notes = "已处理告警数量",
|
||||
example = "34", accessMode = READ_ONLY, position = 1)
|
||||
@ApiModelProperty(value = "已处理告警数量", example = "34", accessMode = READ_ONLY, position = 1)
|
||||
private long dealNum;
|
||||
|
||||
@ApiModelProperty(value = "Alarm handling rate",
|
||||
notes = "告警处理率",
|
||||
example = "39.34", accessMode = READ_ONLY, position = 2)
|
||||
@ApiModelProperty(value = "告警处理率", example = "39.34", accessMode = READ_ONLY, position = 2)
|
||||
private float rate;
|
||||
|
||||
@ApiModelProperty(value = "Number of alarms whose alarm severity is warning alarms (referring to unhandled alarms)",
|
||||
notes = "告警级别为警告告警的告警数量(指未处理告警)",
|
||||
example = "43", accessMode = READ_ONLY, position = 3)
|
||||
@ApiModelProperty(value = "告警级别为警告告警的告警数量(指未处理告警)", example = "43", accessMode = READ_ONLY, position = 3)
|
||||
private long priorityWarningNum;
|
||||
|
||||
@ApiModelProperty(value = "Number of alarms whose alarm severity is critical alarms (referring to unhandled alarms)",
|
||||
notes = "告警级别为严重告警的告警数量(指未处理告警)",
|
||||
example = "56", accessMode = READ_ONLY, position = 4)
|
||||
@ApiModelProperty(value = "告警级别为严重告警的告警数量(指未处理告警)", example = "56", accessMode = READ_ONLY, position = 4)
|
||||
private long priorityCriticalNum;
|
||||
|
||||
@ApiModelProperty(value = "Number of alarms whose alarm severity is urgent alarms (referring to unhandled alarms)",
|
||||
notes = "告警级别为紧急告警的告警数量(指未处理告警)", example = "23", accessMode = READ_ONLY, position = 5)
|
||||
@ApiModelProperty(value = "告警级别为紧急告警的告警数量(指未处理告警)", example = "23", accessMode = READ_ONLY, position = 5)
|
||||
private long priorityEmergencyNum;
|
||||
}
|
||||
|
||||
@@ -10,54 +10,43 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Alarm information management interface
|
||||
* 告警信息管理接口
|
||||
*
|
||||
* @author tom
|
||||
* @date 2021/12/9 10:06
|
||||
*/
|
||||
public interface AlertService {
|
||||
|
||||
/**
|
||||
* Add alarm record
|
||||
* 新增告警记录
|
||||
*
|
||||
* @param alert Alert entity 告警实体
|
||||
* @throws RuntimeException Add process exception throw 新增过程异常抛出
|
||||
* 新增告警
|
||||
* @param alert 告警实体
|
||||
* @throws RuntimeException 新增过程异常抛出
|
||||
*/
|
||||
void addAlert(Alert alert) throws RuntimeException;
|
||||
|
||||
/**
|
||||
* Dynamic conditional query
|
||||
* 动态条件查询
|
||||
*
|
||||
* @param specification Query conditions 查询条件
|
||||
* @param pageRequest pagination parameters 分页参数
|
||||
* @return search result 查询结果
|
||||
* @param specification 查询条件
|
||||
* @param pageRequest 分页参数
|
||||
* @return 查询结果
|
||||
*/
|
||||
Page<Alert> getAlerts(Specification<Alert> specification, PageRequest pageRequest);
|
||||
|
||||
/**
|
||||
* Delete alarms in batches according to the alarm ID list
|
||||
* 根据告警ID列表批量删除告警
|
||||
*
|
||||
* @param ids Alarm ID List 告警IDS
|
||||
* @param ids 告警IDs
|
||||
*/
|
||||
void deleteAlerts(HashSet<Long> ids);
|
||||
|
||||
/**
|
||||
* Update the alarm status according to the alarm ID-status value
|
||||
* 根据告警ID-状态值 更新告警状态
|
||||
*
|
||||
* @param status Alarm status to be modified 待修改为的告警状态
|
||||
* @param ids Alarm ID List to be modified 待修改的告警ID集合
|
||||
* @param status 待修改为的告警状态
|
||||
* @param ids 待修改的告警IDs
|
||||
*/
|
||||
void editAlertStatus(Byte status, List<Long> ids);
|
||||
|
||||
/**
|
||||
* Get alarm statistics information 获取告警统计信息
|
||||
*
|
||||
* @return Alarm statistics information 告警统计
|
||||
* 获取告警统计信息
|
||||
* @return 告警统计
|
||||
*/
|
||||
AlertSummary getAlertsSummary();
|
||||
|
||||
|
||||
@@ -20,8 +20,7 @@ import java.util.HashSet;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Realization of Alarm Information Service 告警信息服务实现
|
||||
*
|
||||
* 告警信息服务实现
|
||||
* @author tom
|
||||
* @date 2021/12/10 15:39
|
||||
*/
|
||||
@@ -56,24 +55,18 @@ public class AlertServiceImpl implements AlertService {
|
||||
@Override
|
||||
public AlertSummary getAlertsSummary() {
|
||||
AlertSummary alertSummary = new AlertSummary();
|
||||
//Statistics on the alarm information in the alarm state
|
||||
//统计正在告警状态下的告警信息
|
||||
List<AlertPriorityNum> priorityNums = alertDao.findAlertPriorityNum();
|
||||
if (priorityNums != null) {
|
||||
for (AlertPriorityNum priorityNum : priorityNums) {
|
||||
switch (priorityNum.getPriority()) {
|
||||
case CommonConstants
|
||||
.ALERT_PRIORITY_CODE_WARNING:
|
||||
alertSummary.setPriorityWarningNum(priorityNum.getNum());
|
||||
break;
|
||||
alertSummary.setPriorityWarningNum(priorityNum.getNum());break;
|
||||
case CommonConstants.ALERT_PRIORITY_CODE_CRITICAL:
|
||||
alertSummary.setPriorityCriticalNum(priorityNum.getNum());
|
||||
break;
|
||||
alertSummary.setPriorityCriticalNum(priorityNum.getNum());break;
|
||||
case CommonConstants.ALERT_PRIORITY_CODE_EMERGENCY:
|
||||
alertSummary.setPriorityEmergencyNum(priorityNum.getNum());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
alertSummary.setPriorityEmergencyNum(priorityNum.getNum());break;
|
||||
default: break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,11 +115,6 @@
|
||||
<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>
|
||||
@@ -23,8 +23,7 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_ONLY;
|
||||
import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||
|
||||
/**
|
||||
* Alarm record entity 告警记录实体
|
||||
*
|
||||
* 告警记录
|
||||
* @author tom
|
||||
* @date 2021/12/9 15:37
|
||||
*/
|
||||
@@ -34,68 +33,52 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@ApiModel(description = "en: Alarm record entity zh: 告警记录实体")
|
||||
@ApiModel(description = "告警记录实体")
|
||||
public class Alert {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@ApiModelProperty(value = "Alarm record entity primary key index ID",
|
||||
notes = "告警记录实体主键索引ID",
|
||||
example = "87584674384", accessMode = READ_ONLY, position = 0)
|
||||
@ApiModelProperty(value = "告警记录实体主键索引ID", example = "87584674384", accessMode = READ_ONLY, position = 0)
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "Alert target object: monitor availability-available metrics-app.metrics.field",
|
||||
notes = "告警目标对象: 监控可用性-available 指标-app.metrics.field",
|
||||
@ApiModelProperty(value = "告警目标对象: 监控可用性-available 指标-app.metrics.field",
|
||||
example = "1", accessMode = READ_WRITE, position = 1)
|
||||
@Length(max = 255)
|
||||
private String target;
|
||||
|
||||
@ApiModelProperty(value = "Monitoring ID associated with the alarm object",
|
||||
notes = "告警对象关联的监控ID",
|
||||
example = "87432674336", accessMode = READ_WRITE, position = 2)
|
||||
@ApiModelProperty(value = "告警对象关联的监控ID", example = "87432674336", accessMode = READ_WRITE, position = 2)
|
||||
private Long monitorId;
|
||||
|
||||
@ApiModelProperty(value = "Monitoring name associated with the alarm object",
|
||||
notes = "告警对象关联的监控名称",
|
||||
example = "Linux_192.132.23.1", accessMode = READ_WRITE, position = 3)
|
||||
@ApiModelProperty(value = "告警对象关联的监控名称", example = "Linux_192.132.23.1",
|
||||
accessMode = READ_WRITE, position = 3)
|
||||
private String monitorName;
|
||||
|
||||
@ApiModelProperty(value = "Alarm definition ID associated with the alarm",
|
||||
notes = "告警关联的告警定义ID",
|
||||
example = "8743267443543", accessMode = READ_WRITE, position = 4)
|
||||
@ApiModelProperty(value = "告警关联的告警定义ID", example = "8743267443543", accessMode = READ_WRITE, position = 4)
|
||||
private Long alertDefineId;
|
||||
|
||||
@ApiModelProperty(value = "Alarm level 0: high-emergency-critical alarm-red 1: medium-critical-critical alarm-orange 2: low-warning-warning alarm-yellow",
|
||||
notes = "告警级别 0:高-emergency-紧急告警-红色 1:中-critical-严重告警-橙色 2:低-warning-警告告警-黄色",
|
||||
@ApiModelProperty(value = "告警级别 0:高-emergency-紧急告警-红色 1:中-critical-严重告警-橙色 2:低-warning-警告告警-黄色",
|
||||
example = "1", accessMode = READ_WRITE, position = 5)
|
||||
@Min(0)
|
||||
@Max(2)
|
||||
private byte priority;
|
||||
|
||||
@ApiModelProperty(value = "The actual content of the alarm notification",
|
||||
notes = "告警通知实际内容",
|
||||
example = "linux_192.134.32.1: 534543534 cpu usage high",
|
||||
@ApiModelProperty(value = "告警通知实际内容", example = "linux_192.134.32.1: 534543534 cpu usage high",
|
||||
accessMode = READ_WRITE, position = 6)
|
||||
@Length(max = 1024)
|
||||
private String content;
|
||||
|
||||
@ApiModelProperty(value = "Alarm status: 0-normal alarm (to be processed) 1-threshold triggered but not reached the number of alarms 2-recovered alarm 3-processed",
|
||||
notes = "告警状态: 0-正常告警(待处理) 1-阈值触发但未达到告警次数 2-恢复告警 3-已处理",
|
||||
@ApiModelProperty(value = "告警状态: 0-正常告警(待处理) 1-阈值触发但未达到告警次数 2-恢复告警 3-已处理",
|
||||
example = "1", accessMode = READ_WRITE, position = 7)
|
||||
@Min(0)
|
||||
@Max(2)
|
||||
private byte status;
|
||||
|
||||
@ApiModelProperty(value = "Alarm threshold trigger times",
|
||||
notes = "告警阈值触发次数",
|
||||
example = "3", accessMode = READ_WRITE, position = 8)
|
||||
@ApiModelProperty(value = "告警阈值触发次数", example = "3", accessMode = READ_WRITE, position = 8)
|
||||
@Min(0)
|
||||
@Max(10)
|
||||
private int times;
|
||||
|
||||
@ApiModelProperty(value = "Alarm trigger time (timestamp in milliseconds)",
|
||||
notes = "告警触发时间(毫秒时间戳)",
|
||||
example = "1612198922000", accessMode = READ_ONLY, position = 9)
|
||||
@ApiModelProperty(value = "告警触发时间(毫秒时间戳)", example = "1612198922000", accessMode = READ_ONLY, position = 9)
|
||||
@Column(insertable = false, updatable = false)
|
||||
private LocalDateTime gmtCreate;
|
||||
|
||||
|
||||
@@ -23,9 +23,7 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_ONLY;
|
||||
import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||
|
||||
/**
|
||||
* Message notification recipient entity
|
||||
* 消息通知接收人实体
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/13 22:19
|
||||
*/
|
||||
@@ -35,80 +33,56 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@ApiModel(description = "en: Message notification recipient entity,zh:消息通知接收人实体")
|
||||
@ApiModel(description = "消息通知接收人实体")
|
||||
public class NoticeReceiver {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@ApiModelProperty(value = "Recipient entity primary key index ID",
|
||||
notes = "接收人实体主键索引ID",
|
||||
example = "87584674384", accessMode = READ_ONLY, position = 0)
|
||||
@ApiModelProperty(value = "接收人实体主键索引ID", example = "87584674384", accessMode = READ_ONLY, position = 0)
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "Recipient name",
|
||||
notes = "接收人名称",
|
||||
example = "tom", accessMode = READ_WRITE, position = 1)
|
||||
@ApiModelProperty(value = "接收人名称", example = "tom", accessMode = READ_WRITE, position = 1)
|
||||
@Length(max = 100)
|
||||
@NotNull
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "Notification information method: 0-SMS 1-Email 2-webhook 3-WeChat Official Account 4-Enterprise WeChat Robot 5-DingTalk Robot 6-FeiShu Robot",
|
||||
notes = "通知信息方式: 0-手机短信 1-邮箱 2-webhook 3-微信公众号 4-企业微信机器人 5-钉钉机器人 6-飞书机器人",
|
||||
accessMode = READ_WRITE, position = 2)
|
||||
@ApiModelProperty(value = "通知信息方式: 0-手机短信 1-邮箱 2-webhook 3-微信公众号 4-企业微信机器人 5-钉钉机器人 6-飞书机器人", accessMode = READ_WRITE, position = 2)
|
||||
@Min(0)
|
||||
@Max(8)
|
||||
@NotNull
|
||||
private Byte type;
|
||||
|
||||
@ApiModelProperty(value = "Mobile number: Valid when the notification method is SMS",
|
||||
notes = "手机号 : 通知方式为手机短信时有效",
|
||||
example = "18923435643", accessMode = READ_WRITE, position = 3)
|
||||
@ApiModelProperty(value = "手机号, 通知方式为手机短信时有效", example = "18923435643", accessMode = READ_WRITE, position = 3)
|
||||
@Length(max = 100)
|
||||
private String phone;
|
||||
|
||||
@ApiModelProperty(value = "Email account: Valid when the notification method is email",
|
||||
notes = "邮箱账号 : 通知方式为邮箱时有效",
|
||||
example = "tom@qq.com", accessMode = READ_WRITE, position = 4)
|
||||
@ApiModelProperty(value = "邮箱账号, 通知方式为邮箱时有效", example = "tom@qq.com", accessMode = READ_WRITE, position = 4)
|
||||
@Length(max = 100)
|
||||
private String email;
|
||||
|
||||
@ApiModelProperty(value = "URL address: The notification method is valid for webhook",
|
||||
notes = "URL地址 : 通知方式为webhook有效",
|
||||
example = "https://www.tancloud.cn", accessMode = READ_WRITE, position = 5)
|
||||
@ApiModelProperty(value = "URL地址, 通知方式为webhook有效", example = "https://www.tancloud.cn", accessMode = READ_WRITE, position = 5)
|
||||
@Length(max = 300)
|
||||
private String hookUrl;
|
||||
|
||||
@ApiModelProperty(value = "openId : The notification method is valid for WeChat official account or enterprise WeChat robot",
|
||||
notes = "openId : 通知方式为微信公众号或企业微信机器人有效",
|
||||
example = "343432", accessMode = READ_WRITE, position = 6)
|
||||
@ApiModelProperty(value = "openId, 通知方式为微信公众号或企业微信机器人有效", example = "343432", accessMode = READ_WRITE, position = 6)
|
||||
@Length(max = 300)
|
||||
private String wechatId;
|
||||
|
||||
@ApiModelProperty(value = "Access token : The notification method is valid for DingTalk robot",
|
||||
notes = "访问token : 通知方式为钉钉机器人有效",
|
||||
example = "34823984635647", accessMode = READ_WRITE, position = 7)
|
||||
@ApiModelProperty(value = "访问token, 通知方式为钉钉机器人有效", example = "34823984635647", accessMode = READ_WRITE, position = 7)
|
||||
@Length(max = 300)
|
||||
private String accessToken;
|
||||
|
||||
@ApiModelProperty(value = "The creator of this record",
|
||||
notes = "此条记录创建者",
|
||||
example = "tom", accessMode = READ_ONLY, position = 7)
|
||||
@ApiModelProperty(value = "此条记录创建者", example = "tom", accessMode = READ_ONLY, position = 7)
|
||||
private String creator;
|
||||
|
||||
@ApiModelProperty(value = "This record was last modified by",
|
||||
notes = "此条记录最新修改者",
|
||||
example = "tom", accessMode = READ_ONLY, position = 8)
|
||||
@ApiModelProperty(value = "此条记录最新修改者", example = "tom", accessMode = READ_ONLY, position = 8)
|
||||
private String modifier;
|
||||
|
||||
@ApiModelProperty(value = "Record creation time (millisecond timestamp)",
|
||||
notes = "记录创建时间(毫秒时间戳)",
|
||||
example = "1612198922000", accessMode = READ_ONLY, position = 9)
|
||||
@ApiModelProperty(value = "记录创建时间(毫秒时间戳)", example = "1612198922000", accessMode = READ_ONLY, position = 9)
|
||||
@Column(insertable = false, updatable = false)
|
||||
private LocalDateTime gmtCreate;
|
||||
|
||||
@ApiModelProperty(value = "Record the latest modification time (timestamp in milliseconds)",
|
||||
notes = "记录最新修改时间(毫秒时间戳)",
|
||||
example = "1612198444000", accessMode = READ_ONLY, position = 10)
|
||||
@ApiModelProperty(value = "记录最新修改时间(毫秒时间戳)", example = "1612198444000", accessMode = READ_ONLY, position = 10)
|
||||
@Column(insertable = false, updatable = false)
|
||||
private LocalDateTime gmtUpdate;
|
||||
|
||||
|
||||
@@ -21,9 +21,7 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_ONLY;
|
||||
import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||
|
||||
/**
|
||||
* Notification strategy entity
|
||||
* 通知策略
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/13 22:19
|
||||
*/
|
||||
@@ -33,65 +31,45 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||
@Builder
|
||||
@AllArgsConstructor
|
||||
@NoArgsConstructor
|
||||
@ApiModel(description = "en: Notify Policy Entity,zh: 通知策略实体")
|
||||
@ApiModel(description = "通知策略实体")
|
||||
public class NoticeRule {
|
||||
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
@ApiModelProperty(value = "Notification Policy Entity Primary Key Index ID",
|
||||
notes = "通知策略实体主键索引ID",
|
||||
example = "87584674384", accessMode = READ_ONLY, position = 0)
|
||||
@ApiModelProperty(value = "通知策略实体主键索引ID", example = "87584674384", accessMode = READ_ONLY, position = 0)
|
||||
private Long id;
|
||||
|
||||
@ApiModelProperty(value = "Policy name",
|
||||
notes = "策略名称",
|
||||
example = "dispatch-1", accessMode = READ_WRITE, position = 1)
|
||||
@ApiModelProperty(value = "策略名称", example = "dispatch-1", accessMode = READ_WRITE, position = 1)
|
||||
@Length(max = 100)
|
||||
@NotNull
|
||||
private String name;
|
||||
|
||||
@ApiModelProperty(value = "Recipient ID",
|
||||
notes = "接收人ID",
|
||||
example = "4324324", accessMode = READ_WRITE, position = 2)
|
||||
@ApiModelProperty(value = "接收人ID", example = "4324324", accessMode = READ_WRITE, position = 2)
|
||||
@NotNull
|
||||
private Long receiverId;
|
||||
|
||||
@ApiModelProperty(value = "Recipient identification",
|
||||
notes = "接收人标识",
|
||||
example = "tom", accessMode = READ_WRITE, position = 3)
|
||||
@ApiModelProperty(value = "接收人标识", example = "tom", accessMode = READ_WRITE, position = 3)
|
||||
@Length(max = 100)
|
||||
@NotNull
|
||||
private String receiverName;
|
||||
|
||||
@ApiModelProperty(value = "Whether to enable this policy",
|
||||
notes = "是否启用此策略",
|
||||
example = "true", accessMode = READ_WRITE, position = 4)
|
||||
@ApiModelProperty(value = "是否启用此策略", example = "true", accessMode = READ_WRITE, position = 4)
|
||||
private boolean enable = true;
|
||||
|
||||
@ApiModelProperty(value = "Whether to forward all",
|
||||
notes = "是否转发所有",
|
||||
example = "false", accessMode = READ_WRITE, position = 5)
|
||||
@ApiModelProperty(value = "是否转发所有", example = "false", accessMode = READ_WRITE, position = 5)
|
||||
private boolean filterAll = true;
|
||||
|
||||
@ApiModelProperty(value = "The creator of this record",
|
||||
notes = "此条记录创建者",
|
||||
example = "tom", accessMode = READ_ONLY, position = 7)
|
||||
@ApiModelProperty(value = "此条记录创建者", example = "tom", accessMode = READ_ONLY, position = 7)
|
||||
private String creator;
|
||||
|
||||
@ApiModelProperty(value = "This record was last modified by",
|
||||
notes = "此条记录最新修改者",
|
||||
example = "tom", accessMode = READ_ONLY, position = 8)
|
||||
@ApiModelProperty(value = "此条记录最新修改者", example = "tom", accessMode = READ_ONLY, position = 8)
|
||||
private String modifier;
|
||||
|
||||
@ApiModelProperty(value = "This record creation time (millisecond timestamp)",
|
||||
notes = "记录创建时间(毫秒时间戳)",
|
||||
example = "1612198922000", accessMode = READ_ONLY, position = 9)
|
||||
@ApiModelProperty(value = "记录创建时间(毫秒时间戳)", example = "1612198922000", accessMode = READ_ONLY, position = 9)
|
||||
@Column(insertable = false, updatable = false)
|
||||
private LocalDateTime gmtCreate;
|
||||
|
||||
@ApiModelProperty(value = "Record the latest modification time (timestamp in milliseconds)",
|
||||
notes = "记录最新修改时间(毫秒时间戳)",
|
||||
example = "1612198444000", accessMode = READ_ONLY, position = 10)
|
||||
@ApiModelProperty(value = "记录最新修改时间(毫秒时间戳)", example = "1612198444000", accessMode = READ_ONLY, position = 10)
|
||||
@Column(insertable = false, updatable = false)
|
||||
private LocalDateTime gmtUpdate;
|
||||
|
||||
|
||||
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 |
@@ -30,7 +30,6 @@ import java.util.Date;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Alarm information storage and distribution
|
||||
* 告警信息入库分发
|
||||
*
|
||||
* @author tom
|
||||
@@ -72,7 +71,7 @@ public class DispatchAlarm {
|
||||
try {
|
||||
Alert alert = dataQueue.pollAlertData();
|
||||
if (alert != null) {
|
||||
// Determining alarm type storage 判断告警类型入库
|
||||
// 判断告警类型入库
|
||||
storeAlertData(alert);
|
||||
// 通知分发
|
||||
sendAlertDataListener(alert);
|
||||
@@ -88,7 +87,7 @@ public class DispatchAlarm {
|
||||
}
|
||||
|
||||
private void storeAlertData(Alert alert) {
|
||||
// todo Using the cache does not directly manipulate the library 使用缓存不直接操作库
|
||||
// todo 使用缓存不直接操作库
|
||||
Monitor monitor = monitorService.getMonitor(alert.getMonitorId());
|
||||
if (monitor == null) {
|
||||
log.warn("Dispatch alarm the monitorId: {} not existed, ignored.", alert.getMonitorId());
|
||||
@@ -96,38 +95,34 @@ public class DispatchAlarm {
|
||||
}
|
||||
alert.setMonitorName(monitor.getName());
|
||||
if (monitor.getStatus() == CommonConstants.UN_MANAGE_CODE) {
|
||||
// When monitoring is not managed, ignore and silence its alarm messages
|
||||
// 当监控未管理时 忽略静默其告警信息
|
||||
return;
|
||||
}
|
||||
if (monitor.getStatus() == CommonConstants.AVAILABLE_CODE) {
|
||||
if (CommonConstants.AVAILABLE.equals(alert.getTarget())) {
|
||||
// Availability Alarm Need to change the monitoring status to unavailable
|
||||
// 可用性告警 需变更监控状态为不可用
|
||||
monitorService.updateMonitorStatus(monitor.getId(), CommonConstants.UN_AVAILABLE_CODE);
|
||||
} else if (CommonConstants.REACHABLE.equals(alert.getTarget())) {
|
||||
// Reachability alarm The monitoring status needs to be changed to unreachable
|
||||
// 可达性告警 需变更监控状态为不可达
|
||||
monitorService.updateMonitorStatus(monitor.getId(), CommonConstants.UN_REACHABLE_CODE);
|
||||
}
|
||||
} else {
|
||||
// If the alarm is restored, the monitoring state needs to be restored
|
||||
// 若是恢复告警 需对监控状态进行恢复
|
||||
if (alert.getStatus() == CommonConstants.ALERT_STATUS_CODE_RESTORED) {
|
||||
monitorService.updateMonitorStatus(alert.getMonitorId(), CommonConstants.AVAILABLE_CODE);
|
||||
}
|
||||
}
|
||||
// Alarm drop library 告警落库
|
||||
// 告警落库
|
||||
alertService.addAlert(alert);
|
||||
}
|
||||
|
||||
private void sendAlertDataListener(Alert alert) {
|
||||
// todo Forward configured email WeChat webhook 转发配置的邮件 微信 webhook
|
||||
// todo 转发配置的邮件 微信 webhook
|
||||
List<NoticeReceiver> receivers = matchReceiverByNoticeRules(alert);
|
||||
// todo Send notification here temporarily single thread 发送通知这里暂时单线程
|
||||
// todo 发送通知这里暂时单线程
|
||||
for (NoticeReceiver receiver : receivers) {
|
||||
switch (receiver.getType()) {
|
||||
// todo SMS notification 短信通知
|
||||
// todo 短信通知
|
||||
case 0:
|
||||
break;
|
||||
case 1:
|
||||
@@ -155,11 +150,10 @@ public class DispatchAlarm {
|
||||
}
|
||||
|
||||
/**
|
||||
* Send alert information through FeiShu
|
||||
* 通过飞书发送告警信息
|
||||
*
|
||||
* @param receiver Notification configuration information 通知配置信息
|
||||
* @param alert Alarm information 告警信息
|
||||
* @param receiver 接收人
|
||||
* @param alert 告警信息
|
||||
*/
|
||||
private void sendFlyBookAlert(NoticeReceiver receiver, Alert alert) {
|
||||
FlyBookWebHookDto flyBookWebHookDto = new FlyBookWebHookDto();
|
||||
@@ -205,11 +199,10 @@ public class DispatchAlarm {
|
||||
}
|
||||
|
||||
/**
|
||||
* Send alarm information through DingTalk robot
|
||||
* 通过钉钉机器人发送告警信息
|
||||
*
|
||||
* @param receiver Notification configuration information 通知配置信息
|
||||
* @param alert Alarm information 告警信息
|
||||
* @param receiver 通知配置信息
|
||||
* @param alert 告警信息
|
||||
*/
|
||||
private void sendDingTalkRobotAlert(NoticeReceiver receiver, Alert alert) {
|
||||
DingTalkWebHookDto dingTalkWebHookDto = new DingTalkWebHookDto();
|
||||
@@ -240,11 +233,10 @@ public class DispatchAlarm {
|
||||
}
|
||||
|
||||
/**
|
||||
* Send alarm information through enterprise WeChat
|
||||
* 通过企业微信发送告警信息
|
||||
*
|
||||
* @param receiver Notification configuration information 通知配置信息
|
||||
* @param alert Alarm information 告警信息
|
||||
* @param receiver 通知配置信息
|
||||
* @param alert 告警信息
|
||||
*/
|
||||
private void sendWeWorkRobotAlert(NoticeReceiver receiver, Alert alert) {
|
||||
WeWorkWebHookDto weWorkWebHookDTO = new WeWorkWebHookDto();
|
||||
@@ -304,23 +296,23 @@ public class DispatchAlarm {
|
||||
MimeMessage mimeMessage = javaMailSender.createMimeMessage();
|
||||
MimeMessageHelper messageHelper = new MimeMessageHelper(mimeMessage, true, "UTF-8");
|
||||
messageHelper.setSubject("TanCloud探云-监控告警");
|
||||
//Set sender Email 设置发件人Email
|
||||
//设置发件人Email
|
||||
messageHelper.setFrom(emailFromUser);
|
||||
//Set recipient Email 设定收件人Email
|
||||
//设定收件人Email
|
||||
messageHelper.setTo(receiver.getEmail());
|
||||
messageHelper.setSentDate(new Date());
|
||||
//Build email templates 构建邮件模版
|
||||
//构建邮件模版
|
||||
String process = mailService.buildAlertHtmlTemplate(alert);
|
||||
//Set Email Content Template 设置邮件内容模版
|
||||
//设置邮件内容模版
|
||||
messageHelper.setText(process, true);
|
||||
javaMailSender.send(mimeMessage);
|
||||
} catch (Exception e) {
|
||||
log.error("[Email Alert] Exception,Exception information={}", e.getMessage());
|
||||
log.error("[邮箱告警] error,Exception information={}", e.getMessage());
|
||||
}
|
||||
}
|
||||
|
||||
private List<NoticeReceiver> matchReceiverByNoticeRules(Alert alert) {
|
||||
// todo use cache 使用缓存
|
||||
// todo 使用缓存
|
||||
return noticeConfigService.getReceiverFilterRule(alert);
|
||||
}
|
||||
|
||||
|
||||
@@ -28,13 +28,11 @@ import java.util.List;
|
||||
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
|
||||
|
||||
/**
|
||||
* Message Notification Configuration API
|
||||
* 消息通知配置API
|
||||
*
|
||||
* @author tom
|
||||
* @date 2021/12/16 16:18
|
||||
*/
|
||||
@Api(tags = "en: Message Notification Configuration API,zh: 消息通知配置API")
|
||||
@Api(tags = "消息通知配置API")
|
||||
@RestController()
|
||||
@RequestMapping(value = "/notice", produces = {APPLICATION_JSON_VALUE})
|
||||
public class NoticeConfigController {
|
||||
@@ -43,36 +41,33 @@ public class NoticeConfigController {
|
||||
private NoticeConfigService noticeConfigService;
|
||||
|
||||
@PostMapping(path = "/receiver")
|
||||
@ApiOperation(value = "Add a recipient", notes = "新增一个接收人")
|
||||
@ApiOperation(value = "新增接收人", notes = "新增一个接收人")
|
||||
public ResponseEntity<Message<Void>> addNewNoticeReceiver(@Valid @RequestBody NoticeReceiver noticeReceiver) {
|
||||
noticeConfigService.addReceiver(noticeReceiver);
|
||||
return ResponseEntity.ok(new Message<>("Add success"));
|
||||
}
|
||||
|
||||
@PutMapping(path = "/receiver")
|
||||
@ApiOperation(value = "Modify existing recipient information", notes = "修改已存在的接收人信息")
|
||||
@ApiOperation(value = "修改接收人", notes = "修改已存在的接收人信息")
|
||||
public ResponseEntity<Message<Void>> editNoticeReceiver(@Valid @RequestBody NoticeReceiver noticeReceiver) {
|
||||
noticeConfigService.editReceiver(noticeReceiver);
|
||||
return ResponseEntity.ok(new Message<>("Edit success"));
|
||||
}
|
||||
|
||||
@DeleteMapping(path = "/receiver/{id}")
|
||||
@ApiOperation(value = "Delete existing recipient information", notes = "删除已存在的接收人信息")
|
||||
@ApiOperation(value = "删除指定接收人", 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 不存在或删除成功都返回成功
|
||||
@ApiParam(value = "接收人ID", example = "6565463543") @PathVariable("id") final Long receiverId) {
|
||||
// 不存在或删除成功都返回成功
|
||||
noticeConfigService.deleteReceiver(receiverId);
|
||||
return ResponseEntity.ok(new Message<>("Delete success"));
|
||||
}
|
||||
|
||||
@GetMapping(path = "/receivers")
|
||||
@ApiOperation(value = "Get a list of message notification recipients based on query filter items",
|
||||
notes = "根据查询过滤项获取消息通知接收人列表")
|
||||
@ApiOperation(value = "查询消息通知接收人", notes = "根据查询过滤项获取消息通知接收人列表")
|
||||
public ResponseEntity<Message<List<NoticeReceiver>>> getReceivers(
|
||||
@ApiParam(value = "en: Recipient name,zh: 接收人名称,模糊查询", example = "tom") @RequestParam(required = false) final String name) {
|
||||
@ApiParam(value = "接收人名称,模糊查询", 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)) {
|
||||
@@ -88,34 +83,32 @@ public class NoticeConfigController {
|
||||
|
||||
|
||||
@PostMapping(path = "/rule")
|
||||
@ApiOperation(value = "Add a notification policy", notes = "新增一个通知策略")
|
||||
@ApiOperation(value = "新增通知策略", notes = "新增一个通知策略")
|
||||
public ResponseEntity<Message<Void>> addNewNoticeRule(@Valid @RequestBody NoticeRule noticeRule) {
|
||||
noticeConfigService.addNoticeRule(noticeRule);
|
||||
return ResponseEntity.ok(new Message<>("Add success"));
|
||||
}
|
||||
|
||||
@PutMapping(path = "/rule")
|
||||
@ApiOperation(value = "Modify existing notification policy information", notes = "修改已存在的通知策略信息")
|
||||
@ApiOperation(value = "修改通知策略", notes = "修改已存在的通知策略信息")
|
||||
public ResponseEntity<Message<Void>> editNoticeRule(@Valid @RequestBody NoticeRule noticeRule) {
|
||||
noticeConfigService.editNoticeRule(noticeRule);
|
||||
return ResponseEntity.ok(new Message<>("Edit success"));
|
||||
}
|
||||
|
||||
@DeleteMapping(path = "/rule/{id}")
|
||||
@ApiOperation(value = "Delete existing notification policy information", notes = "删除已存在的通知策略信息")
|
||||
@ApiOperation(value = "删除指定通知策略", notes = "删除已存在的通知策略信息")
|
||||
public ResponseEntity<Message<Void>> deleteNoticeRule(
|
||||
@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 不存在或删除成功都返回成功
|
||||
@ApiParam(value = "通知策略ID", example = "6565463543") @PathVariable("id") final Long ruleId) {
|
||||
// 不存在或删除成功都返回成功
|
||||
noticeConfigService.deleteNoticeRule(ruleId);
|
||||
return ResponseEntity.ok(new Message<>("Delete success"));
|
||||
}
|
||||
|
||||
@GetMapping(path = "/rules")
|
||||
@ApiOperation(value = "Get a list of message notification policies based on query filter items",
|
||||
notes = "根据查询过滤项获取消息通知策略列表")
|
||||
@ApiOperation(value = "查询消息通知策略", notes = "根据查询过滤项获取消息通知策略列表")
|
||||
public ResponseEntity<Message<List<NoticeRule>>> getRules(
|
||||
@ApiParam(value = "en: Recipient name,zh: 接收人名称,模糊查询", example = "rule1") @RequestParam(required = false) final String name) {
|
||||
@ApiParam(value = "接收人名称,模糊查询", example = "rule1") @RequestParam(required = false) final String name) {
|
||||
|
||||
Specification<NoticeRule> specification = (root, query, criteriaBuilder) -> {
|
||||
Predicate predicate = criteriaBuilder.conjunction();
|
||||
|
||||
@@ -18,13 +18,11 @@ import java.util.List;
|
||||
import static org.springframework.http.MediaType.APPLICATION_JSON_VALUE;
|
||||
|
||||
/**
|
||||
* System Summary Statistics API
|
||||
* 系统摘要统计API
|
||||
*
|
||||
* @author tom
|
||||
* @date 2021/12/7 15:57
|
||||
*/
|
||||
@Api(tags = "en: System Summary Statistics API,zh: 系统摘要统计API")
|
||||
@Api(tags = "系统摘要统计API")
|
||||
@RestController
|
||||
@RequestMapping(path = "/summary", produces = {APPLICATION_JSON_VALUE})
|
||||
public class SummaryController {
|
||||
@@ -33,7 +31,7 @@ public class SummaryController {
|
||||
private MonitorService monitorService;
|
||||
|
||||
@GetMapping
|
||||
@ApiOperation(value = "Query all application category monitoring statistics", notes = "查询所有应用类别监控统计信息")
|
||||
@ApiOperation(value = "查询应用类别监控统计", notes = "查询所有应用类别监控统计信息")
|
||||
public ResponseEntity<Message<Dashboard>> appMonitors() {
|
||||
List<AppCount> appsCount = monitorService.getAllAppMonitorsCount();
|
||||
Message<Dashboard> message = new Message<>(new Dashboard(appsCount));
|
||||
|
||||
@@ -14,7 +14,6 @@ import java.util.Set;
|
||||
|
||||
/**
|
||||
* AuthResources 数据库操作
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/14 11:24
|
||||
*/
|
||||
@@ -23,14 +22,12 @@ public interface MonitorDao extends JpaRepository<Monitor, Long>, JpaSpecificati
|
||||
|
||||
/**
|
||||
* 根据监控ID列表删除监控
|
||||
*
|
||||
* @param monitorIds 监控ID列表
|
||||
*/
|
||||
void deleteAllByIdIn(Set<Long> monitorIds);
|
||||
|
||||
/**
|
||||
* 根据监控ID列表查询监控
|
||||
*
|
||||
* @param monitorIds 监控ID列表
|
||||
* @return 监控列表
|
||||
*/
|
||||
@@ -38,7 +35,6 @@ public interface MonitorDao extends JpaRepository<Monitor, Long>, JpaSpecificati
|
||||
|
||||
/**
|
||||
* 根据监控类型查询监控
|
||||
*
|
||||
* @param app 监控类型
|
||||
* @return 监控列表
|
||||
*/
|
||||
@@ -46,35 +42,29 @@ public interface MonitorDao extends JpaRepository<Monitor, Long>, JpaSpecificati
|
||||
|
||||
/**
|
||||
* 查询已下发采集任务的监控
|
||||
*
|
||||
* @param status 监控状态
|
||||
* @return 监控列表
|
||||
*/
|
||||
List<Monitor> findMonitorsByStatusNotInAndAndJobIdNotNull(List<Byte> status);
|
||||
|
||||
/**
|
||||
* Query monitoring by monitoring name 根据监控名称查询监控
|
||||
*
|
||||
* @param name monitoring name 监控名称
|
||||
* @return monitoring list 监控列表
|
||||
* 根据监控名称查询监控
|
||||
* @param name 监控名称
|
||||
* @return 监控列表
|
||||
*/
|
||||
Optional<Monitor> findMonitorByNameEquals(String name);
|
||||
|
||||
/**
|
||||
* Query the monitoring category - the number of monitoring corresponding to the status
|
||||
* 查询监控类别-状态对应的监控数量
|
||||
*
|
||||
* @return Monitoring Category-Status and Monitoring Quantity Mapping 监控类别-状态与监控数量映射
|
||||
* @return 监控类别-状态与监控数量映射
|
||||
*/
|
||||
@Query("select new com.usthe.manager.pojo.dto.AppCount(mo.app, mo.status, COUNT(mo.id)) from Monitor mo group by mo.app, mo.status")
|
||||
List<AppCount> findAppsStatusCount();
|
||||
|
||||
/**
|
||||
* Update the status of the specified monitor
|
||||
* 更新指定监控的状态
|
||||
*
|
||||
* @param id Monitor ID 监控ID
|
||||
* @param status 监控状态 Monitor Status
|
||||
* @param id 监控ID
|
||||
* @param status 监控状态
|
||||
*/
|
||||
@Modifying
|
||||
@Query("update Monitor set status = :status where id = :id")
|
||||
|
||||
@@ -6,7 +6,7 @@ import org.springframework.core.annotation.Order;
|
||||
import org.springframework.stereotype.Service;
|
||||
|
||||
/**
|
||||
* Email delivery service 邮箱发送服务
|
||||
* 邮箱发送服务
|
||||
*
|
||||
* @author 花城
|
||||
* @version 1.0
|
||||
@@ -15,11 +15,9 @@ import org.springframework.stereotype.Service;
|
||||
public interface MailService {
|
||||
|
||||
/**
|
||||
* Build an alert email template
|
||||
* 构建告警邮件模版
|
||||
*
|
||||
* @param alert Alarm data element information 告警数据元信息
|
||||
* @return content of email 邮件内容
|
||||
* @param alert 告警信息
|
||||
* @return 邮件内容
|
||||
*/
|
||||
String buildAlertHtmlTemplate(Alert alert);
|
||||
}
|
||||
|
||||
@@ -15,7 +15,6 @@ import java.util.Set;
|
||||
|
||||
/**
|
||||
* 监控管理服务
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/14 11:28
|
||||
*/
|
||||
@@ -24,43 +23,38 @@ public interface MonitorService {
|
||||
|
||||
/**
|
||||
* 监控可用性探测
|
||||
*
|
||||
* @param monitor 监控实体信息
|
||||
* @param params 参数信息
|
||||
* @param params 参数信息
|
||||
* @throws MonitorDetectException 探测失败抛出
|
||||
*/
|
||||
void detectMonitor(Monitor monitor, List<Param> params) throws MonitorDetectException;
|
||||
|
||||
/**
|
||||
* 新增监控
|
||||
*
|
||||
* @param monitor 监控实体
|
||||
* @param params 参数信息
|
||||
* @param params 参数信息
|
||||
* @throws RuntimeException 新增过程异常抛出
|
||||
*/
|
||||
void addMonitor(Monitor monitor, List<Param> params) throws RuntimeException;
|
||||
|
||||
/**
|
||||
* 校验请求数据参数正确性
|
||||
*
|
||||
* @param monitorDto monitorDto
|
||||
* @param isModify 是否是修改监控
|
||||
* @param isModify 是否是修改监控
|
||||
* @throws IllegalArgumentException 校验参数错误抛出
|
||||
*/
|
||||
void validate(MonitorDto monitorDto, Boolean isModify) throws IllegalArgumentException;
|
||||
|
||||
/**
|
||||
* 修改更新监控
|
||||
*
|
||||
* @param monitor 监控实体
|
||||
* @param params 参数信息
|
||||
* @param params 参数信息
|
||||
* @throws RuntimeException 修改过程中异常抛出
|
||||
*/
|
||||
void modifyMonitor(Monitor monitor, List<Param> params) throws RuntimeException;
|
||||
|
||||
/**
|
||||
* 删除监控
|
||||
*
|
||||
* @param id 监控ID
|
||||
* @throws RuntimeException 删除过程中异常抛出
|
||||
*/
|
||||
@@ -68,7 +62,6 @@ public interface MonitorService {
|
||||
|
||||
/**
|
||||
* 批量删除监控
|
||||
*
|
||||
* @param ids 监控ID
|
||||
* @throws RuntimeException 删除过程中异常抛出
|
||||
*/
|
||||
@@ -76,7 +69,6 @@ public interface MonitorService {
|
||||
|
||||
/**
|
||||
* 获取监控信息
|
||||
*
|
||||
* @param id 监控ID
|
||||
* @return MonitorDto
|
||||
* @throws RuntimeException 查询过程中异常抛出
|
||||
@@ -85,55 +77,46 @@ public interface MonitorService {
|
||||
|
||||
/**
|
||||
* 动态条件查询
|
||||
*
|
||||
* @param specification 查询条件
|
||||
* @param pageRequest 分页参数
|
||||
* @param pageRequest 分页参数
|
||||
* @return 查询结果
|
||||
*/
|
||||
Page<Monitor> getMonitors(Specification<Monitor> specification, PageRequest pageRequest);
|
||||
|
||||
/**
|
||||
* 根据监控ID列表批量取消纳管监控项
|
||||
*
|
||||
* @param ids 监控IDs
|
||||
*/
|
||||
void cancelManageMonitors(HashSet<Long> ids);
|
||||
|
||||
/**
|
||||
* 根据监控ID列表批量启动纳管监控项
|
||||
*
|
||||
* @param ids 监控IDs
|
||||
*/
|
||||
void enableManageMonitors(HashSet<Long> ids);
|
||||
|
||||
/**
|
||||
* 查询监控类别及其对应的监控数量
|
||||
*
|
||||
* @return 监控类别与监控数量映射
|
||||
*/
|
||||
List<AppCount> getAllAppMonitorsCount();
|
||||
|
||||
/**
|
||||
* Query monitoring
|
||||
* 查询监控
|
||||
*
|
||||
* @param monitorId Monitor ID 监控ID
|
||||
* @return Monitor information 监控信息
|
||||
* @param monitorId 监控ID
|
||||
* @return 监控信息
|
||||
*/
|
||||
Monitor getMonitor(Long monitorId);
|
||||
|
||||
/**
|
||||
* Update the status of the specified monitor
|
||||
* 更新指定监控的状态
|
||||
*
|
||||
* @param monitorId monitorId 监控ID
|
||||
* @param status monitor status 监控状态
|
||||
* @param monitorId 监控ID
|
||||
* @param status 监控状态
|
||||
*/
|
||||
void updateMonitorStatus(Long monitorId, byte status);
|
||||
|
||||
/**
|
||||
* 查询指定监控类型下的所有监控信息列表
|
||||
*
|
||||
* @param app 监控类型
|
||||
* @return 监控列表
|
||||
*/
|
||||
|
||||
@@ -8,86 +8,66 @@ import org.springframework.data.jpa.domain.Specification;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Message notification configuration interface
|
||||
* 消息通知配置接口
|
||||
*
|
||||
* @author tom
|
||||
* @date 2021/12/16 16:14
|
||||
*/
|
||||
public interface NoticeConfigService {
|
||||
|
||||
/**
|
||||
* Dynamic conditional query
|
||||
* 动态条件查询
|
||||
*
|
||||
* @param specification Query conditions 查询条件
|
||||
* @return Search result 查询结果
|
||||
* @param specification 查询条件
|
||||
* @return 查询结果
|
||||
*/
|
||||
List<NoticeReceiver> getNoticeReceivers(Specification<NoticeReceiver> specification);
|
||||
|
||||
/**
|
||||
* Dynamic conditional query
|
||||
* 动态条件查询
|
||||
*
|
||||
* @param specification Query conditions 查询条件
|
||||
* @return Search result 查询结果
|
||||
* @param specification 查询条件
|
||||
* @return 查询结果
|
||||
*/
|
||||
List<NoticeRule> getNoticeRules(Specification<NoticeRule> specification);
|
||||
|
||||
/**
|
||||
* Add a notification recipient
|
||||
* 新增一个通知接收人
|
||||
*
|
||||
* @param noticeReceiver recipient information 接收人信息
|
||||
* @param noticeReceiver 接收人信息
|
||||
*/
|
||||
void addReceiver(NoticeReceiver noticeReceiver);
|
||||
|
||||
/**
|
||||
* Modify notification recipients
|
||||
* 修改通知接收人
|
||||
*
|
||||
* @param noticeReceiver recipient information 接收人信息
|
||||
* @param noticeReceiver 接收人信息
|
||||
*/
|
||||
void editReceiver(NoticeReceiver noticeReceiver);
|
||||
|
||||
/**
|
||||
* Delete recipient information based on recipient ID
|
||||
* 根据接收人ID删除接收人信息
|
||||
*
|
||||
* @param receiverId Recipient ID 接收人ID
|
||||
* @param receiverId 接收人ID
|
||||
*/
|
||||
void deleteReceiver(Long receiverId);
|
||||
|
||||
/**
|
||||
* Added notification policy
|
||||
* 新增通知策略
|
||||
*
|
||||
* @param noticeRule Notification strategy 通知策略
|
||||
* @param noticeRule 通知策略
|
||||
*/
|
||||
void addNoticeRule(NoticeRule noticeRule);
|
||||
|
||||
/**
|
||||
* Modify Notification Policy
|
||||
* 修改通知策略
|
||||
*
|
||||
* @param noticeRule Notification strategy 通知策略
|
||||
* @param noticeRule 通知策略
|
||||
*/
|
||||
void editNoticeRule(NoticeRule noticeRule);
|
||||
|
||||
/**
|
||||
* Delete the specified notification policy
|
||||
* 删除指定的通知策略
|
||||
*
|
||||
* @param ruleId Notification Policy ID 通知策略ID
|
||||
* @param ruleId 通知策略ID
|
||||
*/
|
||||
void deleteNoticeRule(Long ruleId);
|
||||
|
||||
/**
|
||||
* According to the alarm information matching all notification policies, filter out the recipients who need to be notified
|
||||
* 根据告警信息与所有通知策略匹配,过滤出需要通知的接收人
|
||||
*
|
||||
* @param alert Alarm information 告警信息
|
||||
* @return Receiver 接收人
|
||||
* @param alert 告警信息
|
||||
* @return 接收人
|
||||
*/
|
||||
List<NoticeReceiver> getReceiverFilterRule(Alert alert);
|
||||
}
|
||||
|
||||
@@ -40,7 +40,6 @@ import java.util.stream.Collectors;
|
||||
|
||||
/**
|
||||
* 监控管理服务实现
|
||||
*
|
||||
* @author tomsun28
|
||||
* @date 2021/11/14 13:06
|
||||
*/
|
||||
@@ -392,8 +391,7 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
if (appCounts == null) {
|
||||
return null;
|
||||
}
|
||||
//Statistical category information, calculate the number of corresponding states for each monitor
|
||||
//统计类别信息,计算每个监控分别对应状态的数量
|
||||
// 关联大类别信息 计算每个状态对应数量
|
||||
Map<String, AppCount> appCountMap = new HashMap<>(appCounts.size());
|
||||
for (AppCount item : appCounts) {
|
||||
AppCount appCount = appCountMap.getOrDefault(item.getApp(), new AppCount());
|
||||
@@ -411,13 +409,10 @@ public class MonitorServiceImpl implements MonitorService {
|
||||
case CommonConstants.UN_REACHABLE_CODE:
|
||||
appCount.setUnReachableSize(appCount.getUnReachableSize() + item.getSize());
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
default: break;
|
||||
}
|
||||
appCountMap.put(item.getApp(), appCount);
|
||||
}
|
||||
//Traverse the map obtained by statistics and convert it into a List<App Count> result set
|
||||
//遍历统计得到的map,转换成List<App Count>结果集
|
||||
return appCountMap.values().stream().peek(item -> {
|
||||
item.setSize(item.getAvailableSize() + item.getUnManageSize()
|
||||
+ item.getUnReachableSize() + item.getUnAvailableSize());
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
@@ -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,26 +16,28 @@
|
||||
<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)="onFilterSearchAlerts()">
|
||||
{{ '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()"
|
||||
[(ngModel)]="filterContent"
|
||||
@@ -43,23 +45,24 @@
|
||||
<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;
|
||||
@@ -87,13 +94,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 +109,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 +123,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 +140,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 +153,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 +166,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 +181,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 +202,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;
|
||||
@@ -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,58 +47,66 @@
|
||||
>
|
||||
</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
|
||||
><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
|
||||
><p style="text-align: left">{{ monitor?.gmtUpdate | date: 'YYYY-MM-dd HH:mm:ss' }}</p></div
|
||||
>
|
||||
</div>
|
||||
</nz-card>
|
||||
@@ -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 内容,我们始终认为应用信息一般都会受当前用户授权范围而影响
|
||||
|
||||
@@ -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