[monitor] 调整监控参数定义字段,监控参数和监控配置暂时存在内存
This commit is contained in:
@@ -14,5 +14,6 @@ collector:
|
|||||||
endpoints: http://139.198.109.64:2379
|
endpoints: http://139.198.109.64:2379
|
||||||
export:
|
export:
|
||||||
kafka:
|
kafka:
|
||||||
servers: localhost:9092
|
|
||||||
enabled: true
|
enabled: true
|
||||||
|
servers: localhost:9092
|
||||||
|
topic: async-collect-data
|
||||||
|
|||||||
@@ -68,9 +68,6 @@ public class Metrics {
|
|||||||
*/
|
*/
|
||||||
private JdbcProtocol jdbc;
|
private JdbcProtocol jdbc;
|
||||||
|
|
||||||
/**
|
|
||||||
* todo 替换指标信息
|
|
||||||
*/
|
|
||||||
@Data
|
@Data
|
||||||
@AllArgsConstructor
|
@AllArgsConstructor
|
||||||
@NoArgsConstructor
|
@NoArgsConstructor
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package com.usthe.common.util;
|
package com.usthe.common.util;
|
||||||
|
|
||||||
import com.google.protobuf.Message;
|
import com.google.protobuf.Message;
|
||||||
import com.google.protobuf.MessageOrBuilder;
|
|
||||||
import com.google.protobuf.util.JsonFormat;
|
import com.google.protobuf.util.JsonFormat;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
|
|
||||||
@@ -13,6 +12,9 @@ import lombok.extern.slf4j.Slf4j;
|
|||||||
@Slf4j
|
@Slf4j
|
||||||
public class ProtoJsonUtil {
|
public class ProtoJsonUtil {
|
||||||
|
|
||||||
|
private static final JsonFormat.Printer PRINTER = JsonFormat.printer();
|
||||||
|
private static final JsonFormat.Parser PARSER = JsonFormat.parser();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* protobuf 转 json
|
* protobuf 转 json
|
||||||
* @param proto protobuf
|
* @param proto protobuf
|
||||||
@@ -20,7 +22,7 @@ public class ProtoJsonUtil {
|
|||||||
*/
|
*/
|
||||||
public static String toJsonStr(Message proto) {
|
public static String toJsonStr(Message proto) {
|
||||||
try {
|
try {
|
||||||
return JsonFormat.printer().print(proto);
|
return PRINTER.print(proto);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
return null;
|
return null;
|
||||||
@@ -35,7 +37,7 @@ public class ProtoJsonUtil {
|
|||||||
*/
|
*/
|
||||||
public static Message toProtobuf(String json, Message.Builder builder) {
|
public static Message toProtobuf(String json, Message.Builder builder) {
|
||||||
try {
|
try {
|
||||||
JsonFormat.parser().merge(json, builder);
|
PARSER.merge(json, builder);
|
||||||
return builder.build();
|
return builder.build();
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
log.error(e.getMessage(), e);
|
log.error(e.getMessage(), e);
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ import com.usthe.manager.pojo.entity.Param;
|
|||||||
import io.swagger.annotations.ApiModel;
|
import io.swagger.annotations.ApiModel;
|
||||||
import io.swagger.annotations.ApiModelProperty;
|
import io.swagger.annotations.ApiModelProperty;
|
||||||
import lombok.Data;
|
import lombok.Data;
|
||||||
import org.springframework.validation.annotation.Validated;
|
|
||||||
|
|
||||||
import javax.validation.Valid;
|
import javax.validation.Valid;
|
||||||
import javax.validation.constraints.NotNull;
|
import javax.validation.constraints.NotNull;
|
||||||
|
|||||||
@@ -0,0 +1,23 @@
|
|||||||
|
package com.usthe.manager.pojo.dto;
|
||||||
|
|
||||||
|
import com.usthe.manager.pojo.entity.ParamDefine;
|
||||||
|
import lombok.AllArgsConstructor;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 参数定义传输实体
|
||||||
|
* @author tomsun28
|
||||||
|
* @date 2021/11/16 16:50
|
||||||
|
*/
|
||||||
|
@Data
|
||||||
|
@AllArgsConstructor
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class ParamDefineDto {
|
||||||
|
|
||||||
|
private String app;
|
||||||
|
|
||||||
|
private List<ParamDefine> param;
|
||||||
|
}
|
||||||
@@ -45,14 +45,14 @@ public class Monitor {
|
|||||||
/**
|
/**
|
||||||
* 监控的名称
|
* 监控的名称
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "监控名称", example = "Api-bing.com", accessMode = READ_WRITE, position = 2)
|
@ApiModelProperty(value = "监控名称", example = "Api-TanCloud.cn", accessMode = READ_WRITE, position = 2)
|
||||||
@Length(max = 100)
|
@Length(max = 100)
|
||||||
private String name;
|
private String name;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 监控的类型:linux,mysql,jvm...
|
* 监控的类型:linux,mysql,jvm...
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "监控类型", example = "api", accessMode = READ_WRITE, position = 3)
|
@ApiModelProperty(value = "监控类型", example = "TanCloud", accessMode = READ_WRITE, position = 3)
|
||||||
@Length(max = 100)
|
@Length(max = 100)
|
||||||
private String app;
|
private String app;
|
||||||
|
|
||||||
@@ -81,7 +81,7 @@ public class Monitor {
|
|||||||
/**
|
/**
|
||||||
* 监控备注描述
|
* 监控备注描述
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "监控备注描述", example = "对搜索网站bing的可用性监控", accessMode = READ_WRITE, position = 7)
|
@ApiModelProperty(value = "监控备注描述", example = "对SAAS网站TanCloud的可用性监控", accessMode = READ_WRITE, position = 7)
|
||||||
@Length(max = 255)
|
@Length(max = 255)
|
||||||
private String description;
|
private String description;
|
||||||
|
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_ONLY;
|
|||||||
import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
import static io.swagger.annotations.ApiModelProperty.AccessMode.READ_WRITE;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
* todo 字段默认值
|
||||||
* 监控参数定义
|
* 监控参数定义
|
||||||
* @author tomsun28
|
* @author tomsun28
|
||||||
* @date 2021/11/13 21:49
|
* @date 2021/11/13 21:49
|
||||||
@@ -40,7 +41,7 @@ public class ParamDefine {
|
|||||||
/**
|
/**
|
||||||
* 监控应用类型名称
|
* 监控应用类型名称
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "监控类型", example = "api", accessMode = READ_WRITE, position = 1)
|
@ApiModelProperty(value = "监控类型", example = "TanCloud", accessMode = READ_WRITE, position = 1)
|
||||||
private String app;
|
private String app;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -61,17 +62,23 @@ public class ParamDefine {
|
|||||||
@ApiModelProperty(value = "字段类型,样式(大部分映射input标签type属性)", example = "number", accessMode = READ_WRITE, position = 4)
|
@ApiModelProperty(value = "字段类型,样式(大部分映射input标签type属性)", example = "number", accessMode = READ_WRITE, position = 4)
|
||||||
private String type;
|
private String type;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 是否是必输项 true-必填 false-可选
|
||||||
|
*/
|
||||||
|
@ApiModelProperty(value = "是否是必输项 true-必填 false-可选", example = "true", accessMode = READ_WRITE, position = 5)
|
||||||
|
private boolean required = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 当type为number时,用range表示范围 eg: 0-233
|
* 当type为number时,用range表示范围 eg: 0-233
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "当type为number时,用range表示范围", example = "0-233", accessMode = READ_WRITE, position = 5)
|
@ApiModelProperty(value = "当type为number时,用range表示范围", example = "0-233", accessMode = READ_WRITE, position = 6)
|
||||||
@Column(name = "param_range")
|
@Column(name = "param_range")
|
||||||
private String range;
|
private String range;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 当type为text时,用limit表示字符串限制大小.最大255
|
* 当type为text时,用limit表示字符串限制大小.最大255
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "当type为text时,用limit表示字符串限制大小.最大255", example = "30", accessMode = READ_WRITE, position = 6)
|
@ApiModelProperty(value = "当type为text时,用limit表示字符串限制大小.最大255", example = "30", accessMode = READ_WRITE, position = 7)
|
||||||
@Column(name = "param_limit")
|
@Column(name = "param_limit")
|
||||||
private short limit;
|
private short limit;
|
||||||
|
|
||||||
@@ -79,31 +86,31 @@ public class ParamDefine {
|
|||||||
* 当type为radio单选框,checkbox复选框时,option表示可选项值列表
|
* 当type为radio单选框,checkbox复选框时,option表示可选项值列表
|
||||||
* eg: param3,param4,param5
|
* eg: param3,param4,param5
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "当type为radio单选框,checkbox复选框时,option表示可选项值列表", example = "10,20,30", accessMode = READ_WRITE, position = 7)
|
@ApiModelProperty(value = "当type为radio单选框,checkbox复选框时,option表示可选项值列表", example = "10,20,30", accessMode = READ_WRITE, position = 8)
|
||||||
@Column(name = "param_option")
|
@Column(name = "param_option")
|
||||||
private String option;
|
private String option;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 此条记录创建者
|
* 此条记录创建者
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "此条记录创建者", example = "tom", accessMode = READ_ONLY, position = 8)
|
@ApiModelProperty(value = "此条记录创建者", example = "tom", accessMode = READ_ONLY, position = 9)
|
||||||
private String creator;
|
private String creator;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 此条记录最新修改者
|
* 此条记录最新修改者
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "此条记录最新修改者", example = "tom", accessMode = READ_ONLY, position = 9)
|
@ApiModelProperty(value = "此条记录最新修改者", example = "tom", accessMode = READ_ONLY, position = 10)
|
||||||
private String modifier;
|
private String modifier;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 记录创建时间
|
* 记录创建时间
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "记录创建时间(毫秒时间戳)", example = "1612198922000", accessMode = READ_ONLY, position = 10)
|
@ApiModelProperty(value = "记录创建时间(毫秒时间戳)", example = "1612198922000", accessMode = READ_ONLY, position = 11)
|
||||||
private LocalDateTime gmtCreate;
|
private LocalDateTime gmtCreate;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 记录最新修改时间
|
* 记录最新修改时间
|
||||||
*/
|
*/
|
||||||
@ApiModelProperty(value = "记录最新修改时间(毫秒时间戳)", example = "1612198444000", accessMode = READ_ONLY, position = 11)
|
@ApiModelProperty(value = "记录最新修改时间(毫秒时间戳)", example = "1612198444000", accessMode = READ_ONLY, position = 12)
|
||||||
private LocalDateTime gmtUpdate;
|
private LocalDateTime gmtUpdate;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ package com.usthe.manager.service.impl;
|
|||||||
|
|
||||||
import com.usthe.common.entity.job.Job;
|
import com.usthe.common.entity.job.Job;
|
||||||
import com.usthe.manager.dao.ParamDefineDao;
|
import com.usthe.manager.dao.ParamDefineDao;
|
||||||
|
import com.usthe.manager.pojo.dto.ParamDefineDto;
|
||||||
import com.usthe.manager.pojo.entity.ParamDefine;
|
import com.usthe.manager.pojo.entity.ParamDefine;
|
||||||
import com.usthe.manager.service.AppService;
|
import com.usthe.manager.service.AppService;
|
||||||
import lombok.extern.slf4j.Slf4j;
|
import lombok.extern.slf4j.Slf4j;
|
||||||
@@ -11,7 +12,6 @@ import org.springframework.stereotype.Service;
|
|||||||
import org.springframework.transaction.annotation.Transactional;
|
import org.springframework.transaction.annotation.Transactional;
|
||||||
import org.yaml.snakeyaml.Yaml;
|
import org.yaml.snakeyaml.Yaml;
|
||||||
|
|
||||||
import javax.persistence.criteria.Join;
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
@@ -24,6 +24,7 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* 监控类型管理实现
|
* 监控类型管理实现
|
||||||
|
* TODO 暂时将监控配置和参数配置存放内存 之后存入数据库
|
||||||
* @author tomsun28
|
* @author tomsun28
|
||||||
* @date 2021/11/14 17:17
|
* @date 2021/11/14 17:17
|
||||||
*/
|
*/
|
||||||
@@ -33,17 +34,18 @@ import java.util.concurrent.ConcurrentHashMap;
|
|||||||
public class AppServiceImpl implements AppService, CommandLineRunner {
|
public class AppServiceImpl implements AppService, CommandLineRunner {
|
||||||
|
|
||||||
private final Map<String, Job> appDefines = new ConcurrentHashMap<>();
|
private final Map<String, Job> appDefines = new ConcurrentHashMap<>();
|
||||||
|
private final Map<String, List<ParamDefine>> paramDefines = new ConcurrentHashMap<>();
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ParamDefineDao paramDefineDao;
|
private ParamDefineDao paramDefineDao;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public List<ParamDefine> getAppParamDefines(String app) {
|
public List<ParamDefine> getAppParamDefines(String app) {
|
||||||
List<ParamDefine> paramDefines = paramDefineDao.findParamDefinesByApp(app);
|
List<ParamDefine> params = paramDefines.get(app);
|
||||||
if (paramDefines == null) {
|
if (params == null) {
|
||||||
paramDefines = Collections.emptyList();
|
params = Collections.emptyList();
|
||||||
}
|
}
|
||||||
return paramDefines;
|
return params;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -77,5 +79,24 @@ public class AppServiceImpl implements AppService, CommandLineRunner {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// 读取监控参数定义配置加载到数据库中 define/param/*.yml
|
||||||
|
String defineParamPath = "define" + File.separator + "param";
|
||||||
|
url = Thread.currentThread().getContextClassLoader().getResource(defineParamPath);
|
||||||
|
assert url != null;
|
||||||
|
directory = new File(url.toURI());
|
||||||
|
if (!directory.exists() || directory.listFiles() == null) {
|
||||||
|
throw new IllegalArgumentException("define param directory not exist");
|
||||||
|
}
|
||||||
|
for (File appFile : Objects.requireNonNull(directory.listFiles())) {
|
||||||
|
if (appFile.exists()) {
|
||||||
|
try (FileInputStream fileInputStream = new FileInputStream(appFile)) {
|
||||||
|
ParamDefineDto paramDefine = yaml.loadAs(fileInputStream, ParamDefineDto.class);
|
||||||
|
paramDefines.put(paramDefine.getApp(), paramDefine.getParam());
|
||||||
|
} catch (IOException e) {
|
||||||
|
log.error(e.getMessage(), e);
|
||||||
|
throw new IOException(e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,10 @@ public class MonitorServiceImpl implements MonitorService {
|
|||||||
appDefine.setConfigmap(configmaps);
|
appDefine.setConfigmap(configmaps);
|
||||||
List<CollectRep.MetricsData> collectRep = jobScheduling.addSyncCollectJob(appDefine);
|
List<CollectRep.MetricsData> collectRep = jobScheduling.addSyncCollectJob(appDefine);
|
||||||
// 判断探测结果 失败则抛出探测异常
|
// 判断探测结果 失败则抛出探测异常
|
||||||
if (collectRep == null || collectRep.isEmpty() || collectRep.get(0).getCode() != CollectRep.Code.SUCCESS) {
|
if (collectRep == null || collectRep.isEmpty()) {
|
||||||
|
throw new MonitorDetectException("No collector response");
|
||||||
|
}
|
||||||
|
if (collectRep.get(0).getCode() != CollectRep.Code.SUCCESS) {
|
||||||
throw new MonitorDetectException(collectRep.get(0).getMsg());
|
throw new MonitorDetectException(collectRep.get(0).getMsg());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,7 @@ CREATE TABLE param_define
|
|||||||
name varchar(100) not null comment '参数字段对外显示名称',
|
name varchar(100) not null comment '参数字段对外显示名称',
|
||||||
field varchar(100) not null comment '参数字段标识符',
|
field varchar(100) not null comment '参数字段标识符',
|
||||||
type varchar(20) not null default 'text' comment '字段类型,样式(大部分映射input标签type属性)',
|
type varchar(20) not null default 'text' comment '字段类型,样式(大部分映射input标签type属性)',
|
||||||
|
required boolean not null default false comment '是否是必输项 true-必填 false-可选',
|
||||||
param_range varchar(100) not null comment '当type为number时,用range表示范围 eg: 0-233',
|
param_range varchar(100) not null comment '当type为number时,用range表示范围 eg: 0-233',
|
||||||
param_limit tinyint unsigned not null comment '当type为text时,用limit表示字符串限制大小.最大255',
|
param_limit tinyint unsigned not null comment '当type为text时,用limit表示字符串限制大小.最大255',
|
||||||
param_option varchar(255) not null comment '当type为radio单选框,checkbox复选框时,option表示可选项值列表',
|
param_option varchar(255) not null comment '当type为radio单选框,checkbox复选框时,option表示可选项值列表',
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# 监控应用类型名称(与文件名保持一致) eg: linux windows tomcat mysql aws...
|
# 监控应用类型名称(与文件名保持一致) eg: linux windows tomcat mysql aws...
|
||||||
app: cloud
|
app: TanCloud
|
||||||
# 参数映射map. type是参数类型: number数字, string明文字符串, secret加密字符串
|
# 参数映射map. type是参数类型: number数字, string明文字符串, secret加密字符串
|
||||||
# 强制固定必须参数 - host
|
# 强制固定必须参数 - host
|
||||||
configmap:
|
configmap:
|
||||||
|
|||||||
@@ -1,23 +1,33 @@
|
|||||||
# 监控应用类型名称(与文件名保持一致) eg: linux windows tomcat mysql aws...
|
# 监控应用类型名称(与文件名保持一致) eg: linux windows tomcat mysql aws...
|
||||||
app: cloud
|
app: TanCloud
|
||||||
# 强制固定必须参数 - host(ipv4,ipv6,域名)
|
# 强制固定必须参数 - host(ipv4,ipv6,域名)
|
||||||
param:
|
param:
|
||||||
# field-字段名称标识符 type-字段类型,样式(大部分映射input标签type属性)
|
# field-字段名称标识符
|
||||||
- field: host
|
- field: host
|
||||||
|
# name-参数字段显示名称
|
||||||
|
name: 主机Host
|
||||||
|
# type-字段类型,样式(大部分映射input标签type属性)
|
||||||
type: host
|
type: host
|
||||||
|
# 是否是必输项 true-必填 false-可选
|
||||||
|
required: true
|
||||||
- field: port
|
- field: port
|
||||||
|
name: 端口
|
||||||
type: number
|
type: number
|
||||||
# 当type为number时,用range表示范围
|
# 当type为number时,用range表示范围
|
||||||
range: 0-255
|
range: 0-255
|
||||||
|
required: true
|
||||||
- field: username
|
- field: username
|
||||||
|
name: 用户名
|
||||||
type: text
|
type: text
|
||||||
# 当type为text时,用limit表示字符串限制大小
|
# 当type为text时,用limit表示字符串限制大小
|
||||||
limit: 20
|
limit: 20
|
||||||
|
required: false
|
||||||
- field: password
|
- field: password
|
||||||
|
name: 密码
|
||||||
type: password
|
type: password
|
||||||
- field: param1
|
required: false
|
||||||
|
- field: ssl
|
||||||
|
name: 启动SSL
|
||||||
type: radio
|
type: radio
|
||||||
# 当type为radio单选框,checkbox复选框时,option表示可选项值列表
|
# 当type为radio单选框,checkbox复选框时,option表示可选项值列表
|
||||||
option:
|
option: Yes,No
|
||||||
- param3
|
|
||||||
- param4
|
|
||||||
Reference in New Issue
Block a user