Введение в OpenTelemetry

В мире разработки программного обеспечения, где всё может быть хаотично, понимание того, как работает ваше приложение, имеет решающее значение. Здесь на помощь приходит OpenTelemetry, как супергерой, спасающий ситуацию.

OpenTelemetry — это открытый фреймворк, предназначенный для унифицированного сбора, генерации и экспорта данных телеметрии, включая метрики, логи и трассировки. Давайте подробнее рассмотрим, как можно использовать его силу для создания надёжной системы анализа производительности приложений.

Что такое OpenTelemetry?

Это результат слияния проектов OpenTracing и OpenCensus, теперь инкубируемых Cloud Native Computing Foundation (CNCF). Он предлагает набор API, SDK и инструментов, которые стандартизируют сбор и передачу данных телеметрии. Это упрощает мониторинг и отладку приложений без привязки к инструментам наблюдения конкретного поставщика.

Основные компоненты OpenTelemetry:

  • Трассировки, метрики и логи. OpenTelemetry позволяет создавать и собирать три основных типа данных телеметрии:
    • трассировки показывают, как запросы проходят через систему, предоставляя информацию о производительности и поведении приложения;
    • метрики предоставляют количественные данные о производительности системы, такие как использование процессора, потребление памяти и задержка запроса;
    • логи содержат подробную информацию об отдельных событиях в приложении.
  • Инструментирование. Это процесс интеграции OpenTelemetry в код приложения. Может осуществляться двумя способами:
    • кодовое инструментирование: вручную добавляются API OpenTelemetry для создания трасс, метрик и логов;
    • нулевое кодовое инструментирование использует библиотеки автоматического инструментирования, автоматически добавляющие телеметрию в приложение без изменения кода.
  • Коллектор и экспортёры. OpenTelemetry Collector — служба, которая получает, обрабатывает и экспортирует данные телеметрии. Её можно развернуть как отдельный сервис или в виде «сайдкара».

Collector использует приёмники для получения данных от служб, процессоры для их обработки и экспортёры для отправки данных в инструменты анализа.

Настройка OpenTelemetry

Вот пошаговое руководство по настройке OpenTelemetry для вашего приложения:

  1. Установите OpenTelemetry SDK. Сначала установите SDK OpenTelemetry для используемого языка программирования. Пример для Node.js:
const { NodeTracerProvider } = require('@opentelemetry/node');
const { SimpleSpanProcessor } = require('@opentelemetry/tracing');
const { ConsoleSpanExporter } = require('@opentelemetry/tracing';

const provider = new NodeTracerProvider();
provider.addSpanProcessor(new SimpleSpanProcessor(new ConsoleSpanExporter()));
provider.register();
  1. Инструментируйте своё приложение. Затем инструментируйте приложение для генерации данных телеметрии. Вот как создать трассы для входящих HTTP-запросов в приложении Node.js:
const express = require('express');
const { trace } = require('@opentelemetry/api');

const app = express();
const tracer = trace.getTracer('my-service');

app.get('/hello', (req, res) => {
  const span = tracer.startSpan('hello-request');
  try {
    res.send('Hello, World!');
  } finally {
    span.end();
  }
});
  1. Настройте Collector. Настройте OpenTelemetry Collector для приёма и экспорта данных телеметрии. Пример конфигурации для Collector:
receivers:
  otlp:
    protocol: http
    host: localhost
    port: 55678

processors:
  batch:

exporters:
  otlp:
    endpoint: http://localhost:55678
    headers:
      "Content-Type": "application/x-protobuf"

Диаграмма: архитектура OpenTelemetry

Здесь представлена высокоуровневая диаграмма архитектуры OpenTelemetry с использованием синтаксиса Mermaid:

sequenceDiagram participant App participant Collector participant Exporter App->>Collector: Send telemetry data via OTLP Collector->>Collector: Process data (batching, filtering) Collector->>Exporter: Export data Exporter->>Exporter: Analyze and visualize data

Оптимизация производительности с помощью OpenTelemetry

Важно учитывать влияние на производительность при интеграции OpenTelemetry. Вот несколько советов по оптимизации производительности:

  • Тестирование нагрузки и профилирование. Прежде чем внедрять OpenTelemetry в производство, проведите тестирование нагрузки для понимания влияния на производительность. Например, DoorDash провёл тесты нагрузки на своих сервисах и наблюдал увеличение использования ЦП при включении экспортера трасс. Они использовали профилирование ЦП для выявления проблемы с производительностью, связанной с BatchSpanProcessor.
  • Параметры конфигурации. Оптимизируйте конфигурацию BatchSpanProcessor (BSP), чтобы уменьшить нагрузку на ЦП. Вот некоторые параметры конфигурации, которые можно настроить:
    • otel.bsp.max.queue.size управляет максимальным количеством трасс в очереди ожидания;
    • otel.bsp.max.export.batch.size определяет размер пакета перед отправкой трасс коллектору;
    • otel.bsp.schedule.delay устанавливает задержку между пакетными экспортами.

Пример: оптимизация конфигурации BSP:

exporters:
  otlp:
    endpoint: http://localhost:55678
    headers:
      "Content-Type": "application/x-protobuf"

processors:
  batch:
    max_queue_size: 2048
    max_export_batch_size: 512
    schedule_delay_millis: 5000

Заключение

Создание системы анализа производительности приложения с OpenTelemetry — мощный способ получить представление о поведении и производительности вашего приложения. Следуя шагам, описанным выше, и оптимизируя конфигурацию для конкретного случая использования, вы можете гарантировать, что ваша система останется производительной и наблюдаемой.