spinny:~/writing $ less opentelemetry-nodejs-observability-guide.md
12Перший раз, коли вам справді потрібна спостережливість, це не тоді, коли ви спокійно дивитеся на приладову панель. Коли користувач пише «оплата йде повільно», графік помилок виглядає нормально, а в журналах ви знайдете лише рядок відключених повідомлень.34OpenTelemetry було створено, щоб уникнути цього моменту: не для того, щоб мати більше графіки, а для того, щоб з’єднати частини. Запит надходить у API, викликає базу даних, проходить через зовнішнього постачальника, публікує завдання в черзі та, можливо, завершує роботу трьох служб пізніше. Без розподіленого трасування ви реконструюєте цю історію вручну. З OpenTelemetry у вас принаймні є карта.56## Справа не в trace, а в історії78trace є послідовністю span. У такому вигляді це звучить холодно. На практиці кожен span є частиною історії: `POST /checkout`, `SELECT inventory`, `call payment provider`, `publish order.created`.910Цінність приходить, коли ви починаєте відповідати на реальні запитання:1112- який зовнішній сервіс сповільнюється?13- помилки походять від певної версії?14- проблема стосується всіх чи лише одного орендаря?15- повторна спроба приховує тайм-аут?16- асинхронне завдання починається, але потім вмирає в іншому місці?1718Ці питання неможливо вирішити `console.log`, кинутою поспішно. Дійсно, часто журнал, доданий в екстреній ситуації, допомагає вам сьогодні, а завтра стає шумом.1920## Як розмістити це в додатку Node.js2122Найкраще налаштування просте: додаток створює телеметрію, Collector вирішує, куди її надіслати.2324```text25Node.js app -> OpenTelemetry Collector -> backend di observability26```2728Чому б не експортувати безпосередньо до постачальника? Оскільки спочатку це здається швидшим, потім ви розумієте, що кожна служба має різні конфігурації, різні повторні спроби, різні фільтри та немає центральної точки для видалення конфіденційних даних або зміни призначення.2930Collector нудний у всіх правильних аспектах. Він отримує OTLP, виконує пакетування, може фільтрувати, може робити вибірку, може додавати загальні атрибути та може експортувати до кількох систем.3132## Власне інструментування: добре, але недостатньо3334У Node.js я б почав з автоматичного інструментування. Це дає вам миттєве бачення HTTP, підтримуваних фреймворків, баз даних і загальних бібліотек.3536```bash37npm install @opentelemetry/sdk-node \38 @opentelemetry/auto-instrumentations-node \39 @opentelemetry/exporter-trace-otlp-http40```4142Потім ви ініціалізуєте SDK перед рештою програми:4344```typescript45import { NodeSDK } from '@opentelemetry/sdk-node';46import { OTLPTraceExporter } from '@opentelemetry/exporter-trace-otlp-http';47import { getNodeAutoInstrumentations } from '@opentelemetry/auto-instrumentations-node';4849const sdk = new NodeSDK({50 traceExporter: new OTLPTraceExporter({51 url: process.env.OTEL_EXPORTER_OTLP_TRACES_ENDPOINT,52 }),53 instrumentations: [getNodeAutoInstrumentations()],54});5556sdk.start();57```5859Однак це бачить структуру, а не ваш продукт. Він знає, що ви зробили запит, але не знає, що запит був у «створити порядок» або «оновити підписку». Для цього вам знадобиться span посібників у точках, де враховується домінування.6061```typescript62const span = tracer.startSpan('checkout.create_order');6364try {65 span.setAttribute('cart.items_count', input.items.length);66 const order = await createOrder(input);67 span.setAttribute('order.id', order.id);68 return order;69} catch (error) {70 span.recordException(error as Error);71 throw error;72} finally {73 span.end();74}75```7677Я б нікуди не клав посібники span. Я б поклав їх туди, де о третій ночі хотів би зрозуміти, що сталося, не читаючи половини кодової бази.7879## Три правила, які допоможуть уникнути хаосу8081Перше правило: кожна служба повинна мати `service.name`, середовище та версію. Це здається тривіальним, але без цих атрибутів trace набагато менш корисний. Коли розгортання щось порушує, ви хочете відфільтрувати за версією за дві секунди.8283Друге правило: не розміщуйте конфіденційні дані в атрибутах. Електронні листи, токени, цілочисельні дані та адреси не повинні випадково опинитися в системі спостереження. Якщо вам потрібно ідентифікувати користувача, розгляньте внутрішні ідентифікатори, хешування або менш конфіденційні поля.8485Правило третє: звертайте увагу на потужність. `user.id` як атрибут trace може мати сенс. Як ярлик показника він може знищити ваші витрати та продуктивність.8687## Показники: мало, але добре8889Я б почав із дуже практичних показників:9091- частоти, похибки та тривалість запитів;92- латентність зовнішніх залежностей;93- кількість тайм-аутів і повторних спроб;94- глибина хвостиків;95- тривалість роботи;96- відсоток помилок на версію.9798Решта додається при необхідності. Інформаційні панелі, наповнені графіками, на які ніхто не дивиться, — це меблі, а не можливість спостереження.99100## Журнали: все ще корисні, але пов’язані101102Журнали не зникають. Вони просто стають набагато кориснішими, коли носять `trace_id` та `span_id`. Отже, ви можете почати з журналу помилок і відкрити trace або почати з повільного trace і прочитати лише журнали, створені на цьому шляху.103104Без кореляції ви шукаєте голки. Завдяки кореляції ви принаймні знаєте, у яку шухляду шукати.105106## Контрольний список, яким я б скористався, перш ніж сказати "ми охоплені"107108- trace фактично перетинає кілька послуг.109- Журнали включають `trace_id` та `span_id`.110- Collector налаштовано з обмеженнями пакетування та пам’яті.111- Помилки записуються в span.112– Існує політика відбору проб.113- Метрики мають керовану потужність.114- Конфіденційні дані фільтруються.115- Сповіщення починаються з симптомів користувача, а не з випадкових графіків.116117## Висновок118119OpenTelemetry самостійно не вирішує виробничі проблеми. Але те, як ви з ними справляєтеся, змінюється. Замість того, щоб сліпо додавати журнали, ви починаєте слідувати фактичному шляху запиту.120121Для мене ознака того, що це працює, проста: коли щось стається, команда перестає запитувати «куди ми дивимося?» і починає запитувати "чому цей твір повільний?". Ось де спостережливість стає інструментом, а не набором інформаційних панелей.122123## Джерела124125- [OpenTelemetry: Overview](https://opentelemetry.io/docs/specs/otel/overview/)126- [OpenTelemetry Collector: Configuration](https://opentelemetry.io/docs/collector/configuration/)127- [OpenTelemetry JavaScript: Node.js getting started](https://opentelemetry.io/docs/languages/js/getting-started/nodejs/)128- [OpenTelemetry Semantic Conventions](https://opentelemetry.io/docs/concepts/semantic-conventions/)129
:OpenTelemetry у виробництві: зупинити налагодження в темрявіlines 1-129 (END) — press q to close