Sådan bruger du korrelations-id'er i ASP.Net Web API

Når du arbejder med microservices, der kommunikerer over HTTP-protokollen, vil du gerne bruge korrelations-id'er til at spore individuelle forespørgsler. Fordi anmodninger kan strømme gennem mange tjenester, der er spredt på tværs af flere systemer, vil sporing af dem med korrelations-id'er være dit eneste håb om at opdage og diagnosticere fejl, der kan krybe ind i middleware-systemer. Denne artikel diskuterer, hvilke korrelations-id'er er, hvorfor de er nyttige, og hvordan de kan bruges i ASP.Net Web API.

Hvad er korrelations-id'er?

Lad os antage, at du har implementeret en mikroservices arkitektur. I en applikation, der består af microservices, vil forskellige aspekter af indkommende forespørgsler blive behandlet af forskellige mikroservices, der alle arbejder asynkront på deres specifikke opgaver og i sidste ende kommer sammen for at generere svaret. Nu, hvis noget går galt, hvordan ville du bestemme ved at se på logfilerne, hvor forespørgslen mislykkedes? Dine logfiler kan indeholde millioner på millioner af logbeskeder. Det ville være en skræmmende opgave at finde de relevante logposter blandt så mange beskeder.

Grundidéen er, at du måske vil spore alle anmodninger. Da anmodningen kan udføres af forskellige servicekomponenter, har du brug for en måde at knytte alle disse servicekomponenter til anmodningen. Her er præcis, hvor et korrelations-ID kommer til undsætning. Et korrelations-id er en unik identifikator, der giver en måde at korrelere alle de forskellige mikroopgaver til samme makrooperation. Ved at sikre, at alle svarene indeholder samme unikke identifikator, tillader du sporing og fejlfinding af hver anmodning.

Brug af korrelations-id'er i Web API

ASP.Net Web API er en letvægtsramme til opbygning af RESTful tjenester, der kan køre over HTTP. Det har været rammerne for valg til at bygge RESTful tjenester i ASP.Net i nogen tid nu. I dette eksempel vil vi implementere en meddelelseshåndterer til at gemme et korrelations-id i responsoverskriften, så vi kan sende det id tilbage til klienten.

Meddelelseshåndtering bruges til at behandle, redigere eller endda afvise en indgående anmodning, inden den når HttpControllerDispatcher i Web API. I øvrigt, HttpControllerDispatcher er en indbygget meddelelseshåndterer, der sender anmodningen til HTTP-controlleren. Vi kan drage fordel af vores egen meddelelseshåndterer for at tilføje en responsoverskrift meget tidligere i forespørgselsbehandlingsrørledningen. Bemærk, at du også skal inkludere korrelations-id'et i hver logbesked, så du kan spore individuelle HTTP-anmodninger.

Opret et simpelt Web API-projekt i Visual Studio og opret en klasse med navnet CorrelationIdHandler der udvider DelegatingHandler klasse. Vores brugerdefinerede meddelelseshåndterer har denne grundlæggende formular:

offentlig klasse CorrelationIdHandler: DelegatingHandler {}

Følgende kodestykke kan bruges til at tilføje et korrelations-id til svarhovedet.

response.Headers.Add (CorrelationIdHeaderName, request.GetCorrelationId (). ToString ());

Den GetCorrelationId () forlængelsesmetode kontrollerer først for at se om korrelations-id er til stede i anmodningen. Hvis korrelations-ID'et er til stede, henter fremgangsmåden korrelations-ID'et fra forespørgselsobjektet og tilføjer det til svarhovedet. Hvis korrelations-id ikke er til stede, genererer det en og tilføjer det til svarhovedet.

Her er den komplette kildekode for meddelelseshåndteringen til din reference:

offentlig klasse CorrelationIdHandler: DelegatingHandler {private const string key = "X-Correlation-ID"; Beskyttet tilsidesættelse async Opgave <HttpResponseMessage> SendAsync (HttpRequestMessage anmodning, AnnulleringToken cancellationToken) {var response = afventer base.SendAsync (anmodning, annulleringToken); response.Headers.Add (key, request.GetCorrelationId (). ToString ()); retur svar; }}

Du skal tilføje den brugerdefinerede meddelelseshåndterer til MessageHandlers indsamling af HttpConfiguration objekt. Sådan kan du gøre dette i Tilmeld metode af WebApiConfig klasse.

offentlige statiske ugyldige register (HttpConfiguration config) {// Almindelig kode her config.MessageHandlers.Add (ny CorrelationIdHandler ()); }

Den følgende enhedsprøvemetode kan bruges til at hente korrelations-ID'et fra HTTP-responsen.

 [TestMethod] offentligt tomrum CorrelationIdTest () {HttpClient client = new HttpClient (); client.BaseAddress = ny Uri ("http: // localhost: 10564 /"); strengnøgle = "X-Correlation-ID"; IEnumerable <string> correlationIds = null; var response = client.GetAsync ("api / values ​​/"). Resultat; hvis (response.Headers.Contains (key)) {response.Headers.TryGetValues ​​(key, out correlationIds); } strengkorrelationId = korrelationIds.First (); Assert.IsNotNull (correlationId); }

Det næste trin er at inkludere korrelations-id i logfilerne. For at gøre dette skal du fange korrelations-ID'et fra responsoverskriften og føje det til din logkontekst, så alle skriver til loggen inkluderer korrelations-id'et.

Endelig bemærke, at tilgangen til implementering af korrelations-id'er i ASP.Net MVC Core er lidt anderledes. For at opnå det samme som ovenfor ved hjælp af ASP.Net MVC Core, skal du skrive nogle middleware, fordi ASP.Net MVC Core ikke har beskedhåndteringsprogrammer. Jeg vil demonstrere, hvordan man gør det sammen med at logge ind i en fremtidig artikel.

Kilde

Giv en kommentar

Dette websted bruger Akismet til at reducere spam. Lær, hvordan dine kommentardata behandles.