t.py 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. # -*- coding: utf-8 -*-
  2. import argparse
  3. import json
  4. from datetime import datetime
  5. import pytz
  6. import requests
  7. server_robot = {
  8. 'webhook': 'https://open.feishu.cn/open-apis/bot/v2/hook/926982f5-e7af-40f5-81fd-27d8f42718e4',
  9. }
  10. level_header_template_map = {
  11. "info": "turquoise",
  12. "error": "red",
  13. "warn": "yellow"
  14. }
  15. level_header_title_content_map = {
  16. "info": "广告模型自动更新通知",
  17. "error": "广告模型自动更新告警",
  18. "warn": "广告模型自动更新告警"
  19. }
  20. level_task_status_map = {
  21. "info": "任务执行成功",
  22. "error": "任务执行失败",
  23. "warn": "任务执行失败",
  24. }
  25. def send_card_msg_to_feishu(webhook, card_json):
  26. """发送消息到飞书"""
  27. headers = {'Content-Type': 'application/json'}
  28. payload_message = {
  29. "msg_type": "interactive",
  30. "card": card_json
  31. }
  32. print(f"推送飞书消息内容: {json.dumps(payload_message)}")
  33. response = requests.request('POST', url=webhook, headers=headers, data=json.dumps(payload_message))
  34. print(response.text)
  35. def timestamp_format(timestamp: str) -> str:
  36. try:
  37. return (datetime.utcfromtimestamp(int(timestamp))
  38. .replace(tzinfo=pytz.UTC)
  39. .astimezone(pytz.timezone('Asia/Shanghai'))
  40. .strftime('%Y-%m-%d %H:%M:%S')
  41. )
  42. except ValueError as e:
  43. return timestamp
  44. def train_info_parse(train_info_file: str) -> dict:
  45. train_info = {}
  46. with open(train_info_file, 'r') as f:
  47. for line in f:
  48. split = line.split(":")
  49. if len(split) == 2:
  50. key = split[0].strip()
  51. value = split[1].strip()
  52. train_info[key] = value
  53. return train_info
  54. def seconds_convert(seconds):
  55. hours = seconds // 3600
  56. minutes = (seconds % 3600) // 60
  57. seconds = seconds % 60
  58. return f"{hours}小时 {minutes}分钟 {seconds}秒"
  59. def join_end_time(msg_text: str, train_info: dict) -> str:
  60. if "结束时间" in train_info:
  61. msg_text = f"{msg_text}" \
  62. f"\n- 结束时间: {timestamp_format(train_info['结束时间'])}"
  63. return msg_text
  64. def join_start_time(msg_text: str, train_info: dict) -> str:
  65. if "开始时间" in train_info:
  66. msg_text = f"{msg_text}" \
  67. f"\n- 开始时间: {timestamp_format(train_info['开始时间'])}"
  68. return msg_text
  69. def join_running_time(msg_text: str, train_info: dict) -> str:
  70. return msg_text
  71. def _monitor(model_train_info: str):
  72. """消息推送"""
  73. msg_text = f"- 当前时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S')}"
  74. train_info = train_info_parse(model_train_info)
  75. start = train_info['开始时间']
  76. result = train_info['广告模型自动更新任务结果']
  77. level = "error" if result == '失败' else "info"
  78. card_json = {
  79. "schema": "2.0",
  80. "header": {
  81. "title": {
  82. "tag": "plain_text",
  83. "content": level_header_title_content_map[level]
  84. },
  85. "template": level_header_template_map[level]
  86. },
  87. "body": {
  88. "elements": [
  89. {
  90. "tag": "markdown",
  91. "content": msg_text,
  92. "text_align": "left",
  93. "text_size": "normal",
  94. "element_id": "overview"
  95. }
  96. ]
  97. }
  98. }
  99. # if top10 is not None and len(top10) > 0:
  100. # collapsible_panel = {
  101. # "tag": "collapsible_panel",
  102. # "header": {
  103. # "title": {
  104. # "tag": "markdown",
  105. # "content": "**Top10差异详情**"
  106. # },
  107. # "vertical_align": "center",
  108. # "padding": "4px 0px 4px 8px"
  109. # },
  110. # "border": {
  111. # "color": "grey",
  112. # "corner_radius": "5px"
  113. # },
  114. # "element_id": "detail",
  115. # "elements": [
  116. # {
  117. # "tag": "markdown",
  118. # "content": top10.replace("\\n", "\n").replace("\\t", "\t"),
  119. # "element_id": "Top10CID"
  120. # }
  121. # ]
  122. # }
  123. # card_json['body']['elements'].append(collapsible_panel)
  124. send_card_msg_to_feishu(
  125. webhook=server_robot.get('webhook'),
  126. card_json=card_json
  127. )
  128. if __name__ == '__main__':
  129. parser = argparse.ArgumentParser(description='告警Utils')
  130. parser.add_argument("--tif", type=str, help='模型模型过程记录文件', required=True)
  131. args = parser.parse_args()
  132. _monitor(model_train_info=args.tif)