Проте в розподілених системах синхронна взаємодія не дуже заохочується. Якщо сильно упаруватись в RPC виклики, то дуже легко отримати нестабільну крихку конструкцію, яка перестає працювати, якщо одна з її ланок (десь дуже в глибині) зламається.
Натомість практикуються асинхронні патерни взаємодії, такі, як обмін повідомленнями через сторонніх брокерів. І от на таку штуку натягнути трасування може бути доволі проблематично.
Бо обробники запитів замінюються на обробники повідомлень, а у повідомленнях не завжди просто визначити той самий оригінальний TraceID. Одне і те саме повідомлення може впливати на стан багатьох різних сервісів (отримали інформацію, що на складі немає певного товару – треба прибрати його з фронту, і також треба щось зробити із замовленнями на нього. Остання операція може зайняти час, замовлень може бути багато, і запуститись вона може далеко не одразу). Тому не дуже зрозуміло шо має бути взагалі показано на трасі.
Технічно це все можливо зробити, бо той же самий W3C Trace-Context це просто набір ключів та значень, і їх можна передавати у метаданих повідомлень. Проте проблема саме у питання "що саме я хочу трасувати і нащо". І зазвичай знаходяться інші, більше прості і зрозумілі рішення для таких питань.
І наостанок додам, що існують продукти під назвою APM системи (Application Performance Monitoring). Хоча цей акронім насправді не означає певний продукт, а скоріше це процес. Проте також він вживається для продуктів, які інтегрують логи, метрики і трасування "все в одному". Той же самий DataDog, або Elastic Observability (що раніше називався Elastic APM).
Про них треба знати те, що
- вони існують
- вони коштують грошей (зазвичай багато)
- вони дуже зручні в користуванні
- їм є заміна, або open source self hosted, або вбудовані рішення вашого хмарного провайдера.