-
-
Save lotharthesavior/64fc5404bf82e59f93afa0620e70eaf0 to your computer and use it in GitHub Desktop.
Openswoole - getMetrics()
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/** | |
* Extracted from https://github.com/openswoole/swoole-src/blob/f191c0b0a98e9b97f5c81d4877f450c863e6c36d/ext-src/php_swoole_library.h#L6999 | |
* | |
* Changes: | |
* | |
* - Added 'service' label | |
* - Added additional label support | |
* | |
* Additional metrics: | |
* | |
* - openswoole_top_classes_total | |
* - openswoole_event_workers_cpu_average | |
* - openswoole_task_workers_cpu_average | |
* - openswoole_user_workers_cpu_average | |
* - openswoole_cpu_average | |
* | |
* Todo | |
* - Refactor use shell_exec() to call ps for cpu stats | |
* | |
* Updates | |
* - 16/06/2022: Replace ${var} with {$var} for forward PHP 8.2 compat | |
*/ | |
public function getMetrics($service = 'openswoole', array $labels = []): string | |
{ | |
$stats = $this->stats(); | |
$labels['service'] = strtolower($service); | |
//Serialise the labels | |
foreach($labels as $key => $value) { | |
$labels[$key] = $key.'="'.$value.'"'; | |
} | |
$labels = implode(',', $labels); | |
$cpu_total = 0.0; | |
$event_workers = []; | |
$event_workers[] = "# TYPE openswoole_event_workers_start_time gauge"; | |
foreach ($stats['event_workers'] as $stat) { | |
$event_workers[] = "openswoole_event_workers_start_time{{$labels},worker_id=\"{$stat['worker_id']}\"} {$stat['start_time']}"; | |
} | |
$event_workers[] = "# TYPE openswoole_event_workers_start_seconds gauge"; | |
foreach ($stats['event_workers'] as $stat) { | |
$event_workers[] = "openswoole_event_workers_start_seconds{{$labels},worker_id=\"{$stat['worker_id']}\"} {$stat['start_seconds']}"; | |
} | |
$event_workers[] = "# TYPE openswoole_event_workers_dispatch_count gauge"; | |
foreach ($stats['event_workers'] as $stat) { | |
$event_workers[] = "openswoole_event_workers_dispatch_count{{$labels},worker_id=\"{$stat['worker_id']}\"} {$stat['dispatch_count']}"; | |
} | |
$event_workers[] = "# TYPE openswoole_event_workers_request_count gauge"; | |
foreach ($stats['event_workers'] as $stat) { | |
$event_workers[] = "openswoole_event_workers_request_count{{$labels},worker_id=\"{$stat['worker_id']}\"} {$stat['request_count']}"; | |
} | |
$event_workers[] = "# TYPE openswoole_event_workers_cpu gauge"; | |
foreach ($stats['event_workers'] as $stat) | |
{ | |
$pid = $stat['pid']; | |
$cpu_total += $cpu = (float) trim(shell_exec("ps -p $pid -o %cpu | tail -n +2")); | |
$event_workers[] = "openswoole_event_workers_cpu_average{{$labels},worker_id=\"{$stat['worker_id']}\"} {$cpu}"; | |
} | |
$task_workers = []; | |
$task_workers[] = "# TYPE openswoole_task_workers_start_time gauge"; | |
foreach ($stats['task_workers'] as $stat) { | |
$task_workers[] = "openswoole_task_workers_start_time{{$labels},worker_id=\"{$stat['worker_id']}\"} {$stat['start_time']}"; | |
} | |
$task_workers[] = "# TYPE openswoole_task_workers_start_seconds gauge"; | |
foreach ($stats['task_workers'] as $stat) { | |
$task_workers[] = "openswoole_task_workers_start_seconds{{$labels},worker_id=\"{$stat['worker_id']}\"} {$stat['start_seconds']}"; | |
} | |
$event_workers[] = "# TYPE openswoole_task_workers_cpu gauge"; | |
foreach ($stats['task_workers'] as $stat) | |
{ | |
$pid = $stat['pid']; | |
$cpu_total += $cpu = (float) trim(shell_exec("ps -p $pid -o %cpu | tail -n +2")); | |
$event_workers[] = "openswoole_task_workers_cpu_average{{$labels},worker_id=\"{$stat['worker_id']}\"} {$cpu}"; | |
} | |
$user_workers = []; | |
$user_workers[] = "# TYPE openswoole_user_workers_start_time gauge"; | |
foreach ($stats['user_workers'] as $stat) { | |
$user_workers[] = "openswoole_user_workers_start_time{{$labels},worker_id=\"{$stat['worker_id']}\"} {$stat['start_time']}"; | |
} | |
$user_workers[] = "# TYPE openswoole_user_workers_start_seconds gauge"; | |
foreach ($stats['user_workers'] as $stat) { | |
$user_workers[] = "openswoole_user_workers_start_seconds{{$labels},worker_id=\"{$stat['worker_id']}\"} {$stat['start_seconds']}"; | |
} | |
$event_workers[] = "# TYPE openswoole_user_workers_cpu gauge"; | |
foreach ($stats['user_workers'] as $stat) | |
{ | |
$pid = $stat['pid']; | |
$cpu_total += $cpu = (float) trim(shell_exec("ps -p $pid -o %cpu | tail -n +2")); | |
$event_workers[] = "openswoole_user_workers_cpu_average{{$labels},worker_id=\"{$stat['worker_id']}\"} {$cpu}"; | |
} | |
$classes = []; | |
$classes[] = "# TYPE openswoole_top_classes_total counter"; | |
foreach ($stats['top_classes'] as $name => $value) | |
{ | |
$name = addslashes($name); | |
$classes[] = "openswoole_top_classes_total{{$labels},class_name=\"{$name}\"} {$value}"; | |
} | |
$pid = $this->getMasterPid(); | |
$cpu_total += (float) trim(shell_exec("ps -p $pid -o %cpu | tail -n +2")); | |
$pid = $this->getManagerPid(); | |
$cpu_total += (float) trim(shell_exec("ps -p $pid -o %cpu | tail -n +2")); | |
$metrics = [ | |
"# TYPE openswoole_info gauge", | |
"openswoole_info{{$labels},version=\"{$stats['version']}\"} 1", | |
"# TYPE openswoole_up gauge", | |
"openswoole_up{{$labels}} {$stats['up']}", | |
"# TYPE openswoole_reactor_num gauge", | |
"openswoole_reactor_threads_num{{$labels}} {$stats['reactor_threads_num']}", | |
"# TYPE openswoole_requests counter", | |
"openswoole_requests_total{{$labels}} {$stats['requests_total']}", | |
"# TYPE openswoole_start_time gauge", | |
"openswoole_start_time{{$labels}} {$stats['start_time']}", | |
"# TYPE openswoole_max_conn gauge", | |
"openswoole_max_conn{{$labels}} {$stats['max_conn']}", | |
"# TYPE openswoole_coroutine_num gauge", | |
"openswoole_coroutine_num{{$labels}} {$stats['coroutine_num']}", | |
"# TYPE openswoole_start_seconds gauge", | |
"openswoole_start_seconds{{$labels}} {$stats['start_seconds']}", | |
"# TYPE openswoole_workers_total gauge", | |
"openswoole_workers_total{{$labels}} {$stats['workers_total']}", | |
"# TYPE openswoole_workers_idle gauge", | |
"openswoole_workers_idle{{$labels}} {$stats['workers_idle']}", | |
"# TYPE openswoole_task_workers_total gauge", | |
"openswoole_task_workers_total{{$labels}} {$stats['task_workers_total']}", | |
"# TYPE openswoole_task_workers_idle gauge", | |
"openswoole_task_workers_idle{{$labels}} {$stats['task_workers_idle']}", | |
"# TYPE openswoole_user_workers_total gauge", | |
"openswoole_user_workers_total{{$labels}} {$stats['user_workers_total']}", | |
"# TYPE openswoole_dispatch_total gauge", | |
"openswoole_dispatch_total{{$labels}} {$stats['dispatch_total']}", | |
"# TYPE openswoole_connections_accepted gauge", | |
"openswoole_connections_accepted{{$labels}} {$stats['connections_accepted']}", | |
"# TYPE openswoole_connections_active gauge", | |
"openswoole_connections_active{{$labels}} {$stats['connections_active']}", | |
"# TYPE openswoole_connections_closed gauge", | |
"openswoole_connections_closed{{$labels}} {$stats['connections_closed']}", | |
"# TYPE openswoole_reload_count gauge", | |
"openswoole_reload_count{{$labels}} {$stats['reload_count']}", | |
"# TYPE openswoole_reload_last_time gauge", | |
"openswoole_reload_last_time{{$labels}} {$stats['reload_last_time']}", | |
"# TYPE openswoole_worker_vm_object_num gauge", | |
"openswoole_worker_vm_object_num{{$labels}} {$stats['worker_vm_object_num']}", | |
"# TYPE openswoole_worker_vm_resource_num gauge", | |
"openswoole_worker_vm_resource_num{{$labels}} {$stats['worker_vm_resource_num']}", | |
"# TYPE openswoole_worker_memory_usage gauge", | |
"openswoole_worker_memory_usage{{$labels}} {$stats['worker_memory_usage']}", | |
"# TYPE openswoole_cpu_average gauge", | |
"openswoole_cpu_average{{$labels}} {$cpu_total}", | |
"# TYPE openswoole_volume_free_bytes gauge", | |
"openswoole_volume_free_bytes{{$labels}} {$volume_free}", | |
"# TYPE openswoole_volume_total_bytes gauge", | |
"openswoole_volume_total_bytes{{$labels}} {$volume_total}", | |
]; | |
$metrics = array_merge($metrics, $event_workers, $task_workers, $user_workers, $classes); | |
$metrics[] = "# EOF"; | |
return implode("\n", $metrics); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment