python脚本监控flink任务,失败后飞书通知

python脚本监控flink任务,失败后飞书通知

最终效果图示例:
在这里插入图片描述

直接上代码:

import requests
import json
import time
import subprocess
import urllib.parse
from datetime import datetime

# 定义 集群 的 URL
yarn_url = 'http://192.168.1.11:8088/cluster/apps'

# 发送 HTTP GET 请求并获取响应结果
response = requests.get(yarn_url)

# 解析响应结果中的 JSON 数据
data = response.json()

#计算时间戳
TIMESTAMP =int(datetime.now().timestamp()*1000)

#告警通道webhook
def webhook_alert(id,name,user,state,finishedTime):
    #飞书告警机器人地址
    url="https://open.feishu.cn/demo*"
    
    headers = {
        'Content-Type': 'application/json',
    }
    card ={
          "header": {
            "template": "red",
            "title": {
              "content": "Flink任务失败",
              "tag": "plain_text"
            }
          },
          "elements": [
            {
              "tag": "column_set",
              "flex_mode": "none",
              "background_style": "default",
              "columns": [
                {
                  "tag": "column",
                  "width": "weighted",
                  "weight": 1,
                  "vertical_align": "top",
                  "elements": [
                    {
                      "tag": "div",
                      "text": {
                        "content": "**集群名称:**\n>> 集群名称",
                        "tag": "lark_md"
                      }
                    }
                  ]
                },
                {
                  "tag": "column",
                  "width": "weighted",
                  "weight": 1,
                  "vertical_align": "top",
                  "elements": [
                    {
                      "tag": "markdown",
                      "content": "**任务名称:**\n>> "+name+""
                    }
                  ]
                }
              ]
            },
            {
              "tag": "column_set",
              "flex_mode": "none",
              "background_style": "default",
              "columns": [
                {
                  "tag": "column",
                  "width": "weighted",
                  "weight": 1,
                  "vertical_align": "top",
                  "elements": [
                    {
                      "tag": "markdown",
                      "content": "**用户名称:**\n>> "+user+""
                    }
                  ]
                },
                {
                  "tag": "column",
                  "width": "weighted",
                  "weight": 1,
                  "vertical_align": "top",
                  "elements": [
                    {
                      "tag": "markdown",
                      "content": "**任务ID:**\n>> "+id+""
                    }
                  ]
                }
              ]
            },
            {
              "tag": "column_set",
              "flex_mode": "none",
              "background_style": "default",
              "columns": [
                {
                  "tag": "column",
                  "width": "weighted",
                  "weight": 1,
                  "vertical_align": "top",
                  "elements": [
                    {
                      "tag": "markdown",
                      "content": "**任务失败时间:**\n>> "+str(finishedTime)
                    }
                  ]
                },
                {
                  "tag": "column",
                  "width": "weighted",
                  "weight": 1,
                  "vertical_align": "top",
                  "elements": [
                    {
                      "tag": "markdown",
                      "content": "**状  态:**\n>> "+state+""
                    }
                  ]
                }
              ]
            }
          ]
}
    body =json.dumps({"msg_type": "interactive","card":card})
    resp = requests.post(url=url, data=body, headers=headers)
    return resp

#告警通道飞书
def feishu_alert(receiver_list,channel,content):
    #url = "http://push.trasre.com"
    headers = {
        'Content-Type': 'application/json',
    }
    request_body = {"receiver_list": receiver_list, "channel": channel, "content": content}
    resp = requests.request("POST", url,  headers = headers,  data = json.dumps(request_body))
    return resp

# 遍历应用程序列表,输出每个正在运行的应用程序的状态、队列、进度等信息
def get_yarn_apps():
    yarn = []
    for app in data['apps']['app']:
        if app['state'] == 'FAILED' and app['name'] != 'Thrift JDBC/ODBC Server':
           for x in range(len(data)):
              yarn.append({
                'id' : app['id'],
                'name' : app['name'],
                'user' : app['user'],
                'state' : app['state'],
                'finishedTime' :  app['finishedTime']
                })
    return yarn

#添加阿里云平台arms监控,用于电话通知,此项可加可不加
def upload_to_arms(datas):
    url = "https://arms中的相关地址"
    headers = {'Content-Type': 'application/json'}
    
#    try:
    response = requests.post(url, headers=headers, json=datas)
#        
#        if response.ok:
#            print("数据上传成功")
#        else:
#            print("数据上传失败")
#        
#    except Exception as e:
#        print("数据上传出现异常:", str(e))


if __name__ == '__main__':
    date = get_yarn_apps()
    for row in date:
      diff=TIMESTAMP-row['finishedTime']
      #检查近2分钟的任务中是否有任务失败
      if diff < 120000:
        dt=datetime.fromtimestamp(row['finishedTime']/1000)
        webhook_alert(row['id'],row['name'],row['user'],row['state'],dt.strftime('%Y-%m-%d %H:%M:%S'))
        datas = {
          "id": row['id'],
          "name": row['name'],
          "user":row['user'],
          "state":row['state'],
          "finishedTime":dt.strftime('%Y-%m-%d %H:%M:%S'),
          "alertName":"集群名称-任务失败"
          }
  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
您好!对于监控 Flink 任务,可以使用 Prometheus 来收集和展示各种指标。下面是一些步骤: 1. 首先,确保已经安装和配置了 Prometheus。您可以在官方网站上找到相关的文档和指南。 2. 在 Flink 的配置文件中,启用 Prometheus 监控。找到 `flink-conf.yaml` 文件,并添加以下配置: ``` metrics.reporters: prom metrics.reporter.prom.class: org.apache.flink.metrics.prometheus.PrometheusReporter ``` 3. 在 Prometheus 的配置文件中,添加 Flink 的作业管理器(JobManager)和任务管理器(TaskManager)的地址。找到 `prometheus.yml` 文件,并添加以下配置: ``` scrape_configs: - job_name: 'flink' static_configs: - targets: ['<jobmanager-host>:<jobmanager-port>', '<taskmanager-host>:<taskmanager-port>'] ``` 请将 `<jobmanager-host>` 和 `<jobmanager-port>` 替换为您的 Flink JobManager 的主机和端口,将 `<taskmanager-host>` 和 `<taskmanager-port>` 替换为您的 Flink TaskManager 的主机和端口。 4. 重启 Prometheus 和 Flink,使配置生效。 5. 现在,您可以通过访问 Prometheus 的 Web 界面来查看 Flink监控指标。在浏览器中输入 `http://<prometheus-host>:<prometheus-port>`,将 `<prometheus-host>` 和 `<prometheus-port>` 替换为您的 Prometheus 主机和端口。 在 Prometheus 界面上,您可以选择和自定义要查看的指标,并进行图表展示和警报设置等操作。 希望这些步骤对您有帮助!如果有任何疑问,请随时提问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixin_49457994

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值