`

监控心跳程序

 
阅读更多
监控主动轮询进程是否会崩溃跪掉,采取措施是通过心跳包形式进行抓取,定时生成文件,jnotify监听发到kafka上,之后通过消费者进行解析,若发现不符规则情况,发邮件短信报警。

package heartbeat.monitor;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.ExecutionException;

import org.apache.commons.io.IOUtils;

import heartbeat.monitor.sendmessage.SendMailUtil;
import heartbeat.monitor.util.HeartBeatMonitorConstant;

/**
 * @author Switching
 * @version 1.0, 2017-01-01
 * @since heartbeat.monitor 1.0
 */
public class HeartBeatMonitorAccess {
	private List<HeartBeatMonitor> consumers;
	private static String heartbeatConsumerProperties;

	public HeartBeatMonitorAccess() throws IOException {

		Properties properties = new Properties();
		if (heartbeatConsumerProperties == null) {
			properties.load(ClassLoader.getSystemResourceAsStream("heartBeatMonitor.properties"));
		} else {
			String propurl = heartbeatConsumerProperties;
			InputStream in = new FileInputStream(propurl);
			properties.load(in);
			IOUtils.closeQuietly(in);
		}
		int num = 1;
		String topic = properties.getProperty(HeartBeatMonitorConstant.MONITOR_TOPIC);
		consumers = new ArrayList<HeartBeatMonitor>(num);
		for (int i = 0; i < num; i++) {
			consumers.add(new HeartBeatMonitor(properties, topic));
			new SendMailUtil(properties, topic);
		}
	}

	public void exeute() throws InterruptedException, ExecutionException {
		for (HeartBeatMonitor consumer : consumers) {
			new Thread(consumer).start();
		}
	}

	public static void main(String[] args) throws Exception {
		if (args.length > 0)
			heartbeatConsumerProperties = args[0];

		HeartBeatMonitorAccess consumerGroup = new HeartBeatMonitorAccess();
		consumerGroup.exeute();
	}

}



消费者抓取相应的规则进行解析判断
后台轮询消费kafka中消息

package heartbeat.monitor;

import java.io.IOException;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Collections;
import java.util.Date;
import java.util.Map;
import java.util.Properties;

import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.clients.consumer.ConsumerRecords;
import org.apache.kafka.clients.consumer.KafkaConsumer;
import org.codehaus.jackson.map.ObjectMapper;

import heartbeat.monitor.sendmessage.SendMailUtil;
import heartbeat.monitor.util.HeartBeatMonitorConstant;
import heartbeat.monitor.util.MessageUtil;

/**
 * @author Switching
 * @version 1.0, 2017-01-01
 * @since heartbeat.monitor 1.0
 */
public class HeartBeatMonitor implements Runnable {
	private final KafkaConsumer<String, String> consumer;
	public static String lastMonitorTime;
	public static String lastMonitorInfo;
	public static DateFormat dfMonitorTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

	private long timeMonitor = 20000;
	private long maxTriesTime = 3;
	private String monitorKeyWord = "FILE_WRITTEN_CLOSED";
	private String monitorLogLvls = "EXCEPTION";

	public HeartBeatMonitor(Properties properties, String topic) throws IOException {
		if (!MessageUtil.isEmpty(properties.getProperty(HeartBeatMonitorConstant.MONITOR_OFFSET_TIME)))
			timeMonitor = Long.parseLong(properties.getProperty(HeartBeatMonitorConstant.MONITOR_OFFSET_TIME));
		if (!MessageUtil.isEmpty(properties.getProperty(HeartBeatMonitorConstant.MONITOR_TRIES)))
			maxTriesTime = Long.parseLong(properties.getProperty(HeartBeatMonitorConstant.MONITOR_TRIES));
		if (!MessageUtil.isEmpty(properties.getProperty(HeartBeatMonitorConstant.MONITOR_KEY_WORD)))
			monitorKeyWord = properties.getProperty(HeartBeatMonitorConstant.MONITOR_KEY_WORD);
		if (!MessageUtil.isEmpty(properties.getProperty(HeartBeatMonitorConstant.MONITOR_LOG_LVLS)))
			monitorLogLvls = properties.getProperty(HeartBeatMonitorConstant.MONITOR_LOG_LVLS);
		consumer = new KafkaConsumer<String, String>(properties);
		consumer.subscribe(Collections.singletonList(topic));
	}

	public void close() {
		consumer.close();
	}

	public void run() {
		long triesTime = maxTriesTime - 1;
		System.out.println("Heartbeat Monitor Start!");
		if (lastMonitorTime == null) {
			resetTime();
		}
		String name = Thread.currentThread().getName();
		while (true) {
			Date dtMonitor;
			Date dtLocal = new Date();

			ConsumerRecords<String, String> records = consumer.poll(2);
			for (ConsumerRecord<String, String> record : records) {
				ObjectMapper objectMapper = new ObjectMapper();
				try {
					Map<String, String> recordMap = objectMapper.readValue(record.value(), Map.class);
					if (recordMap.get(HeartBeatMonitorConstant.FILE_EVENT).toString().equals(monitorKeyWord)) {
						lastMonitorTime = recordMap.get(HeartBeatMonitorConstant.FILE_TIME).toString();
						lastMonitorInfo = recordMap.get(HeartBeatMonitorConstant.SFTP_HOST_NAME) + ":"
								+ recordMap.get(HeartBeatMonitorConstant.SFTP_HOST_IP);
					}
				} catch (Exception e) {
					e.printStackTrace();
				}
				System.out.println(name + "---" + record.partition() + ":" + record.offset() + " = " + record.key()
						+ ":" + record.value());
			}

			try {
				dtMonitor = dfMonitorTime.parse(lastMonitorTime);
				if ((dtLocal.getTime() - timeMonitor) > dtMonitor.getTime()) {
					if (triesTime > 0) {
						triesTime--;
					} else {
						resetTime();
						triesTime = maxTriesTime - 1;
					}
					if (HeartBeatMonitorConstant.LOG_LVL_EXCEP.equals(monitorLogLvls)
							|| HeartBeatMonitorConstant.LOG_LVL_ALL.equals(monitorLogLvls)) {
						String content = "[" + dtLocal + "] " + lastMonitorInfo
								+ " Exception! manual intervention please! " + (triesTime + 1) + " times! \n\t\t\t\tNow("
								+ dtLocal + ") is beyond " + timeMonitor / 1000 + "(s) lastMonitorTime(" + dtMonitor
								+ ").";
						System.out.println(content);
						if (triesTime == 0) {
							SendMailUtil.sendMailAccess(lastMonitorInfo, content);
						}
					}
				} else {
					if (HeartBeatMonitorConstant.LOG_LVL_NOEXCEP.equals(monitorLogLvls)
							|| HeartBeatMonitorConstant.LOG_LVL_ALL.equals(monitorLogLvls)) {
						System.out.println("[" + dtLocal + "] " + name + "NoException! \n\t\t\t\tNow(" + dtLocal
								+ ") is Range " + timeMonitor / 1000 + " (s) lastMonitorTime(" + dtMonitor + ").");
					}
				}
			} catch (ParseException e) {
				e.printStackTrace();
			} catch (Exception e) {
				e.printStackTrace();
			}

		}
	}

	public void resetTime() {
		lastMonitorTime = dfMonitorTime.format(new Date());
		if (lastMonitorInfo == null) {
			lastMonitorInfo = "Monitor";
		}
	}
}




通过配置文件形式,进行各种事件的监控
#Created by Switching
auto.commit.interval.ms=1000
auto.offset.reset=earliest
bootstrap.servers=192.168.102.10\:9092
enable.auto.commit=true
group.id=monitor1
key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
monitorTopic=monitor
value.deserializer=org.apache.kafka.common.serialization.StringDeserializer

#heartBeat monitor exception notify times(3)
monitorTries=3
#heartBeat monitor offset time(20000)(ms)
monitorOffsetTime=20000
#heartBeat monitor log lvls(EXCEPTION):ALL|EXCEPTION|NOEXCEPTION|NONE 
monitorLogLvls=EXCEPTION

#heartBeat Monitor mailInfo
sendEmailAccount=xxxx@jdongtech.com	
sendEmailPassword=xxxxx
sendEmailSMTPHost=smtp.xxxx.com
receEMailAccount=xxx@jdongtech.com

分享到:
评论

相关推荐

    c#心跳程序

    在IT行业中,心跳程序是一种常见的系统监控机制,用于检测服务是否正常运行。在C#编程环境下,我们可以构建这样的心跳程序来确保服务器、网络连接或其他关键服务的可用性。以下是关于"C#心跳程序"的一些核心知识点:...

    心跳程序,能实现定时接收心跳和数据的功能。

    在IT行业中,心跳程序是一种非常重要的机制,尤其在分布式系统、网络通信以及监控系统中扮演着关键角色。本文将深入探讨心跳程序的概念、工作原理、实现方式,以及它与socket编程的关系。 首先,我们理解一下“心跳...

    V免签最新配套电脑PC监控心跳检测软件

    标题中的“V免签最新配套电脑PC监控心跳检测软件”是指一种专为个人计算机(PC)设计的监控软件,用于实时监测系统运行状态并确保其持续稳定运行。这种软件通常包含心跳检测功能,心跳检测是一种网络通信技术,通过...

    PLC心跳 在线离线显示_判定labview与PLC的连接是否断开_plc心跳超时_心跳信号plc_plc心跳信号_plchea

    当定时器触发时,程序会检查是否在指定的时间窗口内接收到PLC发送的心跳信息。如果没有接收到,就启动一个报警机制,显示PLC已离线。这有助于快速识别并解决由于网络问题、硬件故障或其他原因导致的通信中断。 **...

    银行监控源码程序

    【银行监控源码程序】是一种专门用于银行监控系统的软件开发工具,它包含了实现网络联通测试的关键功能。在银行这样的金融机构中,网络安全与稳定至关重要,因此,监控系统扮演着不可或缺的角色。这个源码程序的设计...

    远程桌面监控 很不错的程序

    在这个主题中,我们主要聚焦于一款基于VC++源码实现的远程桌面监控程序。VC++是微软开发的一种面向对象的编程语言,常用于创建高性能的应用程序,包括系统级软件、游戏引擎和桌面应用等。 远程桌面监控的核心技术...

    可执行文件监控程序

    可执行文件监控程序是一种系统工具,其主要任务是对指定的可执行文件(*.exe)进行实时监控,确保它们能够正常运行。这种程序通常用于服务管理、故障恢复和系统稳定性维护。下面将详细解释该监控程序的功能、工作...

    Nodejs心跳包(二)监控elasticsearch服务器状态

    这可能包含Elasticsearch服务器的系统日志、应用日志或者由我们的Node.js心跳程序生成的日志。通过分析这些日志,我们可以获取更详细的服务器状态信息,包括但不限于索引操作、查询性能、节点活动等。 总结来说,...

    监控程序运行进程及系统CPU运行状态异常重启

    如果程序或系统进入不期望的状态,看门狗会在预设时间内未收到“心跳”信号(证明程序正常运行的信号)后,强制执行重启操作。 5. **守护程序(Daemon)**:守护程序是后台运行的长期服务,通常在用户登录会话之外...

    heart_packet.rar_Linux心跳包_linux 网络_linux心跳程序_心跳包_心跳包 linux

    心跳包通常被用在网络监控、高可用性集群和远程过程调用等场景,它通过周期性地发送小数据包来检测网络连接的健康状况。在这个"heart_packet.rar_Linux心跳包"压缩包中,包含了一个实现心跳包机制的Linux网络通信...

    win32下心跳监控服务器和客户端设计

    在Windows 32位环境下,心跳监控服务器和客户端的设计是一个重要的网络通信技术,它主要用于确保网络连接的稳定性和及时检测连接中断。心跳监控系统通过周期性地发送数据包(心跳包)来验证通信双方是否在线并能正常...

    西门子PLC例程-西门子诊断程序 本人吐血之作.zip

    本例程集是作者精心编写的西门子PLC诊断程序,旨在帮助用户理解和掌握如何在实际操作中对西门子PLC进行有效的故障排查和系统监控。 在西门子PLC编程中,诊断程序的重要性不言而喻。它能够帮助工程师实时监控PLC的...

    c#心跳连接实时检测网络通断情况

    在IT行业中,网络连接的稳定性是许多应用程序的关键因素。C#作为.NET框架的一部分,提供了强大的网络编程能力,其中心跳连接是一种常用的保持网络连接活跃的方法。本文将深入探讨如何使用C#进行心跳连接来实时检测...

    Windows下 tomcat的守护进程、心跳程序

    ### Windows 下 Tomcat 的守护进程与心跳检测程序详解 在 IT 领域,特别是 Java Web 开发中,Apache Tomcat 是一个非常重要的轻量级应用服务器,它主要用于部署 Java Web 应用程序。在实际生产环境中,为了保证服务...

    心跳监控软件

    标题中的“心跳监控软件”指的是一个能够实时监测和显示心跳数据的应用程序,通常用于健康管理和医疗辅助领域。这种软件能够接收来自下位机(可能是传感器设备)的数据,并将其转化为可视化的波形图,帮助用户或者医...

    基于MFC的TCP心跳检测包

    总的来说,“基于MFC的TCP心跳检测包”是一个实用的工具,可以帮助开发者监控TCP连接的稳定性。通过理解TCP心跳检测的原理和MFC网络编程的细节,我们可以有效地维护和优化网络应用程序,确保数据传输的高效与可靠。...

    心跳检测应用服务器(如Tomcat,Jetty)的JAVA 微服务应用程序

    在Java微服务领域,心跳检测通常应用于应用服务器,例如Tomcat和Jetty,来监控服务的状态并预防潜在问题。本文将深入探讨心跳检测的概念、重要性以及如何在这些服务器上实现。 首先,我们来理解什么是心跳检测。...

    系统监控开源软件

    - Java应用程序监控; - 实时性能指标; - 故障诊断。 #### 开源的移动分析应用Countly - **简介**:Countly是一款开源的移动应用分析平台,提供实时用户行为分析。 - **最新版本**:Countly v16.06,此版本...

    常用的运维监控系统 常用的运维监控系统

    Nagios提供了Nagios XL、Nagios日志服务器和Nagios网络分析器等工具,其中Nagios XL专为网络监控设计,提供带宽报告、网络心跳监控、自定义URL监控等。企业版还包含Web控制台、业务流程监控和自动化功能。 3. **...

    STC12C5A60S2手指心跳检测程序

    标题中的"STC12C5A60S2手指心跳检测程序"指的是一个基于STC12C5A60S2单片机的项目,该项目专注于开发一种能够检测手指心跳的技术。STC12C5A60S2是STC公司生产的一款8位单片机,拥有丰富的I/O端口和内部资源,适用于...

Global site tag (gtag.js) - Google Analytics