1
|
|
|
<?php |
2
|
|
|
|
|
|
|
|
3
|
|
|
namespace Hhxsv5\LaravelS\Components\Prometheus; |
4
|
|
|
|
5
|
|
|
use Hhxsv5\LaravelS\Components\Prometheus\Collectors\SwooleProcessCollector; |
6
|
|
|
use Hhxsv5\LaravelS\Components\Prometheus\Collectors\SwooleStatsCollector; |
7
|
|
|
use Hhxsv5\LaravelS\Components\Prometheus\Collectors\SystemCollector; |
8
|
|
|
use Hhxsv5\LaravelS\Swoole\Process\CustomProcessInterface; |
9
|
|
|
use Swoole\Http\Server; |
10
|
|
|
use Swoole\Process; |
11
|
|
|
use Swoole\Timer; |
12
|
|
|
|
13
|
|
|
class CollectorProcess implements CustomProcessInterface |
|
|
|
|
14
|
|
|
{ |
15
|
|
|
private static $timerId; |
|
|
|
|
16
|
|
|
|
17
|
|
|
public static function getDefinition() |
|
|
|
|
18
|
|
|
{ |
19
|
|
|
return [ |
20
|
|
|
'prometheus' => [ |
21
|
|
|
'class' => static::class, |
22
|
|
|
'redirect' => false, |
23
|
|
|
'pipe' => 0, |
24
|
|
|
'enable' => (bool)config('prometheus.enable', true), |
|
|
|
|
25
|
|
|
], |
26
|
|
|
]; |
27
|
|
|
} |
28
|
|
|
|
29
|
|
|
public static function callback(Server $swoole, Process $process) |
|
|
|
|
30
|
|
|
{ |
31
|
|
|
/**@var SwooleProcessCollector $processCollector */ |
|
|
|
|
32
|
|
|
$processCollector = app(SwooleProcessCollector::class); |
|
|
|
|
33
|
|
|
/**@var SwooleStatsCollector $swooleStatsCollector */ |
|
|
|
|
34
|
|
|
$swooleStatsCollector = app(SwooleStatsCollector::class); |
35
|
|
|
/**@var SystemCollector $systemCollector */ |
|
|
|
|
36
|
|
|
$systemCollector = app(SystemCollector::class); |
37
|
|
|
$workerNum = $swoole->setting['worker_num']; |
38
|
|
|
$taskWorkerNum = isset($swoole->setting['task_worker_num']) ? $swoole->setting['task_worker_num'] : 0; |
39
|
|
|
$totalNum = $workerNum + $taskWorkerNum - 1; |
40
|
|
|
$workerIds = range(0, $totalNum); |
41
|
|
|
$runJob = function () use ($swoole, $workerIds, $processCollector, $swooleStatsCollector, $systemCollector) { |
42
|
|
|
// Collect the metrics of Swoole stats() |
43
|
|
|
$swooleStatsCollector->collect(); |
44
|
|
|
|
45
|
|
|
// Collect the metrics of system |
46
|
|
|
$systemCollector->collect(); |
47
|
|
|
|
48
|
|
|
// Collect the metrics of all workers |
49
|
|
|
foreach ($workerIds as $workerId) { |
50
|
|
|
$swoole->sendMessage($processCollector, $workerId); |
51
|
|
|
} |
52
|
|
|
}; |
53
|
|
|
|
54
|
|
|
$interval = config('prometheus.collect_metrics_interval', 10) * 1000; |
|
|
|
|
55
|
|
|
self::$timerId = Timer::tick($interval, $runJob); |
56
|
|
|
} |
57
|
|
|
|
58
|
|
|
public static function onReload(Server $swoole, Process $process) |
|
|
|
|
59
|
|
|
{ |
60
|
|
|
Timer::clear(self::$timerId); |
61
|
|
|
} |
62
|
|
|
|
63
|
|
|
public static function onStop(Server $swoole, Process $process) |
|
|
|
|
64
|
|
|
{ |
65
|
|
|
Timer::clear(self::$timerId); |
66
|
|
|
} |
67
|
|
|
} |