blob: aa68b3bf3e99db33ffca620cee817f1f11cd1bea [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import { Component, Inject, OnInit } from '@angular/core';
import { FormGroup } from '@angular/forms';
import { ActivatedRoute, ParamMap, Router } from '@angular/router';
import { I18NService } from '@core';
import { ALAIN_I18N_TOKEN, TitleService } from '@delon/theme';
import { NzNotificationService } from 'ng-zorro-antd/notification';
import { NzUploadFile } from 'ng-zorro-antd/upload';
import { of, throwError } from 'rxjs';
import { finalize, switchMap } from 'rxjs/operators';
import { Collector } from '../../../pojo/Collector';
import { GrafanaDashboard } from '../../../pojo/GrafanaDashboard';
import { Message } from '../../../pojo/Message';
import { Monitor } from '../../../pojo/Monitor';
import { Param } from '../../../pojo/Param';
import { ParamDefine } from '../../../pojo/ParamDefine';
import { AppDefineService } from '../../../service/app-define.service';
import { CollectorService } from '../../../service/collector.service';
import { LabelService } from '../../../service/label.service';
import { MonitorService } from '../../../service/monitor.service';
@Component({
selector: 'app-monitor-modify',
templateUrl: './monitor-edit.component.html',
styles: []
})
export class MonitorEditComponent implements OnInit {
constructor(
private appDefineSvc: AppDefineService,
private monitorSvc: MonitorService,
private route: ActivatedRoute,
private router: Router,
private titleSvc: TitleService,
private notifySvc: NzNotificationService,
private collectorSvc: CollectorService,
private labelSvc: LabelService,
@Inject(ALAIN_I18N_TOKEN) private i18nSvc: I18NService
) {}
sdDefines: ParamDefine[] = [];
sdParams: Param[] = [];
paramDefines!: ParamDefine[];
hostName!: string;
params!: Param[];
advancedParamDefines!: ParamDefine[];
advancedParams!: Param[];
paramValueMap!: Map<String, Param>;
monitor = new Monitor();
grafanaDashboard!: GrafanaDashboard;
collectors!: Collector[];
collector: string = '';
isSpinning: boolean = false;
spinningTip: string = 'Loading...';
labelKeys: string[] = [];
labelMap: { [key: string]: string[] } = {};
labelIsCustom: boolean = true;
ngOnInit(): void {
this.route.paramMap
.pipe(
switchMap((paramMap: ParamMap) => {
this.isSpinning = true;
let id = paramMap.get('monitorId');
this.monitor.id = Number(id);
// query monitor by id
return this.monitorSvc.getMonitor(this.monitor.id);
})
)
.pipe(
switchMap((message: Message<any>) => {
if (message.code === 0) {
let paramValueMap = new Map<String, Param>();
this.monitor = message.data.monitor;
if (this.monitor.scrape == null || this.monitor.scrape == undefined) {
this.monitor.scrape = 'static';
}
this.grafanaDashboard = message.data.grafanaDashboard != undefined ? message.data.grafanaDashboard : new GrafanaDashboard();
this.collector = message.data.collector == null ? '' : message.data.collector;
this.titleSvc.setTitleByI18n(`monitor.app.${this.monitor.app}`);
if (message.data.params != null) {
message.data.params.forEach((item: Param) => {
paramValueMap.set(item.field, item);
});
this.paramValueMap = paramValueMap;
}
} else {
console.warn(message.msg);
if (message.code === 3) {
// MONITOR_NOT_EXIST_CODE = 0x03
this.notifySvc.warning(this.i18nSvc.fanyi('monitor.item.unavailable'), '');
setTimeout(() => {
this.router.navigateByUrl('/monitors');
}, 1500);
} else {
this.notifySvc.error(this.i18nSvc.fanyi('monitor.not-found'), message.msg);
}
return throwError(this.i18nSvc.fanyi('monitor.not-found'));
}
return this.appDefineSvc.getAppParamsDefine(this.monitor.app);
})
)
.pipe(
switchMap(message => {
if (message.code === 0) {
let params: Param[] = [];
let advancedParams: Param[] = [];
let paramDefines: ParamDefine[] = [];
let advancedParamDefines: ParamDefine[] = [];
message.data.forEach(define => {
let param = this.paramValueMap.get(define.field);
if (param === undefined) {
param = new Param();
param.field = define.field;
if (define.type === 'number') {
param.type = 0;
} else if (define.type === 'key-value') {
param.type = 3;
} else if (define.type === 'array') {
param.type = 4;
} else {
param.type = 1;
}
if (define.type === 'boolean') {
param.paramValue = define.defaultValue == 'true';
} else if (define.defaultValue != undefined) {
if (define.type === 'number') {
param.paramValue = Number(define.defaultValue);
} else if (define.type === 'boolean') {
param.paramValue = define.defaultValue.toLowerCase() == 'true';
} else {
param.paramValue = define.defaultValue;
}
}
} else {
if (define.type === 'boolean') {
if (param.paramValue != null) {
param.paramValue = param.paramValue.toLowerCase() == 'true';
} else {
param.paramValue = false;
}
}
}
define.name = this.i18nSvc.fanyi(`monitor.app.${this.monitor.app}.param.${define.field}`);
if (define.placeholder == null && this.i18nSvc.fanyi(`monitor.${define.field}.tip`) != `monitor.${define.field}.tip`) {
define.placeholder = this.i18nSvc.fanyi(`monitor.${define.field}.tip`);
}
if (define.hide) {
advancedParams.push(param);
advancedParamDefines.push(define);
} else {
params.push(param);
paramDefines.push(define);
}
if (
define.field == 'host' &&
define.type == 'host' &&
define.name != `monitor.app.${this.monitor.app}.param.${define.field}`
) {
this.hostName = define.name;
}
});
this.params = [...params];
this.advancedParams = [...advancedParams];
this.paramDefines = [...paramDefines];
this.advancedParamDefines = [...advancedParamDefines];
} else {
console.warn(message.msg);
}
return this.collectorSvc.getCollectors();
})
)
.pipe(
switchMap((message: any) => {
if (message.code === 0) {
this.collectors = message.data.content?.map((item: { collector: any }) => item.collector);
} else {
console.warn(message.msg);
}
if (this.monitor.scrape == 'static') {
return of({ code: 0, data: [], msg: '' });
} else {
return this.appDefineSvc.getAppParamsDefine(this.monitor.scrape);
}
})
)
.subscribe(
message => {
if (message.code === 0) {
if (message.data.length > 0) {
let params: Param[] = [];
let paramDefines: ParamDefine[] = [];
message.data.forEach(define => {
let param = this.paramValueMap.get(define.field);
if (param === undefined) {
param = new Param();
param.field = define.field;
if (define.type === 'number') {
param.type = 0;
} else if (define.type === 'key-value') {
param.type = 3;
} else if (define.type === 'array') {
param.type = 4;
} else {
param.type = 1;
}
if (define.type === 'boolean') {
param.paramValue = define.defaultValue == 'true';
} else if (param.field === 'host') {
param.paramValue = this.monitor.instance;
} else if (define.defaultValue != undefined) {
if (define.type === 'number') {
param.paramValue = Number(define.defaultValue);
} else if (define.type === 'boolean') {
param.paramValue = define.defaultValue.toLowerCase() == 'true';
} else {
param.paramValue = define.defaultValue;
}
}
} else {
if (define.type === 'boolean') {
if (param.paramValue != null) {
param.paramValue = param.paramValue.toLowerCase() == 'true';
} else {
param.paramValue = false;
}
}
}
define.name = this.i18nSvc.fanyi(`monitor.app.${this.monitor.scrape}.param.${define.field}`);
if (define.placeholder == null && this.i18nSvc.fanyi(`monitor.${define.field}.tip`) != `monitor.${define.field}.tip`) {
define.placeholder = this.i18nSvc.fanyi(`monitor.${define.field}.tip`);
}
if (define.hide) {
param.display = false;
}
params.push(param);
paramDefines.push(define);
});
this.sdParams = [...params];
this.sdDefines = [...paramDefines];
}
} else {
console.warn(message.msg);
}
this.isSpinning = false;
},
error => {
this.isSpinning = false;
}
);
this.loadLabels();
}
onScrapeChange(scrapeValue: string) {
this.monitor.scrape = scrapeValue;
if (this.monitor.scrape !== 'static') {
this.isSpinning = true;
let queryScrapeDefine$ = this.appDefineSvc
.getAppParamsDefine(this.monitor.scrape)
.pipe(
finalize(() => {
queryScrapeDefine$.unsubscribe();
this.isSpinning = false;
})
)
.subscribe(message => {
if (message.code === 0) {
let params: Param[] = [];
let paramDefines: ParamDefine[] = [];
message.data.forEach(define => {
let param = new Param();
param.field = define.field;
if (define.type === 'number') {
param.type = 0;
} else if (define.type === 'key-value') {
param.type = 3;
} else if (define.type === 'array') {
param.type = 4;
} else {
param.type = 1;
}
if (define.type === 'boolean') {
param.paramValue = false;
}
if (define.defaultValue != undefined) {
if (define.type === 'number') {
param.paramValue = Number(define.defaultValue);
} else if (define.type === 'boolean') {
param.paramValue = define.defaultValue.toLowerCase() == 'true';
} else {
param.paramValue = define.defaultValue;
}
}
define.name = this.i18nSvc.fanyi(`monitor.app.${this.monitor.scrape}.param.${define.field}`);
if (define.placeholder == null && this.i18nSvc.fanyi(`monitor.${define.field}.tip`) != `monitor.${define.field}.tip`) {
define.placeholder = this.i18nSvc.fanyi(`monitor.${define.field}.tip`);
}
if (define.hide) {
param.display = false;
}
params.push(param);
paramDefines.push(define);
});
this.sdParams = [...params];
this.sdDefines = [...paramDefines];
}
});
}
}
onSubmit(info: any) {
let addMonitor = {
monitor: info.monitor,
collector: info.collector,
params: info.params.concat(info.advancedParams).concat(info.sdParams),
grafanaDashboard: info.grafanaDashboard
};
this.spinningTip = 'Loading...';
this.isSpinning = true;
this.monitorSvc.editMonitor(addMonitor).subscribe(
message => {
this.isSpinning = false;
if (message.code === 0) {
this.notifySvc.success(this.i18nSvc.fanyi('monitor.edit.success'), '');
this.router.navigateByUrl(`/monitors?app=${info.monitor.app}`);
} else {
this.notifySvc.error(this.i18nSvc.fanyi('monitor.edit.failed'), message.msg);
}
},
error => {
this.isSpinning = false;
this.notifySvc.error(this.i18nSvc.fanyi('monitor.edit.failed'), error.msg);
}
);
}
onDetect(info: any) {
let detectMonitor = {
monitor: info.monitor,
collector: info.collector,
params: info.params.concat(info.advancedParams).concat(info.sdParams)
};
this.spinningTip = this.i18nSvc.fanyi('monitor.spinning-tip.detecting');
this.isSpinning = true;
this.monitorSvc.detectMonitor(detectMonitor).subscribe(
message => {
this.isSpinning = false;
if (message.code === 0) {
this.notifySvc.success(this.i18nSvc.fanyi('monitor.detect.success'), '');
} else {
this.notifySvc.error(this.i18nSvc.fanyi('monitor.detect.failed'), message.msg);
}
},
error => {
this.isSpinning = false;
this.notifySvc.error(this.i18nSvc.fanyi('monitor.detect.failed'), error.msg);
}
);
}
onCancel() {
this.router.navigateByUrl(`/monitors`);
}
loadLabels() {
let labelsInit$ = this.labelSvc.loadLabels(undefined, undefined, 0, 9999).subscribe(
message => {
if (message.code === 0) {
let page = message.data;
this.labelKeys = [...new Set(page.content.map(label => label.name))];
this.labelMap = {};
page.content.forEach(label => {
if (!this.labelMap[label.name]) {
this.labelMap[label.name] = [];
}
if (label.tagValue && !this.labelMap[label.name].includes(label.tagValue)) {
this.labelMap[label.name].push(label.tagValue);
}
});
} else {
console.warn(message.msg);
}
labelsInit$.unsubscribe();
},
error => {
labelsInit$.unsubscribe();
console.error(error.msg);
}
);
}
}