Используйте структурированное ведение журналов в AWS CloudWatch и как создавать настраиваемые информационные панели для визуализации журналов и показателей.

Amazon Web Services (AWS) CloudWatch — это мощный инструмент для мониторинга и регистрации вашей инфраструктуры AWS. Он может собирать и отслеживать метрики, журналы и события из различных ресурсов и сервисов AWS, предоставляя в режиме реального времени информацию о производительности и работоспособности ваших приложений и систем.

Однако использовать CloudWatch может быть сложно, особенно если вам нужно отслеживать большое количество ресурсов и служб. Одной из наиболее распространенных проблем с CloudWatch является понимание журналов, созданных вашими приложениями и системами. Здесь на помощь приходит структурированное ведение журнала.

Структурированное ведение журнала — это метод добавления контекста и метаданных в сообщения журнала, что делает их более удобочитаемыми и доступными для поиска. Вместо того, чтобы просто записывать сообщение, структурированное ведение журнала добавляет в сообщение журнала пары «ключ-значение», которые можно легко запрашивать и анализировать в CloudWatch.

В этой статье мы рассмотрим, как использовать структурированное ведение журналов в AWS CloudWatch и как создавать настраиваемые информационные панели для визуализации журналов и показателей. Мы будем использовать AWS CDK с TypeScript для создания пользовательской панели мониторинга, отображающей структурированные журналы из функции Lambda.

Настройка функции Lambda и структурированного ведения журнала

Прежде чем мы сможем начать регистрировать структурированные данные, нам нужна функция Lambda для создания журналов. Давайте создадим простую функцию Lambda, используя AWS CDK с TypeScript:

import * as cdk from 'aws-cdk-lib';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';

const app = new cdk.App();
const stack = new cdk.Stack(app, 'MyStack');
const lambdaFunction = new NodejsFunction(stack, 'MyFunction', {
  entry: 'src/index.ts',
  handler: 'handler',
});
app.synth();

Это создает новую функцию Lambda, используя конструкцию NodejsFunction из пакета aws-lambda-nodejs. Мы указываем файл ввода (src/index.ts) и функцию-обработчик (handler) для лямбда-функции. При необходимости вы можете заменить эти значения своим собственным кодом и функцией-обработчиком.

Теперь, когда у нас есть функция Lambda, давайте добавим к ней структурированное ведение журнала. Мы будем использовать пакет winston для регистрации структурированных данных. Установите его с помощью npm:

npm install winston

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

import * as winston from 'winston';

const logger = winston.createLogger({
  level: 'info',
  format: winston.format.json(),
  transports: [
    new winston.transports.Console(),
  ],
});
export async function handler(event: any, context: any) {
  logger.info('Function invoked', { event, context });
  return {
    statusCode: 200,
    body: 'Hello, world!',
  };
}

Здесь мы создаем новый регистратор winston с форматом json. Мы указываем транспорт Console для входа в консоль. В функции handler мы регистрируем сообщение info с некоторыми дополнительными метаданными в виде пары ключ-значение.

Разверните обновленную функцию Lambda с помощью cdk deploy и вызовите ее для создания журналов.

Создание пользовательской панели управления CloudWatch

Теперь, когда у нас есть несколько журналов, давайте создадим пользовательскую панель мониторинга CloudWatch для их визуализации. Мы будем использовать пакет aws-cloudwatch из AWS CDK для создания информационной панели.

Сначала установите пакет с помощью npm:

npm install aws-cdk-lib aws-cdk-lib/aws-cloudwatch aws-cdk-lib/aws-cloudwatch-actions

Теперь давайте создадим новый стек CDK для создания информационной панели:

import * as cdk from 'aws-cdk-lib';
import * as cloudwatch from 'aws-cdk-lib/aws-cloudwatch';
import * as cloudwatch_actions from 'aws-cdk-lib/aws-cloudwatch-actions';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as logs from 'aws-cdk-lib/aws-logs';
import { NodejsFunction } from 'aws-cdk-lib/aws-lambda-nodejs';

