Prometheus client library using database, memory storage.
Based on documentation https://prometheus.io/docs/instrumenting/writing_clientlibs/ and https://github.com/PromPHP/prometheus_client_php
Use rancoud/Database package (https://github.com/rancoud/Database) when using MySQL, PostgreSQL or SQLite.
composer require rancoud/prometheusSimple counter and expose result
use Rancoud\Prometheus\Counter;
use Rancoud\Prometheus\Descriptor;
use Rancoud\Prometheus\Storage\InMemory;
// Define a counter
$counter = new Counter(
new InMemory(), // <- InMemory is the storage engine used.
new Descriptor("login") // <- Descriptor describe your metric.
);
// By default it increase by 1
$counter->inc();
// Also you can use a value other than 1 (always positive in case of counter)
$counter->inc(3);
// Now you can expose as plain text result
echo $counter->expose();
// Result of expose() below:
#TYPE login counter
login 4Counter with help text and labels
use Rancoud\Prometheus\Counter;
use Rancoud\Prometheus\Descriptor;
use Rancoud\Prometheus\Storage\InMemory;
$descriptor = new Descriptor("request_count", ['method', 'path'])
->setHelp('Number of request by method and path');
$counter = new Counter(new InMemory(), $descriptor);
$counter->inc(5, ['GET', 'home']);
$counter->inc(3, ['GET', 'login']);
$counter->inc(1, ['POST', 'login']);
echo $counter->expose();
// Result of expose() below:
#HELP request_count Number of request by method and path
#TYPE request_count counter
request_count{method="GET",path="home"} 5
request_count{method="GET",path="login"} 3
request_count{method="POST",path="login"} 1use Rancoud\Prometheus\Gauge;
use Rancoud\Prometheus\Descriptor;
use Rancoud\Prometheus\Storage\InMemory;
// Define a gauge
$gauge = new Gauge(
new InMemory(),
new Descriptor("account_count")
->setHelp('Number of account')
);
// You can set a value
$gauge->set(100);
// You can increment
$gauge->inc(15);
// You can decrement
$gauge->dec(5);
echo $gauge->expose();
// Result of expose() below:
#HELP account_count Number of account
#TYPE account_count gauge
account_count 110use Rancoud\Prometheus\Histogram;
use Rancoud\Prometheus\Descriptor;
use Rancoud\Prometheus\Storage\InMemory;
// Define a histogram
$histogram = new Histogram(
new InMemory(),
new Descriptor("http_request_duration_seconds")
);
// You can observe a value
$histogram->observe(0.56);
echo $histogram->expose();
// Result of expose() below:
#TYPE http_request_duration_seconds histogram
http_request_duration_seconds_bucket{le="0.005"} 0
http_request_duration_seconds_bucket{le="0.01"} 0
http_request_duration_seconds_bucket{le="0.025"} 0
http_request_duration_seconds_bucket{le="0.05"} 0
http_request_duration_seconds_bucket{le="0.075"} 0
http_request_duration_seconds_bucket{le="0.1"} 0
http_request_duration_seconds_bucket{le="0.25"} 0
http_request_duration_seconds_bucket{le="0.5"} 0
http_request_duration_seconds_bucket{le="0.75"} 1
http_request_duration_seconds_bucket{le="1"} 1
http_request_duration_seconds_bucket{le="2.5"} 1
http_request_duration_seconds_bucket{le="5"} 1
http_request_duration_seconds_bucket{le="7.5"} 1
http_request_duration_seconds_bucket{le="10"} 1
http_request_duration_seconds_bucket{le="+Inf"} 1
http_request_duration_seconds_count 1
http_request_duration_seconds_sum 0.56You can set your own buckets.
new Descriptor("http_request_duration_seconds")->setHistogramBuckets([0, 5, 10]);use Rancoud\Prometheus\Summary;
use Rancoud\Prometheus\Descriptor;
use Rancoud\Prometheus\Storage\InMemory;
// Define a summary
$summary = new Summary(
new InMemory(),
new Descriptor("http_request_duration_seconds")
);
// You can observe a value
$summary->observe(0.56);
echo $summary->expose();
// Result of expose() below:
#TYPE http_request_duration_seconds summary
http_request_duration_seconds{quantile="0.01"} 0.56
http_request_duration_seconds{quantile="0.05"} 0.56
http_request_duration_seconds{quantile="0.5"} 0.56
http_request_duration_seconds{quantile="0.95"} 0.56
http_request_duration_seconds{quantile="0.99"} 0.56
http_request_duration_seconds_count 1
http_request_duration_seconds_sum 0.56You can set your own quantiles.
new Descriptor("http_request_duration_seconds")->setSummaryQuantiles([0.1, 0.5, 0.9]);You can change the TTL in seconds you want to keep the observed values.
new Descriptor("http_request_duration_seconds")->setSummaryTTL(10);A registry is an object where all metrics are stored.
Registry instance example
use Rancoud\Prometheus\Counter;
use Rancoud\Prometheus\Descriptor;
use Rancoud\Prometheus\Registry;
use Rancoud\Prometheus\Storage\InMemory;
// Define a registry
$registry = new Registry();
// Define 2 counters
$counter1 = new Counter(new InMemory(), new Descriptor("login"));
$counter2 = new Counter(new InMemory(), new Descriptor("logout"));
// Add counters in registry
$registry->register($counter1, $counter2);
// Update counters otherwise is not exposed
$counter1->inc(4);
$counter2->inc(2);
// Now you can expose as plain text result
echo $registry->expose();
// Result of expose() below:
#TYPE login counter
login 4
#TYPE logout counter
logout 2Default Registry with static Singleton example
use Rancoud\Prometheus\Counter;
use Rancoud\Prometheus\Descriptor;
use Rancoud\Prometheus\Registry;
use Rancoud\Prometheus\Storage\InMemory;
// Define 2 counters AND register them in the default registry
$counter1 = new Counter(new InMemory(), new Descriptor("login"))->register();
$counter2 = new Counter(new InMemory(), new Descriptor("logout"))->register();
// Update counters otherwise is not exposed
$counter1->inc(4);
$counter2->inc(2);
// Now you can expose as plain text result
echo Registry::getDefault()->expose();
// Result of expose() below:
#TYPE login counter
login 4
#TYPE logout counter
logout 2Using SQLite with memory database is same as using InMemory Database.
use Rancoud\Database\Configurator;
use Rancoud\Database\Database;
use Rancoud\Prometheus\Counter;
use Rancoud\Prometheus\Descriptor;
use Rancoud\Prometheus\Storage\SQLite;
$params = [
'driver' => 'sqlite',
'host' => '',
'user' => '',
'password' => '',
'database' => 'prometheus.db'
];
$configurator = new Configurator($params);
$database = new Database($configurator);
$storage = new SQLite($database);
$counter = new Counter($storage, new Descriptor("example"));Constructor
public function __construct(Adapter $storage, Descriptor $descriptor)Returns raw metrics (descriptor + samples) as iterable.
public function collect(): iterableReturns text of metric as string.
public function expose(): stringReturns metric name.
public function metricName(): stringRegister in the default Registry.
public function register(): selfIncrements counter.
public function inc(float|int $value = 1, array $labels = []): voidIncrements counter.
public function inc(float|int $value = 1, array $labels = []): voidDecrements counter.
public function dec(float|int $value = 1, array $labels = []): voidSets value of gauge.
public function set(float|int $value, array $labels = []): voidSets value of gauge with function \time() to use current Unix timestamp.
public function setToCurrentTime(array $labels = []): voidAdds a new sample.
public function observe(float $value, array $labels = []): voidGenerates linear buckets.
Creates 'count' regular buckets, each 'width' wide, where the lowest bucket has an upper bound of 'start'.
public static function linearBuckets(float $start, float $width, int $countBuckets): arrayGenerates exponential buckets.
Creates 'count' regular buckets, where the lowest bucket has an upper bound of 'start'
and each following bucket's upper bound is 'factor' times the previous bucket's upper bound.
public static function exponentialBuckets(float $start, float $growthFactor, int $countBuckets): arrayAdds a new sample.
public function observe(float $value, array $labels = []): voidConstructor
public function __construct(string $name, array $labels = [])When exposed it will output a line #HELP {your message}.
public function setHelp(string $help): selfSet histogram buckets instead of using default buckets.
public function setHistogramBuckets(array $buckets): selfSet summary TTL instead of using default TTL.
public function setSummaryTTL(int $ttlInSeconds): selfSet summary quantiles instead of using default quantiles.
public function setSummaryQuantiles(array $quantiles): selfReturns name.
public function name(): stringReturns labels.
public function labels(): arrayReturns labels count.
public function labelsCount(): intReturns histogram buckets.
public function buckets(): arrayReturns summary quantiles.
public function quantiles(): arrayReturns summary TTL.
public function ttlInSeconds(): intExports HELP.
public function exportHelp(): stringExports TYPE.
public function exportType(string $type): stringExports value (counter, gauge, histogram _sum and _count, summary _sum and _count).
public function exportValue(float|int $value, array $labelValues, string $suffixName = ''): stringExports value (histogram).
public function exportHistogramValue(string $bucket, int $value, array $labelValues): stringExports value (summary).
public function exportSummaryValue(float $quantile, array $values, array $labelValues): stringRegisters metric.
public function register(Collector ...$collectors): voidUnregisters metric.
public function unregister(Collector ...$collectors): voidReturns raw metrics registered (descriptor + samples) as iterable.
public function collect(): iterableReturns text of metrics registered as string.
public function expose(): stringRegisters metric in the default Registry (singleton).
public static function registerInDefault(Collector $collector): voidReturns the default Registry (singleton).
public static function getDefault(): selfReturns metrics (counter, gauge, histogram and summary) as iterable.
If metric type and name is provided it will return only the specify metric.
public function collect(string $metricType = '', string $metricName = ''): iterableReturns text of metrics (counter, gauge, histogram and summary) as iterable.
If metric type and name is provided it will return only the specify metric.
public function expose(string $metricType = '', string $metricName = ''): iterableUpdates counter metric.
public function updateCounter(Descriptor $descriptor, float|int $value = 1, array $labelValues = []): voidUpdates gauge metric.
public function updateGauge(Descriptor $descriptor, Operation $operation, float|int $value = 1, array $labelValues = []): voidAdds sample to histogram metric.
public function updateHistogram(Descriptor $descriptor, float $value, array $labelValues = []): voidAdds sample to summary metric.
public function updateSummary(Descriptor $descriptor, float $value, array $labelValues = []): voidRemoves all data saved.
public function wipeStorage(): voidOverrides Time Function for summary metric.
public function setTimeFunction(callable|string $time): voidReturns text of counters metric as iterable.
public function exposeCounters(string $metricName = ''): iterableReturns text of gauges metric as iterable.
public function exposeGauges(string $metricName = ''): iterableReturns text of histograms metric as iterable.
public function exposeHistograms(string $metricName = ''): iterableReturns text of summaries metric as iterable.
public function exposeSummaries(string $metricName = ''): iterableReturns text of counters metric as iterable.
public function exposeCounters(string $metricName = ''): iterableReturns text of gauges metric as iterable.
public function exposeGauges(string $metricName = ''): iterableReturns text of histograms metric as iterable.
public function exposeHistograms(string $metricName = ''): iterableReturns text of summaries metric as iterable.
public function exposeSummaries(string $metricName = ''): iterableRemove all expired summaries sample according to the TTL.
public function deleteExpiredSummaries(): voidDrop all tables.
public function deleteStorage(): voidcomposer ci for php-cs-fixer and phpunit and coverage
composer lint for php-cs-fixer
composer test for phpunit and coverage