Il est prévu que le temps de réponse soit inférieur au temps total passé dans async
-await
scénarios d'utilisation. Considérez l’exemple de code suivant pour un point de terminaison Web :
async Task<string> WebEndpointExample()
await DoSomethingForSomeSecondsAsync(5);
[MethodImpl(MethodImplOptions.NoInlining)]
private static async Task DoSomethingForSomeSecondsAsync(int seconds)
await Task.Delay(TimeSpan.FromSeconds(seconds));
Dans cet exemple de code, il faut environ 5 secondes pour que le WebEndpointExample
soit terminé, donc le temps de réponse pour la transaction qui représente la demande au point de terminaison WebEndpointExample
sera d'environ 5 secondes.
L'agent capture également le temps « occupé » (le temps pendant lequel la méthode instrumentée s'exécute réellement) de chaque segment individuel qui constitue la transaction. Ce sont WebEndpointExample
et DoSomethingForSomeSecondsAsync
. Idéalement, le temps d’exécution total des deux segments est égal au temps de réponse (environ 5 secondes).
Il est facile de voir que le temps d’exécution de DoSomethingForSomeSecondsAsync
est de 5 secondes. Cependant, le temps d’exécution du WebEndpointExample
devrait être proche de 0 seconde. (Cela ne fait aucun travail ; c'est DoSomethingForSomeSecondsAsync
await
de terminer.)
Cependant, l'agent mesure toujours son temps d'exécution à environ 5 secondes. Cela est dû à l'incapacité de l'agent à détecter le temps bloqué (pas le temps CPU) lorsqu'une méthode est await
pour une autre. Le temps total indiqué est donc de 10 secondes, ce qui est supérieur au temps de réponse (environ 5 secondes).
Dans le même temps, l’agent ne peut pas supposer que l’appel aux méthodes async
bloquerait toujours l’appelant pendant toute la durée. L'exemple suivant le démontre :
async Task<string> WebEndpointExample()
var task = DoSomethingForSomeSecondsAsync(5);
[MethodImpl(MethodImplOptions.NoInlining)]
private static async Task DoSomethingForSomeSecondsAsync(int seconds)
await Task.Delay(TimeSpan.FromSeconds(seconds));
Dans cet exemple, le temps de réponse est toujours d’environ 5 secondes, mais le temps d’exécution réel du WebEndpointExample
n’est plus d’environ 0.