Комментарии (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
Сравнение с альтернативами
| Инструмент | Type | Vendor Lock | Auto-instrument |
|---|---|---|---|
| OpenTelemetry | Standard | Нет ✓ | Да ✓ |
| Jaeger | Tracing | Partial | Partial |
| Prometheus | Metrics | Partial | Manual |
| ELK Stack | Logs | Partial | Manual |
| DataDog | All | Да ❌ | Да |
| New Relic | All | Да ❌ | Да |
| AWS X-Ray | Tracing | Да ❌ | Да |
Реальный пример: микросервисная система
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 для веба, но для телеметрии:
- Traces — видишь весь путь запроса
- Metrics — числовые показатели системы
- Logs — структурированные логи с контекстом
- Vendor-agnostic — работает с любым backend
- Auto-instrumentation — работает из коробки
Рекомендация: В 2024+ это стандартный выбор для observability в Java приложениях.