couchbase 3.7.0 → 3.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. checksums.yaml +4 -4
  2. data/README.md +3 -3
  3. data/ext/CMakeLists.txt +4 -1
  4. data/ext/cache/extconf_include.rb +4 -3
  5. data/ext/cache/mozilla-ca-bundle.crt +66 -93
  6. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  7. data/ext/couchbase/CMakeLists.txt +24 -11
  8. data/ext/couchbase/cmake/APKBUILD.in +17 -1
  9. data/ext/couchbase/cmake/Bundler.cmake +9 -1
  10. data/ext/couchbase/cmake/Cache.cmake +48 -19
  11. data/ext/couchbase/cmake/CompilerOptions.cmake +3 -1
  12. data/ext/couchbase/cmake/OpenSSL.cmake +10 -2
  13. data/ext/couchbase/cmake/Packaging.cmake +48 -8
  14. data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +43 -1
  15. data/ext/couchbase/cmake/build_config.hxx.in +2 -0
  16. data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +18 -0
  17. data/ext/couchbase/cmake/tarball_glob.txt +10 -0
  18. data/ext/couchbase/core/app_telemetry_meter.cxx +1 -0
  19. data/ext/couchbase/core/app_telemetry_reporter.cxx +45 -43
  20. data/ext/couchbase/core/app_telemetry_reporter.hxx +4 -3
  21. data/ext/couchbase/core/bucket.cxx +128 -13
  22. data/ext/couchbase/core/bucket.hxx +12 -2
  23. data/ext/couchbase/core/cluster.cxx +304 -152
  24. data/ext/couchbase/core/cluster.hxx +32 -0
  25. data/ext/couchbase/core/cluster_credentials.cxx +25 -0
  26. data/ext/couchbase/core/cluster_credentials.hxx +5 -0
  27. data/ext/couchbase/core/cluster_label_listener.cxx +72 -0
  28. data/ext/couchbase/core/cluster_label_listener.hxx +46 -0
  29. data/ext/couchbase/core/cluster_options.hxx +4 -0
  30. data/ext/couchbase/core/deprecation_utils.hxx +26 -0
  31. data/ext/couchbase/core/error.hxx +27 -0
  32. data/ext/couchbase/core/free_form_http_request.hxx +0 -2
  33. data/ext/couchbase/core/http_component.cxx +12 -48
  34. data/ext/couchbase/core/impl/analytics.cxx +3 -2
  35. data/ext/couchbase/core/impl/analytics.hxx +2 -1
  36. data/ext/couchbase/core/impl/analytics_index_manager.cxx +249 -137
  37. data/ext/couchbase/core/impl/binary_collection.cxx +134 -58
  38. data/ext/couchbase/core/impl/bucket_manager.cxx +87 -35
  39. data/ext/couchbase/core/impl/collection.cxx +560 -245
  40. data/ext/couchbase/core/impl/collection_manager.cxx +89 -49
  41. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +4 -4
  42. data/ext/couchbase/core/impl/error.cxx +20 -13
  43. data/ext/couchbase/core/impl/error.hxx +15 -10
  44. data/ext/couchbase/core/impl/get_all_replicas.hxx +1 -1
  45. data/ext/couchbase/core/impl/get_any_replica.hxx +2 -1
  46. data/ext/couchbase/core/impl/get_replica.hxx +2 -0
  47. data/ext/couchbase/core/impl/lookup_in_replica.hxx +1 -1
  48. data/ext/couchbase/core/impl/observability_recorder.cxx +161 -0
  49. data/ext/couchbase/core/impl/observability_recorder.hxx +77 -0
  50. data/ext/couchbase/core/impl/observe_seqno.hxx +2 -0
  51. data/ext/couchbase/core/impl/public_bucket.cxx +31 -7
  52. data/ext/couchbase/core/impl/public_cluster.cxx +107 -19
  53. data/ext/couchbase/core/impl/query.cxx +6 -3
  54. data/ext/couchbase/core/impl/query.hxx +3 -1
  55. data/ext/couchbase/core/impl/query_index_manager.cxx +267 -102
  56. data/ext/couchbase/core/impl/scope.cxx +53 -11
  57. data/ext/couchbase/core/impl/search.cxx +8 -4
  58. data/ext/couchbase/core/impl/search.hxx +6 -2
  59. data/ext/couchbase/core/impl/search_index_manager.cxx +131 -41
  60. data/ext/couchbase/core/impl/with_cancellation.hxx +75 -0
  61. data/ext/couchbase/core/io/config_tracker.cxx +9 -9
  62. data/ext/couchbase/core/io/config_tracker.hxx +2 -1
  63. data/ext/couchbase/core/io/http_command.hxx +98 -49
  64. data/ext/couchbase/core/io/http_context.hxx +2 -0
  65. data/ext/couchbase/core/io/http_session.cxx +23 -10
  66. data/ext/couchbase/core/io/http_session.hxx +17 -9
  67. data/ext/couchbase/core/io/http_session_manager.hxx +163 -228
  68. data/ext/couchbase/core/io/http_traits.hxx +0 -7
  69. data/ext/couchbase/core/io/mcbp_command.hxx +123 -44
  70. data/ext/couchbase/core/io/mcbp_session.cxx +251 -26
  71. data/ext/couchbase/core/io/mcbp_session.hxx +9 -1
  72. data/ext/couchbase/core/io/mcbp_traits.hxx +0 -8
  73. data/ext/couchbase/core/io/streams.cxx +3 -3
  74. data/ext/couchbase/core/io/streams.hxx +3 -2
  75. data/ext/couchbase/core/meta/features.hxx +15 -0
  76. data/ext/couchbase/core/meta/version.cxx +13 -0
  77. data/ext/couchbase/core/meta/version.hxx +3 -0
  78. data/ext/couchbase/core/metrics/constants.hxx +23 -0
  79. data/ext/couchbase/core/metrics/logging_meter.cxx +5 -5
  80. data/ext/couchbase/core/metrics/meter_wrapper.cxx +65 -63
  81. data/ext/couchbase/core/metrics/meter_wrapper.hxx +12 -10
  82. data/ext/couchbase/core/operations/document_analytics.hxx +0 -5
  83. data/ext/couchbase/core/operations/document_append.hxx +0 -4
  84. data/ext/couchbase/core/operations/document_decrement.hxx +0 -5
  85. data/ext/couchbase/core/operations/document_exists.hxx +0 -7
  86. data/ext/couchbase/core/operations/document_get.hxx +0 -7
  87. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +77 -27
  88. data/ext/couchbase/core/operations/document_get_and_lock.hxx +0 -9
  89. data/ext/couchbase/core/operations/document_get_and_touch.hxx +0 -9
  90. data/ext/couchbase/core/operations/document_get_any_replica.hxx +83 -2
  91. data/ext/couchbase/core/operations/document_get_projected.hxx +0 -9
  92. data/ext/couchbase/core/operations/document_increment.hxx +0 -5
  93. data/ext/couchbase/core/operations/document_insert.hxx +0 -4
  94. data/ext/couchbase/core/operations/document_lookup_in.hxx +0 -9
  95. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +46 -4
  96. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +121 -43
  97. data/ext/couchbase/core/operations/document_mutate_in.hxx +0 -5
  98. data/ext/couchbase/core/operations/document_prepend.hxx +0 -4
  99. data/ext/couchbase/core/operations/document_query.hxx +0 -4
  100. data/ext/couchbase/core/operations/document_remove.hxx +0 -4
  101. data/ext/couchbase/core/operations/document_replace.hxx +0 -4
  102. data/ext/couchbase/core/operations/document_search.hxx +0 -7
  103. data/ext/couchbase/core/operations/document_touch.hxx +0 -7
  104. data/ext/couchbase/core/operations/document_unlock.hxx +0 -6
  105. data/ext/couchbase/core/operations/document_upsert.hxx +0 -4
  106. data/ext/couchbase/core/operations/document_view.cxx +2 -0
  107. data/ext/couchbase/core/operations/document_view.hxx +10 -13
  108. data/ext/couchbase/core/operations/http_noop.hxx +2 -0
  109. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +2 -0
  110. data/ext/couchbase/core/operations/management/analytics_dataset_drop.hxx +2 -0
  111. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.hxx +2 -0
  112. data/ext/couchbase/core/operations/management/analytics_dataverse_create.hxx +2 -0
  113. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.hxx +2 -0
  114. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.hxx +2 -0
  115. data/ext/couchbase/core/operations/management/analytics_index_create.hxx +2 -0
  116. data/ext/couchbase/core/operations/management/analytics_index_drop.hxx +2 -0
  117. data/ext/couchbase/core/operations/management/analytics_index_get_all.hxx +2 -0
  118. data/ext/couchbase/core/operations/management/analytics_link_connect.hxx +2 -0
  119. data/ext/couchbase/core/operations/management/analytics_link_create.hxx +2 -0
  120. data/ext/couchbase/core/operations/management/analytics_link_disconnect.hxx +2 -0
  121. data/ext/couchbase/core/operations/management/analytics_link_drop.hxx +2 -0
  122. data/ext/couchbase/core/operations/management/analytics_link_get_all.hxx +2 -0
  123. data/ext/couchbase/core/operations/management/analytics_link_replace.hxx +2 -0
  124. data/ext/couchbase/core/operations/management/bucket_create.hxx +2 -0
  125. data/ext/couchbase/core/operations/management/bucket_describe.hxx +2 -0
  126. data/ext/couchbase/core/operations/management/bucket_drop.hxx +2 -0
  127. data/ext/couchbase/core/operations/management/bucket_flush.hxx +2 -0
  128. data/ext/couchbase/core/operations/management/bucket_get.hxx +2 -0
  129. data/ext/couchbase/core/operations/management/bucket_get_all.hxx +2 -0
  130. data/ext/couchbase/core/operations/management/bucket_update.hxx +2 -0
  131. data/ext/couchbase/core/operations/management/change_password.hxx +2 -0
  132. data/ext/couchbase/core/operations/management/cluster_describe.hxx +2 -0
  133. data/ext/couchbase/core/operations/management/cluster_developer_preview_enable.hxx +2 -0
  134. data/ext/couchbase/core/operations/management/collection_create.hxx +2 -0
  135. data/ext/couchbase/core/operations/management/collection_drop.hxx +2 -0
  136. data/ext/couchbase/core/operations/management/collection_update.hxx +2 -0
  137. data/ext/couchbase/core/operations/management/collections_manifest_get.hxx +2 -0
  138. data/ext/couchbase/core/operations/management/error_utils.cxx +4 -1
  139. data/ext/couchbase/core/operations/management/eventing_deploy_function.hxx +2 -0
  140. data/ext/couchbase/core/operations/management/eventing_drop_function.hxx +2 -0
  141. data/ext/couchbase/core/operations/management/eventing_get_all_functions.hxx +2 -0
  142. data/ext/couchbase/core/operations/management/eventing_get_function.hxx +2 -0
  143. data/ext/couchbase/core/operations/management/eventing_get_status.hxx +2 -0
  144. data/ext/couchbase/core/operations/management/eventing_pause_function.hxx +2 -0
  145. data/ext/couchbase/core/operations/management/eventing_resume_function.hxx +2 -0
  146. data/ext/couchbase/core/operations/management/eventing_undeploy_function.hxx +2 -0
  147. data/ext/couchbase/core/operations/management/eventing_upsert_function.hxx +2 -0
  148. data/ext/couchbase/core/operations/management/freeform.hxx +2 -0
  149. data/ext/couchbase/core/operations/management/group_drop.hxx +2 -0
  150. data/ext/couchbase/core/operations/management/group_get.hxx +2 -0
  151. data/ext/couchbase/core/operations/management/group_get_all.hxx +2 -0
  152. data/ext/couchbase/core/operations/management/group_upsert.hxx +2 -0
  153. data/ext/couchbase/core/operations/management/query_index_build.hxx +2 -0
  154. data/ext/couchbase/core/operations/management/query_index_build_deferred.hxx +68 -30
  155. data/ext/couchbase/core/operations/management/query_index_create.hxx +2 -0
  156. data/ext/couchbase/core/operations/management/query_index_drop.hxx +2 -0
  157. data/ext/couchbase/core/operations/management/query_index_get_all.hxx +4 -3
  158. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.hxx +2 -1
  159. data/ext/couchbase/core/operations/management/role_get_all.hxx +2 -0
  160. data/ext/couchbase/core/operations/management/scope_create.hxx +2 -0
  161. data/ext/couchbase/core/operations/management/scope_drop.hxx +2 -0
  162. data/ext/couchbase/core/operations/management/scope_get_all.hxx +2 -0
  163. data/ext/couchbase/core/operations/management/search_get_stats.hxx +2 -0
  164. data/ext/couchbase/core/operations/management/search_index_analyze_document.hxx +2 -0
  165. data/ext/couchbase/core/operations/management/search_index_control_ingest.hxx +2 -0
  166. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.hxx +2 -0
  167. data/ext/couchbase/core/operations/management/search_index_control_query.hxx +2 -0
  168. data/ext/couchbase/core/operations/management/search_index_drop.hxx +2 -0
  169. data/ext/couchbase/core/operations/management/search_index_get.hxx +2 -0
  170. data/ext/couchbase/core/operations/management/search_index_get_all.hxx +2 -0
  171. data/ext/couchbase/core/operations/management/search_index_get_documents_count.hxx +2 -0
  172. data/ext/couchbase/core/operations/management/search_index_get_stats.hxx +2 -0
  173. data/ext/couchbase/core/operations/management/search_index_upsert.hxx +2 -0
  174. data/ext/couchbase/core/operations/management/user_drop.hxx +2 -0
  175. data/ext/couchbase/core/operations/management/user_get.hxx +2 -0
  176. data/ext/couchbase/core/operations/management/user_get_all.hxx +2 -0
  177. data/ext/couchbase/core/operations/management/user_upsert.hxx +2 -0
  178. data/ext/couchbase/core/operations/management/view_index_drop.hxx +2 -0
  179. data/ext/couchbase/core/operations/management/view_index_get.hxx +2 -0
  180. data/ext/couchbase/core/operations/management/view_index_get_all.hxx +2 -0
  181. data/ext/couchbase/core/operations/management/view_index_upsert.hxx +2 -0
  182. data/ext/couchbase/core/operations/operation_traits.hxx +6 -0
  183. data/ext/couchbase/core/operations.hxx +0 -1
  184. data/ext/couchbase/core/operations_fwd.hxx +8 -0
  185. data/ext/couchbase/core/origin.cxx +67 -12
  186. data/ext/couchbase/core/origin.hxx +13 -8
  187. data/ext/couchbase/core/orphan_reporter.cxx +164 -0
  188. data/ext/couchbase/core/orphan_reporter.hxx +65 -0
  189. data/ext/couchbase/core/sasl/CMakeLists.txt +1 -0
  190. data/ext/couchbase/core/sasl/client.cc +6 -0
  191. data/ext/couchbase/core/sasl/mechanism.cc +2 -1
  192. data/ext/couchbase/core/sasl/mechanism.h +2 -1
  193. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.cc +41 -0
  194. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.h +47 -0
  195. data/ext/couchbase/core/tls_context_provider.cxx +44 -0
  196. data/ext/couchbase/core/tls_context_provider.hxx +44 -0
  197. data/ext/couchbase/core/tracing/attribute_helpers.hxx +45 -0
  198. data/ext/couchbase/core/tracing/constants.hxx +148 -68
  199. data/ext/couchbase/core/tracing/threshold_logging_options.hxx +0 -3
  200. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +122 -170
  201. data/ext/couchbase/core/tracing/tracer_wrapper.cxx +17 -24
  202. data/ext/couchbase/core/tracing/tracer_wrapper.hxx +8 -10
  203. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.cxx +114 -0
  204. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.hxx +85 -0
  205. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +16 -14
  206. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +4 -4
  207. data/ext/couchbase/core/transactions/transactions.cxx +1 -1
  208. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +1 -2
  209. data/ext/couchbase/core/utils/byteswap.hxx +12 -0
  210. data/ext/couchbase/core/utils/concurrent_fixed_priority_queue.hxx +102 -0
  211. data/ext/couchbase/core/utils/connection_string.cxx +2 -0
  212. data/ext/couchbase/couchbase/certificate_authenticator.hxx +1 -0
  213. data/ext/couchbase/couchbase/cluster.hxx +47 -0
  214. data/ext/couchbase/couchbase/cluster_options.hxx +16 -0
  215. data/ext/couchbase/couchbase/collection.hxx +60 -15
  216. data/ext/couchbase/couchbase/error_codes.hxx +48 -48
  217. data/ext/couchbase/couchbase/jwt_authenticator.hxx +52 -0
  218. data/ext/couchbase/couchbase/metrics/meter.hxx +2 -1
  219. data/ext/couchbase/couchbase/metrics/otel_meter.hxx +75 -80
  220. data/ext/couchbase/couchbase/network_options.hxx +19 -0
  221. data/ext/couchbase/couchbase/password_authenticator.hxx +1 -0
  222. data/ext/couchbase/couchbase/tracing/otel_tracer.hxx +15 -17
  223. data/ext/couchbase/couchbase/tracing/request_span.hxx +2 -2
  224. data/ext/couchbase.cxx +4 -0
  225. data/ext/extconf.rb +1 -0
  226. data/ext/rcb_analytics.cxx +157 -47
  227. data/ext/rcb_backend.cxx +118 -71
  228. data/ext/rcb_buckets.cxx +39 -16
  229. data/ext/rcb_collections.cxx +36 -12
  230. data/ext/rcb_crud.cxx +587 -294
  231. data/ext/rcb_hdr_histogram.cxx +219 -0
  232. data/ext/rcb_hdr_histogram.hxx +28 -0
  233. data/ext/rcb_multi.cxx +142 -59
  234. data/ext/rcb_observability.cxx +132 -0
  235. data/ext/rcb_observability.hxx +49 -0
  236. data/ext/rcb_query.cxx +77 -27
  237. data/ext/rcb_search.cxx +92 -31
  238. data/ext/rcb_users.cxx +69 -26
  239. data/ext/rcb_utils.cxx +91 -0
  240. data/ext/rcb_utils.hxx +141 -168
  241. data/ext/rcb_views.cxx +36 -12
  242. data/lib/active_support/cache/couchbase_store.rb +6 -6
  243. data/lib/couchbase/authenticator.rb +14 -0
  244. data/lib/couchbase/binary_collection.rb +37 -22
  245. data/lib/couchbase/bucket.rb +46 -31
  246. data/lib/couchbase/cluster.rb +146 -61
  247. data/lib/couchbase/collection.rb +257 -186
  248. data/lib/couchbase/datastructures/couchbase_list.rb +81 -50
  249. data/lib/couchbase/datastructures/couchbase_map.rb +86 -50
  250. data/lib/couchbase/datastructures/couchbase_queue.rb +64 -38
  251. data/lib/couchbase/datastructures/couchbase_set.rb +57 -41
  252. data/lib/couchbase/deprecations.rb +1 -1
  253. data/lib/couchbase/diagnostics.rb +8 -8
  254. data/lib/couchbase/errors.rb +6 -0
  255. data/lib/couchbase/management/analytics_index_manager.rb +90 -59
  256. data/lib/couchbase/management/bucket_manager.rb +73 -45
  257. data/lib/couchbase/management/collection_manager.rb +86 -43
  258. data/lib/couchbase/management/collection_query_index_manager.rb +56 -33
  259. data/lib/couchbase/management/query_index_manager.rb +88 -36
  260. data/lib/couchbase/management/scope_search_index_manager.rb +119 -52
  261. data/lib/couchbase/management/search_index_manager.rb +401 -178
  262. data/lib/couchbase/management/user_manager.rb +343 -174
  263. data/lib/couchbase/management/view_index_manager.rb +166 -73
  264. data/lib/couchbase/metrics/logging_meter.rb +108 -0
  265. data/lib/couchbase/metrics/logging_value_recorder.rb +50 -0
  266. data/lib/couchbase/metrics/meter.rb +27 -0
  267. data/lib/couchbase/metrics/noop_meter.rb +30 -0
  268. data/lib/couchbase/metrics/noop_value_recorder.rb +27 -0
  269. data/lib/couchbase/metrics/value_recorder.rb +25 -0
  270. data/lib/couchbase/options.rb +69 -3
  271. data/lib/couchbase/protostellar/cluster.rb +3 -0
  272. data/lib/couchbase/scope.rb +62 -48
  273. data/lib/couchbase/search_options.rb +18 -18
  274. data/lib/couchbase/tracing/noop_span.rb +29 -0
  275. data/lib/couchbase/tracing/noop_tracer.rb +29 -0
  276. data/lib/couchbase/tracing/request_span.rb +34 -0
  277. data/lib/couchbase/tracing/request_tracer.rb +28 -0
  278. data/lib/couchbase/tracing/threshold_logging_span.rb +112 -0
  279. data/lib/couchbase/tracing/threshold_logging_tracer.rb +231 -0
  280. data/lib/couchbase/utils/hdr_histogram.rb +55 -0
  281. data/lib/couchbase/utils/observability.rb +257 -0
  282. data/lib/couchbase/utils/observability_constants.rb +200 -0
  283. data/lib/couchbase/utils/stdlib_logger_adapter.rb +1 -3
  284. data/lib/couchbase/version.rb +1 -1
  285. data/lib/couchbase.rb +2 -2
  286. metadata +58 -6
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include "core/cluster.hxx"
21
21
  #include "core/impl/error.hxx"
