Изисквания: В архитектурата на микросервизите, при среща с проблеми, често е много трудно да се диагностицира, тъй като не се знае дали това е изключение, хвърлено от услугата, може да е грешка или да има проблем с информацията, предавана от услугата, която извиква услугата. Ако контекстът на всички заявки може да бъде записан, тоест връзката към цялата заявка за пълна транзакция, критично е да се диагностицира и анализира проблема.
Преглед:
Следите на стека изключения са идеални за приложения, които таргетират един процес, като монолитна система за приложения. Но от друга страна, за работа с разпределени приложения, като архитектури на микроуслуги, стековите следи не са достатъчни, за да покажат цялостната следа на съобщението. Затова разпределените инструменти и стандарти за проследяване стават необходими. W3C дефинира стандарт за този тип трасе, наречен Trace Context.
Стандарт Trace Context
Документация на контекста на W3C Trace:Входът към хиперлинк е видим.
Спецификацията W3C Trace Context дефинира стандарти и формати за HTTP заглавия за разпространение на разпределена контекстна информация за проследяване. Той дефинира 2 полета, които се използват за разпространение на потока от следи в заглавието на HTTP заявката. Нека разгледаме тези две полета в стандартната дефиниция:
- traceparent: 用来描述在追踪图谱中到达请求的位置。它表示在追踪系统中到达请求的通用格式,被所有的 vendor 所理解。
- tracestate: 使用 vendor 特定的数据表示形式来扩展 traceparent,使用 name/value 对形式。在 tracestate 中保存信息是可选的。
Следово-родителско поле
Спецификацията за следовото поле е дефинирана под формата на Разширената парадигма на Баккос (ABNF) и се състои от 4 части:
версия - traceid - parentid/spanid - traceflags Например:
00-480e22a2781fe54d992d878662248d94-b4b37b64bb3f6141-00
- version: 8 位,系统适配的追踪上下文版本,当前位 00
- trace-id: 16 字节,追踪整体的标识。用于在系统中标识一个分布式追踪整体,Стойността е абсолютно същата в същата връзка。
- Parent-ID/Span-ID: 8 байта за изразяване на родителя на текущия обхват в входяща заявка или изходяща заявка.
- trace-flags: 8 位,调用者的建议标志,可以考虑为调用者的建议,限制为 3 个原因:信息或是滥用,调用方的错误,或者在调用方与被调用方的不同负载。
Всички полета са кодирани в шестнадесетично, както е показано на изображението по-долу:
.NET разпределено проследяване
Разпределеното проследяване е диагностична техника, която помага на инженерите да локализират повреди и проблеми с производителността в приложения, особено тези, които могат да бъдат разпределени между множество компютри или процеси. Тази техника свързва работата, извършена от различни компоненти на приложението, чрез проследяване на заявки в приложението, и я отделя от другите задачи, които приложението може да извърши при обработка на едновременни заявки. Например, балансьор на натоварването може първо да получи заявка за типична уеб услуга, след това да я препрати към уеб сървърен процес и след това да изпрати множество заявки към базата данни. С разпределено проследяване инженерите могат да разграничат дали тези стъпки са се провалили, колко време отнема всяка стъпка и какви съобщения могат да бъдат записани при изпълнение на всяка стъпка.
В .NET библиотеката System.Diagnostics.Activity е конфигурирана да използва стандарта W3C. Header Request-Id в стил W3C беше добавен в ASP.NET Core 2.0. За да го промените в traceparent заглавие, което съответства на W3C Trace Context, задайте статичното свойство Activity.DefaultIdFormat на W3C при стартиране на програмата. Кодът е следният:
Тестов процес,Браузър -> A услуга (/http, бекенд използва HttpClient за заявка на B услуга) интерфейс -> B service (/test) интерфейс, Услуга A извежда свой собствен Trace Context и Trace Context на Услуга B, кодът е следният:
Стартиране на услуги A и B, както е показано на следната фигура:
Браузърът отваря Услуга А, както е показано на следващата фигура:
Id: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: bd06e8d507a43f42
ParentId:
Съдържание на отговора:{"id":"00-9891603e6c4921598951f425d98e4df7-8874f9b2f9c0702e-00","traceId":"9891603e6c4921598951f425d98e4df7","spanId":"8874f9b2f9c0702e","parentId": "00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00","traceFlags":"None","isSampled":false}
--------------------------------------------------
Name: HttpHandlerDiagnosticListener
DateTime: 2025/12/22 9:37:22
Id: 00-9891603e6c4921598951f425d98e4df7-e0336cc56a4f2150-00
TraceId: 9891603e6c4921598951f425d98e4df7
SpanId: e0336cc56a4f2150
ParentId: 00-9891603e6c4921598951f425d98e4df7-bd06e8d507a43f42-00
Key: System.Net.Http.HttpRequestOut.Stop, Value: { Response = StatusCode: 200, ReasonPhrase: 'OK', Version: 1.1, Content: System.Net.Http.HttpConnectionResponseContent, Headers:
{ Дата: Пон, 22 дек 2025 01:37:21 GMT Сервитьор: Kestrel Трансферно кодиране: на части Връзка: поддържане на живо Тип съдържание: application/json; Чарсет=UTF-8 }, Request = Метод: GET, RequestUri: 'http://localhost.charlesproxy.com:5551/test', Версия: 1.1, Съдържание: <null>, Заглавия:
{ Traceparent: 00-9891603E6C4921598951F425D98E4df7-E0336cc56A4F2150-00 }, RequestTaskStatus = RanToCompletion } -------------------------------------------------- Използвайки инструмента за улавяне на пакети Charles Proxy, заявката и отговорът са както следва:
Ако искате да изключите HttpClient да предава traceparent, променливите на околната среда се задават по следния начин:
Препратка:
Входът към хиперлинк е видим.
Входът към хиперлинк е видим.
Входът към хиперлинк е видим.
Входът към хиперлинк е видим.
Входът към хиперлинк е видим.
Входът към хиперлинк е видим. |