Python發(fā)送xml格式socket心跳告警

python發(fā)送xml格式socket心跳告警

需求

  • 1役衡、行內,應用程序發(fā)送心跳,發(fā)送xml到socker.
  • 2呢燥、通過ps獲取程序是否存在,判斷是否發(fā)送心跳.
  • 3冒萄、使用xml.etree.ElementTree來格式化xml格式

實現

  • 1充易、使用socket link來創(chuàng)建socket鏈接
  • 2菇民、使用xml.etree.ElementTree來格式化xml格式
  • 3禁筏、根據需要監(jiān)控process_name_list 列表來循環(huán) 判斷是否發(fā)送心跳
  • 4持钉、根據發(fā)送socket返回信息判斷是否發(fā)送socket是否成功
  • 5、記錄日志信息

代碼

#!/usr/bin/python3

"""
需求:
  1篱昔、行內,應用程序發(fā)送心跳,發(fā)送xml到socker.
  2每强、通過ps獲取程序是否存在,判斷是否發(fā)送心跳.
"""

import xml.etree.ElementTree as ET
import socket,os,time,logging
from logging.handlers import RotatingFileHandler

def build_xml_message(heartbeat_interval, name, SystemName, AlarmRes):
  local_time1 = int(round(time.time() * 1000))
  local_time2 = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())

  root = ET.Element("ALARMSTART")
  name_element = ET.SubElement(root, "SystemName")
  name_element.text = SystemName
  age_element = ET.SubElement(root, "AlarmID")
  age_element.text = str(local_time1)
  city_element = ET.SubElement(root, "AlarmEquipment")
  city_element.text = name
  city_element = ET.SubElement(root, "AlarmRes")
  city_element.text = AlarmRes
  city_element = ET.SubElement(root, "EventTime")
  city_element.text = local_time2
  return ET.tostring(root, encoding="utf-8", method="xml").decode("utf-8")

def send_heartbeat(xml_message, server_address):
  sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  sock.settimeout(10)
  try:
      # print(xml_message.encode("utf-8"))
      sock.connect(server_address)
      sock.sendall(xml_message.encode("utf-8"))
      response = sock.recv(1024)
      local_time = time.strftime("%Y-%m-%d %H:%M:%S", time.localtime())
      if "flag=true" in str(response):
        log_info = str(local_time) + " info send info ok ,return info: " +  str(response)
        logger.debug(log_info)
        # write_data_to_file_append(log_file_path, log_info)
      else:
        log_info = str(local_time) + " error send info fail ,return info: " +  str(response)
        logger.debug(log_info)
        #write_data_to_file_app/end(log_file_path, log_info)
  except Exception as e:
      logger.error("Failed to send heartbeat to " + str(server_address) +  " "  + str(e))
  finally:
      sock.close()

def write_data_to_file_append(file_path, data):
   with open(file_path, "a") as f:
       f.write(data)

def is_process_running(ps_out,process_name):
   # 遍歷所有進程,查找具有給定名稱的進程
   for line in ps_out.splitlines():
       if process_name in line:
           return True
   return False


if __name__ == "__main__":
  #需要鏈接soket 服務端
  server_address = ("localhost", 10000)
#   log_file_path = "send_socket.log"
  heartbeat_interval = 5
  #需要監(jiān)控的程序名
  process_name_list = ["nginx","mysqld","cdesk_nginx1"]
  #xml名稱定義
  SystemName = "ccc-test-001"
  AlarmRes = "定制接口服務器"

  ##### logger #####
  log_file = "./log/heratbeat.log"
  shell = "mkdir -p " + log_file.split("heratbeat.log")[0]
  os.popen(shell)

  # 創(chuàng)建日志記錄器
  logger = logging.getLogger("my_logger")
  logger.setLevel(logging.DEBUG)

  # 創(chuàng)建RotatingFileHandler對象
  max_log_size = 100 * 1024 * 1024  # 100 MB
  backup_count = 50
  handler = RotatingFileHandler(log_file, maxBytes=max_log_size, backupCount=backup_count)

  # 定義日志格式
  formatter = logging.Formatter("%(asctime)s %(thread)d %(filename)s:%(lineno)d %(levelname)s %(message)s")
  handler.setFormatter(formatter)

  # 將處理程序添加到日志記錄器
  logger.addHandler(handler)

  while True:
      #使用os.popen執(zhí)行ps命令州刽,獲取所有進程
      ps_output = os.popen("ps aux").read()
      # ps_output = os.popen("ps -e").read()
      for process_name in process_name_list:
        if is_process_running(ps_output,process_name):
          xml_message = build_xml_message(heartbeat_interval, process_name, SystemName, AlarmRes)
          print(xml_message)
          logger.debug(process_name + " is running.")
          send_heartbeat(xml_message, server_address)
        else:
          logger.error(process_name + " is not running.")
      time.sleep(heartbeat_interval)
  # 程序結束時關閉處理程序
  logger.removeHandler(handler)
  handler.close()

解決運行情況

  • 心跳監(jiān)控運行狀態(tài)
