A comprehensive Magento 2 module that exposes essential Magento metrics in Prometheus format, enabling powerful monitoring and observability for your e-commerce platform.
- π Rich Metrics Collection: Monitors orders, products, customers, CMS content, cron jobs, indexers, and more
- π§ Configurable Metrics: Enable/disable specific metrics through Magento admin interface
- π Secure Access: Bearer token authentication support to protect your metrics endpoint
- β‘ Performance Optimized: Efficient cron-based data aggregation to minimize performance impact
- π― Prometheus Ready: Native Prometheus format output for seamless integration
- π Extensible Architecture: Easy to add custom metrics with clean interfaces
- Installation
- Configuration
- Prometheus Setup
- Available Metrics
- Security
- Custom Metrics
- CLI Commands
- Architecture
- Troubleshooting
- Contributing
- License
- Magento 2.3.x or higher
- PHP 7.4 or higher
- Composer
composer require run_as_root/magento2-prometheus-exporter
php bin/magento setup:upgrade
php bin/magento setup:di:compile
php bin/magento cache:flush
After installation, your metrics endpoint will be available at:
https://your-magento-store.com/metrics
Navigate to Stores β Configuration β Prometheus β Metric Configuration to:
- Enable/disable specific metric collectors
- Configure authentication settings
- Set collection intervals
- Manage metric labels and groupings
The module automatically registers a cron job that runs every minute to aggregate metrics. The job uses a dedicated cron group: run_as_root_prometheus_metrics_aggregator
.
Add the following scrape configuration to your prometheus.yml
:
scrape_configs:
- job_name: 'magento-2'
scrape_interval: 5m
scrape_timeout: 60s
metrics_path: /metrics
static_configs:
- targets:
- 'your-magento-store.com'
For production environments, secure your metrics endpoint:
scrape_configs:
- job_name: 'magento-2'
scrape_interval: 5m
scrape_timeout: 60s
metrics_path: /metrics
authorization:
type: 'Bearer'
credentials: 'your-bearer-token-here'
static_configs:
- targets:
- 'your-magento-store.com'
scrape_configs:
- job_name: 'magento-2'
scrape_interval: 5m
scrape_timeout: 60s
metrics_path: /metrics
authorization:
type: 'Bearer'
credentials: 'your-bearer-token-here'
static_configs:
- targets:
- 'your-magento-store.com'
relabel_configs:
- source_labels: [__address__]
target_label: instance
replacement: 'magento-production'
Metric | Type | Labels | Description |
---|---|---|---|
magento_orders_count_total |
gauge | status , store_code |
Total count of orders by status and store |
magento_orders_amount_total |
gauge | status , store_code |
Total revenue by order status and store |
magento_order_items_count_total |
gauge | status , store_code |
Total count of order items |
Metric | Type | Labels | Description |
---|---|---|---|
magento_products_by_type_count_total |
gauge | product_type |
Count of products by type (simple, configurable, etc.) |
magento_catalog_category_count_total |
gauge | status , menu_status , store_code |
Count of categories by status |
Metric | Type | Labels | Description |
---|---|---|---|
magento_eav_attribute_count_total |
gauge | - | Total count of EAV attributes |
magento_eav_attribute_options_above_recommended_level_total |
gauge | - | Count of attributes with more than 100 options (performance risk) |
Metric | Type | Labels | Description |
---|---|---|---|
magento_customer_count_total |
gauge | store_code |
Total count of registered customers |
Metric | Type | Labels | Description |
---|---|---|---|
magento_cms_block_count_total |
gauge | store_code |
Count of CMS blocks |
magento_cms_page_count_total |
gauge | store_code |
Count of CMS pages |
Metric | Type | Labels | Description |
---|---|---|---|
magento_cronjob_count_total |
gauge | status , job_code |
Count of cron jobs by status |
magento_cronjob_broken_count_total |
gauge | - | Count of broken cron jobs |
magento_indexer_backlog_count_total |
gauge | title |
Count of items in indexer backlog |
Metric | Type | Labels | Description |
---|---|---|---|
magento_store_count_total |
gauge | status |
Count of stores by status |
magento_website_count_total |
gauge | - | Total count of websites |
magento_shipments_count_total |
counter | source , store_code |
Count of shipments created |
- Generate Bearer Token: Navigate to Magento Admin β System β Integrations
- Create New Integration: Set up API access with appropriate permissions
- Configure Token: Use the generated access token in your Prometheus configuration
- Always use HTTPS for metrics endpoints in production
- Regularly rotate authentication tokens
- Restrict access to metrics endpoint via firewall rules
- Monitor access logs for unusual activity
Consider restricting access to your Prometheus server IPs:
location /metrics {
allow 10.0.0.0/8; # Your Prometheus server
allow 172.16.0.0/12; # Internal network
deny all;
try_files $uri $uri/ /index.php?$args;
}
- Implement the Interface:
<?php
namespace YourNamespace\YourModule\Aggregator;
use RunAsRoot\PrometheusExporter\Api\MetricAggregatorInterface;
use RunAsRoot\PrometheusExporter\Service\UpdateMetricService;
class CustomMetricAggregator implements MetricAggregatorInterface
{
private UpdateMetricService $updateMetricService;
public function __construct(UpdateMetricService $updateMetricService)
{
$this->updateMetricService = $updateMetricService;
}
public function aggregate(): void
{
// Your metric collection logic here
$value = $this->calculateCustomMetric();
$this->updateMetricService->update(
'your_custom_metric_total',
(string) $value,
'gauge',
'Description of your custom metric',
['label1' => 'value1', 'label2' => 'value2']
);
}
private function calculateCustomMetric(): int
{
// Implement your metric calculation
return 42;
}
}
- Register in DI Configuration (
etc/di.xml
):
<type name="RunAsRoot\PrometheusExporter\Metric\MetricAggregatorPool">
<arguments>
<argument name="items" xsi:type="array">
<item name="YourCustomAggregator" xsi:type="object">YourNamespace\YourModule\Aggregator\CustomMetricAggregator</item>
</argument>
</arguments>
</type>
<?php
namespace YourNamespace\YourModule\Aggregator;
use Magento\Review\Model\ResourceModel\Review\CollectionFactory;
use RunAsRoot\PrometheusExporter\Api\MetricAggregatorInterface;
use RunAsRoot\PrometheusExporter\Service\UpdateMetricService;
class ProductRatingAggregator implements MetricAggregatorInterface
{
private CollectionFactory $reviewCollectionFactory;
private UpdateMetricService $updateMetricService;
public function __construct(
CollectionFactory $reviewCollectionFactory,
UpdateMetricService $updateMetricService
) {
$this->reviewCollectionFactory = $reviewCollectionFactory;
$this->updateMetricService = $updateMetricService;
}
public function aggregate(): void
{
$collection = $this->reviewCollectionFactory->create()
->addStatusFilter(\Magento\Review\Model\Review::STATUS_APPROVED);
$averageRating = $collection->getConnection()
->fetchOne('SELECT AVG(rating_value) FROM rating_option_vote');
$this->updateMetricService->update(
'magento_product_average_rating',
(string) round($averageRating, 2),
'gauge',
'Average product rating across all approved reviews'
);
}
}
php bin/magento run_as_root:metrics:collect
php bin/magento run_as_root:metrics:show
php bin/magento run_as_root:metrics:clear
- Cron Execution: Every minute, the
run_as_root_prometheus_metrics_aggregator
cron group executes - Metric Aggregation: Each enabled aggregator collects and processes data
- Data Storage: Aggregated metrics are stored in
run_as_root_prometheus_metrics
table - Endpoint Response:
/metrics
controller serves data in Prometheus format
- MetricAggregatorInterface: Contract for all metric collectors
- MetricAggregatorPool: Registry of all available aggregators
- UpdateMetricService: Service for storing metric data
- PrometheusController: HTTP endpoint for serving metrics
The module creates a dedicated table run_as_root_prometheus_metrics
with the following structure:
metric_id
: Primary keymetric_code
: Unique metric identifiermetric_value
: Numeric valuemetric_type
: Type (gauge, counter, histogram)metric_help
: Description textmetric_labels
: JSON-encoded labelsupdated_at
: Last update timestamp
# Check cron status
php bin/magento cron:status
# Run metrics collection manually
php bin/magento run_as_root:metrics:collect
# Check system logs
tail -f var/log/system.log | grep prometheus
- Verify web server has read access to Magento files
- Check Magento file permissions:
find . -type f -exec chmod 644 {} \;
- Ensure proper ownership:
chown -R www-data:www-data .
- Reduce collection frequency in cron configuration
- Disable unused metric aggregators in admin configuration
- Consider implementing metric data retention policies
Enable debug logging by adding to app/etc/env.php
:
'system' => [
'default' => [
'prometheus_exporter' => [
'debug' => '1'
]
]
]
Monitor the impact of metric collection:
# Check metric collection execution time
grep "prometheus.*aggregator" var/log/system.log
# Monitor database table size
SELECT COUNT(*) as total_metrics,
MAX(updated_at) as last_update
FROM run_as_root_prometheus_metrics;
We welcome contributions! Here's how you can help:
- Fork the repository
- Clone your fork:
git clone https://gitlab.com/your-username/magento2-prometheus-exporter.git
- Install dependencies:
composer install
- Create a feature branch:
git checkout -b feature/your-feature-name
- Follow Magento 2 coding standards
- Write unit tests for new features
- Update documentation for new metrics or features
- Use meaningful commit messages
- Ensure all tests pass:
vendor/bin/phpunit
- Update the CHANGELOG.md
- Submit a pull request with a clear description
- Respond to code review feedback
Please include:
- Magento version
- PHP version
- Module version
- Detailed error messages
- Steps to reproduce
This project is licensed under the MIT License - see the LICENSE file for details.
- run_as_root GmbH - Original development and maintenance
- Prometheus Community - For the excellent monitoring toolkit
- Magento Community - For feedback and contributions
- Email: [email protected]
- GitLab Issues: Report a bug
- Documentation: Wiki
Made with β€οΈ by run_as_root