Home > other >  Azure AppInsights end to end correlation
Azure AppInsights end to end correlation

Time:10-03

I am looking into Azure AppInsights for my telemetry correlation requirement. I have created 3 simple APIs that call one another in succession as below:

First Api -----> Middle Api -----> Another Api

The Api calls are made using Typed HttpClient through a simple service class. All the Api projects have Microsoft.ApplicationInsights.AspNetCore and Microsoft.Extensions.Logging.ApplicationInsights NuGets references added. I have program and service classes for all the APIs as below:

Program.cs

using Microsoft.ApplicationInsights.Channel;
using Microsoft.ApplicationInsights.WindowsServer.TelemetryChannel;

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
...

//App Insights
builder.Services.AddSingleton(typeof(ITelemetryChannel),
    new ServerTelemetryChannel() { StorageFolder = "/tmp/myfolder" });
builder.Services.AddApplicationInsightsTelemetry();

builder.Services.AddSingleton<IConfiguration>(builder.Configuration);
builder.Services.AddScoped<IWeatherService, DummyWeatherService>();
builder.Services.AddHttpClient<IWeatherService, DummyWeatherService>();


var app = builder.Build();

...

app.Run();

Service

using System.Net.Http.Headers;
using AppInsightsDemo.Api.Models;

namespace AppInsightsDemo.Api.Services;

public class DummyWeatherService : IWeatherService
{
    private readonly IConfiguration _configuration;
    private readonly HttpClient _httpClient;

    public DummyWeatherService(
        IConfiguration configuration,
        HttpClient httpClient)
    {
        _configuration = configuration;
        _httpClient = httpClient;
        _httpClient.BaseAddress = GetMiddleApiBaseUri();
        _httpClient.DefaultRequestHeaders.Accept.Clear();
        _httpClient.DefaultRequestHeaders.Accept.Add(
            new MediaTypeWithQualityHeaderValue("application/json"));
    }

    private Uri GetAnotherApiBaseUri()
    {
        var configurationSection = _configuration.GetRequiredSection("Dependencies");
        var baseUri = configurationSection.GetValue<string>("MiddleApiUri")
                      ?? throw new ArgumentException("Another Api base uri is empty");

        return new Uri(baseUri);
    }
    
    public async Task<Weather?> GetWeatherAsync()
    {
        Weather? weather = null;
        var response = await _httpClient.GetAsync("middle");
        if (response.IsSuccessStatusCode)
        {
            weather = await response.Content.ReadAsAsync<Weather>();
        }

        return weather;
    }
}

This is what I end up with in AppInsights sample. The third API event has the same operation id as the first two Api events have but the third event has a different parent id. I expect the third event to have the id of my middle (second) api event (localhost://7290) as its parent id and the three events show up accordingly in a hierarchy. enter image description here

Can anyone please advise if I am missing some configuration or not using this SDK right? Thank you

CodePudding user response:

This is rather silly of me. I configured the ApplicationInsights connection string for my first api(:7176) and last api(:7206) but missed to configure it for my middle api (:7290) though I have added ApplicationInsights service to all Api projects. It took me a while to figure out the missing connection string. Now I get a nice dependency hierarchy as below:

enter image description here

I guess a connection string validation might come handy. Sorry for the trouble. Thanks.

  • Related