Compare commits

...

4 Commits

Author SHA1 Message Date
tomsun28
d0113b57b4 [manager]feature:only collect available metrics when detect 2022-04-06 08:29:18 +08:00
tomsun28
709d51d4d5 [collector]feature:enable auto redirect when 301 302 http code (#69) 2022-04-06 08:16:56 +08:00
tomsun28
ce528808c7 [monitor]feature:support hide advanced params define (#68)
* feature:support hide advanced params define
* feature:all monitors set advanced params
* feature:remove duplicate port monitor yml
2022-04-06 07:38:54 +08:00
tomsun28
51266aab87 [collector,alerter]bugfix:monitors always timeout alert (#67) 2022-04-05 20:50:33 +08:00
23 changed files with 404 additions and 82 deletions

View File

@@ -110,7 +110,7 @@ public class CalculateAlarm {
} else { } else {
// 其他异常 // 其他异常
alertBuilder.target(CommonConstants.AVAILABLE) alertBuilder.target(CommonConstants.AVAILABLE)
.content("监控紧急可用性告警: " + metricsData.getCode().name()); .content("监控可用性告警: " + metricsData.getCode().name() + " : " + metricsData.getMsg());
triggeredMonitorStateAlertMap.put(monitorId, metricsData.getCode()); triggeredMonitorStateAlertMap.put(monitorId, metricsData.getCode());
dataQueue.addAlertData(alertBuilder.build()); dataQueue.addAlertData(alertBuilder.build());
} }

View File

@@ -108,8 +108,8 @@ public class CommonHttpClient {
.setConnectTimeout(CONNECT_TIMEOUT) .setConnectTimeout(CONNECT_TIMEOUT)
// 数据传输最大响应间隔时间 // 数据传输最大响应间隔时间
.setSocketTimeout(SOCKET_TIMEOUT) .setSocketTimeout(SOCKET_TIMEOUT)
// 遇到301 302自动重定向跳转 // 遇到301 302自动重定向跳转
.setRedirectsEnabled(false) .setRedirectsEnabled(true)
.build(); .build();
// 连接池 // 连接池
connectionManager = new PoolingHttpClientConnectionManager(registry); connectionManager = new PoolingHttpClientConnectionManager(registry);

View File

@@ -105,9 +105,13 @@ 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);
if (metricsData.getPriority() == 0) {
dispatchCollectData(metricsTime.timeout, metricsTime.getMetrics(), metricsData); dispatchCollectData(metricsTime.timeout, metricsTime.getMetrics(), metricsData);
}
metricsTimeoutMonitorMap.remove(entry.getKey()); metricsTimeoutMonitorMap.remove(entry.getKey());
} }
} }
@@ -165,8 +169,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() + "-" + metrics.getName(), metricsTimeoutMonitorMap.put(job.getId() + "-" + metricItem.getName(),
new MetricsTime(System.currentTimeMillis(), metrics, timeout)); new MetricsTime(System.currentTimeMillis(), metricItem, timeout));
}); });
} else { } else {
// 当前执行级别的指标组列表未全执行完成, // 当前执行级别的指标组列表未全执行完成,
@@ -185,8 +189,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() + "-" + metrics.getName(), metricsTimeoutMonitorMap.put(job.getId() + "-" + metricItem.getName(),
new MetricsTime(System.currentTimeMillis(), metrics, timeout)); new MetricsTime(System.currentTimeMillis(), metricItem, timeout));
}); });
} else { } else {
// 当前执行级别的指标组列表未全执行完成, // 当前执行级别的指标组列表未全执行完成,

View File

@@ -34,6 +34,10 @@ 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
*/ */
@@ -267,11 +271,15 @@ 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);
log.debug("[Collect]: newTime: {}, startTime: {}, spendTime: {}.", newTime, startTime, endTime - startTime); long runningTime = 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 Fail] Reason: {}", builder.getMsg()); log.info("[Collect Failed, Run {}ms, All {}ms] Reason: {}", runningTime, allTime, builder.getMsg());
} else { } else {
log.info("[Collect Success]."); log.info("[Collect Success, Run {}ms, All {}ms].", runningTime, allTime);
} }
return builder.build(); return builder.build();
} }

View File

@@ -122,6 +122,12 @@ 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;
/** /**
* 此条记录创建者 * 此条记录创建者
*/ */

View File

