Перейти к содержанию

Prometheus Animails Exporter

Для включения Prometheus Exporter.

Сервис prometheus-exporter-animails

Настройка

Прежде всего, вам необходимо настроить этот файл:

# копируем файл переопределения в каталог с compose-файлом animails
cp your-animails-project-path/helper-scripts/docker-compose.override.yml.d/PROMETHEUS_EXPORTER/docker-compose.override.yml your-animails-project-path/

# запускаем compose-файл снова
docker compose up -d

Если вы хотите сделать экспортер доступным через внутренний Nginx Animails, создайте файл data/conf/nginx/site.metrics.custom и удалите раздел ports: - "9099:9099" из файла docker-compose.override.yml.

location /metrics/ {
    proxy_pass http://prometheus-exporter:9099/metrics;
}
docker compose restart nginx-animails
docker-compose restart nginx-animails

Prometheus Экспортер Prometheus, который собирает и предоставляет метрики для получения информации о производительности и состоянии сервиса.

Использование

Эндпоинт /metrics требует параметры URL host и apiKey. host — это имя хоста вашего экземпляра animails. apiKey должен быть ключом API только для чтения, который можно сгенерировать, войдя в интерфейс управления animails и перейдя в раздел «Доступ > API» (Access > API).

Visualization of where to find the API Key

Важно: Ограничьте доступ к экспортеру и защитите свой API-ключ!


Конфигурация Prometheus

Следующая конфигурация Prometheus может быть использована для передачи этой информации на эндпоинт:

scrape_configs:
  - job_name: 'animails'
    static_configs:
      - targets: [ 'animails_exporter:9099' ]
    params:
      MAILCOW_EXPORTER_HOST: [ 'mail.example.com' ]
      MAILCOW_EXPORTER_API_KEY: [ 'YOUR-APIKEY-HERE' ]
      token: [ 'YOUR-APIKEY-HERE' ] # если MAILCOW_EXPORTER_TOKEN_DISABLE=false

Также поддерживается необязательный параметр URL scheme, который по умолчанию равен https. Установите его в значение http, если вы хотите обращаться к API без шифрования TLS.

Настройка хоста или API-ключа при запуске приложения

При использовании экспортера для одного хоста animails может быть полезно не отправлять host и apiKey с каждым запросом, так как они не меняются. Следовательно, API-ключ или хост можно установить при запуске приложения с помощью флагов или переменных окружения.

Хост можно установить с помощью флага host или переменной окружения MAILCOW_EXPORTER_HOST. Если установлены оба значения, приоритет имеет флаг.

API-ключ можно установить с помощью флага apikey или переменной окружения MAILCOW_EXPORTER_API_KEY. Если установлены оба значения, приоритет имеет флаг.

ПРИМЕЧАНИЕ: При использовании этого метода рекомендуется ограничить доступ к экспортеру через localhost (установить флаг listen в значение 127.0.0.1:9099 или ::1:9099) или ограничить доступ к локальной сети, но не привязывать порт ко всем интерфейсам.

Примеры метрик

Example metrics

