首页 > 其他分享 >laravel 后台或者api框架异常钉钉告警提醒

laravel 后台或者api框架异常钉钉告警提醒

时间:2023-11-01 10:37:51浏览次数:34  
标签:laravel ch monitorDing param response api 告警 config curl

中间件

Monitor
<?php

namespace App\Http\Middleware;

use Error;
use Closure;
use Exception;
use Illuminate\Http\Request;
use Illuminate\Contracts\Container\Container;
use Illuminate\Contracts\Debug\ExceptionHandler;
use Psy\Exception\ErrorException;
use Psy\Exception\FatalErrorException;

class Monitor
{
    /**
     * The App container
     *
     * @var Container
     */
    protected $container;

    /**
     * The Monitor Client
     *
     * @var
     */
    protected $monitor;

    /**
     * Create a new middleware instance.
     *
     * @param Container $container
     */
    public function __construct(Container $container)
    {
        $this->container = $container;
    }

    /**
     * Handle an incoming request.
     *
     * @param Request $request
     * @param Closure $next
     * @return mixed
     */
    public function handle($request, Closure $next)
    {
//        dump("monitorDing");
        $enabled = config('monitorDing.enabled');
        try {
            $response = $next($request);
        } catch (Exception $e) {
            $response = $this->handleException($request, $e);
            $enabled && $this->sendText(sprintf("文件:%s (%s 行) 内容:%s", $e->getFile(), $e->getLine(), $e->getMessage()));

        } catch (Error $error) {
            $e = new FatalErrorException($error);
            $response = $this->handleException($request, $e);
            $enabled && $this->sendText(sprintf("文件:%s (%s 行) 内容:%s", $e->getFile(), $e->getLine(), $e->getMessage()));
        } catch (ErrorException $error) {
            $e = new FatalErrorException($error);
            $response = $this->handleException($request, $e);
            $enabled && $this->sendText(sprintf("文件:%s (%s 行) 内容:%s", $e->getFile(), $e->getLine(), $e->getMessage()));
        } finally {
            if ($response->getStatusCode() == '500' && (isset($response->exception) && $response->exception && $response->exception !== null)) {
                $sysName = config('monitorDing.web_name');

                if (strpos($_SERVER['HTTP_HOST'], 'liexin') !== false) {
                    $sysName = '本地' . $sysName;
                } else {
                    $sysName = '外网' . $sysName;
                }

                $this->sendText(substr($sysName . ":" . $response->exception, 0,
                        500) . ',请求数据:' . json_encode($request->input()) . "---[更多详情请看日志]");
            }
        }
        return $response;
    }

    /**
     * Handle the given exception.
     *
     * (Copy from Illuminate\Routing\Pipeline by Taylor Otwell)
     *
     * @param $passable
     * @param Exception $e
     * @return mixed
     * @throws Exception
     */
    protected function handleException($passable, Exception $e)
    {
        if (!$this->container->bound(ExceptionHandler::class) || !$passable instanceof Request) {
            throw $e;
        }

        $handler = $this->container->make(ExceptionHandler::class);

        $handler->report($e);

        return $handler->render($passable, $e);
    }


    /**
     * 发送文本类型的消息
     *
     * @param $content string 消息内容
     * @param array $atMobiles 被@人的手机号
     * @param bool $isAtAll 是否 @ 所有人
     * @throws SendErrorException
     */
    public function sendText($content, $atMobiles = [], $isAtAll = false)
    {
        $params = [
            'msgtype' => 'text',
            'text' => [
                'content' => $content,
            ],
            'at' => [
                'atMobiles' => $atMobiles,
                'isAtAll' => $isAtAll
            ]
        ];
        $this->send($params);
    }

    /**
     * 发送
     * @param array $params 请求需要的参数
     * @throws SendErrorException
     */
    private function send($params = [])
    {
        if (!config('monitorDing.enabled')) {
            \Log::info('~~ Monitor Ding ~~');
            \Log::info($params);
        } else {
            $ch = curl_init();
            curl_setopt($ch, CURLOPT_URL, config("monitorDing.webhook"));
            curl_setopt($ch, CURLOPT_POST, 1);
            curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 5);
            curl_setopt($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json;charset=utf-8'));
            curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($params));
            curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
            if (config()) {
                curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
                curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
            }
            $data = json_decode(curl_exec($ch), true);
            curl_close($ch);

            if ($data['errcode']) {
//                throw new SendErrorException($data['errmsg']);
            }
        }

    }
}
App\Http\Kernel.php


protected $middleware = [
//............ 新增
    \App\Http\Middleware\Monitor::class
//...........
];

protected $routeMiddleware = [
    'monitor' => \App\Http\Middleware\Monitor::class,
];

配置文件

