监控主动轮询进程是否会崩溃跪掉,采取措施是通过心跳包形式进行抓取,定时生成文件,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
分享到:
相关推荐
在IT行业中,心跳程序是一种常见的系统监控机制,用于检测服务是否正常运行。在C#编程环境下,我们可以构建这样的心跳程序来确保服务器、网络连接或其他关键服务的可用性。以下是关于"C#心跳程序"的一些核心知识点:...
在IT行业中,心跳程序是一种非常重要的机制,尤其在分布式系统、网络通信以及监控系统中扮演着关键角色。本文将深入探讨心跳程序的概念、工作原理、实现方式,以及它与socket编程的关系。 首先,我们理解一下“心跳...
当定时器触发时,程序会检查是否在指定的时间窗口内接收到PLC发送的心跳信息。如果没有接收到,就启动一个报警机制,显示PLC已离线。这有助于快速识别并解决由于网络问题、硬件故障或其他原因导致的通信中断。 **...
【银行监控源码程序】是一种专门用于银行监控系统的软件开发工具,它包含了实现网络联通测试的关键功能。在银行这样的金融机构中,网络安全与稳定至关重要,因此,监控系统扮演着不可或缺的角色。这个源码程序的设计...
在这个主题中,我们主要聚焦于一款基于VC++源码实现的远程桌面监控程序。VC++是微软开发的一种面向对象的编程语言,常用于创建高性能的应用程序,包括系统级软件、游戏引擎和桌面应用等。 远程桌面监控的核心技术...
可执行文件监控程序是一种系统工具,其主要任务是对指定的可执行文件(*.exe)进行实时监控,确保它们能够正常运行。这种程序通常用于服务管理、故障恢复和系统稳定性维护。下面将详细解释该监控程序的功能、工作...
这可能包含Elasticsearch服务器的系统日志、应用日志或者由我们的Node.js心跳程序生成的日志。通过分析这些日志,我们可以获取更详细的服务器状态信息,包括但不限于索引操作、查询性能、节点活动等。 总结来说,...
如果程序或系统进入不期望的状态,看门狗会在预设时间内未收到“心跳”信号(证明程序正常运行的信号)后,强制执行重启操作。 5. **守护程序(Daemon)**:守护程序是后台运行的长期服务,通常在用户登录会话之外...
心跳包通常被用在网络监控、高可用性集群和远程过程调用等场景,它通过周期性地发送小数据包来检测网络连接的健康状况。在这个"heart_packet.rar_Linux心跳包"压缩包中,包含了一个实现心跳包机制的Linux网络通信...
在Windows 32位环境下,心跳监控服务器和客户端的设计是一个重要的网络通信技术,它主要用于确保网络连接的稳定性和及时检测连接中断。心跳监控系统通过周期性地发送数据包(心跳包)来验证通信双方是否在线并能正常...
本例程集是作者精心编写的西门子PLC诊断程序,旨在帮助用户理解和掌握如何在实际操作中对西门子PLC进行有效的故障排查和系统监控。 在西门子PLC编程中,诊断程序的重要性不言而喻。它能够帮助工程师实时监控PLC的...
在IT行业中,网络连接的稳定性是许多应用程序的关键因素。C#作为.NET框架的一部分,提供了强大的网络编程能力,其中心跳连接是一种常用的保持网络连接活跃的方法。本文将深入探讨如何使用C#进行心跳连接来实时检测...
### Windows 下 Tomcat 的守护进程与心跳检测程序详解 在 IT 领域,特别是 Java Web 开发中,Apache Tomcat 是一个非常重要的轻量级应用服务器,它主要用于部署 Java Web 应用程序。在实际生产环境中,为了保证服务...
标题中的“心跳监控软件”指的是一个能够实时监测和显示心跳数据的应用程序,通常用于健康管理和医疗辅助领域。这种软件能够接收来自下位机(可能是传感器设备)的数据,并将其转化为可视化的波形图,帮助用户或者医...
总的来说,“基于MFC的TCP心跳检测包”是一个实用的工具,可以帮助开发者监控TCP连接的稳定性。通过理解TCP心跳检测的原理和MFC网络编程的细节,我们可以有效地维护和优化网络应用程序,确保数据传输的高效与可靠。...
标题中的"STC12C5A60S2手指心跳检测程序"指的是一个基于STC12C5A60S2单片机的项目,该项目专注于开发一种能够检测手指心跳的技术。STC12C5A60S2是STC公司生产的一款8位单片机,拥有丰富的I/O端口和内部资源,适用于...
在本项目中,C#应用程序会周期性地向PLC发送一个“心跳”消息,如果PLC收到并返回确认,那么连接被认为是正常的。如果连续几次没有收到确认,系统可以采取相应措施,比如重新建立连接。 3. **时间同步**:在工业...
- Java应用程序监控; - 实时性能指标; - 故障诊断。 #### 开源的移动分析应用Countly - **简介**:Countly是一款开源的移动应用分析平台,提供实时用户行为分析。 - **最新版本**:Countly v16.06,此版本...
Nagios提供了Nagios XL、Nagios日志服务器和Nagios网络分析器等工具,其中Nagios XL专为网络监控设计,提供带宽报告、网络心跳监控、自定义URL监控等。企业版还包含Web控制台、业务流程监控和自动化功能。 3. **...
在Java微服务领域,心跳检测通常应用于应用服务器,例如Tomcat和Jetty,来监控服务的状态并预防潜在问题。本文将深入探讨心跳检测的概念、重要性以及如何在这些服务器上实现。 首先,我们来理解什么是心跳检测。...