Code Execution Monitoring for Slim based applications.
Server requirements
PHP >= 7.2
Slim >= 4.x
Install
Install the latest package version by:
composer require inspector-apm/inspector-slim
Register On Container
First you have to register the Inspector instance inside the application container in order to make the monitoring agent available within the application.
$container->set('inspector', function () {
$configuration = new \Inspector\Slim\Configuration('INSPECTOR_INGESTION_KEY');
return new \Inspector\Inspector($configuration);
});
If you are using a Slim 4 skeleton you can add a new container definition in app/dependencies.php file:
use DI\ContainerBuilder;
use Psr\Container\ContainerInterface;
return function (ContainerBuilder $containerBuilder) {
$containerBuilder->addDefinitions([
// Other services definitions...
'inspector' => function (ContainerInterface $container) {
$configuration = new \Inspector\Slim\Configuration('INSPECTOR_INGESTION_KEY');
return new \Inspector\Inspector($configuration);
}
]);
}
You can get an INSPECTOR_INGESTION_KEY creating a new project in your Inspector account.
Attach the middleware
To monitor all the incoming HTTP traffic you can attach the middleware globally:
$app->get('/test', function () {
throw new \Exception('My First Exception.');
});
You should receive your first notification in a few seconds.
Add Segments
You can add segments to the transaction's timeline from route functions:
$app->get('/', function (Request $request, Response $response) {
/*
* Retrieve the inspector instance from the container.
*/
$this->get('inspector')->addSegment(function () {
// your code here...
sleep(1);
}, 'sleep');
return $response;
});
If your routes are organized using controllers you need to inject the container in the controller constructor in order to retrieve the inspector agent later during execution:
namespace App\Controllers;
use Psr\Container\ContainerInterface;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
class TestRouteController
{
protected $container;
/**
* Inject the container to retrieve the inspector instance later.
*/
public function __construct(ContainerInterface $container)
{
$this->container = $container;
}
public function __invoke(Request $request, Response $response)
{
// Use the inspector instance from the container.
$this->container->get('inspector')->addSegment(function () {
// your code here...
sleep(1);
}, 'sleep');
$response->getBody()->write('Test route.');
return $response;
}
}