/// <inheritdoc /> public IAnalyticsDeferredResultHandle <T> ImportDeferredQueryHandle <T>(string encodedHandle) { var json = JObject.Parse(encodedHandle); if (json["v"].Value <string>() != "1") { throw new ArgumentException("Invalid encoded handle."); } var uri = json["uri"].Value <string>(); if (string.IsNullOrWhiteSpace(uri)) { throw new ArgumentException("Invalid encoded handle."); } var result = new AnalyticsResult <T> { MetaData = new MetaData { Status = QueryStatus.Running } }; // default to running return(new AnalyticsDeferredResultHandle <T>(result, HttpClient, DataMapper, uri)); }
internal AnalyticsResult <T> ToQueryResult(HttpClient client, IDataMapper dataMapper) { var result = new AnalyticsResult <T> { Rows = results.ToList(), MetaData = new MetaData { Status = status, RequestId = requestID, ClientContextId = clientContextID, Signature = signature, Errors = errors?.Select(e => e.ToError()).ToList(), Warnings = warnings?.Select(w => w.ToWarning()).ToList(), Metrics = metrics?.ToMetrics() } }; if (!string.IsNullOrWhiteSpace(handle)) { result.Handle = new AnalyticsDeferredResultHandle <T>(result, client, dataMapper, handle); } return(result); }
/// <summary> /// Queries the asynchronous. /// </summary> /// <typeparam name="T"></typeparam> /// <param name="queryRequest">The query request.</param> /// <param name="token">The token.</param> /// <returns></returns> public async Task <IAnalyticsResult <T> > QueryAsync <T>(IAnalyticsRequest queryRequest, CancellationToken token) { // try get Analytics node if (!ClusterOptions.GlobalNodes.TryGetRandom(x => x.HasAnalytics(), out var node)) { //const string noNodeAvailableMessage = "Unable to locate analytics node to submit query to."; //Logger.LogError(noNodeAvailableMessage); throw new ServiceNotAvailableException(ServiceType.Analytics); } var result = new AnalyticsResult <T>(); string body; //using (ClientConfiguration.Tracer.BuildSpan(queryRequest, CouchbaseOperationNames.RequestEncoding).StartActive()) //{ body = queryRequest.GetFormValuesAsJson(); //} using (var content = new StringContent(body, System.Text.Encoding.UTF8, MediaType.Json)) { try { //Log.Trace("Sending analytics query cid{0}: {1}", queryRequest.CurrentContextId, baseUri); HttpResponseMessage response; //using (ClientConfiguration.Tracer.BuildSpan(queryRequest, CouchbaseOperationNames.DispatchToServer).StartActive()) //{ var request = new HttpRequestMessage(HttpMethod.Post, node.AnalyticsUri) { Content = content }; if (queryRequest is AnalyticsRequest req && req.PriorityValue != 0) { request.Headers.Add(AnalyticsPriorityHeaderName, new[] { req.PriorityValue.ToString() }); } response = await HttpClient.SendAsync(request, token).ConfigureAwait(false); //} //using (var scope = ClientConfiguration.Tracer.BuildSpan(queryRequest, CouchbaseOperationNames.ResponseDecoding).StartActive()) using (var stream = await response.Content.ReadAsStreamAsync().ConfigureAwait(false)) { result = DataMapper.Map <AnalyticsResultData <T> >(stream).ToQueryResult(HttpClient, DataMapper); //result.MetaData.Success = result.MetaData.Status == QueryStatus.Success || result.MetaData.Status == QueryStatus.Running; result.MetaData.HttpStatusCode = response.StatusCode; //Log.Trace("Received analytics query cid{0}: {1}", result.ClientContextId, result.ToString()); //scope.Span.SetPeerLatencyTag(result.Metrics.ElaspedTime); } //uri.ClearFailed();analytu } catch (OperationCanceledException e) { //var operationContext = OperationContext.CreateAnalyticsContext(queryRequest.CurrentContextId, Context.BucketName, uri?.Authority); //if (queryRequest is AnalyticsRequest request) //{ // operationContext.TimeoutMicroseconds = request.TimeoutValue; //} //Log.Info(operationContext.ToString()); ProcessError(e, result); } catch (HttpRequestException e) { //Log.Info("Failed analytics query cid{0}: {1}", queryRequest.CurrentContextId, baseUri); //uri.IncrementFailed(); ProcessError(e, result); //Log.Error(e); } catch (AggregateException ae) { ae.Flatten().Handle(e => { //Log.Info("Failed analytics query cid{0}: {1}", queryRequest.CurrentContextId, baseUri); //Log.Error(e); ProcessError(e, result); return(true); }); } catch (Exception e) { //Log.Info("Failed analytics query cid{0}: {1}", queryRequest.CurrentContextId, baseUri); //Log.Info(e); ProcessError(e, result); } } UpdateLastActivity(); return(result); }
private static void ProcessError <T>(Exception exception, AnalyticsResult <T> queryResult) { queryResult.MetaData.Status = QueryStatus.Fatal; queryResult.MetaData.HttpStatusCode = HttpStatusCode.BadRequest; }