Skip to content

Commit 4f35f3c

Browse files
committed
refactor(core): Support zlodes/prometheus-client 2.x
BREAKING CHANGE: Configuration changed
1 parent ab09e30 commit 4f35f3c

21 files changed

+1257
-689
lines changed

README.md

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ composer require zlodes/prometheus-client-laravel
1414

1515
### Register a route for the metrics controller
1616

17-
Your application is responsible for metrics route registration. There is a ready to use [controller](src/Http/MetricsExporterController.php). You can configure groups, middleware or prefixes as you want.
17+
Your application is responsible for metrics route registration.
18+
There is a [controller](src/Http/MetricsExporterController.php) ready to use.
19+
You can configure groups, middleware or prefixes as you want.
1820

1921
Example:
2022

@@ -25,14 +27,15 @@ use Zlodes\PrometheusClient\Laravel\Http\MetricsExporterController;
2527
Route::get('/metrics', MetricsExporterController::class);
2628
```
2729

28-
### Configure a Storage for metrics [optional]
30+
### Configure Storage for metrics [optional]
2931

30-
By-default, it uses [RedisStorage](src/Storage/RedisStorage.php). If you want to use other storage, you can do it easily following these three steps:
32+
By default, it uses Redis storage.
33+
If you want to use other storage, you can do it easily following these three steps:
3134

3235
1. Create a class implements `Storage` interface.
3336
2. Publish a config:
3437
```shell
35-
php artisan vendor:publish --tag=prometheus-exporter
38+
php artisan vendor:publish --tag=prometheus-client
3639
```
3740
3. Set your `storage` class in the config.
3841

@@ -94,6 +97,14 @@ $this->callAfterResolving(
9497
| `php artisan metrics:clear` | Clears metrics storage |
9598
| `metrics:collect-scheduled` | Runs `ScheduledCollectors`. Using by Scheduler |
9699

100+
## Upgrade guide
101+
102+
### From 1.x to 2.x
103+
104+
1. Run `php artisan vendor:publish --tag=prometheus-client` to publish a brand-new config
105+
2. Configure the new config based on the previous one (`prometheus-exporter.php`)
106+
3. Drop legacy config (`prometheus-exporter.php`)
107+
97108
## Testing
98109

99110
### Run tests

composer.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
"ext-redis": "*",
1515
"laravel/framework": "^9.0 || ^10.0",
1616
"webmozart/assert": "^1.11",
17-
"zlodes/prometheus-client": "^1.1.2"
17+
"zlodes/prometheus-client": "2.x-dev"
1818
},
1919
"require-dev": {
2020
"ergebnis/composer-normalize": "dev-main",

config/prometheus-exporter.php renamed to config/prometheus-client.php

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,10 @@
99
'enabled' => (bool) env('PROMETHEUS_CLIENT_ENABLED', true),
1010

1111
/**
12-
* Here you can configure a Storage for metrics
13-
*
14-
* Available options:
15-
* - \Zlodes\PrometheusClient\Storage\InMemoryStorage::class
16-
* - \Zlodes\PrometheusClient\Laravel\Storage\RedisStorage::class
17-
* - Your own storage implements Storage interface
12+
* Here you can configure a Storage for metrics.
13+
* Available options: "null", "in_memory", "redis"
1814
*/
19-
'storage' => \Zlodes\PrometheusClient\Laravel\Storage\RedisStorage::class,
15+
'storage' => env('PROMETHEUS_CLIENT_STORAGE', 'redis'),
2016

2117
/**
2218
* Here you can specify a list of your SchedulableCollectors

src/Command/ClearMetrics.php

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,25 @@
55
namespace Zlodes\PrometheusClient\Laravel\Command;
66

77
use Illuminate\Console\Command;
8-
use Zlodes\PrometheusClient\Storage\Storage;
8+
use Zlodes\PrometheusClient\Storage\Contracts\CounterStorage;
9+
use Zlodes\PrometheusClient\Storage\Contracts\GaugeStorage;
10+
use Zlodes\PrometheusClient\Storage\Contracts\HistogramStorage;
11+
use Zlodes\PrometheusClient\Storage\Contracts\SummaryStorage;
912

1013
final class ClearMetrics extends Command
1114
{
1215
protected $signature = 'metrics:clear';
1316
protected $description = 'Drop all the metrics values';
1417

15-
public function handle(Storage $storage): void
16-
{
17-
$storage->clear();
18+
public function handle(
19+
CounterStorage $counterStorage,
20+
GaugeStorage $gaugeStorage,
21+
HistogramStorage $histogramStorage,
22+
SummaryStorage $summaryStorage,
23+
): void {
24+
$counterStorage->clearCounters();
25+
$gaugeStorage->clearGauges();
26+
$histogramStorage->clearHistograms();
27+
$summaryStorage->clearSummaries();
1828
}
1929
}

src/Command/ListMetrics.php

Lines changed: 3 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -5,17 +5,13 @@
55
namespace Zlodes\PrometheusClient\Laravel\Command;
66

77
use Illuminate\Console\Command;
8-
use JsonException;
98
use Zlodes\PrometheusClient\Registry\Registry;
109

1110
final class ListMetrics extends Command
1211
{
1312
protected $signature = 'metrics:list';
1413
protected $description = 'Outputs a table with all the registered metrics';
1514

16-
/**
17-
* @throws JsonException
18-
*/
1915
public function handle(Registry $registry): void
2016
{
2117
$metrics = [];
@@ -26,10 +22,9 @@ public function handle(Registry $registry): void
2622

2723
$metrics[] = [
2824
$counter,
29-
$metric->getName(),
30-
$metric->getType()->value,
31-
$metric->getHelp(),
32-
json_encode($metric->getInitialLabels(), JSON_THROW_ON_ERROR | JSON_FORCE_OBJECT),
25+
$metric->name,
26+
$metric->getPrometheusType(),
27+
$metric->help,
3328
];
3429
}
3530

@@ -38,7 +33,6 @@ public function handle(Registry $registry): void
3833
'Name',
3934
'Type',
4035
'Help',
41-
'Initial labels',
4236
];
4337

4438
$this->table($tableHeader, $metrics);

src/ServiceProvider.php

Lines changed: 12 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,9 @@
1111
use Webmozart\Assert\Assert;
1212
use Zlodes\PrometheusClient\Collector\CollectorFactory;
1313
use Zlodes\PrometheusClient\Exporter\Exporter;
14-
use Zlodes\PrometheusClient\Exporter\StoredMetricsExporter;
14+
use Zlodes\PrometheusClient\Exporter\FetcherExporter;
15+
use Zlodes\PrometheusClient\Fetcher\Fetcher;
16+
use Zlodes\PrometheusClient\Fetcher\StoredMetricsFetcher;
1517
use Zlodes\PrometheusClient\KeySerialization\JsonSerializer;
1618
use Zlodes\PrometheusClient\KeySerialization\Serializer;
1719
use Zlodes\PrometheusClient\Laravel\Command\ClearMetrics;
@@ -20,28 +22,27 @@
2022
use Zlodes\PrometheusClient\Laravel\ScheduledCollector\SchedulableCollector;
2123
use Zlodes\PrometheusClient\Laravel\ScheduledCollector\SchedulableCollectorArrayRegistry;
2224
use Zlodes\PrometheusClient\Laravel\ScheduledCollector\SchedulableCollectorRegistry;
25+
use Zlodes\PrometheusClient\Laravel\Storage\StorageConfigurator;
2326
use Zlodes\PrometheusClient\Registry\ArrayRegistry;
2427
use Zlodes\PrometheusClient\Registry\Registry;
25-
use Zlodes\PrometheusClient\Storage\NullStorage;
26-
use Zlodes\PrometheusClient\Storage\Storage;
2728

2829
final class ServiceProvider extends BaseServiceProvider
2930
{
3031
public function register(): void
3132
{
32-
$this->mergeConfigFrom(__DIR__ . '/../config/prometheus-exporter.php', 'prometheus-exporter');
33+
$this->mergeConfigFrom(__DIR__ . '/../config/prometheus-client.php', 'prometheus-client');
3334

3435
$this->app->singleton(CollectorFactory::class);
3536
$this->app->singleton(Registry::class, ArrayRegistry::class);
36-
$this->app->singleton(Exporter::class, StoredMetricsExporter::class);
37+
$this->app->singleton(Fetcher::class, StoredMetricsFetcher::class);
38+
$this->app->singleton(Exporter::class, FetcherExporter::class);
3739

3840
$this->app->singleton(Serializer::class, JsonSerializer::class);
3941

40-
$this->registerStorage();
4142
$this->registerSchedulableCollectors();
4243
}
4344

44-
public function boot(): void
45+
public function boot(StorageConfigurator $storageConfigurator): void
4546
{
4647
if ($this->app->runningInConsole()) {
4748
$this->commands([
@@ -51,34 +52,11 @@ public function boot(): void
5152
]);
5253

5354
$this->publishes([
54-
__DIR__ . '/../config/prometheus-exporter.php' => config_path('prometheus-exporter.php'),
55-
], 'prometheus-exporter');
55+
__DIR__ . '/../config/prometheus-client.php' => config_path('prometheus-client.php'),
56+
], 'prometheus-client');
5657
}
57-
}
58-
59-
private function registerStorage(): void
60-
{
61-
$this->app->singleton(Storage::class, static function (Application $app): Storage {
62-
/** @var Repository $config */
63-
$config = $app->make(Repository::class);
64-
65-
$clientEnabled = $config->get('prometheus-exporter.enabled') ?? true;
66-
Assert::boolean($clientEnabled);
6758

68-
if ($clientEnabled === false) {
69-
return new NullStorage();
70-
}
71-
72-
/** @psalm-var class-string<Storage> $storageClass */
73-
$storageClass = $config->get('prometheus-exporter.storage');
74-
Assert::true(
75-
is_a($storageClass, Storage::class, true),
76-
'Config value in prometheus-exporter.storage must be a class-string<Storage>'
77-
);
78-
79-
/** @var Storage */
80-
return $app->make($storageClass);
81-
});
59+
$storageConfigurator->configure();
8260
}
8361

8462
private function registerSchedulableCollectors(): void
@@ -92,7 +70,7 @@ static function (SchedulableCollectorRegistry $registry, Application $app): void
9270
$config = $app->make(Repository::class);
9371

9472
/** @psalm-var list<class-string<SchedulableCollector>> $collectors */
95-
$collectors = $config->get('prometheus-exporter.schedulable_collectors');
73+
$collectors = $config->get('prometheus-client.schedulable_collectors');
9674
Assert::allStringNotEmpty($collectors);
9775

9876
foreach ($collectors as $collectorClass) {

0 commit comments

Comments
 (0)