ad_monitor_util.py 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. # -*- coding: utf-8 -*-
  2. import argparse
  3. import json
  4. import pytz
  5. import requests
  6. from datetime import datetime
  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 seconds_convert(seconds):
  45. hours = seconds // 3600
  46. minutes = (seconds % 3600) // 60
  47. seconds = seconds % 60
  48. return f"{hours}小时 {minutes}分钟 {seconds}秒"
  49. def _monitor(level, msg: str, start, elapsed, top10):
  50. """消息推送"""
  51. """消息推送"""
  52. now = datetime.now()
  53. if now.hour < 6:
  54. print(f"凌晨六点之前不发送通知, 当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}")
  55. return
  56. msg = msg.replace("\\n", "\n").replace("\\t", "\t")
  57. mgs_text = f"- 当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}" \
  58. f"\n- 任务开始时间: {timestamp_format(start)}" \
  59. f"\n- 任务状态: {level_task_status_map[level]}" \
  60. f"\n- 任务耗时: {seconds_convert(elapsed)}" \
  61. f"\n- 任务描述: {msg}"
  62. card_json = {
  63. "schema": "2.0",
  64. "header": {
  65. "title": {
  66. "tag": "plain_text",
  67. "content": level_header_title_content_map[level]
  68. },
  69. "template": level_header_template_map[level]
  70. },
  71. "body": {
  72. "elements": [
  73. {
  74. "tag": "markdown",
  75. "content": mgs_text,
  76. "text_align": "left",
  77. "text_size": "normal",
  78. "element_id": "overview"
  79. }
  80. ]
  81. }
  82. }
  83. if top10 is not None and len(top10) > 0:
  84. collapsible_panel = {
  85. "tag": "collapsible_panel",
  86. "header": {
  87. "title": {
  88. "tag": "markdown",
  89. "content": "**Top10差异详情**"
  90. },
  91. "vertical_align": "center",
  92. "padding": "4px 0px 4px 8px"
  93. },
  94. "border": {
  95. "color": "grey",
  96. "corner_radius": "5px"
  97. },
  98. "element_id": "detail",
  99. "elements": [
  100. {
  101. "tag": "markdown",
  102. "content": top10.replace("\\n", "\n").replace("\\t", "\t"),
  103. "element_id": "Top10CID"
  104. }
  105. ]
  106. }
  107. card_json['body']['elements'].append(collapsible_panel)
  108. send_card_msg_to_feishu(
  109. webhook=server_robot.get('webhook'),
  110. card_json=card_json
  111. )
  112. if __name__ == '__main__':
  113. parser = argparse.ArgumentParser(description='告警Utils')
  114. parser.add_argument('--level', type=str, help='通知级别, info, warn, error', required=True)
  115. parser.add_argument('--msg', type=str, help='消息', required=True)
  116. parser.add_argument('--start', type=str, help='任务开始时间', required=True)
  117. parser.add_argument('--elapsed', type=int, help='任务耗时【秒】', required=True)
  118. parser.add_argument("--top10", type=str, help='Top10打分详情', required=False)
  119. args = parser.parse_args()
  120. _monitor(
  121. level=args.level,
  122. msg=args.msg,
  123. start=args.start,
  124. elapsed=args.elapsed,
  125. top10=args.top10
  126. )