Мониторинг Ruby приложений с помощью Proto Observability

Подключение трейсинга и сбора метрик для Ruby приложений.

На этой странице:

Введение

Общий процесс подключения Ruby приложения на мониторинг:

  1. Установка ProtoOBP Агента.
  2. Установка Ruby трейсера.
  3. Конфигурирование трейсера.

Установка трейсера

Rails или Hanami

  1. Добавьте datadog gem в ваш Gemfile:

    source 'https://rubygems.org'
    gem 'datadog', require: 'datadog/auto_instrument'
    
  2. Установите gem с помощью bundle install

  3. Создайте файл config/initializers/datadog.rb содержащий:

    Datadog.configure do |c|
      c.remote.enabled = false                                     # обязательно
      c.telemetry.enabled = false                                  # обязательно
      c.tracing.contrib.global_default_service_name.enabled = true # обязательно
      c.service = 'my-app-name'  # имя сервиса для отображения в интерфейсе ProtoOBP, необходимо задать
      c.env = ENV['RACK_ENV']    # окружение для отображения в интерфейсе ProtoOBP, необходимо задать
    
      # дополнительная конфигурация интеграций и трейсера может быть здесь
    end
    

    Используя этот блок можно:

    • добавлять дополнительные параметры конфигурации
    • активировать или реконфигурировать инструментацию

Скоро

Следуйте инструкциям из официальной документации OpenTelemetry для Ruby:

https://opentelemetry.io/docs/languages/ruby/

Конфигурирование трейсера

Параметр Переменная окружения Тип Значение по умолчанию Описание
Глобальные
agent.host DD_AGENT_HOST String 127.0.0.1 Имя хоста Агента, куда будут отсылаться трейсы.
agent.port DD_TRACE_AGENT_PORT Integer 8126 Порт Агента, куда будут отсылаться трейсы.
diagnostics.debug DD_TRACE_DEBUG Bool false Включает или отключает debug режим. Выводит дополнительные логи. Не рекомендуется для продуктивного контура
diagnostics.startup_logs.enabled DD_TRACE_STARTUP_LOGS Bool nil Выводит конфигурацию и диагностические сообщения в лог.
env DD_ENV String nil Название окружения вашего приложения, например, production, staging, и тд
service DD_SERVICE String Ruby filename Имя вашего приложения, например, billing-api
tags DD_TAGS Hash nil Кастомные теги в виде пар ключ:значение разделенные , (например layer:api,team:intake)
version DD_VERSION String nil Версия вашего приложения (например 2.5, 202503181415, 1.3-alpha и тд)
telemetry.enabled DD_INSTRUMENTATION_TELEMETRY_ENABLED Bool true Отправка телеметрии в Datadog. Рекомендуемое значение false. При использовании Агент ProtoOBP телеметрия в Datadog не отправляется в любом случае, но при включении может засорять лог сообщения о недоступности эндпоинта приема телеметрии на агенте
Трейсинг
tracing.contrib.peer_service_mapping DD_TRACE_PEER_SERVICE_MAPPING Hash nil Переопределяет имена сервисов peer.service для всей инструментации. Принимает список вида old_value1:new_value1, old_value2:new_value2, ...
tracing.contrib.global_default_service_name.enabled DD_TRACE_REMOVE_INTEGRATION_SERVICE_NAMES_ENABLED Bool false Изменяет дефолтное значение service_name для всей инструментации. Рекомендуемое значение true
tracing.enabled DD_TRACE_ENABLED Bool true Включает или отключает трейсинг. Если установлено в false инструментация все еще будет работать, но трейсы не будут отсылаться в Агента
tracing.header_tags DD_TRACE_HEADER_TAGS Array nil Позволяет записывать заданные HTTP заголовки как теги спанов.
tracing.instrument(<integration-name>, <options...>) Активирует инструментацию заданной библиотеки.
tracing.log_injection DD_LOGS_INJECTION Bool true Инжектирует информацию о трейсах в лог Rails. Поддерживается дефолтный логгер. (ActiveSupport::TaggedLogging), lograge, и semantic_logger.
tracing.sampling.default_rate DD_TRACE_SAMPLE_RATE Float nil Устанавливает рейт сбора трейсов между 0.0 (0%) and 1.0 (100%).
tracing.sampling.rate_limit DD_TRACE_RATE_LIMIT Integer 100 (в секунду) Устанавливает максимальное количество трейсов для сбора в секунду.
tracing.trace_id_128_bit_generation_enabled DD_TRACE_128_BIT_TRACEID_GENERATION_ENABLED Bool true true для генерации 128 битного trace ID и false для генерации 64 битного trace ID
tracing.report_hostname DD_TRACE_REPORT_HOSTNAME Bool false Добавляет тег hostname к трейсам
apm.tracing.enabled DD_APM_TRACING_ENABLED Bool true Включает или отключает APM трейсинг. Если false, инструментация будет запускаться, но только один APM трейс в минуту будет отправлен Агенту.

Скоро

Следуйте инструкциям из официальной документации OpenTelemetry для Ruby:

https://opentelemetry.io/docs/languages/ruby/

Примеры конфигурации

Если приложение запускается в Docker контейнере

Выполните пункты по установке и настройке трейсера, указанные выше, и добавьте следующие переменные окружения:

  • DD_AGENT_HOST – адрес Агента, на который будет отсылать данные трейсер:
    • если Агент запущен в Docker контейнере, укажите имя Docker контейнера Агента:
      ENV DD_AGENT_HOST="protoobp-agent"
      
      Убедитесь, что контейнер Агента и контейнер приложения находятся в одной Docker сети. Адрес агента должен быть доступен из Docker контейнера приложения.
    • если Агент запущен на хосте как сервис (не в контейнере):
      ENV DD_AGENT_HOST="host.docker.internal"
      
      Убедитесь что в конфигурации Агента разрешен прием APM данных от контейнеров:
      apm_config:
        apm_non_local_traffic: true
      

Пример Dockefile:


# необходимые переменные окружения для работы трейсера Datadog
ENV DD_SERVICE="имя_вашего_сервиса" \
    DD_TRACE_TELEMETRY_ENABLED="false"

Далее задайте значение переменной DD_AGENT_HOST – адрес Агента, на который будет отсылать данные трейсер, например, в файле docker-compose.yaml:

   DD_AGENT_HOST: protoobp-agent

Скоро

Следуйте инструкциям из официальной документации OpenTelemetry для Ruby:

https://opentelemetry.io/docs/languages/ruby/

Если приложение работает в Kubernetes

Убедитесь, что у вас успешно установлен и настроен ProtoOBP Агент для Kubernetes.

Дополнительно необходимо передать поду переменную окружения 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 для Ruby:

https://opentelemetry.io/docs/languages/ruby/

Диагностика неполадок

Если после подключения трейсера данные в интерфейсе ProtoOBP не отображаются:

  1. Проверьте, что установлены все необходимые переменные окружения для работы трейсера.
  2. Дайте нагрузку на приложение (вызовы к приложению).
  3. Проверьте логи запуска вашего приложения (stdout или файл), в них при успешном подключении трейсера должны быть записи от трейсера.
  4. Проверьте, что от контейнера/пода с приложением есть сетевой доступ до Агента по порту 8126/tcp и 8125/udp (в случае Kubernetes – по NodeIP).
  5. Добавьте переменные окружения к приложению для вывода отладочной инфинформации:
    DD_TRACE_STARTUP_LOGS=true
    
  6. Заново дайте назрузку на приложение и проверьте данные в интерфейсе ProtoOBP.