Один подход, который приходит мне в голову:
- Наличие индивидуального запроса для каждого пользователя с его настройками. Разрешение им добавлять события со словом «ошибка» к уровню ошибки, например.
- Каждое событие индексируется в одном индексе для каждого клиента, и, возможно, если у вас много событий для каждого клиента, полезно иметь индекс для уровня каждого клиента, например events_clientId_alarm.
Тогда отображение события должно быть примерно таким:
{
"indexed_at": datetime,
"level": keyword [fatal/error/debug/...],
"log": string
}
Тогда у вас будет поток событий, приходящих на фильтрацию, после того, как событие будет перколировано, вы будете знать, где хранить событие.
Затем вы можете подходить кибана / графана и т. Д., Чтобы отслеживать данные ваших индексов и создавать аварийные сигналы, если в течение последних 5 минут было 4 события с аварийными сигналами уровня.
В худшем случае у вас будет один индекс с более или менее 8640000 * 365 документами (если у вас только один пользователь со 100 / событиями в секунду), это огромный индекс, но ElasticSearch может правильно управлять им (добавляя достаточное количество осколков для поиска / агрегации по уровню журнала и датам.
Самое важное здесь - знать, как ваши данные будут со временем увеличиваться, поскольку Elasticsearch не позволяет вам добавлять больше осколков в каждый индекс. Тогда вам нужно задаться вопросом, как со временем будут увеличиваться данные о каждом клиенте, и угадать, сколько шардов вам понадобится, чтобы все это работало нормально.
Примечание:
В зависимости от ваших сделок с вашими клиентами, если они хотят всю историю своих событий-данных или что-то в этом роде. Вы можете хранить один индекс в год для каждого клиента, чтобы позволить вам удалять старые данные, если это необходимо и разрешено.
Надеюсь, это поможет, я выполнил похожий проект и применил аналогичный подход для его реализации.