This repository has been archived on 2025-09-14. You can view files and clone it, but cannot push or open issues or pull requests.
Files
nms-nmsserver/src/com/nms/server/thread/monitor/SNMP4JThread.java
fangshunjian 1eacc059de 1、修改snmp采集数据的告警
2、修改解析入库时 warning恢复判断
2019-01-17 11:52:24 +06:00

228 lines
8.8 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

package com.nms.server.thread.monitor;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Calendar;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.concurrent.CountDownLatch;
import net.sf.json.JSONObject;
import org.apache.commons.lang.StringUtils;
import org.apache.log4j.Logger;
import org.snmp4j.mp.SnmpConstants;
import com.nms.server.bean.AlarmInfo;
import com.nms.server.bean.SetInfo;
import com.nms.server.bean.TableColumnsModel;
import com.nms.server.common.Common;
import com.nms.server.common.Constants;
import com.nms.server.util.CSVUtils;
import com.nms.server.util.SNMP4JUtils;
public class SNMP4JThread implements Runnable{
private Logger logger = Logger.getLogger(SNMP4JThread.class);
private Long startTime = Calendar.getInstance().getTimeInMillis();
// private SimpleDateFormat format = new SimpleDateFormat(Constants.COMMON_DATE_FORMAT);
private String name;
private int port = Constants.SNMP_CLIENT_PORT;
private SetInfo info ;
private String hostIp;
private CountDownLatch downLatch;
/**
* 构造方法
* @param name 线程名称
* @param host 目标Ip
* @param info 监测设置信息
*/
public SNMP4JThread(String name, String hostIp, SetInfo info,Long startTime,CountDownLatch downLatch) {
this.name = name;
this.hostIp = hostIp;
this.info = info;
this.startTime = startTime;
this.downLatch = downLatch;
}
public SNMP4JThread(String name, String hostIp, SetInfo info,Long startTime) {
this.name = name;
this.hostIp = hostIp;
this.info = info;
this.startTime = startTime;
this.downLatch = downLatch;
}
/*
* 通过SNMP4J GET获取
*/
public void run() {
Thread.currentThread().setName(name + " " + hostIp);
try {
//- 通过 CloumnsMap 获取 oids
logger.debug("json setinfo:"+JSONObject.fromObject(info).toString());
Map<Integer,TableColumnsModel> CloumnsMap = Common.getTableMap().get(info.getCheckTypeName());
logger.debug("table CloumnsMap:"+CloumnsMap.size());
List<String> oidList = new LinkedList<String>();
if(CloumnsMap!=null && CloumnsMap.size()>0){
Iterator<Entry<Integer, TableColumnsModel>> entryIte = CloumnsMap.entrySet().iterator();
while (entryIte.hasNext()) {
Entry<Integer, TableColumnsModel> cloumnEntry = (Entry<Integer, TableColumnsModel>) entryIte.next();
String oid = cloumnEntry.getValue().getOid();
if (StringUtils.isNotEmpty(oid)){
oidList.add(oid);
}
}
}
logger.debug("table CloumnsMap:"+Arrays.toString(oidList.toArray()));
int version = Common.getSnmpVerByUUID(Common.getIpSeqIdMap().get(hostIp));
//-- 执行和解析 即获取详细数据
int retries = info.getCheckMaxTimes()==null?3:info.getCheckMaxTimes().intValue();
int timeout = info.getCheckOutTime() == null?10000:info.getCheckOutTime().intValue()*1000;
int state = -1;
List<Map<String, String>> snmpDatas = new LinkedList<Map<String, String>>() ;
StringBuffer stateInfo = new StringBuffer();
List<List<String>> snmpDatasList = null;
try {
String rootOid = Common.getInsertTable().get(info.getCheckTypeName()).getOid();
logger.debug("rootOid "+rootOid);
snmpDatasList = resoveVersion(snmpDatas,oidList,rootOid,version,retries,timeout,stateInfo);
state = 1;
} catch (Exception e) {
state = -1;
stateInfo.append(e.getMessage());
logger.error((version == SnmpConstants.version3?"version3":"version2c")+" GET failure", e);
}
//- 监测数据集合
List<String> pubDatas = new ArrayList<String>(); // 拼写数据格式
//- DetecDatas 拼写 Header
pubDatas.add(Common.getIpSeqIdMap().get(hostIp)+"");// uuid
pubDatas.add(info.getId() + "");// 监测设置ID
pubDatas.add(info.getCheckTypeName());// 监测类别,
pubDatas.add(info.getProcessIden());// 进程名称(检查类别设置名称),
pubDatas.add(startTime + "");// 监测服务启动时间,
pubDatas.add(timeout+"");// 检测时延(秒)
//- 当前检测时间
Calendar checkTime = Calendar.getInstance();
pubDatas.add(checkTime.getTimeInMillis() + "");// 本次检测时间,
pubDatas.add(retries + "");// 尝试次数,
//- 下次检测时间
Calendar nextTime = Calendar.getInstance();
nextTime.add(Calendar.MINUTE, info.getCheckGap().intValue());
pubDatas.add(nextTime.getTimeInMillis() + "");// 下次计划监测时间,
//- DetecDatas 拼写 Body
List<List<String>> pubDatasList = new ArrayList<List<String>>();
if(state != -1){
pubDatasList = snmpDatasList;//datasBody(retries,stateInfo.toString(),state,snmpDatasList);
}
pubDatas.add(state+""); // 执行状态
pubDatas.add(stateInfo.toString()); // 状态信息(描述信息),
pubDatas.add(""); // 性能数据,
if(pubDatasList.size()>0){
pubDatasList.add(0,Arrays.asList(new String[]{"details",pubDatasList.size()+""}));
}
pubDatasList.add(0,pubDatas);
//- 存入缓存
if(pubDatasList!=null && pubDatasList.size()>0){
try {
Common.alarmJudgement(pubDatasList);//告警判断
Common.addDeteData(CSVUtils.csvFilePrinter(pubDatasList, Constants.COMMON_TEXT_CODING));
logger.debug("监测数据以 CSV格式 保存完成");
} catch (Exception e) {
logger.error("Monitoring data to save exceptions in CSV format", e);
}
}
} catch (Exception e) {
String[] alarm = Common.alarmExceptionInfo(info.getId(), hostIp, info.getCheckTypeName(), info.getProcessIden(), startTime, 1,Constants.DETECTION_INFO_ALARM_WRONG, e.getMessage());
Common.addAlarmData(alarm);
logger.error("Program unknown error ", e);
}finally{
if(downLatch != null){
downLatch.countDown();
}
}
}
private List<List<String>> resoveVersion(List<Map<String, String>> datasMapList,List<String> oids,String oid,int version ,int retries,int timeout,StringBuffer stateInfo) throws Exception{
List<List<String>> snmpDatasList = new LinkedList<List<String>>();
logger.debug("SNMP4J 》》》》"+oid+" "+hostIp+" "+port+" "+Constants.SNMP_COMMUNITY+" "+retries+" "+timeout+" "+ version);
SNMP4JUtils.snmpTree(datasMapList, oids,oid, hostIp, port+"", Constants.SNMP_COMMUNITY,retries,timeout,version,info.getCheckTypeName());
logger.debug("datasMapList size "+datasMapList.size());
//- 获取表字段结构
Map<Integer,TableColumnsModel> cloumnsList = Common.getTableMap().get(info.getCheckTypeName());
logger.debug(info.getCheckTypeName()+" cloumnsList size "+cloumnsList.size());
//- 存值
if(cloumnsList!=null && cloumnsList.size() > 0 && datasMapList!=null && datasMapList.size()>0){
for(Map<String, String> datasMap : datasMapList){
List<String> snmpDatas = new LinkedList<String>();
for (int i = 1; i <= cloumnsList.size(); i++) {
TableColumnsModel cloumn = cloumnsList.get(i);
String oid0 = cloumn.getOid();
snmpDatas.add(datasMap.get(oid0));
// if(oid0.equals(oid+".1")){
// stateInfo.append(oid0+":"+datasMap.get(oid0)+"\n");
// }
}
snmpDatasList.add(snmpDatas);
}
}
return snmpDatasList;
}
private List<List<String>> datasBody(int times,String stateInfo,int state,List<List<String>> snmpDatas2)throws Exception{
// List<List<String>> pubDatasList = new LinkedList<List<String>>();
logger.debug("监测数据主体拼写 state "+state+" size"+(snmpDatas2==null ? -1 :snmpDatas2.size()));
if(snmpDatas2!=null && snmpDatas2.size()!=0){
for (List<String> snmpDatas : snmpDatas2) {
// List<String> pubDatas0 = new LinkedList<String>();
// 执行状态是否成功是否正常, 第三方脚本监测任务执行结果(用于报警 -1执行失败 0不正常1正常-1时可保留后续数据为空但是数据个数需要对应
// -- 执行状态是否成功,记录的状态是否正常(用于报警),
String [] datas0 = new String[0];
datas0 = snmpDatas.toArray(datas0);
// logger.debug("snmpDatas>>>> "+Arrays.toString(snmpDatas.toArray(datas0)));
// logger.debug("Common.getAlarmInfoMap()>>>> "+Common.getAlarmInfoMap().size());
String[] pArray = Common.getAlarmState(Common.getAlarmInfoMap().get(info.getId()+""), datas0);
// logger.debug("pArray>>>> "+Arrays.toString(pArray));
if (pArray == null || pArray.length==0) {
snmpDatas.add(0, "");
snmpDatas.add(1, "");
snmpDatas.add(2, "");
} else {
state = 0;
List<AlarmInfo> aiList = Common.getAlarmInfoMap().get(info.getId()+"");
snmpDatas.add(0, pArray == null ? "" : pArray[0]);
snmpDatas.add(1, pArray == null ? "" : pArray[1]);
snmpDatas.add(2, pArray == null ? "" : pArray[2]);
stateInfo+=Common.getStateInfo(info.getCheckTypeName(),Common.getAlarmInfoMap().get(info.getId()+""), datas0);
}
// logger.debug("pArray>>>> "+Arrays.toString(pubDatas0.toArray()));
}
}
return snmpDatas2;
}
public static void main(String [] args) {
}
}