- BrainTools - https://www.braintools.ru -

Меня зовут Андрей Басов, я руководитель команды технической поддержки стрима корпоративных продуктов и сервисов в MWS. Вместе со своими коллегами — Тимуром Хабибулиным (data scientist) и Рафисом Ганеевым (senior devops engineer) — занимаюсь технической поддержкой и сопровождением продуктов линейки Partner Experience Platform.
Чтобы улучшить качество наших сервисов, через которые МТС взаимодействует с партнерами, мы вынуждены постоянно внедрять новые решения, растить продукты и развивать их архитектуру, при этом нам важно обеспечивать надежность и стабильность работы ИТ-систем. Это не всегда дается легко, ведь объемы данных растут, и их нужно эффективно обрабатывать. Одной из основных проблем становится анализ логов — текстовых записей. В нашем случае они фиксируют события в работе систем, которые созданы за 25+ лет работы компании, а еще у них различные стеки и архитектурные подходы.
Объемы данных настолько велики, что проанализировать вручную (например, в OpenSearch/Kibana) даже один продукт практически невозможно, иначе нам пришлось бы просматривать миллионы строк логов каждый день. Поэтому мы решили разработать систему, которая позволила бы автоматически выявлять в логах аномалии — события, не свойственные нормальному функционированию системы. Например, это могут быть следы багов, вызванных новыми релизами, или другие непредвиденные происшествия. Что из этого вышло — расскажу дальше.
Современные ИТ-системы, особенно в крупных компаниях, таких как МТС, состоят из множества микросервисов, каждый из которых генерирует огромное количество логов. Это текстовые записи событий, происходящих внутри системы, — от запросов пользователей до внутренних операций программного обеспечения. Но из-за огромного объема их мониторинг становится настоящей головной болью [9] для команд поддержки и разработчиков.
Представьте ситуацию: вы выкатываете новый релиз или хотфикс. Все тесты проходят успешно, но через несколько часов или даже утром, после ночного деплоя, на вас обрушиваются жалобы от клиентов или других ИТ-систем компании, срабатывают точки и средства мониторинга. Регистрируют массовый инцидент и аварии. Что произошло? Возможно, в логах уже есть запись о критической ошибке [10], которая вызвала проблему? Если в компании развернуты основные инструменты наблюдаемости, такие как Jaeger, OpenSearch/Kibana, Grafana, есть шансы быстро понять, найти и устранить причину. Но если нет — придется искать эти иголки в стогах сена самостоятельно.
Часто даже опытный инженер не успевает диагностировать проблему по логам раньше, чем проявятся ее пагубные последствия. В бигтехах огромное количество различных систем и продуктов, коммуницирующих между собой, с десятками микросервисов, так что проблемы можно не заметить даже с платформой наблюдаемости.
К тому же все логи содержат шум — повторяющиеся стандартные записи, которые не несут полезной информации, но занимают место и отвлекают внимание [11] инженера или разработчика, ведь таких записей большинство. Получается, любая новая аномалия — будь то след бага или просто результат добавления новой функциональности, обновления системы или проблемы на уровне сети — может остаться незамеченной среди моря обычных сообщений. Но чтобы обеспечить надежную работу, нужно уметь вовремя замечать, анализировать и различать нестандартное поведение [12] систем.

