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:

  1. HTTP(s) kald
  2. WCF kald
  3. SQL kald
  4. Azure Storage kald
  5. Event hub kald (fra SDK version 1.1.0 og op )
  6. 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:

/images/aioverview.png

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

/images/single.png

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:

/images/oneside.png

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:

/images/onside2.png

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:

/images/all.png

Hvis du vil læse mine andre indlæg omkring Application Insights, og logging, så tag et kig her:

  1. Logningsbananas: https://bl0g.dev/logning-application-insights/
  2. Optimering af Azure Function logs: https://bl0g.dev/optimering-af-logning-til-application-insights/
  3. Default logningsniveauer: https://bl0g.dev/default-loggningsniveauer-net-core/