Рубрики
Без рубрики

Анатомия Журналов Cloudwatch

Введение Cloudwatch logs – это один из сервисов, предлагаемых AWS под брендом cl… С тегами aws, cloudwatch, logs, java.

Вступление

Журналы Cloudwatch – это один из сервисов, предлагаемых AWS под названием cloudwatch. Как следует из названия, он используется для мониторинга и хранения журналов. Эти журналы могут быть сгенерированы из различных служб/ресурсов, таких как ECS, Lambda, пакетные задания (EC2 в целом) и так далее. В этом посте мы рассмотрим анатомию журналов cloudwatch и некоторые примеры кода для извлечения этих журналов.

Анатомия

Существует 3 основных термина, связанных с сервисом:

  1. Группа журналов : В руководстве пользователя группа журналов определяется как Группа журналов – это группа потоков журналов, которые используют одни и те же параметры хранения, мониторинга и контроля доступа. Чтобы упростить это, вы также можете представить группу журналов как совокупность всех журналов, принадлежащих определенной службе. Например, у вас может быть группа журналов для службы ecs, большая группа для лямбды и так далее. В большинстве случаев AWS по умолчанию создаст для вас группы журналов.

  2. Поток журнала : Потоки журналов представляют собой последовательность событий журналов (определенных ниже), поступающих из одного и того же источника. Например, подумайте о выполнении лямбды: все журналы, созданные одним полным выполнением лямбды , окажутся в одном потоке журналов. Аналогично, все журналы, созданные одним полным выполнением пакетного задания , также окажутся в одном потоке журналов.

  3. Событие журнала : Каждый отдельный фрагмент журнала, каждый Logger.info () , каждый System.out.println() , каждый print() представляет собой одно событие журнала. Событие журнала имеет 3 свойства: a) Сообщение (фактическое сообщение) b) Временная метка (когда было сгенерировано сообщение) c) Временная метка приема (когда сообщение было передано в cloudwatch)

На следующем рисунке показана связь между группой журналов, потоками журналов и событие журнала

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

В этой части мы рассмотрим извлечение всех журналов из определенного потока журналов. Это может быть полезно, если вы хотите автоматизировать некоторую обработку журнала, скажем, в случае сбоя lambda.s

  • Зависимость от Maven (упомянутая версия предназначена для символических целей, убедитесь, что вы выбрали последнюю версию или версию, совместимую с вашими существующими зависимостями)
    
            com.amazonaws
            aws-java-sdk-logs
            1.11.519
        
  • Создать Клиент Журналов (По Умолчанию)
AWSLogs logsClient = AWSLogsClientBuilder.defaultClient();
  • Извлечение журналов Сначала нам нужно создать объект запроса. Для начала мы передадим имя группы журналов и имя потока журналов
GetLogEventsRequest logEventsRequest = new GetLogEventsRequest(logGroupName, logStreamName)

Теперь мы можем использовать клиент, который мы создали выше, для получения журналов:

GetLogEventsResult logEventsResult = logsClient.getLogEvents(logEventsRequest);

GetLogEventResult содержит следующую информацию:

  1. список событий журнала Список
  2. следующий шаг вперед знак
  3. следующий обратный токен

Что это за жетоны? Когда мы выполняем вызов для получения событий журнала, результат может содержать не весь журнал; существует ограничение в 1 МБ (10000 событий журнала). Если в конкретный поток журналов больше не записываются журналы, то у вас в основном будут старые события журнала, которые необходимо извлечь с помощью следующего обратного токена . Если в потоке журнала есть новые события журнала, то использование next forward token приведет к большему количеству событий журнала. В таком случае лучше предположить, что первый результат, который мы получаем, приводит нас к середине журналов и что нам нужно пройти назад и вперед , чтобы получить полную картину.

Визуальное Представление Использования Токенов Для Получения Большего Количества Журналов

Мы можем сделать это итеративно или рекурсивно. Ниже приведен пример кода для итеративного использования токенов:

        List outputLogEvents = new LinkedList<>();
        GetLogEventsResult eventsResult = new GetLogEventsResult();

        String nextToken = token;

        do{
            logEventsRequest.setNextToken(nextToken);
            eventsResult = logsClient.getLogEvents(logEventsRequest);
            outputLogEvents.addAll(eventsResult.getEvents());

            nextToken = tokenDirection.equals(TOKEN_DIRECTION.BACKWARD) ? eventsResult.getNextBackwardToken() 
                    : eventsResult.getNextForwardToken();

            LOGGER.info("Next Token: " + nextToken);

        }while (CollectionUtils.isNotEmpty(eventsResult.getEvents()));

Вы можете помнить о последовательности во время обхода или просто извлечь все события и отсортировать их, используя временную метку.

    outputLogEvents
                .stream()
                .sorted(Comparator.comparing(OutputLogEvent::getTimestamp))
                .collect(Collectors.toList());

На этом статья подходит к концу. Ваше здоровье!

Дальнейшее чтение и ссылки Используемый

a- Руководство пользователя Cloudwatch Logs b- SDK Javadoc

Оригинал: “https://dev.to/crawlingcrusader/anatomy-of-cloudwatch-logs-26lg”