Home

Awesome

Magento 2 Prometheus Exporter

Branch stable codecov pipeline status

This Magento 2 Module exposes a new route under /metrics with Magento 2 specific metrics in the format of prometheus. The different metrics are grouped into modules and can be enabled/disabled via the Magento Backend.

Installation

Install the Module via composer by running:

composer require run-as-root/magento2-prometheus-exporter
php bin/magento setup:upgrade

Module Configuration

The modules system configuration is located under Stores -> Configuration -> Prometheus -> Metric Configuration. You can enable or disable specific metrics by using the multiselect.

Prometheus Configuration

After installing the Magento Module, your Prometheus needs to get pointed to your Magento Metrics endpoint. To do so, add the following lines to your prometheus.yml under scrape_configs:

- job_name: 'Magento 2 Exporter'
  scrape_interval: 5m
  scrape_timeout: 60s
  metrics_path: /metrics
  # The bearer token can be generated in the Magento Admin. Using the auth is optional.
  # bearer_token: YOUR_BEARER_TOKEN
  static_configs:
  - targets: 
    - your-magento-url

Authorization

Your metrics endpoint should not be available to everyone, so the use of authorization is recommended. The module provides support for authorization tokens via Magento Backend.

For Basic or Bearer authorization, the scrape job should be extended like this:

- job_name: 'Magento 2 Exporter'
  [..]
  authorization:
    type: 'Bearer'
    credentials: "{{ magento2_metrics_password }}"

Module functionality

The module registers a cron job that runs every minute. The cronjob is responsible for aggregating the metric data. The aggregated data is stored in the table run_as_root_prometheus_metrics. The added controller collects the data stored in the table and renders the correct response for prometheus.

Metrics

The following metrics will be collected:

MetricLabelsTYPEHelp
magento_orders_count_totalstatus, store_codegaugeTotal count of Magento Orders.
magento_orders_amount_totalstatus, store_codegaugeTotal amount of all Magento Orders.
magento_order_items_count_totalstatus, store_codegaugeTotal count of orderitems.
magento_cms_block_count_totalstore_codegaugeTotal count of available cms blocks.
magento_cms_page_count_totalstore_codegaugeTotal count of available cms pages.
magento_customer_count_totalstore_codegaugeTotal count of available customers.
magento_cronjob_broken_count_totalgaugeBroken CronJobs occur when when status is pending but execution_time is set.
magento_cronjob_count_totalstatus, job_codegaugeTotal count of available CronJob Count.
magento_indexer_backlog_count_totaltitlegaugeTotal count of backlog item in indexer (the data from indexer:status command).
magento_shipments_count_totalsource, store_codecounterCount of Shipments created by store and source.
magento_catalog_category_count_totalstatus, menu_status, store_codegaugeCount of Categories by store, status and menu status.
magento_store_count_totalstatusgaugeTotal count of Stores by status.
magento_website_count_totalgaugeTotal count of websites.
magento_products_by_type_count_totalproject_typegaugeTotal count of products by type.

Add your own Metric

To add a new metric, you need to implement the \RunAsRoot\PrometheusExporter\Api\MetricAggregatorInterface. The metric aggregator object is responsible for collecting the necessary information for the specific metric from magento and then add a new metric record. New records can be easily added via \RunAsRoot\PrometheusExporter\Service\UpdateMetricService.

In addition to the implementation of the MetricAggregatorInterface, you have to add your specific Aggregator to the MetricAggregatorPool defined in the di.xml. For example:

<type name="RunAsRoot\PrometheusExporter\Metric\MetricAggregatorPool">
    <arguments>
        <argument name="items" xsi:type="array">
            <item name="OrderAmountAggregator" xsi:type="object">RunAsRoot\PrometheusExporter\Aggregator\Order\OrderAmountAggregator</item>
            <item name="OrderCountAggregator" xsi:type="object">RunAsRoot\PrometheusExporter\Aggregator\Order\OrderCountAggregator</item>
            <item name="OrderItemAmountAggregator" xsi:type="object">RunAsRoot\PrometheusExporter\Aggregator\Order\OrderItemAmountAggregator</item>
            <item name="OrderItemCountAggregator" xsi:type="object">RunAsRoot\PrometheusExporter\Aggregator\Order\OrderItemCountAggregator</item>
        </argument>
    </arguments>
</type>

Contribution

If you have something to contribute, weither it's a feature, a feature request, an issue or something else, feel free to. There are no contribution guidelines.