private static bool TryGetUri <T>(AnalyticsResult <T> result, out FailureCountingUri uri) { uri = ConfigContextBase.GetAnalyticsUri(); if (uri != null && !string.IsNullOrEmpty(uri.AbsoluteUri)) { return(true); } Log.Error(ExceptionUtil.EmptyUriTryingSubmitN1qlQuery); ProcessError(new InvalidOperationException(ExceptionUtil.EmptyUriTryingSubmitN1QlQuery), result); return(false); }
internal AnalyticsResult <T> ToQueryResult(HttpClient client, IDataMapper dataMapper) { var result = new AnalyticsResult <T> { RequestId = requestID, ClientContextId = clientContextID, Signature = signature, Rows = results.ToList(), Status = status, Errors = errors != null?errors.Select(e => e.ToError()).ToList() : null, Warnings = warnings != null?warnings.Select(w => w.ToWarning()).ToList() : null, Metrics = metrics != null?metrics.ToMetrics() : null }; if (!string.IsNullOrWhiteSpace(handle)) { result.Handle = new AnalyticsDeferredResultHandle <T>(result, client, dataMapper, handle); } return(result); }
/// <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)); }
/// <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 var node = Context.GetRandomNodeForService(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; }
/// <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) { var result = new AnalyticsResult <T>(); FailureCountingUri baseUri; if (!TryGetUri(result, out baseUri)) { return(result); } ApplyCredentials(queryRequest, ClientConfiguration); 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, baseUri) { Content = content }; if (queryRequest is AnalyticsRequest req && req.PriorityValue != 0) { request.Headers.Add(AnalyticsPriorityHeaderName, new[] { req.PriorityValue.ToString() }); } response = await HttpClient.SendAsync(request, token).ContinueOnAnyContext(); } using (var scope = ClientConfiguration.Tracer.BuildSpan(queryRequest, CouchbaseOperationNames.ResponseDecoding).StartActive()) using (var stream = await response.Content.ReadAsStreamAsync().ContinueOnAnyContext()) { result = DataMapper.Map <AnalyticsResultData <T> >(stream).ToQueryResult(); result.Success = result.Status == QueryStatus.Success; result.HttpStatusCode = response.StatusCode; Log.Trace("Received analytics query cid{0}: {1}", result.ClientContextId, result.ToString()); scope.Span.SetPeerLatencyTag(result.Metrics.ElaspedTime); } baseUri.ClearFailed(); } catch (OperationCanceledException e) { var operationContext = OperationContext.CreateAnalyticsContext(queryRequest.CurrentContextId, Context.BucketName, baseUri?.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); baseUri.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); 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); }