Skip to main content

couchbase_core/
agent_ops.rs

1/*
2 *
3 *  * Copyright (c) 2025 Couchbase, Inc.
4 *  *
5 *  * Licensed under the Apache License, Version 2.0 (the "License");
6 *  * you may not use this file except in compliance with the License.
7 *  * You may obtain a copy of the License at
8 *  *
9 *  *    http://www.apache.org/licenses/LICENSE-2.0
10 *  *
11 *  * Unless required by applicable law or agreed to in writing, software
12 *  * distributed under the License is distributed on an "AS IS" BASIS,
13 *  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14 *  * See the License for the specific language governing permissions and
15 *  * limitations under the License.
16 *
17 */
18use crate::agent::{Agent, AgentInner};
19use crate::cbconfig::{CollectionManifest, FullBucketConfig, FullClusterConfig};
20use crate::clusterlabels::ClusterLabels;
21use crate::error::Result;
22use crate::features::BucketFeature;
23use crate::mgmtx::bucket_settings::BucketDef;
24use crate::mgmtx::mgmt::AutoFailoverSettings;
25use crate::mgmtx::mgmt_query::IndexStatus;
26use crate::mgmtx::responses::{
27    CreateCollectionResponse, CreateScopeResponse, DeleteCollectionResponse, DeleteScopeResponse,
28    UpdateCollectionResponse,
29};
30use crate::mgmtx::user::{Group, RoleAndDescription, UserAndMetadata};
31use crate::options::analytics::{AnalyticsOptions, GetPendingMutationsOptions};
32use crate::options::crud::{
33    AddOptions, AppendOptions, DecrementOptions, DeleteOptions, GetAndLockOptions,
34    GetAndTouchOptions, GetCollectionIdOptions, GetMetaOptions, GetOptions, IncrementOptions,
35    LookupInOptions, MutateInOptions, PrependOptions, ReplaceOptions, TouchOptions, UnlockOptions,
36    UpsertOptions,
37};
38use crate::options::diagnostics::DiagnosticsOptions;
39use crate::options::management::{
40    ChangePasswordOptions, CreateBucketOptions, CreateCollectionOptions, CreateScopeOptions,
41    DeleteBucketOptions, DeleteCollectionOptions, DeleteGroupOptions, DeleteScopeOptions,
42    DeleteUserOptions, EnsureBucketOptions, EnsureGroupOptions, EnsureManifestOptions,
43    EnsureUserOptions, FlushBucketOptions, GetAllBucketsOptions, GetAllGroupsOptions,
44    GetAllUsersOptions, GetAutoFailoverSettingsOptions, GetBucketOptions, GetBucketStatsOptions,
45    GetCollectionManifestOptions, GetFullBucketConfigOptions, GetFullClusterConfigOptions,
46    GetGroupOptions, GetRolesOptions, GetUserOptions, IndexStatusOptions, LoadSampleBucketOptions,
47    UpdateBucketOptions, UpdateCollectionOptions, UpsertGroupOptions, UpsertUserOptions,
48};
49use crate::options::ping::PingOptions;
50use crate::options::query::{
51    BuildDeferredIndexesOptions, CreateIndexOptions, CreatePrimaryIndexOptions, DropIndexOptions,
52    DropPrimaryIndexOptions, EnsureIndexOptions, GetAllIndexesOptions, QueryOptions,
53    WatchIndexesOptions,
54};
55use crate::options::search::SearchOptions;
56use crate::options::search_management;
57use crate::options::search_management::{
58    AllowQueryingOptions, AnalyzeDocumentOptions, DeleteIndexOptions, DisallowQueryingOptions,
59    FreezePlanOptions, GetIndexOptions, GetIndexedDocumentsCountOptions, PauseIngestOptions,
60    ResumeIngestOptions, UnfreezePlanOptions, UpsertIndexOptions,
61};
62use crate::options::waituntilready::WaitUntilReadyOptions;
63use crate::queryx::index::Index;
64use crate::results::analytics::AnalyticsResultStream;
65use crate::results::diagnostics::DiagnosticsResult;
66use crate::results::kv::{
67    AddResult, AppendResult, DecrementResult, DeleteResult, GetAndLockResult, GetAndTouchResult,
68    GetCollectionIdResult, GetMetaResult, GetResult, IncrementResult, LookupInResult,
69    MutateInResult, PrependResult, ReplaceResult, TouchResult, UnlockResult, UpsertResult,
70};
71use crate::results::pingreport::PingReport;
72use crate::results::query::QueryResultStream;
73use crate::results::search::SearchResultStream;
74use crate::searchx;
75use crate::searchx::document_analysis::DocumentAnalysis;
76use serde_json::value::RawValue;
77use std::collections::HashMap;
78
79#[cfg(feature = "top-level-spans")]
80use {
81    crate::create_span,
82    crate::tracingcomponent::{
83        build_keyspace, record_metrics, Keyspace, SpanBuilder, SPAN_ATTRIB_OTEL_KIND_CLIENT_VALUE,
84        SPAN_ATTRIB_OTEL_KIND_KEY,
85    },
86    futures::Future,
87    std::time::Instant,
88    tracing::Instrument,
89};
90
91impl Agent {
92    #[cfg(feature = "top-level-spans")]
93    async fn execute_observable_operation<'k, F, Fut, T>(
94        &self,
95        service: Option<&'static str>,
96        keyspace: Keyspace<'k>,
97        mut span: SpanBuilder,
98        f: F,
99    ) -> Result<T>
100    where
101        F: FnOnce() -> Fut,
102        Fut: Future<Output = Result<T>>,
103    {
104        let operation_name = span.name();
105        let cluster_labels = self.inner.tracing.get_cluster_labels();
106
107        let span = span
108            .with_cluster_labels(&cluster_labels)
109            .with_service(service)
110            .with_keyspace(&keyspace)
111            .build();
112
113        let start = Instant::now();
114        let result = (f)().instrument(span.clone()).await;
115
116        span.record(
117            "otel.status_code",
118            if result.is_err() { "error" } else { "ok" },
119        );
120        drop(span);
121
122        record_metrics(
123            operation_name,
124            service,
125            &keyspace,
126            &cluster_labels,
127            start,
128            result.as_ref().err(),
129        );
130
131        result
132    }
133
134    pub async fn bucket_features(&self) -> Result<Vec<BucketFeature>> {
135        self.inner.bucket_features().await
136    }
137
138    pub fn cluster_labels(&self) -> Option<ClusterLabels> {
139        self.inner.tracing.get_cluster_labels()
140    }
141
142    pub async fn upsert(&self, opts: UpsertOptions<'_>) -> Result<UpsertResult> {
143        #[cfg(feature = "top-level-spans")]
144        {
145            let bucket_name = self.get_bucket_name();
146            return self
147                .execute_observable_operation(
148                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
149                    build_keyspace(
150                        bucket_name.as_deref(),
151                        Some(opts.scope_name),
152                        Some(opts.collection_name),
153                    ),
154                    create_span!("upsert"),
155                    || self.inner.crud.upsert(opts),
156                )
157                .await;
158        }
159
160        self.inner.crud.upsert(opts).await
161    }
162
163    pub async fn get(&self, opts: GetOptions<'_>) -> Result<GetResult> {
164        #[cfg(feature = "top-level-spans")]
165        {
166            let bucket_name = self.get_bucket_name();
167            return self
168                .execute_observable_operation(
169                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
170                    build_keyspace(
171                        bucket_name.as_deref(),
172                        Some(opts.scope_name),
173                        Some(opts.collection_name),
174                    ),
175                    create_span!("get"),
176                    || self.inner.crud.get(opts),
177                )
178                .await;
179        }
180        self.inner.crud.get(opts).await
181    }
182
183    pub async fn get_meta(&self, opts: GetMetaOptions<'_>) -> Result<GetMetaResult> {
184        #[cfg(feature = "top-level-spans")]
185        {
186            let bucket_name = self.get_bucket_name();
187            return self
188                .execute_observable_operation(
189                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
190                    build_keyspace(
191                        bucket_name.as_deref(),
192                        Some(opts.scope_name),
193                        Some(opts.collection_name),
194                    ),
195                    create_span!("get_meta"),
196                    || self.inner.crud.get_meta(opts),
197                )
198                .await;
199        }
200        self.inner.crud.get_meta(opts).await
201    }
202
203    pub async fn delete(&self, opts: DeleteOptions<'_>) -> Result<DeleteResult> {
204        #[cfg(feature = "top-level-spans")]
205        {
206            let bucket_name = self.get_bucket_name();
207            return self
208                .execute_observable_operation(
209                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
210                    build_keyspace(
211                        bucket_name.as_deref(),
212                        Some(opts.scope_name),
213                        Some(opts.collection_name),
214                    ),
215                    create_span!("delete").with_durability(opts.durability_level.as_ref()),
216                    || self.inner.crud.delete(opts),
217                )
218                .await;
219        }
220        self.inner.crud.delete(opts).await
221    }
222
223    pub async fn get_and_lock(&self, opts: GetAndLockOptions<'_>) -> Result<GetAndLockResult> {
224        #[cfg(feature = "top-level-spans")]
225        {
226            let bucket_name = self.get_bucket_name();
227            return self
228                .execute_observable_operation(
229                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
230                    build_keyspace(
231                        bucket_name.as_deref(),
232                        Some(opts.scope_name),
233                        Some(opts.collection_name),
234                    ),
235                    create_span!("get_and_lock"),
236                    || self.inner.crud.get_and_lock(opts),
237                )
238                .await;
239        }
240        self.inner.crud.get_and_lock(opts).await
241    }
242
243    pub async fn get_and_touch(&self, opts: GetAndTouchOptions<'_>) -> Result<GetAndTouchResult> {
244        #[cfg(feature = "top-level-spans")]
245        {
246            let bucket_name = self.get_bucket_name();
247            return self
248                .execute_observable_operation(
249                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
250                    build_keyspace(
251                        bucket_name.as_deref(),
252                        Some(opts.scope_name),
253                        Some(opts.collection_name),
254                    ),
255                    create_span!("get_and_touch"),
256                    || self.inner.crud.get_and_touch(opts),
257                )
258                .await;
259        }
260        self.inner.crud.get_and_touch(opts).await
261    }
262
263    pub async fn unlock(&self, opts: UnlockOptions<'_>) -> Result<UnlockResult> {
264        #[cfg(feature = "top-level-spans")]
265        {
266            let bucket_name = self.get_bucket_name();
267            return self
268                .execute_observable_operation(
269                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
270                    build_keyspace(
271                        bucket_name.as_deref(),
272                        Some(opts.scope_name),
273                        Some(opts.collection_name),
274                    ),
275                    create_span!("unlock"),
276                    || self.inner.crud.unlock(opts),
277                )
278                .await;
279        }
280        self.inner.crud.unlock(opts).await
281    }
282
283    pub async fn touch(&self, opts: TouchOptions<'_>) -> Result<TouchResult> {
284        #[cfg(feature = "top-level-spans")]
285        {
286            let bucket_name = self.get_bucket_name();
287            return self
288                .execute_observable_operation(
289                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
290                    build_keyspace(
291                        bucket_name.as_deref(),
292                        Some(opts.scope_name),
293                        Some(opts.collection_name),
294                    ),
295                    create_span!("touch"),
296                    || self.inner.crud.touch(opts),
297                )
298                .await;
299        }
300        self.inner.crud.touch(opts).await
301    }
302
303    pub async fn add(&self, opts: AddOptions<'_>) -> Result<AddResult> {
304        #[cfg(feature = "top-level-spans")]
305        {
306            let bucket_name = self.get_bucket_name();
307            return self
308                .execute_observable_operation(
309                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
310                    build_keyspace(
311                        bucket_name.as_deref(),
312                        Some(opts.scope_name),
313                        Some(opts.collection_name),
314                    ),
315                    create_span!("add").with_durability(opts.durability_level.as_ref()),
316                    || self.inner.crud.add(opts),
317                )
318                .await;
319        }
320        self.inner.crud.add(opts).await
321    }
322
323    pub async fn replace(&self, opts: ReplaceOptions<'_>) -> Result<ReplaceResult> {
324        #[cfg(feature = "top-level-spans")]
325        {
326            let bucket_name = self.get_bucket_name();
327            return self
328                .execute_observable_operation(
329                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
330                    build_keyspace(
331                        bucket_name.as_deref(),
332                        Some(opts.scope_name),
333                        Some(opts.collection_name),
334                    ),
335                    create_span!("replace").with_durability(opts.durability_level.as_ref()),
336                    || self.inner.crud.replace(opts),
337                )
338                .await;
339        }
340        self.inner.crud.replace(opts).await
341    }
342
343    pub async fn append(&self, opts: AppendOptions<'_>) -> Result<AppendResult> {
344        #[cfg(feature = "top-level-spans")]
345        {
346            let bucket_name = self.get_bucket_name();
347            return self
348                .execute_observable_operation(
349                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
350                    build_keyspace(
351                        bucket_name.as_deref(),
352                        Some(opts.scope_name),
353                        Some(opts.collection_name),
354                    ),
355                    create_span!("append").with_durability(opts.durability_level.as_ref()),
356                    || self.inner.crud.append(opts),
357                )
358                .await;
359        }
360        self.inner.crud.append(opts).await
361    }
362
363    pub async fn prepend(&self, opts: PrependOptions<'_>) -> Result<PrependResult> {
364        #[cfg(feature = "top-level-spans")]
365        {
366            let bucket_name = self.get_bucket_name();
367            return self
368                .execute_observable_operation(
369                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
370                    build_keyspace(
371                        bucket_name.as_deref(),
372                        Some(opts.scope_name),
373                        Some(opts.collection_name),
374                    ),
375                    create_span!("prepend").with_durability(opts.durability_level.as_ref()),
376                    || self.inner.crud.prepend(opts),
377                )
378                .await;
379        }
380        self.inner.crud.prepend(opts).await
381    }
382
383    pub async fn increment(&self, opts: IncrementOptions<'_>) -> Result<IncrementResult> {
384        #[cfg(feature = "top-level-spans")]
385        {
386            let bucket_name = self.get_bucket_name();
387            return self
388                .execute_observable_operation(
389                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
390                    build_keyspace(
391                        bucket_name.as_deref(),
392                        Some(opts.scope_name),
393                        Some(opts.collection_name),
394                    ),
395                    create_span!("increment"),
396                    || self.inner.crud.increment(opts),
397                )
398                .await;
399        }
400        self.inner.crud.increment(opts).await
401    }
402
403    pub async fn decrement(&self, opts: DecrementOptions<'_>) -> Result<DecrementResult> {
404        #[cfg(feature = "top-level-spans")]
405        {
406            let bucket_name = self.get_bucket_name();
407            return self
408                .execute_observable_operation(
409                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
410                    build_keyspace(
411                        bucket_name.as_deref(),
412                        Some(opts.scope_name),
413                        Some(opts.collection_name),
414                    ),
415                    create_span!("decrement"),
416                    || self.inner.crud.decrement(opts),
417                )
418                .await;
419        }
420        self.inner.crud.decrement(opts).await
421    }
422
423    pub async fn get_collection_id(
424        &self,
425        opts: GetCollectionIdOptions<'_>,
426    ) -> Result<GetCollectionIdResult> {
427        self.inner.crud.get_collection_id(opts).await
428    }
429
430    pub async fn lookup_in(&self, opts: LookupInOptions<'_>) -> Result<LookupInResult> {
431        #[cfg(feature = "top-level-spans")]
432        {
433            let bucket_name = self.get_bucket_name();
434            return self
435                .execute_observable_operation(
436                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
437                    build_keyspace(
438                        bucket_name.as_deref(),
439                        Some(opts.scope_name),
440                        Some(opts.collection_name),
441                    ),
442                    create_span!("lookup_in"),
443                    || self.inner.crud.lookup_in(opts),
444                )
445                .await;
446        }
447        self.inner.crud.lookup_in(opts).await
448    }
449
450    pub async fn mutate_in(&self, opts: MutateInOptions<'_>) -> Result<MutateInResult> {
451        #[cfg(feature = "top-level-spans")]
452        {
453            let bucket_name = self.get_bucket_name();
454            return self
455                .execute_observable_operation(
456                    Some(crate::tracingcomponent::SERVICE_VALUE_KV),
457                    build_keyspace(
458                        bucket_name.as_deref(),
459                        Some(opts.scope_name),
460                        Some(opts.collection_name),
461                    ),
462                    create_span!("mutate_in").with_durability(opts.durability_level.as_ref()),
463                    || self.inner.crud.mutate_in(opts),
464                )
465                .await;
466        }
467        self.inner.crud.mutate_in(opts).await
468    }
469
470    pub async fn query(&self, opts: QueryOptions) -> Result<QueryResultStream> {
471        #[cfg(feature = "top-level-spans")]
472        {
473            return self
474                .execute_observable_operation(
475                    Some(crate::tracingcomponent::SERVICE_VALUE_QUERY),
476                    Keyspace::Cluster,
477                    create_span!("query").with_statement(opts.statement.as_deref().unwrap_or("")),
478                    || self.inner.query.query(opts),
479                )
480                .await;
481        }
482        self.inner.query.query(opts).await
483    }
484
485    pub async fn prepared_query(&self, opts: QueryOptions) -> Result<QueryResultStream> {
486        #[cfg(feature = "top-level-spans")]
487        {
488            return self
489                .execute_observable_operation(
490                    Some(crate::tracingcomponent::SERVICE_VALUE_QUERY),
491                    Keyspace::Cluster,
492                    create_span!("query").with_statement(opts.statement.as_deref().unwrap_or("")),
493                    || self.inner.query.prepared_query(opts),
494                )
495                .await;
496        }
497        self.inner.query.prepared_query(opts).await
498    }
499
500    pub async fn get_all_indexes(&self, opts: &GetAllIndexesOptions<'_>) -> Result<Vec<Index>> {
501        #[cfg(feature = "top-level-spans")]
502        {
503            return self
504                .execute_observable_operation(
505                    Some(crate::tracingcomponent::SERVICE_VALUE_QUERY),
506                    build_keyspace(
507                        Some(opts.bucket_name),
508                        opts.scope_name,
509                        opts.collection_name,
510                    ),
511                    create_span!("manager_query_get_all_indexes"),
512                    || self.inner.query.get_all_indexes(opts),
513                )
514                .await;
515        }
516        self.inner.query.get_all_indexes(opts).await
517    }
518
519    pub async fn create_primary_index(&self, opts: &CreatePrimaryIndexOptions<'_>) -> Result<()> {
520        #[cfg(feature = "top-level-spans")]
521        {
522            return self
523                .execute_observable_operation(
524                    Some(crate::tracingcomponent::SERVICE_VALUE_QUERY),
525                    build_keyspace(
526                        Some(opts.bucket_name),
527                        opts.scope_name,
528                        opts.collection_name,
529                    ),
530                    create_span!("manager_query_create_primary_index"),
531                    || self.inner.query.create_primary_index(opts),
532                )
533                .await;
534        }
535        self.inner.query.create_primary_index(opts).await
536    }
537
538    pub async fn create_index(&self, opts: &CreateIndexOptions<'_>) -> Result<()> {
539        #[cfg(feature = "top-level-spans")]
540        {
541            return self
542                .execute_observable_operation(
543                    Some(crate::tracingcomponent::SERVICE_VALUE_QUERY),
544                    build_keyspace(
545                        Some(opts.bucket_name),
546                        opts.scope_name,
547                        opts.collection_name,
548                    ),
549                    create_span!("manager_query_create_index"),
550                    || self.inner.query.create_index(opts),
551                )
552                .await;
553        }
554        self.inner.query.create_index(opts).await
555    }
556
557    pub async fn drop_primary_index(&self, opts: &DropPrimaryIndexOptions<'_>) -> Result<()> {
558        #[cfg(feature = "top-level-spans")]
559        {
560            return self
561                .execute_observable_operation(
562                    Some(crate::tracingcomponent::SERVICE_VALUE_QUERY),
563                    build_keyspace(
564                        Some(opts.bucket_name),
565                        opts.scope_name,
566                        opts.collection_name,
567                    ),
568                    create_span!("manager_query_drop_primary_index"),
569                    || self.inner.query.drop_primary_index(opts),
570                )
571                .await;
572        }
573        self.inner.query.drop_primary_index(opts).await
574    }
575
576    pub async fn drop_index(&self, opts: &DropIndexOptions<'_>) -> Result<()> {
577        #[cfg(feature = "top-level-spans")]
578        {
579            return self
580                .execute_observable_operation(
581                    Some(crate::tracingcomponent::SERVICE_VALUE_QUERY),
582                    build_keyspace(
583                        Some(opts.bucket_name),
584                        opts.scope_name,
585                        opts.collection_name,
586                    ),
587                    create_span!("manager_query_drop_index"),
588                    || self.inner.query.drop_index(opts),
589                )
590                .await;
591        }
592        self.inner.query.drop_index(opts).await
593    }
594
595    pub async fn build_deferred_indexes(
596        &self,
597        opts: &BuildDeferredIndexesOptions<'_>,
598    ) -> Result<()> {
599        #[cfg(feature = "top-level-spans")]
600        {
601            return self
602                .execute_observable_operation(
603                    Some(crate::tracingcomponent::SERVICE_VALUE_QUERY),
604                    build_keyspace(
605                        Some(opts.bucket_name),
606                        opts.scope_name,
607                        opts.collection_name,
608                    ),
609                    create_span!("manager_query_build_deferred_indexes"),
610                    || self.inner.query.build_deferred_indexes(opts),
611                )
612                .await;
613        }
614        self.inner.query.build_deferred_indexes(opts).await
615    }
616
617    pub async fn watch_indexes(&self, opts: &WatchIndexesOptions<'_>) -> Result<()> {
618        #[cfg(feature = "top-level-spans")]
619        {
620            return self
621                .execute_observable_operation(
622                    Some(crate::tracingcomponent::SERVICE_VALUE_QUERY),
623                    build_keyspace(
624                        Some(opts.bucket_name),
625                        opts.scope_name,
626                        opts.collection_name,
627                    ),
628                    create_span!("manager_query_watch_indexes"),
629                    || self.inner.query.watch_indexes(opts),
630                )
631                .await;
632        }
633        self.inner.query.watch_indexes(opts).await
634    }
635
636    pub async fn ensure_index(&self, opts: &EnsureIndexOptions<'_>) -> Result<()> {
637        self.inner.query.ensure_index(opts).await
638    }
639
640    pub async fn search(&self, opts: SearchOptions) -> Result<SearchResultStream> {
641        #[cfg(feature = "top-level-spans")]
642        {
643            let bucket_name = opts.bucket_name.clone();
644            let scope_name = opts.scope_name.clone();
645            return self
646                .execute_observable_operation(
647                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
648                    build_keyspace(bucket_name.as_deref(), scope_name.as_deref(), None),
649                    create_span!("search"),
650                    || self.inner.search.query(opts),
651                )
652                .await;
653        }
654        self.inner.search.query(opts).await
655    }
656
657    pub async fn get_search_index(
658        &self,
659        opts: &GetIndexOptions<'_>,
660    ) -> Result<searchx::index::Index> {
661        #[cfg(feature = "top-level-spans")]
662        {
663            return self
664                .execute_observable_operation(
665                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
666                    build_keyspace(opts.bucket_name, opts.scope_name, None),
667                    create_span!("manager_search_get_index"),
668                    || self.inner.search.get_index(opts),
669                )
670                .await;
671        }
672        self.inner.search.get_index(opts).await
673    }
674
675    pub async fn upsert_search_index(&self, opts: &UpsertIndexOptions<'_>) -> Result<()> {
676        #[cfg(feature = "top-level-spans")]
677        {
678            return self
679                .execute_observable_operation(
680                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
681                    build_keyspace(opts.bucket_name, opts.scope_name, None),
682                    create_span!("manager_search_upsert_index"),
683                    || self.inner.search.upsert_index(opts),
684                )
685                .await;
686        }
687        self.inner.search.upsert_index(opts).await
688    }
689
690    pub async fn delete_search_index(&self, opts: &DeleteIndexOptions<'_>) -> Result<()> {
691        #[cfg(feature = "top-level-spans")]
692        {
693            return self
694                .execute_observable_operation(
695                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
696                    build_keyspace(opts.bucket_name, opts.scope_name, None),
697                    create_span!("manager_search_drop_index"),
698                    || self.inner.search.delete_index(opts),
699                )
700                .await;
701        }
702        self.inner.search.delete_index(opts).await
703    }
704
705    pub async fn get_all_search_indexes(
706        &self,
707        opts: &search_management::GetAllIndexesOptions<'_>,
708    ) -> Result<Vec<searchx::index::Index>> {
709        #[cfg(feature = "top-level-spans")]
710        {
711            return self
712                .execute_observable_operation(
713                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
714                    build_keyspace(opts.bucket_name, opts.scope_name, None),
715                    create_span!("manager_search_get_all_indexes"),
716                    || self.inner.search.get_all_indexes(opts),
717                )
718                .await;
719        }
720        self.inner.search.get_all_indexes(opts).await
721    }
722
723    pub async fn analyze_search_document(
724        &self,
725        opts: &AnalyzeDocumentOptions<'_>,
726    ) -> Result<DocumentAnalysis> {
727        #[cfg(feature = "top-level-spans")]
728        {
729            return self
730                .execute_observable_operation(
731                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
732                    build_keyspace(opts.bucket_name, opts.scope_name, None),
733                    create_span!("manager_search_analyze_document"),
734                    || self.inner.search.analyze_document(opts),
735                )
736                .await;
737        }
738        self.inner.search.analyze_document(opts).await
739    }
740
741    pub async fn get_search_indexed_documents_count(
742        &self,
743        opts: &GetIndexedDocumentsCountOptions<'_>,
744    ) -> Result<u64> {
745        #[cfg(feature = "top-level-spans")]
746        {
747            return self
748                .execute_observable_operation(
749                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
750                    build_keyspace(opts.bucket_name, opts.scope_name, None),
751                    create_span!("manager_search_get_indexed_documents_count"),
752                    || self.inner.search.get_indexed_documents_count(opts),
753                )
754                .await;
755        }
756        self.inner.search.get_indexed_documents_count(opts).await
757    }
758
759    pub async fn pause_search_index_ingest(&self, opts: &PauseIngestOptions<'_>) -> Result<()> {
760        #[cfg(feature = "top-level-spans")]
761        {
762            return self
763                .execute_observable_operation(
764                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
765                    build_keyspace(opts.bucket_name, opts.scope_name, None),
766                    create_span!("manager_search_pause_ingest"),
767                    || self.inner.search.pause_ingest(opts),
768                )
769                .await;
770        }
771        self.inner.search.pause_ingest(opts).await
772    }
773
774    pub async fn resume_search_index_ingest(&self, opts: &ResumeIngestOptions<'_>) -> Result<()> {
775        #[cfg(feature = "top-level-spans")]
776        {
777            return self
778                .execute_observable_operation(
779                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
780                    build_keyspace(opts.bucket_name, opts.scope_name, None),
781                    create_span!("manager_search_resume_ingest"),
782                    || self.inner.search.resume_ingest(opts),
783                )
784                .await;
785        }
786        self.inner.search.resume_ingest(opts).await
787    }
788
789    pub async fn allow_search_index_querying(&self, opts: &AllowQueryingOptions<'_>) -> Result<()> {
790        #[cfg(feature = "top-level-spans")]
791        {
792            return self
793                .execute_observable_operation(
794                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
795                    build_keyspace(opts.bucket_name, opts.scope_name, None),
796                    create_span!("manager_search_allow_querying"),
797                    || self.inner.search.allow_querying(opts),
798                )
799                .await;
800        }
801        self.inner.search.allow_querying(opts).await
802    }
803
804    pub async fn disallow_search_index_querying(
805        &self,
806        opts: &DisallowQueryingOptions<'_>,
807    ) -> Result<()> {
808        #[cfg(feature = "top-level-spans")]
809        {
810            return self
811                .execute_observable_operation(
812                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
813                    build_keyspace(opts.bucket_name, opts.scope_name, None),
814                    create_span!("manager_search_disallow_querying"),
815                    || self.inner.search.disallow_querying(opts),
816                )
817                .await;
818        }
819        self.inner.search.disallow_querying(opts).await
820    }
821
822    pub async fn freeze_search_index_plan(&self, opts: &FreezePlanOptions<'_>) -> Result<()> {
823        #[cfg(feature = "top-level-spans")]
824        {
825            return self
826                .execute_observable_operation(
827                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
828                    build_keyspace(opts.bucket_name, opts.scope_name, None),
829                    create_span!("manager_search_freeze_plan"),
830                    || self.inner.search.freeze_plan(opts),
831                )
832                .await;
833        }
834        self.inner.search.freeze_plan(opts).await
835    }
836
837    pub async fn unfreeze_search_index_plan(&self, opts: &UnfreezePlanOptions<'_>) -> Result<()> {
838        #[cfg(feature = "top-level-spans")]
839        {
840            return self
841                .execute_observable_operation(
842                    Some(crate::tracingcomponent::SERVICE_VALUE_SEARCH),
843                    build_keyspace(opts.bucket_name, opts.scope_name, None),
844                    create_span!("manager_search_unfreeze_plan"),
845                    || self.inner.search.unfreeze_plan(opts),
846                )
847                .await;
848        }
849        self.inner.search.unfreeze_plan(opts).await
850    }
851
852    pub async fn get_collection_manifest(
853        &self,
854        opts: &GetCollectionManifestOptions<'_>,
855    ) -> Result<CollectionManifest> {
856        self.inner.mgmt.get_collection_manifest(opts).await
857    }
858
859    pub async fn create_scope(&self, opts: &CreateScopeOptions<'_>) -> Result<CreateScopeResponse> {
860        #[cfg(feature = "top-level-spans")]
861        {
862            return self
863                .execute_observable_operation(
864                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
865                    build_keyspace(Some(opts.bucket_name), Some(opts.scope_name), None),
866                    create_span!("manager_collections_create_scope"),
867                    || self.inner.mgmt.create_scope(opts),
868                )
869                .await;
870        }
871        self.inner.mgmt.create_scope(opts).await
872    }
873
874    pub async fn delete_scope(&self, opts: &DeleteScopeOptions<'_>) -> Result<DeleteScopeResponse> {
875        #[cfg(feature = "top-level-spans")]
876        {
877            return self
878                .execute_observable_operation(
879                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
880                    build_keyspace(Some(opts.bucket_name), Some(opts.scope_name), None),
881                    create_span!("manager_collections_drop_scope"),
882                    || self.inner.mgmt.delete_scope(opts),
883                )
884                .await;
885        }
886        self.inner.mgmt.delete_scope(opts).await
887    }
888
889    pub async fn create_collection(
890        &self,
891        opts: &CreateCollectionOptions<'_>,
892    ) -> Result<CreateCollectionResponse> {
893        #[cfg(feature = "top-level-spans")]
894        {
895            return self
896                .execute_observable_operation(
897                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
898                    build_keyspace(
899                        Some(opts.bucket_name),
900                        Some(opts.scope_name),
901                        Some(opts.collection_name),
902                    ),
903                    create_span!("manager_collections_create_collection"),
904                    || self.inner.mgmt.create_collection(opts),
905                )
906                .await;
907        }
908        self.inner.mgmt.create_collection(opts).await
909    }
910
911    pub async fn delete_collection(
912        &self,
913        opts: &DeleteCollectionOptions<'_>,
914    ) -> Result<DeleteCollectionResponse> {
915        #[cfg(feature = "top-level-spans")]
916        {
917            return self
918                .execute_observable_operation(
919                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
920                    build_keyspace(
921                        Some(opts.bucket_name),
922                        Some(opts.scope_name),
923                        Some(opts.collection_name),
924                    ),
925                    create_span!("manager_collections_drop_collection"),
926                    || self.inner.mgmt.delete_collection(opts),
927                )
928                .await;
929        }
930        self.inner.mgmt.delete_collection(opts).await
931    }
932
933    pub async fn update_collection(
934        &self,
935        opts: &UpdateCollectionOptions<'_>,
936    ) -> Result<UpdateCollectionResponse> {
937        #[cfg(feature = "top-level-spans")]
938        {
939            return self
940                .execute_observable_operation(
941                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
942                    build_keyspace(
943                        Some(opts.bucket_name),
944                        Some(opts.scope_name),
945                        Some(opts.collection_name),
946                    ),
947                    create_span!("manager_collections_update_collection"),
948                    || self.inner.mgmt.update_collection(opts),
949                )
950                .await;
951        }
952        self.inner.mgmt.update_collection(opts).await
953    }
954
955    pub async fn ensure_manifest(&self, opts: &EnsureManifestOptions<'_>) -> Result<()> {
956        self.inner.mgmt.ensure_manifest(opts).await
957    }
958
959    pub async fn get_all_buckets(&self, opts: &GetAllBucketsOptions<'_>) -> Result<Vec<BucketDef>> {
960        #[cfg(feature = "top-level-spans")]
961        {
962            return self
963                .execute_observable_operation(
964                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
965                    Keyspace::Cluster,
966                    create_span!("manager_buckets_get_all_buckets"),
967                    || self.inner.mgmt.get_all_buckets(opts),
968                )
969                .await;
970        }
971        self.inner.mgmt.get_all_buckets(opts).await
972    }
973
974    pub async fn get_bucket(&self, opts: &GetBucketOptions<'_>) -> Result<BucketDef> {
975        #[cfg(feature = "top-level-spans")]
976        {
977            return self
978                .execute_observable_operation(
979                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
980                    build_keyspace(Some(opts.bucket_name), None, None),
981                    create_span!("manager_buckets_get_bucket"),
982                    || self.inner.mgmt.get_bucket(opts),
983                )
984                .await;
985        }
986        self.inner.mgmt.get_bucket(opts).await
987    }
988
989    pub async fn create_bucket(&self, opts: &CreateBucketOptions<'_>) -> Result<()> {
990        #[cfg(feature = "top-level-spans")]
991        {
992            return self
993                .execute_observable_operation(
994                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
995                    build_keyspace(Some(opts.bucket_name), None, None),
996                    create_span!("manager_buckets_create_bucket"),
997                    || self.inner.mgmt.create_bucket(opts),
998                )
999                .await;
1000        }
1001        self.inner.mgmt.create_bucket(opts).await
1002    }
1003
1004    pub async fn update_bucket(&self, opts: &UpdateBucketOptions<'_>) -> Result<()> {
1005        #[cfg(feature = "top-level-spans")]
1006        {
1007            return self
1008                .execute_observable_operation(
1009                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1010                    build_keyspace(Some(opts.bucket_name), None, None),
1011                    create_span!("manager_buckets_update_bucket"),
1012                    || self.inner.mgmt.update_bucket(opts),
1013                )
1014                .await;
1015        }
1016        self.inner.mgmt.update_bucket(opts).await
1017    }
1018
1019    pub async fn delete_bucket(&self, opts: &DeleteBucketOptions<'_>) -> Result<()> {
1020        #[cfg(feature = "top-level-spans")]
1021        {
1022            return self
1023                .execute_observable_operation(
1024                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1025                    build_keyspace(Some(opts.bucket_name), None, None),
1026                    create_span!("manager_buckets_drop_bucket"),
1027                    || self.inner.mgmt.delete_bucket(opts),
1028                )
1029                .await;
1030        }
1031        self.inner.mgmt.delete_bucket(opts).await
1032    }
1033
1034    pub async fn flush_bucket(&self, opts: &FlushBucketOptions<'_>) -> Result<()> {
1035        #[cfg(feature = "top-level-spans")]
1036        {
1037            return self
1038                .execute_observable_operation(
1039                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1040                    build_keyspace(Some(opts.bucket_name), None, None),
1041                    create_span!("manager_buckets_flush_bucket"),
1042                    || self.inner.mgmt.flush_bucket(opts),
1043                )
1044                .await;
1045        }
1046        self.inner.mgmt.flush_bucket(opts).await
1047    }
1048
1049    pub async fn get_user(&self, opts: &GetUserOptions<'_>) -> Result<UserAndMetadata> {
1050        #[cfg(feature = "top-level-spans")]
1051        {
1052            return self
1053                .execute_observable_operation(
1054                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1055                    Keyspace::Cluster,
1056                    create_span!("manager_users_get_user"),
1057                    || self.inner.mgmt.get_user(opts),
1058                )
1059                .await;
1060        }
1061        self.inner.mgmt.get_user(opts).await
1062    }
1063
1064    pub async fn get_all_users(
1065        &self,
1066        opts: &GetAllUsersOptions<'_>,
1067    ) -> Result<Vec<UserAndMetadata>> {
1068        #[cfg(feature = "top-level-spans")]
1069        {
1070            return self
1071                .execute_observable_operation(
1072                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1073                    Keyspace::Cluster,
1074                    create_span!("manager_users_get_all_users"),
1075                    || self.inner.mgmt.get_all_users(opts),
1076                )
1077                .await;
1078        }
1079        self.inner.mgmt.get_all_users(opts).await
1080    }
1081
1082    pub async fn upsert_user(&self, opts: &UpsertUserOptions<'_>) -> Result<()> {
1083        #[cfg(feature = "top-level-spans")]
1084        {
1085            return self
1086                .execute_observable_operation(
1087                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1088                    Keyspace::Cluster,
1089                    create_span!("manager_users_upsert_user"),
1090                    || self.inner.mgmt.upsert_user(opts),
1091                )
1092                .await;
1093        }
1094        self.inner.mgmt.upsert_user(opts).await
1095    }
1096
1097    pub async fn delete_user(&self, opts: &DeleteUserOptions<'_>) -> Result<()> {
1098        #[cfg(feature = "top-level-spans")]
1099        {
1100            return self
1101                .execute_observable_operation(
1102                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1103                    Keyspace::Cluster,
1104                    create_span!("manager_users_drop_user"),
1105                    || self.inner.mgmt.delete_user(opts),
1106                )
1107                .await;
1108        }
1109        self.inner.mgmt.delete_user(opts).await
1110    }
1111
1112    pub async fn get_roles(&self, opts: &GetRolesOptions<'_>) -> Result<Vec<RoleAndDescription>> {
1113        #[cfg(feature = "top-level-spans")]
1114        {
1115            return self
1116                .execute_observable_operation(
1117                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1118                    Keyspace::Cluster,
1119                    create_span!("manager_users_get_roles"),
1120                    || self.inner.mgmt.get_roles(opts),
1121                )
1122                .await;
1123        }
1124        self.inner.mgmt.get_roles(opts).await
1125    }
1126
1127    pub async fn get_group(&self, opts: &GetGroupOptions<'_>) -> Result<Group> {
1128        #[cfg(feature = "top-level-spans")]
1129        {
1130            return self
1131                .execute_observable_operation(
1132                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1133                    Keyspace::Cluster,
1134                    create_span!("manager_users_get_group"),
1135                    || self.inner.mgmt.get_group(opts),
1136                )
1137                .await;
1138        }
1139        self.inner.mgmt.get_group(opts).await
1140    }
1141
1142    pub async fn get_all_groups(&self, opts: &GetAllGroupsOptions<'_>) -> Result<Vec<Group>> {
1143        #[cfg(feature = "top-level-spans")]
1144        {
1145            return self
1146                .execute_observable_operation(
1147                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1148                    Keyspace::Cluster,
1149                    create_span!("manager_users_get_all_groups"),
1150                    || self.inner.mgmt.get_all_groups(opts),
1151                )
1152                .await;
1153        }
1154        self.inner.mgmt.get_all_groups(opts).await
1155    }
1156
1157    pub async fn upsert_group(&self, opts: &UpsertGroupOptions<'_>) -> Result<()> {
1158        #[cfg(feature = "top-level-spans")]
1159        {
1160            return self
1161                .execute_observable_operation(
1162                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1163                    Keyspace::Cluster,
1164                    create_span!("manager_users_upsert_group"),
1165                    || self.inner.mgmt.upsert_group(opts),
1166                )
1167                .await;
1168        }
1169        self.inner.mgmt.upsert_group(opts).await
1170    }
1171
1172    pub async fn delete_group(&self, opts: &DeleteGroupOptions<'_>) -> Result<()> {
1173        #[cfg(feature = "top-level-spans")]
1174        {
1175            return self
1176                .execute_observable_operation(
1177                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1178                    Keyspace::Cluster,
1179                    create_span!("manager_users_drop_group"),
1180                    || self.inner.mgmt.delete_group(opts),
1181                )
1182                .await;
1183        }
1184        self.inner.mgmt.delete_group(opts).await
1185    }
1186
1187    pub async fn change_password(&self, opts: &ChangePasswordOptions<'_>) -> Result<()> {
1188        #[cfg(feature = "top-level-spans")]
1189        {
1190            return self
1191                .execute_observable_operation(
1192                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1193                    Keyspace::Cluster,
1194                    create_span!("manager_users_change_password"),
1195                    || self.inner.mgmt.change_password(opts),
1196                )
1197                .await;
1198        }
1199        self.inner.mgmt.change_password(opts).await
1200    }
1201
1202    pub async fn ping(&self, opts: &PingOptions) -> Result<PingReport> {
1203        #[cfg(feature = "top-level-spans")]
1204        {
1205            return self
1206                .execute_observable_operation(
1207                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1208                    Keyspace::Cluster,
1209                    create_span!("ping"),
1210                    || self.inner.diagnostics.ping(opts),
1211                )
1212                .await;
1213        }
1214        self.inner.diagnostics.ping(opts).await
1215    }
1216
1217    pub async fn ensure_user(&self, opts: &EnsureUserOptions<'_>) -> Result<()> {
1218        self.inner.mgmt.ensure_user(opts).await
1219    }
1220
1221    pub async fn ensure_group(&self, opts: &EnsureGroupOptions<'_>) -> Result<()> {
1222        self.inner.mgmt.ensure_group(opts).await
1223    }
1224
1225    pub async fn ensure_bucket(&self, opts: &EnsureBucketOptions<'_>) -> Result<()> {
1226        self.inner.mgmt.ensure_bucket(opts).await
1227    }
1228
1229    pub async fn ensure_search_index(
1230        &self,
1231        opts: &search_management::EnsureIndexOptions<'_>,
1232    ) -> Result<()> {
1233        self.inner.search.ensure_index(opts).await
1234    }
1235
1236    pub async fn wait_until_ready(&self, opts: &WaitUntilReadyOptions) -> Result<()> {
1237        #[cfg(feature = "top-level-spans")]
1238        {
1239            return self
1240                .execute_observable_operation(
1241                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1242                    Keyspace::Cluster,
1243                    create_span!("wait_until_ready"),
1244                    || self.inner.diagnostics.wait_until_ready(opts),
1245                )
1246                .await;
1247        }
1248        self.inner.diagnostics.wait_until_ready(opts).await
1249    }
1250
1251    pub async fn diagnostics(&self, opts: &DiagnosticsOptions) -> Result<DiagnosticsResult> {
1252        #[cfg(feature = "top-level-spans")]
1253        {
1254            return self
1255                .execute_observable_operation(
1256                    Some(crate::tracingcomponent::SERVICE_VALUE_MANAGEMENT),
1257                    Keyspace::Cluster,
1258                    create_span!("diagnostics"),
1259                    || self.inner.diagnostics.diagnostics(opts),
1260                )
1261                .await;
1262        }
1263        self.inner.diagnostics.diagnostics(opts).await
1264    }
1265
1266    pub async fn analytics_query(&self, opts: AnalyticsOptions) -> Result<AnalyticsResultStream> {
1267        #[cfg(feature = "top-level-spans")]
1268        {
1269            return self
1270                .execute_observable_operation(
1271                    Some(crate::tracingcomponent::SERVICE_VALUE_ANALYTICS),
1272                    Keyspace::Cluster,
1273                    create_span!("analytics")
1274                        .with_statement(opts.statement.as_deref().unwrap_or("")),
1275                    || self.inner.analytics.query(opts),
1276                )
1277                .await;
1278        }
1279        self.inner.analytics.query(opts).await
1280    }
1281
1282    pub async fn analytics_get_pending_mutations(
1283        &self,
1284        opts: &GetPendingMutationsOptions<'_>,
1285    ) -> Result<HashMap<String, HashMap<String, i64>>> {
1286        #[cfg(feature = "top-level-spans")]
1287        {
1288            return self
1289                .execute_observable_operation(
1290                    Some(crate::tracingcomponent::SERVICE_VALUE_ANALYTICS),
1291                    Keyspace::Cluster,
1292                    create_span!("manager_analytics_get_pending_mutations"),
1293                    || self.inner.analytics.get_pending_mutations(opts),
1294                )
1295                .await;
1296        }
1297        self.inner.analytics.get_pending_mutations(opts).await
1298    }
1299
1300    pub async fn get_full_bucket_config(
1301        &self,
1302        opts: &GetFullBucketConfigOptions<'_>,
1303    ) -> Result<FullBucketConfig> {
1304        self.inner.mgmt.get_full_bucket_config(opts).await
1305    }
1306
1307    pub async fn get_full_cluster_config(
1308        &self,
1309        opts: &GetFullClusterConfigOptions<'_>,
1310    ) -> Result<FullClusterConfig> {
1311        self.inner.mgmt.get_full_cluster_config(opts).await
1312    }
1313
1314    pub async fn load_sample_bucket(&self, opts: &LoadSampleBucketOptions<'_>) -> Result<()> {
1315        self.inner.mgmt.load_sample_bucket(opts).await
1316    }
1317
1318    pub async fn index_status(&self, opts: &IndexStatusOptions<'_>) -> Result<IndexStatus> {
1319        self.inner.mgmt.index_status(opts).await
1320    }
1321
1322    pub async fn get_auto_failover_settings(
1323        &self,
1324        opts: &GetAutoFailoverSettingsOptions<'_>,
1325    ) -> Result<AutoFailoverSettings> {
1326        self.inner.mgmt.get_auto_failover_settings(opts).await
1327    }
1328
1329    pub async fn get_bucket_stats(
1330        &self,
1331        opts: &GetBucketStatsOptions<'_>,
1332    ) -> Result<Box<RawValue>> {
1333        self.inner.mgmt.get_bucket_stats(opts).await
1334    }
1335}