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
@@ -198,9 +198,13 @@ module Couchbase
198
198
 
199
199
  # @param [Couchbase::Backend] backend
200
200
  # @param [String] bucket_name
201
- def initialize(backend, bucket_name)
201
+ # @param [Observability::Wrapper] observability wrapper
202
+ #
203
+ # @api private
204
+ def initialize(backend, bucket_name, observability)
202
205
  @backend = backend
203
206
  @bucket_name = bucket_name
207
+ @observability = observability
204
208
  end
205
209
 
206
210
  # Get all scopes
@@ -209,16 +213,18 @@ module Couchbase
209
213
  #
210
214
  # @return [Array<ScopeSpec>]
211
215
  def get_all_scopes(options = Options::Collection::GetAllScopes.new)
212
- res = @backend.scope_get_all(@bucket_name, options.to_backend)
213
- res[:scopes].map do |s|
214
- ScopeSpec.new do |scope|
215
- scope.name = s[:name]
216
- scope.collections = s[:collections].map do |c|
217
- CollectionSpec.new do |collection|
218
- collection.name = c[:name]
219
- collection.scope_name = s[:name]
220
- collection.max_expiry = c[:max_expiry]
221
- collection.history = c[:history]
216
+ @observability.record_operation(Observability::OP_CM_GET_ALL_SCOPES, options.parent_span, self, :management) do |obs_handler|
217
+ res = @backend.scope_get_all(@bucket_name, options.to_backend, obs_handler)
218
+ res[:scopes].map do |s|
219
+ ScopeSpec.new do |scope|
220
+ scope.name = s[:name]
221
+ scope.collections = s[:collections].map do |c|
222
+ CollectionSpec.new do |collection|
223
+ collection.name = c[:name]
224
+ collection.scope_name = s[:name]
225
+ collection.max_expiry = c[:max_expiry]
226
+ collection.history = c[:history]
227
+ end
222
228
  end
223
229
  end
224
230
  end
@@ -236,8 +242,12 @@ module Couchbase
236
242
  #
237
243
  # @raise [Error::ScopeNotFound]
238
244
  def get_scope(scope_name, options = GetScopeOptions.new)
239
- get_all_scopes(Options::Collection::GetAllScopes(timeout: options.timeout))
240
- .find { |scope| scope.name == scope_name } or raise Error::ScopeNotFound, "unable to find scope #{scope_name}"
245
+ @observability.record_operation(Observability::OP_CM_GET_SCOPE, options.parent_span, self, :management) do |obs_handler|
246
+ obs_handler.add_scope_name(scope_name)
247
+
248
+ get_all_scopes(Options::Collection::GetAllScopes(timeout: options.timeout, parent_span: obs_handler.op_span))
249
+ .find { |scope| scope.name == scope_name } or raise Error::ScopeNotFound, "unable to find scope #{scope_name}"
250
+ end
241
251
  end
242
252
 
243
253
  deprecate :get_scope, :get_all_scopes, 2021, 6
@@ -251,7 +261,11 @@ module Couchbase
251
261
  #
252
262
  # @raise [ArgumentError]
253
263
  def create_scope(scope_name, options = Options::Collection::CreateScope.new)
254
- @backend.scope_create(@bucket_name, scope_name, options.to_backend)
264
+ @observability.record_operation(Observability::OP_CM_CREATE_SCOPE, options.parent_span, self, :management) do |obs_handler|
265
+ obs_handler.add_scope_name(scope_name)
266
+
267
+ @backend.scope_create(@bucket_name, scope_name, options.to_backend, obs_handler)
268
+ end
255
269
  end
256
270
 
257
271
  # Removes a scope
@@ -263,7 +277,11 @@ module Couchbase
263
277
  #
264
278
  # @raise [Error::ScopeNotFound]
265
279
  def drop_scope(scope_name, options = Options::Collection::DropScope.new)
266
- @backend.scope_drop(@bucket_name, scope_name, options.to_backend)
280
+ @observability.record_operation(Observability::OP_CM_DROP_SCOPE, options.parent_span, self, :management) do |obs_handler|
281
+ obs_handler.add_scope_name(scope_name)
282
+
283
+ @backend.scope_drop(@bucket_name, scope_name, options.to_backend, obs_handler)
284
+ end
267
285
  end
268
286
 
269
287
  # Creates a new collection
@@ -286,21 +304,31 @@ module Couchbase
286
304
  # @raise [Error::CollectionExists]
287
305
  # @raise [Error::ScopeNotFound]
288
306
  def create_collection(*args)
289
- if args[0].is_a?(CollectionSpec)
290
- collection = args[0]
291
- options = args[1] || Options::Collection::CreateCollection::DEFAULT
292
- settings = CreateCollectionSettings.new(max_expiry: collection.max_expiry, history: collection.history)
293
-
294
- warn "Calling create_collection with a CollectionSpec object has been deprecated, supply scope name, " \
295
- "collection name and optionally a CreateCollectionSettings instance"
296
-
297
- @backend.collection_create(@bucket_name, collection.scope_name, collection.name, settings.to_backend, options.to_backend)
298
- else
299
- scope_name = args[0]
300
- collection_name = args[1]
301
- settings = args[2] || CreateCollectionSettings::DEFAULT
302
- options = args[3] || Options::Collection::CreateCollection::DEFAULT
303
- @backend.collection_create(@bucket_name, scope_name, collection_name, settings.to_backend, options.to_backend)
307
+ scope_name, collection_name, settings, options =
308
+ if args[0].is_a?(CollectionSpec)
309
+ warn "Calling create_collection with a CollectionSpec object has been deprecated, supply scope name, " \
310
+ "collection name and optionally a CreateCollectionSettings instance"
311
+ collection = args[0]
312
+ [
313
+ collection.scope_name,
314
+ collection.name,
315
+ CreateCollectionSettings.new(max_expiry: collection.max_expiry, history: collection.history),
316
+ args[1] || Options::Collection::CreateCollection::DEFAULT,
317
+ ]
318
+ else
319
+ [
320
+ args[0],
321
+ args[1],
322
+ args[2] || CreateCollectionSettings::DEFAULT,
323
+ args[3] || Options::Collection::CreateCollection::DEFAULT,
324
+ ]
325
+ end
326
+
327
+ @observability.record_operation(Observability::OP_CM_CREATE_COLLECTION, options.parent_span, self, :management) do |obs_handler|
328
+ obs_handler.add_scope_name(scope_name)
329
+ obs_handler.add_collection_name(collection_name)
330
+
331
+ @backend.collection_create(@bucket_name, scope_name, collection_name, settings.to_backend, options.to_backend, obs_handler)
304
332
  end
305
333
  end
306
334
 
@@ -315,7 +343,12 @@ module Couchbase
315
343
  # @raise [Error::ScopeNotFound]
316
344
  def update_collection(scope_name, collection_name, settings = UpdateCollectionSettings::DEFAULT,
317
345
  options = Options::Collection::UpdateCollection::DEFAULT)
318
- @backend.collection_update(@bucket_name, scope_name, collection_name, settings.to_backend, options.to_backend)
346
+ @observability.record_operation(Observability::OP_CM_UPDATE_COLLECTION, options.parent_span, self, :management) do |obs_handler|
347
+ obs_handler.add_scope_name(scope_name)
348
+ obs_handler.add_collection_name(collection_name)
349
+
350
+ @backend.collection_update(@bucket_name, scope_name, collection_name, settings.to_backend, options.to_backend, obs_handler)
351
+ end
319
352
  end
320
353
 
321
354
  # Removes a collection
@@ -336,18 +369,28 @@ module Couchbase
336
369
  # @raise [Error::CollectionNotFound]
337
370
  # @raise [Error::ScopeNotFound]
338
371
  def drop_collection(*args)
339
- if args[0].is_a?(CollectionSpec)
340
- collection = args[0]
341
- options = args[1] || Options::Collection::CreateCollection::DEFAULT
342
-
343
- warn "Calling drop_collection with a CollectionSpec object has been deprecated, supply scope name and collection name"
344
-
345
- @backend.collection_drop(@bucket_name, collection.scope_name, collection.name, options.to_backend)
346
- else
347
- scope_name = args[0]
348
- collection_name = args[1]
349
- options = args[2] || Options::Collection::CreateCollection::DEFAULT
350
- @backend.collection_drop(@bucket_name, scope_name, collection_name, options.to_backend)
372
+ scope_name, collection_name, options =
373
+ if args[0].is_a?(CollectionSpec)
374
+ warn "Calling drop_collection with a CollectionSpec object has been deprecated, supply scope name and collection name"
375
+ collection = args[0]
376
+ [
377
+ collection.scope_name,
378
+ collection.name,
379
+ args[1] || Options::Collection::CreateCollection::DEFAULT,
380
+ ]
381
+ else
382
+ [
383
+ args[0],
384
+ args[1],
385
+ args[2] || Options::Collection::CreateCollection::DEFAULT,
386
+ ]
387
+ end
388
+
389
+ @observability.record_operation(Observability::OP_CM_DROP_COLLECTION, options.parent_span, self, :management) do |obs_handler|
390
+ obs_handler.add_scope_name(scope_name)
391
+ obs_handler.add_collection_name(collection_name)
392
+
393
+ @backend.collection_drop(@bucket_name, scope_name, collection_name, options.to_backend, obs_handler)
351
394
  end
352
395
  end
353
396
 
@@ -27,11 +27,15 @@ module Couchbase
27
27
  # @param [String] bucket_name name of the bucket
28
28
  # @param [String] scope_name name of the scope
29
29
  # @param [String] collection_name name of the collection
30
- def initialize(backend, bucket_name, scope_name, collection_name)
30
+ # @param [Observability::Wrapper] observability wrapper
31
+ #
32
+ # @api private
33
+ def initialize(backend, bucket_name, scope_name, collection_name, observability)
31
34
  @backend = backend
32
35
  @bucket_name = bucket_name
33
36
  @scope_name = scope_name
34
37
  @collection_name = collection_name
38
+ @observability = observability
35
39
  end
36
40
 
37
41
  # Fetches all indexes from the server
@@ -52,19 +56,21 @@ module Couchbase
52
56
  "Collection name cannot be set in the options when using the Query Index manager at the collection level"
53
57
  end
54
58
 
55
- res = @backend.collection_query_index_get_all(@bucket_name, @scope_name, @collection_name, options.to_backend)
56
- res[:indexes].map do |idx|
57
- QueryIndex.new do |index|
58
- index.name = idx[:name]
59
- index.is_primary = idx[:is_primary]
60
- index.type = idx[:type]
61
- index.state = idx[:state]
62
- index.bucket = idx[:bucket_name]
63
- index.scope = idx[:scope_name]
64
- index.collection = idx[:collection_name]
65
- index.index_key = idx[:index_key]
66
- index.condition = idx[:condition]
67
- index.partition = idx[:partition]
59
+ @observability.record_operation(Observability::OP_QM_GET_ALL_INDEXES, options.parent_span, self, :query) do |obs_handler|
60
+ res = @backend.collection_query_index_get_all(@bucket_name, @scope_name, @collection_name, options.to_backend, obs_handler)
61
+ res[:indexes].map do |idx|
62
+ QueryIndex.new do |index|
63
+ index.name = idx[:name]
64
+ index.is_primary = idx[:is_primary]
65
+ index.type = idx[:type]
66
+ index.state = idx[:state]
67
+ index.bucket = idx[:bucket_name]
68
+ index.scope = idx[:scope_name]
69
+ index.collection = idx[:collection_name]
70
+ index.index_key = idx[:index_key]
71
+ index.condition = idx[:condition]
72
+ index.partition = idx[:partition]
73
+ end
68
74
  end
69
75
  end
70
76
  end
@@ -90,7 +96,10 @@ module Couchbase
90
96
  "Collection name cannot be set in the options when using the Query Index manager at the collection level"
91
97
  end
92
98
 
93
- @backend.collection_query_index_create(@bucket_name, @scope_name, @collection_name, index_name, fields, options.to_backend)
99
+ @observability.record_operation(Observability::OP_QM_CREATE_INDEX, options.parent_span, self, :query) do |obs_handler|
100
+ @backend.collection_query_index_create(@bucket_name, @scope_name, @collection_name, index_name, fields, options.to_backend,
101
+ obs_handler)
102
+ end
94
103
  end
95
104
 
96
105
  # Creates new primary index
@@ -112,7 +121,9 @@ module Couchbase
112
121
  "Collection name cannot be set in the options when using the Query Index manager at the collection level"
113
122
  end
114
123
 
115
- @backend.collection_query_index_create_primary(@bucket_name, @scope_name, @collection_name, options.to_backend)
124
+ @observability.record_operation(Observability::OP_QM_CREATE_PRIMARY_INDEX, options.parent_span, self, :query) do |obs_handler|
125
+ @backend.collection_query_index_create_primary(@bucket_name, @scope_name, @collection_name, options.to_backend, obs_handler)
126
+ end
116
127
  end
117
128
 
118
129
  # Drops the index
@@ -135,7 +146,9 @@ module Couchbase
135
146
  "Collection name cannot be set in the options when using the Query Index manager at the collection level"
136
147
  end
137
148
 
138
- @backend.collection_query_index_drop(@bucket_name, @scope_name, @collection_name, index_name, options.to_backend)
149
+ @observability.record_operation(Observability::OP_QM_DROP_INDEX, options.parent_span, self, :query) do |obs_handler|
150
+ @backend.collection_query_index_drop(@bucket_name, @scope_name, @collection_name, index_name, options.to_backend, obs_handler)
151
+ end
139
152
  end
140
153
 
141
154
  # Drops the primary index
@@ -157,7 +170,9 @@ module Couchbase
157
170
  "Collection name cannot be set in the options when using the Query Index manager at the collection level"
158
171
  end
159
172
 
160
- @backend.collection_query_index_drop_primary(@bucket_name, @scope_name, @collection_name, options.to_backend)
173
+ @observability.record_operation(Observability::OP_QM_DROP_PRIMARY_INDEX, options.parent_span, self, :query) do |obs_handler|
174
+ @backend.collection_query_index_drop_primary(@bucket_name, @scope_name, @collection_name, options.to_backend, obs_handler)
175
+ end
161
176
  end
162
177
 
163
178
  # Build all indexes which are currently in deferred state
@@ -178,7 +193,9 @@ module Couchbase
178
193
  "Collection name cannot be set in the options when using the Query Index manager at the collection level"
179
194
  end
180
195
 
181
- @backend.collection_query_index_build_deferred(@bucket_name, @scope_name, @collection_name, options.to_backend)
196
+ @observability.record_operation(Observability::OP_QM_BUILD_DEFERRED_INDEXES, options.parent_span, self, :query) do |obs_handler|
197
+ @backend.collection_query_index_build_deferred(@bucket_name, @scope_name, @collection_name, options.to_backend, obs_handler)
198
+ end
182
199
  end
183
200
 
184
201
  # Polls indexes until they are online
@@ -200,24 +217,30 @@ module Couchbase
200
217
  "Collection name cannot be set in the options when using the Query Index manager at the collection level"
201
218
  end
202
219
 
203
- index_names.append("#primary") if options.watch_primary
220
+ @observability.record_operation(Observability::OP_QM_WATCH_INDEXES, options.parent_span, self, :query) do |obs_handler|
221
+ index_names.append("#primary") if options.watch_primary
204
222
 
205
- interval_millis = 50
206
- deadline = Time.now + (Utils::Time.extract_duration(timeout) * 0.001)
207
- while Time.now <= deadline
208
- get_all_opts = Options::Query::GetAllIndexes.new(timeout: ((deadline - Time.now) * 1000).round)
209
- indexes = get_all_indexes(get_all_opts).select { |idx| index_names.include? idx.name }
210
- indexes_not_found = index_names - indexes.map(&:name)
211
- raise Error::IndexNotFound, "Failed to find the indexes: #{indexes_not_found.join(', ')}" unless indexes_not_found.empty?
223
+ interval_millis = 50
224
+ deadline = Time.now + (Utils::Time.extract_duration(timeout) * 0.001)
225
+ all_online = false
226
+ while Time.now <= deadline
227
+ get_all_opts = Options::Query::GetAllIndexes.new(
228
+ timeout: ((deadline - Time.now) * 1000).round,
229
+ parent_span: obs_handler.op_span,
230
+ )
231
+ indexes = get_all_indexes(get_all_opts).select { |idx| index_names.include? idx.name }
232
+ indexes_not_found = index_names - indexes.map(&:name)
233
+ raise Error::IndexNotFound, "Failed to find the indexes: #{indexes_not_found.join(', ')}" unless indexes_not_found.empty?
212
234
 
213
- all_online = indexes.all? { |idx| idx.state == :online }
214
- return if all_online
235
+ all_online = indexes.all? { |idx| idx.state == :online }
236
+ break if all_online
215
237
 
216
- sleep(interval_millis / 1000)
217
- interval_millis += 500
218
- interval_millis = 1000 if interval_millis > 1000
238
+ sleep(interval_millis / 1000)
239
+ interval_millis += 500
240
+ interval_millis = 1000 if interval_millis > 1000
241
+ end
242
+ raise Error::UnambiguousTimeout, "Failed to find all indexes online within the allotted time" unless all_online
219
243
  end
220
- raise Error::UnambiguousTimeout, "Failed to find all indexes online within the allotted time"
221
244
  end
222
245
  end
223
246
  end
@@ -385,8 +385,12 @@ module Couchbase
385
385
  alias inspect to_s
386
386
 
387
387
  # @param [Couchbase::Backend] backend
388
- def initialize(backend)
388
+ # @param [Couchbase::Observability::Wrapper] observability wrapper
389
+ #
390
+ # @api private
391
+ def initialize(backend, observability)
389
392
  @backend = backend
393
+ @observability = observability
390
394
  end
391
395
 
392
396
  # Fetches all indexes from the server
@@ -402,19 +406,25 @@ module Couchbase
402
406
  warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
403
407
  end
404
408
 
405
- res = @backend.query_index_get_all(bucket_name, options.to_backend)
406
- res[:indexes].map do |idx|
407
- QueryIndex.new do |index|
408
- index.name = idx[:name]
409
- index.is_primary = idx[:is_primary]
410
- index.type = idx[:type]
411
- index.state = idx[:state]
412
- index.bucket = idx[:bucket_name]
413
- index.scope = idx[:scope_name]
414
- index.collection = idx[:collection_name]
415
- index.index_key = idx[:index_key]
416
- index.condition = idx[:condition]
417
- index.partition = idx[:partition]
409
+ @observability.record_operation(Observability::OP_QM_GET_ALL_INDEXES, options.parent_span, self, :query) do |obs_handler|
410
+ obs_handler.add_bucket_name(bucket_name)
411
+ obs_handler.add_scope_name(options.scope_name) unless options.scope_name.nil?
412
+ obs_handler.add_collection_name(options.collection_name) unless options.collection_name.nil?
413
+
414
+ res = @backend.query_index_get_all(bucket_name, options.to_backend, obs_handler)
415
+ res[:indexes].map do |idx|
416
+ QueryIndex.new do |index|
417
+ index.name = idx[:name]
418
+ index.is_primary = idx[:is_primary]
419
+ index.type = idx[:type]
420
+ index.state = idx[:state]
421
+ index.bucket = idx[:bucket_name]
422
+ index.scope = idx[:scope_name]
423
+ index.collection = idx[:collection_name]
424
+ index.index_key = idx[:index_key]
425
+ index.condition = idx[:condition]
426
+ index.partition = idx[:partition]
427
+ end
418
428
  end
419
429
  end
420
430
  end
@@ -435,7 +445,13 @@ module Couchbase
435
445
  warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
436
446
  end
437
447
 
438
- @backend.query_index_create(bucket_name, index_name, fields, options.to_backend)
448
+ @observability.record_operation(Observability::OP_QM_CREATE_INDEX, options.parent_span, self, :query) do |obs_handler|
449
+ obs_handler.add_bucket_name(bucket_name)
450
+ obs_handler.add_scope_name(options.scope_name) unless options.scope_name.nil?
451
+ obs_handler.add_collection_name(options.collection_name) unless options.collection_name.nil?
452
+
453
+ @backend.query_index_create(bucket_name, index_name, fields, options.to_backend, obs_handler)
454
+ end
439
455
  end
440
456
 
441
457
  # Creates new primary index
@@ -452,7 +468,13 @@ module Couchbase
452
468
  warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
453
469
  end
454
470
 
455
- @backend.query_index_create_primary(bucket_name, options.to_backend)
471
+ @observability.record_operation(Observability::OP_QM_CREATE_PRIMARY_INDEX, options.parent_span, self, :query) do |obs_handler|
472
+ obs_handler.add_bucket_name(bucket_name)
473
+ obs_handler.add_scope_name(options.scope_name) unless options.scope_name.nil?
474
+ obs_handler.add_collection_name(options.collection_name) unless options.collection_name.nil?
475
+
476
+ @backend.query_index_create_primary(bucket_name, options.to_backend, obs_handler)
477
+ end
456
478
  end
457
479
 
458
480
  # Drops the index
@@ -470,7 +492,13 @@ module Couchbase
470
492
  warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
471
493
  end
472
494
 
473
- @backend.query_index_drop(bucket_name, index_name, options.to_backend)
495
+ @observability.record_operation(Observability::OP_QM_DROP_INDEX, options.parent_span, self, :query) do |obs_handler|
496
+ obs_handler.add_bucket_name(bucket_name)
497
+ obs_handler.add_scope_name(options.scope_name) unless options.scope_name.nil?
498
+ obs_handler.add_collection_name(options.collection_name) unless options.collection_name.nil?
499
+
500
+ @backend.query_index_drop(bucket_name, index_name, options.to_backend, obs_handler)
501
+ end
474
502
  end
475
503
 
476
504
  # Drops the primary index
@@ -487,7 +515,13 @@ module Couchbase
487
515
  warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
488
516
  end
489
517
 
490
- @backend.query_index_drop_primary(bucket_name, options.to_backend)
518
+ @observability.record_operation(Observability::OP_QM_DROP_PRIMARY_INDEX, options.parent_span, self, :query) do |obs_handler|
519
+ obs_handler.add_bucket_name(bucket_name)
520
+ obs_handler.add_scope_name(options.scope_name) unless options.scope_name.nil?
521
+ obs_handler.add_collection_name(options.collection_name) unless options.collection_name.nil?
522
+
523
+ @backend.query_index_drop_primary(bucket_name, options.to_backend, obs_handler)
524
+ end
491
525
  end
492
526
 
493
527
  # Build all indexes which are currently in deferred state
@@ -503,7 +537,13 @@ module Couchbase
503
537
  warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
504
538
  end
505
539
 
506
- @backend.query_index_build_deferred(bucket_name, options.to_backend)
540
+ @observability.record_operation(Observability::OP_QM_BUILD_DEFERRED_INDEXES, options.parent_span, self, :query) do |obs_handler|
541
+ obs_handler.add_bucket_name(bucket_name)
542
+ obs_handler.add_scope_name(options.scope_name) unless options.scope_name.nil?
543
+ obs_handler.add_collection_name(options.collection_name) unless options.collection_name.nil?
544
+
545
+ @backend.query_index_build_deferred(bucket_name, options.to_backend, obs_handler)
546
+ end
507
547
  end
508
548
 
509
549
  # Polls indexes until they are online
@@ -520,24 +560,36 @@ module Couchbase
520
560
  warn "The attributes 'scope_name' and 'collection_name' have been deprecated. Use 'collection.query_indexes' instead"
521
561
  end
522
562
 
523
- index_names.append("#primary") if options.watch_primary
524
-
525
- interval_millis = 50
526
- deadline = Time.now + (Utils::Time.extract_duration(timeout) * 0.001)
527
- while Time.now <= deadline
528
- get_all_opts = Options::Query::GetAllIndexes.new(timeout: ((deadline - Time.now) * 1000).round)
529
- indexes = get_all_indexes(bucket_name, get_all_opts).select { |idx| index_names.include? idx.name }
530
- indexes_not_found = index_names - indexes.map(&:name)
531
- raise Error::IndexNotFound, "Failed to find the indexes: #{indexes_not_found.join(', ')}" unless indexes_not_found.empty?
532
-
533
- all_online = indexes.all? { |idx| idx.state == :online }
534
- return if all_online
535
-
536
- sleep(interval_millis / 1000)
537
- interval_millis += 500
538
- interval_millis = 1000 if interval_millis > 1000
563
+ @observability.record_operation(Observability::OP_QM_WATCH_INDEXES, options.parent_span, self, :query) do |obs_handler|
564
+ obs_handler.add_bucket_name(bucket_name)
565
+ obs_handler.add_scope_name(options.scope_name) unless options.scope_name.nil?
566
+ obs_handler.add_collection_name(options.collection_name) unless options.collection_name.nil?
567
+
568
+ index_names.append("#primary") if options.watch_primary
569
+
570
+ interval_millis = 50
571
+ deadline = Time.now + (Utils::Time.extract_duration(timeout) * 0.001)
572
+ all_online = false
573
+ while Time.now <= deadline
574
+ get_all_opts = Options::Query::GetAllIndexes.new(
575
+ timeout: ((deadline - Time.now) * 1000).round,
576
+ scope_name: options.scope_name,
577
+ collection_name: options.collection_name,
578
+ parent_span: obs_handler.op_span,
579
+ )
580
+ indexes = get_all_indexes(bucket_name, get_all_opts).select { |idx| index_names.include? idx.name }
581
+ indexes_not_found = index_names - indexes.map(&:name)
582
+ raise Error::IndexNotFound, "Failed to find the indexes: #{indexes_not_found.join(', ')}" unless indexes_not_found.empty?
583
+
584
+ all_online = indexes.all? { |idx| idx.state == :online }
585
+ break if all_online
586
+
587
+ sleep(interval_millis / 1000)
588
+ interval_millis += 500
589
+ interval_millis = 1000 if interval_millis > 1000
590
+ end
591
+ raise Error::UnambiguousTimeout, "Failed to find all indexes online within the allotted time" unless all_online
539
592
  end
540
- raise Error::UnambiguousTimeout, "Failed to find all indexes online within the allotted time"
541
593
  end
542
594
 
543
595
  # @api private