From 040bb0d7f4d43af66126abdc677fcea05afa058a Mon Sep 17 00:00:00 2001 From: Kevin Morris <kevr@0cost.org> Date: Fri, 15 Oct 2021 13:19:07 -0700 Subject: [PATCH] Revert "feat(PHP): add aurweb Prometheus metrics" This reverts commit 986fa9ee305ed113172f7f214d451a7af071ecc2. --- INSTALL | 8 +-- web/html/index.php | 29 -------- web/html/metrics.php | 16 ----- web/lib/metricfuncs.inc.php | 129 ------------------------------------ web/lib/routing.inc.php | 3 +- 5 files changed, 2 insertions(+), 183 deletions(-) delete mode 100644 web/html/metrics.php delete mode 100644 web/lib/metricfuncs.inc.php diff --git a/INSTALL b/INSTALL index b161edd2d..9bcd0759c 100644 --- a/INSTALL +++ b/INSTALL @@ -49,15 +49,9 @@ read the instructions below. # pacman -S python-mysql-connector python-pygit2 python-srcinfo python-sqlalchemy \ python-bleach python-markdown python-alembic python-jinja \ - python-itsdangerous python-authlib python-httpx hypercorn \ - composer + python-itsdangerous python-authlib python-httpx hypercorn # python3 setup.py install -4a) Install `composer` dependencies while inside of aurweb's root: - - $ cd /path/to/aurweb - /path/to/aurweb $ composer require promphp/prometheus_client_php - 5) Create a new MySQL database and a user and import the aurweb SQL schema: $ python -m aurweb.initdb diff --git a/web/html/index.php b/web/html/index.php index 82a44c55b..e57e7708e 100644 --- a/web/html/index.php +++ b/web/html/index.php @@ -3,39 +3,10 @@ set_include_path(get_include_path() . PATH_SEPARATOR . '../lib'); include_once("aur.inc.php"); include_once("pkgfuncs.inc.php"); -include_once("cachefuncs.inc.php"); -include_once("metricfuncs.inc.php"); $path = $_SERVER['PATH_INFO']; $tokens = explode('/', $path); -$query_string = $_SERVER['QUERY_STRING']; - -// If no options.cache is configured, we no-op metric storage operations. -$is_cached = defined('EXTENSION_LOADED_APC') || defined('EXTENSION_LOADED_MEMCACHE'); -if ($is_cached) { - $method = $_SERVER['REQUEST_METHOD']; - // We'll always add +1 to our total request count to this $path, - // unless this path == /metrics. - if ($path !== "/metrics") - add_metric("http_requests_count", $method, $path); - - // Extract $type out of $query_string, if we can. - $type = null; - $query = array(); - if ($query_string) - parse_str($query_string, $query); - $type = $query['type']; - - // Only store RPC metrics for valid types. - $good_types = [ - "info", "multiinfo", "search", "msearch", - "suggest", "suggest-pkgbase", "get-comment-form" - ]; - if ($path === "/rpc" && in_array($type, $good_types)) - add_metric("api_requests_count", $method, $path, $type); -} - if (config_get_bool('options', 'enable-maintenance') && (empty($tokens[1]) || ($tokens[1] != "css" && $tokens[1] != "images"))) { if (!in_array($_SERVER['REMOTE_ADDR'], explode(" ", config_get('options', 'maintenance-exceptions')))) { header("HTTP/1.0 503 Service Unavailable"); diff --git a/web/html/metrics.php b/web/html/metrics.php deleted file mode 100644 index dfa860ed3..000000000 --- a/web/html/metrics.php +++ /dev/null @@ -1,16 +0,0 @@ -<?php -/** - * Provide some variable Prometheus metrics. A new requests.route type - * gets created for each request made and we keep a count using our - * existing Memcached or APC configurable cache, with route - * = {request_uri}?{query_string}. - * - * TL;DR -- The 'requests' counter is used to give variable requests - * based on their request_uris and query_strings. - **/ -include_once('metricfuncs.inc.php'); - -// Render metrics based on options.cache storage. -render_metrics(); - -?> diff --git a/web/lib/metricfuncs.inc.php b/web/lib/metricfuncs.inc.php deleted file mode 100644 index acfc30d7d..000000000 --- a/web/lib/metricfuncs.inc.php +++ /dev/null @@ -1,129 +0,0 @@ -<?php -set_include_path(get_include_path() . PATH_SEPARATOR . '../lib'); - -require __DIR__ . '/../../vendor/autoload.php'; -include_once("cachefuncs.inc.php"); - -use \Prometheus\Storage\InMemory; -use \Prometheus\CollectorRegistry; -use \Prometheus\RenderTextFormat; - -// We always pass through an InMemory cache. This means that -// metrics are only good while the php-fpm service is running -// and will start again at 0 if it's restarted. -$registry = new CollectorRegistry(new InMemory()); - -function add_metric($anchor, $method, $path, $type = null) { - - global $registry; - // We keep track of which routes we're interested in by storing - // a JSON-encoded list into the "prometheus_metrics" key, - // with each item being a JSON-encoded associative array - // in the form: {'path': <route>, 'query_string': <query_string>}. - $metrics = get_cache_value("prometheus_metrics"); - $metrics = $metrics ? json_decode($metrics) : array(); - - $key = "$path:$type"; - - // If the current request $path isn't yet in $metrics create - // a new assoc array for it and push it into $metrics. - if (!in_array($key, $metrics)) { - $data = array( - 'anchor' => $anchor, - 'method' => $method, - 'path' => $path, - 'type' => $type - ); - array_push($metrics, json_encode($data)); - } - - // Cache-wise, we also store the count values of each route - // through the "prometheus:<route>" key. Grab the cache value - // representing the current $path we're on (defaulted to 1). - $count = get_cache_value("prometheus:$key"); - $count = $count ? $count + 1 : 1; - - $labels = ["method", "route"]; - if ($type) - array_push($labels, "type"); - - $gauge = $registry->getOrRegisterGauge( - 'aurweb', - $anchor, - 'A metric count for the aurweb platform.', - $labels - ); - - $label_values = [$data['method'], $data['path']]; - if ($type) - array_push($label_values, $type); - - $gauge->set($count, $label_values); - - // Update cache values. - set_cache_value("prometheus:$key", $count, 0); - set_cache_value("prometheus_metrics", json_encode($metrics), 0); - -} - -function render_metrics() { - if (!defined('EXTENSION_LOADED_APC') && !defined('EXTENSION_LOADED_MEMCACHE')) { - error_log("The /metrics route requires a valid 'options.cache' " - . "configuration; no cache is configured."); - return http_response_code(417); // EXPECTATION_FAILED - } - - global $registry; - - // First, we grab the set of metrics we're interested in in the - // form of a cached JSON list, if we can. - $metrics = get_cache_value("prometheus_metrics"); - if (!$metrics) - $metrics = array(); - else - $metrics = json_decode($metrics); - - // Now, we walk through each of those list values one by one, - // which happen to be JSON-serialized associative arrays, - // and process each metric via its associative array's contents: - // The route path and the query string. - // See web/html/index.php for the creation of such metrics. - foreach ($metrics as $metric) { - $data = json_decode($metric, true); - - $anchor = $data['anchor']; - $path = $data['path']; - $type = $data['type']; - $key = "$path:$type"; - - $labels = ["method", "route"]; - if ($type) - array_push($labels, "type"); - - $count = get_cache_value("prometheus:$key"); - $gauge = $registry->getOrRegisterGauge( - 'aurweb', - $anchor, - 'A metric count for the aurweb platform.', - $labels - ); - - $label_values = [$data['method'], $data['path']]; - if ($type) - array_push($label_values, $type); - - $gauge->set($count, $label_values); - } - - // Construct the results from RenderTextFormat renderer and - // registry's samples. - $renderer = new RenderTextFormat(); - $result = $renderer->render($registry->getMetricFamilySamples()); - - // Output the results with the right content type header. - http_response_code(200); // OK - header('Content-Type: ' . RenderTextFormat::MIME_TYPE); - echo $result; -} - -?> diff --git a/web/lib/routing.inc.php b/web/lib/routing.inc.php index 0f452f221..73c667d26 100644 --- a/web/lib/routing.inc.php +++ b/web/lib/routing.inc.php @@ -19,8 +19,7 @@ $ROUTES = array( '/rss' => 'rss.php', '/tos' => 'tos.php', '/tu' => 'tu.php', - '/addvote' => 'addvote.php', - '/metrics' => 'metrics.php' // Prometheus Metrics + '/addvote' => 'addvote.php', ); $PKG_PATH = '/packages'; -- GitLab