Мониторинг Node.js приложений с помощью Proto Observability
На этой странице:
- Введение
- Установка трейсера
- Инициализация трейсера
- Конфигурирование трейсера
- Диагностика неполадок
- Поддерживаемые технологии (трейсер ProtoOBP)
- Сбор runtime метрик Node.js
Введение
Общий процесс подключения Node JS приложения на мониторинг:
- Установка ProtoOBP Агента.
- Установка трейсера.
- Инициализация трейсера.
- Конфигурирование трейсера.
Установка трейсера
- Установка
pobp-traceмодуля:-
В
.npmrcдобавьте аутентификационный токен для репозитория ProtoOBP::registry=https://git.proto.group/projects/125/packages/npm/ //git.proto.group/api/v4/projects/125/packages/npm/:_authToken=<your_token>Где
<your_token>– значение авторизационного токена из вашего лицензионного сертификата (полетокенилипароль). -
Выполните установку модуля из репозитория ProtoOBP:
npm install --no-audit https://git.proto.group/api/v4/projects/125/packages/npm/pobp-trace/-/pobp-trace-2.2.2.tgz
-
Пример добавления токена аутентификации в Gitlab CI
-
в настройках проекта в Gitlab добавьте переменную окружения (
Проект->Settings->CI/CD->Variables):- имя:
PROTOOBP_INSTALL_TOKEN_KEY, значение = ваши данные из лицензионного сертификата (полепарольилитокен)
- имя:
-
.gitlab-ci.yml:script: - echo -e ":registry=https://git.proto.group/projects/125/packages/npm/\n//git.proto.group/api/v4/projects/125/packages/npm/:_authToken=${PROTOOBP_INSTALL_TOKEN_KEY}" >> .npmrc
Node.js 18+
npm install dd-trace --save
Node.js 16
npm install dd-trace@latest-node16
Скоро
Следуйте инструкциям из официальной документации OpenTelemetry для JavaScript:
Инициализация трейсера
-
Вариант 1: В коде приложения первой строкой добавьте импорт модуля:
const tracer = require('pobp-trace').init(); -
Вариант 2: Добавление трейсера через аргументы командной строки:
node --require pobp-trace/init app.jsПримечание: Данный подход требует использования переменных окружения для всех настроек трейсера.
-
Пример запуска для
Nuxt:node --require pobp-trace/init /path/to/your/app/node_modules/nuxt/bin/nuxt.js start
-
-
Вариант 1: В коде приложения первой строкой добавьте импорт модуля:
-
JavaScript:
const tracer = require('dd-trace').init(); -
Для TypeScript и бандлеров, поддерживающих синтаксис модулей
ECMAScript, инициализируйте трейсер в отдельном файле, чтобы сохранить правильный порядок загрузки.// server.ts import './tracer'; // должен быть указан до импорта любых инструментированных модулей // tracer.ts import tracer from 'dd-trace'; tracer.init(); // инициализируется в другом файле export default tracer;Если стандартной конфигурации достаточно или вся настройка выполняется с помощью переменных окружения, можно также использовать
dd-trace/init, который загружается и инициализируется за один шаг.import 'dd-trace/init';
-
-
Вариант 2: Добавление трейсера через аргументы командной строки:
node --require dd-trace/init app.js-
Пример запуска для
Nuxt:node --require pobp-trace/init /path/to/your/app/node_modules/nuxt/bin/nuxt.js start
-
Только для ESM-приложений: импорт лоадера
Приложения ECMAScript Modules (ESM) требуют дополнительного аргумента командной строки. Добавьте этот аргумент независимо от того, как трейсер импортируется и инициализируется:
- Node.js < v20.6:
--loader dd-trace/loader-hook.mjs - Node.js >= v20.6:
--import dd-trace/register.js
Например, в Node.js 22, если инициализировать трейсер с помощью первого из вышеуказанных вариантов, его запуск будет выглядеть следующим образом:
node --import dd-trace/register.js app.js
Это также можно сочетать с аргументом командной строки --require dd-trace/init (вариант два):
node --import dd-trace/register.js --require dd-trace/init app.js
Скоро
Следуйте инструкциям из официальной документации OpenTelemetry для JavaScript:
Конфигурирование трейсера
Добавьте следующие переменные окружения:
POBP_SERVICE=my_service # Имя сервиса, которое будет отображаться в интерфейсе Proto OBP, обязательно
POBP_ENV=prod # Название окружения, желательно, например prod, pre-prod, stage и тд
POBP_VERSION=1.2.3 # Версия приложения, опционально (по умолчанию - версия из package.json)
POBP_AGENT_HOST=protoobp-agent # Адрес Агента, на который будет отсылать данные трейсер (смотри ниже примеры для Docker и Kubernetes)
POBP_RUNTIME_METRICS_ENABLED="true"
POBP_TRACE_EXPERIMENTAL_RUNTIME_ID_ENABLED="true"
POBP_TRACE_TELEMETRY_ENABLED="false"
Добавьте следующие переменные окружения:
DD_SERVICE=my_service # Имя сервиса, которое будет отображаться в интерфейсе Proto OBP, обязательно
DD_ENV=prod # Название окружения, желательно, например prod, pre-prod, stage и тд
DD_VERSION=1.2.3 # Версия приложения, опционально (по умолчанию - версия из package.json)
DD_RUNTIME_METRICS_ENABLED="true"
DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED="true"
DD_TRACE_TELEMETRY_ENABLED="false"
Скоро
Следуйте инструкциям из официальной документации OpenTelemetry для JavaScript:
Примеры конфигурации
Если приложение запускается в Docker контейнере
Выполните пункты по установке и настройке трейсера, указанные выше, и добавьте следующие переменные окружения:
POBP_AGENT_HOST– адрес Агента, на который будет отсылать данные трейсер:- если Агент запущен в Docker контейнере, укажите имя Docker контейнера Агента:
Убедитесь, что контейнер Агента и контейнер приложения находятся в одной Docker сети. Адрес агента должен быть доступен из Docker контейнера приложения.
ENV POBP_AGENT_HOST="protoobp-agent" - если Агент запущен на хосте как сервис (не в контейнере):
Убедитесь что в конфигурации Агента разрешен прием APM данных от контейнеров:
ENV POBP_AGENT_HOST="host.docker.internal"apm_config: apm_non_local_traffic: true
- если Агент запущен в Docker контейнере, укажите имя Docker контейнера Агента:
Пример Dockefile:
FROM node:22.4.1
ARG PROTOOBP_INSTALL_TOKEN_KEY
WORKDIR /opt/server
COPY package.json /opt/server/
# 1) изменяем .npmrc, дефолт — публичный npm
RUN printf "registry=https://registry.npmjs.org/\n" > /root/.npmrc \
&& printf "always-auth=true\n" >> /root/.npmrc \
&& printf "//git.proto.group/api/v4/projects/125/packages/npm/:_authToken=%s\n" "$PROTOOBP_INSTALL_TOKEN_KEY" >> /root/.npmrc
# 2) подключаем pobp-trace как tarball по URL с токеном (НЕ меняя registry)
RUN npm install --no-audit --verbose \
"https://your_token_name:${PROTOOBP_INSTALL_TOKEN_KEY}@git.proto.group/api/v4/projects/125/packages/npm/pobp-trace/-/pobp-trace-2.2.2.tgz"
# остальные пакеты устанавливаются из дефолтного npm репозитория
RUN npm install
COPY server.js /opt/server/
# необходимые переменные окружения для работы трейсера ProtoOBP
ENV POBP_SERVICE="имя_вашего_сервиса" \
POBP_RUNTIME_METRICS_ENABLED="true" \
POBP_TRACE_EXPERIMENTAL_RUNTIME_ID_ENABLED="true" \
POBP_TRACE_TELEMETRY_ENABLED="false"
EXPOSE 8080
#CMD ["node", "server.js"]
CMD ["node", "--require", "pobp-trace/init", "server.js"]
Далее задайте значение переменной POBP_AGENT_HOST – адрес Агента, на который будет отсылать данные трейсер, например, в файле docker-compose.yaml:
POBP_AGENT_HOST: protoobp-agent
Выполните пункты по установке и настройке трейсера, указанные выше, и добавьте следующие переменные окружения:
DD_AGENT_HOST– адрес Агента, на который будет отсылать данные трейсер:- если Агент запущен в Docker контейнере, укажите имя Docker контейнера Агента:
Убедитесь, что контейнер Агента и контейнер приложения находятся в одной Docker сети. Адрес агента должен быть доступен из Docker контейнера приложения.
ENV DD_AGENT_HOST="protoobp-agent" - если Агент запущен на хосте как сервис (не в контейнере):
Убедитесь что в конфигурации Агента разрешен прием APM данных от контейнеров:
ENV DD_AGENT_HOST="host.docker.internal"apm_config: apm_non_local_traffic: true
- если Агент запущен в Docker контейнере, укажите имя Docker контейнера Агента:
Пример Dockefile:
FROM node:22.4.1
WORKDIR /opt/server
COPY package.json /opt/server/
RUN npm install dd-trace --save
RUN npm install
COPY server.js /opt/server/
# необходимые переменные окружения для работы трейсера Datadog
ENV DD_SERVICE="имя_вашего_сервиса" \
DD_RUNTIME_METRICS_ENABLED="true" \
DD_RUNTIME_METRICS_RUNTIME_ID_ENABLED="true" \
DD_TRACE_TELEMETRY_ENABLED="false"
EXPOSE 8080
#CMD ["node", "server.js"]
CMD ["node", "--require", "dd-trace/init", "server.js"]
Далее задайте значение переменной DD_AGENT_HOST – адрес Агента, на который будет отсылать данные трейсер, например, в файле docker-compose.yaml:
DD_AGENT_HOST: protoobp-agent
Скоро
Следуйте инструкциям из официальной документации OpenTelemetry для JavaScript:
Если приложение работает в Kubernetes
Убедитесь, что у вас успешно установлен и настроен ProtoOBP Агент для Kubernetes.
Без использования автоматического подключения трейсера
Дополнительно необходимо передать поду переменную окружения POBP_AGENT_HOST со значением IP адреса воркер-ноды, а также переменные окружения для связи трейсов с инфраструктурой (имя k8s кластера нужно задать вручную).
apiVersion: apps/v1
kind: Deployment
#(...)
spec:
containers:
- name: "<CONTAINER_NAME>"
image: "<CONTAINER_IMAGE>/<TAG>"
env:
- name: POBP_SERVICE
value: dispatch
- name: POBP_AGENT_HOST
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: POBP_TAGS
value: "pod_name:$(POD_NAME),node:$(NODE_NAME),kube_namespace:$(POD_NAMESPACE),kube_cluster_name:<my_cluster_name>"
Дополнительно необходимо передать поду переменную окружения DD_AGENT_HOST со значением IP адреса воркер-ноды, а также переменные окружения для связи трейсов с инфраструктурой (имя k8s кластера нужно задать вручную).
apiVersion: apps/v1
kind: Deployment
#(...)
spec:
containers:
- name: "<CONTAINER_NAME>"
image: "<CONTAINER_IMAGE>/<TAG>"
env:
- name: DD_SERVICE
value: dispatch
- name: DD_AGENT_HOST
valueFrom:
fieldRef:
fieldPath: status.hostIP
- name: NODE_NAME
valueFrom:
fieldRef:
fieldPath: spec.nodeName
- name: POD_NAMESPACE
valueFrom:
fieldRef:
fieldPath: metadata.namespace
- name: POD_NAME
valueFrom:
fieldRef:
fieldPath: metadata.name
- name: DD_TAGS
value: "pod_name:$(POD_NAME),node:$(NODE_NAME),kube_namespace:$(POD_NAMESPACE),kube_cluster_name:<my_cluster_name>"
Скоро
Следуйте инструкциям из официальной документации OpenTelemetry для JavaScript:
С использованием автоматического подключения трейсера Protoobp
Агент ProtoOBP в K8s кластере по умолчанию инструментирует Node.js приложения с лейблом: admission.proto.group/enabled: "true"
-
В спецификации пода приложения добавьте анотацию и лейбл с версией NodeJS трейсинг агента:
apiVersion: apps/v1 kind: Deployment metadata: labels: ... ... template: metadata: annotations: admission.proto.group/js-lib.version: "v1" creationTimestamp: null labels: admission.proto.group/enabled: "true" # Включение автоматической инструментации tags.proto.group/service: "my_service" #Укажите имя сервиса service: my_service -
Если локальный репозиторий Docker образов не используется, то в спецификации пода добавьте
imagePullSecretsдля доступа к Docker репозиторию ProtoOBP. Подробнее о добавление Secret указано в документации Установка агента в KubernetesapiVersion: apps/v1 kind: Deployment metadata: labels: ... ... template: metadata: annotations: admission.proto.group/js-lib.version: "latest" #Рекомендуем использовать последнюю версию NodeJS трейсинг агента creationTimestamp: null labels: admission.proto.group/enabled: "true" # Включение автоматической инструментации service: my_service spec: containers: ... ... imagePullSecrets: - name: protoobp-registry
Автоматическое подключение трейсера Protoobp без использования лейблов
В конфигурации агента вы можете включить автоматическую инструментацию без использования лейблов.
Обратите внимание
При этом все равно необходимо добавлять аннотацию к поду, в которой указать версию образа библиотеки инструментации.Диагностика неполадок
Если после подключения трейсера данные в интерфейсе ProtoOBP не отображаются:
- Проверьте, что установлены все необходимые переменные окружения для работы трейсера.
- Дайте нагрузку на приложение (вызовы к приложению).
- Проверьте логи запуска вашего приложения (stdout или файл), в них при успешном подключении трейсера должны быть записи от трейсера.
- Проверьте, что от контейнера/пода с приложением есть сетевой доступ до Агента по порту
8126/tcpи8125/udp(в случае Kubernetes – поNodeIP). - Добавьте переменные окружения к приложению для вывода отладочной инфинформации:
POBP_TRACE_STARTUP_LOGS=true - Заново дайте назрузку на приложение и проверьте данные в интерфейсе ProtoOBP.
Пример лога запуска приложений с трейсером:
rs-cart | PROTOOBP TRACER CONFIGURATION - {"date":"2025-08-07T11:22:41.989Z","os_name":"Linux","os_version":"5.15.0-151-generic","architecture":"x64","version":"2.2.2","la
ng":"nodejs","lang_version":"22.4.1","env":"","service":"cart","agent_url":"http://protoobp-agent:8126","debug":false,"sample_rate":1,"sampling_rules":[],"tags":{"team":"de
vops","service_group":"ecommerce_app","service":"cart","env":"","version":"1.0.0","runtime-id":"4c10336d-8d6e-4cfc-8e90-a129776243c4"},"pobp_version":"1.0.0","log_injection
_enabled":true,"runtime_metrics_enabled":true,"profiling_enabled":false,"integrations_loaded":[],"appsec_enabled":false}
- На строне агента:
- проверьте логи агента на предмет ошибок подключения к бэкенду.
Поддерживаемые технологии (трейсер ProtoOBP)
Поддерживаемые версии Node.js
Поддерживаются актуальные LTS версии Node.js.
Автоматическая инструментация веб-фрейморков
| Модуль | Версии | Поддержка | Примечания |
|---|---|---|---|
| connect | >=2 |
✅ | |
| express | >=4 |
✅ | Поддерживает Sails, Loopback |
| fastify | >=1 |
✅ | |
| graphql | >=0.10 |
✅ | Поддерживает Apollo Server и express-graphql |
| gRPC | >=1.13 |
✅ | |
| hapi | >=2 |
✅ | Поддерживает @hapi/hapi версии >=17.9 |
| koa | >=2 |
✅ | |
| microgateway-core | >=2.1 |
✅ | Apigee Edge |
| moleculer | >=0.14 |
✅ | |
| next | >=9.5 |
✅ | Для CLI требуется NODE_OPTIONS='-r pobp-trace/init'. |
| paperplane | >=2.3 |
✅ | Не поддерживается в режиме serverless-mode |
| restify | >=3 |
✅ |
Автоматическая инструментация нативных модулей
| Модуль | Поддержка | Примечания |
|---|---|---|
| dns | ✅ | |
| fs | ✅ | |
| http | ✅ | |
| https | ✅ | |
| http2 | Частичная поддержка | Только HTTP2 клиенты, а не серверы. |
| net | ✅ |
Хранилища данных
| Модуль | Версии | Поддержка | Примечания |
|---|---|---|---|
| cassandra-driver | >=3 |
✅ | |
| couchbase | ^2.4.2 |
✅ | |
| elasticsearch | >=10 |
✅ | Поддерживается @elastic/elasticsearch версии >=5 |
| ioredis | >=2 |
✅ | |
| knex | >=0.8 |
✅ | Только паспространение контекста |
| memcached | >=2.2 |
✅ | |
| mongodb-core | >=2 |
✅ | Поддерживается Mongoose |
| mysql | >=2 |
✅ | |
| mysql2 | >=1 |
✅ | |
| oracledb | >=5 |
✅ | |
| pg | >=4 |
✅ | Поддерживается pg-native когда используется с pg |
| redis | >=0.12 |
✅ | |
| sharedb | >=1 |
✅ | |
| tedious | >=1 |
✅ | SQL Server драйвер для mssql и sequelize |
Совместимость с системами очередей сообщений
| Модуль | Версии | Поддержка | Примечания |
|---|---|---|---|
| @google-cloud/pubsub | >=1.2 |
✅ | |
| amqp10 | >=3 |
✅ | Поддерживаются AMQP 1.0 брокеры, такие как ActiveMQ или Apache Qpid) |
| amqplib | >=0.5 |
✅ | Поддерживаются AMQP 0.9 брокеры такие как RabbitMQ или Apache Qpid) |
| generic-pool | >=2 |
✅ | |
| kafkajs | >=1.4 |
✅ | |
| kafka-node | В разработке | ||
| rhea | >=1 |
✅ |
Совместимость с Promise библиотеками
| Модуль | Версии | Поддержка |
|---|---|---|
| bluebird | >=2 |
✅ |
| promise | >=7 |
✅ |
| promise-js | >=0.0.3 |
✅ |
| q | >=1 |
✅ |
| when | >=3 |
✅ |
Совместимость с логгерами
| Модуль | Версии | Поддержка |
|---|---|---|
| bunyan | >=1 |
✅ |
| paperplane | >=2.3.2 |
✅ |
| pino | >=2 |
✅ |
| winston | >=1 |
✅ |
Сбор runtime метрик Node.js
Помимо трейсов, ошибок и метрик по трейсам, Proto OBP также собирает runtime метрики Node.js приложений. Runtime метрики отображаются на дашборде конкретного инстанса сервиса.