const app = new cdk.App();
const stack = new cdk.Stack(app, 'MyStack');
const lambdaFunction = new NodejsFunction(stack, 'MyFunction', {
  entry: 'src/index.ts',
  handler: 'handler',
});
const logGroup = new logs.LogGroup(stack, 'LogGroup', {
  logGroupName: `/aws/lambda/${lambdaFunction.functionName}`,
  retention: logs.RetentionDays.ONE_MONTH,
});
const metricFilter = logGroup.addMetricFilter('MetricFilter', {
  metricNamespace: 'MyApp',
  metricName: 'Invocations',
  filterPattern: logs.FilterPattern.all(),
});
const widgetLogs = new cloudwatch.LogsWidget({
  logGroupNames: [logGroup.logGroupName],
});
const widgetMetrics = new cloudwatch.MetricWidget({
  width: 6,
  height: 6,
  title: 'Lambda Metrics',
  metrics: [metricFilter.metric({ statistic: 'Sum' })],
});
const dashboard = new cloudwatch.Dashboard(stack, 'MyDashboard', {
  dashboardName: 'My Dashboard',
  widgets: [
    widgetLogs,
    widgetMetrics,
  ],
});
const alarm = new cloudwatch.Alarm(stack, 'MyAlarm', {
  metric: metricFilter.metric({ statistic: 'Sum' }),
  threshold: 1,
  evaluationPeriods: 1,
  alarmDescription: 'Lambda invoked at least once',
});
alarm.addAlarmAction(new cloudwatch_actions.AddToDashboardAction(dashboard, {
  comment: 'Alarm triggered!',
}));
app.synth();

Здесь мы создаем новый LogGroup для нашей лямбда-функции и указываем срок хранения 30 дней. Мы создаем MetricFilter для группы журналов, чтобы извлечь метрику количества вызовов функций. Мы создаем два виджета, один для отображения журналов, а другой для отображения метрики. Объект dashboard создается с двумя виджетами, а alarm настроен на срабатывание, когда значение метрики превышает пороговое значение 1.

Разверните стек с помощью cdk deploy и перейдите к панели управления CloudWatch в Консоли управления AWS. Вы должны увидеть журналы функции Lambda, отображаемые в первом виджете, и метрику для вызовов функции, отображаемую во втором виджете.

Заключение

Структурированное ведение журнала — это мощный метод добавления контекста и метаданных в сообщения журнала, что делает их более читабельными и доступными для поиска. AWS CloudWatch — это мощный инструмент для мониторинга и регистрации вашей инфраструктуры AWS, а настраиваемые информационные панели позволяют визуализировать ваши журналы и показатели в режиме реального времени.

В этой статье мы рассмотрели, как использовать структурированное ведение журналов в AWS CloudWatch и как создать пользовательскую панель мониторинга для визуализации ваших журналов и показателей. Мы использовали AWS CDK с TypeScript для создания функции Lambda, которая генерирует структурированные журналы, и настраиваемую панель мониторинга CloudWatch, которая отображает журналы и метрики.

Используя возможности структурированного ведения журналов и настраиваемых информационных панелей, вы можете получить ценную информацию о производительности и работоспособности вашей инфраструктуры AWS, а также быстро выявлять и устранять проблемы до того, как они повлияют на ваши приложения и системы.

Повышение уровня кодирования

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:

  • 👏 Хлопайте за историю и подписывайтесь на автора 👉
  • 📰 Смотрите больше контента в публикации Level Up Coding
  • 💰 Бесплатный курс собеседования по программированию ⇒ Просмотреть курс
  • 🔔 Подписывайтесь на нас: Twitter | ЛинкедИн | "Новостная рассылка"

🚀👉 Присоединяйтесь к коллективу талантов Level Up и найдите прекрасную работу