Повышение уровня Node.js E2E и интеграционного тестирования с помощью OpenTelemetry
В этом руководстве я расскажу вам о настройке приложения Node.js с инструментарием OpenTelemetry и интеграции Tracetest для улучшения сквозных (E2E) и интеграционных тестов с помощью тестирования на основе трассировки.
Что такое OpenTelemetry?
OpenTelemetry - это фреймворк для обеспечения наблюдаемости, позволяющий разработчикам собирать, генерировать и управлять данными телеметрии в своих приложениях. Она предоставляет набор API, SDK и библиотек инструментария, позволяющих разработчикам инструментировать свой код и собирать метрики, трассировки и журналы.
Это мощный инструмент для понимания поведения сложных распределительных систем и повышения наблюдаемости и надежности приложений.
Что такое Tracetest?
Tracetest - это инструмент тестирования на основе трассировки, основанный на OpenTelemetry. Он предназначен для эффективного тестирования распространяемых приложений. Используя данные из распределенных трассировок, генерируемых OpenTelemetry, Tracetest позволяет легко проверить и подтвердить, что приложения Node.js работают так, как задумано, в соответствии с предопределенными тестовыми определениями.
Необходимые условия
Прежде чем приступить к работе, убедитесь, что у вас выполнены следующие необходимые условия:
- Docker (опционально)
- Node.js и npm установлены на Ваш компьютер
Структура проекта
Проект содержит приложение Node.js с инструментарием OpenTelemetry. Приложение Node.js, представляющее собой простое приложение Express, содержится в файле app.js
. Функциональность трассировки OpenTelemetry инкапсулирована в файлы tracing.otel.grpc.js
или tracing.otel.http.js
, что позволяет передавать трассировку в Tracetest Agent.
Вы устанавливаете Tracetest Agent и запускаете его локально в своей среде разработки.
Давайте погрузимся в процесс настройки.
Tracetest Agent для локальной разработки с OpenTelemetry
Для запуска Tracetest Agent установите Tracetest CLI.
Чтобы запустить Tracetest Agent локально, выполните в терминале следующую команду:
tracetest start
После запуска Tracetest Agent будет:
- Откроет порты OTLP
4317
(gRPC) и4318
(HTTP) для получения трассировки. - Включит триггерные прогоны тестов в своей среде.
- Облегчит подключение к хранилищу данных трассировки, недоступному за пределами среды, например, к экземпляру Jaeger, работающему в кластере без контроллера Ingress.
Приложение на Node.js с инструментарием OpenTelemetry
Приложение Node.js представляет собой простейшее приложение Express, содержащееся в файле app.js
.
Вот простейший файл app.js
:
const express = require("express")
const app = express()
app.get("/", (req, res) => {
setTimeout(() => {
res.send("Hello World")
}, 1000);
})
app.listen(8080, () => {
console.log(`Listening for requests on http://localhost:8080`)
})
В зависимости от вашего выбора трассировки будут отправляться на конечную точку gRPC
или HTTP
Tracetest Agent. Настроить это можно с помощью переменной окружения OTEL_EXPORTER_OTLP_TRACES_ENDPOINT
.
Приведём фрагмент из файла tracing.otel.grpc.js
:
const opentelemetry = require('@opentelemetry/sdk-node');
const { getNodeAutoInstrumentations } = require('@opentelemetry/auto-instrumentations-node');
const { OTLPTraceExporter } = require('@opentelemetry/exporter-trace-otlp-grpc');
const sdk = new opentelemetry.NodeSDK({
traceExporter: new OTLPTraceExporter(),
instrumentations: [getNodeAutoInstrumentations()],
});
sdk.start();
Чтобы включить трассировщик, предварительно загрузите файл трассировки с помощью следующей команды:
node -r ./tracing.otel.grpc.js app.js
В файле package.json
вы найдете npm-скрипты для запуска соответствующих трассировщиков вместе с app.js
:
"scripts": {
"with-grpc-tracer": "node -r ./tracing.otel.grpc.js app.js",
"with-http-tracer": "node -r ./tracing.otel.http.js app.js"
}
Для запуска сервера выполните одну из следующих команд:
npm run with-grpc-tracer
# or
npm run with-http-tracer
Запуск приложения Node.js с помощью Docker Compose
Для запуска приложения Node.js с помощью Docker Compose мы предоставили файл docker-compose.yaml
и Dockerfile
. Dockerfile
использует указанную команду для запуска приложения:
ROM node:slim
WORKDIR /usr/src/app
COPY package*.json ./
RUN npm install
COPY . .
EXPOSE 8080
CMD [ "npm", "run", "with-grpc-tracer" ]
Файл docker-compose.yaml
определяет сервис для приложения Node.js:
version: '3'
services:
app:
image: quick-start-nodejs
extra_hosts:
- "host.docker.internal:host-gateway"
build: .
ports:
- "8080:8080"
environment:
- OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://host.docker.internal:4317
Для инициализации выполните следующие команды:
docker compose build # optional if you haven't already built the image
docker compose up
Это запустит приложение Node.js и направит трассировки в Tracetest Agent.
Локальный запуск приложения Node.js
Для локального запуска приложения Node.js выполните следующие действия:
- Установите Node.js и npm в локальной среде разработки.
- Установите модули npm, экспортируйте конечную точку OTLP и запустите приложение на Node.js:
npm i
export OTEL_EXPORTER_OTLP_TRACES_ENDPOINT=http://localhost:4317
npm run with-grpc-tracer
Это приведет к запуску приложения Node.js и отправке трассировок в Tracetest Agent.
Создание первого теста на основе трассировок
Перейдите в Tracetest и начните создавать тесты. Убедитесь, что при создании тестов вы используете URL-адрес http://localhost:8080/
, чтобы эффективно использовать тестирование на основе трассировки, предоставляемое Tracetest.
Теперь вы можете улучшить E2E- и интеграционные тесты в своих Node.js-приложениях с помощью Tracetest и OpenTelemetry.
Перейдите на вкладку Test
и начните добавлять утверждения.
Приступим к добавлению тестовой спецификации, утверждающей, что все HTTP-запросы возвращаются в течение 500ms
. Нажмите кнопку Add Test Spec
.
В селекторе диапазонов обязательно добавьте этот селектор:
span[tracetest.span.type="http"]
В нем будут выбраны диапазоны HTTP.
В поле утверждения добавьте:
attr:tracetest.span.duration < 500ms
Сохраните спецификацию теста и опубликуйте его.
В этом тесте проверяются все диапазоны HTTP, их длительность должна быть меньше 500ms
.
Если вам интересно, что еще можно сделать с помощью Tracetest. Позвольте мне рассказать вам.
Вы можете:
- Создавать утверждения относительно данных ответа и трассировки в каждой точке транзакции запроса.
- Создавать утверждения о времени выполнения фрагментов трассировки.
- Например, трассировка базы данных выполняется в течение
100ms
.
- Создавать утверждения с использованием специальных символов в общих видах деятельности.
- Например, все коды возврата gRPC должны быть равны 0.
- Например, все обращения к базе данных должны происходить менее чем за
100ms
.
- Устанавливать защиту от побочных эффектов
- Например, от очередей сообщений, асинхронных вызовов API, внешних API и т.д.
- Создавать интеграции с существующим решением распределенной трассировки.
- Определять несколько триггеров тестирования:
- HTTP-запросы
- gRPC-запросы
- Идентификаторы трассировки
- И многое другое...
- Сохранять и запускать тесты вручную и с помощью заданий сборки CI.
- Проверять и анализировать качество приборов OpenTelemetry для обеспечения соблюдения правил и стандартов.
- Тестировать длительно работающие процессы.
Создавайте тесты за минуты, а не за дни!
А как насчет тестовых наборов? Это тоже можно сделать. Создайте несколько тестов и запускайте их последовательно.
Автоматизируйте тестирование Node.js
Tracetest предназначен для работы со всеми платформами CI/CD и средствами автоматизации. Чтобы Tracetest мог работать в CI/CD-средах, обязательно установите Tracetest CLI.
Перейдите на вкладку Automate. Здесь вы найдете определение теста.
Запустить тест с помощью команды CLI можно либо через идентификатор теста, либо через файл определения теста.
Давайте сначала попробуем использовать определение теста на случай, если вы хотите хранить тесты в репозитории GitHub.
Скопируйте определение теста и вставьте его в файл node-api-test.yaml
.
type: Test
spec:
id: DYEmKk7Ig
name: nodejs app 1
trigger:
type: http
httpRequest:
method: GET
url: http://localhost:8080
headers:
- key: Content-Type
value: application/json
specs:
- selector: span[tracetest.span.type="http"]
name: Validate all the HTTP spans return within 500ms.
assertions:
- attr:tracetest.span.duration < 500ms
Запустите тест с помощью приведенной ниже команды.
tracetest run test --file node-api-test.yaml --output pretty
В качестве альтернативы можно запустить тест без файла, передав вместо него идентификатор теста. Установите флажок " Use tests ID instead of file
" в положение "on".
В результате вы получите еще одну команду, которую можно скопировать и запустить в терминале.
tracetest run test --id DYEmKk7Ig --output pretty
[Output]
✘ nodejs-app-test-1 (https://app.tracetest.io/organizations/<orgid>/environments/<envid>/test/<testid>/run/7/test) - trace id: 5cf8c7bfe736428c3fe922a9ac95060e
✘ Validate all the HTTP spans return within 500ms.
✔ #bb72b34d9ce04d4a
✔ attr:tracetest.span.duration < 500ms (558us)
✔ #f5f919a47c3f222a
✔ attr:tracetest.span.duration < 500ms (479us)
✔ #5b2cb1a5762b9ea2
✔ attr:tracetest.span.duration < 500ms (313us)
✘ #9f0058fa82ece013
✘ attr:tracetest.span.duration < 500ms (1.1s)
Не забудьте заменить ID теста на ID вашего теста.
Теперь вы знаете, как запускать и автоматизированные тесты! Встраивание определений тестов в кодовую базу позволит вам легко запускать интеграционные и E2E-тесты в конвейерах CI.
Успешное тестирование приложения OpenTelemetry Instrumented Node.js!
Используя данные распределенных трассировок, генерируемых OpenTelemetry, Tracetest обеспечивает соответствие приложений заданным спецификациям тестирования.
В этом руководстве показано, как легко интегрировать Tracetest с приложением Node.js и использовать инструментарий OpenTelemetry для улучшения сквозного (E2E) и интеграционного тестирования. Эта мощная комбинация не только расширяет возможности тестирования, но и повышает надежность и устойчивость на протяжении всего жизненного цикла разработки.
С помощью Tracetest и OpenTelemetry тестирование становится не просто рутинной задачей, а стратегическим активом в поставке высококачественных, хорошо протестированных приложений!
Что же дальше?
Вы хотите узнать больше о Tracetest и его возможностях? Ознакомьтесь с документацией и попробуйте его уже сегодня, скачав его!