22
+ #include "core/impl/observability_recorder.hxx"
22
23
  #include "core/operations/document_append.hxx"
23
24
  #include "core/operations/document_decrement.hxx"
24
25
  #include "core/operations/document_increment.hxx"
@@ -28,6 +29,9 @@
28
29
  #include "core/operations/document_remove.hxx"
29
30
  #include "core/operations/document_replace.hxx"
30
31
  #include "core/operations/document_upsert.hxx"
32
+ #include "core/tracing/attribute_helpers.hxx"
33
+ #include "core/tracing/constants.hxx"
34
+ #include "core/tracing/tracer_wrapper.hxx"
31
35
  #include "observe_poll.hxx"
32
36
 
33
37
  #include <couchbase/append_options.hxx>
@@ -83,6 +87,9 @@ public:
83
87
  append_options::built options,
84
88
  append_handler&& handler) const
85
89
  {
90
+ auto obs_rec = create_observability_recorder(
91
+ core::tracing::operation::mcbp_append, options.parent_span, options.durability_level);
92
+
86
93
  auto id = core::document_id{
87
94
  bucket_name_,
88
95
  scope_name_,
@@ -90,18 +97,21 @@ public:
90
97
  std::move(document_key),
91
98
  };
92
99
  if (options.persist_to == persist_to::none && options.replicate_to == replicate_to::none) {
100
+ core::operations::append_request request{
101
+ std::move(id),
102
+ std::move(data),
103
+ {},
104
+ {},
105
+ options.cas,
106
+ options.durability_level,
107
+ options.timeout,
108
+ { options.retry_strategy },
109
+ obs_rec->operation_span(),
110
+ };
93
111
  return core_.execute(
94
- core::operations::append_request{
95
- std::move(id),
96
- std::move(data),
97
- {},
98
- {},
99
- options.cas,
100
- options.durability_level,
101
- options.timeout,
102
- { options.retry_strategy },
103
- },
104
- [handler = std::move(handler)](auto&& resp) mutable {
112
+ std::move(request),
113
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](auto&& resp) mutable {
114
+ obs_rec->finish(resp.ctx.retry_attempts(), resp.ctx.ec());
105
115
  if (resp.ctx.ec()) {
106
116
  return handler(core::impl::make_error(std::move(resp.ctx)), mutation_result{});
107
117
  }
@@ -119,11 +129,16 @@ public:
119
129
  durability_level::none,
120
130
  options.timeout,
121
131
  { options.retry_strategy },
132
+ obs_rec->operation_span(),
122
133
  };
123
134
  return core_.execute(std::move(request),
124
- [core = core_, id = std::move(id), options, handler = std::move(handler)](
125
- auto&& resp) mutable {
135
+ [core = core_,
136
+ id = std::move(id),
137
+ options,
138
+ obs_rec = std::move(obs_rec),
139
+ handler = std::move(handler)](auto&& resp) mutable {
126
140
  if (resp.ctx.ec()) {
141
+ obs_rec->finish(resp.ctx.retry_attempts(), resp.ctx.ec());
127
142
  return handler(core::impl::make_error(std::move(resp.ctx)),
128
143
  mutation_result{ resp.cas, std::move(resp.token) });
129
144
  }
@@ -136,8 +151,10 @@ public:
136
151
  options.timeout,
137
152
  options.persist_to,
138
153
  options.replicate_to,
139
- [resp = std::forward<decltype(resp)>(resp),
154
+ [obs_rec = std::move(obs_rec),
155
+ resp = std::forward<decltype(resp)>(resp),
140
156
  handler = std::move(handler)](std::error_code ec) mutable {
157
+ obs_rec->finish(resp.ctx.retry_attempts(), ec);
141
158
  if (ec) {
142
159
  resp.ctx.override_ec(ec);
143
160
  return handler(core::impl::make_error(std::move(resp.ctx)),
@@ -154,6 +171,9 @@ public:
154
171
  prepend_options::built options,
155
172
  prepend_handler&& handler) const
156
173
  {
174
+ auto obs_rec = create_observability_recorder(
175
+ core::tracing::operation::mcbp_prepend, options.parent_span, options.durability_level);
176
+
157
177
  auto id = core::document_id{
158
178
  bucket_name_,
159
179
  scope_name_,
@@ -161,18 +181,21 @@ public:
161
181
  std::move(document_key),
162
182
  };
163
183
  if (options.persist_to == persist_to::none && options.replicate_to == replicate_to::none) {
184
+ core::operations::prepend_request request{
185
+ std::move(id),
186
+ std::move(data),
187
+ {},
188
+ {},
189
+ options.cas,
190
+ options.durability_level,
191
+ options.timeout,
192
+ { options.retry_strategy },
193
+ obs_rec->operation_span(),
194
+ };
164
195
  return core_.execute(
165
- core::operations::prepend_request{
166
- std::move(id),
167
- std::move(data),
168
- {},
169
- {},
170
- options.cas,
171
- options.durability_level,
172
- options.timeout,
173
- { options.retry_strategy },
174
- },
175
- [handler = std::move(handler)](auto&& resp) mutable {
196
+ std::move(request),
197
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](auto&& resp) mutable {
198
+ obs_rec->finish(resp.ctx.retry_attempts(), resp.ctx.ec());
176
199
  if (resp.ctx.ec()) {
177
200
  return handler(core::impl::make_error(std::move(resp.ctx)), mutation_result{});
178
201
  }
@@ -190,11 +213,16 @@ public:
190
213
  durability_level::none,
191
214
  options.timeout,
192
215
  { options.retry_strategy },
216
+ obs_rec->operation_span(),
193
217
  };
194
218
  return core_.execute(std::move(request),
195
- [core = core_, id = std::move(id), options, handler = std::move(handler)](
196
- auto&& resp) mutable {
219
+ [obs_rec = std::move(obs_rec),
220
+ core = core_,
221
+ id = std::move(id),
222
+ options,
223
+ handler = std::move(handler)](auto&& resp) mutable {
197
224
  if (resp.ctx.ec()) {
225
+ obs_rec->finish(resp.ctx.retry_attempts(), resp.ctx.ec());
198
226
  return handler(core::impl::make_error(std::move(resp.ctx)),
199
227
  mutation_result{ resp.cas, std::move(resp.token) });
200
228
  }
@@ -207,8 +235,10 @@ public:
207
235
  options.timeout,
208
236
  options.persist_to,
209
237
  options.replicate_to,
210
- [resp = std::forward<decltype(resp)>(resp),
238
+ [obs_rec = std::move(obs_rec),
239
+ resp = std::forward<decltype(resp)>(resp),
211
240
  handler = std::move(handler)](std::error_code ec) mutable {
241
+ obs_rec->finish(resp.ctx.retry_attempts(), ec);
212
242
  if (ec) {
213
243
  resp.ctx.override_ec(ec);
214
244
  return handler(core::impl::make_error(std::move(resp.ctx)),
@@ -224,6 +254,9 @@ public:
224
254
  decrement_options::built options,
225
255
  decrement_handler&& handler) const
226
256
  {
257
+ auto obs_rec = create_observability_recorder(
258
+ core::tracing::operation::mcbp_decrement, options.parent_span, options.durability_level);
259
+
227
260
  auto id = core::document_id{
228
261
  bucket_name_,
229
262
  scope_name_,
@@ -231,19 +264,23 @@ public:
231
264
  std::move(document_key),
232
265
  };
233
266
  if (options.persist_to == persist_to::none && options.replicate_to == replicate_to::none) {
267
+ core::operations::decrement_request request{
268
+ std::move(id),
269
+ {},
270
+ {},
271
+ options.expiry,
272
+ options.delta,
273
+ options.initial_value,
274
+ options.durability_level,
275
+ options.timeout,
276
+ { options.retry_strategy },
277
+ obs_rec->operation_span(),
278
+ };
234
279
  return core_.execute(
235
- core::operations::decrement_request{
236
- std::move(id),
237
- {},
238
- {},
239
- options.expiry,
240
- options.delta,
241
- options.initial_value,
242
- options.durability_level,
243
- options.timeout,
244
- { options.retry_strategy },
245
- },
246
- [handler = std::move(handler)](auto&& resp) mutable {
280
+ std::move(request),
281
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](auto&& resp) mutable {
282
+ obs_rec->finish(resp.ctx.retry_attempts(), resp.ctx.ec());
283
+
247
284
  if (resp.ctx.ec()) {
248
285
  return handler(core::impl::make_error(std::move(resp.ctx)), counter_result{});
249
286
  }
@@ -262,12 +299,17 @@ public:
262
299
  durability_level::none,
263
300
  options.timeout,
264
301
  { options.retry_strategy },
302
+ obs_rec->operation_span(),
265
303
  };
266
304
  return core_.execute(
267
305
  std::move(request),
268
- [core = core_, id = std::move(id), options, handler = std::move(handler)](
269
- auto&& resp) mutable {
306
+ [obs_rec = std::move(obs_rec),
307
+ core = core_,
308
+ id = std::move(id),
309
+ options,
310
+ handler = std::move(handler)](auto&& resp) mutable {
270
311
  if (resp.ctx.ec()) {
312
+ obs_rec->finish(resp.ctx.retry_attempts(), resp.ctx.ec());
271
313
  return handler(core::impl::make_error(std::move(resp.ctx)),
272
314
  counter_result{ resp.cas, std::move(resp.token), resp.content });
273
315
  }
@@ -280,8 +322,10 @@ public:
280
322
  options.timeout,
281
323
  options.persist_to,
282
324
  options.replicate_to,
283
- [resp = std::forward<decltype(resp)>(resp),
325
+ [obs_rec = std::move(obs_rec),
326
+ resp = std::forward<decltype(resp)>(resp),
284
327
  handler = std::move(handler)](std::error_code ec) mutable {
328
+ obs_rec->finish(resp.ctx.retry_attempts(), ec);
285
329
  if (ec) {
286
330
  resp.ctx.override_ec(ec);
287
331
  return handler(core::impl::make_error(std::move(resp.ctx)), counter_result{});
@@ -296,6 +340,9 @@ public:
296
340
  increment_options::built options,
297
341
  increment_handler&& handler) const
298
342
  {
343
+ auto obs_rec = create_observability_recorder(
344
+ core::tracing::operation::mcbp_increment, options.parent_span, options.durability_level);
345
+
299
346
  auto id = core::document_id{
300
347
  bucket_name_,
301
348
  scope_name_,
@@ -303,19 +350,22 @@ public:
303
350
  std::move(document_key),
304
351
  };
305
352
  if (options.persist_to == persist_to::none && options.replicate_to == replicate_to::none) {
353
+ core::operations::increment_request request{
354
+ std::move(id),
355
+ {},
356
+ {},
357
+ options.expiry,
358
+ options.delta,
359
+ options.initial_value,
360
+ options.durability_level,
361
+ options.timeout,
362
+ { options.retry_strategy },
363
+ obs_rec->operation_span(),
364
+ };
306
365
  return core_.execute(
307
- core::operations::increment_request{
308
- std::move(id),
309
- {},
310
- {},
311
- options.expiry,
312
- options.delta,
313
- options.initial_value,
314
- options.durability_level,
315
- options.timeout,
316
- { options.retry_strategy },
317
- },
318
- [handler = std::move(handler)](auto&& resp) mutable {
366
+ std::move(request),
367
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](auto&& resp) mutable {
368
+ obs_rec->finish(resp.ctx.retry_attempts(), resp.ctx.ec());
319
369
  if (resp.ctx.ec()) {
320
370
  return handler(core::impl::make_error(std::move(resp.ctx)), counter_result{});
321
371
  }
@@ -334,12 +384,17 @@ public:
334
384
  durability_level::none,
335
385
  options.timeout,
336
386
  { options.retry_strategy },
387
+ obs_rec->operation_span(),
337
388
  };
338
389
  return core_.execute(
339
390
  std::move(request),
340
- [core = core_, id = std::move(id), options, handler = std::move(handler)](
341
- auto&& resp) mutable {
391
+ [obs_rec = std::move(obs_rec),
392
+ core = core_,
393
+ id = std::move(id),
394
+ options,
395
+ handler = std::move(handler)](auto&& resp) mutable {
342
396
  if (resp.ctx.ec()) {
397
+ obs_rec->finish(resp.ctx.retry_attempts(), resp.ctx.ec());
343
398
  return handler(core::impl::make_error(std::move(resp.ctx)),
344
399
  counter_result{ resp.cas, std::move(resp.token), resp.content });
345
400
  }
@@ -352,8 +407,10 @@ public:
352
407
  options.timeout,
353
408
  options.persist_to,
354
409
  options.replicate_to,
355
- [resp = std::forward<decltype(resp)>(resp),
410
+ [obs_rec = std::move(obs_rec),
411
+ resp = std::forward<decltype(resp)>(resp),
356
412
  handler = std::move(handler)](std::error_code ec) mutable {
413
+ obs_rec->finish(resp.ctx.retry_attempts(), ec);
357
414
  if (ec) {
358
415
  resp.ctx.override_ec(ec);
359
416
  return handler(core::impl::make_error(std::move(resp.ctx)), counter_result{});
@@ -365,6 +422,25 @@ public:
365
422
  }
366
423
 
367
424
  private:
425
+ auto create_observability_recorder(const std::string& operation_name,
426
+ const std::shared_ptr<tracing::request_span>& parent_span,
427
+ const std::optional<durability_level> durability = {}) const
428
+ -> std::unique_ptr<core::impl::observability_recorder>
429
+ {
430
+ auto rec = core::impl::observability_recorder::create(
431
+ operation_name, parent_span, core_.tracer(), core_.meter());
432
+
433
+ rec->with_service(core::tracing::service::key_value);
434
+ rec->with_bucket_name(bucket_name_);
435
+ rec->with_scope_name(scope_name_);
436
+ rec->with_collection_name(name_);
437
+ if (durability.has_value()) {
438
+ rec->with_durability(durability.value());
439
+ }
440
+
441
+ return rec;
442
+ }
443
+
368
444
  core::cluster core_;
369
445
  std::string bucket_name_;
370
446
  std::string scope_name_;
@@ -19,6 +19,7 @@
19
19
 
20
20
  #include "core/cluster.hxx"
21
21
  #include "core/impl/error.hxx"
22
+ #include "core/impl/observability_recorder.hxx"
22
23
  #include "core/management/bucket_settings.hxx"
23
24
  #include "core/operations/management/bucket_create.hxx"
24
25
  #include "core/operations/management/bucket_drop.hxx"
@@ -26,6 +27,8 @@
26
27
  #include "core/operations/management/bucket_get.hxx"
27
28
  #include "core/operations/management/bucket_get_all.hxx"
28
29
  #include "core/operations/management/bucket_update.hxx"
30
+ #include "core/tracing/constants.hxx"
31
+ #include "core/tracing/tracer_wrapper.hxx"
29
32
 
30
33
  #include <couchbase/create_bucket_options.hxx>
31
34
  #include <couchbase/drop_bucket_options.hxx>
@@ -265,13 +268,18 @@ public:
265
268
  const get_bucket_options::built& options,
266
269
  get_bucket_handler&& handler) const
267
270
  {
271
+ auto obs_rec = create_observability_recorder(
272
+ core::tracing::operation::mgr_buckets_get_bucket, bucket_name, options.parent_span);
273
+ core::operations::management::bucket_get_request request{
274
+ std::move(bucket_name),
275
+ {},
276
+ options.timeout,
277
+ obs_rec->operation_span(),
278
+ };
268
279
  core_.execute(
269
- core::operations::management::bucket_get_request{
270
- std::move(bucket_name),
271
- {},
272
- options.timeout,
273
- },
274
- [handler = std::move(handler)](const auto& resp) mutable {
280
+ std::move(request),
281
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
282
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
275
283
  return handler(core::impl::make_error(resp.ctx), map_bucket_settings(resp.bucket));
276
284
  });
277
285
  }
@@ -279,12 +287,17 @@ public:
279
287
  void get_all_buckets(const get_all_buckets_options::built& options,
280
288
  get_all_buckets_handler&& handler) const
281
289
  {
290
+ auto obs_rec = create_observability_recorder(
291
+ core::tracing::operation::mgr_buckets_get_all_buckets, std::nullopt, options.parent_span);
292
+ core::operations::management::bucket_get_all_request request{
293
+ {},
294
+ options.timeout,
295
+ obs_rec->operation_span(),
296
+ };
282
297
  core_.execute(
283
- core::operations::management::bucket_get_all_request{
284
- {},
285
- options.timeout,
286
- },
287
- [handler = std::move(handler)](const auto& resp) mutable {
298
+ std::move(request),
299
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
300
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
288
301
  return handler(core::impl::make_error(resp.ctx), map_all_bucket_settings(resp.buckets));
289
302
  });
290
303
  }
@@ -293,13 +306,20 @@ public:
293
306
  const create_bucket_options::built& options,
294
307
  create_bucket_handler&& handler) const
295
308
  {
309
+ auto obs_rec =
310
+ create_observability_recorder(core::tracing::operation::mgr_buckets_create_bucket,
311
+ bucket_settings.name,
312
+ options.parent_span);
313
+ core::operations::management::bucket_create_request request{
314
+ map_bucket_settings(bucket_settings),
315
+ {},
316
+ options.timeout,
317
+ obs_rec->operation_span(),
318
+ };
296
319
  core_.execute(
297
- core::operations::management::bucket_create_request{
298
- map_bucket_settings(bucket_settings),
299
- {},
300
- options.timeout,
301
- },
302
- [handler = std::move(handler)](const auto& resp) mutable {
320
+ std::move(request),
321
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
322
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
303
323
  return handler(core::impl::make_error(resp.ctx));
304
324
  });
305
325
  }
@@ -308,13 +328,20 @@ public:
308
328
  const update_bucket_options::built& options,
309
329
  update_bucket_handler&& handler) const
310
330
  {
331
+ auto obs_rec =
332
+ create_observability_recorder(core::tracing::operation::mgr_buckets_update_bucket,
333
+ bucket_settings.name,
334
+ options.parent_span);
335
+ core::operations::management::bucket_update_request request{
336
+ map_bucket_settings(bucket_settings),
337
+ {},
338
+ options.timeout,
339
+ obs_rec->operation_span(),
340
+ };
311
341
  core_.execute(
312
- core::operations::management::bucket_update_request{
313
- map_bucket_settings(bucket_settings),
314
- {},
315
- options.timeout,
316
- },
317
- [handler = std::move(handler)](const auto& resp) mutable {
342
+ std::move(request),
343
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
344
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
318
345
  return handler(core::impl::make_error(resp.ctx));
319
346
  });
320
347
  }
@@ -323,13 +350,18 @@ public:
323
350
  const drop_bucket_options::built& options,
324
351
  drop_bucket_handler&& handler) const
325
352
  {
353
+ auto obs_rec = create_observability_recorder(
354
+ core::tracing::operation::mgr_buckets_drop_bucket, bucket_name, options.parent_span);
355
+ core::operations::management::bucket_drop_request request{
356
+ std::move(bucket_name),
357
+ {},
358
+ options.timeout,
359
+ obs_rec->operation_span(),
360
+ };
326
361
  core_.execute(
327
- core::operations::management::bucket_drop_request{
328
- std::move(bucket_name),
329
- {},
330
- options.timeout,
331
- },
332
- [handler = std::move(handler)](const auto& resp) mutable {
362
+ std::move(request),
363
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
364
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
333
365
  return handler(core::impl::make_error(resp.ctx));
334
366
  });
335
367
  }
@@ -338,18 +370,38 @@ public:
338
370
  const flush_bucket_options::built& options,
339
371
  flush_bucket_handler&& handler) const
340
372
  {
373
+ auto obs_rec = create_observability_recorder(
374
+ core::tracing::operation::mgr_buckets_flush_bucket, bucket_name, options.parent_span);
375
+ core::operations::management::bucket_flush_request request{
376
+ std::move(bucket_name),
377
+ {},
378
+ options.timeout,
379
+ obs_rec->operation_span(),
380
+ };
341
381
  core_.execute(
342
- core::operations::management::bucket_flush_request{
343
- std::move(bucket_name),
344
- {},
345
- options.timeout,
346
- },
347
- [handler = std::move(handler)](const auto& resp) mutable {
382
+ std::move(request),
383
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
384
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
348
385
  return handler(core::impl::make_error(resp.ctx));
349
386
  });
350
387
  }
351
388
 
352
389
  private:
390
+ [[nodiscard]] auto create_observability_recorder(
391
+ const std::string& operation_name,
392
+ const std::optional<std::string>& bucket_name,
393
+ const std::shared_ptr<tracing::request_span>& parent_span) const
394
+ -> std::unique_ptr<core::impl::observability_recorder>
395
+ {
396
+ auto rec = core::impl::observability_recorder::create(
397
+ operation_name, parent_span, core_.tracer(), core_.meter());
398
+ rec->with_service(core::tracing::service::management);
399
+ if (bucket_name.has_value()) {
400
+ rec->with_bucket_name(bucket_name.value());
401
+ }
402
+ return rec;
403
+ }
404
+
353
405
  core::cluster core_;
354
406
  };
355
407