2023-09-19 10:32:49,369 140176451651392 heratbeat.py:103 DEBUG nginx is running.
2023-09-19 10:32:49,370 140176451651392 heratbeat.py:45 DEBUG 2023-09-19 10:32:49 error send info fail ,return info: b'<ALARMSTART><SystemName>ccc-test-001</SystemName><AlarmID>1695090769369</AlarmID><AlarmEquipment>nginx</AlarmEquipment><AlarmRes>\xe5\xae\x9a\xe5\x88\xb6\xe6\x8e\xa5\xe5\x8f\xa3\xe6\x9c\x8d\xe5\x8a\xa1\xe5\x99\xa8</AlarmRes><EventTime>2023-09-19 10:32:49</EventTime></ALARMSTART>'
2023-09-19 10:32:49,370 140176451651392 heratbeat.py:103 DEBUG mysqld is running.
2023-09-19 10:32:49,371 140176451651392 heratbeat.py:45 DEBUG 2023-09-19 10:32:49 error send info fail ,return info: b'<ALARMSTART><SystemName>ccc-test-001</SystemName><AlarmID>1695090769370</AlarmID><AlarmEquipment>mysqld</AlarmEquipment><AlarmRes>\xe5\xae\x9a\xe5\x88\xb6\xe6\x8e\xa5\xe5\x8f\xa3\xe6\x9c\x8d\xe5\x8a\xa1\xe5\x99\xa8</AlarmRes><EventTime>2023-09-19 10:32:49</EventTime></ALARMSTART>'
2023-09-19 10:32:49,371 140176451651392 heratbeat.py:106 ERROR cdesk_nginx1 is not running.

  • socket 接收消息
[devops@my-dev ABC]$ ./sock.py 
服務器已啟動空执,等待客戶端連接...
客戶端 ('127.0.0.1', 41400) 已連接
收到來自 ('127.0.0.1', 41400) 的數據: <ALARMSTART><SystemName>ccc-test-001</SystemName><AlarmID>1695090684048</AlarmID><AlarmEquipment>nginx</AlarmEquipment><AlarmRes>定制接口服務器</AlarmRes><EventTime>2023-09-19 10:31:24</EventTime></ALARMSTART>
客戶端 ('127.0.0.1', 41402) 已連接
收到來自 ('127.0.0.1', 41402) 的數據: <ALARMSTART><SystemName>ccc-test-001</SystemName><AlarmID>1695090684049</AlarmID><AlarmEquipment>mysqld</AlarmEquipment><AlarmRes>定制接口服務器</AlarmRes><EventTime>2023-09-19 10:31:24</EventTime></ALARMSTART>
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市穗椅,隨后出現的幾起案子辨绊,更是在濱河造成了極大的恐慌,老刑警劉巖匹表,帶你破解...
    沈念sama閱讀 219,427評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件门坷,死亡現場離奇詭異宣鄙,居然都是意外死亡,警方通過查閱死者的電腦和手機默蚌,發(fā)現死者居然都...
    沈念sama閱讀 93,551評論 3 395
  • 文/潘曉璐 我一進店門框冀,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人敏簿,你說我怎么就攤上這事明也。” “怎么了惯裕?”我有些...
    開封第一講書人閱讀 165,747評論 0 356
  • 文/不壞的土叔 我叫張陵温数,是天一觀的道長。 經常有香客問我蜻势,道長撑刺,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,939評論 1 295
  • 正文 為了忘掉前任握玛,我火速辦了婚禮够傍,結果婚禮上,老公的妹妹穿的比我還像新娘挠铲。我一直安慰自己冕屯,他們只是感情好,可當我...
    茶點故事閱讀 67,955評論 6 392
  • 文/花漫 我一把揭開白布拂苹。 她就那樣靜靜地躺著安聘,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瓢棒。 梳的紋絲不亂的頭發(fā)上浴韭,一...
    開封第一講書人閱讀 51,737評論 1 305
  • 那天,我揣著相機與錄音脯宿,去河邊找鬼念颈。 笑死,一個胖子當著我的面吹牛连霉,可吹牛的內容都是我干的榴芳。 我是一名探鬼主播,決...
    沈念sama閱讀 40,448評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼窘面,長吁一口氣:“原來是場噩夢啊……” “哼翠语!你這毒婦竟也來了叽躯?” 一聲冷哼從身側響起财边,我...
    開封第一講書人閱讀 39,352評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎点骑,沒想到半個月后酣难,有當地人在樹林里發(fā)現了一具尸體谍夭,經...
    沈念sama閱讀 45,834評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,992評論 3 338
  • 正文 我和宋清朗相戀三年憨募,在試婚紗的時候發(fā)現自己被綠了紧索。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,133評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡菜谣,死狀恐怖珠漂,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情尾膊,我是刑警寧澤媳危,帶...
    沈念sama閱讀 35,815評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站冈敛,受9級特大地震影響待笑,放射性物質發(fā)生泄漏。R本人自食惡果不足惜抓谴,卻給世界環(huán)境...
    茶點故事閱讀 41,477評論 3 331
  • 文/蒙蒙 一暮蹂、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧癌压,春花似錦仰泻、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,022評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至丐吓,卻和暖如春浅悉,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背券犁。 一陣腳步聲響...
    開封第一講書人閱讀 33,147評論 1 272
  • 我被黑心中介騙來泰國打工术健, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人粘衬。 一個月前我還...
    沈念sama閱讀 48,398評論 3 373
  • 正文 我出身青樓荞估,卻偏偏與公主長得像,于是被迫代替她去往敵國和親稚新。 傳聞我的和親對象是個殘疾皇子勘伺,可洞房花燭夜當晚...
    茶點故事閱讀 45,077評論 2 355

推薦閱讀更多精彩內容