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 ...
随机推荐
- CF825F - String Compression
题意:压缩字符串,把字符串分成若干个子串,每个子串可以被压缩成"循环次数 \(+\) 循环节"的形式,求最小长度. dp 求 lcp 先 \(O(n^2)\) dp 求出所有后缀对 ...
- gdbOF阅读笔记
前言 今天阅读了一本说明书,<gdbOF: A Debugging Tool for OpenFOAM> 受himryangzz视频启发去读相关内容,在此对himryangzz表示感谢 希 ...
- linux上安装python3(yum方式)
可联通外网的linux系统终端上安装python3 1,建立yum仓库: https://mirrors.163.com/centos/7.9.2009/os/x86_64/ 2,使用yum下载安装对 ...
- 【最新最新】mac pro 安装扩展imagick 最新总结
近期在mac上做相关开发,关于验证码图片如果没装imagick扩展会报 GD with FreeType or ImageMagick PHP extensions are required.等错误 ...
- Ubuntu离线安装 MySQL 5.7
来源:https://www.ngui.cc/article/show-581968.html?action=onClick 一.所需环境 操作系统:Ubuntu 20.04数据库:MySQL 5.7 ...
- .net core 3.1 上传大文件报错413 Payload Too Large
IIS配置如下 https://www.cnblogs.com/hallejuayahaha/p/12884347.html 代码里面新增 services.Configure<FormOpti ...
- @NotNull,@NotBlank,@NotEmpty注解的区别
开发中常看见@NotNull,@NotBlank,@NotEmpty三个注解,但却没有深入了解过,下面介绍一下他们的应用场景和区别 @NotNull:主要用在基本数据类型上(Int,Integer,D ...
- java字段值为null,不返回该字段
jackSon注解– @JsonInclude 注解不返回null值字段 @Data @JsonInclude(JsonInclude.Include.NON_NULL) public class R ...
- LP1-5:接口测试方法
- 02_IntelliJ IDEA常用快捷键
[常见快捷键] Ctrl+Shift + Enter 语句完成 "!" 否定完成 输入表达式时按 "!"键 Ctrl+E 最近的文件 Ctrl+Shif ...