基于SNMP和JRobin的监控

SNMP4J模拟SNMPGET

public class Snmp_Test_1 { private static final Logger logger = Logger.getLogger(Snmp_Test_1.class); private static String protocol = "udp"; // 监控时使用的协议 private static String port = "161"; // 监控时使用的端口 public static String snmpGet(String ipAddress, String community, String oid) { String resultStat = null; // 监控结果状态 StringBuffer address = new StringBuffer(); address.append(protocol); address.append(":"); address.append(ipAddress); address.append("/"); address.append(port); //udp:xxx.xxx.xxx.xxx/161 Address targetAddress = GenericAddress.parse(address.toString()); PDU pdu = new PDU(); pdu.add(new VariableBinding(new OID(oid))); pdu.setType(PDU.GET); // 创建共同体对象CommunityTarget CommunityTarget target = new CommunityTarget(); target.setCommunity(new OctetString(community)); target.setAddress(targetAddress); target.setVersion(SnmpConstants.version1); target.setTimeout(2000); // 超时时间 target.setRetries(1); // 重复次数 /**公共的SNMP首部包含:版本(已在共同体中),共同体,PDU*/ DefaultUdpTransportMapping udpTransportMap = null; Snmp snmp = null; try { // 发送同步消息 udpTransportMap = new DefaultUdpTransportMapping(); udpTransportMap.listen(); // 开启监听线程基于socket snmp = new Snmp(udpTransportMap); ResponseEvent response = snmp.send(pdu, target); PDU resposePdu = response.getResponse(); if (resposePdu == null) { logger.info(ipAddress + ": Request timed out."); } else { Object obj = resposePdu.getVariableBindings().firstElement(); VariableBinding variable = (VariableBinding) obj; resultStat = variable.getVariable().toString(); } } catch (Exception e) { e.printStackTrace(); } finally { if (snmp != null) { try { snmp.close(); } catch (IOException e) { snmp = null; } } if (udpTransportMap != null) { try { udpTransportMap.close(); } catch (IOException e) { udpTransportMap = null; } } } return resultStat; } }

JRobin类:

public class CPU_Monitor_Test { private static final Logger logger = Logger.getLogger(CPU_Monitor_Test.class); private int step = 30; private String rrdPath = "./test.rrd"; private int width = 600; private int height = 150; private long begintime = org.jrobin.core.Util.getTimestamp(); public CPU_Monitor_Test() throws RrdException, IOException { logger.info("now into CPU_Monitor_Test"); RrdDb rrdDb = null; File file = new File(rrdPath); if(file.exists()){ try { rrdDb = new RrdDb(rrdPath); } catch (Exception e) { } }else{ logger.info("the rrd is not exists! creat new rrd file ."); } if (rrdDb == null) { RrdDef rrdDef = new RrdDef(rrdPath , step); rrdDef.addDatasource("cpu", "GAUGE", 2 * step, 0, Double.NaN); rrdDef.addArchive("AVERAGE", 0.5, 1, 60); rrdDef.addArchive("AVERAGE", 0.5, 6, 70); rrdDef.addArchive("AVERAGE", 0.5, 24, 79); rrdDef.addArchive("AVERAGE", 0.5, 288, 77); rrdDef.addArchive("MAX", 0.5, 1, 60); rrdDef.addArchive("MAX", 0.5, 6, 70); rrdDef.addArchive("MAX", 0.5, 24, 79); rrdDef.addArchive("MAX", 0.5, 288, 77); rrdDb = new RrdDb(rrdDef); //create } if (rrdDb != null) rrdDb.close(); logger.info("CPU_Monitor_Test init cuccess!"); } public CPU_Monitor_Test updateData() throws Exception { logger.info("begin updateData"); RrdDbPool pool = RrdDbPool.getInstance(); RrdDb rrdDb = null; try { rrdDb = pool.requestRrdDb(rrdPath); long lastUpdateTime = rrdDb.getLastUpdateTime(); long nowTime = org.jrobin.core.Util.getTimestamp(); if (nowTime > lastUpdateTime) { Sample sample = rrdDb.createSample(nowTime); sample.setValue("cpu", Double.valueOf(Snmp_Test_1.snmpGet("127.0.0.1", "public", "1.3.6.1.2.1.25.3.3.1.2.3"))); sample.update(); logger.info("updateData success"); } return this; } finally { pool.release(rrdDb); } } public void generateGraph() throws IOException, RrdException { RrdGraphDef def = new RrdGraphDef(); def.setTimeSpan(begintime,org.jrobin.core.Util.getTimestamp()); def.setWidth(width); def.setHeight(height); def.setFilename("./test.png"); def.setVerticalLabel("used %"); def.setTitle("测试:监控CPU"); def.datasource("cpu", rrdPath, "cpu", "AVERAGE"); def.area("cpu", Color.RED, "cpu traffic"); def.gprint("cpu", "MIN", "%3f Min"); def.gprint("cpu", "AVERAGE", "%3f Avg"); def.gprint("cpu", "MAX", "%3f Max"); def.gprint("cpu", "LAST", "%3f Last\\r"); def.print("cpu", "MIN", "min cpu = %.3f"); def.print("cpu", "AVERAGE", "avg cpu = %.3f"); def.print("cpu", "MAX", "max cpu = %.3f"); def.print("cpu", "LAST", "last cpu = %.3f"); def.setPoolUsed(false); def.setImageFormat("png"); def.setSmallFont(new Font("Monospaced", Font.PLAIN, 11)); def.setLargeFont(new Font("SansSerif", Font.BOLD, 14)); RrdGraph g = new RrdGraph(def); logger.info("generateGraph:"+g.getRrdGraphInfo().getFilename()); } public void sleepAndRun(int num) throws Exception{ try { while(--num >0){ TimeUnit.SECONDS.sleep(Long.valueOf(step)); this.updateData(); } } catch (InterruptedException e) { e.printStackTrace(); } this.generateGraph(); } public static void main(String[] args) { try { new CPU_Monitor_Test().updateData().sleepAndRun(30); } catch (RrdException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } } }

结果:



 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值