← Назад к вопросам

Что такое OpenTelemetry?

2.0 Middle🔥 201 комментариев
#Docker, Kubernetes и DevOps

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI22 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

# OpenTelemetry — Standardized Observability

Что это

OpenTelemetry (OTel) — это open-source стандарт для сбора и экспорта телеметрических данных из приложений: трассы (traces), метрики (metrics) и логи (logs).

Проблема, которую решает

До OpenTelemetry каждое приложение использовало разные инструменты:

Tracing:  Jaeger, DataDog, New Relic, Elastic
Metrics:  Prometheus, Datadog, New Relic
Logs:     ELK stack, Splunk, Datadog

Проблема: нельзя было переключиться между провайдерами без переписания кода!

OpenTelemetry решает это через стандартизацию и vendor-агностицизм.

Три столпа Observability

1. Traces (Трассировка)

Покажет полный путь запроса через систему:

@RestController
public class UserController {
    @GetMapping("/users/{id}")
    public User getUser(@PathVariable Long id) {
        // Trace начинается здесь
        // HTTP Request → Controller → Service → Database
        // OTel автоматически отслеживает все
        return userService.getUserById(id);
    }
}

Визуально:

Span: HTTP GET /users/123
├── Span: UserService.getUserById
│   ├── Span: Database Query SELECT...
│   │   └── 15ms
│   └── 20ms
└── 25ms total

2. Metrics (Метрики)

Числовые показатели системы:

// Счётчик запросов
Meter meter = GlobalMetricsProvider.getMeter("myApp");
LongCounter requestCounter = meter
    .counterBuilder("http.requests")
    .build();
requestCounter.add(1);

// Гистограмма времени ответа
LongHistogram histogram = meter
    .histogramBuilder("http.response.time")
    .build();
histogram.record(150); // ms

Примеры метрик:

  • HTTP requests per second
  • Average response time
  • Error rate
  • JVM memory usage
  • Database connection pool utilization

3. Logs (Логи)

Структурированные логи с контекстом:

import io.opentelemetry.api.logs.Logger;

Logger logger = LoggerProvider.getInstance().get("myApp");

logger.log(
    io.opentelemetry.api.logs.LogRecord
    .builder("User created", "info")
    .setAttribute("userId", 123)
    .setAttribute("email", "user@example.com")
    .build()
);

Архитектура OpenTelemetry

Южу приложение
      ↓
  OTel SDKs (Instrumentations)
      ↓
  Collectors (экспортируют данные)
      ↓
┌─────────────────────────────────┐
│   Backend (выбираешь сам):      │
│   - Jaeger                      │
│   - Prometheus                  │
│   - DataDog                     │
│   - Elasticsearch               │
│   - Grafana Loki                │
│   - Google Cloud Trace          │
│   - AWS X-Ray                   │
│   - New Relic                   │
└─────────────────────────────────┘

Пример использования в Spring Boot

1. Зависимости

<dependency>
    <groupId>io.opentelemetry.instrumentation</groupId>
    <artifactId>opentelemetry-spring-boot-starter</artifactId>
    <version>1.30.0</version>
</dependency>

<dependency>
    <groupId>io.opentelemetry.exporter</groupId>
    <artifactId>opentelemetry-exporter-jaeger</artifactId>
    <version>1.30.0</version>
</dependency>

2. Конфигурация

# application.yml
otel:
  sdk:
    disabled: false
  exporter:
    otlp:
      endpoint: http://jaeger-collector:4317
  service:
    name: myapp
    version: 1.0.0
  traces:
    exporter: otlp
  metrics:
    exporter: otlp

3. Код приложения (часто автоматический!)

@SpringBootApplication
public class Application {
    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

// OTel автоматически инструментирует:
// - HTTP requests/responses
// - Database queries
// - Redis operations
// - HTTP client calls
// - Message queues
// - И много другое

4. Кастомные spans

@Service
public class OrderService {
    
    @Autowired
    private Tracer tracer; // инъецируется OTel Tracer
    
    public Order createOrder(Order order) {
        // Создаём кастомный span
        Span span = tracer.spanBuilder("createOrder")
            .setAttribute("orderId", order.getId())
            .setAttribute("amount", order.getAmount())
            .startSpan();
        
        try (Scope scope = span.makeCurrent()) {
            // этот код выполняется внутри span
            saveToDatabase(order);
            notifyWarehouse(order);
            return order;
        } catch (Exception e) {
            span.recordException(e);
            span.setStatus(StatusCode.ERROR);
            throw e;
        } finally {
            span.end();
        }
    }
}

Автоматическая инструментация (Agent)

Java Agent может автоматически добавить instrumentation без изменения кода:

java -javaagent:opentelemetry-javaagent.jar \
     -Dotel.traces.exporter=jaeger \
     -Dotel.exporter.jaeger.endpoint=http://jaeger:14250 \
     -Dotel.service.name=myapp \
     -jar myapp.jar

Преимущества OpenTelemetry

✓ Vendor-агностичен — не привязан к конкретному backend
✓ Стандартизирован — используется по всему миру
✓ Open source — бесплатный
✓ Автоматическая инструментация — работает из коробки
✓ Кастомизируемый — можешь добавлять свои spans
✓ Production-ready — используется в Facebook, Google, Microsoft
✓ Поддержка всех языков (Java, Python, Go, Node.js и т.д.)
✓ Интеграция с популярными frameworks

Сравнение с альтернативами

ИнструментTypeVendor LockAuto-instrument
OpenTelemetryStandardНет ✓Да ✓
JaegerTracingPartialPartial
PrometheusMetricsPartialManual
ELK StackLogsPartialManual
DataDogAllДа ❌Да
New RelicAllДа ❌Да
AWS X-RayTracingДа ❌Да

Реальный пример: микросервисная система

UI → API Gateway → UserService → PaymentService → Database
     ↑                                  ↑           ↑
     └─────────────────────────────────┴───────────┘
            Все инструментированы OTel

Когда приходит запрос:
- OTel видит весь путь (trace)
- Видит latency на каждом шаге
- Видит ошибки где они произошли
- Видит метрики (CPU, memory, DB connections)

Когда использовать OpenTelemetry

Используй если:

✓ Микросервисная архитектура
✓ Нужна полная видимость в систему
✓ Хочешь гибкость в выборе backend
✓ Production приложение
✓ Работаешь в distributed системе
✓ Нужна debug информация

Не нужен если:

✗ Простое монолитное приложение
✗ Уже есть полная инструментация
✗ Нет production требований
✗ Очень tight constraints (embedded system)

Заключение

OpenTelemetry — это стандарт наблюдаемости для modern приложений. Это как HTTP для веба, но для телеметрии:

  1. Traces — видишь весь путь запроса
  2. Metrics — числовые показатели системы
  3. Logs — структурированные логи с контекстом
  4. Vendor-agnostic — работает с любым backend
  5. Auto-instrumentation — работает из коробки

Рекомендация: В 2024+ это стандартный выбор для observability в Java приложениях.