Application Insights - track dine dependencies

Som udgangspunkt, når du laver et nyt webapi eller en Azure Function i .NET Core og smider den op i Azure, så trackes dine dependencies, hvis du gør brug af enten:
- HTTP(s) kald
- WCF kald
- SQL kald
- Azure Storage kald
- Event hub kald (fra SDK version 1.1.0 og op )
- Service bus kald (fra SDK version 3.0.0 og op)
Men hvad hvis din dependency ikke er på listen ovenover, og du gerne vil have en flot og Application Map (som er meget brugbart til debugging og fejlundersøgelse), som denne:
Hvad gør du så? Heldigvis findes der en løsning.
Uden dependency tracking
Forstil dig at du har en webapp, eller azure function i Azure som gør brug af Rabbitmq. Da Rabbitmq ikke er på føromtalte liste, så vil din application map se rimelig tom ud
Og det er ikke særlig sjovt.
Lad os prøve at lave en manuel dependency tracking fra vores
applikation, og til rabbitmq. Jeg laver det fra en simpel webapi, som
har en Controller
, ved navn RabbitmqController
:
[ApiController]
[Route("api/[controller]")]
public class RabbitmqController : ControllerBase
{
private readonly TelemetryClient _telemetryClient;
public RabbitmqController(TelemetryClient telemetryClient)
{
_telemetryClient = telemetryClient;
}
[HttpGet]
public IActionResult Get()
{
bool success = false;
Random random = new Random();
var timer = System.Diagnostics.Stopwatch.StartNew();
try
{
int number = random.Next(100);
DoRabbitMqRequestCall();
System.Threading.Thread.Sleep(number);
if((number % 2) == 0)
throw new Exception();
success = true;
}
catch (Exception ex)
{
success = false;
_telemetryClient.TrackException(ex);
return BadRequest("Exception thrown");
}
finally
{
timer.Stop();
_telemetryClient.TrackDependency("rabbitmq", "rabbitmq-test-ev", String.Empty, DateTimeOffset.Now, timer.Elapsed, success);
}
return Ok("Fired to rabbitmq");
}
}
The funny part:
_telemetryClient.TrackDependency("rabbitmq", "rabbitmq-test-env", String.Empty, DateTimeOffset.Now, timer.Elapsed, success);
Jeg har lavet lidt fyld kode, som en gang imellem kan give mig lidt
fejl, og som emulerer at der er lidt netværksforsinkelse, via en
Thread.Sleep
.
Starter man webapi'et og F5'er controlleren, får man efter noget tid en flot dependency graf op i Application Map:
Det kan vi lide! Nu kan vi begynde at se tilstanden for vores applikation.
Alle kald er lavet fra localhost, og Application Map tegner derfor afhængigheden mellem vores Application Insights og rabbitmq. Hvis man smider samme applikation op i Azure vil man få kaldene vist mellem vores resorce og rabbitmq:
Please note: Application Insights kender intet til vores Rabbitmq. For Application Insights er rabbitmq blot et dependency navn og udførselstiden, som med alle de andre afhængigheder som Application Insights også viser.
The bigger picture
Hele grafen, for kald lavet fra localhost, og fra Azure, ser således ud:
Hvis du vil læse mine andre indlæg omkring Application Insights, og logging, så tag et kig her:
- Logningsbananas: https://bl0g.dev/logning-application-insights/
- Optimering af Azure Function logs: https://bl0g.dev/optimering-af-logning-til-application-insights/
- Default logningsniveauer: https://bl0g.dev/default-loggningsniveauer-net-core/