<?php
return [
    // 是否开启报错写入
    'enabled' => boolval(get_resource_config_section('app', 'pur')["monitorDing_enabled"]),

    // curl证书验证, 线下环境不用开启
    'curl_verify' => boolval(get_resource_config_section('app', 'pur')["monitorDing_curl_verify"]),

    'web_name'=>get_resource_config_section('app', 'pur')["monitorDing_web_name"],

    // webhook的值
    'webhook' => get_resource_config_section('app', 'pur')["monitorDing_webhook"],
];

 

最后新增钉钉机器人

laravel 后台或者api框架异常钉钉告警提醒_php

 

laravel 后台或者api框架异常钉钉告警提醒_json_02

 

laravel 后台或者api框架异常钉钉告警提醒_json_03

 

laravel 后台或者api框架异常钉钉告警提醒_App_04

 最后复制webhook即可

laravel 后台或者api框架异常钉钉告警提醒_App_05

 

laravel 后台或者api框架异常钉钉告警提醒_php_06

 

标签:laravel,ch,monitorDing,param,response,api,告警,config,curl
From: https://blog.51cto.com/u_12903656/8119435

相关文章

  • 如何建设企业级API网关​
    企业级API网关是现代软件架构中不可或缺的重要组成部分,它能够为整个系统提供安全可靠的入口,同时也是系统中不同业务模块之间交互的桥梁。API网关使得搭建一个新的应用服务变得简单、快捷、高效,同时,开发人员可以将更多的精力放在和业务紧密相关的工作中。企业级API网关主要作用包括......
  • fastapi搭建平台实战教程一:SQLAlchemy生成数据库数据
    除了falsk,SQLAlchemy也能很好的支持fastapi框架。首先创建一个main.pyfromfastapiimportFastAPIapp=FastAPI()@app.post("/register")defregister():[email protected]("/login")deflogin():...配置数据库创建db.py,初始化数据库连接对象fromsqlalche......
  • 问题记录 <VSCode Copilot 连接问题:Extension activation failed: "getaddrinfo EAI_A
    问题描述VSCode使用Copilot时遇到如下问题:Extensionactivationfailed:"getaddrinfoEAI_AGAINapi.github.com"解决方式笔者尝试了修改hosts、代理、重装插件等方法,但没有起效。下面的方法解决了问题(在VSCode中设置proxy)打开代理,查看代理http地址,复制;打开VSCode,打......
  • API管理神器:Apipost
    在数字化时代,API已成为企业和开发者实现数据互通、应用集成的重要桥梁。然而,随着API数量的不断增加,API设计、调试、文档和测试等工作也变得越来越复杂。为了解决这一痛点,一款名为Apipost的API协同研发工具应运而生,它为API开发者提供了一站式解决方案。成功案例许多知名的公司和团队......
  • API管理神器:Apipost
    在数字化时代,API已成为企业和开发者实现数据互通、应用集成的重要桥梁。然而,随着API数量的不断增加,API设计、调试、文档和测试等工作也变得越来越复杂。为了解决这一痛点,一款名为Apipost的API协同研发工具应运而生,它为API开发者提供了一站式解决方案。成功案例许多知名的公司和......
  • 安防视频监控平台EasyCVR(V.3.4)新功能:告警查询操作步骤
     视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中,将分散的各类视频资源进行统一汇聚、整合、集中管理,实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼宇、校园、仓储等场......
  • webapi 注解调试工具swaggo 介绍和使用
    swaggo介绍和使用介绍Swag是一个开源项目,用于web框架下接口调试和文档管理,可以将代码中的接口注释转换为文档格式,并提供界面在线调试接口的功能。项目地址:https://github.com/swaggo/swag目前项目可以支持的web框架gin,echo,buffalo,net/http,gorilla/mux,go-chi/chi,flamingo,fi......
  • kube-promethues配置钉钉告警
    kube-promethues配置钉钉告警前置:k8s部署kube-promethues一.配置钉钉机器人打开钉钉的智能群助手,点击添加机器人选择自定义机器人勾选加签,复制后保存复制webhook地址后点击保存二.编写dingtalk的yaml部署文件vidingtalk.yamlapiVersion:v1kind:Ser......
  • 好用的API调试工具推荐:Apipost
    随着数字化转型的加速,API(应用程序接口)已经成为企业间沟通和数据交换的关键。而在API开发和管理过程中,API文档、调试、Mock和测试的协作显得尤为重要。Apipost正是这样一款一体化协作平台,旨在解决这些问题,提高API开发效率和质量。Apipost提供API文档管理功能,让后端开发人员可以在开......
  • 记录--这个前端Api管理方案会更好?
    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助简介大家好,前端小白一枚,目前接触后台管理系统比较多,经常遇到不同对象的增删改查的接口,如何对Api进行一个有比较好的管理是个问题。在学习偏函数的时候有了灵感,想到一个不错的API管理方案,并应用在项目一个模块当中......