# -*- coding: utf-8 -*- import argparse import json import pytz import requests from datetime import datetime server_robot = { 'webhook': 'https://open.feishu.cn/open-apis/bot/v2/hook/926982f5-e7af-40f5-81fd-27d8f42718e4', } level_header_template_map = { "info": "turquoise", "error": "red", "warn": "yellow" } level_header_title_content_map = { "info": "广告模型自动更新通知", "error": "广告模型自动更新告警", "warn": "广告模型自动更新告警" } level_task_status_map = { "info": "任务执行成功", "error": "任务执行失败", "warn": "任务执行失败", } def send_card_msg_to_feishu(webhook, card_json): """发送消息到飞书""" headers = {'Content-Type': 'application/json'} payload_message = { "msg_type": "interactive", "card": card_json } print(f"推送飞书消息内容: {json.dumps(payload_message)}") # response = requests.request('POST', url=webhook, headers=headers, data=json.dumps(payload_message)) # print(response.text) def timestamp_format(timestamp: str) -> str: try: return (datetime.utcfromtimestamp(int(timestamp)) .replace(tzinfo=pytz.UTC) .astimezone(pytz.timezone('Asia/Shanghai')) .strftime('%Y-%m-%d %H:%M:%S') ) except ValueError as e: return timestamp def seconds_convert(seconds): hours = seconds // 3600 minutes = (seconds % 3600) // 60 seconds = seconds % 60 return f"{hours}小时 {minutes}分钟 {seconds}秒" def _monitor(level, msg: str, start, elapsed, top10): """消息推送""" """消息推送""" now = datetime.now() if now.hour < 6: print(f"凌晨六点之前不发送通知, 当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}") return msg = msg.replace("\\n", "\n").replace("\\t", "\t") mgs_text = f"- 当前时间: {now.strftime('%Y-%m-%d %H:%M:%S')}" \ f"\n- 任务开始时间: {timestamp_format(start)}" \ f"\n- 任务状态: {level_task_status_map[level]}" \ f"\n- 任务耗时: {seconds_convert(elapsed)}" \ f"\n- 任务描述: {msg}" card_json = { "schema": "2.0", "header": { "title": { "tag": "plain_text", "content": level_header_title_content_map[level] }, "template": level_header_template_map[level] }, "body": { "elements": [ { "tag": "markdown", "content": mgs_text, "text_align": "left", "text_size": "normal", "element_id": "overview" } ] } } if top10 is not None and len(top10) > 0: collapsible_panel = { "tag": "collapsible_panel", "header": { "title": { "tag": "markdown", "content": "**Top10差异详情**" }, "vertical_align": "center", "padding": "4px 0px 4px 8px" }, "border": { "color": "grey", "corner_radius": "5px" }, "element_id": "detail", "elements": [ { "tag": "markdown", "content": top10.replace("\\n", "\n").replace("\\t", "\t"), "element_id": "Top10CID" } ] } card_json['body']['elements'].append(collapsible_panel) send_card_msg_to_feishu( webhook=server_robot.get('webhook'), card_json=card_json ) if __name__ == '__main__': parser = argparse.ArgumentParser(description='告警Utils') parser.add_argument('--level', type=str, help='通知级别, info, warn, error', required=True) parser.add_argument('--msg', type=str, help='消息', required=True) parser.add_argument('--start', type=str, help='任务开始时间', required=True) parser.add_argument('--elapsed', type=int, help='任务耗时【秒】', required=True) parser.add_argument("--top10", type=str, help='Top10打分详情', required=False) args = parser.parse_args() _monitor( level=args.level, msg=args.msg, start=args.start, elapsed=args.elapsed, top10=args.top10 )