/// <inheritdoc />
        public async Task <EventingFunction> GetFunctionAsync(string name, GetFunctionOptions options = null)
        {
            //GET http://localhost:8096/api/v1/functions/<name>
            options ??= GetFunctionOptions.Default;

            var path = $"/api/v1/functions/{Uri.EscapeUriString(name)}";

            try
            {
                using var rootSpan = RootSpan(OuterRequestSpans.ManagerSpan.Eventing.GetFunction, options)
                                     .WithLocalAddress()
                                     .WithStatement(path)
                                     .WithCommonTags();

                using var encodeSpan = rootSpan.DispatchSpan(options);
                using (CreateRetryTimeoutCancellationTokenSource(options, out var tokenPair))
                {
                    var response = await _service.GetAsync(path, rootSpan, encodeSpan, tokenPair.GlobalToken);

                    response.EnsureSuccessStatusCode();

                    var rawJson = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                    var result = JToken.Parse(rawJson);
                    return(result.ToObject <EventingFunction>());
                }
            }
            catch (Exception e)
            {
                _logger.LogError(e, $"An error occurred while getting event function {name}.");
                throw;
            }
        }
        /// <inheritdoc />
        public async Task <EventingFunction> GetFunctionAsync(string name, GetFunctionOptions options = null)
        {
            //GET http://localhost:8096/api/v1/functions/<name>
            options ??= GetFunctionOptions.Default;

            var path = $"/api/v1/functions/{Uri.EscapeDataString(name)}";

            try
            {
                using var rootSpan = RootSpan(OuterRequestSpans.ManagerSpan.Eventing.GetFunction, options)
                                     .WithLocalAddress()
                                     .WithStatement(path)
                                     .WithCommonTags();

                using var encodeSpan = rootSpan.DispatchSpan(options);
                using (var tokenPair = CreateRetryTimeoutCancellationTokenSource(options))
                {
                    using var response = await _service.GetAsync(path, rootSpan, encodeSpan, tokenPair.GlobalToken)
                                         .ConfigureAwait(false);

                    if (response.IsSuccessStatusCode)
                    {
                        var rawJson = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                        var result = JToken.Parse(rawJson);
                        return(result.ToObject <EventingFunction>());
                    }

                    var content = await response.Content.ReadAsStringAsync().ConfigureAwait(false);

                    if (content.TryDeserialize <ErrorResponse>(out var errorResponse))
                    {
                        switch (errorResponse.Name)
                        {
                        case "ERR_APP_NOT_BOOTSTRAPPED":
                            throw new EventingFunctionNotBootstrappedException(errorResponse.Description);

                        case "ERR_APP_NOT_FOUND_TS":
                            throw new EventingFunctionNotFoundException(errorResponse.Description);

                        case "ERR_APP_NOT_DEPLOYED":
                            throw new EventingFunctionNotDeployedException(errorResponse.Description);
                        }
                    }

                    //throw any non-specific errors
                    throw new CouchbaseException(content);
                }
            }
            catch (Exception e)
            {
                _logger.LogError(e, $"An error occurred while getting event function {name}.");
                throw;
            }
        }