Skip to content

Commit 0c58080

Browse files
committed
Starts working on metrics
issue #147
1 parent f53e1b1 commit 0c58080

File tree

5 files changed

+145
-0
lines changed

5 files changed

+145
-0
lines changed
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Modules\Metrics\Application;
6+
7+
use Spiral\RoadRunner\Metrics\CollectorInterface;
8+
9+
interface CollectorRegistryInterface
10+
{
11+
public function register(string $name, CollectorInterface $collector): void;
12+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Modules\Metrics\Application;
6+
7+
use Spiral\RoadRunner\Metrics\CollectorInterface;
8+
9+
interface CollectorRepositoryInterface
10+
{
11+
/**
12+
* @return iterable<non-empty-string, CollectorInterface>
13+
*/
14+
public function findAll(): iterable;
15+
}
Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Modules\Metrics\Application;
6+
7+
use Modules\Metrics\Infrastructure\RoadRunner\Collector;
8+
use Spiral\Boot\Bootloader\Bootloader;
9+
use Spiral\Console\Bootloader\ConsoleBootloader;
10+
use Spiral\Goridge\RPC\RPCInterface;
11+
use Spiral\RoadRunner\Metrics\MetricsFactory;
12+
use Spiral\RoadRunner\Metrics\MetricsInterface;
13+
use Spiral\RoadRunner\Metrics\MetricsOptions;
14+
use Spiral\RoadRunnerBridge\Bootloader\RoadRunnerBootloader;
15+
16+
final class MetricsBootloader extends Bootloader
17+
{
18+
public function defineDependencies(): array
19+
{
20+
return [
21+
RoadRunnerBootloader::class,
22+
MetricsBootloader::class,
23+
];
24+
}
25+
26+
public function defineSingletons(): array
27+
{
28+
return [
29+
MetricsInterface::class => static function (
30+
RPCInterface $rpc,
31+
) {
32+
$factory = new MetricsFactory();
33+
34+
return $factory->create(
35+
$rpc,
36+
new MetricsOptions(
37+
retryAttempts: 2,
38+
retrySleepMicroseconds: 300,
39+
suppressExceptions: true,
40+
),
41+
);
42+
},
43+
44+
CollectorRepositoryInterface::class => Collector::class,
45+
CollectorRegistryInterface::class => Collector::class,
46+
Collector::class => Collector::class,
47+
];
48+
}
49+
50+
public function init(ConsoleBootloader $console): void
51+
{
52+
$console->addConfigureSequence(
53+
sequence: 'metrics:declare',
54+
header: 'Declare metrics',
55+
);
56+
}
57+
}
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Modules\Metrics\Infrastructure\RoadRunner;
6+
7+
use Modules\Metrics\Application\CollectorRegistryInterface;
8+
use Modules\Metrics\Application\CollectorRepositoryInterface;
9+
use Spiral\Core\Attribute\Singleton;
10+
use Spiral\RoadRunner\Metrics\CollectorInterface;
11+
12+
#[Singleton]
13+
final class Collector implements CollectorRepositoryInterface, CollectorRegistryInterface
14+
{
15+
/** @var array<non-empty-string, CollectorInterface> */
16+
private array $collectors = [];
17+
18+
public function register(string $name, CollectorInterface $collector): void
19+
{
20+
$this->collectors[$name] = $collector;
21+
}
22+
23+
public function findAll(): iterable
24+
{
25+
return $this->collectors;
26+
}
27+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace Modules\Metrics\Interfaces\Console\Command;
6+
7+
use Modules\Metrics\Application\CollectorRepositoryInterface;
8+
use Spiral\Console\Attribute\AsCommand;
9+
use Spiral\Console\Command;
10+
use Spiral\RoadRunner\Metrics\MetricsInterface;
11+
12+
#[AsCommand(
13+
name: 'metrics:declare',
14+
description: 'Declare metrics'
15+
)]
16+
final class DeclareCommand extends Command
17+
{
18+
public function __invoke(
19+
MetricsInterface $metrics,
20+
CollectorRepositoryInterface $repository,
21+
): int {
22+
foreach ($repository->findAll() as $name => $collector) {
23+
$this->info("Declaring metric: {$name}");
24+
25+
try {
26+
$metrics->declare($name, $collector);
27+
} catch (\Throwable $e) {
28+
$this->error("Failed to declare metric: {$name}. Reason: {$e->getMessage()}");
29+
}
30+
}
31+
32+
return self::SUCCESS;
33+
}
34+
}

0 commit comments

Comments
 (0)