public async Task <DataTable> ExecuteQueryAsync(string cluster, string database, string query, string requestId = null) { if (string.IsNullOrWhiteSpace(cluster)) { throw new ArgumentException("cluster"); } if (string.IsNullOrWhiteSpace(database)) { throw new ArgumentException("database"); } if (string.IsNullOrWhiteSpace(query)) { throw new ArgumentException("query"); } string authorizationToken = await KustoTokenRefreshService.Instance.GetAuthorizationTokenAsync(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, string.Format(KustoConstants.KustoApiEndpointFormat, cluster)); request.Headers.Add("Authorization", authorizationToken); request.Headers.Add("x-ms-client-request-id", requestId ?? Guid.NewGuid().ToString()); object requestPayload = new { db = database, csl = query }; request.Content = new StringContent(JsonConvert.SerializeObject(requestPayload), Encoding.UTF8, "application/json"); CancellationTokenSource tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(60)); HttpResponseMessage responseMsg = await _httpClient.SendAsync(request, tokenSource.Token); string content = await responseMsg.Content.ReadAsStringAsync(); if (!responseMsg.IsSuccessStatusCode) { throw new Exception(content); } DataTableResponseObjectCollection dataSet = JsonConvert.DeserializeObject <DataTableResponseObjectCollection>(content); if (dataSet == null || dataSet.Tables == null) { return(new DataTable()); } else { return(dataSet.Tables.FirstOrDefault().ToDataTable()); } }
public async Task <DataTable> ExecuteQueryAsync(string query, string stampName, string requestId = null, string operationName = null) { string kustoClusterName = GetClusterNameFromStamp(stampName); string authorizationToken = await KustoTokenService.Instance.GetAuthorizationTokenAsync(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, string.Format(KustoApiEndpoint, kustoClusterName)); request.Headers.Add("Authorization", authorizationToken); request.Headers.Add("x-ms-client-request-id", requestId ?? Guid.NewGuid().ToString()); object requestPayload = new { db = _configuration.DBName, csl = query }; request.Content = new StringContent(JsonConvert.SerializeObject(requestPayload), Encoding.UTF8, "application/json"); CancellationTokenSource tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(DataProviderConstants.DefaultTimeoutInSeconds)); HttpResponseMessage responseMsg = await _httpClient.SendAsync(request, tokenSource.Token); string content = await responseMsg.Content.ReadAsStringAsync(); if (!responseMsg.IsSuccessStatusCode) { throw new Exception(content); } DataTableResponseObjectCollection dataSet = JsonConvert.DeserializeObject <DataTableResponseObjectCollection>(content); if (dataSet == null || dataSet.Tables == null) { return(new DataTable()); } else { return(dataSet.Tables.FirstOrDefault().ToDataTable()); } }
public async Task <DataTable> ExecuteQueryAsync(string query, string cluster, string database, int timeoutSeconds, string requestId = null, string operationName = null) { var timeTakenStopWatch = new Stopwatch(); var authorizationToken = await KustoTokenService.Instance.GetAuthorizationTokenAsync(); var kustoClientId = $"Diagnostics.{operationName ?? "Query"};{_requestId}##{0}_{Guid.NewGuid().ToString()}"; var tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(timeoutSeconds)); var request = new HttpRequestMessage(HttpMethod.Post, KustoApiQueryEndpoint.Replace("{cluster}", cluster)); request.Headers.Add("Authorization", authorizationToken); request.Headers.Add(HeaderConstants.ClientRequestIdHeader, kustoClientId ?? Guid.NewGuid().ToString()); request.Headers.UserAgent.ParseAdd("appservice-diagnostics"); var requestPayload = new { db = database, csl = query, properties = new { ClientRequestId = kustoClientId, Options = new { servertimeout = new TimeSpan(0, 1, 0) } } }; request.Content = new StringContent(JsonConvert.SerializeObject(requestPayload), Encoding.UTF8, "application/json"); DataTableResponseObjectCollection dataSet = null; string responseContent = string.Empty; try { timeTakenStopWatch.Start(); var responseMsg = await _httpClient.SendAsync(request, tokenSource.Token); responseContent = await responseMsg.Content.ReadAsStringAsync(); if (!responseMsg.IsSuccessStatusCode) { timeTakenStopWatch.Stop(); LogKustoQuery(query, cluster, operationName, timeTakenStopWatch, kustoClientId, new Exception($"Kusto call ended with a non success status code : {responseMsg.StatusCode.ToString()}"), dataSet, responseContent); if ((int)responseMsg.StatusCode == 400) { if (query != null && query.Contains("Tenant in ()")) { throw new KustoTenantListEmptyException("KustoDataProvider", "Malformed Query: Query contains an empty tenant list."); } } throw new Exception(responseContent); } else { dataSet = ProcessKustoResponse(responseContent); } } catch (Exception ex) { timeTakenStopWatch.Stop(); LogKustoQuery(query, cluster, operationName, timeTakenStopWatch, kustoClientId, ex, dataSet, responseContent); throw; } finally { timeTakenStopWatch.Stop(); } LogKustoQuery(query, cluster, operationName, timeTakenStopWatch, kustoClientId, null, dataSet); return(dataSet?.Tables == null ? new DataTable() : dataSet.Tables.FirstOrDefault().ToDataTable()); }
private void LogKustoQuery(string query, string cluster, string operationName, Stopwatch timeTakenStopWatch, string kustoClientId, Exception kustoApiException, DataTableResponseObjectCollection dataSet, string kustoResponse = "") { var status = kustoApiException == null ? "Success" : "Failed"; kustoResponse = (kustoResponse != "") ? $" {Environment.NewLine} KustoResponseBody : {kustoResponse} " : string.Empty; object stats = null; if (dataSet != null && dataSet.Tables != null && dataSet.Tables.Count() >= 4) { var statisticsTable = dataSet.Tables.ToArray()[dataSet.Tables.Count() - 2]; if (statisticsTable.Rows.GetLength(0) >= 2 && statisticsTable.Rows.GetLength(1) >= 5) { stats = statisticsTable.Rows[1, 4]; } } DiagnosticsETWProvider.Instance.LogKustoQueryInformation( operationName ?? "None", _requestId, $"KustoQueryRequestId:{kustoClientId},Status:{status},TimeTaken:{timeTakenStopWatch.ElapsedMilliseconds},Cluster:{cluster}", timeTakenStopWatch.ElapsedMilliseconds, JsonConvert.SerializeObject(stats) ?? string.Empty, query, kustoApiException != null ? kustoApiException.GetType().ToString() : string.Empty, kustoApiException != null ? $"{kustoApiException.ToString()}{kustoResponse}" : string.Empty); }
public async Task <DataTable> ExecuteQueryAsync(string query, string cluster, string database, string requestId = null, string operationName = null) { var timeTakenStopWatch = new Stopwatch(); string authorizationToken = await KustoTokenService.Instance.GetAuthorizationTokenAsync(); var kustoClientId = $"Diagnostics.{operationName ?? "Query"};{_requestId}##{0}"; HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Post, string.Format(KustoApiEndpoint, cluster)); request.Headers.Add("Authorization", authorizationToken); request.Headers.Add("x-ms-client-request-id", requestId ?? Guid.NewGuid().ToString()); request.Headers.UserAgent.ParseAdd("appservice-diagnostics"); object requestPayload = new { db = database, csl = query }; request.Content = new StringContent(JsonConvert.SerializeObject(requestPayload), Encoding.UTF8, "application/json"); CancellationTokenSource tokenSource = new CancellationTokenSource(TimeSpan.FromSeconds(DataProviderConstants.DefaultTimeoutInSeconds)); timeTakenStopWatch.Start(); Exception kustoApiException = null; string responseContent = null; DataTableResponseObjectCollection dataSet = null; try { HttpResponseMessage responseMsg = await _httpClient.SendAsync(request, tokenSource.Token); responseContent = await responseMsg.Content.ReadAsStringAsync(); if (!responseMsg.IsSuccessStatusCode) { throw new Exception(responseContent); } else { dataSet = JsonConvert.DeserializeObject <DataTableResponseObjectCollection>(responseContent); } } catch (Exception ex) { kustoApiException = ex; throw; } finally { timeTakenStopWatch.Stop(); var status = kustoApiException == null ? "Success" : "Failed"; object stats = null; if (dataSet != null && dataSet.Tables != null && dataSet.Tables.Count() >= 4) { var statisticsTable = dataSet.Tables.ToArray()[dataSet.Tables.Count() - 2]; if (statisticsTable.Rows.GetLength(0) >= 2 && statisticsTable.Rows.GetLength(1) >= 5) { stats = statisticsTable.Rows[1, 4]; } } DiagnosticsETWProvider.Instance.LogKustoQueryInformation( operationName ?? "None", _requestId, $"KustoQueryRequestId:{kustoClientId},Status:{status},TimeTaken:{timeTakenStopWatch.ElapsedMilliseconds},Cluster:{cluster}", timeTakenStopWatch.ElapsedMilliseconds, JsonConvert.SerializeObject(stats) ?? string.Empty, query, kustoApiException != null ? kustoApiException.GetType().ToString() : string.Empty, kustoApiException != null ? kustoApiException.ToString() : string.Empty); } if (dataSet == null || dataSet.Tables == null) { return(new DataTable()); } else { return(dataSet.Tables.FirstOrDefault().ToDataTable()); } }