HELP animails_api_response_size Size of API response in bytes
TYPE animails_api_response_size gauge
animails_api_response_size{endpoint="api/v1/get/domain/all",host="mail.example.com",statusCode="200"} 2198
animails_api_response_size{endpoint="api/v1/get/logs/rspamd-stats",host="mail.example.com",statusCode="200"} 1950
animails_api_response_size{endpoint="api/v1/get/mailbox/all",host="mail.example.com",statusCode="200"} 50554
animails_api_response_size{endpoint="api/v1/get/mailq/all",host="mail.example.com",statusCode="200"} 2
animails_api_response_size{endpoint="api/v1/get/quarantine/all",host="mail.example.com",statusCode="200"} 2
animails_api_response_size{endpoint="api/v1/get/status/containers",host="mail.example.com",statusCode="200"} 2813
HELP animails_api_response_time Response time of the API in milliseconds (1/1000s of a second)
TYPE animails_api_response_time gauge
animails_api_response_time{endpoint="api/v1/get/domain/all",host="mail.example.com",statusCode="200"} 46
animails_api_response_time{endpoint="api/v1/get/logs/rspamd-stats",host="mail.example.com",statusCode="200"} 116
animails_api_response_time{endpoint="api/v1/get/mailbox/all",host="mail.example.com",statusCode="200"} 390
animails_api_response_time{endpoint="api/v1/get/mailq/all",host="mail.example.com",statusCode="200"} 337
animails_api_response_time{endpoint="api/v1/get/quarantine/all",host="mail.example.com",statusCode="200"} 31
animails_api_response_time{endpoint="api/v1/get/status/containers",host="mail.example.com",statusCode="200"} 139
HELP animails_api_success 1, if request was sucessful, 0 if not
TYPE animails_api_success gauge
animails_api_success{endpoint="api/v1/get/domain/all",host="mail.example.com"} 1
animails_api_success{endpoint="api/v1/get/logs/rspamd-stats",host="mail.example.com"} 1
animails_api_success{endpoint="api/v1/get/mailbox/all",host="mail.example.com"} 1
animails_api_success{endpoint="api/v1/get/mailq/all",host="mail.example.com"} 1
animails_api_success{endpoint="api/v1/get/quarantine/all",host="mail.example.com"} 1
animails_api_success{endpoint="api/v1/get/status/containers",host="mail.example.com"} 1
HELP animails_container_running 1 if the container is running, 0 if not
TYPE animails_container_running gauge
animails_container_running{container="acme-animails",host="mail.example.com",image="animails/acme:1.90"} 1
animails_container_running{container="clamd-animails",host="mail.example.com",image="animails/clamd:1.66"} 1
animails_container_running{container="dockerapi-animails",host="mail.example.com",image="animails/dockerapi:2.09"} 1
animails_container_running{container="dovecot-animails",host="mail.example.com",image="animails/dovecot:2.2"} 1
animails_container_running{container="memcached-animails",host="mail.example.com",image="memcached:alpine"} 1
animails_container_running{container="mysql-animails",host="mail.example.com",image="mariadb:10.5"} 1
animails_container_running{container="netfilter-animails",host="mail.example.com",image="animails/netfilter:1.59"} 1
animails_container_running{container="nginx-animails",host="mail.example.com",image="nginx:mainline-alpine"} 1
animails_container_running{container="ofelia-animails",host="mail.example.com",image="mcuadros/ofelia:latest"} 1
animails_container_running{container="olefy-animails",host="mail.example.com",image="animails/olefy:1.13"} 1
animails_container_running{container="php-fpm-animails",host="mail.example.com",image="animails/phpfpm:1.91.1"} 1
animails_container_running{container="postfix-animails",host="mail.example.com",image="animails/postfix:1.77"} 1
animails_container_running{container="redis-animails",host="mail.example.com",image="redis:7-alpine"} 1
animails_container_running{container="rspamd-animails",host="mail.example.com",image="animails/rspamd:1.98"} 1
animails_container_running{container="sogo-animails",host="mail.example.com",image="animails/sogo:1.127.1"} 1
animails_container_running{container="solr-animails",host="mail.example.com",image="animails/solr:1.8.3"} 1
animails_container_running{container="unbound-animails",host="mail.example.com",image="animails/unbound:1.23"} 1
animails_container_running{container="watchdog-animails",host="mail.example.com",image="animails/watchdog:2.05"} 1
HELP animails_container_start Unix timestamp of the container start
TYPE animails_container_start gauge
animails_container_start{container="acme-animails",host="mail.example.com",image="animails/acme:1.90"} 1.738153225e+09
animails_container_start{container="clamd-animails",host="mail.example.com",image="animails/clamd:1.66"} 1.738153225e+09
animails_container_start{container="dockerapi-animails",host="mail.example.com",image="animails/dockerapi:2.09"} 1.738153193e+09
animails_container_start{container="dovecot-animails",host="mail.example.com",image="animails/dovecot:2.2"} 1.738585341e+09
animails_container_start{container="memcached-animails",host="mail.example.com",image="memcached:alpine"} 1.738153194e+09
animails_container_start{container="mysql-animails",host="mail.example.com",image="mariadb:10.5"} 1.738153194e+09
animails_container_start{container="netfilter-animails",host="mail.example.com",image="animails/netfilter:1.59"} 1.738558297e+09
animails_container_start{container="nginx-animails",host="mail.example.com",image="nginx:mainline-alpine"} 1.738153234e+09
animails_container_start{container="ofelia-animails",host="mail.example.com",image="mcuadros/ofelia:latest"} 1.738153196e+09
animails_container_start{container="olefy-animails",host="mail.example.com",image="animails/olefy:1.13"} 1.738153194e+09
animails_container_start{container="php-fpm-animails",host="mail.example.com",image="animails/phpfpm:1.91.1"} 1.738153195e+09
animails_container_start{container="postfix-animails",host="mail.example.com",image="animails/postfix:1.77"} 1.739367303e+09
animails_container_start{container="redis-animails",host="mail.example.com",image="redis:7-alpine"} 1.738153194e+09
animails_container_start{container="rspamd-animails",host="mail.example.com",image="animails/rspamd:1.98"} 1.739276409e+09
animails_container_start{container="sogo-animails",host="mail.example.com",image="animails/sogo:1.127.1"} 1.73856954e+09
animails_container_start{container="solr-animails",host="mail.example.com",image="animails/solr:1.8.3"} 1.738153194e+09
animails_container_start{container="unbound-animails",host="mail.example.com",image="animails/unbound:1.23"} 1.739367003e+09
animails_container_start{container="watchdog-animails",host="mail.example.com",image="animails/watchdog:2.05"} 1.738153226e+09
HELP animails_domain_active Active flag for this domain
TYPE animails_domain_active gauge
animails_domain_active{domain="example.com",host="mail.example.com"} 1
animails_domain_active{domain="parstelekom.ir",host="mail.example.com"} 1
HELP animails_domain_aliases Current aliases count for the domain
TYPE animails_domain_aliases gauge
animails_domain_aliases{domain="example.com",host="mail.example.com"} 0
animails_domain_aliases{domain="parstelekom.ir",host="mail.example.com"} 0
HELP animails_domain_mailboxes Current mailboxes count for the domain
TYPE animails_domain_mailboxes gauge
animails_domain_mailboxes{domain="example.com",host="mail.example.com"} 34
animails_domain_mailboxes{domain="parstelekom.ir",host="mail.example.com"} 5
HELP animails_domain_max_aliases Maximum amount of aliases for the domain
TYPE animails_domain_max_aliases gauge
animails_domain_max_aliases{domain="example.com",host="mail.example.com"} 400
animails_domain_max_aliases{domain="parstelekom.ir",host="mail.example.com"} 400
HELP animails_domain_max_mailboxes Maximum amount of mailboxes for the domain
TYPE animails_domain_max_mailboxes gauge
animails_domain_max_mailboxes{domain="example.com",host="mail.example.com"} 50
animails_domain_max_mailboxes{domain="parstelekom.ir",host="mail.example.com"} 10
HELP animails_domain_messages Number of messages in for the domain mailboxes
TYPE animails_domain_messages gauge
animails_domain_messages{domain="example.com",host="mail.example.com"} 1819
animails_domain_messages{domain="parstelekom.ir",host="mail.example.com"} 31
HELP animails_domain_quota_allowed Aggregate quota maximum for the domain in bytes
TYPE animails_domain_quota_allowed gauge
animails_domain_quota_allowed{domain="example.com",host="mail.example.com"} 1.073741824e+10
animails_domain_quota_allowed{domain="parstelekom.ir",host="mail.example.com"} 1.073741824e+10
HELP animails_domain_quota_used Current size of the domain in bytes
TYPE animails_domain_quota_used gauge
animails_domain_quota_used{domain="example.com",host="mail.example.com"} 1.441691634e+09
animails_domain_quota_used{domain="parstelekom.ir",host="mail.example.com"} 5.14462e+06
HELP animails_exporter_success 
TYPE animails_exporter_success gauge
animails_exporter_success{host="mail.example.com",provider="provider.Container"} 1
animails_exporter_success{host="mail.example.com",provider="provider.Domain"} 1
animails_exporter_success{host="mail.example.com",provider="provider.Mailbox"} 1
animails_exporter_success{host="mail.example.com",provider="provider.Mailq"} 1
animails_exporter_success{host="mail.example.com",provider="provider.Quarantine"} 1
animails_exporter_success{host="mail.example.com",provider="provider.Rspamd"} 1
HELP animails_mailbox_last_login Timestamp of the last IMAP login for this mailbox
TYPE animails_mailbox_last_login gauge
animails_mailbox_last_login{host="mail.example.com",mailbox="s.hassanzadeh@example.com"} 1.738768754e+09
animails_mailbox_last_login{host="mail.example.com",mailbox="r.sabouri@example.com"} 1.738760902e+09
animails_mailbox_last_login{host="mail.example.com",mailbox="test@example.com"} 1.739254299e+09
HELP animails_mailbox_messages Number of messages in the mailbox
TYPE animails_mailbox_messages gauge
animails_mailbox_messages{host="mail.example.com",mailbox="s.hassanzadeh@example.com"} 1
animails_mailbox_messages{host="mail.example.com",mailbox="r.sabouri@example.com"} 1
animails_mailbox_messages{host="mail.example.com",mailbox="test@example.com"} 28
HELP animails_mailbox_quota_allowed Quota maximum for the mailbox in bytes
TYPE animails_mailbox_quota_allowed gauge
animails_mailbox_quota_allowed{host="mail.example.com",mailbox="s.hassanzadeh@example.com"} 0
animails_mailbox_quota_allowed{host="mail.example.com",mailbox="r.sabouri@example.com"} 0
animails_mailbox_quota_allowed{host="mail.example.com",mailbox="test@example.com"} 0
HELP animails_mailbox_quota_used Current syze of the mailbox in bytes
TYPE animails_mailbox_quota_used gauge
animails_mailbox_quota_used{host="mail.example.com",mailbox="s.hassanzadeh@example.com"} 2009
animails_mailbox_quota_used{host="mail.example.com",mailbox="r.sabouri@example.com"} 2033
HELP animails_rspamd_action Number of items for which a certain action has been taken
TYPE animails_rspamd_action gauge
animails_rspamd_action{action="add header",host="mail.example.com"} 4
animails_rspamd_action{action="greylist",host="mail.example.com"} 15
animails_rspamd_action{action="no action",host="mail.example.com"} 2159
animails_rspamd_action{action="reject",host="mail.example.com"} 19
animails_rspamd_action{action="rewrite subject",host="mail.example.com"} 0
animails_rspamd_action{action="soft reject",host="mail.example.com"} 0
HELP animails_rspamd_bytes_allocated 
TYPE animails_rspamd_bytes_allocated gauge
animails_rspamd_bytes_allocated{host="mail.example.com"} 3.1404536e+07
HELP animails_rspamd_chunks 
TYPE animails_rspamd_chunks gauge
animails_rspamd_chunks{host="mail.example.com",state="allocated"} 325
animails_rspamd_chunks{host="mail.example.com",state="freed"} 0
animails_rspamd_chunks{host="mail.example.com",state="oversized"} 1731
animails_rspamd_chunks{host="mail.example.com",state="shared"} 3
HELP animails_rspamd_classification 
TYPE animails_rspamd_classification gauge
animails_rspamd_classification{classification="ham",host="mail.example.com"} 2174
animails_rspamd_classification{classification="spam",host="mail.example.com"} 23
HELP animails_rspamd_connections 
TYPE animails_rspamd_connections gauge
animails_rspamd_connections{host="mail.example.com"} 76
HELP animails_rspamd_control_connections 
TYPE animails_rspamd_control_connections gauge
animails_rspamd_control_connections{host="mail.example.com"} 2280
HELP animails_rspamd_fragmented 
TYPE animails_rspamd_fragmented gauge
animails_rspamd_fragmented{host="mail.example.com"} 0
HELP animails_rspamd_fuzzy_hashes 
TYPE animails_rspamd_fuzzy_hashes gauge
animails_rspamd_fuzzy_hashes{action="local",host="mail.example.com"} 1
animails_rspamd_fuzzy_hashes{action="animails",host="mail.example.com"} 1.7192912e+07
animails_rspamd_fuzzy_hashes{action="rspamd.com",host="mail.example.com"} 1.0903119062e+10
HELP animails_rspamd_learned 
TYPE animails_rspamd_learned gauge
animails_rspamd_learned{host="mail.example.com"} 33
HELP animails_rspamd_pools 
TYPE animails_rspamd_pools gauge
animails_rspamd_pools{host="mail.example.com",state="allocated"} 10893
animails_rspamd_pools{host="mail.example.com",state="freed"} 10844
HELP animails_rspamd_scanned 
TYPE animails_rspamd_scanned gauge
animails_rspamd_scanned{host="mail.example.com"} 2197

Дашборд Grafana

Grafana Открытая и компонуемая платформа для наблюдаемости.

Скриншот, демонстрирующий внешний вид дашборда: Animails screenshot Этот дашборд был адаптирован из remkolodder/animails-dashboard пользователем [Remko Lodder].

Репозиторий

Этот репозиторий содержит исходный код экспортера, Dockerfile для сборки образа и примеры дашбордов Grafana.

https://github.com/animails/prometheus-exporter