Skip to main content

Export Prometheus metrics from DMARC reports.

Project description

CI and release pipeline Codecov coverage PyPI PyPI - Python Version PyPI - License

dmarcs-metrics-exporter

Export metrics derived from DMARC aggregate reports to Prometheus. This exporter regularly polls for new aggregate report emails via IMAP. The following metrics will be collected and exposed at an HTTP endpoint for Prometheus:

  • dmarc_total: Total number of reported messages.

  • dmarc_compliant_total: Total number of DMARC compliant messages.

  • dmarc_quarantine_total: Total number of quarantined messages.

  • dmarc_reject_total: Total number of rejected messages.

  • dmarc_spf_aligned_total: Total number of SPF algined messages.

  • dmarc_spf_pass_total: Total number of messages with raw SPF pass.

  • dmarc_dkim_aligned_total: Total number of DKIM algined messages.

  • dmarc_dkim_pass_total: Total number of messages with raw DKIM pass.

Each of these metrics is subdivided by the following labels:

  • reporter: Domain from which a DMARC aggregate report originated.

  • from_domain: Domain from which the evaluated email originated.

  • dkim_domain: Domain the DKIM signature is for.

  • spf_domain: Domain used for the SPF check.

In addition, there is a dmarc_invalid_reports_total metric with a count of DMARC report emails from which no report could be parsed. It is subdivided by a single from_email label.

Installation

This describes the manual setup fo dmarc-metrics-exporter. An Ansible role for automated deployment is provided in roles. Further instructions for Ansible are given in the readme file provided in that directory.

It is best to run dmarc-metrics-exporter under a separate system user account. Create one for example with

adduser --system --group dmarc-metrics

Then you can install dmarc-metrics-exporter with pip from PyPI for that user:

sudo -u dmarc-metrics pip3 install dmarc-metrics-exporter

You will need a location to store the metrics.db that is writable by that user, for example:

mkdir /var/lib/dmarc-metrics-exporter
chown dmarc-metrics:dmarc-metrics /var/lib/dmarc-metrics-exporter

Configuration

To run dmarc-metrics-exporter a configuration file in JSON format is required. The default location is /etc/dmarc-metrics-exporter.json.

Because the configuration file will contain the IMAP password, make sure to ensure proper permissions on it, for example:

chown root:dmarc-metrics /etc/dmarc-metrics-exporter.json
chmod 640 /etc/dmarc-metrics-exporter.json

An example configuration file is provided in this repository in config/dmarc-metrics-exporter.sample.json.

The following configuration options are available:

  • listen_addr (string, default "127.0.0.1"): Listen address for the HTTP endpoint. Use "0.0.0.0" if running in a dockerized environment.

  • port (number, default 9797): Port to listen on for the HTTP endpoint.

  • imap (object, required): IMAP configuration to check for aggregate reports.

    • host (string, default "localhost"): Hostname of IMAP server to connect to.

    • port (number, default 993): Port of the IMAP server to connect to.

    • username (string, required): Login username for the IMAP connection.

    • password: (string, required): Login password for the IMAP connection.

    • use_ssl: (boolean, default true): Whether to use SSL encryption for the connection. Disabling this will transmit the password in clear text! Currently, there is no support for STARTTLS.

    • verify_certificate: (boolean, default true): Whether to verify the server’s SSL certificate. You might have to set this to false if you are using a self-signed certificate. If this is disabled, someone else could impersonate the server and obtain the login data.

  • folders (object):

    • inbox (string, default "INBOX"): IMAP mailbox that is checked for incoming DMARC aggregate reports.

    • done (string, default "Archive"): IMAP mailbox that successfully processed reports are moved to.

    • error: (string, default "Invalid"): IMAP mailbox that emails are moved to that could not be processed.

  • storage_path (string, default "/var/lib/dmarc-metrics-exporter"): Directory to persist data in that has to persisted between restarts.

  • poll_interval_seconds (number, default 60): How often to poll the IMAP server in seconds.

  • deduplication_max_seconds (number, default 604800 which is 7 days): How long individual report IDs will be remembered to avoid counting double delivered reports twice.

  • logging (object, default {}): Logging configuration, see the “Logging configuration” section below.

Logging configuration

When providing a custom logging configuration, it must follow the dictionary schema (version 1) described in the logging.config documentation. In general, a provided top-level key will replace the default configuration, but there are some exceptions. The following keys are always fixed:

  • version will always be 1.

  • incremental will always be false.

  • formatters is fixed and provides the following formatters:

    • plain renders human-readable log messages without colors.

    • colored renders human-readable log messages with colors.

    • json renders structured JSON log messages.

In addition, the root key has some special handling. If it is overridden, but not handlers key is provided, handlers: ['default'] will be inserted automatically. Also, the level key will be set to 'DEBUG' if the application is started with the --debug flag.

Configuring log level

To change the log level globally:

{
    "logging": {
        "root": {
            "level": "WARNING"
        }
    }
}
Configuring logging format

To change the logging format:

