监控心跳实现

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

Java代码

  1. package heartbeat.monitor;
  2. import java.io.FileInputStream;
  3. import java.io.IOException;
  4. import java.io.InputStream;
  5. import java.util.ArrayList;
  6. import java.util.List;
  7. import java.util.Properties;
  8. import java.util.concurrent.ExecutionException;
  9. import org.apache.commons.io.IOUtils;
  10. import heartbeat.monitor.sendmessage.SendMailUtil;
  11. import heartbeat.monitor.util.HeartBeatMonitorConstant;
  12. /**
  13. * @author Switching
  14. * @version 1.0, 2017-01-01
  15. * @since heartbeat.monitor 1.0
  16. */
  17. public class HeartBeatMonitorAccess {
  18. private List<HeartBeatMonitor> consumers;
  19. private static String heartbeatConsumerProperties;
  20. public HeartBeatMonitorAccess() throws IOException {
  21. Properties properties = new Properties();
  22. if (heartbeatConsumerProperties == null) {
  23. properties.load(ClassLoader.getSystemResourceAsStream("heartBeatMonitor.properties"));
  24. } else {
  25. String propurl = heartbeatConsumerProperties;
  26. InputStream in = new FileInputStream(propurl);
  27. properties.load(in);
  28. IOUtils.closeQuietly(in);
  29. }
  30. int num = 1;
  31. String topic = properties.getProperty(HeartBeatMonitorConstant.MONITOR_TOPIC);
  32. consumers = new ArrayList<HeartBeatMonitor>(num);
  33. for (int i = 0; i < num; i++) {
  34. consumers.add(new HeartBeatMonitor(properties, topic));
  35. new SendMailUtil(properties, topic);
  36. }
  37. }
  38. public void exeute() throws InterruptedException, ExecutionException {
  39. for (HeartBeatMonitor consumer : consumers) {
  40. new Thread(consumer).start();
  41. }
  42. }
  43. public static void main(String[] args) throws Exception {
  44. if (args.length > 0)
  45. heartbeatConsumerProperties = args[0];
  46. HeartBeatMonitorAccess consumerGroup = new HeartBeatMonitorAccess();
  47. consumerGroup.exeute();
  48. }
  49. }

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

