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
#### Laravel
```php
'providers' => [
// ...
@ -33,6 +35,11 @@ Register the facade in app.php
]
```
#### Lumen
```php
$app->register(Superbalist\LaravelPrometheusExporter\LumenPrometheusServiceProvider::class);
```
## Configuration
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;
use Illuminate\Contracts\Routing\ResponseFactory;
use Illuminate\Http\Response;
use Illuminate\Routing\Controller;
use Prometheus\RenderTextFormat;
class MetricsController extends Controller
{
/**
* @var ResponseFactory
*/
protected $responseFactory;
/**
* @var PrometheusExporter
*/
protected $prometheusExporter;
/**
* @param ResponseFactory $responseFactory
* @param PrometheusExporter $prometheusExporter
*/
public function __construct(ResponseFactory $responseFactory, PrometheusExporter $prometheusExporter)
public function __construct(PrometheusExporter $prometheusExporter)
{
$this->responseFactory = $responseFactory;
$this->prometheusExporter = $prometheusExporter;
}
/**
* @return ResponseFactory
*/
public function getResponseFactory()
{
return $this->responseFactory;
}
/**
* @return PrometheusExporter
*/
@ -59,6 +44,6 @@ class MetricsController extends Controller
$renderer = new RenderTextFormat();
$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()
{
$this->publishes([
__DIR__ . '/../config/prometheus.php' => config_path('prometheus.php'),
]);
$this->publishFiles();
$this->loadRoutes();
if (config('prometheus.metrics_route_enabled')) {
$this->loadRoutesFrom(__DIR__ . '/routes.php');
$this->loadRoutes();
}
$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.
*/

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