diff options
| author | shizhendong <[email protected]> | 2020-07-06 15:26:44 +0800 |
|---|---|---|
| committer | shizhendong <[email protected]> | 2020-07-06 15:26:44 +0800 |
| commit | 6d2fdf260cdecfd77429ff4420bb50ca421e277c (patch) | |
| tree | 0773df639fb87d15ede7ddd9cc82e9951a5320ea | |
| parent | f9741cc11f14c3a415cc8d0bf9c9a8b8e82500e6 (diff) | |
NEZ-345 feat: 增加对 thanos rule 的支持
1. confAgent 增加对 thanos rule 的支持
2. 修改prometheus 、snmp_exporter原有热加载配置文件方式
3. 修改prometheus.service 启动服务中 保存天数替换问题
4. 修改snmp工具类中 transport 未关闭问题
| -rw-r--r-- | src/main/java/com/nis/dao/ConfEventDao.java | 9 | ||||
| -rw-r--r-- | src/main/java/com/nis/dao/PromserverDao.java | 4 | ||||
| -rw-r--r-- | src/main/java/com/nis/job/ConfagentJob.java | 327 | ||||
| -rw-r--r-- | src/main/java/com/nis/service/ConfEventService.java | 18 | ||||
| -rw-r--r-- | src/main/java/com/nis/service/PromserverService.java | 5 | ||||
| -rw-r--r-- | src/main/java/com/nis/service/impl/ConfEventServiceImpl.java | 7 | ||||
| -rw-r--r-- | src/main/java/com/nis/service/impl/PromserverServiceImpl.java | 12 | ||||
| -rw-r--r-- | src/main/java/com/nis/service/impl/TrafficServiceImpl.java | 2 | ||||
| -rw-r--r-- | src/main/java/com/nis/util/ConfigUtil.java | 15 | ||||
| -rw-r--r-- | src/main/java/com/nis/util/Constant.java | 49 | ||||
| -rw-r--r-- | src/main/java/com/nis/util/SnmpUtil.java | 14 | ||||
| -rw-r--r-- | src/main/java/com/nis/util/YamlUtil.java | 101 | ||||
| -rw-r--r-- | src/main/resources/application.yml | 3 | ||||
| -rw-r--r-- | src/main/resources/mapper/ConfEventDao.xml | 5 | ||||
| -rw-r--r-- | src/main/resources/mapper/PromserverDao.xml | 4 |
15 files changed, 395 insertions, 180 deletions
diff --git a/src/main/java/com/nis/dao/ConfEventDao.java b/src/main/java/com/nis/dao/ConfEventDao.java index ab240cf..74c8014 100644 --- a/src/main/java/com/nis/dao/ConfEventDao.java +++ b/src/main/java/com/nis/dao/ConfEventDao.java @@ -1,14 +1,15 @@ package com.nis.dao;
-import java.util.List;
-
+import com.nis.entity.ConfEvent;
import org.apache.ibatis.annotations.Mapper;
+import org.apache.ibatis.annotations.Param;
-import com.nis.entity.ConfEvent;
+import java.util.List;
@Mapper
public interface ConfEventDao {
List<ConfEvent> selectList();
-
+
+ ConfEvent selectConfEvent(@Param("table") String table);
}
diff --git a/src/main/java/com/nis/dao/PromserverDao.java b/src/main/java/com/nis/dao/PromserverDao.java index bfcc7e1..4ad89f4 100644 --- a/src/main/java/com/nis/dao/PromserverDao.java +++ b/src/main/java/com/nis/dao/PromserverDao.java @@ -11,8 +11,8 @@ import com.nis.entity.Promserver; public interface PromserverDao {
List<Promserver> selectList();
-
- Promserver selectRoleByIp(String ip);
+
+ Promserver selectRoleByIpAndPort(@Param("ip") String ip, @Param("port") String port);
List<Promserver> selectSubInfo(@Param("promserver")Promserver promserver);
diff --git a/src/main/java/com/nis/job/ConfagentJob.java b/src/main/java/com/nis/job/ConfagentJob.java index 3244ac0..abdd3af 100644 --- a/src/main/java/com/nis/job/ConfagentJob.java +++ b/src/main/java/com/nis/job/ConfagentJob.java @@ -1,14 +1,10 @@ package com.nis.job; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; -import java.util.LinkedHashMap; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.stream.Collectors; - +import com.alibaba.fastjson.JSON; +import com.nis.entity.*; +import com.nis.service.*; +import com.nis.util.Constant; +import com.nis.util.YamlUtil; import org.apache.commons.lang3.StringUtils; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; @@ -18,27 +14,13 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.data.redis.core.HashOperations; import org.springframework.data.redis.core.RedisTemplate; -import org.springframework.data.redis.serializer.RedisSerializer; -import org.springframework.data.redis.serializer.StringRedisSerializer; +import org.springframework.http.ResponseEntity; import org.springframework.scheduling.quartz.QuartzJobBean; +import org.springframework.web.client.RestClientException; +import org.springframework.web.client.RestTemplate; -import com.alibaba.fastjson.JSON; -import com.nis.entity.AlertManagerEnum; -import com.nis.entity.AlertRule; -import com.nis.entity.Endpoint; -import com.nis.entity.Module; -import com.nis.entity.ModuleTypeEnum; -import com.nis.entity.Promserver; -import com.nis.entity.SysConfig; -import com.nis.service.AlertRuleService; -import com.nis.service.ConfEventService; -import com.nis.service.EndpointService; -import com.nis.service.PromserverService; -import com.nis.service.SysConfigService; -import com.nis.util.ConfigUtil; -import com.nis.util.Constant; -import com.nis.util.PropertyPlaceholder; -import com.nis.util.YamlUtil; +import java.util.*; +import java.util.stream.Collectors; /** * confagent job任务相关 处理同步prometheus配置信息 @@ -58,16 +40,13 @@ public class ConfagentJob extends QuartzJobBean { private AlertRuleService alertRuleService; @Autowired private SysConfigService sysConfigService; - @Autowired - private ConfigUtil configUtil; + @Value("${confagent.ipaddr}") private String ipaddr; @Value("${confagent.ymlPath}") private String ymlPath; @Value("${confagent.ruleYmlPath}") private String ruleYmlPath; - @Value("${confagent.prometheusPort}") - private String prometheusPort; @Value("${confagent.metricsPath}") private String metricsPath; @Value("${confagent.snmpYmlPath}") @@ -76,95 +55,178 @@ public class ConfagentJob extends QuartzJobBean { private String prometheusServicePath; @Value("${confagent.snmpPort}") private String snmpPort; + + @Value("${confagent.promServerPort}") + private String promServerPort; + + @Value("${confagent.promServerType}") + private Integer promServerType; + @Autowired private RedisTemplate<Object,Object> redisTemplate; - + @SuppressWarnings("unchecked") @Override protected void executeInternal(JobExecutionContext context) throws JobExecutionException { logger.info("task start"); + //获取本机ip地址 获取本机所属角色信息 - logger.info("The local IP address is {}",ipaddr); - - Promserver promserver = promserverService.queryRoleByIp(ipaddr); + logger.info("The local IP address is {}", String.format("%s:%s", ipaddr, promServerPort)); + + Promserver promserver = promserverService.queryRoleByIpAndPort(ipaddr, promServerPort); logger.info("The local role info {}",JSON.toJSON(promserver)); logger.info("The local ymlPath info {}",JSON.toJSON(ymlPath)); logger.info("The local ruleYmlPath info {}",JSON.toJSON(ruleYmlPath)); - - - - if(promserver!=null) { + + + if (promserver != null) { + + // 校验角色是否对应 + if (!promserver.getType().equals(promServerType)) { + logger.error("confAgent配置文件中配置的角色与数据库不对应,配置的角色是:{}, 数据库的角色是:{}", Constant.PromserverType.getPromserverType(promServerType).getName(), Constant.PromserverType.getPromserverType(promserver.getType()).getName()); + return; + } + + logger.info("当前confAgent角色为:" + Constant.PromserverType.getPromserverType(promserver.getType()).getName()); + // 判断本次表格数据与之前数据是否有变化判断是否执行操作 boolean changeFlag = confEventService.compareData(confEvents); //先判断conf_event表中是否有数据变化 程序初始进入map数据为空 则全量配置更新同步 logger.debug("before confEvents data {} ",JSON.toJSON(confEvents)); - if(confEvents==null || changeFlag ) { - logger.debug("data had change confEvents data {}",JSON.toJSON(confEvents)); - logger.debug("data had change flag {}",changeFlag); - // golbal角色 - if(promserver.getType()==1) { - Map centerResult = centerHandle(); - logger.debug("center result info {} ",JSON.toJSON(centerResult)); - if(centerResult!=null) { - try { - //获取yml文件信息替换对应内容 热加载 - boolean handleResult = YamlUtil.centerYmlHandle(centerResult,ymlPath,ruleYmlPath); - logger.info("yamlHanlde center result {}",JSON.toJSON(handleResult)); - } catch (Exception e) { - logger.error("yamlHanlde center error",e); - e.printStackTrace(); + if (confEvents == null || changeFlag) { + logger.debug("data had change confEvents data {}", JSON.toJSON(confEvents)); + logger.debug("data had change flag {}", changeFlag); + + + Integer promserverType = promserver.getType(); + if (promserverType.equals(Constant.PromserverType.GLOBAL.getValue()) || promserverType.equals(Constant.PromserverType.PER_DATACENTER.getValue())) { + // golbal角色 + if (promserverType.equals(Constant.PromserverType.GLOBAL.getValue())) { + Map centerResult = centerHandle(); + logger.debug("center result info {} ", JSON.toJSON(centerResult)); + if (centerResult != null) { + try { + //获取yml文件信息替换对应内容 热加载 + boolean handleResult = YamlUtil.centerYmlHandle(centerResult, ymlPath, ruleYmlPath); + logger.info("yamlHanlde center result {}", JSON.toJSON(handleResult)); + if (handleResult) { + // 热加载 global prometheus + ResponseEntity<String> responseEntity = null; + try { + RestTemplate restTemplate = new RestTemplate(); + responseEntity = restTemplate.postForEntity(String.format("http://%s:%s%s", ipaddr, promServerPort, Constant.API_RELOAD), null, String.class); + } catch (RestClientException e) { + logger.error("热加载 global prometheus api 接口失败,API 地址是:" + String.format("http://%s:%s%s", ipaddr, promServerPort, Constant.API_RELOAD) + ",错误信息是:" + e.getMessage(), e); + } + if (responseEntity != null && responseEntity.getStatusCodeValue() == 200) { + logger.info(String.format("http://%s:%s", ipaddr, promServerPort) + " global prometheus 热加载配置文件成功"); + } + } + } catch (Exception e) { + logger.error("yamlHanlde center error", e); + e.printStackTrace(); + } + } + } else if (promserverType.equals(Constant.PromserverType.PER_DATACENTER.getValue())) {// datacenter角色 + List result = subHandle(promserver); + logger.debug("subHandle list info {} ", JSON.toJSON(result)); + if (result != null) { + try { + //获取yml文件信息替换对应内容 热加载 + boolean handleResult = YamlUtil.subYmlHandle(result, ymlPath, ruleYmlPath); + logger.info("yamlHanlde sub result {}", JSON.toJSON(handleResult)); + if (handleResult) { + // 热加载 per datacenter prometheus + ResponseEntity<String> responseEntity = null; + try { + RestTemplate restTemplate = new RestTemplate(); + responseEntity = restTemplate.postForEntity(String.format("http://%s:%s%s", ipaddr, promServerPort, Constant.API_RELOAD), null, String.class); + } catch (RestClientException e) { + logger.error("热加载 per-datacenter prometheus api 接口失败,API 地址是:" + String.format("http://%s:%s%s", ipaddr, promServerPort, Constant.API_RELOAD) + ",错误信息是:" + e.getMessage(), e); + } + if (responseEntity != null && responseEntity.getStatusCodeValue() == 200) { + logger.info(String.format("http://%s:%s", ipaddr, promServerPort) + " per datacenter prometheus 热加载配置文件成功"); + } + } + } catch (Exception e) { + logger.error("yamlHanlde sub error", e); + e.printStackTrace(); + } } } - }else if(promserver.getType()==2) {// datacenter角色 - List result = subHandle(promserver); - logger.debug("subHandle list info {} ",JSON.toJSON(result)); - if(result!=null) { - try { - //获取yml文件信息替换对应内容 热加载 - boolean handleResult = YamlUtil.subYmlHandle(result,ymlPath,ruleYmlPath); - logger.info("yamlHanlde sub result {}",JSON.toJSON(handleResult)); - } catch (Exception e) { - logger.error("yamlHanlde sub error",e); - e.printStackTrace(); + + // prometheus全局配置修改 热加载 + try { + String scrapeInterval = sysConfigService.queryValueByParamkey(Constant.SCRAPE_INTERVAL); + Map param = new HashMap(); + param.put(Constant.SCRAPE_INTERVAL, scrapeInterval); + boolean prometheusSettingHandle = YamlUtil.prometheusSettingHandle(param, ymlPath, promserver.getHost()); + logger.info("prometheusSettingHandle result {}", JSON.toJSON(prometheusSettingHandle)); + if (prometheusSettingHandle) { + ResponseEntity<String> responseEntity = null; + try { + RestTemplate restTemplate = new RestTemplate(); + responseEntity = restTemplate.postForEntity(String.format("http://%s:%s%s", ipaddr, promServerPort, Constant.API_RELOAD), null, String.class); + } catch (RestClientException e) { + logger.error("热加载 prometheusSettingHandle 接口失败,API 地址是:" + String.format("http://%s:%s%s", ipaddr, promServerPort, Constant.API_RELOAD) + ",错误信息是:" + e.getMessage(), e); + } + if (responseEntity != null && responseEntity.getStatusCodeValue() == 200) { + logger.info(String.format("http://%s:%s", ipaddr, promServerPort) + " prometheusSettingHandle 热加载配置文件成功"); + } } + } catch (Exception e) { + logger.error("prometheus global setting error : ", e); + e.printStackTrace(); } - } - - //prometheus全局配置修改 热加载 - try { - String scrapeInterval = sysConfigService.queryValueByParamkey(Constant.SCRAPE_INTERVAL); - Map param =new HashMap(); - param.put(Constant.SCRAPE_INTERVAL,scrapeInterval); - boolean prometheusSettingHandle = YamlUtil.prometheusSettingHandle(param,ymlPath); - logger.info("prometheusSettingHandle result {}",JSON.toJSON(prometheusSettingHandle)); - }catch(Exception e) { - logger.error("prometheus global setting error : ",e); - e.printStackTrace(); - } - - //prometheus启动项相关修改 每次需要判断是否更改来确定是否执行方法 会关闭prometheus并重启 confagent首次启动不会进行prometheus开关操作 - try { - if(confEvents!=null) { - Integer integer = null; - integer = confEvents.get(Constant.STORAGE_LOCAL_RETENTION); - logger.info("prometheusStartHandle integer {}",integer); - - String param = sysConfigService.queryValueByParamkey(Constant.STORAGE_LOCAL_RETENTION); - if(integer!=null && !integer.equals(Integer.valueOf(param))) { - logger.info("prometheusStartHandle param {}",param); - boolean prometheusStartHandle = YamlUtil.prometheusStartHandle(prometheusServicePath, param); - logger.info("prometheusStartHandle result {}",JSON.toJSON(prometheusStartHandle)); - }else { - logger.info("prometheusStartHandle not start because of no change"); + + //prometheus启动项相关修改 每次需要判断是否更改来确定是否执行方法 会关闭prometheus并重启 confagent首次启动不会进行prometheus开关操作 + try { + if (confEvents != null) { + Integer integer = null; + integer = confEvents.get(Constant.STORAGE_LOCAL_RETENTION); + logger.info("prometheusStartHandle integer {}", integer); + + ConfEvent confEvent = confEventService.queryConfEvent("storage_local_retention"); + if (integer != null && !integer.equals(confEvent.getValue())) { + String param = sysConfigService.queryValueByParamkey(Constant.STORAGE_LOCAL_RETENTION); + logger.info("prometheusStartHandle param {}", param); + boolean prometheusStartHandle = YamlUtil.prometheusStartHandle(prometheusServicePath, param); + logger.info("prometheusStartHandle result {}", JSON.toJSON(prometheusStartHandle)); + } else { + logger.info("prometheusStartHandle not start because of no change"); + } + } + } catch (Exception e) { + logger.error("prometheus startup setting error : ", e); + e.printStackTrace(); + } + } else if (promserverType.equals(Constant.PromserverType.THANOS_RULE.getValue())) { + // thanos rule 处理 + Map resultMap = this.thanosRuleHandle(); + logger.debug("thanos result info {} ", JSON.toJSON(resultMap)); + + if (resultMap != null && !resultMap.isEmpty()) { + // 生成 thanos rule 所需 rule.yml + boolean handleResult = YamlUtil.thanosRuleYmlHandle(resultMap, ruleYmlPath); + logger.info("thanos rule.yml 生成: {}", handleResult == true ? "成功" : "失败"); + if (handleResult) { + // 热加载 thanos rule 组件 + ResponseEntity<String> responseEntity = null; + try { + RestTemplate restTemplate = new RestTemplate(); + responseEntity = restTemplate.postForEntity(String.format("http://%s:%s%s", ipaddr, promServerPort, Constant.API_RELOAD), null, String.class); + } catch (RestClientException e) { + logger.error("热加载 thanos rule api 接口失败,API 地址是:" + String.format("http://%s:%s%s", ipaddr, promServerPort, Constant.API_RELOAD) + ",错误信息是:" + e.getMessage(), e); + } + if (responseEntity != null && responseEntity.getStatusCodeValue() == 200) { + logger.info(String.format("http://%s:%s", ipaddr, promServerPort) + " thanos rule 热加载配置文件成功"); + } } } - }catch(Exception e){ - logger.error("prometheus startup setting error : ",e); - e.printStackTrace(); } - + //处理完信息配置后 将confEvent数据保存 留待下个周期比较判断 confEvents=confEventService.queryConfEventMap(); }else { @@ -290,12 +352,22 @@ public class ConfagentJob extends QuartzJobBean { result.add(job); } } - if(snmpYmls.size()>0) { - try { - // 同步snmp.yml文件内容 同时重启snmp exporter - YamlUtil.snmpYmlHandle(snmpYmls,snmpYmlPath); - } catch (Exception e) { - e.printStackTrace(); + if (snmpYmls.size() > 0) { + // 同步snmp.yml文件内容 同时重启snmp exporter + boolean snmpYmlHandle = YamlUtil.snmpYmlHandle(snmpYmls, snmpYmlPath); + logger.info("snmp_exporter snmp.yml 生成: {}", snmpYmlHandle == true ? "成功" : "失败"); + if (snmpYmlHandle) { + // 热加载 snmp_exporter 组件 + ResponseEntity<String> responseEntity = null; + try { + RestTemplate restTemplate = new RestTemplate(); + responseEntity = restTemplate.postForEntity(String.format("http://%s:%s%s", ipaddr, snmpPort, Constant.API_RELOAD), null, String.class); + } catch (RestClientException e) { + logger.error("热加载 snmp_exporter api 接口失败,API 地址是:" + String.format("http://%s:%s%s", ipaddr, snmpPort, Constant.API_RELOAD) + ",错误信息是:" + e.getMessage(), e); + } + if (responseEntity != null && responseEntity.getStatusCodeValue() == 200) { + logger.info(String.format("http://%s:%s", ipaddr, snmpPort) + " snmp_exporter 热加载配置文件成功"); + } } } //将promserver和处理的endpoint对应关系储存到redis @@ -548,6 +620,12 @@ public class ConfagentJob extends QuartzJobBean { alertRelabelMap.put("regex", "instance"); alertRelabelMap.put("action", "labeldrop"); alertRelabel.add(alertRelabelMap); + + + Map replicaRelabelMap = new HashMap(); + replicaRelabelMap.put("regex", Constant.REPLICA_LABEL); + replicaRelabelMap.put("action", "labeldrop"); + alertRelabel.add(replicaRelabelMap); alertManager.put("alert_relabel_configs", alertRelabel); @@ -558,6 +636,47 @@ public class ConfagentJob extends QuartzJobBean { logger.debug("centerHandle : alert manager Info : {}",JSON.toJSON(alertManager)); return result; } + + + /** + * 处理 thanos rule 相关逻辑 + * + * @return + */ + private Map thanosRuleHandle() { + Map resultMap = new HashMap(); + //配置rule 查询所有rule配置信息 + List<AlertRule> alertRules = alertRuleService.queryList(); + + List groups = new ArrayList(); + + Map group = new HashMap(); + groups.add(group); + + List rules = new ArrayList(); + group.put("name", "alertRule"); + group.put("rules", rules); + + for (AlertRule alertRule : alertRules) { + Map labels = new HashMap(); + labels.put("severity", alertRule.getSeverity()); + labels.put(Constant.REPLICA_LABEL, ""); + Map annotations = new HashMap(); + annotations.put("summary", alertRule.getSummary()); + annotations.put("description", alertRule.getDescription()); + Map rule = new HashMap(); + rule.put("alert", alertRule.getId()); + rule.put("expr", "(" + alertRule.getExpr() + ")" + alertRule.getOperator() + alertRule.getThreshold()); + rule.put("for", alertRule.getLast() + "s"); + rule.put("labels", labels); + rule.put("annotations", annotations); + rules.add(rule); + } + resultMap.put("groups", groups); + + logger.debug("thanos rule : alert rule Info : {}", JSON.toJSON(groups)); + return resultMap; + } /** * 定时任务中将promserver信息储存到redis中 diff --git a/src/main/java/com/nis/service/ConfEventService.java b/src/main/java/com/nis/service/ConfEventService.java index c28cfc2..a5fd760 100644 --- a/src/main/java/com/nis/service/ConfEventService.java +++ b/src/main/java/com/nis/service/ConfEventService.java @@ -1,16 +1,14 @@ package com.nis.service;
-import java.util.List;
-import java.util.Map;
-
import com.nis.entity.ConfEvent;
+import java.util.Map;
+
public interface ConfEventService {
-
- public Map<String,Integer> queryConfEventMap();
-
- /**
- *
- */
- public boolean compareData(Map<String,Integer> map);
+
+ ConfEvent queryConfEvent(String table);
+
+ Map<String, Integer> queryConfEventMap();
+
+ boolean compareData(Map<String, Integer> map);
}
diff --git a/src/main/java/com/nis/service/PromserverService.java b/src/main/java/com/nis/service/PromserverService.java index 7ac8773..09bcc88 100644 --- a/src/main/java/com/nis/service/PromserverService.java +++ b/src/main/java/com/nis/service/PromserverService.java @@ -7,13 +7,14 @@ import com.nis.entity.Promserver; public interface PromserverService {
public List<Promserver> queryList();
-
+
/**
* 根据ip查询
* @param ip
+ * @param port
* @return
*/
- public Promserver queryRoleByIp(String ip);
+ public Promserver queryRoleByIpAndPort(String ip, String port);
/**
* 查询sub信息 根据idcid及type
diff --git a/src/main/java/com/nis/service/impl/ConfEventServiceImpl.java b/src/main/java/com/nis/service/impl/ConfEventServiceImpl.java index 5a7a4b0..d195aff 100644 --- a/src/main/java/com/nis/service/impl/ConfEventServiceImpl.java +++ b/src/main/java/com/nis/service/impl/ConfEventServiceImpl.java @@ -17,7 +17,12 @@ public class ConfEventServiceImpl implements ConfEventService { @Autowired
private ConfEventDao confEventDao;
-
+
+ @Override
+ public ConfEvent queryConfEvent(String table) {
+ return confEventDao.selectConfEvent(table);
+ }
+
@Override
public Map<String, Integer> queryConfEventMap() {
Map<String,Integer> result = new HashMap<String,Integer>();
diff --git a/src/main/java/com/nis/service/impl/PromserverServiceImpl.java b/src/main/java/com/nis/service/impl/PromserverServiceImpl.java index 5772d37..6febb33 100644 --- a/src/main/java/com/nis/service/impl/PromserverServiceImpl.java +++ b/src/main/java/com/nis/service/impl/PromserverServiceImpl.java @@ -1,12 +1,12 @@ package com.nis.service.impl;
-import java.util.List;
-
-import org.springframework.beans.factory.annotation.Autowired;
-import org.springframework.stereotype.Service;
import com.nis.dao.PromserverDao;
import com.nis.entity.Promserver;
import com.nis.service.PromserverService;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Service;
+
+import java.util.List;
@Service
public class PromserverServiceImpl implements PromserverService {
@@ -19,8 +19,8 @@ public class PromserverServiceImpl implements PromserverService { }
@Override
- public Promserver queryRoleByIp(String ip) {
- return promserverDao.selectRoleByIp(ip);
+ public Promserver queryRoleByIpAndPort(String ip, String port) {
+ return promserverDao.selectRoleByIpAndPort(ip, port);
}
@Override
diff --git a/src/main/java/com/nis/service/impl/TrafficServiceImpl.java b/src/main/java/com/nis/service/impl/TrafficServiceImpl.java index d5201a2..2e32974 100644 --- a/src/main/java/com/nis/service/impl/TrafficServiceImpl.java +++ b/src/main/java/com/nis/service/impl/TrafficServiceImpl.java @@ -96,7 +96,7 @@ public class TrafficServiceImpl implements TrafficService { if (StringUtils.isNotEmpty(name)) { index = index.replaceAll(resultOid + ".", ""); } else { - logger.error("未能通过oid找到对应名称{}", map); + // logger.error("未能通过oid找到对应名称{}", map); continue; } diff --git a/src/main/java/com/nis/util/ConfigUtil.java b/src/main/java/com/nis/util/ConfigUtil.java deleted file mode 100644 index e3b5d41..0000000 --- a/src/main/java/com/nis/util/ConfigUtil.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.nis.util;
-
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.PropertySource;
-import org.springframework.stereotype.Component;
-
-@Component
-public class ConfigUtil {
- @Value("${confagent.ipaddr}")
- private String ipaddr;
- @Value("${confagent.ymlPath}")
- private String ymlPath;
- @Value("${confagent.prometheusPort}")
- private String prometheusPort;
-}
diff --git a/src/main/java/com/nis/util/Constant.java b/src/main/java/com/nis/util/Constant.java index c3118ea..b194861 100644 --- a/src/main/java/com/nis/util/Constant.java +++ b/src/main/java/com/nis/util/Constant.java @@ -94,4 +94,53 @@ public class Constant { // traffic接口默认路径 public static final String TRAFFIC_PATH = "/traffic"; + + // 外部标签 + public static final String REPLICA_LABEL = "replica"; + + // promeserver 重启接口统一后缀 + public static final String API_RELOAD = "/-/reload"; + + public enum PromserverType { + GLOBAL("global", 1), + PER_DATACENTER("per_datacenter", 2), + THANOS_QUERY("thanos_query", 3), + THANOS_RULE("thanos_rule", 4), + THANOS_SIDECAR("thanos_sidecar", 5), + THANOS_STORE("thanos_store", 6), + THANOS_COMPACTOR("thanos_compactor", 7); + + private String name; + private Integer value; + + PromserverType(String name, Integer value) { + this.value = value; + this.name = name; + } + + public Integer getValue() { + return value; + } + + public void setValue(Integer value) { + this.value = value; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public static PromserverType getPromserverType(Integer value) { + for (PromserverType server : PromserverType.values()) { + if (server.getValue().equals(value)) { + return server; + } + } + return null; + } + } } diff --git a/src/main/java/com/nis/util/SnmpUtil.java b/src/main/java/com/nis/util/SnmpUtil.java index 36a7ead..5ba1f59 100644 --- a/src/main/java/com/nis/util/SnmpUtil.java +++ b/src/main/java/com/nis/util/SnmpUtil.java @@ -26,7 +26,7 @@ public class SnmpUtil { // 默认版本 v2 private static final int DEFAULT_VERSION = SnmpConstants.version2c; private static final String DEFAULT_PROTOCOL = "udp"; - private static final long DEFAULT_TIMEOUT = 1000L; + private static final long DEFAULT_TIMEOUT = 10000L; private static final int DEFAULT_RETRY = 3; // 默认团体名 @@ -103,7 +103,7 @@ public class SnmpUtil { } ((CommunityTarget) target).setCommunity(new OctetString(community)); } - // 超时时间 + // 超时时间 timeout in milliseconds before a confirmed request is resent or timed out. target.setTimeout(DEFAULT_TIMEOUT); // 重试次数 target.setRetries(DEFAULT_RETRY); @@ -139,8 +139,9 @@ public class SnmpUtil { */ public static List<Map> snmpWalk(String ip, Integer port, Integer version, String community, String oid, Map<String, String> auth) throws IOException { List<Map> resultData = new ArrayList<>(); + TransportMapping transport = null; try { - TransportMapping transport = new DefaultUdpTransportMapping(); + transport = new DefaultUdpTransportMapping(); snmp = new Snmp(transport); // 如果是v3版本 @@ -206,6 +207,13 @@ public class SnmpUtil { logger.error("关闭snmp失败", e); } } + if (transport != null) { + try { + transport.close(); + } catch (Exception e) { + logger.error("关闭transport失败", e); + } + } } return resultData; } diff --git a/src/main/java/com/nis/util/YamlUtil.java b/src/main/java/com/nis/util/YamlUtil.java index 4e80929..bf28375 100644 --- a/src/main/java/com/nis/util/YamlUtil.java +++ b/src/main/java/com/nis/util/YamlUtil.java @@ -1,29 +1,16 @@ package com.nis.util;
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.RandomAccessFile;
-import java.io.StringReader;
-import java.io.UnsupportedEncodingException;
-import java.util.ArrayList;
+import com.alibaba.fastjson.JSON;
+import org.yaml.snakeyaml.DumperOptions;
+import org.yaml.snakeyaml.Yaml;
+
+import java.io.*;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Set;
-import org.yaml.snakeyaml.DumperOptions;
-import org.yaml.snakeyaml.Yaml;
-
-import com.alibaba.fastjson.JSON;
-
public class YamlUtil {
private static Yaml y;
@@ -57,7 +44,7 @@ public class YamlUtil { y.dump(load,osw);
}
// RuntimeUtil.run(null, null, new String[]{"kill","-hup","`ps -ef |grep prometheus|grep -v grep|awk \'{print $2}\'`"});
- RuntimeUtil.run(null, null, new String[]{"/bin/sh", "-c","ps -ef |grep snmp_exporter|grep -v grep|awk \'{print $2}\'|xargs kill -hup"});
+// RuntimeUtil.run(null, null, new String[]{"/bin/sh", "-c","ps -ef |grep snmp_exporter|grep -v grep|awk \'{print $2}\'|xargs kill -hup"});
flag = true;
out.close();
osw.close();
@@ -116,7 +103,7 @@ public class YamlUtil { y.dump(map,osw);
// RuntimeUtil.run(null, null, new String[]{"kill","-hup","`ps -ef |grep prometheus|grep -v grep|awk \'{print $2}\'`"});
- RuntimeUtil.run(null, null, new String[]{"/bin/sh", "-c","ps -ef |grep prometheus|grep -v grep|awk \'{print $2}\'|xargs kill -hup"});
+// RuntimeUtil.run(null, null, new String[]{"/bin/sh", "-c","ps -ef |grep prometheus|grep -v grep|awk \'{print $2}\'|xargs kill -hup"});
flag = true;
fileInputStream.close();
out.close();
@@ -195,7 +182,7 @@ public class YamlUtil { OutputStreamWriter osw2 = new OutputStreamWriter(out2, "UTF-8");
y.dump(map2,osw2);
- RuntimeUtil.run(null, null, new String[]{"/bin/sh", "-c","ps -ef |grep prometheus|grep -v grep|awk \'{print $2}\'|xargs kill -hup"});
+// RuntimeUtil.run(null, null, new String[]{"/bin/sh", "-c","ps -ef |grep prometheus|grep -v grep|awk \'{print $2}\'|xargs kill -hup"});
// RuntimeUtil.run(null, null, new String[]{"kill","-hup","`ps -ef |grep prometheus|grep -v grep|awk \'{print $2}\'`"});
flag = true;
osw.close();
@@ -228,13 +215,66 @@ public class YamlUtil { }
return flag;
}
-
+
+
/**
- * prometheus启动项修改
- * @param filePath
+ * thanos rule 角色所需 rule.yml 配置文件处理
+ *
* @param param
+ * @param ruleYmlPath
* @return
*/
+ public static boolean thanosRuleYmlHandle(Map<String, Object> param, String ruleYmlPath) {
+ boolean flag = false;
+ if (param != null && !param.isEmpty()) {
+ FileInputStream fileInputStream = null;
+ OutputStream out = null;
+ try {
+ // 修改 rule.yml配置文件
+ File ruleYmlfile = new File(ruleYmlPath);
+ if (!ruleYmlfile.exists()) {
+ // 文件不存在 创建文件
+ ruleYmlfile.createNewFile();
+ }
+ FileInputStream fileInputStream2 = new FileInputStream(ruleYmlfile);
+ Map<String, Object> map2 = y.loadAs(fileInputStream2, Map.class);
+ if (map2 == null) {
+ map2 = new HashMap();
+ }
+ map2.put("groups", param.get("groups"));
+ OutputStream out2 = new FileOutputStream(ruleYmlfile);
+ OutputStreamWriter osw2 = new OutputStreamWriter(out2, "UTF-8");
+ y.dump(map2, osw2);
+ flag = true;
+ } catch (Exception e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } finally {
+ if (fileInputStream != null) {
+ try {
+ fileInputStream.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ if (out != null) {
+ try {
+ out.close();
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+ }
+ }
+ }
+ return flag;
+ }
+
+ /**
+ * prometheus启动项修改
+ * @param filePath
+ * @param param
+ * @return
+ */
public static boolean prometheusStartHandle(String filePath,String param) {
boolean flag=false;
RandomAccessFile raf = null;
@@ -275,12 +315,10 @@ public class YamlUtil { /**
* prometheus全局配置修改
* @param param
- * @param ymlPath
- * @param ruleYmlPath
* @return
*/
@SuppressWarnings("unchecked")
- public static boolean prometheusSettingHandle(Map<String,Object> param,String ymlPath){
+ public static boolean prometheusSettingHandle(Map<String, Object> param, String ymlPath, String host) {
boolean flag=false;
if(param!=null && !param.isEmpty() &&ymlPath != null && ymlPath.length() != 0) { //
FileInputStream fileInputStream =null;
@@ -296,11 +334,18 @@ public class YamlUtil { }
Map object = (Map) map.get("global");
object.put(Constant.SCRAPE_INTERVAL, param.get(Constant.SCRAPE_INTERVAL)+"s");
+
+ // 外部标签
+ Map externalMap = new HashMap();
+ // 副本标签
+ externalMap.put(Constant.REPLICA_LABEL, host);
+ object.put("external_labels", externalMap);
+
out = new FileOutputStream(ymlfile);
osw = new OutputStreamWriter(out, "UTF-8");
y.dump(map,osw);
- RuntimeUtil.run(null, null, new String[]{"/bin/sh", "-c","ps -ef |grep prometheus|grep -v grep|awk \'{print $2}\'|xargs kill -hup"});
+ // RuntimeUtil.run(null, null, new String[]{"/bin/sh", "-c","ps -ef |grep prometheus|grep -v grep|awk \'{print $2}\'|xargs kill -hup"});
flag = true;
osw.close();
} catch (Exception e) {
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index c11e164..ed52ae7 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -43,7 +43,8 @@ confagent: snmpYmlPath: F:/snmp.yml snmpPort: 9116 prometheusServicePath: F:/prometheus.service - prometheusPort: 9090 + promServerPort: 9090 + promServerType: 1 ## job config jobCron: 0/15 * * * * ? metricsPath: /metrics diff --git a/src/main/resources/mapper/ConfEventDao.xml b/src/main/resources/mapper/ConfEventDao.xml index c36a444..5317b8f 100644 --- a/src/main/resources/mapper/ConfEventDao.xml +++ b/src/main/resources/mapper/ConfEventDao.xml @@ -5,5 +5,8 @@ <select id="selectList" resultType="com.nis.entity.ConfEvent"> select * from conf_event </select> - + + <select id="selectConfEvent" resultType="com.nis.entity.ConfEvent"> + select * from conf_event where `table`=#{table} + </select> </mapper>
\ No newline at end of file diff --git a/src/main/resources/mapper/PromserverDao.xml b/src/main/resources/mapper/PromserverDao.xml index f845493..44759ac 100644 --- a/src/main/resources/mapper/PromserverDao.xml +++ b/src/main/resources/mapper/PromserverDao.xml @@ -15,8 +15,8 @@ select * from prom_server where status=1 </select> - <select id="selectRoleByIp" resultMap="promserver"> - select * from prom_server where host=#{ip} and status=1 + <select id="selectRoleByIpAndPort" resultMap="promserver"> + select * from prom_server where host=#{ip} and port = #{port} and status=1 </select> <select id="selectSubInfo" resultMap="promserver"> |
