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).
Важно: Ограничьте доступ к экспортеру и защитите свой 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 Открытая и компонуемая платформа для наблюдаемости.
Скриншот, демонстрирующий внешний вид дашборда:
Этот дашборд был адаптирован из remkolodder/animails-dashboard пользователем [Remko Lodder].
Репозиторий¶
Этот репозиторий содержит исходный код экспортера, Dockerfile для сборки образа и примеры дашбордов Grafana.
