windows下的故障自愈程序,可以实现进程,kafka按时间段判断状态,日志分级
self-healing
1.使用python3.11写的一个故障自愈程序。 2.本程序在window2019 server运行测试通过 3.通过监控java程序里的详细启动包名来判断进程是否存在 4.判断kafka相应topic里有没有写入数据,因为性能原因采用的是最新偏移量求和。来判断是否有数据写入。 5.根据指定的时间段内进行单独进程判断或kafka写入数据判断 6.日志打印分二级INFO与ERROR,方便调试与日志监控报警 7.程序内置钉钉报警
安装注意事项: 1.安装时要注意pip install kafka 然后是pip install kafka-python, 2.其它按提示安装及可。
# -*- coding:utf-8 -*-
import subprocess
import time
import psutil
import os
import sys
import datetime
from loguru import logger
from datetime import datetime, timedelta,date
from kafka import KafkaConsumer, TopicPartition
import hmac
import hashlib
import base64
import urllib.parse
import requests
import json
# 定义进程名
process_name = 'java.exe'
#定义初始化偏移量
total_offset_old = 0
# 配置Kafka消费者
KAFKA_SERVER = ['*.*.*.*:9092']
KAFKA_TOPIC = '***'
KAFKA_GROUP_ID = '**'
KAFKA_AUTO_OFFSET_RESET = 'latest'
# 初始化时间戳和阈值
last_msg_time = datetime.now()
threshold = timedelta(minutes=5)
# 钉钉机器人的访问令牌和加签密钥
url = "https://oapi.dingtalk.com/robot/send?access_token=2bb6bc4aed306d05a38b37ef8f6a7f2302*********************"
secret = "SEC842743b3be8ea14bbbee9e3586cbd790ae2b4ef724e093e*****************"
# 发送钉钉消息的函数
def send_alert(message):
# 获取当前时间戳(单位:毫秒)
timestamp = str(round(time.time() * 1000))
# 将时间戳和加签密钥拼接成字符串
string_to_sign = f"{timestamp}\n{secret}"
# 使用HMAC-SHA256算法对字符串进行加密,并将结果转换为Base64编码的字符串
sign = base64.b64encode(hmac.new(secret.encode(), string_to_sign.encode(), hashlib.sha256).digest()).decode()
# 在请求参数中添加时间戳和加签信息
url_with_sign = f"{url}×tamp={timestamp}&sign={urllib.parse.quote(sign)}"
# 获取当前日期字符串
date_str = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
# 在消息内容中添加时间戳
message_with_timestamp = f"{date_str}发生:{message}"
# 钉钉消息内容
data = {
"msgtype": "text",
"text": {
"content": message_with_timestamp
}
}
# 发送POST请求
response = requests.post(url_with_sign, headers={"Content-Type": "application/json"}, data=json.dumps(data))
# 输出响应结果
print(response.json())
# 检查进程是否存在
def check_process(process_name):
#获取进程详细信息
ret = subprocess.getoutput('wmic.exe process where name="java.exe" get commandline 2>nul|findstr "realtime_streaming.jar" 1>nul 2>nul && echo 1||echo 0')
#如果有返回信息,进程存在,否则进程不存在。
if ret == "1":
print(f"process {process_name} true!\n")
return True
print(f"process {process_name} false!\n")
logger.info(f'check process def !')
return False
#判断当前时间是不是在执行时间区间内
def check_time():
now_time = datetime.now().strftime('%H:%M:%S')
dayofweek = datetime.now().weekday()
print(now_time)
print(dayofweek)
if dayofweek == 5:
print(f'false 6{dayofweek}')
logger.error(f'check time false {dayofweek}')
return False
elif dayofweek == 4 and "18:00:00" < now_time and now_time < "24:59:59":
logger.error(f'check time false {dayofweek} {now_time}')
print(f'false 5 {dayofweek} {now_time}')
return False
elif dayofweek == 6 and "00:00:00" < now_time and now_time < "17:00:00":
logger.error(f'check time false {dayofweek} {now_time}')
print(f'false 7{dayofweek} {now_time}')
return False
elif "18:00:00" < now_time < "24:59:59" or "00:00:00" < now_time < "17:00:00":
logger.info(f'check time true {dayofweek} {now_time}')
print(f'starttime1 ok {dayofweek} {now_time}')
return True
else:
print(f'false {dayofweek} {now_time}')
logger.error(f'check time false {dayofweek} {now_time}')
return False
# 定义监控Kafka消费队列的函数
def check_kafka():
consumer = KafkaConsumer(bootstrap_servers=KAFKA_SERVER,group_id=KAFKA_GROUP_ID,api_version=(0,10,2))
# 获取指定 topic 的所有分区
partitions = consumer.partitions_for_topic(KAFKA_TOPIC)
total_offset_new = 0
global total_offset_old
for partition in partitions:
# 获取当前分区的最新偏移量
tp = TopicPartition(KAFKA_TOPIC,partition)
latest_offset = consumer.end_offsets([tp])[tp]
total_offset_new += latest_offset
print(latest_offset)
print(tp)
print(total_offset_new)
logger.info(f'{latest_offset}{tp}{total_offset_new}')
# 判断最新偏移量是否与上一次相等
if total_offset_new == total_offset_old:
print(f'Kafka not alive on partition {total_offset_new}!')
logger.info(f'Kafka not alive on partition {total_offset_new}!')
return False
else:
print(f'Kafka alive on partition {total_offset_old}. Latest offset: {total_offset_new}')
logger.info(f'Kafka alive on partition {total_offset_old}. Latest offset: {total_offset_new}')
total_offset_old = total_offset_new
return True
# 主程序
if __name__ == "__main__":
logger.add('mod3_info.log',format="{time} | {level} | {message}",level="INFO")
logger.add('mod3_error.log',format="{time} | {level} | {message}",level="ERROR")
while True:
# 检查进程和Kafka消费队列是否正常
process_ok = check_process(process_name)
kafka_ok = check_kafka()
logger.info(f'check process and kafka !')
#如果在执行时间区内,进程与kafka全部判断,否则只判断进程
time_ok = check_time()
if time_ok:
# 如果进程或Kafka消费队列出现故障,执行自愈操作
if not process_ok or not kafka_ok:
# 判断进程是否存在,存在杀死进程
if process_ok:
cmd = f"taskkill /F /IM {process_name}"
subprocess.Popen(cmd, shell=True)
logger.info(f'kill process')
# 重启进程
subprocess.Popen(f"java -classpath E:/soft/kafka-clients-3.1.0.jar;E:/soft/realtime_streaming.jar;E:/soft/mysql-connector-java-8.0.26.jar com.jewelake.streaming.realtime.IQFeedToKafka")
logger.info(f'open process')
time.sleep(10)
# 发送警报通知管理员
send_alert("iqfeed reload")
logger.info(f'send_alert')
# 休眠10秒钟后再次检查进程和Kafka消费队列
logger.info(f'sleep 10s')
else:
if not process_ok:
# 重启进程
subprocess.Popen(f"java -classpath E:/soft/kafka-clients-3.1.0.jar;E:/soft/realtime_streaming.jar;E:/soft/mysql-connector-java-8.0.26.jar com.jewelake.streaming.realtime.IQFeedToKafka")
logger.info(f'open process')
time.sleep(10)
# 发送警报通知管理员
send_alert("iqfeed reload")
logger.info(f'send_alert')
# 休眠10秒钟后再次检查进程和Kafka消费队列
logger.info(f'sleep 10s')
time.sleep(10)
详细源码可以到https://github.com/net2817/self-healing
windows下的故障自愈程序,可以实现进程,kafka按时间段判断状态,日志分级的更多相关文章
- windows下调用外部exe程序 SHELLEXECUTEINFO
本文主要介绍两种在windows下调用外部exe程序的方法: 1.使用SHELLEXECUTEINFO 和 ShellExecuteEx SHELLEXECUTEINFO 结构体的定义如下: type ...
- [转]Linux/Windows下脚本对拍程序
[新]简单写法 (转载自:https://blog.csdn.net/ylsoi/article/details/79824655) 要求:文件输入输出,且输入输出文件需要对应 Linux: #inc ...
- 关于在windows下部署发布QT程序的总结
原文请看:http://www.cnblogs.com/javaexam2/archive/2011/05/18/2632916.html 关于在windows下部署发布QT程序的总结 2008-06 ...
- [b0007] windows 下 eclipse 开发 hdfs程序样例
目的: 学习使用hdfs 的java命令操作 相关: 进化: [b0010] windows 下 eclipse 开发 hdfs程序样例 (二) [b0011] windows 下 eclipse 开 ...
- [b0011] windows 下 eclipse 开发 hdfs程序样例 (三)
目的: 学习windows 开发hadoop程序的配置. [b0007] windows 下 eclipse 开发 hdfs程序样例 太麻烦 [b0010] windows 下 eclipse 开发 ...
- [b0010] windows 下 eclipse 开发 hdfs程序样例 (二)
目的: 学习windows 开发hadoop程序的配置 相关: [b0007] windows 下 eclipse 开发 hdfs程序样例 环境: 基于以下环境配置好后. [b0008] Window ...
- 让 windows 下的命令行程序 cmd.exe 用起来更顺手
在 Windows 下使用 Larave 框架做开发,从 Composer 到 artisan 总是避免不了和 cmd.exe 打交道,系统默认的命令行界面却是不怎么好看,且每行显示的字符数是做了限制 ...
- Windows下Eclipse提交MR程序到HadoopCluster
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 欢迎转载,转载请注明出处. 以前Eclipse上写好的MapReduce项目经常是打好包上传到Hadoop测试集 ...
- windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码
我的一个java程序偶尔会出现cpu占用很高的情况 一直不知道什么原因 今天终于抽时间解决了 系统是win2003 jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线 ...
- Windows下Memcached在.Net程序中的实际运用(从Memcached客户端Enyim的库的编译到实际项目运用)
1.一点基础概念 2.获取EnyimMemcached客户端的源代码并编译出动态库 3.Memcached的服务器安装(windows server) 4.在web项目中实战 一.基础概念 memca ...
随机推荐
- KMP字符串 AcWing 831
题目:https://www.acwing.com/problem/content/833/ 题意:求子串在母串中每次出现时的下标位置. 题解:哈哈哈,敲题时想到之前看到一个人叫 kmp 算法为 看毛 ...
- [EULAR文摘] TNFi治疗3年对384例强柱患者脊柱放射学进展的影响
TNF拮抗剂治疗3年对384例强直性脊柱炎患者脊柱放射学进展的影响 Maksymowych WP, et al. EULAR 2015. Present ID: OP0144. 背景: 既往开放标签的 ...
- computed与watch的区别
1.computed表示的是计算属性,watch指的是监听属性,监听的值变化时执行回调函数 2.computed会使用缓存,而watch不使用缓存,每次监听都执行回调 3.computed需要retu ...
- js中各种事件监听
html.push('<input type="button" id="autocount_' + sysTime + '" class="la ...
- 开始学python不知该怎么学?Python基础教程(第2版) 免费下载
Python基础教程(第2版)pdf高清版免费下载 解压码:n0nl 内容简介 · · · · · · 本书是经典教程的全新改版,作者根据Python 3.0版本的种种变化,全面改写了书中内容 ...
- element+Vue el-form组件进行查询时,当输入框仅有一项时,回车自动提交表单,浏览器会刷新页面
vue的写法就是el-form上添加阻止默认事件 @submit.native.prevent <el-form ref="queryForm" label-width=&q ...
- Neo4j删除节点和关系、彻底删除节点标签名(转载备忘)
https://www.jianshu.com/p/59bd829de0de 总结提前: [1]先删关系,再删节点 [2]当记不得关系名时,type(r)可以查到关系名 [3]彻底删除节点标签名,需要 ...
- Mac下MySQL下载及安装
1在浏览器当中输入地址: https://downloads.mysql.com/archives/community/ 1. 1.1,选择mysql版本,它会自动对应某个版本macOS,1.2 ...
- allure+testng遇到的一些问题
java+testng+allure 听说allure报告,"很好看",决定引入. 首先看allure官网,需要在pom.xml中引入包 文档:https://docs.qamet ...
- 解决linux conda 命令行环境提示消失的方法
之前不知道这么搞的,一不小心改了conda的默认设置,后面再登录的时候发现环境名字看不见了,用着很难受,为了解决这个问题,后面发现,应该是我改了changeps1这个设置,他默认是开着的,可以用下面的 ...