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.
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 :
Ces données se trouvent dans la section API Access du namespace App Insights :
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;
À 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.