{"id":28299422,"url":"https://github.com/rancoud/prometheus","last_synced_at":"2026-03-06T12:03:23.206Z","repository":{"id":293811325,"uuid":"985213926","full_name":"rancoud/Prometheus","owner":"rancoud","description":"Prometheus client Package","archived":false,"fork":false,"pushed_at":"2026-02-16T10:46:53.000Z","size":400,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2026-02-19T23:55:26.976Z","etag":null,"topics":["composer","coverage","packagist","php","php84","phpunit","prometheus","prometheus-client"],"latest_commit_sha":null,"homepage":"https://packagist.org/packages/rancoud/prometheus ","language":"PHP","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/rancoud.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-05-17T09:47:39.000Z","updated_at":"2026-02-16T10:46:55.000Z","dependencies_parsed_at":"2026-01-02T00:00:35.847Z","dependency_job_id":null,"html_url":"https://github.com/rancoud/Prometheus","commit_stats":null,"previous_names":["rancoud/prometheus"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/rancoud/Prometheus","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rancoud%2FPrometheus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rancoud%2FPrometheus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rancoud%2FPrometheus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rancoud%2FPrometheus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rancoud","download_url":"https://codeload.github.com/rancoud/Prometheus/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rancoud%2FPrometheus/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":30175911,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-03-06T11:48:51.886Z","status":"ssl_error","status_checked_at":"2026-03-06T11:48:51.460Z","response_time":250,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["composer","coverage","packagist","php","php84","phpunit","prometheus","prometheus-client"],"created_at":"2025-05-23T10:12:30.371Z","updated_at":"2026-03-06T12:03:23.194Z","avatar_url":"https://github.com/rancoud.png","language":"PHP","readme":"# Prometheus Package\n\n![Packagist PHP Version Support](https://img.shields.io/packagist/php-v/rancoud/Prometheus)\n[![Packagist Version](https://img.shields.io/packagist/v/rancoud/Prometheus)](https://packagist.org/packages/rancoud/Prometheus)\n[![Packagist Downloads](https://img.shields.io/packagist/dt/rancoud/Prometheus)](https://packagist.org/packages/rancoud/Prometheus)\n[![Composer dependencies](https://img.shields.io/badge/dependencies-0-brightgreen)](https://github.com/rancoud/Prometheus/blob/main/composer.json)\n[![Test workflow](https://img.shields.io/github/actions/workflow/status/rancoud/Prometheus/test.yml?branch=main)](https://github.com/rancoud/Prometheus/actions/workflows/test.yml)\n[![Codecov](https://img.shields.io/codecov/c/github/rancoud/Prometheus?logo=codecov)](https://codecov.io/gh/rancoud/Prometheus)\n\nPrometheus client library using database, memory storage.\n\nBased on documentation [https://prometheus.io/docs/instrumenting/writing_clientlibs/](https://prometheus.io/docs/instrumenting/writing_clientlibs/)\nand [https://github.com/PromPHP/prometheus_client_php](https://github.com/PromPHP/prometheus_client_php)\n\nUse `rancoud/Database` package ([https://github.com/rancoud/Database](https://github.com/rancoud/Database)) when using MySQL, PostgreSQL or SQLite.\n\n## Installation\n```php\ncomposer require rancoud/prometheus\n```\n\n## How to use it?\n### Counter metric example\nSimple counter and expose result\n```php\nuse Rancoud\\Prometheus\\Counter;\nuse Rancoud\\Prometheus\\Descriptor;\nuse Rancoud\\Prometheus\\Storage\\InMemory;\n\n// Define a counter\n$counter = new Counter(\n        new InMemory(),         // \u003c- InMemory is the storage engine used.\n        new Descriptor(\"login\") // \u003c- Descriptor describe your metric.\n    );\n\n// By default it increase by 1\n$counter-\u003einc();\n\n// Also you can use a value other than 1 (always positive in case of counter)\n$counter-\u003einc(3);\n\n// Now you can expose as plain text result\necho $counter-\u003eexpose();\n\n// Result of expose() below:\n#TYPE login counter\nlogin 4\n\n```\n\nCounter with help text and labels\n```php\nuse Rancoud\\Prometheus\\Counter;\nuse Rancoud\\Prometheus\\Descriptor;\nuse Rancoud\\Prometheus\\Storage\\InMemory;\n\n$descriptor = new Descriptor(\"request_count\", ['method', 'path'])\n    -\u003esetHelp('Number of request by method and path');\n\n$counter = new Counter(new InMemory(), $descriptor);\n\n$counter-\u003einc(5, ['GET', 'home']);\n$counter-\u003einc(3, ['GET', 'login']);\n$counter-\u003einc(1, ['POST', 'login']);\n\necho $counter-\u003eexpose();\n\n// Result of expose() below:\n#HELP request_count Number of request by method and path\n#TYPE request_count counter\nrequest_count{method=\"GET\",path=\"home\"} 5\nrequest_count{method=\"GET\",path=\"login\"} 3\nrequest_count{method=\"POST\",path=\"login\"} 1\n\n```\n\n### Gauge metric example\n```php\nuse Rancoud\\Prometheus\\Gauge;\nuse Rancoud\\Prometheus\\Descriptor;\nuse Rancoud\\Prometheus\\Storage\\InMemory;\n\n// Define a gauge\n$gauge = new Gauge(\n        new InMemory(),\n        new Descriptor(\"account_count\")\n            -\u003esetHelp('Number of account')\n    );\n\n// You can set a value\n$gauge-\u003eset(100);\n\n// You can increment\n$gauge-\u003einc(15);\n\n// You can decrement\n$gauge-\u003edec(5);\n\necho $gauge-\u003eexpose();\n\n// Result of expose() below:\n#HELP account_count Number of account\n#TYPE account_count gauge\naccount_count 110\n\n```\n\n### Histogram metric example\n```php\nuse Rancoud\\Prometheus\\Histogram;\nuse Rancoud\\Prometheus\\Descriptor;\nuse Rancoud\\Prometheus\\Storage\\InMemory;\n\n// Define a histogram\n$histogram = new Histogram(\n        new InMemory(),\n        new Descriptor(\"http_request_duration_seconds\")\n    );\n\n// You can observe a value\n$histogram-\u003eobserve(0.56);\n\necho $histogram-\u003eexpose();\n\n// Result of expose() below:\n#TYPE http_request_duration_seconds histogram\nhttp_request_duration_seconds_bucket{le=\"0.005\"} 0\nhttp_request_duration_seconds_bucket{le=\"0.01\"} 0\nhttp_request_duration_seconds_bucket{le=\"0.025\"} 0\nhttp_request_duration_seconds_bucket{le=\"0.05\"} 0\nhttp_request_duration_seconds_bucket{le=\"0.075\"} 0\nhttp_request_duration_seconds_bucket{le=\"0.1\"} 0\nhttp_request_duration_seconds_bucket{le=\"0.25\"} 0\nhttp_request_duration_seconds_bucket{le=\"0.5\"} 0\nhttp_request_duration_seconds_bucket{le=\"0.75\"} 1\nhttp_request_duration_seconds_bucket{le=\"1\"} 1\nhttp_request_duration_seconds_bucket{le=\"2.5\"} 1\nhttp_request_duration_seconds_bucket{le=\"5\"} 1\nhttp_request_duration_seconds_bucket{le=\"7.5\"} 1\nhttp_request_duration_seconds_bucket{le=\"10\"} 1\nhttp_request_duration_seconds_bucket{le=\"+Inf\"} 1\nhttp_request_duration_seconds_count 1\nhttp_request_duration_seconds_sum 0.56\n\n```\nYou can set your own buckets.\n```php\nnew Descriptor(\"http_request_duration_seconds\")-\u003esetHistogramBuckets([0, 5, 10]);\n```\n\n### Summary metric example\n```php\nuse Rancoud\\Prometheus\\Summary;\nuse Rancoud\\Prometheus\\Descriptor;\nuse Rancoud\\Prometheus\\Storage\\InMemory;\n\n// Define a summary\n$summary = new Summary(\n        new InMemory(),\n        new Descriptor(\"http_request_duration_seconds\")\n    );\n\n// You can observe a value\n$summary-\u003eobserve(0.56);\n\necho $summary-\u003eexpose();\n\n// Result of expose() below:\n#TYPE http_request_duration_seconds summary\nhttp_request_duration_seconds{quantile=\"0.01\"} 0.56\nhttp_request_duration_seconds{quantile=\"0.05\"} 0.56\nhttp_request_duration_seconds{quantile=\"0.5\"} 0.56\nhttp_request_duration_seconds{quantile=\"0.95\"} 0.56\nhttp_request_duration_seconds{quantile=\"0.99\"} 0.56\nhttp_request_duration_seconds_count 1\nhttp_request_duration_seconds_sum 0.56\n\n```\nYou can set your own quantiles.\n```php\nnew Descriptor(\"http_request_duration_seconds\")-\u003esetSummaryQuantiles([0.1, 0.5, 0.9]);\n```\nYou can change the TTL in seconds you want to keep the observed values.\n```php\nnew Descriptor(\"http_request_duration_seconds\")-\u003esetSummaryTTL(10);\n```\n\n### Registry\nA registry is an object where all metrics are stored.  \n\nRegistry instance example\n```php\nuse Rancoud\\Prometheus\\Counter;\nuse Rancoud\\Prometheus\\Descriptor;\nuse Rancoud\\Prometheus\\Registry;\nuse Rancoud\\Prometheus\\Storage\\InMemory;\n\n// Define a registry\n$registry = new Registry();\n\n// Define 2 counters\n$counter1 = new Counter(new InMemory(), new Descriptor(\"login\"));\n$counter2 = new Counter(new InMemory(), new Descriptor(\"logout\"));\n\n// Add counters in registry\n$registry-\u003eregister($counter1, $counter2);\n\n// Update counters otherwise is not exposed\n$counter1-\u003einc(4);\n$counter2-\u003einc(2);\n\n// Now you can expose as plain text result\necho $registry-\u003eexpose();\n\n// Result of expose() below:\n#TYPE login counter\nlogin 4\n#TYPE logout counter\nlogout 2\n\n```\n\nDefault Registry with static Singleton example\n```php\nuse Rancoud\\Prometheus\\Counter;\nuse Rancoud\\Prometheus\\Descriptor;\nuse Rancoud\\Prometheus\\Registry;\nuse Rancoud\\Prometheus\\Storage\\InMemory;\n\n// Define 2 counters AND register them in the default registry\n$counter1 = new Counter(new InMemory(), new Descriptor(\"login\"))-\u003eregister();\n$counter2 = new Counter(new InMemory(), new Descriptor(\"logout\"))-\u003eregister();\n\n// Update counters otherwise is not exposed\n$counter1-\u003einc(4);\n$counter2-\u003einc(2);\n\n// Now you can expose as plain text result\necho Registry::getDefault()-\u003eexpose();\n\n// Result of expose() below:\n#TYPE login counter\nlogin 4\n#TYPE logout counter\nlogout 2\n\n```\n\n### Database storage example\nUsing SQLite with memory database is same as using InMemory Database.\n```php\nuse Rancoud\\Database\\Configurator;\nuse Rancoud\\Database\\Database;\nuse Rancoud\\Prometheus\\Counter;\nuse Rancoud\\Prometheus\\Descriptor;\nuse Rancoud\\Prometheus\\Storage\\SQLite;\n\n$params = [\n    'driver'    =\u003e 'sqlite',\n    'host'      =\u003e '',\n    'user'      =\u003e '',\n    'password'  =\u003e '',\n    'database'  =\u003e 'prometheus.db'\n];\n\n$configurator = new Configurator($params);\n\n$database = new Database($configurator);\n\n$storage = new SQLite($database);\n\n$counter = new Counter($storage, new Descriptor(\"example\"));\n```\n\n## Collector (metric)\nConstructor\n```php\npublic function __construct(Adapter $storage, Descriptor $descriptor)\n```\n\nReturns raw metrics (descriptor + samples) as iterable.\n```php\npublic function collect(): iterable\n```\n\nReturns text of metric as string.\n```php\npublic function expose(): string\n```\n\nReturns metric name.\n```php\npublic function metricName(): string\n```\n\nRegister in the default Registry.\n```php\npublic function register(): self\n```\n\n### Counter Metric\nIncrements counter.\n```php\npublic function inc(float|int $value = 1, array $labels = []): void\n```\n\n### Gauge Metric\nIncrements counter.\n```php\npublic function inc(float|int $value = 1, array $labels = []): void\n```\n\nDecrements counter.\n```php\npublic function dec(float|int $value = 1, array $labels = []): void\n```\n\nSets value of gauge.\n```php\npublic function set(float|int $value, array $labels = []): void\n```\n\nSets value of gauge with function \\time() to use current Unix timestamp.\n```php\npublic function setToCurrentTime(array $labels = []): void\n```\n\n### Histogram Metric\nAdds a new sample.\n```php\npublic function observe(float $value, array $labels = []): void\n```\n\nGenerates linear buckets.  \nCreates 'count' regular buckets, each 'width' wide, where the lowest bucket has an upper bound of 'start'.\n```php\npublic static function linearBuckets(float $start, float $width, int $countBuckets): array\n```\n\nGenerates exponential buckets.  \nCreates 'count' regular buckets, where the lowest bucket has an upper bound of 'start'\nand each following bucket's upper bound is 'factor' times the previous bucket's upper bound.\n```php\npublic static function exponentialBuckets(float $start, float $growthFactor, int $countBuckets): array\n```\n\n### Summary Metric\nAdds a new sample.\n```php\npublic function observe(float $value, array $labels = []): void\n```\n\n## Descriptor\nConstructor\n```php\npublic function __construct(string $name, array $labels = [])\n```\n\nWhen exposed it will output a line #HELP {your message}.\n```php\npublic function setHelp(string $help): self\n```\n\nSet histogram buckets instead of using default buckets.\n```php\npublic function setHistogramBuckets(array $buckets): self\n```\n\nSet summary TTL instead of using default TTL.\n```php\npublic function setSummaryTTL(int $ttlInSeconds): self\n```\n\nSet summary quantiles instead of using default quantiles.\n```php\npublic function setSummaryQuantiles(array $quantiles): self\n```\n\nReturns name.\n```php\npublic function name(): string\n```\n\nReturns labels.\n```php\npublic function labels(): array\n```\n\nReturns labels count.\n```php\npublic function labelsCount(): int\n```\n\nReturns histogram buckets.\n```php\npublic function buckets(): array\n```\n\nReturns summary quantiles.\n```php\npublic function quantiles(): array\n```\n\nReturns summary TTL.\n```php\npublic function ttlInSeconds(): int\n```\n\nExports HELP.\n```php\npublic function exportHelp(): string\n```\n\nExports TYPE.\n```php\npublic function exportType(string $type): string\n```\n\nExports value (counter, gauge, histogram _sum and _count, summary _sum and _count).\n```php\npublic function exportValue(float|int $value, array $labelValues, string $suffixName = ''): string\n```\n\nExports value (histogram).\n```php\npublic function exportHistogramValue(string $bucket, int $value, array $labelValues): string\n```\n\nExports value (summary).\n```php\npublic function exportSummaryValue(float $quantile, array $values, array $labelValues): string\n```\n\n## Registry\nRegisters metric.\n```php\npublic function register(Collector ...$collectors): void\n```\n\nUnregisters metric.\n```php\npublic function unregister(Collector ...$collectors): void\n```\n\nReturns raw metrics registered (descriptor + samples) as iterable.\n```php\npublic function collect(): iterable\n```\n\nReturns text of metrics registered as string.\n```php\npublic function expose(): string\n```\n\nRegisters metric in the default Registry (singleton).\n```php\npublic static function registerInDefault(Collector $collector): void\n```\n\nReturns the default Registry (singleton).\n```php\npublic static function getDefault(): self\n```\n\n## Storage (Adapter interface)\nReturns metrics (counter, gauge, histogram and summary) as iterable.  \nIf metric type and name is provided it will return only the specify metric.\n```php\npublic function collect(string $metricType = '', string $metricName = ''): iterable\n```\n\nReturns text of metrics (counter, gauge, histogram and summary) as iterable.  \nIf metric type and name is provided it will return only the specify metric.\n```php\npublic function expose(string $metricType = '', string $metricName = ''): iterable\n```\n\nUpdates counter metric.\n```php\npublic function updateCounter(Descriptor $descriptor, float|int $value = 1, array $labelValues = []): void\n```\n\nUpdates gauge metric.\n```php\npublic function updateGauge(Descriptor $descriptor, Operation $operation, float|int $value = 1, array $labelValues = []): void\n```\n\nAdds sample to histogram metric.\n```php\npublic function updateHistogram(Descriptor $descriptor, float $value, array $labelValues = []): void\n```\n\nAdds sample to summary metric.\n```php\npublic function updateSummary(Descriptor $descriptor, float $value, array $labelValues = []): void\n```\n\nRemoves all data saved.\n```php\npublic function wipeStorage(): void\n```\n\nOverrides Time Function for summary metric.\n```php\npublic function setTimeFunction(callable|string $time): void\n```\n\n### InMemory\nReturns text of counters metric as iterable.\n```php\npublic function exposeCounters(string $metricName = ''): iterable\n```\n\nReturns text of gauges metric as iterable.\n```php\npublic function exposeGauges(string $metricName = ''): iterable\n```\n\nReturns text of histograms metric as iterable.\n```php\npublic function exposeHistograms(string $metricName = ''): iterable\n```\n\nReturns text of summaries metric as iterable.\n```php\npublic function exposeSummaries(string $metricName = ''): iterable\n```\n\n### SQLite\nReturns text of counters metric as iterable.\n```php\npublic function exposeCounters(string $metricName = ''): iterable\n```\n\nReturns text of gauges metric as iterable.\n```php\npublic function exposeGauges(string $metricName = ''): iterable\n```\n\nReturns text of histograms metric as iterable.\n```php\npublic function exposeHistograms(string $metricName = ''): iterable\n```\n\nReturns text of summaries metric as iterable.\n```php\npublic function exposeSummaries(string $metricName = ''): iterable\n```\n\nRemove all expired summaries sample according to the TTL.\n```php\npublic function deleteExpiredSummaries(): void\n```\n\nDrop all tables.\n```php\npublic function deleteStorage(): void\n```\n\n## How to Dev\n`composer ci` for php-cs-fixer and phpunit and coverage  \n`composer lint` for php-cs-fixer  \n`composer test` for phpunit and coverage\n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Francoud%2Fprometheus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Francoud%2Fprometheus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Francoud%2Fprometheus/lists"}