Java代码

  1. package heartbeat.monitor;
  2. import java.io.IOException;
  3. import java.text.DateFormat;
  4. import java.text.ParseException;
  5. import java.text.SimpleDateFormat;
  6. import java.util.Collections;
  7. import java.util.Date;
  8. import java.util.Map;
  9. import java.util.Properties;
  10. import org.apache.kafka.clients.consumer.ConsumerRecord;
  11. import org.apache.kafka.clients.consumer.ConsumerRecords;
  12. import org.apache.kafka.clients.consumer.KafkaConsumer;
  13. import org.codehaus.jackson.map.ObjectMapper;
  14. import heartbeat.monitor.sendmessage.SendMailUtil;
  15. import heartbeat.monitor.util.HeartBeatMonitorConstant;
  16. import heartbeat.monitor.util.MessageUtil;
  17. /**
  18. * @author Switching
  19. * @version 1.0, 2017-01-01
  20. * @since heartbeat.monitor 1.0
  21. */
  22. public class HeartBeatMonitor implements Runnable {
  23. private final KafkaConsumer<String, String> consumer;
  24. public static String lastMonitorTime;
  25. public static String lastMonitorInfo;
  26. public static DateFormat dfMonitorTime = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  27. private long timeMonitor = 20000;
  28. private long maxTriesTime = 3;
  29. private String monitorKeyWord = "FILE_WRITTEN_CLOSED";
  30. private String monitorLogLvls = "EXCEPTION";
  31. public HeartBeatMonitor(Properties properties, String topic) throws IOException {
  32. if (!MessageUtil.isEmpty(properties.getProperty(HeartBeatMonitorConstant.MONITOR_OFFSET_TIME)))
  33. timeMonitor = Long.parseLong(properties.getProperty(HeartBeatMonitorConstant.MONITOR_OFFSET_TIME));
  34. if (!MessageUtil.isEmpty(properties.getProperty(HeartBeatMonitorConstant.MONITOR_TRIES)))
  35. maxTriesTime = Long.parseLong(properties.getProperty(HeartBeatMonitorConstant.MONITOR_TRIES));
  36. if (!MessageUtil.isEmpty(properties.getProperty(HeartBeatMonitorConstant.MONITOR_KEY_WORD)))
  37. monitorKeyWord = properties.getProperty(HeartBeatMonitorConstant.MONITOR_KEY_WORD);
  38. if (!MessageUtil.isEmpty(properties.getProperty(HeartBeatMonitorConstant.MONITOR_LOG_LVLS)))
  39. monitorLogLvls = properties.getProperty(HeartBeatMonitorConstant.MONITOR_LOG_LVLS);
  40. consumer = new KafkaConsumer<String, String>(properties);
  41. consumer.subscribe(Collections.singletonList(topic));
  42. }
  43. public void close() {
  44. consumer.close();
  45. }
  46. public void run() {
  47. long triesTime = maxTriesTime - 1;
  48. System.out.println("Heartbeat Monitor Start!");
  49. if (lastMonitorTime == null) {
  50. resetTime();
  51. }
  52. String name = Thread.currentThread().getName();
  53. while (true) {
  54. Date dtMonitor;
  55. Date dtLocal = new Date();
  56. ConsumerRecords<String, String> records = consumer.poll(2);
  57. for (ConsumerRecord<String, String> record : records) {
  58. ObjectMapper objectMapper = new ObjectMapper();
  59. try {
  60. Map<String, String> recordMap = objectMapper.readValue(record.value(), Map.class);
  61. if (recordMap.get(HeartBeatMonitorConstant.FILE_EVENT).toString().equals(monitorKeyWord)) {
  62. lastMonitorTime = recordMap.get(HeartBeatMonitorConstant.FILE_TIME).toString();
  63. lastMonitorInfo = recordMap.get(HeartBeatMonitorConstant.SFTP_HOST_NAME) + ":"
  64. + recordMap.get(HeartBeatMonitorConstant.SFTP_HOST_IP);
  65. }
  66. } catch (Exception e) {
  67. e.printStackTrace();
  68. }
  69. System.out.println(name + "---" + record.partition() + ":" + record.offset() + " = " + record.key()
  70. + ":" + record.value());
  71. }
  72. try {
  73. dtMonitor = dfMonitorTime.parse(lastMonitorTime);
  74. if ((dtLocal.getTime() - timeMonitor) > dtMonitor.getTime()) {
  75. if (triesTime > 0) {
  76. triesTime--;
  77. } else {
  78. resetTime();
  79. triesTime = maxTriesTime - 1;
  80. }
  81. if (HeartBeatMonitorConstant.LOG_LVL_EXCEP.equals(monitorLogLvls)
  82. || HeartBeatMonitorConstant.LOG_LVL_ALL.equals(monitorLogLvls)) {
  83. String content = "[" + dtLocal + "] " + lastMonitorInfo
  84. + " Exception! manual intervention please! " + (triesTime + 1) + " times! \n\t\t\t\tNow("
  85. + dtLocal + ") is beyond " + timeMonitor / 1000 + "(s) lastMonitorTime(" + dtMonitor
  86. + ").";
  87. System.out.println(content);
  88. if (triesTime == 0) {
  89. SendMailUtil.sendMailAccess(lastMonitorInfo, content);
  90. }
  91. }
  92. } else {
  93. if (HeartBeatMonitorConstant.LOG_LVL_NOEXCEP.equals(monitorLogLvls)
  94. || HeartBeatMonitorConstant.LOG_LVL_ALL.equals(monitorLogLvls)) {
  95. System.out.println("[" + dtLocal + "] " + name + "NoException! \n\t\t\t\tNow(" + dtLocal
  96. + ") is Range " + timeMonitor / 1000 + " (s) lastMonitorTime(" + dtMonitor + ").");
  97. }
  98. }
  99. } catch (ParseException e) {
  100. e.printStackTrace();
  101. } catch (Exception e) {
  102. e.printStackTrace();
  103. }
  104. }
  105. }
  106. public void resetTime() {
  107. lastMonitorTime = dfMonitorTime.format(new Date());
  108. if (lastMonitorInfo == null) {
  109. lastMonitorInfo = "Monitor";
  110. }
  111. }
  112. }

通过配置文件形式,进行各种事件的监控

Java代码

    1. #Created by Switching
    2. auto.commit.interval.ms=1000
    3. auto.offset.reset=earliest
    4. bootstrap.servers=192.168.102.10\:9092
    5. enable.auto.commit=true
    6. group.id=monitor1
    7. key.deserializer=org.apache.kafka.common.serialization.StringDeserializer
    8. monitorTopic=monitor
    9. value.deserializer=org.apache.kafka.common.serialization.StringDeserializer
    10. #heartBeat monitor exception notify times(3)
    11. monitorTries=3
    12. #heartBeat monitor offset time(20000)(ms)
    13. monitorOffsetTime=20000
    14. #heartBeat monitor log lvls(EXCEPTION):ALL|EXCEPTION|NOEXCEPTION|NONE
    15. monitorLogLvls=EXCEPTION
    16. #heartBeat Monitor mailInfo
    17. sendEmailAccount=xxxx@jdongtech.com
    18. sendEmailPassword=xxxxx
    19. sendEmailSMTPHost=smtp.xxxx.com
    20. receEMailAccount=xxx@jdongtech.com
时间: 2024-10-21 11:33:29

监控心跳实现的相关文章

Web服务器和API接口服务器心跳检查

https://blog.csdn.net/lgcjava/article/details/77131695 作为后台开发兼运维人员,web服务器.api接口服务器.开发测试的各种工具(JIRA/bitbucket)等等越来越多.能否有个工具能实时监控各个服务器的运行状态.如果出现异常,及时邮件和微信通知自己呢?    最后在发现heartbeart这款开源软件,正是我要找的.配置实例.运行后自动监控心跳.异常发生邮件通知.    在运行时发现一些配置问题和功能缺陷,比如实例查询不支持中文.不支

