Récupérer des logs App Insights depuis une fonction via API Rest

Tanguy SCHOUBERT
Publié par Tanguy SCHOUBERT
Catégorie : .Net / Azure Functions
26/08/2022

Nous avons ici besoin d’exposer une API permettant de retrouver tous les logs relatifs à l’exécution d’un flux dans Application Insights. Pour cela, en guise de back-end, nous allons utiliser une fonction. C’est cette partie que nous allons voir ensemble dans cet article.

 

Prérequis

 

Tout d’abord, dans le flux source, le format des logs doit être défini et connu à l’avance. C’est pourquoi il nous faut logger une propriété commune à tous les logs de l’exécution : un runID. Ce runID va ensuite nous servir de clé dans la requête vers l’API App Insights. Par exemple, le premier log de la fonction du flux source pourrait ressembler à ça :

log.LogInformation("{FUNCTION_NAME} | {runID} | {status}", FUNCTION_NAME, runID, FunctionStatus.TRIGGERED);

 

Ainsi, nous pourrons récupérer la ou les autres propriétés qui nous intéressent ; dans notre cas, le nom de la fonction et le statut du flux.

Deux paramètres sont requis pour la requête :

    • l’Application ID du namespace App Insights ;
    • une API key, permettant d’appeler l’API. Cette clé doit être créée manuellement au préalable.

Ces données se trouvent dans la section API Access du namespace App Insights :

 

Récupérer les logs

 

Notre fonction débute avec ce morceau de code :

var query = String.Format(@"traces
| project
    customDimensions.prop__runID,
    customDimensions.prop__FUNCTION_NAME,
    customDimensions.prop__status,
| where customDimensions_prop__runID == '{0}'", runID);

var appId = System.Environment.GetEnvironmentVariable("AppInsightsId");
var apiKey = System.Environment.GetEnvironmentVariable("AppInsightsAPIKey");
string url = string.Format("https://api.applicationinsights.io/v1/apps/{0}/query?query={1}",
                    appId,
                    query);
HttpRequestMessage appInsightRequest = new HttpRequestMessage();
appInsightRequest.Method = HttpMethod.Get;
appInsightRequest.Headers.Add("x-api-key", apiKey);
appInsightRequest.RequestUri = new Uri(url);
HttpResponseMessage appInsightResponse = httpClient.SendAsync(appInsightRequest).Result;
string appInsightResponseString = appInsightResponse.Content.ReadAsStringAsync().Result;

 

Parser les logs

 

À ce stade, nous avons récupéré tous les logs contenant notre runID. Pour pouvoir maintenant accéder aux propriétés, il nous faut parser la réponse à l’aide du modèle suivant :

public class AppInsightQueryResponseModel
{
    public List<Table> tables { get; set; }
}
public class Table
{
    public string name { get; set; }
    public List<Column> columns { get; set; }
    public List<List<string>> rows { get; set; }
}
public class Column
{
    public string name { get; set; }
    public string type { get; set; }
}

 

Suivant l’ordre défini dans la partie “project” de notre query, nous pouvons maintenant accéder à nos propriétés :

AppInsightQueryResponseModel content = JsonConvert.DeserializeObject<AppInsightQueryResponseModel>(appInsightResponseString);
var traces = content.tables[0].rows;
foreach (var trace in traces)
{
    string runID = trace[0]};
    string functionName = trace[1]};
    string status = trace[2]};
}

 

Il ne nous reste plus qu’à faire la mise en forme vers le format que retournera notre API.