Skip to content
Snippets Groups Projects
Commit 0b29b1c5 authored by Dominik Hebeler's avatar Dominik Hebeler
Browse files

Exporting FPM Metrics

parent 1da9f3a2
No related branches found
No related tags found
No related merge requests found
<?php
namespace App\Http\Controllers;
use Prometheus\CollectorRegistry;
use Prometheus\RenderTextFormat;
class Prometheus extends Controller
{
const PROMETHEUS_NAMESPACE = "metager";
public function metrics()
{
// Export FPM Metrics before Scraping
$this->exportFpmMetrics();
$registry = CollectorRegistry::getDefault();
$renderer = new RenderTextFormat();
$result = $renderer->render($registry->getMetricFamilySamples());
return response($result, 200)
->header('Content-Type', RenderTextFormat::MIME_TYPE);
}
private function exportFpmMetrics()
{
$registry = CollectorRegistry::getDefault();
$fpm_status = \fpm_get_status();
$prometheus_prefix = "fpm_";
// Accepted Connections
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "accepted_conn", "Number of accepted FPM connections");
$counter->set($fpm_status["accepted-conn"]);
// Listen Queue
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "listen_queue", "Size of FPM Listen Queue");
$counter->set($fpm_status["listen-queue"]);
// Max Listen Queue
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "max_listen_queue", "Size of FPM Max Listen Queue");
$counter->set($fpm_status["max-listen-queue"]);
// Listen Queue Length
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "listen_queue_length", "Size of FPM Listen Queue Length");
$counter->set($fpm_status["listen-queue-len"]);
// Idle Processes
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "idle_processes", "Number of FPM Idle Processes");
$counter->set($fpm_status["idle-processes"]);
// Active Processes
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "active_processes", "Number of FPM Active Processes");
$counter->set($fpm_status["active-processes"]);
// Active Processes
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "total_processes", "Number of FPM Total Processes");
$counter->set($fpm_status["total-processes"]);
// Max Active Processes
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "max_active_processes", "Number of FPM Max Active Processes");
$counter->set($fpm_status["max-active-processes"]);
// Max Children Reached
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "max_children_reached", "FPM Max Children Reached");
$counter->set($fpm_status["max-children-reached"]);
// Slow Requests
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "slow_requests", "FPM Slow Requests");
$counter->set($fpm_status["slow-requests"]);
if (sizeof($fpm_status["procs"]) > 0) {
$request_memory_sum = 0;
$request_cpu_sum = 0;
foreach ($fpm_status["procs"] as $proc) {
$request_cpu_sum += $proc["last-request-cpu"];
$request_memory_sum += $proc["last-request-memory"];
}
// CPU
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "cpu", "FPM Average of CPU Utilization");
$counter->set($request_cpu_sum / sizeof($fpm_status["procs"]));
// Memory
$counter = $registry->getOrRegisterGauge(self::PROMETHEUS_NAMESPACE, $prometheus_prefix . "memory", "FPM Average of Memory Utilization");
$counter->set($request_memory_sum / sizeof($fpm_status["procs"]));
}
}
}
...@@ -2,6 +2,7 @@ ...@@ -2,6 +2,7 @@
namespace App\Http; namespace App\Http;
use App\Http\Middleware\AllowLocalOnly;
use Illuminate\Foundation\Http\Kernel as HttpKernel; use Illuminate\Foundation\Http\Kernel as HttpKernel;
class Kernel extends HttpKernel class Kernel extends HttpKernel
...@@ -71,5 +72,6 @@ class Kernel extends HttpKernel ...@@ -71,5 +72,6 @@ class Kernel extends HttpKernel
'browserverification' => \App\Http\Middleware\BrowserVerification::class, 'browserverification' => \App\Http\Middleware\BrowserVerification::class,
'keyvalidation' => \App\Http\Middleware\KeyValidation::class, 'keyvalidation' => \App\Http\Middleware\KeyValidation::class,
'removekey' => \App\Http\Middleware\RemoveKey::class, 'removekey' => \App\Http\Middleware\RemoveKey::class,
'allow-local-only' => AllowLocalOnly::class,
]; ];
} }
<?php
namespace App\Http\Middleware;
use Closure;
use Illuminate\Http\Request;
class AllowLocalOnly
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure(\Illuminate\Http\Request): (\Illuminate\Http\Response|\Illuminate\Http\RedirectResponse) $next
* @return \Illuminate\Http\Response|\Illuminate\Http\RedirectResponse
*/
public function handle(Request $request, Closure $next)
{
// Only allow access to metrics from within our network
$ip = $request->ip();
$allowedNetworks = [
"10.",
"172.",
"192.",
"127.0.0.1",
];
$allowed = false;
foreach ($allowedNetworks as $part) {
if (stripos($ip, $part) === 0) {
$allowed = true;
}
}
if (!$allowed) {
abort(401);
}
return $next($request);
}
}
<?php <?php
use App\Http\Controllers\AdminInterface; use App\Http\Controllers\AdminInterface;
use App\Http\Controllers\Prometheus;
use App\Http\Controllers\SearchEngineList; use App\Http\Controllers\SearchEngineList;
use Illuminate\Support\Facades\Redis; use Illuminate\Support\Facades\Redis;
use Jenssegers\Agent\Agent; use Jenssegers\Agent\Agent;
use Prometheus\RenderTextFormat;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Routing\Router;
use Illuminate\Support\Facades\App; use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Response; use Illuminate\Support\Facades\Response;
use Illuminate\Support\Facades\Route; use Illuminate\Support\Facades\Route;
use Mcamara\LaravelLocalization\Facades\LaravelLocalization; use Mcamara\LaravelLocalization\Facades\LaravelLocalization;
use Prometheus\CollectorRegistry;
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------
...@@ -366,36 +366,11 @@ Route::group(['prefix' => 'app'], function () { ...@@ -366,36 +366,11 @@ Route::group(['prefix' => 'app'], function () {
}); });
}); });
Route::get('metrics', function (Request $request) { Route::group(["prefix" => "metrics", "middleware" => "allow-local-only"], function (Router $router) {
// Only allow access to metrics from within our network $router->get('/', [Prometheus::class, "metrics"]);
$ip = $request->ip();
$allowedNetworks = [
"10.",
"172.",
"192.",
"127.0.0.1",
];
$allowed = false;
foreach ($allowedNetworks as $part) {
if (stripos($ip, $part) === 0) {
$allowed = true;
}
}
if (!$allowed) {
abort(401);
}
$registry = CollectorRegistry::getDefault();
$renderer = new RenderTextFormat();
$result = $renderer->render($registry->getMetricFamilySamples());
return response($result, 200)
->header('Content-Type', RenderTextFormat::MIME_TYPE);
}); });
Route::group(['prefix' => 'partner'], function () { Route::group(['prefix' => 'partner'], function () {
Route::get('r', 'AdgoalController@forward')->name('adgoal-redirect'); Route::get('r', 'AdgoalController@forward')->name('adgoal-redirect');
}); });
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment