DevGang
Авторизоваться

Повышение уровня 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 будет:

  1. Откроет порты OTLP 4317 (gRPC) и 4318 (HTTP) для получения трассировки.
  2. Включит триггерные прогоны тестов в своей среде.
  3. Облегчит подключение к хранилищу данных трассировки, недоступному за пределами среды, например, к экземпляру 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 выполните следующие действия:

  1. Установите Node.js и npm в локальной среде разработки.
  2. Установите модули 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. Позвольте мне рассказать вам.

Вы можете:

  • Создавать утверждения относительно данных ответа и трассировки в каждой точке транзакции запроса.
  • Создавать утверждения о времени выполнения фрагментов трассировки.
  1. Например, трассировка базы данных выполняется в течение 100ms.
  • Создавать утверждения с использованием специальных символов в общих видах деятельности.
  1. Например, все коды возврата gRPC должны быть равны 0.
  2. Например, все обращения к базе данных должны происходить менее чем за 100ms.
  • Устанавливать защиту от побочных эффектов
  1. Например, от очередей сообщений, асинхронных вызовов API, внешних API и т.д.
  • Создавать интеграции с существующим решением распределенной трассировки.
  • Определять несколько триггеров тестирования:
  1. HTTP-запросы
  2. gRPC-запросы
  3. Идентификаторы трассировки
  4. И многое другое...
  • Сохранять и запускать тесты вручную и с помощью заданий сборки 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 и его возможностях? Ознакомьтесь с документацией и попробуйте его уже сегодня, скачав его!

Источник:

#JavaScript #NodeJS
Комментарии
Чтобы оставить комментарий, необходимо авторизоваться

Присоединяйся в тусовку

В этом месте могла бы быть ваша реклама

Разместить рекламу