☆一款为父母设计的手机

一款给父母设计的手机,我们的父母现在集中在四十到五十的年龄段,不同年龄段的人对手机有着不同的需求,所以手机功能也要符合这个年龄段的需要. 我们组对父母们这辈人的需求进行了想象.我们父母这辈已经到了中年,到了开始注重健康的年龄,所以我们组的手机主打健康,在手机的基础上还添加了配件.考虑到中年人挑选手机,比较关注性价比,实用性,我们考虑给手机添加便于使用的设计,以及减少一些多余功能降低价格. 手机主要功能: ①               配套智能手环,手环可监控心跳血压,结合手机自带APP实时检测

[分布式系统学习]阅读笔记 Distributed systems for fun and profit 之三 时间和顺序

这是阅读 http://book.mixu.net/distsys/time.html 的笔记,是该系列的第三章. 为什么时间和顺序很重要呢?为什么我们关系事件A发生在事件B之前? 因为分布式系统要解决的问题是把单机上的问题通过多机来解决.然而传统单机的程序总是假设确定的顺序.对于分布式程序来说,正确性最简单的定义就是,跑起来像一台单机上运行的程序. 全序和偏序 具体的定义大家可以去翻离散书.简单地说,全序就是在集合里任何两个元素都可以比较,分出大小.偏序中,某些元素是没办法比较大小的. 在单节

linux之keepalived详解

一.keepalive简介 Keepalived是专门针对LVS设计的一款强大的辅助工具,主要用来提供故障切换和健检查功能,如判断LVS负载调度器.节点服务器的可用性,及时隔离并替换为新的服务器,当故障主机恢复后将其重新加入群集.在非LVS群集环境中使用时Keepalived也可以作为热备软件使用. Keepalived采用VRRP(virtual  router  redundancy protocol,虚拟路由冗余协议)热备份协议,以软件的方式实现linux服务器的多机热备功能.VRRP是针

VMware HA 特性

关键特性1.自动检测服务器故障.VMware HA 自动监控物理服务器的可用性.VMware HA 可检测物理服务器故障,并且无需人工干预即可重新启动资源池中其他物理服务器上的新虚拟机.2.自动检测操作系统故障.VMware HA 可通过监控心跳信号信息检测虚拟机内部的操作系统故障.如果检测到故障,则会自动重新启动服务器上受影响的虚拟机.3.以智能方式从虚拟机故障切换到拥有最佳可用资源的服务器(需要 VMware DRS).在服务器发生故障后,将已重启的虚拟机自动安排到最佳位置.4.具有跨多台物

谈谈对于vmware Workstation 网络连接三种模式的认识.

大家好,我是黄药师,从今天开始坚持写博客. 简介: VM(VMware Workstation简称VM,后面都将用VM代替阐述)是一款功能强大的虚拟化软件.VM支持在 单一的桌面上同时运行多款不同的操作系统,能够模拟完整的网络环境,支持pxe功能.实时快照,等等多种强 大的功能.能够测试软件和部署新的业务测试.同时节约了很多资源.节约了企业成本.所以对于广大的互联 网从业者是不可多得的好工具. 本文中作者使用的软件以及操作系统版本: VM 11.1.2版本 win10 专业版 由于本文只讨论VM

桌面开发者的界面故事,该醒醒了

本文我们只谈界面. 大部分人最开始学习编程是Console,搞个计算器啥的,后来高级一点能做一个俄罗斯方块出来.很羡慕那些能做出界面的,于是大二学了MFC,一开始看<深入浅出>怎么都搞不懂,后来我们班的一个女生教了我两个小时,我一下子通畅了,用GDI半个月苦哈哈的做了第一个当时觉得还能看得界面(不用任何控件哦)连箭头都是用三根线拼起来的! 后来学习了C#,当时是一本速成的C#开发100例,看完<实现简单的播放器>以后,“我靠,怎么这么简单!”于是便投入了WinForm的怀抱.然后做

Mysql中间件Proxysql实现mysql主从架构读写分离

实验主机 Master: 192.168.0.17 Slave: 192.168.0.20 Proxysql:192.168.0.30建议关闭防火墙建立Master: 192.168.0.17与Slave: 192.168.0.20的MySQL主从复制架构 Proxysql:192.168.0.30主机上基于yum安装proxysql [[email protected] ~ 20:21:05]#cat <<EOF | tee /etc/yum.repos.d/proxysql.repo &g

mysq通过ProxySQL实现读写分离

mysq通过ProxySQL实现读写分离 常见的读写分离应用 Oracle:mysql-proxy qihoo:Atlas 美团:dbproxy 网易:cetus amoeba 阿里巴巴:cobar 基于amoeba研发 Mycat:基于cobar实现 ProxySQL ProxySQL:MySQL中间件 版本: 官方版 percona版:percona公司基于官方版本用C++语言开发,性能更优 特点:具有中间件所需的绝大多数功能,包括: 多种方式的读/写分离 定制基于用户.基于schema.基