This commit is contained in:
Daniil Zobov 2021-07-07 06:51:35 -04:00 committed by GitHub
commit a1f935bb8a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 75 additions and 59 deletions

View file

@ -18,6 +18,8 @@ composer require superbalist/laravel-prometheus-exporter
``` ```
Register the service provider in app.php Register the service provider in app.php
#### Laravel
```php ```php
'providers' => [ 'providers' => [
// ... // ...
@ -33,6 +35,11 @@ Register the facade in app.php
] ]
``` ```
#### Lumen
```php
$app->register(Superbalist\LaravelPrometheusExporter\LumenPrometheusServiceProvider::class);
```
## Configuration ## Configuration
The package has a default configuration which uses the following environment variables. The package has a default configuration which uses the following environment variables.

View file

@ -0,0 +1,25 @@
<?php
namespace Superbalist\LaravelPrometheusExporter;
class LumenPrometheusServiceProvider extends PrometheusServiceProvider
{
/**
* Publish files.
*/
protected function publishFiles()
{
// do nothing
}
/**
* Load routes.
*/
protected function loadRoutes()
{
$this->app->router
->group(['namespace' => 'Superbalist\LaravelPrometheusExporter'], function ($router) {
require __DIR__ . '/lumen_routes.php';
});
}
}

View file

@ -2,40 +2,25 @@
namespace Superbalist\LaravelPrometheusExporter; namespace Superbalist\LaravelPrometheusExporter;
use Illuminate\Contracts\Routing\ResponseFactory; use Illuminate\Http\Response;
use Illuminate\Routing\Controller; use Illuminate\Routing\Controller;
use Prometheus\RenderTextFormat; use Prometheus\RenderTextFormat;
class MetricsController extends Controller class MetricsController extends Controller
{ {
/**
* @var ResponseFactory
*/
protected $responseFactory;
/** /**
* @var PrometheusExporter * @var PrometheusExporter
*/ */
protected $prometheusExporter; protected $prometheusExporter;
/** /**
* @param ResponseFactory $responseFactory
* @param PrometheusExporter $prometheusExporter * @param PrometheusExporter $prometheusExporter
*/ */
public function __construct(ResponseFactory $responseFactory, PrometheusExporter $prometheusExporter) public function __construct(PrometheusExporter $prometheusExporter)
{ {
$this->responseFactory = $responseFactory;
$this->prometheusExporter = $prometheusExporter; $this->prometheusExporter = $prometheusExporter;
} }
/**
* @return ResponseFactory
*/
public function getResponseFactory()
{
return $this->responseFactory;
}
/** /**
* @return PrometheusExporter * @return PrometheusExporter
*/ */
@ -59,6 +44,6 @@ class MetricsController extends Controller
$renderer = new RenderTextFormat(); $renderer = new RenderTextFormat();
$result = $renderer->render($metrics); $result = $renderer->render($metrics);
return $this->responseFactory->make($result, 200, ['Content-Type' => RenderTextFormat::MIME_TYPE]); return Response::create($result, 200, ['Content-Type' => RenderTextFormat::MIME_TYPE]);
} }
} }

View file

@ -14,12 +14,11 @@ class PrometheusServiceProvider extends ServiceProvider
*/ */
public function boot() public function boot()
{ {
$this->publishes([ $this->publishFiles();
__DIR__ . '/../config/prometheus.php' => config_path('prometheus.php'), $this->loadRoutes();
]);
if (config('prometheus.metrics_route_enabled')) { if (config('prometheus.metrics_route_enabled')) {
$this->loadRoutesFrom(__DIR__ . '/routes.php'); $this->loadRoutes();
} }
$exporter = $this->app->make(PrometheusExporter::class); /* @var PrometheusExporter $exporter */ $exporter = $this->app->make(PrometheusExporter::class); /* @var PrometheusExporter $exporter */
@ -29,6 +28,24 @@ class PrometheusServiceProvider extends ServiceProvider
} }
} }
/**
* Publish files.
*/
protected function publishFiles()
{
$this->publishes([
__DIR__ . '/../config/prometheus.php' => config_path('prometheus.php'),
]);
}
/**
* Load routes.
*/
protected function loadRoutes()
{
$this->loadRoutesFrom(__DIR__ . '/laravel_routes.php');
}
/** /**
* Register bindings in the container. * Register bindings in the container.
*/ */

7
src/laravel_routes.php Normal file
View file

@ -0,0 +1,7 @@
<?php
Route::get(config('prometheus.metrics_route_path'), [
'as' => config('prometheus.metrics_route_name'),
'middleware' => config('prometheus.metrics_route_middleware'),
'uses' => \Superbalist\LaravelPrometheusExporter\MetricsController::class . '@getMetrics',
]);

7
src/lumen_routes.php Normal file
View file

@ -0,0 +1,7 @@
<?php
$router->get(config('prometheus.metrics_route_path'), [
'as' => config('prometheus.metrics_route_name'),
'middleware' => config('prometheus.metrics_route_middleware'),
'uses' => 'MetricsController@getMetrics'
]);

View file

@ -1,17 +0,0 @@
<?php
/** @var \Illuminate\Routing\Route $route */
$route = Route::get(
config('prometheus.metrics_route_path'),
\Superbalist\LaravelPrometheusExporter\MetricsController::class . '@getMetrics'
);
if ($name = config('prometheus.metrics_route_name')) {
$route->name($name);
}
$middleware = config('prometheus.metrics_route_middleware');
if ($middleware) {
$route->middleware($middleware);
}

View file

@ -2,8 +2,6 @@
namespace Tests; namespace Tests;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Response;
use Mockery; use Mockery;
use PHPUnit\Framework\TestCase; use PHPUnit\Framework\TestCase;
use Prometheus\RenderTextFormat; use Prometheus\RenderTextFormat;
@ -14,35 +12,22 @@ class MetricsControllerTest extends TestCase
{ {
public function testConstruct() public function testConstruct()
{ {
$responseFactory = Mockery::mock(ResponseFactory::class);
$exporter = Mockery::mock(PrometheusExporter::class); $exporter = Mockery::mock(PrometheusExporter::class);
$controller = new MetricsController($responseFactory, $exporter); $controller = new MetricsController($exporter);
$this->assertSame($responseFactory, $controller->getResponseFactory());
$this->assertSame($exporter, $controller->getPrometheusExporter()); $this->assertSame($exporter, $controller->getPrometheusExporter());
} }
public function testGetMetrics() public function testGetMetrics()
{ {
$response = Mockery::mock(Response::class);
$responseFactory = Mockery::mock(ResponseFactory::class);
$responseFactory->shouldReceive('make')
->once()
->withArgs([
"\n",
200,
['Content-Type' => RenderTextFormat::MIME_TYPE],
])
->andReturn($response);
$exporter = Mockery::mock(PrometheusExporter::class); $exporter = Mockery::mock(PrometheusExporter::class);
$exporter->shouldReceive('export') $exporter->shouldReceive('export')
->once() ->once()
->andReturn([]); ->andReturn([]);
$controller = new MetricsController($responseFactory, $exporter); $controller = new MetricsController($exporter);
$r = $controller->getMetrics(); $response = $controller->getMetrics();
$this->assertSame($response, $r); $this->assertSame(200, $response->getStatusCode());
$this->assertSame(RenderTextFormat::MIME_TYPE, $response->headers->get('Content-Type'));
} }
} }