{
    "logging": {
        "handlers": {
            "default": {
                "class": "logging.StreamHandler",
                "formatter": "json"
            }
        }
    }
}

Valid formats are plain, colored, and json.

Disabling Uvicorn access logs

To disable the Uvicorn access logs:

{
    "logging": {
        "loggers": {
            "uvicorn.access": {
                "propagate": false
            }
        }
    }
}

Usage

To run dmarc-metrics-exporter with the default configuration in /etc/dmarc-metrics-exporter.json:

sudo -u dmarc-metrics python3 -m dmarc_metrics_exporter

To use a different configuration file:

sudo -u dmarc-metrics python3 -m dmarc_metrics_exporter --configuration <path>

You can enable debug logging with the –debug if you do not want to provide your own logging configuration:

sudo -u dmarc-metrics python3 -m dmarc_metrics_exporter --debug

systemd

Instead of manually starting the dmarc-metrics-exporter, you likely want to have it run as a system service. An example systemd service file is provided in this repository in config/dmarc-metrics-exporter.service. Make sure that the paths and user/group names match your configuration and copy it to /etc/systemd/system to use it. To have systemd pick it up a systemctl daemon-reload might be necessary.

You can than start/stop dmarc-metrics-exorter with:

systemctl start dmarc-metrics-exporter
systemctl stop dmarc-metrics-exporter

To have dmarc-metrics-exporter start on system boot:

systemctl enable dmarc-metrics-exporter

Docker

A new docker image is build for each release with GitHub Actions as described in this yaml-file: .github/workflows/docker-publish.yml.

Note that you should configure the listen_addr to 0.0.0.0 to be able to access the metrics exporter from outside the container.

Example docker-compose file:

version: "3"

services:

  dmarc-metrics-exporter:
    # source: https://github.com/jamborjan/dmarc-metrics-exporter/pkgs/container/dmarc-metrics-exporter
    container_name: dmarc-metrics-exporter
    hostname: dmarc-metrics-exporter
    image: jgosmann/dmarc-metrics-exporter:1.3.0
    restart: unless-stopped
    user: 1000:1000 #PUID=1000:PGID=1000
    expose:
      - 9797
    volumes:
      - '/host/folder/dmarc-metrics-exporter.json:/etc/dmarc-metrics-exporter.json'
      - '/host/folder/dmarc-metrics-exporter/metrics:/var/lib/dmarc-metrics-exporter:rw'
    logging:
      driver: "json-file"
      options:
        tag: "{{.ImageName}}|{{.Name}}|{{.ImageFullID}}|{{.FullID}}"
    networks:
      - YourDockerLan

# $ docker network create -d bridge --attachable YourDockerLan
networks:
  YourDockerLan:
    external:
      name: YourDockerLan

Prometheus

Example prometheus config file:

global:
  scrape_interval: 15s
  evaluation_interval: 15s

rule_files:

scrape_configs:

  - job_name: 'dmarc-metrics-exporter'
    static_configs:
      - targets: ['dmarc-metrics-exporter:9797']

Grafana

An example configuration file is provided in this repository in config/dmarc-metrics-exporter.grafana.sample.json. This example dashboard displays the collected metrics as shown in the screenshot below.

config/dmarc-metrics-exporter.grafana.sample.png

Example grafana dashboard

Hints

You should not use your normal email and password credentials for the dmarc-metrics-exporter. If you are not able to create a dedicated service account email account, you should use an app password.

Microsoft Exchange Online

Development

Prerequisites

Setup development environment

pre-commit install
poetry install

Run tests

docker-compose up -d
poetry run pytest

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

dmarc_metrics_exporter-1.3.1.tar.gz (38.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

dmarc_metrics_exporter-1.3.1-py3-none-any.whl (49.1 kB view details)

Uploaded Python 3

File details

Details for the file dmarc_metrics_exporter-1.3.1.tar.gz.

File metadata

  • Download URL: dmarc_metrics_exporter-1.3.1.tar.gz
  • Upload date:
  • Size: 38.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: poetry/2.4.0 CPython/3.13.13 Linux/6.17.0-1010-azure

File hashes

Hashes for dmarc_metrics_exporter-1.3.1.tar.gz
Algorithm Hash digest
SHA256 db22cc776b82fde34b20752681e7a3b38d0f67cce527a164410800ccda3b7710
MD5 30837209faa4e58a0f3e49ea315796dd
BLAKE2b-256 cc9a60f654ad74d9245300fb7849fa5010ac54c80eddd34003bc7a300de9f9da

See more details on using hashes here.

File details

Details for the file dmarc_metrics_exporter-1.3.1-py3-none-any.whl.

File metadata

File hashes

Hashes for dmarc_metrics_exporter-1.3.1-py3-none-any.whl
Algorithm Hash digest
SHA256 91732dd88e6d8ea855b60a1f6ca02c6a30d646de336cb6a0dc45e90c07ef4b87
MD5 d8e783159ad98da19112f71b67b2cb99
BLAKE2b-256 1c1e1c33acb4921e597f1815b7a321c90371062c6ec69e41ee98b24c82b131c6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page