Раньше для анализа логов использовались методы, основанные на статических правилах. Можно было настроить систему мониторинга, которая фиксирует только конкретные типы сообщений — например, ошибки с определенным кодом или по определенному процессу. Но такой подход плохо справляется с неожиданными проблемами. Такие ошибки заточены только на конкретные exceptions и уровни логирования error, которые заранее и при хорошей организации obs продукта отражены на дашбордах Grafana в виде различных плашек мониторинга критичных процессов. Но баги, вызванные уникальными комбинациями условий или взаимодействием разных компонентов системы, часто остаются за пределами заданных правил.
Кроме того, современные системы постоянно эволюционируют, появляются новые потребители как внутри компаний, так и извне. Новые функции, изменения в архитектуре или масштабирование могут привести к появлению новых типов логов, которые не были предусмотрены при создании правил. Это делает традиционные методы анализа недостаточно гибкими и эффективными.
Мы занимаемся поддержкой продуктов линейки Partner Experience Platform — это платформа для цифрового взаимодействия с партнерами. Она представляет собой крупную и сложную ИТ-систему с десятками микросервисов. Мы используем средства наблюдаемости нашей внутренней платформы мониторинга [13] и смотрим предложения на рынке. И все же мы до сих пор не нашли подходящего нам решения для анализа логов с акцентом на поиск аномалий.
Без такого инструмента команды поддержки и разработки были вынуждены полагаться:
на ручной анализ огромных объемов данных;
специальные запросы к хранилищам логов (например, OpenSearch) для фильтрации ключевых событий;
реактивный подход: обнаружение проблем после того, как они оказывали влияние на пользователей.
Все это приводило к тому, что между возникновением бага и его обнаружением проходило очень много времени. Мелкие ошибки могли оставаться незамеченными, а это снижало качество сервиса и увеличивало нагрузку на технические команды. Что-то нужно было менять и мы решили создать собственный инструмент для поиска аномалий.
Основная идея заключалась в том, чтобы:
выделить среди «нормальных» логов аномальные, то есть те, которые могут указывать на наличие багов;
иметь возможность находить похожие ошибки в прошлом;
управлять процессом поиска аномалий в работе системы.
Тут важно отметить, что не все аномалии — это баги. Иногда новые функциональные возможности могут генерировать нетипичные записи, которые модель будет классифицировать как аномалию. Чтобы справиться с этим, мы дополнили систему фильтрами, порогами срабатывания мониторинга и визуализацией данных для ручного анализа.
Наше решение для анализа логов представляет собой модульную архитектуру, которая базово состоит из четырех микросервисов: Detector (детектор), Retrain-clusterer (переобучение кластеризатора), DB-cleaner (очистка базы данных) и Stats-exporter (экспорт статистики). Каждый микросервис выполняет свою специализированную задачу, обеспечивая корректную работу системы в целом. Рассмотрим их подробнее.
Его задача — обнаруживать аномалии в логах. Для этого он регулярно запускает процедуру детекции, состоящую из следующих этапов:
Получение новых логов из OpenSearch.
Очистка текстового содержимого от шума (информации, не несущей полезной нагрузки и мешающей качественной кластеризации).
Векторизация логов с использованием bge-m3 — корпоративной модели генерации эмбеддингов.
Кластеризация полученных векторов актуальной версией HDBSCAN — модели иерархической кластеризации.
Выгрузка результатов в Qdrant.
Этот микросервис поддерживает актуальность модели кластеризации. Он позволяет системе оперативно адаптироваться к изменениям в анализируемых сервисах. Для выполнения задачи реализован следующий алгоритм:
Получение всех векторов из Qdrant.
Обучение [14] модели HDBSCAN.
Выгрузка файла модели в S3.
Обновление меток кластеров в Qdrant.
Этот микросервис, выполняя, казалось бы, простую задачу очистки, предотвращает переполнение векторной базы данных одинаковыми логами (что дает экономию ресурсов) и обеспечивает более быстрое и качественное обучение модели кластеризации (повышение точности детекции).
Это достигается благодаря нетривиальному подходу:
Получение всех логов кластера — очистка выполняется для каждого кластера отдельно.
Отбор наиболее разнообразных логов внутри кластера.
Удаление избыточных записей из Qdrant.
Для работы всей системы детекции аномалий очень важно очищать Qdrant, — вот вам простой пример, который поможет лучше понимать, как это можно сделать.
# Фрагмент кода микросервиса; Функция поиска разнообразных логов:
def get_useful_log_indexes(vectors: np.ndarray, max_logs_per_cluster: int) -> List[int]:
# Считаем косинусное расстояние между векторами:
distance_matrix = pairwise_distances(vectors, metric="cosine")
# Добавляем в массив самый новый лог:
indexes = [0]
# Задаем начальный перцентиль допустимого расстояния:
threshold_percentile = 95
# Цикл, пока число выбранных меньше максимально допустимого:
while len(indexes) < max_logs_per_cluster:
# Получаем допустимое расстояние:
threshold = np.percentile(distance_matrix, threshold_percentile)
# Проход по всем векторам:
for index in range(1, len(vectors)):
# Если уже выбрали этот вектор, то пропускаем итерацию:
if index in indexes:
continue
# Получаем расстояния до тех векторов, которые уже выбрали:
distance_to_unique = distance_matrix[index][indexes]
# Берем минимальное расстояние:
min_distance = min(distance_to_unique)
# Если минимальное больше порога:
if min_distance >= threshold:
# Добавляем в выбранные:
indexes.append(index)
# Если набрали максимально допустимое число выбранных:
if len(indexes) >= max_logs_per_cluster:
# Выходим из цикла:
break
# Уменьшаем перцентиль порога:
threshold_percentile -= 5
# Возвращаем выбранные:
return indexes
Stats-exporter (экспорт статистики) — микросервис, который передает результаты детекции в системы мониторинга. Отдает Prometheus-метрику VictoriaMetricsAgent`у и выгружает аномальные логи в Logstash.
Дальше расскажу, на какие технологии мы опирались, чтобы реализовать наше решение. Нам было важно, чтобы система была эффективной и масштабируемой.
Этот алгоритм мы выбрали:
за адаптивность: не требует заранее задавать количество кластеров;
способность эффективно выделять шум (аномальные логи) в данных;
применимость «из коробки»: не требует поиска оптимальных гиперпараметров;
гибкость: алгоритм может обрабатывать данные сложной формы.
HDBSCAN позволил нам разделить нормальные логи на кластеры и выделить записи, которые отличаются от нормального поведения [15] системы.
У МТС есть собственная платформа MWS GPT [16], через которую можно работать с множеством разных моделей. Для векторизации текстов мы выбрали модель bge-m3, которая демонстрирует оптимальное сочетание высокой точности и производительности при обработке больших объемов данных.
bge-m3 представляет собой современную модель эмбеддингов, значительно превосходящую классические подходы, такие как Bag-of-Words (BoW) и TF-IDF. Ее ключевое преимущество заключается в способности эффективно преобразовывать текстовые записи логов в семантически насыщенные числовые векторы, что упрощает последующий анализ с применением алгоритмов машинного обучения.
Docker обеспечивает удобство развертывания и минимизацию проблем с совместимостью зависимостей:
изолированные окружения,
унификация сред,
легкость деплоя.
GitLab CI/CD в интеграции с ArgoCD позволяет нам быстро доставлять изменения в продуктивную среду и контролировать качество кода. Так мы сокращаем время релизов, отслеживаем изменения и видим метрики качества.
OpenSearch используется для первичного хранения логов и быстрого поиска по ним:
предоставляет удобный интерфейс для фильтрации данных;
хранит логи логов перед их обработкой системой анализа.
Для нашего сервиса извлекаются следующие поля:
_id — на его основе создается UUID для Qdrant, также позволяет при необходимости обратиться к исходному логу в дашборде-источнике;
message — текстовое содержимое лога, которое векторизуется в микросервисе Detector;
logDate — временная метка записи лога для отслеживания хронологии событий.
OpenSearch также используется для хранения обнаруженных аномальных логов, что обеспечивает удобный просмотр и анализ выявленных аномалий. В индекс с аномалиями выгружаются следующие поля:
serviceName — название анализируемого микросервиса;
serviceID — идентификатор анализируемого сервиса;
logDate — временная метка записи лога для отслеживания хронологии событий;
qdrantID — идентификатор лога в Qdrant;
srcOpenSearchID — идентификатор лога в OpenSearch-источнике;
message — текстовое содержимое лога после очистки от шума регулярными выражениями.
Qdrant предоставляет возможности для хранения и поиска векторизованных логов:
быстро искать ближайших соседей,
хранить большое количество данных.
Qdrant позволяет нам эффективно хранить и анализировать числовые представления текстовых записей логов. Мы храним следующие поля:
timestamp — logDate, преобразованный в timestamp-формат:
log_id — идентификатор лога в OpenSearch-источнике:
text — текстовое содержимое лога после очистки от шума регулярными выражениями:
is_counted_for_stats — флаг, отображающий, был ли этот лог учтен микросервисом экспорта:
cluster_id — метка кластера лога («–1», если лог распознан как аномальный.
S3 обеспечивает надежное хранение моделей HDBSCAN для каждого микросервиса. У него высокая доступность и его относительно просто эксплуатировать.
Модели HDBSCAN в соответствии с конкретными стратегиями регулярно обновляются и сохраняется в S3 для дальнейшего использования.
Итак, мы разработали архитектуру и выбрали технологии. Следующим этапом стала реализация и внедрение нашего решения в инфраструктуру МТС.
Мы написали код и затем 3–4 месяца внедряли, анализировали и оптимизировали различные компоненты системы, чтобы выстроить баланс между скоростью работы, точным определением аномалий и потребляемыми ресурсами.
Главными сложностями были:
Разрастание базы Qdrant по мере обучения и подключения новых анализируемых микросервисов.
Соответственно, рост моделей HDBSCAN.
Выделение из логов паттернов, которые мешают кластеризации и создают ненужный шум.
Внутри микросервисов мы настроили планировщик задач (Scheduler), который автоматически запускает каждый компонент системы с определенной периодичностью. Это позволяет системе регулярно анализировать новые данные и поддерживать актуальность модели кластеризации.
Кроме того, проработали фильтры для opensearch, внедрили различные алгоритмы и стратегии настроек для каждого отслеживаемого компонента системы, поиграли с размерностью для них, стратегиями запуска, — многое из этого выходит за рамки нашей текущего материала.
В итоге сервис полностью соответствует предъявляемым к нему требованиям: минимизирует шум, определяет аномальные логи и строит по ним дашборды в Grafana.
С нашей системой мы получили:
Он стал одним из ключевых инструментов для работы с системой. По нему мы видим:
визуализацию всплесков аномалий в виде графиков;
исторический анализ количества аномалий;
описания аномалий из OpenSearch.
Таким образом, можно реагировать [17] практически в режиме реального времени. Без этой информации мы не могли оперативно детектить новые и ранее не встречаемые ошибки. Как правило понимание о них приходило к нам в рамках анализа поступающих к нам инцидентов.
Для просмотра самих аномальных логов мы создали специализированный OpenSearch Dashboard. В нем есть:
фильтрация аномальных записей;
поиск и группировка по различным параметрам;
сохранение связи с оригинальным логом по OpenSearch id.
Таким образом, можно сосредоточиться только на самых важных событиях и пользоваться всеми возможностями OpenSearch конкретно в рамках аномалий и без надобности обращаться в БД Qdrant вручную.
Основным эффектом внедрения решения стало:
Сокращение объема данных для анализа и выявления проблем.
Возможность настраивать метрики по аномальным событиям.
Фокус только на значимые новые события.
Повышение отказоустойчивости систем и компонентов.
Теперь можно рассматривать примерно 1000 аномальных записей в день вместо миллионов строк логов и замечать отклонения в работе систем, как через ручной просмотр, так и с помощью метрик.
Разработка и внедрение нашего решения стало возможным благодаря слаженной работе междисциплинарной команды поддержки продукта:
Руководитель команды отвечал за архитектуру, постановку задачи, Python-разработку.
ML-/data-scientist-инженер отвечал за реализацию в с��здании микросервисов.
DevOps-инженер отвечал за cd/cd
Так как данный инструмент создавался для технической поддержки и сопровождения поддерживаемых систем, то в процессе внедрения привлекались инженеры поддержки продукта, анализировались боли и сложности команд поддержки, оценивался их опыт [18] и пожелания.
Для успешного развертывания проекта потребовалось сочетание следующих компетенций:
Data Science: выбор алгоритмов машинного обучения (HDBSCAN) и модели для векторизации текста (bge-m3).
DevOps: управление инфраструктурой (Docker), автоматизация процессов (GitLab CI/CD).
Python: написание кода микросервисов.
Каждый участник команды привнес свой уникальный опыт и навыки, что позволило нам создать эффективное решение для анализа логов.
В будущем планируем добавлять в нашу систему еще новых функций. Так, хотим внедрить генеративных llm для объяснения получаемых аномалий по информации из различных источников (Confluence, Jira, GitLab конкретных проектов).
В следующих материала мы расскажем как отказаться от hdbscan, выстроить собственную систему кластеризации и внедрить Principal Component Analysis для понижения размерностей.
Мы уверены, что такие инструменты могут и должны быть неотъемлемой частью современных ИТ-инфраструктур других компаний.
Автор: clapton
Источник [19]
Сайт-источник BrainTools: https://www.braintools.ru
Путь до страницы источника: https://www.braintools.ru/article/23508
URLs in this post:
[1] Масштаб проблемы: #scale
[2] Традиционные решения — всё?: #solutions
[3] Автоматизация анализа логов с помощью методов машинного обучения: #ml
[4] Архитектура : #arch
[5] Выбор технологий: #stack
[6] Ключ к стабильной работе системы: постепенное итеративное внедрение: #phases
[7] Эффект от внедрения: #results
[8] Во всем виновата команда: #team
[9] болью: http://www.braintools.ru/article/9901
[10] ошибке: http://www.braintools.ru/article/4192
[11] внимание: http://www.braintools.ru/article/7595
[12] поведение: http://www.braintools.ru/article/9372
[13] платформы мониторинга: https://habr.com/ru/companies/ru_mts/articles/846018/
[14] Обучение: http://www.braintools.ru/article/5125
[15] поведения: http://www.braintools.ru/article/5593
[16] MWS GPT: https://habr.com/ru/companies/ru_mts/articles/967478/
[17] реагировать: http://www.braintools.ru/article/1549
[18] опыт: http://www.braintools.ru/article/6952
[19] Источник: https://habr.com/ru/companies/ru_mts/articles/977624/?utm_campaign=977624&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.