1use 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}