Compare commits
4 Commits
bugfix#ora
...
fix_tanClo
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3d65fe3861 | ||
|
|
f3bd9930f1 | ||
|
|
dc61dd066c | ||
|
|
4ad7972956 |
6
.gitignore
vendored
6
.gitignore
vendored
@@ -37,10 +37,4 @@ nbdist/
|
|||||||
### VS Code ###
|
### VS Code ###
|
||||||
.vscode/
|
.vscode/
|
||||||
|
|
||||||
# dependencies
|
|
||||||
node_modules
|
|
||||||
.docusaurus
|
|
||||||
yarn.lock
|
|
||||||
|
|
||||||
# debug env
|
|
||||||
application-dev.yml
|
application-dev.yml
|
||||||
@@ -35,7 +35,7 @@
|
|||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
[](https://www.bilibili.com/video/BV1DY4y1i7ts)
|
[](https://www.bilibili.com/video/BV1Vi4y1f7i8)
|
||||||
|
|
||||||
----
|
----
|
||||||
|
|
||||||
@@ -76,7 +76,7 @@
|
|||||||
|
|
||||||
##### 安装TDengine
|
##### 安装TDengine
|
||||||
1. docker安装TDengine
|
1. docker安装TDengine
|
||||||
`docker run -d -p 6030-6049:6030-6049 -p 6030-6049:6030-6049/udp --name tdengine tdengine/tdengine:2.4.0.12`
|
`docker run -d -p 6030-6049:6030-6049 -p 6030-6049:6030-6049/tcp -p 6030-6049:6030-6049/udp --name tdengine tdengine/tdengine:2.4.0.12`
|
||||||
2. 创建名称为hertzbeat的数据库
|
2. 创建名称为hertzbeat的数据库
|
||||||
|
|
||||||
详细步骤参考 [依赖服务TDengine安装初始化](https://hertzbeat.com/docs/start/tdengine-init)
|
详细步骤参考 [依赖服务TDengine安装初始化](https://hertzbeat.com/docs/start/tdengine-init)
|
||||||
@@ -93,7 +93,6 @@
|
|||||||
1. 下载您系统环境对应的安装包 [GITEE Release](https://gitee.com/dromara/hertzbeat/releases) [GITHUB Release](https://github.com/dromara/hertzbeat/releases)
|
1. 下载您系统环境对应的安装包 [GITEE Release](https://gitee.com/dromara/hertzbeat/releases) [GITHUB Release](https://github.com/dromara/hertzbeat/releases)
|
||||||
2. 配置HertzBeat的配置文件 hertzbeat/config/application.yml
|
2. 配置HertzBeat的配置文件 hertzbeat/config/application.yml
|
||||||
3. 部署启动 `$ ./startup.sh `
|
3. 部署启动 `$ ./startup.sh `
|
||||||
4. 浏览器访问 localhost:1157 即可开始,默认账号密码 admin/admin
|
|
||||||
|
|
||||||
详细步骤参考 [通过安装包安装HertzBeat](https://hertzbeat.com/docs/start/package-deploy)
|
详细步骤参考 [通过安装包安装HertzBeat](https://hertzbeat.com/docs/start/package-deploy)
|
||||||
|
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ public class CalculateAlarm {
|
|||||||
} else {
|
} else {
|
||||||
// 其他异常
|
// 其他异常
|
||||||
alertBuilder.target(CommonConstants.AVAILABLE)
|
alertBuilder.target(CommonConstants.AVAILABLE)
|
||||||
.content("监控可用性告警: " + metricsData.getCode().name() + " : " + metricsData.getMsg());
|
.content("监控紧急可用性告警: " + metricsData.getCode().name());
|
||||||
triggeredMonitorStateAlertMap.put(monitorId, metricsData.getCode());
|
triggeredMonitorStateAlertMap.put(monitorId, metricsData.getCode());
|
||||||
dataQueue.addAlertData(alertBuilder.build());
|
dataQueue.addAlertData(alertBuilder.build());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -115,11 +115,6 @@
|
|||||||
<artifactId>ojdbc8</artifactId>
|
<artifactId>ojdbc8</artifactId>
|
||||||
<version>21.5.0.0</version>
|
<version>21.5.0.0</version>
|
||||||
</dependency>
|
</dependency>
|
||||||
<dependency>
|
|
||||||
<groupId>com.oracle.database.nls</groupId>
|
|
||||||
<artifactId>orai18n</artifactId>
|
|
||||||
<version>21.5.0.0</version>
|
|
||||||
</dependency>
|
|
||||||
</dependencies>
|
</dependencies>
|
||||||
|
|
||||||
</project>
|
</project>
|
||||||
@@ -108,8 +108,8 @@ public class CommonHttpClient {
|
|||||||
.setConnectTimeout(CONNECT_TIMEOUT)
|
.setConnectTimeout(CONNECT_TIMEOUT)
|
||||||
// 数据传输最大响应间隔时间
|
// 数据传输最大响应间隔时间
|
||||||
.setSocketTimeout(SOCKET_TIMEOUT)
|
.setSocketTimeout(SOCKET_TIMEOUT)
|
||||||
// 遇到301 302自动重定向跳转
|
// 遇到301 302不自动重定向跳转
|
||||||
.setRedirectsEnabled(true)
|
.setRedirectsEnabled(false)
|
||||||
.build();
|
.build();
|
||||||
// 连接池
|
// 连接池
|
||||||
connectionManager = new PoolingHttpClientConnectionManager(registry);
|
connectionManager = new PoolingHttpClientConnectionManager(registry);
|
||||||
|
|||||||
@@ -7,7 +7,6 @@ import com.google.gson.JsonParser;
|
|||||||
import com.usthe.collector.collect.AbstractCollect;
|
import com.usthe.collector.collect.AbstractCollect;
|
||||||
import com.usthe.collector.collect.common.http.CommonHttpClient;
|
import com.usthe.collector.collect.common.http.CommonHttpClient;
|
||||||
import com.usthe.collector.dispatch.DispatchConstants;
|
import com.usthe.collector.dispatch.DispatchConstants;
|
||||||
import com.usthe.collector.util.CollectUtil;
|
|
||||||
import com.usthe.collector.util.CollectorConstants;
|
import com.usthe.collector.util.CollectorConstants;
|
||||||
import com.usthe.collector.util.JsonPathParser;
|
import com.usthe.collector.util.JsonPathParser;
|
||||||
import com.usthe.common.entity.job.Metrics;
|
import com.usthe.common.entity.job.Metrics;
|
||||||
@@ -101,7 +100,7 @@ public class HttpCollectImpl extends AbstractCollect {
|
|||||||
String parseType = metrics.getHttp().getParseType();
|
String parseType = metrics.getHttp().getParseType();
|
||||||
try {
|
try {
|
||||||
if (DispatchConstants.PARSE_DEFAULT.equals(parseType)) {
|
if (DispatchConstants.PARSE_DEFAULT.equals(parseType)) {
|
||||||
parseResponseByDefault(resp, metrics.getAliasFields(), metrics.getHttp(), builder, responseTime);
|
parseResponseByDefault(resp, metrics.getAliasFields(), builder, responseTime);
|
||||||
} else if (DispatchConstants.PARSE_JSON_PATH.equals(parseType)) {
|
} else if (DispatchConstants.PARSE_JSON_PATH.equals(parseType)) {
|
||||||
parseResponseByJsonPath(resp, metrics.getAliasFields(), metrics.getHttp(), builder, responseTime);
|
parseResponseByJsonPath(resp, metrics.getAliasFields(), metrics.getHttp(), builder, responseTime);
|
||||||
} else if (DispatchConstants.PARSE_PROMETHEUS.equals(parseType)) {
|
} else if (DispatchConstants.PARSE_PROMETHEUS.equals(parseType)) {
|
||||||
@@ -109,11 +108,11 @@ public class HttpCollectImpl extends AbstractCollect {
|
|||||||
} else if (DispatchConstants.PARSE_XML_PATH.equals(parseType)) {
|
} else if (DispatchConstants.PARSE_XML_PATH.equals(parseType)) {
|
||||||
parseResponseByXmlPath(resp, metrics.getAliasFields(), metrics.getHttp(), builder);
|
parseResponseByXmlPath(resp, metrics.getAliasFields(), metrics.getHttp(), builder);
|
||||||
} else if (DispatchConstants.PARSE_WEBSITE.equals(parseType)){
|
} else if (DispatchConstants.PARSE_WEBSITE.equals(parseType)){
|
||||||
parseResponseByWebsite(resp, metrics.getAliasFields(), metrics.getHttp(), builder, responseTime);
|
parseResponseByWebsite(resp, metrics.getAliasFields(), builder, responseTime);
|
||||||
} else if (DispatchConstants.PARSE_SITE_MAP.equals(parseType)) {
|
} else if (DispatchConstants.PARSE_SITE_MAP.equals(parseType)) {
|
||||||
parseResponseBySiteMap(resp, metrics.getAliasFields(), builder);
|
parseResponseBySiteMap(resp, metrics.getAliasFields(), builder);
|
||||||
} else {
|
} else {
|
||||||
parseResponseByDefault(resp, metrics.getAliasFields(), metrics.getHttp(), builder, responseTime);
|
parseResponseByDefault(resp, metrics.getAliasFields(), builder, responseTime);
|
||||||
}
|
}
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.info("parse error: {}.", e.getMessage(), e);
|
log.info("parse error: {}.", e.getMessage(), e);
|
||||||
@@ -170,16 +169,13 @@ public class HttpCollectImpl extends AbstractCollect {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseResponseByWebsite(String resp, List<String> aliasFields, HttpProtocol http,
|
private void parseResponseByWebsite(String resp, List<String> aliasFields,
|
||||||
CollectRep.MetricsData.Builder builder, Long responseTime) {
|
CollectRep.MetricsData.Builder builder, Long responseTime) {
|
||||||
CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder();
|
CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder();
|
||||||
// 网站关键词数量监测
|
// todo resp 网站关键字监测
|
||||||
int keywordNum = CollectUtil.countMatchKeyword(resp, http.getKeyword());
|
|
||||||
for (String alias : aliasFields) {
|
for (String alias : aliasFields) {
|
||||||
if (CollectorConstants.RESPONSE_TIME.equalsIgnoreCase(alias)) {
|
if (CollectorConstants.RESPONSE_TIME.equalsIgnoreCase(alias)) {
|
||||||
valueRowBuilder.addColumns(responseTime.toString());
|
valueRowBuilder.addColumns(responseTime.toString());
|
||||||
} else if (CollectorConstants.KEYWORD.equalsIgnoreCase(alias)) {
|
|
||||||
valueRowBuilder.addColumns(Integer.toString(keywordNum));
|
|
||||||
} else {
|
} else {
|
||||||
valueRowBuilder.addColumns(CommonConstants.NULL_VALUE);
|
valueRowBuilder.addColumns(CommonConstants.NULL_VALUE);
|
||||||
}
|
}
|
||||||
@@ -281,7 +277,6 @@ public class HttpCollectImpl extends AbstractCollect {
|
|||||||
private void parseResponseByJsonPath(String resp, List<String> aliasFields, HttpProtocol http,
|
private void parseResponseByJsonPath(String resp, List<String> aliasFields, HttpProtocol http,
|
||||||
CollectRep.MetricsData.Builder builder, Long responseTime) {
|
CollectRep.MetricsData.Builder builder, Long responseTime) {
|
||||||
List<Map<String, Object>> results = JsonPathParser.parseContentWithJsonPath(resp, http.getParseScript());
|
List<Map<String, Object>> results = JsonPathParser.parseContentWithJsonPath(resp, http.getParseScript());
|
||||||
int keywordNum = CollectUtil.countMatchKeyword(resp, http.getKeyword());
|
|
||||||
for (Map<String, Object> stringMap : results) {
|
for (Map<String, Object> stringMap : results) {
|
||||||
CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder();
|
CollectRep.ValueRow.Builder valueRowBuilder = CollectRep.ValueRow.newBuilder();
|
||||||
for (String alias : aliasFields) {
|
for (String alias : aliasFields) {
|
||||||
@@ -291,8 +286,6 @@ public class HttpCollectImpl extends AbstractCollect {
|
|||||||
} else {
|
} else {
|
||||||
if (CollectorConstants.RESPONSE_TIME.equalsIgnoreCase(alias)) {
|
if (CollectorConstants.RESPONSE_TIME.equalsIgnoreCase(alias)) {
|
||||||
valueRowBuilder.addColumns(responseTime.toString());
|
valueRowBuilder.addColumns(responseTime.toString());
|
||||||
} else if (CollectorConstants.KEYWORD.equalsIgnoreCase(alias)) {
|
|
||||||
valueRowBuilder.addColumns(Integer.toString(keywordNum));
|
|
||||||
} else {
|
} else {
|
||||||
valueRowBuilder.addColumns(CommonConstants.NULL_VALUE);
|
valueRowBuilder.addColumns(CommonConstants.NULL_VALUE);
|
||||||
}
|
}
|
||||||
@@ -307,10 +300,9 @@ public class HttpCollectImpl extends AbstractCollect {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseResponseByDefault(String resp, List<String> aliasFields, HttpProtocol http,
|
private void parseResponseByDefault(String resp, List<String> aliasFields,
|
||||||
CollectRep.MetricsData.Builder builder, Long responseTime) {
|
CollectRep.MetricsData.Builder builder, Long responseTime) {
|
||||||
JsonElement element = JsonParser.parseString(resp);
|
JsonElement element = JsonParser.parseString(resp);
|
||||||
int keywordNum = CollectUtil.countMatchKeyword(resp, http.getKeyword());
|
|
||||||
if (element.isJsonArray()) {
|
if (element.isJsonArray()) {
|
||||||
JsonArray array = element.getAsJsonArray();
|
JsonArray array = element.getAsJsonArray();
|
||||||
for (JsonElement jsonElement : array) {
|
for (JsonElement jsonElement : array) {
|
||||||
@@ -325,8 +317,6 @@ public class HttpCollectImpl extends AbstractCollect {
|
|||||||
} else {
|
} else {
|
||||||
if (CollectorConstants.RESPONSE_TIME.equalsIgnoreCase(alias)) {
|
if (CollectorConstants.RESPONSE_TIME.equalsIgnoreCase(alias)) {
|
||||||
valueRowBuilder.addColumns(responseTime.toString());
|
valueRowBuilder.addColumns(responseTime.toString());
|
||||||
} else if (CollectorConstants.KEYWORD.equalsIgnoreCase(alias)) {
|
|
||||||
valueRowBuilder.addColumns(Integer.toString(keywordNum));
|
|
||||||
} else {
|
} else {
|
||||||
valueRowBuilder.addColumns(CommonConstants.NULL_VALUE);
|
valueRowBuilder.addColumns(CommonConstants.NULL_VALUE);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -105,13 +105,9 @@ public class CommonDispatcher implements MetricsTaskDispatch, CollectDataDispatc
|
|||||||
.setId(timerJob.getJob().getMonitorId())
|
.setId(timerJob.getJob().getMonitorId())
|
||||||
.setApp(timerJob.getJob().getApp())
|
.setApp(timerJob.getJob().getApp())
|
||||||
.setMetrics(metricsTime.getMetrics().getName())
|
.setMetrics(metricsTime.getMetrics().getName())
|
||||||
.setPriority(metricsTime.getMetrics().getPriority())
|
|
||||||
.setTime(System.currentTimeMillis())
|
.setTime(System.currentTimeMillis())
|
||||||
.setCode(CollectRep.Code.TIMEOUT).setMsg("collect timeout").build();
|
.setCode(CollectRep.Code.TIMEOUT).setMsg("collect timeout").build();
|
||||||
log.error("[Collect Timeout]: \n{}", metricsData);
|
dispatchCollectData(metricsTime.timeout, metricsTime.getMetrics(), metricsData);
|
||||||
if (metricsData.getPriority() == 0) {
|
|
||||||
dispatchCollectData(metricsTime.timeout, metricsTime.getMetrics(), metricsData);
|
|
||||||
}
|
|
||||||
metricsTimeoutMonitorMap.remove(entry.getKey());
|
metricsTimeoutMonitorMap.remove(entry.getKey());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -169,8 +165,8 @@ public class CommonDispatcher implements MetricsTaskDispatch, CollectDataDispatc
|
|||||||
metricsSet.forEach(metricItem -> {
|
metricsSet.forEach(metricItem -> {
|
||||||
MetricsCollect metricsCollect = new MetricsCollect(metricItem, timeout, this);
|
MetricsCollect metricsCollect = new MetricsCollect(metricItem, timeout, this);
|
||||||
jobRequestQueue.addJob(metricsCollect);
|
jobRequestQueue.addJob(metricsCollect);
|
||||||
metricsTimeoutMonitorMap.put(job.getId() + "-" + metricItem.getName(),
|
metricsTimeoutMonitorMap.put(job.getId() + "-" + metrics.getName(),
|
||||||
new MetricsTime(System.currentTimeMillis(), metricItem, timeout));
|
new MetricsTime(System.currentTimeMillis(), metrics, timeout));
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// 当前执行级别的指标组列表未全执行完成,
|
// 当前执行级别的指标组列表未全执行完成,
|
||||||
@@ -189,8 +185,8 @@ public class CommonDispatcher implements MetricsTaskDispatch, CollectDataDispatc
|
|||||||
metricsSet.forEach(metricItem -> {
|
metricsSet.forEach(metricItem -> {
|
||||||
MetricsCollect metricsCollect = new MetricsCollect(metricItem, timeout, this);
|
MetricsCollect metricsCollect = new MetricsCollect(metricItem, timeout, this);
|
||||||
jobRequestQueue.addJob(metricsCollect);
|
jobRequestQueue.addJob(metricsCollect);
|
||||||
metricsTimeoutMonitorMap.put(job.getId() + "-" + metricItem.getName(),
|
metricsTimeoutMonitorMap.put(job.getId() + "-" + metrics.getName(),
|
||||||
new MetricsTime(System.currentTimeMillis(), metricItem, timeout));
|
new MetricsTime(System.currentTimeMillis(), metrics, timeout));
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
// 当前执行级别的指标组列表未全执行完成,
|
// 当前执行级别的指标组列表未全执行完成,
|
||||||
|
|||||||
@@ -34,10 +34,6 @@ import java.util.stream.Collectors;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
@Data
|
@Data
|
||||||
public class MetricsCollect implements Runnable, Comparable<MetricsCollect> {
|
public class MetricsCollect implements Runnable, Comparable<MetricsCollect> {
|
||||||
/**
|
|
||||||
* 调度告警阈值时间 100ms
|
|
||||||
*/
|
|
||||||
private static final long WARN_DISPATCH_TIME = 100;
|
|
||||||
/**
|
/**
|
||||||
* 监控ID
|
* 监控ID
|
||||||
*/
|
*/
|
||||||
@@ -247,10 +243,6 @@ public class MetricsCollect implements Runnable, Comparable<MetricsCollect> {
|
|||||||
value = aliasFieldValueMap.get(realField);
|
value = aliasFieldValueMap.get(realField);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// 处理可能带单位的指标数值 比如 34%, 34Mb,并将数值小数点限制到4位
|
|
||||||
if (CommonConstants.TYPE_NUMBER == field.getType()) {
|
|
||||||
value = CommonUtil.parseDoubleStr(value, field.getUnit());
|
|
||||||
}
|
|
||||||
if (value == null) {
|
if (value == null) {
|
||||||
value = CommonConstants.NULL_VALUE;
|
value = CommonConstants.NULL_VALUE;
|
||||||
}
|
}
|
||||||
@@ -275,15 +267,11 @@ public class MetricsCollect implements Runnable, Comparable<MetricsCollect> {
|
|||||||
private CollectRep.MetricsData validateResponse(CollectRep.MetricsData.Builder builder) {
|
private CollectRep.MetricsData validateResponse(CollectRep.MetricsData.Builder builder) {
|
||||||
long endTime = System.currentTimeMillis();
|
long endTime = System.currentTimeMillis();
|
||||||
builder.setTime(endTime);
|
builder.setTime(endTime);
|
||||||
long runningTime = endTime - startTime;
|
log.debug("[Collect]: newTime: {}, startTime: {}, spendTime: {}.", newTime, startTime, endTime - startTime);
|
||||||
long allTime = endTime - newTime;
|
|
||||||
if (startTime - newTime >= WARN_DISPATCH_TIME) {
|
|
||||||
log.warn("[Collector Dispatch Warn, Dispatch Use {}ms.", startTime - newTime);
|
|
||||||
}
|
|
||||||
if (builder.getCode() != CollectRep.Code.SUCCESS) {
|
if (builder.getCode() != CollectRep.Code.SUCCESS) {
|
||||||
log.info("[Collect Failed, Run {}ms, All {}ms] Reason: {}", runningTime, allTime, builder.getMsg());
|
log.info("[Collect Fail] Reason: {}", builder.getMsg());
|
||||||
} else {
|
} else {
|
||||||
log.info("[Collect Success, Run {}ms, All {}ms].", runningTime, allTime);
|
log.info("[Collect Success].");
|
||||||
}
|
}
|
||||||
return builder.build();
|
return builder.build();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
package com.usthe.collector.util;
|
|
||||||
|
|
||||||
import java.util.regex.Matcher;
|
|
||||||
import java.util.regex.Pattern;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 采集器工具类
|
|
||||||
* @author tom
|
|
||||||
* @date 2022/4/6 09:35
|
|
||||||
*/
|
|
||||||
public class CollectUtil {
|
|
||||||
|
|
||||||
/**
|
|
||||||
* 关键字匹配计数
|
|
||||||
* @param content 内容
|
|
||||||
* @param keyword 关键字
|
|
||||||
* @return 匹配次数
|
|
||||||
*/
|
|
||||||
public static int countMatchKeyword(String content, String keyword) {
|
|
||||||
if (content == null || "".equals(content) || keyword == null || "".equals(keyword.trim())) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
Pattern pattern = Pattern.compile(keyword);
|
|
||||||
Matcher matcher = pattern.matcher(content);
|
|
||||||
int count = 0;
|
|
||||||
while (matcher.find()) {
|
|
||||||
count++;
|
|
||||||
}
|
|
||||||
return count;
|
|
||||||
} catch (Exception e) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -9,8 +9,6 @@ public interface CollectorConstants {
|
|||||||
|
|
||||||
String RESPONSE_TIME = "responseTime";
|
String RESPONSE_TIME = "responseTime";
|
||||||
|
|
||||||
String KEYWORD = "keyword";
|
|
||||||
|
|
||||||
String STATUS_CODE = "statusCode";
|
String STATUS_CODE = "statusCode";
|
||||||
|
|
||||||
String ERROR_MSG = "errorMsg";
|
String ERROR_MSG = "errorMsg";
|
||||||
|
|||||||
@@ -4,7 +4,6 @@ import org.apache.commons.net.telnet.TelnetClient;
|
|||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.net.ConnectException;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
import static org.junit.jupiter.api.Assertions.*;
|
||||||
|
|
||||||
@@ -21,7 +20,7 @@ class TelnetCollectImplTest {
|
|||||||
telnetClient = new TelnetClient("vt200");
|
telnetClient = new TelnetClient("vt200");
|
||||||
telnetClient.setConnectTimeout(5000);
|
telnetClient.setConnectTimeout(5000);
|
||||||
TelnetClient finalTelnetClient = telnetClient;
|
TelnetClient finalTelnetClient = telnetClient;
|
||||||
assertThrows(ConnectException.class,() -> finalTelnetClient.connect("127.0.0.1",0));
|
assertDoesNotThrow(() -> finalTelnetClient.connect("baidu.com",80));
|
||||||
telnetClient.disconnect();
|
telnetClient.disconnect();
|
||||||
} catch (IOException e) {
|
} catch (IOException e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
@@ -49,6 +49,7 @@ public class HttpProtocol {
|
|||||||
* http请求携带的请求体
|
* http请求携带的请求体
|
||||||
*/
|
*/
|
||||||
private String payload;
|
private String payload;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 认证信息
|
* 认证信息
|
||||||
*/
|
*/
|
||||||
@@ -65,10 +66,6 @@ public class HttpProtocol {
|
|||||||
* 数据解析脚本 当解析方式为 jsonPath or xmlPath时存在
|
* 数据解析脚本 当解析方式为 jsonPath or xmlPath时存在
|
||||||
*/
|
*/
|
||||||
private String parseScript;
|
private String parseScript;
|
||||||
/**
|
|
||||||
* 内容关键字
|
|
||||||
*/
|
|
||||||
private String keyword;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 认证信息
|
* 认证信息
|
||||||
|
|||||||
@@ -122,12 +122,6 @@ public class ParamDefine {
|
|||||||
@ApiModelProperty(value = "当type为key-value时有效,表示value的别名描述", example = "Value", accessMode = READ_WRITE, position = 10)
|
@ApiModelProperty(value = "当type为key-value时有效,表示value的别名描述", example = "Value", accessMode = READ_WRITE, position = 10)
|
||||||
private String valueAlias;
|
private String valueAlias;
|
||||||
|
|
||||||
/**
|
|
||||||
* 是否是高级隐藏参数 true-是 false-否
|
|
||||||
*/
|
|
||||||
@ApiModelProperty(value = "是否是高级隐藏参数 true-是 false-否", example = "true", accessMode = READ_WRITE, position = 11)
|
|
||||||
private boolean hide = false;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 此条记录创建者
|
* 此条记录创建者
|
||||||
*/
|
*/
|
||||||
|
|||||||
@@ -2,8 +2,6 @@ package com.usthe.common.util;
|
|||||||
|
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
import java.math.BigDecimal;
|
|
||||||
import java.math.RoundingMode;
|
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
@@ -17,7 +15,7 @@ public class CommonUtil {
|
|||||||
|
|
||||||
private static final Pattern EMAIL_PATTERN = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
|
private static final Pattern EMAIL_PATTERN = Pattern.compile("\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*");
|
||||||
|
|
||||||
private static final Pattern PHONE_PATTERN = Pattern.compile("^(((13[0-9])|(14[0-9])|(15[0-9])|(16[0-9])|(19[0-9])|(18[0-9])|(17[0-9]))+\\d{8})?$");
|
private static final Pattern PHONE_PATTERN = Pattern.compile("^(((13[0-9])|(15[0-9])|(18[0-9])|(17[0-9]))+\\d{8})?$");
|
||||||
|
|
||||||
private static final int PHONE_LENGTH = 11;
|
private static final int PHONE_LENGTH = 11;
|
||||||
|
|
||||||
@@ -38,30 +36,6 @@ public class CommonUtil {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* 将字符串str,此字符串可能带单位,转换为double数字类型
|
|
||||||
* 将数值小数点限制到4位
|
|
||||||
* @param str string
|
|
||||||
* @param unit 字符串单位
|
|
||||||
* @return string格式的 double 数字 小数点最大到4位
|
|
||||||
*/
|
|
||||||
public static String parseDoubleStr(String str, String unit) {
|
|
||||||
if (str == null || "".equals(str)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
if (unit != null && str.endsWith(unit)) {
|
|
||||||
str = str.substring(0, str.length() - unit.length());
|
|
||||||
}
|
|
||||||
BigDecimal bigDecimal = new BigDecimal(str);
|
|
||||||
double value = bigDecimal.setScale(4, RoundingMode.HALF_UP).doubleValue();
|
|
||||||
return String.valueOf(value);
|
|
||||||
} catch (Exception e) {
|
|
||||||
log.debug(e.getMessage(), e);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 邮箱格式校验
|
* 邮箱格式校验
|
||||||
* @param email 邮箱
|
* @param email 邮箱
|
||||||
|
|||||||
@@ -1,40 +0,0 @@
|
|||||||
package com.usthe.common.util;
|
|
||||||
|
|
||||||
import org.junit.jupiter.api.Test;
|
|
||||||
|
|
||||||
import static org.junit.jupiter.api.Assertions.*;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @author tom
|
|
||||||
* @date 2022/4/7 17:18
|
|
||||||
*/
|
|
||||||
class CommonUtilTest {
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void testParseDoubleStr() {
|
|
||||||
assertEquals("9.3454",CommonUtil.parseDoubleStr("9.345435345", null));
|
|
||||||
assertEquals("9.3454",CommonUtil.parseDoubleStr("9.345435345%", "%"));
|
|
||||||
assertEquals("10.0",CommonUtil.parseDoubleStr("10%", "%"));
|
|
||||||
assertEquals("588.0",CommonUtil.parseDoubleStr("588Mb", "Mb"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void validateEmail() {
|
|
||||||
assertTrue(CommonUtil.validateEmail("tom@usthe.com"));
|
|
||||||
assertTrue(CommonUtil.validateEmail("demo@qq.com"));
|
|
||||||
assertFalse(CommonUtil.validateEmail("tom.usthe.com"));
|
|
||||||
}
|
|
||||||
|
|
||||||
@Test
|
|
||||||
void validatePhoneNum() {
|
|
||||||
assertTrue(CommonUtil.validatePhoneNum("19234554432"));
|
|
||||||
assertTrue(CommonUtil.validatePhoneNum("13234554432"));
|
|
||||||
assertTrue(CommonUtil.validatePhoneNum("14234554432"));
|
|
||||||
assertTrue(CommonUtil.validatePhoneNum("16234554432"));
|
|
||||||
assertFalse(CommonUtil.validatePhoneNum("12234554432"));
|
|
||||||
assertFalse(CommonUtil.validatePhoneNum("11234554432"));
|
|
||||||
assertFalse(CommonUtil.validatePhoneNum("35234554432"));
|
|
||||||
assertFalse(CommonUtil.validatePhoneNum("46234554432"));
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
@@ -1,92 +0,0 @@
|
|||||||
---
|
|
||||||
title: HertzBeat入GVP啦,并 v1.0.beta.7 发布,易用友好的云监控系统
|
|
||||||
author: tom
|
|
||||||
author_title: tom
|
|
||||||
author_url: https://github.com/tomsun28
|
|
||||||
author_image_url: https://avatars.githubusercontent.com/u/24788200?s=400&v=4
|
|
||||||
tags: [opensource]
|
|
||||||
---
|
|
||||||
|
|
||||||
|
|
||||||
HertzBeat赫兹跳动 是一个由Dromara孵化的支持网站,API,PING,端口,数据库,全站,操作系统等监控类型,支持阈值告警,告警通知(邮箱,webhook,钉钉,企业微信,飞书机器人),拥有易用友好的可视化操作界面的开源监控告警项目。
|
|
||||||
|
|
||||||
很高兴Hertzbeat被评定为GVP - Gitee最有价值开源项目!
|
|
||||||
|
|
||||||
|
|
||||||

|
|
||||||
|
|
||||||
老哥们帮忙在Gitee STAR起来,冲!https://gitee.com/dromara/hertzbeat
|
|
||||||
|
|
||||||
官网:hertzbeat.com | tancloud.cn
|
|
||||||
|
|
||||||
然后来说说最新的版本,这个版本看这么多feature,其实简单来说主要是这几个
|
|
||||||
|
|
||||||
支持了ORACLE数据库的监控,包括ORACLE的基本信息,表空间,连接数,TPS,QPS等指标
|
|
||||||
|
|
||||||
支持了LINUX的CPU利用率,内存利用率,磁盘占用相关指标,使LINUX监控贴合实际业务
|
|
||||||
|
|
||||||
还有前端参数支持了KEY-VALUE,以后我们就可以在页面上配置HTTP Headers等类似参数了,还有就是参数配置那优化改版,把非常用告警参数隐藏起来了,稍微好看些,然后支持了windows下bat启动脚本,更多的就是稳定性的提升和一些其它的小修复小需求啦!
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
版本特性:
|
|
||||||
|
|
||||||
1. feature 支持oracle数据库监控类型-xgf 由 @gf-8 贡献 thanks
|
|
||||||
2. feature oracle监控支持tablespace,连接数,qps,tps等指标
|
|
||||||
3. feature linux监控支持设置超时时间 (#49)
|
|
||||||
4. feature 检测网站SSL证书是否过期 (#50) 由 @weihongbin 提出 thanks
|
|
||||||
5. feature 页面配置参数支持KEY-VALUE数组(#57)
|
|
||||||
6. feature API和网站监控支持页面配置Headers和Params (#58)(#59)
|
|
||||||
7. feature API和网站监控支持页面配置 basic auth, digest auth (#60)
|
|
||||||
8. feature http 端口跟随SSL是否启用变更443或80 (#61)
|
|
||||||
9. feature 修改默认超时时间3000毫秒为6000毫秒 (#55)
|
|
||||||
10. feature:make tdengine optional, not required (#62)
|
|
||||||
11. feature:support win bat service (#65)
|
|
||||||
12. feature:support hide advanced params define (#68)
|
|
||||||
13. feature:enable auto redirect when 301 302 http code (#69)
|
|
||||||
14. feature:only collect available metrics when detect (#70)
|
|
||||||
15. feature:[website api]monitor support keyword match (#72)
|
|
||||||
16. feature:support linux cpu usage,memory usage,disk free (#76)
|
|
||||||
|
|
||||||
BUG修复
|
|
||||||
1. 添加sqlserver关联文档,fix connection指标入库tdengine失败 (#41)
|
|
||||||
2. 使用docker部署TDengine,开放tcp访问端口!16 由 @老姜bei 贡献 thanks
|
|
||||||
3. 补充sureness配置文档 避免误配导致权限异常
|
|
||||||
4. bugfix:monitors always timeout alert (#67)
|
|
||||||
5. code format and optimization 由 @学习代码的小白 贡献 thanks
|
|
||||||
6. bugfix: remove oracle field - database_type due 11g not support 由 @syongaaa 贡献 thanks
|
|
||||||
7. bugfix:fix linux interface metrics no instance (#75)
|
|
||||||
|
|
||||||
欢迎在线试用 https://console.tancloud.cn.
|
|
||||||
|
|
||||||
-----------------------
|
|
||||||
|
|
||||||
> [HertzBeat赫兹跳动](https://github.com/dromara/hertzbeat) 是一个支持网站,API,PING,端口,数据库,操作系统等监控类型,拥有易用友好的可视化操作界面的开源监控告警项目。
|
|
||||||
> 我们也提供了对应的 **[SAAS版本监控云](https://console.tancloud.cn)**,中小团队和个人无需再为了监控自己的网站资源,而去部署一套繁琐的监控系统,**[登录即可免费开始](https://console.tancloud.cn)**。
|
|
||||||
> HertzBeat 支持[自定义监控](https://hertzbeat.com/docs/advanced/extend-point) ,只用通过配置YML文件我们就可以自定义需要的监控类型和指标,来满足常见的个性化需求。
|
|
||||||
> HertzBeat 模块化,`manager, collector, scheduler, warehouse, alerter` 各个模块解耦合,方便理解与定制开发。
|
|
||||||
> HertzBeat 支持更自由化的告警配置(计算表达式),支持告警通知,告警模版,邮件钉钉微信飞书等及时通知送达
|
|
||||||
> 欢迎登录 HertzBeat 的 [云环境TanCloud](https://console.tancloud.cn) 试用发现更多。
|
|
||||||
> 我们正在快速迭代中,欢迎参与加入一起共建项目开源生态。
|
|
||||||
|
|
||||||
> `HertzBeat`的多类型支持,易扩展,低耦合,希望能帮助开发者和中小团队快速搭建自有监控系统。
|
|
||||||
|
|
||||||
老铁们可以通过演示视频来直观了解功能: https://www.bilibili.com/video/BV1DY4y1i7ts
|
|
||||||
|
|
||||||
欢迎在线试用 [https://console.tancloud.cn](https://gitee.com/link?target=https%3A%2F%2Fconsole.tancloud.cn)
|
|
||||||
|
|
||||||
优化后的参数输入界面:
|
|
||||||

|
|
||||||
|
|
||||||
Linux新增指标:
|
|
||||||

|
|
||||||
|
|
||||||
ORACLE监控:
|
|
||||||
哦豁!oracle环境不在了,之前没有截图,先脑补一张!
|
|
||||||
|
|
||||||
**仓库地址**
|
|
||||||
|
|
||||||
[Github](https://github.com/dromara/hertzbeat) https://github.com/dromara/hertzbeat
|
|
||||||
[Gitee](https://gitee.com/dromara/hertzbeat) https://gitee.com/dromara/hertzbeat
|
|
||||||
|
|
||||||
看到这里不妨给个Star支持下哦,灰常感谢,弯腰!!
|
|
||||||
@@ -38,7 +38,6 @@ sidebar_label: Linux操作系统
|
|||||||
| interrupt | 个数 | CPU中断数量 |
|
| interrupt | 个数 | CPU中断数量 |
|
||||||
| load | 无 | CPU最近1/5/15分钟的平均负载 |
|
| load | 无 | CPU最近1/5/15分钟的平均负载 |
|
||||||
| context_switch | 个数 | 当前上下文切换数量 |
|
| context_switch | 个数 | 当前上下文切换数量 |
|
||||||
| usage | % | CPU使用率 |
|
|
||||||
|
|
||||||
|
|
||||||
#### 指标集合:memory
|
#### 指标集合:memory
|
||||||
@@ -50,7 +49,6 @@ sidebar_label: Linux操作系统
|
|||||||
| free | Mb | 空闲内存容量 |
|
| free | Mb | 空闲内存容量 |
|
||||||
| buff_cache | Mb | 缓存占用内存 |
|
| buff_cache | Mb | 缓存占用内存 |
|
||||||
| available | Mb | 剩余可用内存容 |
|
| available | Mb | 剩余可用内存容 |
|
||||||
| usage | % | 内存使用率 |
|
|
||||||
|
|
||||||
#### 指标集合:disk
|
#### 指标集合:disk
|
||||||
|
|
||||||
@@ -70,12 +68,3 @@ sidebar_label: Linux操作系统
|
|||||||
| receive_bytes | byte | 入站数据流量(bytes) |
|
| receive_bytes | byte | 入站数据流量(bytes) |
|
||||||
| transmit_bytes | byte | 出站数据流量(bytes) |
|
| transmit_bytes | byte | 出站数据流量(bytes) |
|
||||||
|
|
||||||
#### 指标集合:disk_free
|
|
||||||
|
|
||||||
| 指标名称 | 指标单位 | 指标帮助描述 |
|
|
||||||
| ----------- | ----------- | ----------- |
|
|
||||||
| filesystem | 无 | 文件系统的名称 |
|
|
||||||
| used | Mb | 已使用磁盘大小 |
|
|
||||||
| available | Mb | 可用磁盘大小 |
|
|
||||||
| usage | % | 使用率 |
|
|
||||||
| mounted | 无 | 挂载点目录 |
|
|
||||||
|
|||||||
@@ -18,11 +18,10 @@ TDengine是一款国产的开源物联网时序型数据库,我们使用其替
|
|||||||
```
|
```
|
||||||
2. Docker安装TDengine
|
2. Docker安装TDengine
|
||||||
```
|
```
|
||||||
$ docker run -d -p 6030-6049:6030-6049 -p 6030-6049:6030-6049/udp -v /opt/taosdata:/var/lib/taos --name tdengine -e TZ=Asia/Shanghai tdengine/tdengine:2.4.0.12
|
$ docker run -d -p 6030-6049:6030-6049 -p 6030-6049:6030-6049/udp -v /opt/taosdata:/var/lib/taos --name tdengine tdengine/tdengine:2.4.0.12
|
||||||
526aa188da767ae94b244226a2b2eec2b5f17dd8eff594533d9ec0cd0f3a1ccd
|
526aa188da767ae94b244226a2b2eec2b5f17dd8eff594533d9ec0cd0f3a1ccd
|
||||||
```
|
```
|
||||||
`-v /opt/taosdata:/var/lib/taos` 为tdengine数据目录本地持久化挂载,需将`/opt/taosdata`替换为实际本地存在的目录
|
`-v /opt/taosdata:/var/lib/taos` 为tdengine数据目录本地持久化挂载,需将`/opt/taosdata`替换为实际本地存在的目录
|
||||||
`-e TZ="Asia/Shanghai"` 为tdengine设置时区,这里可选设置对应的时区
|
|
||||||
使用```$ docker ps```查看数据库是否启动成功
|
使用```$ docker ps```查看数据库是否启动成功
|
||||||
|
|
||||||
### 创建数据库实例
|
### 创建数据库实例
|
||||||
@@ -52,4 +51,4 @@ TDengine是一款国产的开源物联网时序型数据库,我们使用其替
|
|||||||
```
|
```
|
||||||
|
|
||||||
**注意⚠️若是安装包安装的TDengine2.3+版本**
|
**注意⚠️若是安装包安装的TDengine2.3+版本**
|
||||||
> 除了启动server外,还需执行 `systemctl start taosadapter` 启动 adapter
|
> 除了启动server外,还需执行 `systemctl start taosadapter` 启动 adapter
|
||||||
|
|||||||
@@ -28,7 +28,7 @@ function Home() {
|
|||||||
<h1 className="hero__title">
|
<h1 className="hero__title">
|
||||||
<img style={{width: '500px', marginTop: '100px'}} src={cdnTransfer('img/hertzbeat-brand.svg')} alt={'#'}/>
|
<img style={{width: '500px', marginTop: '100px'}} src={cdnTransfer('img/hertzbeat-brand.svg')} alt={'#'}/>
|
||||||
</h1>
|
</h1>
|
||||||
<p className="hero__subtitle"><Translate>易用友好的云监控系统</Translate></p>
|
<p className="hero__subtitle"><Translate>易用友好的监控告警系统</Translate></p>
|
||||||
<div className={styles.social}>
|
<div className={styles.social}>
|
||||||
<a href="https://console.tancloud.cn"><img src={cdnTransfer('img/badge/web-monitor.svg')} alt={''}/></a>
|
<a href="https://console.tancloud.cn"><img src={cdnTransfer('img/badge/web-monitor.svg')} alt={''}/></a>
|
||||||
<a href="https://console.tancloud.cn"><img src={cdnTransfer('img/badge/ping-connect.svg')} alt={''}/></a>
|
<a href="https://console.tancloud.cn"><img src={cdnTransfer('img/badge/ping-connect.svg')} alt={''}/></a>
|
||||||
|
|||||||
@@ -22,6 +22,7 @@ import com.usthe.manager.service.AppService;
|
|||||||
import com.usthe.manager.service.MonitorService;
|
import com.usthe.manager.service.MonitorService;
|
||||||
import com.usthe.manager.support.exception.MonitorDatabaseException;
|
import com.usthe.manager.support.exception.MonitorDatabaseException;
|
||||||
import com.usthe.manager.support.exception.MonitorDetectException;
|
import com.usthe.manager.support.exception.MonitorDetectException;
|
||||||
|
import jdk.nashorn.internal.runtime.regexp.joni.constants.Traverse;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import org.springframework.beans.factory.annotation.Autowired;
|
import org.springframework.beans.factory.annotation.Autowired;
|
||||||
import org.springframework.data.domain.Page;
|
import org.springframework.data.domain.Page;
|
||||||
@@ -80,10 +81,6 @@ public class MonitorServiceImpl implements MonitorService {
|
|||||||
List<Configmap> configmaps = params.stream().map(param ->
|
List<Configmap> configmaps = params.stream().map(param ->
|
||||||
new Configmap(param.getField(), param.getValue(), param.getType())).collect(Collectors.toList());
|
new Configmap(param.getField(), param.getValue(), param.getType())).collect(Collectors.toList());
|
||||||
appDefine.setConfigmap(configmaps);
|
appDefine.setConfigmap(configmaps);
|
||||||
// 探测可用性只需要采集优先级为0的可用性指标集合
|
|
||||||
List<Metrics> availableMetrics = appDefine.getMetrics().stream()
|
|
||||||
.filter(item -> item.getPriority() == 0).collect(Collectors.toList());
|
|
||||||
appDefine.setMetrics(availableMetrics);
|
|
||||||
List<CollectRep.MetricsData> collectRep = collectJobService.collectSyncJobData(appDefine);
|
List<CollectRep.MetricsData> collectRep = collectJobService.collectSyncJobData(appDefine);
|
||||||
// 判断探测结果 失败则抛出探测异常
|
// 判断探测结果 失败则抛出探测异常
|
||||||
if (collectRep == null || collectRep.isEmpty()) {
|
if (collectRep == null || collectRep.isEmpty()) {
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ configmap:
|
|||||||
type: 3
|
type: 3
|
||||||
- key: params
|
- key: params
|
||||||
type: 3
|
type: 3
|
||||||
- key: keyword
|
|
||||||
type: 1
|
|
||||||
# 指标组列表
|
# 指标组列表
|
||||||
metrics:
|
metrics:
|
||||||
# 第一个监控指标组 cpu
|
# 第一个监控指标组 cpu
|
||||||
@@ -48,9 +46,6 @@ metrics:
|
|||||||
- field: responseTime
|
- field: responseTime
|
||||||
type: 0
|
type: 0
|
||||||
unit: ms
|
unit: ms
|
||||||
- field: keyword
|
|
||||||
type: 0
|
|
||||||
unit: 次数
|
|
||||||
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
|
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
|
||||||
protocol: http
|
protocol: http
|
||||||
# 当protocol为http协议时具体的采集配置
|
# 当protocol为http协议时具体的采集配置
|
||||||
@@ -83,5 +78,4 @@ metrics:
|
|||||||
digestAuthPassword: ^_^password^_^
|
digestAuthPassword: ^_^password^_^
|
||||||
# 响应数据解析方式: default-系统规则,jsonPath-jsonPath脚本,website-网站可用性指标监控
|
# 响应数据解析方式: default-系统规则,jsonPath-jsonPath脚本,website-网站可用性指标监控
|
||||||
# todo xmlPath-xmlPath脚本,prometheus-Prometheus数据规则
|
# todo xmlPath-xmlPath脚本,prometheus-Prometheus数据规则
|
||||||
parseType: website
|
parseType: website
|
||||||
keyword: ^_^keyword^_^
|
|
||||||
@@ -68,26 +68,6 @@ metrics:
|
|||||||
- field: context_switch
|
- field: context_switch
|
||||||
type: 0
|
type: 0
|
||||||
unit: 个数
|
unit: 个数
|
||||||
- field: usage
|
|
||||||
type: 0
|
|
||||||
unit: '%'
|
|
||||||
# (非必须)监控指标别名,与上面的指标名映射。用于采集接口数据字段不直接是最终指标名称,需要此别名做映射转换
|
|
||||||
aliasFields:
|
|
||||||
- info
|
|
||||||
- cores
|
|
||||||
- interrupt
|
|
||||||
- load
|
|
||||||
- context_switch
|
|
||||||
- idle
|
|
||||||
# (非必须)指标计算表达式,与上面的别名一起作用,计算出最终需要的指标值
|
|
||||||
# eg: cores=core1+core2, usage=usage, waitTime=allTime-runningTime
|
|
||||||
calculates:
|
|
||||||
- info=info
|
|
||||||
- cores=cores
|
|
||||||
- interrupt=interrupt
|
|
||||||
- load=load
|
|
||||||
- context_switch=context_switch
|
|
||||||
- usage=100-idle
|
|
||||||
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
|
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
|
||||||
protocol: ssh
|
protocol: ssh
|
||||||
# 当protocol为http协议时具体的采集配置
|
# 当protocol为http协议时具体的采集配置
|
||||||
@@ -99,7 +79,7 @@ metrics:
|
|||||||
username: ^_^username^_^
|
username: ^_^username^_^
|
||||||
password: ^_^password^_^
|
password: ^_^password^_^
|
||||||
timeout: ^_^timeout^_^
|
timeout: ^_^timeout^_^
|
||||||
script: "LANG=C lscpu | awk -F: '/Model name/ {print $2}';awk '/processor/{core++} END{print core}' /proc/cpuinfo;uptime | sed 's/,/ /g' | awk '{for(i=NF-2;i<=NF;i++)print $i }' | xargs;vmstat 1 1 | awk 'NR==3{print $11}';vmstat 1 1 | awk 'NR==3{print $12}';vmstat 1 1 | awk 'NR==3{print $15}'"
|
script: "LANG=C lscpu | awk -F: '/Model name/ {print $2}';awk '/processor/{core++} END{print core}' /proc/cpuinfo;uptime | sed 's/,/ /g' | awk '{for(i=NF-2;i<=NF;i++)print $i }' | xargs;vmstat 1 1 | awk 'NR==3{print $11}';vmstat 1 1 | awk 'NR==3{print $12}'"
|
||||||
parseType: oneRow
|
parseType: oneRow
|
||||||
|
|
||||||
- name: memory
|
- name: memory
|
||||||
@@ -121,25 +101,6 @@ metrics:
|
|||||||
- field: available
|
- field: available
|
||||||
type: 0
|
type: 0
|
||||||
unit: Mb
|
unit: Mb
|
||||||
- field: usage
|
|
||||||
type: 0
|
|
||||||
unit: '%'
|
|
||||||
# (非必须)监控指标别名,与上面的指标名映射。用于采集接口数据字段不直接是最终指标名称,需要此别名做映射转换
|
|
||||||
aliasFields:
|
|
||||||
- total
|
|
||||||
- used
|
|
||||||
- free
|
|
||||||
- buff_cache
|
|
||||||
- available
|
|
||||||
# (非必须)指标计算表达式,与上面的别名一起作用,计算出最终需要的指标值
|
|
||||||
# eg: cores=core1+core2, usage=usage, waitTime=allTime-runningTime
|
|
||||||
calculates:
|
|
||||||
- total=total
|
|
||||||
- used=used
|
|
||||||
- free=free
|
|
||||||
- buff_cache=buff_cache
|
|
||||||
- available=available
|
|
||||||
- usage=(used / total) * 100
|
|
||||||
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
|
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
|
||||||
protocol: ssh
|
protocol: ssh
|
||||||
# 当protocol为http协议时具体的采集配置
|
# 当protocol为http协议时具体的采集配置
|
||||||
@@ -193,7 +154,6 @@ metrics:
|
|||||||
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 instance是否为实例主键 unit:指标单位
|
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 instance是否为实例主键 unit:指标单位
|
||||||
- field: interface_name
|
- field: interface_name
|
||||||
type: 1
|
type: 1
|
||||||
instance: true
|
|
||||||
- field: receive_bytes
|
- field: receive_bytes
|
||||||
type: 0
|
type: 0
|
||||||
unit: byte
|
unit: byte
|
||||||
@@ -212,36 +172,4 @@ metrics:
|
|||||||
password: ^_^password^_^
|
password: ^_^password^_^
|
||||||
timeout: ^_^timeout^_^
|
timeout: ^_^timeout^_^
|
||||||
script: cat /proc/net/dev | tail -n +3 | awk 'BEGIN{ print "interface_name receive_bytes transmit_bytes"} {print $1,$2,$10}'
|
script: cat /proc/net/dev | tail -n +3 | awk 'BEGIN{ print "interface_name receive_bytes transmit_bytes"} {print $1,$2,$10}'
|
||||||
parseType: multiRow
|
|
||||||
|
|
||||||
- name: disk_free
|
|
||||||
priority: 5
|
|
||||||
fields:
|
|
||||||
# 指标信息 包括 field名称 type字段类型:0-number数字,1-string字符串 instance是否为实例主键 unit:指标单位
|
|
||||||
- field: filesystem
|
|
||||||
type: 1
|
|
||||||
- field: used
|
|
||||||
type: 0
|
|
||||||
unit: Mb
|
|
||||||
- field: available
|
|
||||||
type: 0
|
|
||||||
unit: Mb
|
|
||||||
- field: usage
|
|
||||||
type: 0
|
|
||||||
unit: '%'
|
|
||||||
- field: mounted
|
|
||||||
type: 1
|
|
||||||
instance: true
|
|
||||||
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
|
|
||||||
protocol: ssh
|
|
||||||
# 当protocol为http协议时具体的采集配置
|
|
||||||
ssh:
|
|
||||||
# 主机host: ipv4 ipv6 域名
|
|
||||||
host: ^_^host^_^
|
|
||||||
# 端口
|
|
||||||
port: ^_^port^_^
|
|
||||||
username: ^_^username^_^
|
|
||||||
password: ^_^password^_^
|
|
||||||
timeout: ^_^timeout^_^
|
|
||||||
script: df -m | tail -n +2 | awk 'BEGIN{ print "filesystem used available usage mounted"} {print $1,$3,$4,$5,$6}'
|
|
||||||
parseType: multiRow
|
parseType: multiRow
|
||||||
@@ -32,6 +32,8 @@ metrics:
|
|||||||
- field: database_version
|
- field: database_version
|
||||||
type: 1
|
type: 1
|
||||||
instance: true
|
instance: true
|
||||||
|
- field: database_type
|
||||||
|
type: 1
|
||||||
- field: hostname
|
- field: hostname
|
||||||
type: 1
|
type: 1
|
||||||
- field: instance_name
|
- field: instance_name
|
||||||
@@ -43,6 +45,7 @@ metrics:
|
|||||||
# (非必须)监控指标别名,与上面的指标名映射。用于采集接口数据字段不直接是最终指标名称,需要此别名做映射转换
|
# (非必须)监控指标别名,与上面的指标名映射。用于采集接口数据字段不直接是最终指标名称,需要此别名做映射转换
|
||||||
aliasFields:
|
aliasFields:
|
||||||
- VERSION
|
- VERSION
|
||||||
|
- DATABASE_TYPE
|
||||||
- HOST_NAME
|
- HOST_NAME
|
||||||
- INSTANCE_NAME
|
- INSTANCE_NAME
|
||||||
- STARTUP_TIME
|
- STARTUP_TIME
|
||||||
@@ -51,6 +54,7 @@ metrics:
|
|||||||
# eg: cores=core1+core2, usage=usage, waitTime=allTime-runningTime
|
# eg: cores=core1+core2, usage=usage, waitTime=allTime-runningTime
|
||||||
calculates:
|
calculates:
|
||||||
- database_version=VERSION
|
- database_version=VERSION
|
||||||
|
- database_type=DATABASE_TYPE
|
||||||
- hostname=HOST_NAME
|
- hostname=HOST_NAME
|
||||||
- instance_name=INSTANCE_NAME
|
- instance_name=INSTANCE_NAME
|
||||||
- startup_time=STARTUP_TIME
|
- startup_time=STARTUP_TIME
|
||||||
@@ -175,4 +179,4 @@ metrics:
|
|||||||
queryType: columns
|
queryType: columns
|
||||||
# sql
|
# sql
|
||||||
sql: select metric_name, value from gv$sysmetric where metric_name = 'I/O Megabytes per Second' or metric_name = 'User Transaction Per Sec' or metric_name = 'I/O Requests per Second'
|
sql: select metric_name, value from gv$sysmetric where metric_name = 'I/O Megabytes per Second' or metric_name = 'User Transaction Per Sec' or metric_name = 'I/O Requests per Second'
|
||||||
url: ^_^url^_^
|
url: ^_^url^_^
|
||||||
25
manager/src/main/resources/define/app/telnet.yml
Normal file
25
manager/src/main/resources/define/app/telnet.yml
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
category: service
|
||||||
|
app: telnet
|
||||||
|
name:
|
||||||
|
zh-CN: TELNET端口可用性
|
||||||
|
en-US: PORT TELNET
|
||||||
|
configmap:
|
||||||
|
- key: host
|
||||||
|
type: 1
|
||||||
|
- key: port
|
||||||
|
type: 0
|
||||||
|
- key: timeout
|
||||||
|
type: 0
|
||||||
|
metrics:
|
||||||
|
- name: summary
|
||||||
|
priority: 0
|
||||||
|
fields:
|
||||||
|
- field: responseTime
|
||||||
|
type: 0
|
||||||
|
unit: ms
|
||||||
|
protocol: telnet
|
||||||
|
# 当protocol为telnet协议时具体的采集配置
|
||||||
|
telnet:
|
||||||
|
host: ^_^host^_^
|
||||||
|
port: ^_^port^_^
|
||||||
|
timeout: ^_^timeout^_^
|
||||||
@@ -18,12 +18,10 @@ configmap:
|
|||||||
type: 1
|
type: 1
|
||||||
- key: password
|
- key: password
|
||||||
type: 2
|
type: 2
|
||||||
- key: keyword
|
|
||||||
type: 1
|
|
||||||
# 指标组列表
|
# 指标组列表
|
||||||
metrics:
|
metrics:
|
||||||
# 第一个监控指标组 cpu
|
# 第一个监控指标组 cpu
|
||||||
# 注意:内置监控指标有 (responseTime - 响应时间, keyword - 关键字数量)
|
# 注意:内置监控指标有 (responseTime - 响应时间)
|
||||||
- name: summary
|
- name: summary
|
||||||
# 指标组调度优先级(0-127)越小优先级越高,优先级低的指标组会等优先级高的指标组采集完成后才会被调度,相同优先级的指标组会并行调度采集
|
# 指标组调度优先级(0-127)越小优先级越高,优先级低的指标组会等优先级高的指标组采集完成后才会被调度,相同优先级的指标组会并行调度采集
|
||||||
# 优先级为0的指标组为可用性指标组,即它会被首先调度,采集成功才会继续调度其它指标组,采集失败则中断调度
|
# 优先级为0的指标组为可用性指标组,即它会被首先调度,采集成功才会继续调度其它指标组,采集失败则中断调度
|
||||||
@@ -34,9 +32,6 @@ metrics:
|
|||||||
- field: responseTime
|
- field: responseTime
|
||||||
type: 0
|
type: 0
|
||||||
unit: ms
|
unit: ms
|
||||||
- field: keyword
|
|
||||||
type: 0
|
|
||||||
unit: 次数
|
|
||||||
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
|
# 监控采集使用协议 eg: sql, ssh, http, telnet, wmi, snmp, sdk
|
||||||
protocol: http
|
protocol: http
|
||||||
# 当protocol为http协议时具体的采集配置
|
# 当protocol为http协议时具体的采集配置
|
||||||
@@ -60,5 +55,4 @@ metrics:
|
|||||||
digestAuthPassword: ^_^password^_^
|
digestAuthPassword: ^_^password^_^
|
||||||
# 响应数据解析方式: default-系统规则,jsonPath-jsonPath脚本,website-网站可用性指标监控
|
# 响应数据解析方式: default-系统规则,jsonPath-jsonPath脚本,website-网站可用性指标监控
|
||||||
# todo xmlPath-xmlPath脚本,prometheus-Prometheus数据规则
|
# todo xmlPath-xmlPath脚本,prometheus-Prometheus数据规则
|
||||||
parseType: website
|
parseType: website
|
||||||
keyword: ^_^keyword^_^
|
|
||||||
@@ -26,12 +26,10 @@ param:
|
|||||||
# 当type为text时,用limit表示字符串限制大小
|
# 当type为text时,用limit表示字符串限制大小
|
||||||
limit: 20
|
limit: 20
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
- field: password
|
- field: password
|
||||||
name: 密码
|
name: 密码
|
||||||
type: password
|
type: password
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
- field: ssl
|
- field: ssl
|
||||||
name: 启动SSL
|
name: 启动SSL
|
||||||
# 当type为boolean时,前端用switch展示开关
|
# 当type为boolean时,前端用switch展示开关
|
||||||
|
|||||||
@@ -60,18 +60,15 @@ param:
|
|||||||
type: text
|
type: text
|
||||||
placeholder: '请求BODY资源类型'
|
placeholder: '请求BODY资源类型'
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
- field: payload
|
- field: payload
|
||||||
name: 请求BODY
|
name: 请求BODY
|
||||||
type: textarea
|
type: textarea
|
||||||
placeholder: 'POST PUT请求时有效'
|
placeholder: 'POST PUT请求时有效'
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
- field: authType
|
- field: authType
|
||||||
name: 认证方式
|
name: 认证方式
|
||||||
type: radio
|
type: radio
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
# 当type为radio单选框,checkbox复选框时,option表示可选项值列表 {name1:value1,name2:value2}
|
# 当type为radio单选框,checkbox复选框时,option表示可选项值列表 {name1:value1,name2:value2}
|
||||||
options:
|
options:
|
||||||
- label: Basic Auth
|
- label: Basic Auth
|
||||||
@@ -84,14 +81,7 @@ param:
|
|||||||
# 当type为text时,用limit表示字符串限制大小
|
# 当type为text时,用limit表示字符串限制大小
|
||||||
limit: 20
|
limit: 20
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
- field: password
|
- field: password
|
||||||
name: 密码
|
name: 密码
|
||||||
type: password
|
type: password
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
- field: keyword
|
|
||||||
name: 关键字
|
|
||||||
type: text
|
|
||||||
required: false
|
|
||||||
hide: true
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ param:
|
|||||||
required: false
|
required: false
|
||||||
defaultValue: 6000
|
defaultValue: 6000
|
||||||
placeholder: '查询超时时间'
|
placeholder: '查询超时时间'
|
||||||
hide: true
|
|
||||||
- field: database
|
- field: database
|
||||||
name: 数据库名称
|
name: 数据库名称
|
||||||
type: text
|
type: text
|
||||||
@@ -34,5 +33,4 @@ param:
|
|||||||
- field: url
|
- field: url
|
||||||
name: URL
|
name: URL
|
||||||
type: text
|
type: text
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
@@ -15,7 +15,6 @@ param:
|
|||||||
name: 查询超时时间
|
name: 查询超时时间
|
||||||
type: number
|
type: number
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
defaultValue: 6000
|
defaultValue: 6000
|
||||||
placeholder: '查询超时时间'
|
placeholder: '查询超时时间'
|
||||||
- field: database
|
- field: database
|
||||||
@@ -34,5 +33,4 @@ param:
|
|||||||
- field: url
|
- field: url
|
||||||
name: URL
|
name: URL
|
||||||
type: text
|
type: text
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
@@ -15,7 +15,6 @@ param:
|
|||||||
name: 查询超时时间
|
name: 查询超时时间
|
||||||
type: number
|
type: number
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
defaultValue: 6000
|
defaultValue: 6000
|
||||||
placeholder: '查询超时时间'
|
placeholder: '查询超时时间'
|
||||||
- field: database
|
- field: database
|
||||||
@@ -34,5 +33,4 @@ param:
|
|||||||
- field: url
|
- field: url
|
||||||
name: URL
|
name: URL
|
||||||
type: text
|
type: text
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
@@ -15,7 +15,6 @@ param:
|
|||||||
name: 查询超时时间
|
name: 查询超时时间
|
||||||
type: number
|
type: number
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
defaultValue: 6000
|
defaultValue: 6000
|
||||||
placeholder: '查询超时时间'
|
placeholder: '查询超时时间'
|
||||||
- field: database
|
- field: database
|
||||||
@@ -34,5 +33,4 @@ param:
|
|||||||
- field: url
|
- field: url
|
||||||
name: URL
|
name: URL
|
||||||
type: text
|
type: text
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
@@ -15,7 +15,6 @@ param:
|
|||||||
name: 查询超时时间
|
name: 查询超时时间
|
||||||
type: number
|
type: number
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
defaultValue: 6000
|
defaultValue: 6000
|
||||||
placeholder: '查询超时时间'
|
placeholder: '查询超时时间'
|
||||||
- field: database
|
- field: database
|
||||||
@@ -34,5 +33,4 @@ param:
|
|||||||
- field: url
|
- field: url
|
||||||
name: URL
|
name: URL
|
||||||
type: text
|
type: text
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
27
manager/src/main/resources/define/param/telnet.yml
Normal file
27
manager/src/main/resources/define/param/telnet.yml
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# 监控应用类型名称(与文件名保持一致) eg: linux windows tomcat mysql aws...
|
||||||
|
app: telnet
|
||||||
|
# 强制固定必须参数 - host(ipv4,ipv6,域名)
|
||||||
|
param:
|
||||||
|
# field-字段名称标识符
|
||||||
|
- field: host
|
||||||
|
# name-参数字段显示名称
|
||||||
|
name: 主机Host
|
||||||
|
# type-字段类型,样式(大部分映射input标签type属性)
|
||||||
|
type: host
|
||||||
|
# 是否是必输项 true-必填 false-可选
|
||||||
|
required: true
|
||||||
|
- field: port
|
||||||
|
name: 端口
|
||||||
|
type: number
|
||||||
|
# 当type为number时,用range表示范围
|
||||||
|
range: '[0,65535]'
|
||||||
|
required: true
|
||||||
|
defaultValue: 80
|
||||||
|
- field: timeout
|
||||||
|
name: Telnet超时时间
|
||||||
|
type: number
|
||||||
|
# 当type为number时,用range表示范围
|
||||||
|
range: '[0,100000]'
|
||||||
|
required: true
|
||||||
|
placeholder: '请输入超时时间,单位毫秒'
|
||||||
|
defaultValue: 6000
|
||||||
@@ -33,7 +33,6 @@ param:
|
|||||||
name: 认证方式
|
name: 认证方式
|
||||||
type: radio
|
type: radio
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
# 当type为radio单选框,checkbox复选框时,option表示可选项值列表 {name1:value1,name2:value2}
|
# 当type为radio单选框,checkbox复选框时,option表示可选项值列表 {name1:value1,name2:value2}
|
||||||
options:
|
options:
|
||||||
- label: Basic Auth
|
- label: Basic Auth
|
||||||
@@ -46,14 +45,7 @@ param:
|
|||||||
# 当type为text时,用limit表示字符串限制大小
|
# 当type为text时,用limit表示字符串限制大小
|
||||||
limit: 20
|
limit: 20
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
- field: password
|
- field: password
|
||||||
name: 密码
|
name: 密码
|
||||||
type: password
|
type: password
|
||||||
required: false
|
required: false
|
||||||
hide: true
|
|
||||||
- field: keyword
|
|
||||||
name: 关键字
|
|
||||||
type: text
|
|
||||||
required: false
|
|
||||||
hide: true
|
|
||||||
@@ -3,7 +3,7 @@
|
|||||||
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd
|
xsi:schemaLocation="http://maven.apache.org/ASSEMBLY/2.0.0 http://maven.apache.org/xsd/assembly-2.0.0.xsd
|
||||||
http://maven.apache.org/ASSEMBLY/2.0.0 ">
|
http://maven.apache.org/ASSEMBLY/2.0.0 ">
|
||||||
<!--必填,会追加到打包文件名称的末尾-->
|
<!--必填,会追加到打包文件名称的末尾-->
|
||||||
<id>1.0-beta.7</id>
|
<id>1.0-beta.6</id>
|
||||||
<!--打包类型,可以设置多种类型,打包的时候不同的类型都会打包打出来-->
|
<!--打包类型,可以设置多种类型,打包的时候不同的类型都会打包打出来-->
|
||||||
<formats>
|
<formats>
|
||||||
<format>tar</format>
|
<format>tar</format>
|
||||||
|
|||||||
@@ -28,7 +28,9 @@ if [ ! -d $LOGS_DIR ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# JVM Configuration
|
# JVM Configuration
|
||||||
JAVA_MEM_OPTS=" -server -XX:SurvivorRatio=6 -XX:+UseParallelGC "
|
JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true "
|
||||||
|
|
||||||
|
JAVA_MEM_OPTS=" -server -Xms256m -Xmx1024m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
|
||||||
|
|
||||||
# 加载外部log文件的配置
|
# 加载外部log文件的配置
|
||||||
LOG_IMPL_FILE=logback-spring.xml
|
LOG_IMPL_FILE=logback-spring.xml
|
||||||
@@ -39,4 +41,4 @@ then
|
|||||||
fi
|
fi
|
||||||
CONFIG_FILES=" -Dlogging.path=$LOGS_DIR $LOGGING_CONFIG -Dspring.config.location=$CONF_DIR/ "
|
CONFIG_FILES=" -Dlogging.path=$LOGS_DIR $LOGGING_CONFIG -Dspring.config.location=$CONF_DIR/ "
|
||||||
echo -e "Starting the $SERVER_NAME ..."
|
echo -e "Starting the $SERVER_NAME ..."
|
||||||
java $JAVA_MEM_OPTS $CONFIG_FILES -jar $DEPLOY_DIR/$JAR_NAME --spring.profiles.active=prod
|
java $JAVA_OPTS $JAVA_MEM_OPTS $CONFIG_FILES -jar $DEPLOY_DIR/$JAR_NAME --spring.profiles.active=prod
|
||||||
@@ -34,9 +34,9 @@ rem 项目日志输出绝对路径
|
|||||||
set LOGS_DIR=%DEPLOY_DIR%\logs
|
set LOGS_DIR=%DEPLOY_DIR%\logs
|
||||||
|
|
||||||
rem JVM Configuration
|
rem JVM Configuration
|
||||||
set JAVA_OPTS= -Duser.timezone=Asia/Shanghai
|
set JAVA_OPTS= -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Duser.timezone=Asia/Shanghai
|
||||||
|
|
||||||
set JAVA_MEM_OPTS= -server -XX:SurvivorRatio=6 -XX:+UseParallelGC
|
set JAVA_MEM_OPTS= -server -Xms256m -Xmx1024m -XX:SurvivorRatio=2 -XX:+UseParallelGC
|
||||||
|
|
||||||
rem 加载外部log文件的配置
|
rem 加载外部log文件的配置
|
||||||
set LOGGING_CONFIG=-Dlogging.config=%CONF_DIR%\logback-spring.xml
|
set LOGGING_CONFIG=-Dlogging.config=%CONF_DIR%\logback-spring.xml
|
||||||
|
|||||||
@@ -66,9 +66,9 @@ if [ ! -d $LOGS_DIR ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# JVM Configuration
|
# JVM Configuration
|
||||||
JAVA_OPTS=" -Duser.timezone=Asia/Shanghai"
|
JAVA_OPTS=" -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Duser.timezone=Asia/Shanghai"
|
||||||
|
|
||||||
JAVA_MEM_OPTS=" -server -XX:SurvivorRatio=6 -XX:+UseParallelGC "
|
JAVA_MEM_OPTS=" -server -Xms256m -Xmx1024m -XX:SurvivorRatio=2 -XX:+UseParallelGC "
|
||||||
|
|
||||||
# 加载外部log文件的配置
|
# 加载外部log文件的配置
|
||||||
LOG_IMPL_FILE=logback-spring.xml
|
LOG_IMPL_FILE=logback-spring.xml
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ services:
|
|||||||
- heartzbeat
|
- heartzbeat
|
||||||
|
|
||||||
hertzbeat:
|
hertzbeat:
|
||||||
image: "tancloud/hertzbeat:1.0-beta.7"
|
image: "tancloud/hertzbeat:1.0-beta.6"
|
||||||
container_name: hertzbeat
|
container_name: hertzbeat
|
||||||
hostname: hertzbeat
|
hostname: hertzbeat
|
||||||
restart: always
|
restart: always
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ FROM openjdk:8-alpine
|
|||||||
|
|
||||||
MAINTAINER tomsun28 "tomsun28@outlook.com"
|
MAINTAINER tomsun28 "tomsun28@outlook.com"
|
||||||
|
|
||||||
ADD hertzbeat-1.0-beta.7.tar /opt/
|
ADD hertzbeat-1.0-beta.6.tar /opt/
|
||||||
|
|
||||||
RUN apk add --no-cache tzdata
|
RUN apk add --no-cache tzdata
|
||||||
|
|
||||||
|
|||||||
BIN
tancloud.gif
BIN
tancloud.gif
Binary file not shown.
|
Before Width: | Height: | Size: 15 MiB After Width: | Height: | Size: 30 MiB |
@@ -12,6 +12,4 @@ export class ParamDefine {
|
|||||||
// 当type为key-value时有效,表示别名描述
|
// 当type为key-value时有效,表示别名描述
|
||||||
keyAlias!: string;
|
keyAlias!: string;
|
||||||
valueAlias!: string;
|
valueAlias!: string;
|
||||||
// 此参数是否隐藏 即默认不显示, 在高级设置区显示
|
|
||||||
hide: boolean = false;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -162,151 +162,11 @@
|
|||||||
</nz-form-control>
|
</nz-form-control>
|
||||||
</nz-form-item>
|
</nz-form-item>
|
||||||
|
|
||||||
<nz-collapse [nzGhost]="true">
|
|
||||||
<nz-collapse-panel nzHeader="高级" [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'"
|
|
||||||
nzSpan="7"
|
|
||||||
[nzRequired]="paramDefine.required"
|
|
||||||
[nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control
|
|
||||||
*ngIf="paramDefine.field !== 'host' && paramDefine.type === 'text'"
|
|
||||||
nzSpan="8"
|
|
||||||
[nzErrorTip]="'validation.required' | i18n"
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
nz-input
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[type]="paramDefine.type"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
[placeholder]="paramDefine.placeholder ? paramDefine.placeholder : ''"
|
|
||||||
/>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label
|
|
||||||
*ngIf="paramDefine.type === 'textarea'"
|
|
||||||
nzSpan="7"
|
|
||||||
[nzRequired]="paramDefine.required"
|
|
||||||
[nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'textarea'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<textarea
|
|
||||||
nz-input
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
[placeholder]="paramDefine.placeholder ? paramDefine.placeholder : ''"
|
|
||||||
rows="3"
|
|
||||||
></textarea>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label
|
|
||||||
*ngIf="paramDefine.type === 'password'"
|
|
||||||
nzSpan="7"
|
|
||||||
[nzRequired]="paramDefine.required"
|
|
||||||
[nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'password'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<nz-input-group [nzSuffix]="suffixTemplate" style="width: 100%">
|
|
||||||
<input
|
|
||||||
[type]="passwordVisible ? 'text' : 'password'"
|
|
||||||
nz-input
|
|
||||||
placeholder="input password"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[placeholder]="paramDefine.placeholder ? paramDefine.placeholder : ''"
|
|
||||||
/>
|
|
||||||
</nz-input-group>
|
|
||||||
<ng-template #suffixTemplate>
|
|
||||||
<i nz-icon [nzType]="passwordVisible ? 'eye-invisible' : 'eye'" (click)="passwordVisible = !passwordVisible"></i>
|
|
||||||
</ng-template>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label *ngIf="paramDefine.type === 'number'" nzSpan="7" [nzRequired]="paramDefine.required" [nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'number'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<nz-input-number
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
[nzMin]="-1000"
|
|
||||||
[nzMax]="65535"
|
|
||||||
[nzStep]="1"
|
|
||||||
[nzPlaceHolder]="paramDefine.placeholder ? paramDefine.placeholder : ''"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
></nz-input-number>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label *ngIf="paramDefine.type === 'boolean'" nzSpan="7" [nzRequired]="paramDefine.required" [nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'boolean'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<nz-switch
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
></nz-switch>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label *ngIf="paramDefine.type === 'radio'" nzSpan="7" [nzRequired]="paramDefine.required" [nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'radio'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<nz-radio-group
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
nzButtonStyle="solid"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
>
|
|
||||||
<label nz-radio-button [nzValue]="optionItem.value" *ngFor="let optionItem of paramDefine.options">
|
|
||||||
{{ optionItem.label }}
|
|
||||||
</label>
|
|
||||||
</nz-radio-group>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label
|
|
||||||
*ngIf="paramDefine.type === 'key-value'"
|
|
||||||
nzSpan="7"
|
|
||||||
[nzRequired]="paramDefine.required"
|
|
||||||
[nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'key-value'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<app-key-value-input
|
|
||||||
[(value)]="advancedParams[i].value"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
keyAlias="Header Name"
|
|
||||||
valueAlias="Header Value"
|
|
||||||
></app-key-value-input>
|
|
||||||
</nz-form-control>
|
|
||||||
</nz-form-item>
|
|
||||||
</nz-collapse-panel>
|
|
||||||
</nz-collapse>
|
|
||||||
<ng-template #extraColHeader>
|
|
||||||
<button style="top: -10px; margin-left: 40%" nz-button nzType="dashed" nz-tooltip nzTooltipTitle="设置高级可选参数">
|
|
||||||
<span>高级设置</span>
|
|
||||||
<i nz-icon nzType="down-circle" nzTheme="outline"></i>
|
|
||||||
</button>
|
|
||||||
</ng-template>
|
|
||||||
|
|
||||||
<nz-divider></nz-divider>
|
<nz-divider></nz-divider>
|
||||||
|
|
||||||
<nz-form-item>
|
<nz-form-item>
|
||||||
<nz-form-label nzSpan="7" nzFor="intervals" nzTooltipTitle="监控周期性采集数据间隔时间,单位秒"> 采集间隔 </nz-form-label>
|
<nz-form-label nzSpan="7" nzFor="intervals" nzTooltipTitle="监控周期性采集数据间隔时间,单位秒"> 采集间隔 </nz-form-label>
|
||||||
<nz-form-control nzSpan="8">
|
<nz-form-control nzSpan="10">
|
||||||
<nz-input-number [(ngModel)]="monitor.intervals" [nzMin]="10" [nzMax]="604800" [nzStep]="60" name="intervals" id="intervals">
|
<nz-input-number [(ngModel)]="monitor.intervals" [nzMin]="10" [nzMax]="604800" [nzStep]="60" name="intervals" id="intervals">
|
||||||
</nz-input-number>
|
</nz-input-number>
|
||||||
</nz-form-control>
|
</nz-form-control>
|
||||||
|
|||||||
@@ -30,8 +30,6 @@ export class MonitorEditComponent implements OnInit {
|
|||||||
|
|
||||||
paramDefines!: ParamDefine[];
|
paramDefines!: ParamDefine[];
|
||||||
params!: Param[];
|
params!: Param[];
|
||||||
advancedParamDefines!: ParamDefine[];
|
|
||||||
advancedParams!: Param[];
|
|
||||||
paramValueMap = new Map<String, Param>();
|
paramValueMap = new Map<String, Param>();
|
||||||
monitor = new Monitor();
|
monitor = new Monitor();
|
||||||
profileForm: FormGroup = new FormGroup({});
|
profileForm: FormGroup = new FormGroup({});
|
||||||
@@ -61,6 +59,7 @@ export class MonitorEditComponent implements OnInit {
|
|||||||
this.paramValueMap.set(item.field, item);
|
this.paramValueMap.set(item.field, item);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
this.params = message.data.params;
|
||||||
this.detected = message.data.detected ? message.data.detected : true;
|
this.detected = message.data.detected ? message.data.detected : true;
|
||||||
} else {
|
} else {
|
||||||
console.warn(message.msg);
|
console.warn(message.msg);
|
||||||
@@ -72,11 +71,9 @@ export class MonitorEditComponent implements OnInit {
|
|||||||
)
|
)
|
||||||
.subscribe(message => {
|
.subscribe(message => {
|
||||||
if (message.code === 0) {
|
if (message.code === 0) {
|
||||||
|
this.paramDefines = message.data;
|
||||||
this.params = [];
|
this.params = [];
|
||||||
this.advancedParams = [];
|
this.paramDefines.forEach(define => {
|
||||||
this.paramDefines = [];
|
|
||||||
this.advancedParamDefines = [];
|
|
||||||
message.data.forEach(define => {
|
|
||||||
let param = this.paramValueMap.get(define.field);
|
let param = this.paramValueMap.get(define.field);
|
||||||
if (param === undefined) {
|
if (param === undefined) {
|
||||||
param = new Param();
|
param = new Param();
|
||||||
@@ -103,13 +100,7 @@ export class MonitorEditComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (define.hide) {
|
this.params.push(param);
|
||||||
this.advancedParams.push(param);
|
|
||||||
this.advancedParamDefines.push(define);
|
|
||||||
} else {
|
|
||||||
this.params.push(param);
|
|
||||||
this.paramDefines.push(define);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
console.warn(message.msg);
|
console.warn(message.msg);
|
||||||
@@ -153,15 +144,10 @@ export class MonitorEditComponent implements OnInit {
|
|||||||
param.value = (param.value as string).trim();
|
param.value = (param.value as string).trim();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.advancedParams.forEach(param => {
|
|
||||||
if (param.value != null && typeof param.value == 'string') {
|
|
||||||
param.value = (param.value as string).trim();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
let addMonitor = {
|
let addMonitor = {
|
||||||
detected: this.detected,
|
detected: this.detected,
|
||||||
monitor: this.monitor,
|
monitor: this.monitor,
|
||||||
params: this.params.concat(this.advancedParams)
|
params: this.params
|
||||||
};
|
};
|
||||||
this.isSpinning = true;
|
this.isSpinning = true;
|
||||||
this.monitorSvc.editMonitor(addMonitor).subscribe(
|
this.monitorSvc.editMonitor(addMonitor).subscribe(
|
||||||
@@ -202,15 +188,10 @@ export class MonitorEditComponent implements OnInit {
|
|||||||
param.value = (param.value as string).trim();
|
param.value = (param.value as string).trim();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.advancedParams.forEach(param => {
|
|
||||||
if (param.value != null && typeof param.value == 'string') {
|
|
||||||
param.value = (param.value as string).trim();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
let detectMonitor = {
|
let detectMonitor = {
|
||||||
detected: this.detected,
|
detected: this.detected,
|
||||||
monitor: this.monitor,
|
monitor: this.monitor,
|
||||||
params: this.params.concat(this.advancedParams)
|
params: this.params
|
||||||
};
|
};
|
||||||
this.isSpinning = true;
|
this.isSpinning = true;
|
||||||
this.monitorSvc.detectMonitor(detectMonitor).subscribe(
|
this.monitorSvc.detectMonitor(detectMonitor).subscribe(
|
||||||
|
|||||||
@@ -171,146 +171,6 @@
|
|||||||
</nz-form-control>
|
</nz-form-control>
|
||||||
</nz-form-item>
|
</nz-form-item>
|
||||||
|
|
||||||
<nz-collapse [nzGhost]="true">
|
|
||||||
<nz-collapse-panel nzHeader="高级" [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'"
|
|
||||||
nzSpan="7"
|
|
||||||
[nzRequired]="paramDefine.required"
|
|
||||||
[nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control
|
|
||||||
*ngIf="paramDefine.field !== 'host' && paramDefine.type === 'text'"
|
|
||||||
nzSpan="8"
|
|
||||||
[nzErrorTip]="'validation.required' | i18n"
|
|
||||||
>
|
|
||||||
<input
|
|
||||||
nz-input
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[type]="paramDefine.type"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
[placeholder]="paramDefine.placeholder ? paramDefine.placeholder : ''"
|
|
||||||
/>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label
|
|
||||||
*ngIf="paramDefine.type === 'textarea'"
|
|
||||||
nzSpan="7"
|
|
||||||
[nzRequired]="paramDefine.required"
|
|
||||||
[nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'textarea'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<textarea
|
|
||||||
nz-input
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
[placeholder]="paramDefine.placeholder ? paramDefine.placeholder : ''"
|
|
||||||
rows="3"
|
|
||||||
></textarea>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label
|
|
||||||
*ngIf="paramDefine.type === 'password'"
|
|
||||||
nzSpan="7"
|
|
||||||
[nzRequired]="paramDefine.required"
|
|
||||||
[nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'password'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<nz-input-group [nzSuffix]="suffixTemplate" style="width: 100%">
|
|
||||||
<input
|
|
||||||
[type]="passwordVisible ? 'text' : 'password'"
|
|
||||||
nz-input
|
|
||||||
placeholder="input password"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[placeholder]="paramDefine.placeholder ? paramDefine.placeholder : ''"
|
|
||||||
/>
|
|
||||||
</nz-input-group>
|
|
||||||
<ng-template #suffixTemplate>
|
|
||||||
<i nz-icon [nzType]="passwordVisible ? 'eye-invisible' : 'eye'" (click)="passwordVisible = !passwordVisible"></i>
|
|
||||||
</ng-template>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label *ngIf="paramDefine.type === 'number'" nzSpan="7" [nzRequired]="paramDefine.required" [nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'number'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<nz-input-number
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
[nzMin]="-1000"
|
|
||||||
[nzMax]="65535"
|
|
||||||
[nzStep]="1"
|
|
||||||
[nzPlaceHolder]="paramDefine.placeholder ? paramDefine.placeholder : ''"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
></nz-input-number>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label *ngIf="paramDefine.type === 'boolean'" nzSpan="7" [nzRequired]="paramDefine.required" [nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'boolean'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<nz-switch
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
></nz-switch>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label *ngIf="paramDefine.type === 'radio'" nzSpan="7" [nzRequired]="paramDefine.required" [nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'radio'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<nz-radio-group
|
|
||||||
[(ngModel)]="advancedParams[i].value"
|
|
||||||
[required]="paramDefine.required"
|
|
||||||
nzButtonStyle="solid"
|
|
||||||
[name]="paramDefine.field"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
>
|
|
||||||
<label nz-radio-button [nzValue]="optionItem.value" *ngFor="let optionItem of paramDefine.options">
|
|
||||||
{{ optionItem.label }}
|
|
||||||
</label>
|
|
||||||
</nz-radio-group>
|
|
||||||
</nz-form-control>
|
|
||||||
|
|
||||||
<nz-form-label
|
|
||||||
*ngIf="paramDefine.type === 'key-value'"
|
|
||||||
nzSpan="7"
|
|
||||||
[nzRequired]="paramDefine.required"
|
|
||||||
[nzFor]="paramDefine.field"
|
|
||||||
>{{ paramDefine.name }}
|
|
||||||
</nz-form-label>
|
|
||||||
<nz-form-control *ngIf="paramDefine.type === 'key-value'" nzSpan="8" [nzErrorTip]="'validation.required' | i18n">
|
|
||||||
<app-key-value-input
|
|
||||||
[(value)]="advancedParams[i].value"
|
|
||||||
[id]="paramDefine.field"
|
|
||||||
keyAlias="Header Name"
|
|
||||||
valueAlias="Header Value"
|
|
||||||
></app-key-value-input>
|
|
||||||
</nz-form-control>
|
|
||||||
</nz-form-item>
|
|
||||||
</nz-collapse-panel>
|
|
||||||
</nz-collapse>
|
|
||||||
<ng-template #extraColHeader>
|
|
||||||
<button style="top: -10px; margin-left: 40%" nz-button nzType="dashed" nz-tooltip nzTooltipTitle="设置高级可选参数">
|
|
||||||
<span>高级设置</span>
|
|
||||||
<i nz-icon nzType="down-circle" nzTheme="outline"></i>
|
|
||||||
</button>
|
|
||||||
</ng-template>
|
|
||||||
|
|
||||||
<nz-divider></nz-divider>
|
<nz-divider></nz-divider>
|
||||||
|
|
||||||
<nz-form-item>
|
<nz-form-item>
|
||||||
|
|||||||
@@ -20,8 +20,6 @@ import { MonitorService } from '../../../service/monitor.service';
|
|||||||
export class MonitorNewComponent implements OnInit {
|
export class MonitorNewComponent implements OnInit {
|
||||||
paramDefines!: ParamDefine[];
|
paramDefines!: ParamDefine[];
|
||||||
params!: Param[];
|
params!: Param[];
|
||||||
advancedParamDefines!: ParamDefine[];
|
|
||||||
advancedParams!: Param[];
|
|
||||||
monitor!: Monitor;
|
monitor!: Monitor;
|
||||||
detected: boolean = true;
|
detected: boolean = true;
|
||||||
passwordVisible: boolean = false;
|
passwordVisible: boolean = false;
|
||||||
@@ -55,11 +53,9 @@ export class MonitorNewComponent implements OnInit {
|
|||||||
)
|
)
|
||||||
.subscribe(message => {
|
.subscribe(message => {
|
||||||
if (message.code === 0) {
|
if (message.code === 0) {
|
||||||
|
this.paramDefines = message.data;
|
||||||
this.params = [];
|
this.params = [];
|
||||||
this.advancedParams = [];
|
this.paramDefines.forEach(define => {
|
||||||
this.paramDefines = [];
|
|
||||||
this.advancedParamDefines = [];
|
|
||||||
message.data.forEach(define => {
|
|
||||||
let param = new Param();
|
let param = new Param();
|
||||||
param.field = define.field;
|
param.field = define.field;
|
||||||
if (define.type === 'number') {
|
if (define.type === 'number') {
|
||||||
@@ -81,13 +77,7 @@ export class MonitorNewComponent implements OnInit {
|
|||||||
param.value = define.defaultValue;
|
param.value = define.defaultValue;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (define.hide) {
|
this.params.push(param);
|
||||||
this.advancedParams.push(param);
|
|
||||||
this.advancedParamDefines.push(define);
|
|
||||||
} else {
|
|
||||||
this.params.push(param);
|
|
||||||
this.paramDefines.push(define);
|
|
||||||
}
|
|
||||||
});
|
});
|
||||||
} else {
|
} else {
|
||||||
console.warn(message.msg);
|
console.warn(message.msg);
|
||||||
@@ -135,15 +125,10 @@ export class MonitorNewComponent implements OnInit {
|
|||||||
param.value = (param.value as string).trim();
|
param.value = (param.value as string).trim();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.advancedParams.forEach(param => {
|
|
||||||
if (param.value != null && typeof param.value == 'string') {
|
|
||||||
param.value = (param.value as string).trim();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
let addMonitor = {
|
let addMonitor = {
|
||||||
detected: this.detected,
|
detected: this.detected,
|
||||||
monitor: this.monitor,
|
monitor: this.monitor,
|
||||||
params: this.params.concat(this.advancedParams)
|
params: this.params
|
||||||
};
|
};
|
||||||
this.isSpinning = true;
|
this.isSpinning = true;
|
||||||
this.monitorSvc.newMonitor(addMonitor).subscribe(
|
this.monitorSvc.newMonitor(addMonitor).subscribe(
|
||||||
@@ -184,15 +169,10 @@ export class MonitorNewComponent implements OnInit {
|
|||||||
param.value = (param.value as string).trim();
|
param.value = (param.value as string).trim();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
this.advancedParams.forEach(param => {
|
|
||||||
if (param.value != null && typeof param.value == 'string') {
|
|
||||||
param.value = (param.value as string).trim();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
let detectMonitor = {
|
let detectMonitor = {
|
||||||
detected: true,
|
detected: true,
|
||||||
monitor: this.monitor,
|
monitor: this.monitor,
|
||||||
params: this.params.concat(this.advancedParams)
|
params: this.params
|
||||||
};
|
};
|
||||||
this.isSpinning = true;
|
this.isSpinning = true;
|
||||||
this.monitorSvc.detectMonitor(detectMonitor).subscribe(
|
this.monitorSvc.detectMonitor(detectMonitor).subscribe(
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ import { MonitorEditComponent } from './monitor-edit/monitor-edit.component';
|
|||||||
import { MonitorListComponent } from './monitor-list/monitor-list.component';
|
import { MonitorListComponent } from './monitor-list/monitor-list.component';
|
||||||
import { MonitorNewComponent } from './monitor-new/monitor-new.component';
|
import { MonitorNewComponent } from './monitor-new/monitor-new.component';
|
||||||
import { MonitorRoutingModule } from './monitor-routing.module';
|
import { MonitorRoutingModule } from './monitor-routing.module';
|
||||||
import { NzCollapseModule } from 'ng-zorro-antd/collapse';
|
|
||||||
|
|
||||||
const COMPONENTS: Array<Type<void>> = [
|
const COMPONENTS: Array<Type<void>> = [
|
||||||
MonitorNewComponent,
|
MonitorNewComponent,
|
||||||
@@ -38,8 +37,7 @@ const COMPONENTS: Array<Type<void>> = [
|
|||||||
NzRadioModule,
|
NzRadioModule,
|
||||||
NgxEchartsModule,
|
NgxEchartsModule,
|
||||||
NzLayoutModule,
|
NzLayoutModule,
|
||||||
NzSpaceModule,
|
NzSpaceModule
|
||||||
NzCollapseModule
|
|
||||||
],
|
],
|
||||||
declarations: COMPONENTS
|
declarations: COMPONENTS
|
||||||
})
|
})
|
||||||
|
|||||||
Reference in New Issue
Block a user