intermediate
Span'ы
Представляйте единицы работы с именем, атрибутами, статусом, parent-child связями и осмысленными границами.
Span — единица работы с именем, временем начала/конца, атрибутами, статусом и parent-child связями. Хорошие границы совпадают с тем, что важно инженеру: HTTP handler, запрос к БД, cache, внешний API.
await tracer.startActiveSpan('stripe.charge', async (span) => {
span.setAttribute('payment.provider', 'stripe');
try {
await stripe.charges.create(payload);
span.setStatus({ code: SpanStatusCode.OK });
} catch (err) {
span.recordException(err);
span.setStatus({ code: SpanStatusCode.ERROR });
throw err;
}
});
| Атрибут | Пример | |---------|--------| | http.route | `/checkout` | | db.system | `postgresql` | | messaging.destination | `receipts` |
Избегайте high-cardinality (SQL с литералами, полные URL с ID). Semantic conventions (OpenTelemetry) для совместимости.
На интервью: именование spans, parent/child vs links при fan-out, internal vs client spans.
Типовые ошибки: один гигантский span на запрос скрывает время БД; нет error status; атрибуты ломают cardinality в backend.
Компромисс — детализация диагностики против размера trace и лимитов индексации.
Чеклист:
- Имена по операциям, не по классам.
- Error status и recordException.
- Атрибуты с низкой cardinality.
- Вложенность для critical path.