@@ -79,6 +79,10 @@ 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()) {

View File

@@ -1,25 +0,0 @@
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^_^

View File

@@ -26,10 +26,12 @@ 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展示开关

View File

@@ -60,15 +60,18 @@ 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
@@ -81,7 +84,9 @@ 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

View File

@@ -17,6 +17,7 @@ param:
required: false required: false
defaultValue: 6000 defaultValue: 6000
placeholder: '查询超时时间' placeholder: '查询超时时间'
hide: true
- field: database - field: database
name: 数据库名称 name: 数据库名称
type: text type: text
@@ -34,3 +35,4 @@ param:
name: URL name: URL
type: text type: text
required: false required: false
hide: true

View File

@@ -15,6 +15,7 @@ param:
name: 查询超时时间 name: 查询超时时间
type: number type: number
required: false required: false
hide: true
defaultValue: 6000 defaultValue: 6000
placeholder: '查询超时时间' placeholder: '查询超时时间'
- field: database - field: database
@@ -34,3 +35,4 @@ param:
name: URL name: URL
type: text type: text
required: false required: false
hide: true

View File

@@ -15,6 +15,7 @@ param:
name: 查询超时时间 name: 查询超时时间
type: number type: number
required: false required: false
hide: true
defaultValue: 6000 defaultValue: 6000
placeholder: '查询超时时间' placeholder: '查询超时时间'
- field: database - field: database
@@ -34,3 +35,4 @@ param:
name: URL name: URL
type: text type: text
required: false required: false
hide: true

View File

@@ -15,6 +15,7 @@ param:
name: 查询超时时间 name: 查询超时时间
type: number type: number
required: false required: false
hide: true
defaultValue: 6000 defaultValue: 6000
placeholder: '查询超时时间' placeholder: '查询超时时间'
- field: database - field: database
@@ -34,3 +35,4 @@ param:
name: URL name: URL
type: text type: text
required: false required: false
hide: true

View File

@@ -15,6 +15,7 @@ param:
name: 查询超时时间 name: 查询超时时间
type: number type: number
required: false required: false
hide: true
defaultValue: 6000 defaultValue: 6000
placeholder: '查询超时时间' placeholder: '查询超时时间'
- field: database - field: database
@@ -34,3 +35,4 @@ param:
name: URL name: URL
type: text type: text
required: false required: false
hide: true

View File

@@ -1,27 +0,0 @@
# 监控应用类型名称(与文件名保持一致) 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

View File

@@ -33,6 +33,7 @@ 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
@@ -45,7 +46,9 @@ 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

View File

@@ -12,4 +12,6 @@ export class ParamDefine {
// 当type为key-value时有效,表示别名描述 // 当type为key-value时有效,表示别名描述
keyAlias!: string; keyAlias!: string;
valueAlias!: string; valueAlias!: string;
// 此参数是否隐藏 即默认不显示, 在高级设置区显示
hide: boolean = false;
} }

View File

@@ -162,11 +162,151 @@
</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="10"> <nz-form-control nzSpan="8">
<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>

View File

@@ -0,0 +1,8 @@
.dynamic-button {
font-size: 20px;
margin-left: 45%;
}
.dynamic-button:hover {
font-size: 30px;
}

View File

@@ -16,7 +16,7 @@ import { MonitorService } from '../../../service/monitor.service';
@Component({ @Component({
selector: 'app-monitor-modify', selector: 'app-monitor-modify',
templateUrl: './monitor-edit.component.html', templateUrl: './monitor-edit.component.html',
styles: [] styleUrls: ['./monitor-edit.component.less']
}) })
export class MonitorEditComponent implements OnInit { export class MonitorEditComponent implements OnInit {
constructor( constructor(
@@ -30,6 +30,8 @@ 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({});
@@ -59,7 +61,6 @@ 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);
@@ -73,7 +74,10 @@ export class MonitorEditComponent implements OnInit {
if (message.code === 0) { if (message.code === 0) {
this.paramDefines = message.data; this.paramDefines = message.data;
this.params = []; this.params = [];
this.paramDefines.forEach(define => { this.advancedParams = [];
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();
@@ -100,7 +104,13 @@ export class MonitorEditComponent implements OnInit {
} }
} }
} }
if (define.hide) {
this.advancedParams.push(param);
this.advancedParamDefines.push(define);
} else {
this.params.push(param); this.params.push(param);
this.paramDefines.push(define);
}
}); });
} else { } else {
console.warn(message.msg); console.warn(message.msg);
@@ -144,10 +154,15 @@ 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 params: this.params.concat(this.advancedParams)
}; };
this.isSpinning = true; this.isSpinning = true;
this.monitorSvc.editMonitor(addMonitor).subscribe( this.monitorSvc.editMonitor(addMonitor).subscribe(
@@ -188,10 +203,15 @@ 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 params: this.params.concat(this.advancedParams)
}; };
this.isSpinning = true; this.isSpinning = true;
this.monitorSvc.detectMonitor(detectMonitor).subscribe( this.monitorSvc.detectMonitor(detectMonitor).subscribe(

View File

@@ -171,6 +171,146 @@
</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>

View File

@@ -20,6 +20,8 @@ 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;
@@ -53,9 +55,11 @@ 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.paramDefines.forEach(define => { this.advancedParams = [];
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') {
@@ -77,7 +81,13 @@ export class MonitorNewComponent implements OnInit {
param.value = define.defaultValue; param.value = define.defaultValue;
} }
} }
if (define.hide) {
this.advancedParams.push(param);
this.advancedParamDefines.push(define);
} else {
this.params.push(param); this.params.push(param);
this.paramDefines.push(define);
}
}); });
} else { } else {
console.warn(message.msg); console.warn(message.msg);
@@ -125,10 +135,15 @@ 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 params: this.params.concat(this.advancedParams)
}; };
this.isSpinning = true; this.isSpinning = true;
this.monitorSvc.newMonitor(addMonitor).subscribe( this.monitorSvc.newMonitor(addMonitor).subscribe(
@@ -169,10 +184,15 @@ 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 params: this.params.concat(this.advancedParams)
}; };
this.isSpinning = true; this.isSpinning = true;
this.monitorSvc.detectMonitor(detectMonitor).subscribe( this.monitorSvc.detectMonitor(detectMonitor).subscribe(

View File

@@ -16,6 +16,7 @@ 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,
@@ -37,7 +38,8 @@ const COMPONENTS: Array<Type<void>> = [
NzRadioModule, NzRadioModule,
NgxEchartsModule, NgxEchartsModule,
NzLayoutModule, NzLayoutModule,
NzSpaceModule NzSpaceModule,
NzCollapseModule
], ],
declarations: COMPONENTS declarations: COMPONENTS
}) })