HttpClient - Propagando Header HTTP (Correlação de IDs)
Hoje veremos como propagar headers HTTP usando HttpClient. |
Para propagar cabeçalhos usando HttpClient, você pode criar uma instância de HttpClientHandler e definir os cabeçalhos que deseja propagar na propriedade Headers. Em seguida, você pode passar essa instância para o construtor HttpClient.
Exemplo:
// criar um
HttpClientHandler var handler = new HttpClientHandler(); // incluir a correlação de ID no header handler.Headers.Add("X-Correlation-ID", "12345"); // cria um novo HttpClient usando o handler var client = new HttpClient(handler); // faz um request var response = await client.GetAsync("https://exemplo.com"); // obtem o header com o ID a partir do response if (response.Headers.TryGetValues("X-Correlation-ID", out var values)) { var correlationId = values.FirstOrDefault(); // usa o ID de correlação ... } |
Neste exemplo, criamos uma nova instância de HttpClientHandler e adicionamos o cabeçalho X-Correlation-ID com um valor de 12345.
Em seguida, criamos uma nova instância de HttpClient usando o manipulador. Quando fazemos uma solicitação usando este cliente, o cabeçalho X-Correlation-ID será incluído na solicitação.
Depois de obter a resposta, usamos TryGetValues para verificar se o cabeçalho X-Correlation-ID está presente na resposta. Se estiver, obtemos o valor e o usamos para registro ou outros fins. Observe que você pode adicionar quaisquer cabeçalhos que deseja propagar da mesma maneira. Basta adicioná-los à propriedade Headers da instância HttpClientHandler antes de criar o HttpClient.
Agora image o seguinet cenário :
Você tem um sistema formado por diferentes aplicativos que se comunicam via HTTP. Existe algum tipo de ponto de entrada, exposto aos clientes, que orquestra as chamadas para os outros aplicativos. Como você correlaciona esses pedidos ?
Uma técnica comum para correlacionar solicitações HTTP em um sistema distribuído é usar um identificador de correlação, também conhecido como Correlation ID.
Um Correlation ID é um valor único que é gerado para uma solicitação quando ela é recebida pelo ponto de entrada e é passada para todos os aplicativos que lidam com a solicitação. Cada aplicativo registra o Correlation ID em seus próprios logs, permitindo que os logs sejam correlacionados posteriormente.
Para implementar isso em um sistema formado por diferentes aplicativos que se comunicam via HTTP, o ponto de entrada pode gerar um Correlation ID para cada solicitação recebida e incluí-lo em um cabeçalho HTTP personalizado. Cada aplicativo que recebe a solicitação pode ler o cabeçalho e incluir o Correlation ID em seus próprios logs.
Por exemplo, se a aplicação A estiver fazendo uma solicitação para a aplicação B por meio do ponto de entrada, a aplicação A pode incluir o Correlation ID no cabeçalho personalizado:
GET /api/banco
HTTP / 1.1 Host: ponto - de - entrada X - Correlation - ID: abc123 |
O ponto de entrada pode, então, passar o Correlation ID para a aplicação B em uma nova solicitação:
GET /api/
banco HTTP / 1.1 Host: aplicacao - b X - Correlation - ID: abc123 |
A aplicação B pode ler o cabeçalho personalizado e incluir o Correlation ID em seus próprios logs. Se a aplicação B fizer uma solicitação adicional para a aplicação C, ela pode incluir o Correlation ID no cabeçalho da solicitação para garantir que o mesmo ID seja usado em todo o sistema:
GET
/api/cliente HTTP / 1.1 Host: aplicacao - c X - Correlation - ID: abc123 |
Dessa forma, todas as solicitações relacionadas a uma solicitação original podem ser correlacionadas por meio do Correlation ID, facilitando a solução de problemas e a depuração do sistema.
Nota: Existe um pacote NuGet que implementa estas funcionalidades: Microsoft.AspNetCore.HeaderPropagation.
Vejamos um exemplo mais completo para ilustrar o uso deste recurso.
Imagine que temos um sistema formado por três aplicativos:
O aplicativo web faz solicitações para o serviço de backend, que por sua vez faz solicitações para o serviço de banco de dados.
Queremos usar um Correlation ID para correlacionar todas as solicitações relacionadas a uma solicitação original do aplicativo web. Aqui está como poderíamos implementar isso:
1- Quando o aplicativo web recebe uma solicitação, ele gera um Correlation ID exclusivo e inclui-o em um cabeçalho personalizado na solicitação:
GET /api/users HTTP/1.1
Host: example.com
X-Correlation-ID: 123456789
|
2- O serviço de backend recebe a solicitação e lê o Correlation ID do cabeçalho. Ele inclui o Correlation ID em todas as solicitações que fizer ao serviço de banco de dados:
GET /api/users/123 HTTP/1.1
Host: db.example.com
X-Correlation-ID: 123456789
|
3- O serviço de banco de dados recebe a solicitação e lê o Correlation ID do cabeçalho. Ele inclui o Correlation ID em todos os logs e respostas que retorna ao serviço de backend:
HTTP/1.1 200 OK
Content-Type: application/json
X-Correlation-ID: 123456789
{
"id": 123,
"name": "Alice",
"email": "alice@exemplo.com"
}
|
4- O serviço de backend inclui o Correlation ID em todos os logs e respostas que retorna ao aplicativo web:
HTTP/1.1 200 OK
Content-Type: application/json
X-Correlation-ID: 123456789
{
"id": 123,
"name": "Alice",
"email": "alice@exemplo.com"
}
|
Dessa forma, todos os logs e respostas em todo o sistema incluem o Correlation ID, permitindo que as solicitações relacionadas a uma solicitação original do aplicativo web sejam facilmente correlacionadas. Isso pode ser muito útil para solução de problemas e depuração de problemas em um sistema distribuído complexo.
E estamos conversados ...
"Eu sou a videira, vós as varas; quem está em mim, e eu nele, esse dá muito
fruto; porque sem mim nada podeis fazer."
João 15:5
Referências: