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
@@ -18,6 +18,7 @@
18
18
  #include "core/cluster.hxx"
19
19
 
20
20
  #include "core/impl/error.hxx"
21
+ #include "core/impl/observability_recorder.hxx"
21
22
  #include "core/operations/management/collection_create.hxx"
22
23
  #include "core/operations/management/collection_drop.hxx"
23
24
  #include "core/operations/management/collection_update.hxx"
@@ -25,6 +26,8 @@
25
26
  #include "core/operations/management/scope_drop.hxx"
26
27
  #include "core/operations/management/scope_get_all.hxx"
27
28
  #include "core/topology/collections_manifest.hxx"
29
+ #include "core/tracing/constants.hxx"
30
+ #include "core/tracing/tracer_wrapper.hxx"
28
31
 
29
32
  #include <couchbase/collection_manager.hxx>
30
33
  #include <couchbase/create_collection_options.hxx>
@@ -93,15 +96,19 @@ public:
93
96
  const couchbase::drop_collection_options::built& options,
94
97
  couchbase::drop_collection_handler&& handler) const
95
98
  {
99
+ auto obs_rec =
100
+ create_observability_recorder(core::tracing::operation::mgr_collections_drop_collection,
101
+ scope_name,
102
+ collection_name,
103
+ options.parent_span);
104
+ core::operations::management::collection_drop_request request{
105
+ bucket_name_, std::move(scope_name), std::move(collection_name),
106
+ {}, options.timeout, obs_rec->operation_span(),
107
+ };
96
108
  return core_.execute(
97
- core::operations::management::collection_drop_request{
98
- bucket_name_,
99
- std::move(scope_name),
100
- std::move(collection_name),
101
- {},
102
- options.timeout,
103
- },
104
- [handler = std::move(handler)](const auto& resp) mutable {
109
+ std::move(request),
110
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
111
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
105
112
  return handler(core::impl::make_error(resp.ctx));
106
113
  });
107
114
  }
@@ -112,17 +119,20 @@ public:
112
119
  const couchbase::update_collection_options::built& options,
113
120
  couchbase::update_collection_handler&& handler) const
114
121
  {
122
+ auto obs_rec =
123
+ create_observability_recorder(core::tracing::operation::mgr_collections_update_collection,
124
+ scope_name,
125
+ collection_name,
126
+ options.parent_span);
127
+ core::operations::management::collection_update_request request{
128
+ bucket_name_, std::move(scope_name), std::move(collection_name),
129
+ settings.max_expiry, settings.history, {},
130
+ options.timeout, obs_rec->operation_span(),
131
+ };
115
132
  return core_.execute(
116
- core::operations::management::collection_update_request{
117
- bucket_name_,
118
- std::move(scope_name),
119
- std::move(collection_name),
120
- settings.max_expiry,
121
- settings.history,
122
- {},
123
- options.timeout,
124
- },
125
- [handler = std::move(handler)](const auto& resp) mutable {
133
+ std::move(request),
134
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
135
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
126
136
  return handler(core::impl::make_error(resp.ctx));
127
137
  });
128
138
  }
@@ -133,17 +143,20 @@ public:
133
143
  const couchbase::create_collection_options::built& options,
134
144
  couchbase::update_collection_handler&& handler) const
135
145
  {
146
+ auto obs_rec =
147
+ create_observability_recorder(core::tracing::operation::mgr_collections_create_collection,
148
+ scope_name,
149
+ collection_name,
150
+ options.parent_span);
151
+ core::operations::management::collection_create_request request{
152
+ bucket_name_, std::move(scope_name), std::move(collection_name),
153
+ settings.max_expiry, settings.history, {},
154
+ options.timeout, obs_rec->operation_span(),
155
+ };
136
156
  return core_.execute(
137
- core::operations::management::collection_create_request{
138
- bucket_name_,
139
- std::move(scope_name),
140
- std::move(collection_name),
141
- settings.max_expiry,
142
- settings.history,
143
- {},
144
- options.timeout,
145
- },
146
- [handler = std::move(handler)](const auto& resp) mutable {
157
+ std::move(request),
158
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
159
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
147
160
  return handler(core::impl::make_error(resp.ctx));
148
161
  });
149
162
  }
@@ -151,13 +164,18 @@ public:
151
164
  void get_all_scopes(const get_all_scopes_options::built& options,
152
165
  get_all_scopes_handler&& handler) const
153
166
  {
167
+ auto obs_rec = create_observability_recorder(
168
+ core::tracing::operation::mgr_collections_get_all_scopes, {}, {}, options.parent_span);
169
+ core::operations::management::scope_get_all_request request{
170
+ bucket_name_,
171
+ {},
172
+ options.timeout,
173
+ obs_rec->operation_span(),
174
+ };
154
175
  return core_.execute(
155
- core::operations::management::scope_get_all_request{
156
- bucket_name_,
157
- {},
158
- options.timeout,
159
- },
160
- [handler = std::move(handler)](auto resp) mutable {
176
+ std::move(request),
177
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](auto resp) mutable {
178
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
161
179
  return handler(core::impl::make_error(resp.ctx), map_scope_specs(resp.manifest));
162
180
  });
163
181
  }
@@ -166,14 +184,15 @@ public:
166
184
  const couchbase::create_scope_options::built& options,
167
185
  couchbase::create_scope_handler&& handler) const
168
186
  {
187
+ auto obs_rec = create_observability_recorder(
188
+ core::tracing::operation::mgr_collections_create_scope, scope_name, {}, options.parent_span);
189
+ core::operations::management::scope_create_request request{
190
+ bucket_name_, std::move(scope_name), {}, options.timeout, obs_rec->operation_span(),
191
+ };
169
192
  return core_.execute(
170
- core::operations::management::scope_create_request{
171
- bucket_name_,
172
- std::move(scope_name),
173
- {},
174
- options.timeout,
175
- },
176
- [handler = std::move(handler)](const auto& resp) mutable {
193
+ std::move(request),
194
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
195
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
177
196
  return handler(core::impl::make_error(resp.ctx));
178
197
  });
179
198
  }
@@ -182,19 +201,40 @@ public:
182
201
  const couchbase::drop_scope_options::built& options,
183
202
  couchbase::drop_scope_handler&& handler) const
184
203
  {
185
- core_.execute(
186
- core::operations::management::scope_drop_request{
187
- bucket_name_,
188
- std::move(scope_name),
189
- {},
190
- options.timeout,
191
- },
192
- [handler = std::move(handler)](const auto& resp) mutable {
204
+ auto obs_rec = create_observability_recorder(
205
+ core::tracing::operation::mgr_collections_drop_scope, scope_name, {}, options.parent_span);
206
+ core::operations::management::scope_drop_request request{
207
+ bucket_name_, std::move(scope_name), {}, options.timeout, obs_rec->operation_span(),
208
+ };
209
+ return core_.execute(
210
+ std::move(request),
211
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
212
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
193
213
  return handler(core::impl::make_error(resp.ctx));
194
214
  });
195
215
  }
196
216
 
197
217
  private:
218
+ [[nodiscard]] auto create_observability_recorder(
219
+ const std::string& operation_name,
220
+ const std::optional<std::string>& scope_name,
221
+ const std::optional<std::string>& collection_name,
222
+ const std::shared_ptr<tracing::request_span>& parent_span) const
223
+ -> std::unique_ptr<core::impl::observability_recorder>
224
+ {
225
+ auto obs_rec = core::impl::observability_recorder::create(
226
+ operation_name, parent_span, core_.tracer(), core_.meter());
227
+ obs_rec->with_service(core::tracing::service::management);
228
+ obs_rec->with_bucket_name(bucket_name_);
229
+ if (scope_name.has_value()) {
230
+ obs_rec->with_scope_name(scope_name.value());
231
+ }
232
+ if (collection_name.has_value()) {
233
+ obs_rec->with_collection_name(collection_name.value());
234
+ }
235
+ return obs_rec;
236
+ }
237
+
198
238
  core::cluster core_;
199
239
  std::string bucket_name_;
200
240
  };
@@ -78,9 +78,9 @@ dns_srv_tracker::get_srv_nodes(
78
78
  self->address_,
79
79
  resp.ec.message());
80
80
  } else if (resp.targets.empty() && self->address_ != "localhost") {
81
- CB_LOG_WARNING("DNS SRV query returned 0 records for \"{}\", assuming "
82
- "that cluster is listening this address",
83
- self->address_);
81
+ CB_LOG_DEBUG("DNS SRV query returned 0 records for \"{}\", assuming "
82
+ "that cluster is listening this address",
83
+ self->address_);
84
84
  } else {
85
85
  nodes.reserve(resp.targets.size());
86
86
  for (const auto& address : resp.targets) {
@@ -136,7 +136,7 @@ dns_srv_tracker::report_bootstrap_error(const std::string& endpoint, std::error_
136
136
  {
137
137
  bool trigger_dns_srv_refresh = false;
138
138
 
139
- if (ec && ec != errc::common::request_canceled) {
139
+ if (ec && ec != errc::common::request_canceled && ec != errc::common::bucket_not_found) {
140
140
  const std::scoped_lock lock(known_endpoints_mutex_);
141
141
  known_endpoints_.erase(endpoint);
142
142
  if (known_endpoints_.empty()) {
@@ -17,6 +17,7 @@
17
17
 
18
18
  #include "error.hxx"
19
19
 
20
+ #include "core/error.hxx"
20
21
  #include "core/error_context/analytics.hxx"
21
22
  #include "core/error_context/analytics_json.hxx"
22
23
  #include "core/error_context/http.hxx"
@@ -116,7 +117,7 @@ error::operator==(const couchbase::error& other) const -> bool
116
117
  namespace core::impl
117
118
  {
118
119
  auto
119
- make_error(const core::error_context::query& core_ctx) -> error
120
+ make_error(const core::error_context::query& core_ctx) -> couchbase::error
120
121
  {
121
122
  if (!core_ctx.ec) {
122
123
  return {};
@@ -125,7 +126,7 @@ make_error(const core::error_context::query& core_ctx) -> error
125
126
  }
126
127
 
127
128
  auto
128
- make_error(const query_error_context& core_ctx) -> error
129
+ make_error(const query_error_context& core_ctx) -> couchbase::error
129
130
  {
130
131
  if (!core_ctx.ec()) {
131
132
  return {};
@@ -134,7 +135,7 @@ make_error(const query_error_context& core_ctx) -> error
134
135
  }
135
136
 
136
137
  auto
137
- make_error(const core::error_context::search& core_ctx) -> error
138
+ make_error(const core::error_context::search& core_ctx) -> couchbase::error
138
139
  {
139
140
  if (!core_ctx.ec) {
140
141
  return {};
@@ -143,7 +144,7 @@ make_error(const core::error_context::search& core_ctx) -> error
143
144
  }
144
145
 
145
146
  auto
146
- make_error(const core::error_context::analytics& core_ctx) -> error
147
+ make_error(const core::error_context::analytics& core_ctx) -> couchbase::error
147
148
  {
148
149
  if (!core_ctx.ec) {
149
150
  return {};
@@ -152,7 +153,7 @@ make_error(const core::error_context::analytics& core_ctx) -> error
152
153
  }
153
154
 
154
155
  auto
155
- make_error(const core::error_context::http& core_ctx) -> error
156
+ make_error(const core::error_context::http& core_ctx) -> couchbase::error
156
157
  {
157
158
  if (!core_ctx.ec) {
158
159
  return {};
@@ -161,7 +162,7 @@ make_error(const core::error_context::http& core_ctx) -> error
161
162
  }
162
163
 
163
164
  auto
164
- make_error(const couchbase::core::key_value_error_context& core_ctx) -> error
165
+ make_error(const couchbase::core::key_value_error_context& core_ctx) -> couchbase::error
165
166
  {
166
167
  if (!core_ctx.ec()) {
167
168
  return {};
@@ -170,7 +171,7 @@ make_error(const couchbase::core::key_value_error_context& core_ctx) -> error
170
171
  }
171
172
 
172
173
  auto
173
- make_error(const couchbase::core::subdocument_error_context& core_ctx) -> error
174
+ make_error(const couchbase::core::subdocument_error_context& core_ctx) -> couchbase::error
174
175
  {
175
176
  if (!core_ctx.ec()) {
176
177
  return {};
@@ -179,15 +180,15 @@ make_error(const couchbase::core::subdocument_error_context& core_ctx) -> error
179
180
  }
180
181
 
181
182
  auto
182
- make_error(const couchbase::core::transaction_error_context& ctx) -> error
183
+ make_error(const couchbase::core::transaction_error_context& ctx) -> couchbase::error
183
184
  {
184
185
  return { ctx.ec(), {}, {}, { ctx.cause() } };
185
186
  }
186
187
 
187
188
  auto
188
- make_error(const core::transactions::op_exception& exc) -> error
189
+ make_error(const core::transactions::op_exception& exc) -> couchbase::error
189
190
  {
190
- std::optional<error> cause;
191
+ std::optional<couchbase::error> cause;
191
192
  if (std::holds_alternative<key_value_error_context>(exc.ctx().cause())) {
192
193
  cause = make_error(std::get<key_value_error_context>(exc.ctx().cause()));
193
194
  }
@@ -196,7 +197,7 @@ make_error(const core::transactions::op_exception& exc) -> error
196
197
  }
197
198
 
198
199
  if (cause.has_value()) {
199
- return error{
200
+ return couchbase::error{
200
201
  transaction_op_errc_from_external_exception(exc.cause()),
201
202
  exc.what(),
202
203
  {},
@@ -204,7 +205,7 @@ make_error(const core::transactions::op_exception& exc) -> error
204
205
  };
205
206
  }
206
207
 
207
- return error{
208
+ return couchbase::error{
208
209
  transaction_op_errc_from_external_exception(exc.cause()),
209
210
  exc.what(),
210
211
  {},
@@ -218,7 +219,13 @@ make_error(const couchbase::core::transactions::transaction_operation_failed& co
218
219
  return { couchbase::errc::transaction_op::transaction_op_failed,
219
220
  core_tof.what(),
220
221
  internal_error_context::build_error_context(tao::json::empty_object, core_tof),
221
- error(transaction_op_errc_from_external_exception(core_tof.cause())) };
222
+ couchbase::error(transaction_op_errc_from_external_exception(core_tof.cause())) };
223
+ }
224
+
225
+ auto
226
+ make_error(const core::error& err) -> couchbase::error
227
+ {
228
+ return { err.ec, err.message };
222
229
  }
223
230
  } // namespace core::impl
224
231
  } // namespace couchbase
@@ -17,6 +17,7 @@
17
17
 
18
18
  #pragma once
19
19
 
20
+ #include "core/error.hxx"
20
21
  #include "core/error_context/key_value_error_context.hxx"
21
22
  #include "core/error_context/query_error_context.hxx"
22
23
  #include "core/error_context/subdocument_error_context.hxx"
@@ -33,32 +34,36 @@
33
34
  namespace couchbase::core::impl
34
35
  {
35
36
  auto
36
- make_error(const core::error_context::query& core_ctx) -> error;
37
+ make_error(const core::error_context::query& core_ctx) -> couchbase::error;
37
38
 
38
39
  auto
39
- make_error(const core::error_context::search& core_ctx) -> error;
40
+ make_error(const core::error_context::search& core_ctx) -> couchbase::error;
40
41
 
41
42
  auto
42
- make_error(const core::error_context::analytics& core_ctx) -> error;
43
+ make_error(const core::error_context::analytics& core_ctx) -> couchbase::error;
43
44
 
44
45
  auto
45
- make_error(const core::error_context::http& core_ctx) -> error;
46
+ make_error(const core::error_context::http& core_ctx) -> couchbase::error;
46
47
 
47
48
  auto
48
- make_error(const couchbase::core::key_value_error_context& core_ctx) -> error;
49
+ make_error(const couchbase::core::key_value_error_context& core_ctx) -> couchbase::error;
49
50
 
50
51
  auto
51
- make_error(const couchbase::core::subdocument_error_context& core_ctx) -> error;
52
+ make_error(const couchbase::core::subdocument_error_context& core_ctx) -> couchbase::error;
52
53
 
53
54
  auto
54
- make_error(const couchbase::core::query_error_context& core_ctx) -> error;
55
+ make_error(const couchbase::core::query_error_context& core_ctx) -> couchbase::error;
55
56
 
56
57
  auto
57
- make_error(const couchbase::core::transaction_error_context& core_ctx) -> error;
58
+ make_error(const couchbase::core::transaction_error_context& core_ctx) -> couchbase::error;
58
59
 
59
60
  auto
60
- make_error(const couchbase::core::transactions::op_exception& exc) -> error;
61
+ make_error(const couchbase::core::transactions::op_exception& exc) -> couchbase::error;
61
62
 
62
63
  auto
63
- make_error(const couchbase::core::transactions::transaction_operation_failed& core_tof) -> error;
64
+ make_error(const couchbase::core::transactions::transaction_operation_failed& core_tof)
65
+ -> couchbase::error;
66
+
67
+ auto
68
+ make_error(const core::error& err) -> couchbase::error;
64
69
  } // namespace couchbase::core::impl
@@ -70,7 +70,7 @@ private:
70
70
  };
71
71
 
72
72
  using movable_get_all_replicas_handler =
73
- utils::movable_function<void(error, get_all_replicas_result)>;
73
+ utils::movable_function<void(couchbase::error, get_all_replicas_result)>;
74
74
 
75
75
  void
76
76
  initiate_get_all_replicas_operation(std::shared_ptr<cluster> core,
@@ -65,7 +65,8 @@ private:
65
65
  std::optional<std::chrono::milliseconds> timeout_{};
66
66
  };
67
67
 
68
- using movable_get_any_replica_handler = utils::movable_function<void(error, get_replica_result)>;
68
+ using movable_get_any_replica_handler =
69
+ utils::movable_function<void(couchbase::error, get_replica_result)>;
69
70
 
70
71
  void
71
72
  initiate_get_any_replica_operation(std::shared_ptr<cluster> core,
@@ -23,6 +23,7 @@
23
23
  #include "core/io/retry_context.hxx"
24
24
  #include "core/protocol/client_request.hxx"
25
25
  #include "core/protocol/cmd_get_replica.hxx"
26
+ #include "core/public_fwd.hxx"
26
27
  #include "core/timeout_defaults.hxx"
27
28
 
28
29
  namespace couchbase::core::impl
@@ -48,6 +49,7 @@ struct get_replica_request {
48
49
  std::uint16_t partition{};
49
50
  std::uint32_t opaque{};
50
51
  io::retry_context<true> retries{};
52
+ std::shared_ptr<couchbase::tracing::request_span> parent_span{ nullptr };
51
53
 
52
54
  [[nodiscard]] auto encode_to(encoded_request_type& encoded,
53
55
  core::mcbp_context&& context) const -> std::error_code;
@@ -18,6 +18,7 @@
18
18
  #pragma once
19
19
 
20
20
  #include "core/error_context/key_value.hxx"
21
+ #include "core/error_context/subdocument_error_context.hxx"
21
22
  #include "core/impl/subdoc/command.hxx"
22
23
  #include "core/io/mcbp_context.hxx"
23
24
  #include "core/io/retry_context.hxx"
@@ -26,7 +27,6 @@
26
27
  #include "core/public_fwd.hxx"
27
28
  #include "core/timeout_defaults.hxx"
28
29
 
29
- #include "core/error_context/subdocument_error_context.hxx"
30
30
  #include <couchbase/lookup_in_result.hxx>
31
31
 
32
32
  namespace couchbase::core::impl
@@ -0,0 +1,161 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 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
+
18
+ #include "observability_recorder.hxx"
19
+ #include "core/tracing/attribute_helpers.hxx"
20
+
21
+ namespace couchbase::core::impl
22
+ {
23
+ auto
24
+ observability_recorder::create(std::string op_name,
25
+ std::shared_ptr<couchbase::tracing::request_span> parent_span,
26
+ std::weak_ptr<tracing::tracer_wrapper> tracer,
27
+ std::weak_ptr<metrics::meter_wrapper> meter)
28
+ -> std::unique_ptr<observability_recorder>
29
+ {
30
+ auto rec = std::make_unique<observability_recorder>(
31
+ std::move(op_name), std::move(parent_span), std::move(tracer), std::move(meter));
32
+ if (rec->span_->uses_tags()) {
33
+ rec->span_->add_tag(tracing::attributes::op::operation_name, rec->op_name_);
34
+ }
35
+ rec->metric_attributes_.operation = rec->op_name_;
36
+ return rec;
37
+ }
38
+
39
+ auto
40
+ observability_recorder::operation_span() -> const std::shared_ptr<couchbase::tracing::request_span>&
41
+ {
42
+ return span_;
43
+ }
44
+
45
+ void
46
+ observability_recorder::finish(const std::error_code ec)
47
+ {
48
+ metric_attributes_.ec = ec;
49
+ meter_.lock()->record_value(std::move(metric_attributes_), start_time_);
50
+ span_->end();
51
+ }
52
+
53
+ void
54
+ observability_recorder::finish(const std::size_t retry_attempts, const std::error_code ec)
55
+ {
56
+ if (span_->uses_tags()) {
57
+ span_->add_tag(tracing::attributes::op::retry_count, retry_attempts);
58
+ }
59
+ finish(ec);
60
+ }
61
+
62
+ auto
63
+ observability_recorder::create_request_encoding_span() const
64
+ -> std::shared_ptr<couchbase::tracing::request_span>
65
+ {
66
+ return tracer_.lock()->create_span(tracing::operation::step_request_encoding, span_);
67
+ }
68
+
69
+ auto
70
+ observability_recorder::record_suboperation(std::string subop_name) const
71
+ -> std::unique_ptr<observability_recorder>
72
+ {
73
+ return create(std::move(subop_name), span_, tracer_, meter_);
74
+ }
75
+
76
+ void
77
+ observability_recorder::with_service(const std::string& service)
78
+ {
79
+ metric_attributes_.service = service;
80
+ if (span_->uses_tags()) {
81
+ span_->add_tag(tracing::attributes::op::service, service);
82
+ }
83
+ }
84
+
85
+ void
86
+ observability_recorder::with_collection_name(const std::string& collection_name)
87
+
88
+ {
89
+ metric_attributes_.collection_name = collection_name;
90
+ if (span_->uses_tags()) {
91
+ span_->add_tag(tracing::attributes::op::collection_name, collection_name);
92
+ }
93
+ }
94
+
95
+ void
96
+ observability_recorder::with_scope_name(const std::string& scope_name)
97
+ {
98
+ metric_attributes_.scope_name = scope_name;
99
+ if (span_->uses_tags()) {
100
+ span_->add_tag(tracing::attributes::op::scope_name, scope_name);
101
+ }
102
+ }
103
+
104
+ void
105
+ observability_recorder::with_bucket_name(const std::string& bucket_name)
106
+ {
107
+ metric_attributes_.bucket_name = bucket_name;
108
+ if (span_->uses_tags()) {
109
+ span_->add_tag(tracing::attributes::op::bucket_name, bucket_name);
110
+ }
111
+ }
112
+
113
+ void
114
+ observability_recorder::with_durability(const couchbase::durability_level durability)
115
+
116
+ {
117
+ if (span_->uses_tags()) {
118
+ tracing::set_durability_level_attribute(span_, durability);
119
+ }
120
+ }
121
+
122
+ void
123
+ observability_recorder::with_query_statement(const std::string& statement,
124
+ const query_options::built& query_options)
125
+
126
+ {
127
+ if (query_options.positional_parameters.empty() && query_options.named_parameters.empty()) {
128
+ return;
129
+ }
130
+ if (span_->uses_tags()) {
131
+ span_->add_tag(tracing::attributes::op::query_statement, statement);
132
+ }
133
+ }
134
+
135
+ void
136
+ observability_recorder::with_query_statement(const std::string& statement,
137
+ const analytics_options::built& analytics_options)
138
+
139
+ {
140
+ if (analytics_options.positional_parameters.empty() &&
141
+ analytics_options.named_parameters.empty()) {
142
+ return;
143
+ }
144
+ if (span_->uses_tags()) {
145
+ span_->add_tag(tracing::attributes::op::query_statement, statement);
146
+ }
147
+ }
148
+
149
+ observability_recorder::observability_recorder(
150
+ std::string op_name,
151
+ std::shared_ptr<couchbase::tracing::request_span> parent_span,
152
+ std::weak_ptr<tracing::tracer_wrapper> tracer,
153
+ std::weak_ptr<metrics::meter_wrapper> meter)
154
+ : op_name_{ std::move(op_name) }
155
+ , tracer_{ std::move(tracer) }
156
+ , meter_{ std::move(meter) }
157
+ , span_{ tracer_.lock()->create_span(op_name_, std::move(parent_span)) }
158
+ , start_time_{ std::chrono::steady_clock::now() }
159
+ {
160
+ }
161
+ } // namespace couchbase::core::impl