Итак, у меня есть стек ELK, который заполняется регулярно, каждый раз, когда кто-то скачивает файл с сервера. В моем случае у меня есть список клиентов, и каждый клиент должен делать загрузку каждый час, точно.
То, о чем я хочу быть предупрежденным, - это то, когда одно и то же имя файла появляется дважды для данного клиента, что означает, что что-то пошло не так в момент t0, и что клиент повторяет ту же загрузку в момент времени t0 + 1h.
Вот мой файл правил YAML:
index: myindex-*
name: Checks that clients never download the same file twice
type: cardinality
# Contains the name of the downloaded file, which is always unique
cardinality_field: "Object.name"
# For debugging it's easier to alert on the legit cases
# The real-life condition would rather be "max_cardinality: 1"
min_cardinality: 100
timeframe:
minutes: 1
# Downloader's IP address, so that the rule is applied for each client separayely
query_key: "Context.headers.X-Forwarded-For"
alert:
- "command"
command: ["echo", "{index_type}", "{@timestamp}", "{Actor[customerName]}", "{Context[headers[X-Forwarded-For]]}", "{Object[name]}"]
«Команда» предназначена только для отладки, которая со временем станет более сложной. Тем временем я получаю следующую строку:
<MISSING VALUE> 2018-08-24T13:52:52.923Z {Actor[customerName]} {Context[headers[X-Forwarded-For]]} {Object[name]}
Есть идеи, почему некоторые поля либо не распознаются как переменные, либо кажутся "нулевыми" или что-то в этом роде? Я вижу журналы в моей Kibana, соответствующие отображаемой здесь метке времени, с правильно установленным Object.name и т. Д.
Вот мой конфигурационный файл YAML:
rules_folder: example_rules
run_every:
minutes: 1
buffer_time:
minutes: 15
es_host: 172.28.0.62
es_port: 9200
writeback_index: elastalert_status
alert_time_limit:
days: 2
И, наконец, команда, которую я использую для запуска Elasticsearch:
elastalert --rule example_rules/test.yml --conf elastalert_config.yml