Installation:
composer require chq81/elastic-apm-bundle
For Symfony Flex projects, this auto-configures the bundle.
Configuration:
Create config/packages/elastic_apm.yaml with minimal required settings:
elastic_apm:
server_url: 'http://localhost:8200' # Default Elastic APM Server URL
service_name: 'your-app-name' # Your Symfony app's name
secret_token: 'your-secret-token' # Required for APM Server auth
First Use Case:
var/log/dev.log) for APM initialization errors.Automatic Transaction Capture:
Custom Transactions:
use Chq81\ElasticApmBundle\ElasticApm;
public function customAction(ElasticApm $apm)
{
$transaction = $apm->startTransaction('custom_transaction_name');
try {
// Business logic here
$apm->captureMessage('Processing started');
} finally {
$transaction->end();
}
}
Contextual Data:
$transaction->setContext('user', ['id' => 123, 'role' => 'admin']);
$transaction->setLabel('priority', 'high');
Error Tracking:
$apm->captureError(new \RuntimeException('Manual error'), [
'custom_field' => 'value',
]);
Doctrine DBAL: Enable via config:
elastic_apm:
db:
enabled: true
Captures SQL queries, durations, and bind parameters.
Monolog Integration:
elastic_apm:
monolog:
enabled: true
level: error # Logs errors to APM
Environment-Specific Config:
Use Symfony’s %kernel.environment% to toggle APM in dev vs. prod:
elastic_apm:
enabled: '%kernel.debug% ? false : true%' # Disable in dev
Secret Token Leaks:
secret_token in elastic_apm.yaml exposes it in version control.parameter_bag or environment variables:
elastic_apm:
secret_token: '%env(APM_SECRET_TOKEN)%'
Performance Overhead:
dev:
elastic_apm:
enabled: false # For local/dev environments
Doctrine Integration Conflicts:
elastic_apm:
db:
connections:
- 'default'
- 'read_replica'
Transaction Naming:
user_${id}_profile).var/log/dev.log for APM initialization errors (e.g., invalid server_url).curl -v http://localhost:8200
service_name is correct in Kibana.Custom Spans:
$span = $apm->startSpan('messenger_handle');
$span->end();
Middleware Integration:
ElasticApmEvent subscriber to hook into Symfony events:use Chq81\ElasticApmBundle\Event\ElasticApmEvent;
public function onKernelRequest(ElasticApmEvent $event)
{
$event->getTransaction()->setLabel('custom', 'value');
}
Agent Configuration:
elastic_apm:
agent:
capture_body: 'all' # Log request/response bodies
ignore_urls: ['/health'] # Exclude URLs
Async Processing:
$apm->startTransaction('cron_job');
try {
// Long task...
} finally {
$apm->getCurrentTransaction()->end();
}
How can I help you explore Laravel packages today?