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.