Espera-se que o tempo de resposta seja menor que o tempo total gasto em async
-await
cenários de uso. Considere o seguinte exemplo de código para um endpoint da web:
async Task<string> WebEndpointExample()
await DoSomethingForSomeSecondsAsync(5);
[MethodImpl(MethodImplOptions.NoInlining)]
private static async Task DoSomethingForSomeSecondsAsync(int seconds)
await Task.Delay(TimeSpan.FromSeconds(seconds));
Neste exemplo de código, leva aproximadamente 5 segundos para o WebEndpointExample
ser concluído, portanto, o tempo de resposta para a transação que representa a solicitação para o endpoint WebEndpointExample
será de aproximadamente 5 segundos.
O agente também captura o tempo “ocupado” (o tempo que o método instrumentado está realmente em execução) de cada segmento individual que constitui a transação. Eles são WebEndpointExample
e DoSomethingForSomeSecondsAsync
. Idealmente, o tempo total de execução dos dois segmentos é igual ao tempo de resposta (aproximadamente 5 segundos).
É fácil ver que o tempo de execução de DoSomethingForSomeSecondsAsync
é de 5 segundos. Entretanto, o tempo de execução do WebEndpointExample
deve ser próximo de 0 segundos. (Não faz nenhum trabalho; é await
para o DoSomethingForSomeSecondsAsync
ser concluído.)
Entretanto, o agente ainda mede seu tempo de execução em aproximadamente 5 segundos. Isso se deve à incapacidade do agente de detectar o tempo bloqueado (não o tempo de CPU) quando um método está await
executando para outro. Portanto, o tempo total é relatado como 10 segundos, que é maior que o tempo de resposta (aproximadamente 5 segundos).
Ao mesmo tempo, o agente não pode presumir que a chamada aos métodos async
sempre bloquearia o chamador o tempo todo. O próximo exemplo demonstra isso:
async Task<string> WebEndpointExample()
var task = DoSomethingForSomeSecondsAsync(5);
[MethodImpl(MethodImplOptions.NoInlining)]
private static async Task DoSomethingForSomeSecondsAsync(int seconds)
await Task.Delay(TimeSpan.FromSeconds(seconds));
Neste exemplo, o tempo de resposta ainda é de aproximadamente 5 segundos, mas o tempo de execução real do WebEndpointExample
não é mais de aproximadamente 0.