Трассировка лямбда-функций
Трассировка лямбда-функций
Ключ-АСТРОМ предоставляет вам выделенный слой AWS Lambda, содержащий расширение Ключ-АСТРОМ для AWS Lambda. Вам необходимо добавить общедоступный слой для вашей среды выполнения и региона в вашу функцию. Затем, в зависимости от выбранного вами метода конфигурации, Ключ-АСТРОМ предоставит шаблон или конфигурацию для вашей функции AWS Lambda.
Возможности
Ключ-АСТРОМ предоставляет широкие возможности мониторинга для Python, Node.js, Java, Go и .NET:
- Автоматическая распределенная трассировка между сервисами AWS, такими как API Gateway, SQS, SNS, EventBridge, и бесшовная интеграция с другими сервисами AWS.
- Поддержка OpenTelemetry для приема трассировочных и метрических данных.
- Встроенная функция сбора логов из функций Lambda. Ключ-АСТРОМ поддерживает сбор логов напрямую через API телеметрии AWS Lambda, что снижает зависимость от CloudWatch.
- Обнаружение и оптимизация холодного пуска.
- Поддержка инфраструктуры как кода (Terraform, AWS SAM, Serverless Framework).
Входящие вызовы
Для вызовов AWS Lambda Ключ-АСТРОМ предлагает универсальную поддержку для всех типов триггеров. ЕдиныйАгент может собирать конкретную информацию или связывать трассировку с любым родительским процессом и, следовательно, добавлять дополнительную информацию только для вызовов, выполненных через:
- AWS SDK Lambda Invoke API
- API Gateway
- URL лямбда-функции
- AWS SQS
- AWS SNS
- AWS Application Load Balancer
- AWS EventBridge
Поддержка AWS EventBridge для Go отсутствует в первоначальной версии. Поддержка будет добавлена в будущем обновлении.
Для других типов вызовов ЕдиныйАгент не может получить какую-либо конкретную информацию или связать трассировку с каким-либо родительским процессом. Для вызовов через AWS SDK требуется, чтобы клиент был оснащен Ключ-АСТРОМ для подключения трассировки.
Шаги
Включите мониторинг для функций AWS Lambda
Чтобы начать:
- В Hub Ключ-АСТРОМ выберите AWS Lambda.
- Выберите Настройка.
- Следуйте инструкциям, чтобы включить мониторинг функций AWS Lambda.
Выберите способ настройки
ЕдиныйАгент Ключ-АСТРОМ распространяется как слой Lambda, который можно включить и настроить вручную или с помощью известных решений Infrastructure as Code (IaC). Слой Lambda хранится в учетной записи AWS Ключ-АСТРОМ 585768157899.
Мастер предоставляет вам различные параметры конфигурации и фрагменты кода, которые вы можете использовать в выбранной вами системе автоматизации развертывания.
Быстрый старт против расширенной настройки
После выбора среды выполнения у вас есть два различных варианта мониторинга:
- Быстрый старт: Это быстрый вариант подключения с минимальной настройкой. Вы выбираете только архитектуру, регион и метод конфигурации. Мониторинг вашей среды будет осуществляться с помощью распределенной трассировки. Эта настройка полезна для использования базовых функций AWS Lambda со стандартными потребностями в мониторинге.
- Расширенная конфигурация: Вам доступен гораздо более широкий выбор параметров настройки. Такая конфигурация полезна для команд, которым необходима детальная наблюдаемость, больший контроль и возможности настройки для сложных сред или специфических задач мониторинга. Она обеспечивает интеграцию с другими сервисами AWS, такими как CloudWatch и X-Ray.
Настройка с помощью JSON-файла
Если вы выберете этот метод, Ключ-АСТРОМ предоставит вам следующее:
- Переменная окружения, которую нужно добавить в вашу функцию AWS Lambda.
- Фрагмент JSON, который необходимо скопировать в файл
dtconfig.jsonв корневой папке вашего развертывания Lambda. - Слой Lambda ARN
При использовании этого метода убедитесь, что вы добавили слой Ключ-АСТРОМ Lambda в свою функцию. Это можно сделать через консоль AWS (Добавить слой > Указать ARN и вставить ARN, отображаемый на странице развертывания) или с помощью любого автоматизированного решения по вашему выбору.
Настройка с помощью переменных среды
Для настройки можно использовать переменные среды, но мы рекомендуем использовать Secrets Manager в качестве оптимального способа получения токена безопасности.
При использовании этого метода убедитесь, что вы добавили слой Ключ-АСТРОМ Lambda в свою функцию. Слой, а также переменные среды, можно установить либо вручную через консоль AWS (Добавить слой > Указать ARN и вставить ARN, отображаемый на странице развертывания), либо с помощью автоматизированного решения по вашему выбору.
Расшифровка переменных среды на стороне клиента (безопасность при передаче) не поддерживается.
Если вы выберете этот метод, Ключ-АСТРОМ предоставит вам следующее:
- Значения для определения переменных среды для функций AWS Lambda, которые вы хотите отслеживать.
- Слой Lambda ARN
Настройка и развертывание с помощью Terraform
Terraform — популярное решение для инфраструктуры как кода (IaC). При выборе этого метода Ключ-АСТРОМ предоставляет вам:
- Шаблон для определения функции AWS Lambda. Он включает в себя всю необходимую конфигурацию для развертывания и настройки расширения Ключ-АСТРОМ AWS Lambda вместе с вашими функциями.
- Слой Lambda ARN
Настройка и развертывание с использованием AWS SAM
AWS Serverless Application Model (SAM) — это платформа с открытым исходным кодом для создания бессерверных приложений.
Если вы выберете этот метод, Ключ-АСТРОМ предоставит вам шаблон для определения функции AWS Lambda. Он включает в себя всю необходимую конфигурацию для интеграции расширения Ключ-АСТРОМ AWS Lambda.
Настройка и развертывание с использованием бессерверной архитектуры
Опция «Бессерверное приложение» — это фреймворк для развертывания бессерверных приложений.
Если вы выберете этот метод, Ключ-АСТРОМ предоставит вам шаблон для определения функции AWS Lambda. Он включает в себя всю необходимую конфигурацию для интеграции расширения Ключ-АСТРОМ AWS Lambda.
Настройка и развертывание с использованием AWS CloudFormation
AWS CloudFormation — это решение IaC, позволяющее развертывать широкий спектр сервисов AWS.
Если вы выберете этот метод, Ключ-АСТРОМ предоставит вам шаблон для определения функции AWS Lambda. Он включает в себя всю необходимую конфигурацию для интеграции расширения Ключ-АСТРОМ AWS Lambda.
Укажите конечную точку API Ключ-АСТРОМ
Необязательный
Это необязательный шаг, позволяющий указать конечную точку API Ключ-АСТРОМ, на которую будут отправляться данные мониторинга.
Типичный сценарий — развертывание АктивногоШлюза Ключ-АСТРОМ в непосредственной близости (в том же регионе) от функций Lambda, которые вы хотите отслеживать, чтобы уменьшить задержку в сети. Это может повлиять на время выполнения и холодного запуска ваших функций Lambda для (обычно одного) сетевого запроса от ЕдиногоАгента за каждый вызов Lambda (который происходит в конце вызова).
Включить мониторинг реальных пользователей
Необязательный
Это необязательный шаг для использования функции мониторинга реальных пользователей (RUM), которая предоставляет подробную информацию о действиях и производительности пользователей в браузере или мобильных приложениях.
Настройте шлюз AWS API
Если входящие (не XHR) запросы к вашим функциям Lambda не связаны с вызывающим приложением, настройте API Gateway для пропуска тега Ключ-АСТРОМ. Для этого включите параметр Использовать интеграцию с прокси-сервером Lambda на странице конфигурации запроса интеграции API Gateway.
Если API Gateway настраивается на странице конфигурации Lambda, этот параметр будет включен по умолчанию.
AWS Lambda также поддерживает интеграцию без прокси, что — без дополнительной настройки — предотвращает использование Ключ-АСТРОМ.
Отслеживание вызовов из других отслеживаемых приложений
Обнаружение RUM (веб и мобильные приложения)
Для обеспечения работы трассировки вызовов из других отслеживаемых приложений/обнаружения RUM в этом сценарии создайте пользовательский шаблон сопоставления в конфигурации запросов интеграции.
- В консоли AWS API Gateway перейдите в раздел Ресурсы и выберите метод запроса (например, GET).
- Выберите Шаблоны сопоставления, а затем выберите Добавить шаблон сопоставления.
- Добавьте в шаблон следующее содержимое:
{
"path": "$context.path",
"httpMethod": "$context.httpMethod",
"headers": {
#foreach($param in ["x-astromkey", "traceparent", "tracestate", "x-dtc", "referer", "host", "x-forwarded-proto", "x-forwarded-for", "x-forwarded-port"])
"$param": "$util.escapeJavaScript($input.params().header.get($param))"
#if($foreach.hasNext), #end
#end
},
"requestContext": {
"stage": "$context.stage"
}
}
|
Заголовок x-dtc предназначен специально для трассировки сценариев RUM, тогда как остальные заголовки, как правило, необходимы для связывания трассировок и извлечения соответствующей информации, такой как метаданные веб-запросов.
- Нажмите Сохранить, чтобы сохранить конфигурацию.
- Переразверните свой API.
Настройка AWS
Убедитесь, что заголовок x-dtc разрешен в настройках CORS ваших отслеживаемых функций Lambda.
Для работы функций RUM для Lambda требуется отправка определенного заголовка (x-dtc) вместе с XHR-запросами к AWS. Чтобы включить его, настройки CORS вашего развертывания AWS должны разрешать этот заголовок x-dtc во время предварительных OPTIONS запросов.
Настройка Ключ-АСТРОМ
Чтобы настроить заголовок x-dtc для вызовов ваших лямбда-функций:
- В зависимости от типа вашего приложения перейдите в разделы Веб, Мобильные, Фронтенд или Пользовательские приложения.
- Выберите приложение, которое вы хотите подключить к вашей функции Lambda.
- Выберите меню Обзор (…) в правом верхнем углу и выберите Редактировать.
- Выберите Захват > Асинхронные веб-запросы и одностраничные приложения.
- Убедитесь, что выбранная вами платформа включена. Если вашей платформы нет в списке, включите функцию Capture XmlHttpRequest (XHR) для обеспечения общей поддержки XHR.
- Выберите Захват > Расширенные настройки.
- Прокрутите вниз до раздела Включить мониторинг реальных пользователей для междоменных XHR-запросов и введите шаблон, соответствующий URL-адресу ваших функций Lambda. Например:
TheAwsUniqueId.execute-api.us-east-1.amazonaws.com - Выберите Сохранить. Через несколько минут заголовок будет добавлен ко всем вызовам вашей функции Lambda, и запросы из вашего браузера будут перенаправляться на бэкенд.
Неудачные запросы
Если после включения этой опции запросы начинают завершаться с ошибкой, проверьте настройки CORS.
Развертывание
Скопируйте фрагменты конфигурации в ваше развертывание и используйте выбранный вами метод развертывания, чтобы включить слой и настроить конфигурацию для ваших функций Lambda.
Параметры конфигурации
Получить токен из AWS Secrets Manager
ЕдиныйАгент версии 1.295+
Вместо явного указания токена аутентификации в конфигурации, вы можете настроить ЕдиныйАгент на получение токена, хранящегося в AWS Secrets Manager.
Предварительные требования:
- Убедитесь, что вы предоставили функции Lambda, отслеживаемой ЕдинымАгентом, разрешение
secretsmanager:GetSecretValueна использование секретного ARN токена аутентификации. - Убедитесь, что секретное значение содержит только значение токена аутентификации в открытом виде (без кавычек). Секреты со структурой JSON не поддерживаются.
- При получении значения секрета Secrets Manager по умолчанию возвращает только текущую версию секрета (метку
AWSCURRENT).
Чтобы получить токен для трассировочного соединения, установите ARN секретного токена либо в переменную среды DT_CONNECTION_AUTH_TOKEN_SECRETS_MANAGER_ARN, либо в свойство JSON Connection.AuthTokenSecretsManagerArn.
Этот параметр всегда имеет приоритет над DT_CONNECTION_AUTH_TOKEN (Connection.AuthToken). Если получение данных не удастся, ЕдиныйАгент не сможет экспортировать данные трассировки.
Запрос к AWS Secrets Manager выполняется только один раз, на этапе инициализации функции Lambda; это приводит к увеличению продолжительности холодного запуска функции Lambda.
Принудительное выполнение проверки подписи на уровне Lambda
ЕдиныйАгент версии 1.341+
Слои Ключ-АСТРОМ Lambda работают как расширения внутри среды выполнения функции. Если ваша организация требует подписывания кода в рамках обеспечения безопасности цепочки поставок, вы можете использовать этот механизм для криптографической проверки подлинности слоя перед развертыванием.
Функция цифровой подписи кода AWS Lambda гарантирует, что в функции Lambda может быть развернут только код от доверенных издателей. При включении цифровой подписи кода AWS проверяет, подписан ли каждый слой и пакет кода, прикрепленный к функции, профилем подписи, который вы явно разрешили. Развертывания, не прошедшие эту проверку, отклоняются до выполнения.
Ключ-АСТРОМ подписывает публично распространяемые слои Lambda с помощью AWS Signer. Если ваши функции Lambda требуют подписывания кода, добавьте профиль подписывания Ключ-АСТРОМ в конфигурацию подписывания кода вашей функции, чтобы слои Ключ-АСТРОМ принимались во время развертывания.
Мастер развертывания Ключ-АСТРОМ предоставляет команды AWS CLI для получения профиля подписи, создания конфигурации подписи кода и ее прикрепления к вашей функции Lambda.
Конфигурация подписи кода обеспечивает подписание только для развертываний, выполненных после ее подключения. Существующие слои и код в функции продолжают работать; следующее развертывание неподписанного или недоверенного кода отклоняется с ошибкой CodeSigningConfigAccessDeniedException.
Слои Ключ-АСТРОМ Lambda подписываются во всех регионах, поддерживающих AWS Signer. Классические слои OneAgent Lambda не подписываются. Мастер развертывания скрывает эту опцию для регионов, где AWS Signer недоступен.
Накладные расходы на мониторинг
Включение мониторинга неизбежно приводит к дополнительным затратам на выполнение отслеживаемой функции. Эти затраты зависят от нескольких факторов, таких как технология выполнения функции, конфигурация и конкретные характеристики функции, например, размер кода, продолжительность выполнения и сложность.
Объем памяти, заданный для функции, напрямую влияет на вычислительные ресурсы, выделяемые экземпляру функции.
Наихудший сценарий с точки зрения измеренных накладных расходов — это функция с пустым обработчиком и минимальной конфигурацией памяти.
Холодный запуск сверху
- Для Node.js накладные расходы на холодный старт составляют около 900 мс.
- Для Java накладные расходы на холодный старт составляют около 1500 мс.
- Для Python накладные расходы на холодный старт составляют около 1000 мс.
- Для Go накладные расходы на холодный старт составляют около 600 мс.
- Для .NET накладные расходы на холодный запуск составляют приблизительно 5000 мс.
Для тестирования производительности при холодном запуске были протестированы функции "hello world" (возвращающие только ответ) с выделенной памятью объемом 512 МБ. Важно отметить, что наблюдаемые накладные расходы могут варьироваться в зависимости от нескольких факторов:
- Настроенная память: функции Lambda выделяется ЦП пропорционально настроенному объему памяти, что может влиять на производительность ее холодного запуска. Функции с большим объемом выделенной памяти обычно демонстрируют более быстрое время инициализации благодаря увеличенному объему выделенной ЦП.
- Реализация функции: Сложность фактической реализации функции, включая внешние зависимости, логику инициализации и среду выполнения, может существенно повлиять на продолжительность холодного запуска.
- Версия среды выполнения: Конкретная используемая версия среды выполнения или образ контейнера также могут влиять на время холодного запуска.
При проведении оценки производительности мы рекомендуем учитывать эти факторы, поскольку они могут повлиять на результаты сравнительного анализа в реальных условиях.
Задержка времени отклика
Задержка зависит от реализации функции, но обычно составляет менее 10%. Это означает, что время, необходимое для получения ответа вызывающей функцией Lambda, может увеличиться на 10% при добавлении слоя ЕдиногоАгента по сравнению с ситуацией, когда ЕдиныйАгент не активен/не присутствует.
Накладные расходы на пространство кода
В следующей таблице приведены размеры несжатых слоев.
| Среда выполнения | Пространство кода | Встроенное пространство для кода с функцией сбора логов |
|---|---|---|
| Node.js | ~23 МБ | ~32 МБ |
| Java | ~25 МБ | ~32 МБ |
| Python | ~16 МБ | ~24 МБ |
| Go | ~25 МБ | ~28 МБ |
| .NET | ~35 МБ | ~44 МБ |
Интеграция Ключ-АСТРОМ с AWS
Хотя это и не обязательно, мы рекомендуем настроить интеграцию Ключ-АСТРОМ с Amazon CloudWatch. Это позволит беспрепятственно объединять данные, поступающие через интеграцию с AWS, с данными, собираемыми расширением Ключ-АСТРОМ AWS Lambda.
Фильтрация холодных запусков
Одним из важных показателей для Lambda является частота холодных запусков. Холодный запуск происходит, когда вызывается новый экземпляр функции Lambda. Такие холодные запуски занимают больше времени и увеличивают задержку в обработке запросов.
Высокая частота холодных запусков может указывать на ошибки или неравномерную нагрузку, которые можно устранить с помощью выделенной параллельной обработки. Ключ-АСТРОМ сообщает о таких холодных запусках как о свойстве распределенной трассировки.
Для анализа холодных пусков:
- На странице с подробными сведениями о сервисе Lambda выберите пункт Просмотреть все запросы.
- В фильтре запросов в разделе Свойства запроса выберите Холодный запуск функции.
- Фильтрация по вызовам, содержащим Только холодный запуск или Без холодного запуска.
Известные ограничения
Общие ограничения
- Параметры таймаута HTTP-соединения, таймаута сброса и пороговых значений задержки не подлежат настройке.
- ЕдиныйАгент, работающий на AWS Lambda, не поддерживает функции, требующие перенастройки ЕдиногоАгента через пользовательский интерфейс на стороне сервера.
- ЕдиныйАгент для AWS Lambda использует только локальные настройки, определенные с помощью переменных среды или конфигурационных файлов, вместо того, чтобы получать конфигурацию из кластера Ключ-АСТРОМ. В результате любые настройки, определенные на уровне кластера, игнорируются, и применяются значения по умолчанию, если они явно не переопределены.
- Большинство расширений Ключ-АСТРОМ для AWS Lambda не перехватывают IP-адреса исходящих HTTP-запросов. Это приводит к тому, что хосты остаются без мониторинга, если вызываемая служба не отслеживается с помощью Ключ-АСТРОМ.
- Режим развертывания AWS Lambda Managed Instances не поддерживается. Этот новый вариант размещения позволяет развертывать функции Lambda на кластерах экземпляров EC2, управляемых AWS. Расширения Ключ-АСТРОМ Lambda и модули кода в настоящее время не поддерживают этот режим развертывания.
Ограничения .NET
ЕдиныйАгент версии 1.335+
Поддерживаемые среды выполнения: .NET 8 и .NET 10.
После завершения внедрения среда выполнения .NET сохраняет в памяти как исходные сборки, так и версии с инструментами. Это известное ограничение Microsoft .NET, которое не может быть устранено с помощью ЕдиногоАгента Ключ-АСТРОМ, что приводит к увеличению объема памяти, используемой лямбда-функциями .NET, примерно на 75 МБ.
ASP.NET Core, оценка атак и уязвимостей на уровне кода, а также ряд метрик не поддерживаются в AWS Lambda.
Ограничения Node.js
- Поддержка трассировки
aws-sdkдоступна только для CommonJS. В развертываниях Lambda на ECMAScript трассировка AWS-SDK будет недоступна. - Необходимо включить мониторинг для функций ESM Lambda. В настоящее время эта функция недоступна opt-in. Чтобы включить поддержку ESM для входящих вызовов AWS Lambda, установите переменную среды
DT_ENABLE_ESM_LOADERSв значениеtrue. Включение поддержки ESM увеличивает потребление памяти. - Обработчики Node.js из сборщиков (например, esbuild или vite) могут быть невидимы для ЕдиногоАгента из-за измененной структуры экспорта в процессе сборки.
Как включить автоматическую инструментацию для обработчиков Node.js, собранных с помощью сборщика
Для включения автоматической инструментации можно использовать простой скрипт-обертку.
Вот пример обработчика AWS Lambda, написанного на TypeScript (index.ts):
import { Context, APIGatewayProxyResult, APIGatewayEvent } from 'aws-lambda';
export const handler = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => {
console.log(`Event: ${JSON.stringify(event, null, 2)}`);
console.log(`Context: ${JSON.stringify(context, null, 2)}`);
return {
statusCode: 200,
body: JSON.stringify({
message: 'hello world',
}),
};
};
|
Соберите код функции, используizing выбранный вами сборщик.
Если в результате получается код, который не может быть автоматически инструментирован ЕдинымАгентом, создайте файл-обертку (например, handler_wrap.mjs), чтобы предоставить доступ к обработчику таким образом, чтобы ЕдиныйАгент мог его инструментировать.
Для развертывания ESM Lambda:
// handler_wrap.mjs
export { handler } from "./index.mjs";
|
Для развертывания Lambda на CommonJS:
const bundleDist = require("./dist/index");
exports.handler = bundleDist.handler;
|
В конфигурации среды выполнения AWS Lambda установите обработчик на handler_wrap.handler.
Теперь ЕдиныйАгент сможет корректно обнаруживать и инструментировать эту функцию. Использование сборщика вводит дополнительные ограничения на видимость зависимостей.
Ограничения Go
Общие ограничения:
- Приложения Go для AWS Lambda должны быть собраны с включенной динамической компоновкой. Для включения динамической компоновки необходимо установить
CGO_ENABLED=1и использовать системный компоновщик.
Пример:
CGO_ENABLED=1 go build -ldflags '-linkmode=external' -o myapp main.go |
- Приложения на Go не требуют специальной среды выполнения. Используется среда выполнения, предназначенная только для операционной системы.
Go 1.xЭта среда выполнения устарела и не поддерживается.
Ограничения по версиям:
- Для поддержки Go в работе с Lambda требуется ЕдиныйАгент версии 1.333+. Оно несовместимо с более старыми версиями ЕдиногоАгента.
- Поддержка внешних метаданных для Go в AWS Lambda не предусмотрена. В результате, версии сторонних библиотек или новые версии Go не поддерживаются автоматически. Поддержка новых версий поставляется в рамках обычного цикла выпуска ЕдиногоАгента и требует обновления ЕдиногоАгента для вступления изменений в силу.
- Для работы с приложениями на языке Go требуется AWS-Lambda-Go SDK версии 1.18.0 и выше.
Ограничения развертывания:
- Развертывание возможно с помощью образа контейнера или ZIP-файла. В обоих случаях необходимо включить динамическую компоновку.
Архив ZIP-файлов:
- Архив должен содержать исполняемый файл, а приложение должно быть скомпилировано с использованием glibc версии 2.34 или более ранней. Поскольку статически скомпилированные приложения не поддерживаются, для компоновки с такой старой версией glibc требуется сборка в Ubuntu 20.04 или более ранней версии.
Изображение контейнера:
- Приложение должно быть скомпилировано с соответствующей версией glibc. Поддерживаются как базовые образы AWS, так и образы, не относящиеся к AWS.
Чтобы указать путь к библиотеке ЕдиногоАгента, используйте переменную среды LD_PRELOAD.
LD_PRELOAD=/opt/dynatrace_layer/agent/lib64/liboneagentproc.so |
Ограничения, управляемые Ключ-АСТРОМ
- Управляемые автономные кластеры не поддерживаются.