Мониторинг 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_TRACE_EXPERIMENTAL_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"]
Далее задайте значение переменной 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_TRACE_EXPERIMENTAL_RUNTIME_ID_ENABLED="true" \
    DD_TRACE_TELEMETRY_ENABLED="false"
EXPOSE 8080
CMD ["node", "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 метрики отображаются на дашборде конкретного инстанса сервиса.
