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());
            }
        }
Example #3
0
        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());
        }
Example #4
0
        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);
        }
Example #5
0
        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());
            }
        }