`

实时监控DNS状态,并向MQ发送消息

阅读更多

实现:实时监控DNS状态,一旦发现DNS域名故障或DNS域名第一次恢复正常,即向ActiveMQ中发送消息。

监控实体:

package com.syxp.dns.entity;

public class Alarm {

	/**
	 * 告警实体to MQ status: dns状态1正常0故障 instatu: 记录是否入库,1入库,0不入库
	 */

	private int status; // 监控状态 1为正常,0为故障
	private int instatu; // 入库状态 1为需要入库,0为不需要入库
	private String alarmtype; // 告警类型
	private String alarmaddress; // 告警设备地址
	private String alarmcontent; // 告警内容
	private String alarmoccurtime; // 告警发生时间
	private int monitorstatus; // 监控状态
	private String sms; // 短信提醒
	private String phone; // 手机号
	private String alarmdevname; // 告警对象名称

	public String getSms() {
		return sms;
	}

	public void setSms(String sms) {
		this.sms = sms;
	}

	public String getPhone() {
		return phone;
	}

	public void setPhone(String phone) {
		this.phone = phone;
	}

	public int getMonitorstatus() {
		return monitorstatus;
	}

	public void setMonitorstatus(int monitorstatus) {
		this.monitorstatus = monitorstatus;
	}

	public String getAlarmtype() {
		return alarmtype;
	}

	public void setAlarmtype(String alarmtype) {
		this.alarmtype = alarmtype;
	}

	public String getAlarmaddress() {
		return alarmaddress;
	}

	public void setAlarmaddress(String alarmaddress) {
		this.alarmaddress = alarmaddress;
	}

	public String getAlarmcontent() {
		return alarmcontent;
	}

	public void setAlarmcontent(String alarmcontent) {
		this.alarmcontent = alarmcontent;
	}

	public String getAlarmoccurtime() {
		return alarmoccurtime;
	}

	public void setAlarmoccurtime(String alarmoccurtime) {
		this.alarmoccurtime = alarmoccurtime;
	}

	public String getAlarmdevname() {
		return alarmdevname;
	}

	public void setAlarmdevname(String alarmdevname) {
		this.alarmdevname = alarmdevname;
	}

	public int getStatus() {
		return status;
	}

	public void setStatus(int status) {
		this.status = status;
	}

	public int getInstatu() {
		return instatu;
	}

	public void setInstatu(int instatu) {
		this.instatu = instatu;
	}
}

 

 检测DNS并判断状态后向MQ发送消息

 

 

package com.syxp.dns.send;

import java.io.UnsupportedEncodingException;
import java.net.InetAddress;
import java.net.UnknownHostException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.ResourceBundle;

import javax.jms.Connection;
import javax.jms.JMSException;
import javax.jms.MapMessage;
import javax.jms.MessageProducer;
import javax.jms.Queue;
import javax.jms.Session;

import org.apache.activemq.ActiveMQConnectionFactory;
import org.apache.log4j.Logger;

import com.syxp.dns.entity.Alarm;

public class SendMessageToMQ {

	private static Alarm alarm;
	private static ResourceBundle rb;
	private static Logger logger = Logger.getLogger(SendMessageToMQ.class);
//private static String subject = "integratedalarm.subject";										//消息队列:QUEUE		
	private String subject = "";
	private static String user = "";
	private static String password = "";
	private String url = "";
	private String phone = "";
//private static String url = "tcp://192.168.1.126:61616";
//private static String phone = "13940572922";
	private static int[] error = { 1, 1, 1 };

	/**
	 * 检测DNS并判断状态后向MQ发送消息
	 * @param alarm
	 * @author 
	 */

	public Alarm alarmOfMq() {
		int i = 1;
		int status = 1; // DNS状态,1正常,0故障
		String alarmdevname = "";
		String alarmadress = "";
		String dom = "";
		//暂定两个DNS域名,循环两次
		for (i = 1; i <= 2; i++) {
			alarm = new Alarm();
			rb = ResourceBundle.getBundle("conf/dnsinfo");
			dom = rb.getString("dom" + i);										// dns1的域名,用于检测dns
			status = this.testDns(dom);
			if (status == 1) {
				alarmdevname = rb.getString("alarmdevname" + i);
				alarmadress = rb.getString("ip" + i);
				alarm.setStatus(1);
				if (error[i] == 1) {
					alarm.setInstatu(0);
					//logger.info("数据采集监控线程正在运行,状态正常");
				} else {
					alarm.setAlarmdevname(alarmdevname);
					alarm.setInstatu(1);
					alarm.setAlarmtype("DNS");
					alarm.setAlarmaddress(alarmadress);
					alarm.setAlarmcontent(dom + "已恢复正常!");
					Calendar cal = Calendar.getInstance();
					SimpleDateFormat df = new SimpleDateFormat(
							"yyyy-MM-dd HH:mm:ss");// 设置日期格式
					String time = null;
					time = df.format(cal.getTime());
					alarm.setAlarmoccurtime(time);
					alarm.setMonitorstatus(1);
					phone = rb.getString("phone");
					alarm.setPhone(phone);
					alarm.setSms("【告警时间:"+time+"】" +"【告警类型:DNS】"+alarmdevname+"("+alarmadress+ ")" + alarm.getAlarmcontent());
					error[i] = 1;
					logger.info("检测到DNS域名"+dom+"已恢复正常");
				}
			} else {
				alarmadress = rb.getString("ip" + i);
				alarmdevname = rb.getString("alarmdevname" + i);
				alarm.setAlarmdevname(alarmdevname);
				alarm.setStatus(0);
				alarm.setInstatu(1);
				alarm.setAlarmtype("DNS");
				alarm.setAlarmaddress(alarmadress);
				alarm.setAlarmcontent(dom + "发生故障!");
				Calendar cal = Calendar.getInstance();
				SimpleDateFormat df = new SimpleDateFormat(
						"yyyy-MM-dd HH:mm:ss");// 设置日期格式
				String time = null;
				time = df.format(cal.getTime());
				alarm.setAlarmoccurtime(time);
				alarm.setMonitorstatus(0);
				phone = rb.getString("phone");
				alarm.setPhone(phone);
				if(status==error[i]){
					alarm.setSms("");
				}else{
					alarm.setSms("【告警时间:"+time+"】" +"【告警类型:DNS】"+alarmdevname+"("+alarmadress+ ")" + alarm.getAlarmcontent());
					error[i] = 0;
					logger.info("检测到DNS域名"+dom+"出现异常");
				}
			}
			if (alarm.getInstatu() == 1) {
				url = rb.getString("url");
				// 创建连接工厂
				ActiveMQConnectionFactory connectionFactory = new ActiveMQConnectionFactory(
						user, password, url);
				try {
					// 创建连接
					Connection connection = connectionFactory
							.createConnection();
					connection.start();
					// 创建会话Session
					/**
					 * 参数解释:
					 * 第一个参数是否使用事务:当消息发送者向消息提供者(即消息代理)发送消息时,消息发送者等待消息代理的确认,
					 * 没有回应则抛出异常,消息发送程序负责处理这个错误。 第二个参数消息的确认模式: AUTO_ACKNOWLEDGE
					 * : 指定消息提供者在每次收到消息时自动发送确认。消息只向目标发送一次,但传输过程中可能因为错误而丢失消息。
					 * CLIENT_ACKNOWLEDGE :
					 * 由消息接收者确认收到消息,通过调用消息的acknowledge()方法(会通知消息提供者收到了消息)
					 * DUPS_OK_ACKNOWLEDGE :
					 * 指定消息提供者在消息接收者没有确认发送时重新发送消息(这种确认模式不在乎接收者收到重复的消息)。
					 */
					Session session = connection.createSession(false,
							Session.AUTO_ACKNOWLEDGE);
					// 创建队列/主题
					subject = rb.getString("subject");
					Queue queue = session.createQueue(subject);
					// 创建消息生产者
					MessageProducer messageProducer = session
							.createProducer(queue);
					// 创建消息
					MapMessage message = session.createMapMessage();
					// 构造消息体
					try {
						message.setBytes("ALARMTYPE", alarm.getAlarmtype()
								.getBytes("GB2312"));
						// logger.info("告警类型:"+alarm.getAlarmtype());
						message.setBytes("ALARMADDRESS", alarm
								.getAlarmaddress().getBytes("GB2312"));
						// logger.info("告警设备地址:"+alarm.getAlarmaddress());
						message.setBytes("ALARMCONTENT", alarm
								.getAlarmcontent().getBytes("GB2312"));
						// logger.info("告警内容:"+alarm.getAlarmcontent());
						message.setBytes("ALARMOCCURTIME", alarm
								.getAlarmoccurtime().getBytes("GB2312"));
						// logger.info("告警发生时间:"+alarm.getAlarmoccurtime());
						message.setBytes("MONITORSTATUS",
								String.valueOf(alarm.getMonitorstatus())
										.getBytes("GB2312"));
						// logger.info("监控状态:"+alarm.getMonitorstatus());
						message.setBytes("ALARMDEVNAME", alarm
								.getAlarmdevname().getBytes("GB2312"));
						// logger.info("设备名称:"+alarm.getAlarmdevname());
						message.setBytes("SMS",
								alarm.getSms().getBytes("GB2312"));
						// logger.info("短信提醒:"+alarm.getSms());
						message.setBytes("PHONE",
								alarm.getPhone().getBytes("GB2312"));
						// logger.info("手机号码:"+alarm.getPhone());
					} catch (UnsupportedEncodingException e) {
						logger.error("---------------------------------无法找到字符编码方式GB2312---------------------------");
						e.printStackTrace();
					}
					// 发送消息到MQ
					messageProducer.send(message);
					logger.info("--------------------------------------成功发送消息----------------------------------------");
					// 关闭资源
					session.close();
					connection.close();
				} catch (JMSException e) {
					logger.error("--------------------------------------发送消息失败----------------------------------------");
					e.printStackTrace();
				}
			}
		}
		return alarm;
	}

	/**
	 * 通过域名dom检测dns是否正常
	 * 
	 * @param dom
	 * @return Dns的状态:1——正常formal,0——不正常stopped
	 */
	@SuppressWarnings("unused")
	public int testDns(String dom) {
		int status = 1;
		try {
			InetAddress[] addresses = InetAddress.getAllByName(dom);
			return status;
		} catch (UnknownHostException e) {
			// e.printStackTrace();
			status = 0;
			return status;
		}
	}

	public static void main(String[] args) {
		SendMessageToMQ sendMessageToMQ = new SendMessageToMQ();
		sendMessageToMQ.alarmOfMq();
	}

	public static Alarm getAlarm() {
		return alarm;
	}

	public static void setAlarm(Alarm alarm) {
		SendMessageToMQ.alarm = alarm;
	}

	public static ResourceBundle getRb() {
		return rb;
	}

	public static void setRb(ResourceBundle rb) {
		SendMessageToMQ.rb = rb;
	}

}

 

配置文件:dnsinfo.properties

 

 

subject=integratedalarm.subject
url=tcp://192.168.1.126:61616
phone=13940572922

ip1=192.168.1.12
dom1=www.baidu.com
status1=1
alarmdevname1=\u8BBE\u5907\u4E00

ip2=192.168.1.15
dom2=www.sina.com
status2=1
alarmdevname2=\u8BBE\u5907\u4E8C

 

线程

 

 

package com.syxp.dns.send.thread;

import java.text.SimpleDateFormat;
import java.util.Date;

import org.apache.log4j.Logger;

import com.syxp.dns.send.SendMessageToMQ;


public class SendMessageThread extends Thread{

	private static Logger logger = Logger.getLogger(SendMessageThread.class);
	SendMessageToMQ sendMessageToMQ = new SendMessageToMQ();
	
	/**
	 * 运行线程
	 */
	public void run(){
		Date now = new Date();
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-HH-dd HH:mm:ss");
		logger.info("数据采集监控线程开始运行"+sdf.format(now));
		//死循环,设置线程休眠
		while(true){
			sendMessageToMQ.alarmOfMq();
			try {
				Thread.sleep(60000);
			} catch (InterruptedException e) {
				logger.error("", e);
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 停止线程
	 */
	public void stopT(){
		this.stop();
	}
}

 

测试方法:

 

 

package com.syxp.dns.send.test;

import com.syxp.dns.send.thread.SendMessageThread;


public class SendMessageTest {

	public static void main(String[] args) {
		SendMessageThread sendMessageThread = new SendMessageThread();
		sendMessageThread.start(); 
//		sendMessageThread.stop();
	}
}
2
3
分享到:
评论

相关推荐

    利用MRGT监控DNS服务器的负载

    在实际应用中,需要根据具体情况编写脚本程序和配置MRTG,以便监控DNS服务器的状态和负载。同时,需要注意安全性和权限问题,以免出现安全漏洞。 使用MRGT监控DNS服务器的负载是一个非常实用的解决方案,可以提高...

    利用MRGT监控DNS服务器的负载.pdf

    通过编写脚本,我们可以让MRGT读取DNS服务器的状态,例如解析请求的成功与失败次数,CPU温度等,然后根据这些数据绘制出图表,帮助管理员快速了解DNS服务器的实时运行状况和长期趋势。 在Linux Debian系统下,首先...

    三、MQ服务器DNS设置及清空DNS缓存操作-中国电子口岸数据中心.pdf

    本文档详细介绍了MQ服务器DNS设置及清空DNS缓存操作的步骤和方法,旨在帮助联网企业正确地配置MQ服务器的DNS设置,并进行DNS缓存的清空操作。该文档涵盖了Windows、Linux和AIX三种操作系统的DNS设置和缓存清空方法,...

    可改变过源ip和源端口的DNS请求报文发送和响应报文发送

    可改变过源ip和源端口的DNS请求报文发送和响应报文发送

    java实现DNS数据包发送及响应数据包解析IDEA源代码

    Java 实现DNS数据包发送及响应数据包解析的IDEA源代码主要涉及到以下几个核心知识点: 1. **DNS(Domain Name System)域名系统**:DNS是互联网的一项服务,它作为将域名和IP地址相互映射的一个分布式数据库,允许...

    用Socket实现DNS查询

    而迭代查询则是在DNS服务器无法直接提供答案时,返回其他服务器的地址,客户端再向这些服务器发起新的查询。 使用Socket实现DNS查询时,我们需要遵循以下步骤: 1. **创建Socket**:首先,我们需要创建一个UDP ...

    VS2008代码实现本机网络状态监视纯C++

    在实际应用中,你可以定期运行这个检查,例如每分钟或几秒钟执行一次,以实时监控网络状态。当网络状态发生变化时,程序可以通过输出信息或者触发其他操作来通知用户。 总结来说,通过VS2008和C++,我们可以利用...

    易语言DnsQuery解析DNS源码

    1. **发起查询**:程序通过调用DnsQuery函数,向DNS服务器发送一个查询请求,包含待解析的域名。 2. **构建DNS报文**:在请求中,DNS报文会包含DNS头、问题部分(包含查询的域名和类型)、以及可能的答案、权威记录...

    智能DNS 实施方案

    同时,部署监控系统,实时监测DNS服务的运行状态和性能指标。 6. **部署与维护** 将配置推广到所有DNS节点,并持续监控和调整策略,以应对业务变化和网络环境的波动。 总结,智能DNS的实施方案涉及多个环节,包括...

    DNS服务器 Eagle DNS

    6. **日志和监控**:详尽的日志记录和实时监控功能,帮助管理员了解服务器状态,及时发现并解决问题。 7. **扩展性**:Eagle DNS可能支持与其他系统的集成,例如动态DNS更新,允许家庭用户或移动设备自动更新其不断...

    发送DNS查询包的工具dnsquery.zip

    dnsquery 是一个用来发送 DNS 查询包的工具。 参数说明: ./dnsquery 1.1.1.1 www.sincoder.com 8.8.8.8 22 0 伪造源地址为 1.1.1.1 向 8.8.8.8 发送解析域名www.sincoder.com 的请求 重复发送22次 每个包时间间隔...

    DNS安全白皮书 -360.pdf

    - DNS放大攻击:攻击者利用开放的DNS服务器发送大量数据包,导致目标网络带宽耗尽。 - 缓存中毒(Cache poisoning):攻击者向DNS缓存中插入虚假记录,导致合法域名被指向恶意IP地址。 - **DNS攻击的影响** - ...

    DNS中继服务器(含详细实验文档)

    3. **DNS请求转发**:根据解析得到的信息,构造新的DNS查询报文,并发送到上一级DNS服务器。 4. **DNS响应处理**:接收上一级DNS服务器的响应报文,将其转发回原始客户端。 5. **错误处理**:处理可能的网络异常、...

    windows平台下DNS诊断工具Dig

    通过编写批处理文件或配合其他编程语言,可以实现定期查询、监控DNS服务状态等功能。 8. **与其他工具结合**:在Windows环境中,Dig可以与Wireshark等网络抓包工具结合,用于分析DNS流量和交互,进一步提升诊断能力...

    dnsproxy dns 转发程序

    4. **日志记录**:对于网络管理员来说,DNSproxy可能提供日志记录功能,方便监控和分析DNS查询行为。 在实际应用中,DNSproxy的部署可以提升企业或个人网络环境的稳定性和安全性。同时,对于那些关心自己在线隐私或...

    DNS 域名服务协议

    在DNS的工作流程中,当客户端需要解析域名时,首先会向本地DNS服务器发送查询请求。本地DNS服务器首先查询本地缓存,如果找到对应的IP地址,则直接返回给客户端;如果没有找到,则将请求转发给上一级DNS服务器。这样...

Global site tag (gtag.js) - Google Analytics