Lae/app/Console/Commands/Cluster/Monitor.php

142 lines
4.3 KiB
PHP
Raw Normal View History

2023-01-04 12:18:22 +00:00
<?php
namespace App\Console\Commands\Cluster;
2023-01-14 17:21:12 +00:00
use App\Support\ClusterSupport;
2023-01-04 12:18:22 +00:00
use Illuminate\Console\Command;
use Symfony\Component\Console\Command\Command as CommandAlias;
2023-02-09 10:56:26 +00:00
class Monitor extends Command
2023-01-04 12:18:22 +00:00
{
/**
* The name and signature of the console command.
*
* @var string
*/
2023-02-09 10:56:26 +00:00
protected $signature = 'monitor {--ignore_event=}';
2023-01-04 12:18:22 +00:00
/**
* The console command description.
*
* @var string
*/
protected $description = '监听集群消息。';
/**
* Execute the console command.
*
* @return int
*/
public function handle(): int
{
2023-02-09 10:56:26 +00:00
$ignore_events = [];
if ($this->option('ignore_event')) {
$ignore_events = explode(',', $this->option('ignore_event'));
}
ClusterSupport::publish('monitor.started');
ClusterSupport::listen('*', function ($event, $message) use ($ignore_events) {
if (in_array($event, $ignore_events)) {
return;
}
2023-01-04 15:57:36 +00:00
$this->format($event, $message);
}, false);
2023-01-04 12:18:22 +00:00
return CommandAlias::SUCCESS;
}
2023-01-04 15:57:36 +00:00
private function format(string $event, array $message = [])
{
2023-01-04 19:28:18 +00:00
$status = $this->switch($event, $message['data']);
2023-01-04 15:57:36 +00:00
2023-02-09 10:56:59 +00:00
if (! $status) {
2023-01-04 15:57:36 +00:00
return;
}
2023-02-09 10:56:59 +00:00
$message = "[{$message['node']['type']}] {$message['node']['id']}:$event: ".$status;
2023-01-04 15:57:36 +00:00
$this->info($message);
}
2023-01-04 19:28:18 +00:00
public function switch($event, $message = []): string|null
2023-01-04 15:57:36 +00:00
{
$events = [
2023-02-09 10:56:26 +00:00
'monitor.started' => '我正在监听集群消息。',
2023-01-04 15:57:36 +00:00
'node.ok' => '此节点初始化成功,并且已经加入集群。',
2023-02-09 10:56:59 +00:00
'node.online' => fn ($message) => '此节点已经上线,启动权重为:'.$message['weight'],
2023-01-04 15:57:36 +00:00
'node.offline' => '将不再处理任何任务。',
2023-01-14 17:21:12 +00:00
'cluster_ready.ok' => 'ClusterSupport Ready 就绪了,已经可以处理请求了。',
2023-01-04 15:57:36 +00:00
'config.updated' => '集群配置文件已经更新,请所有 slave 节点下载。',
2023-01-18 10:12:28 +00:00
'config.ssl.updated' => '边缘节点的证书已经更新。',
2023-01-04 15:57:36 +00:00
'config.synced' => '我已下载配置文件。',
2023-01-04 19:28:18 +00:00
'edge.deployed' => '已成功根据集群节点生成配置文件并应用。',
'edge.launched' => '边缘节点成功启动。',
2023-02-09 10:56:59 +00:00
'edge.error' => fn ($message) => $message['message'] ?? '未知错误',
2023-01-04 19:43:59 +00:00
'cluster.restart.web' => '正在重启 web 服务。',
'cluster.restart.all' => '正在重启 整个 服务。',
'cluster.restarted.web' => 'Web 重启好了。',
'cluster.restarted.all' => '整个 重启好了。',
2023-02-08 05:46:21 +00:00
'cluster.deployed' => '集群配置文件已经部署。',
2023-02-09 10:56:59 +00:00
'cluster.deployed.error' => fn ($message) => $message['message'] ?? '未知错误',
2023-02-08 05:46:21 +00:00
'cluster.deployed.ok' => '集群配置文件部署成功。',
2023-02-09 10:56:59 +00:00
'http.incoming' => fn ($message) => $this->handleIncomingRequest($message),
'http.outgoing' => fn ($message) => $this->handleOutgoingRequest($message),
'weight.updated' => fn ($message) => $this->handleWeightUpdated($message),
2023-01-04 15:57:36 +00:00
];
2023-02-08 06:18:58 +00:00
$resp = $events[$event] ?? null;
2023-02-08 05:46:21 +00:00
// if resp is callable
if (is_callable($resp)) {
return $resp($message);
}
return $resp ?? null;
}
private function handleIncomingRequest(array $message): string
{
$msg = $this->appendUser($message);
$msg .= "{$message['method']} {$message['path']}";
return $msg;
}
private function handleOutgoingRequest(array $message): string
{
$msg = $this->appendUser($message);
$msg .= "{$message['method']} {$message['path']} {$message['status']} {$message['time']}ms";
return $msg;
}
2023-02-09 10:56:26 +00:00
private function handleWeightUpdated(array $message): string
{
$msg = '';
2023-02-09 10:56:59 +00:00
if ($message['weight'] === '0') {
2023-02-09 10:56:26 +00:00
$msg .= '我不参与调度了。';
} else {
2023-02-09 10:56:59 +00:00
$msg .= '我的权重是:'.$message['weight'].'。';
2023-02-09 10:56:26 +00:00
}
return $msg;
}
2023-02-08 05:46:21 +00:00
private function appendUser(array $message): string
{
$msg = '';
if ($message['user']) {
$msg .= "{$message['user']['name']}#{$message['user']['id']} ";
} else {
$msg .= 'Guest ';
}
return $msg;
2023-01-04 15:57:36 +00:00
}
2023-01-04 12:18:22 +00:00
}