summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorshizhendong <[email protected]>2020-07-06 15:26:44 +0800
committershizhendong <[email protected]>2020-07-06 15:26:44 +0800
commit6d2fdf260cdecfd77429ff4420bb50ca421e277c (patch)
tree0773df639fb87d15ede7ddd9cc82e9951a5320ea
parentf9741cc11f14c3a415cc8d0bf9c9a8b8e82500e6 (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.java9
-rw-r--r--src/main/java/com/nis/dao/PromserverDao.java4
-rw-r--r--src/main/java/com/nis/job/ConfagentJob.java327
-rw-r--r--src/main/java/com/nis/service/ConfEventService.java18
-rw-r--r--src/main/java/com/nis/service/PromserverService.java5
-rw-r--r--src/main/java/com/nis/service/impl/ConfEventServiceImpl.java7
-rw-r--r--src/main/java/com/nis/service/impl/PromserverServiceImpl.java12
-rw-r--r--src/main/java/com/nis/service/impl/TrafficServiceImpl.java2
-rw-r--r--src/main/java/com/nis/util/ConfigUtil.java15
-rw-r--r--src/main/java/com/nis/util/Constant.java49
-rw-r--r--src/main/java/com/nis/util/SnmpUtil.java14
-rw-r--r--src/main/java/com/nis/util/YamlUtil.java101
-rw-r--r--src/main/resources/application.yml3
-rw-r--r--src/main/resources/mapper/ConfEventDao.xml5
-rw-r--r--src/main/resources/mapper/PromserverDao.xml4
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">