中间件
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"],
];
最后新增钉钉机器人
最后复制webhook即可
标签:laravel,ch,monitorDing,param,response,api,告警,config,curl From: https://blog.51cto.com/u_12903656/8119435