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
@@ -23,9 +23,12 @@ module Couchbase
23
23
  alias inspect to_s
24
24
 
25
25
  # @param [Couchbase::Collection] collection parent collection
26
+ #
27
+ # @api private
26
28
  def initialize(collection)
27
29
  @collection = collection
28
30
  @backend = collection.instance_variable_get(:@backend)
31
+ @observability = collection.instance_variable_get(:@observability)
29
32
  end
30
33
 
31
34
  # Appends binary content to the document
@@ -41,11 +44,14 @@ module Couchbase
41
44
  #
42
45
  # @return [Collection::MutationResult]
43
46
  def append(id, content, options = Options::Append::DEFAULT)
44
- resp = @backend.document_append(@collection.bucket_name, @collection.scope_name, @collection.name,
45
- id, content, options.to_backend)
46
- Collection::MutationResult.new do |res|
47
- res.cas = resp[:cas]
48
- res.mutation_token = @collection.send(:extract_mutation_token, resp)
47
+ @observability.record_operation(Observability::OP_APPEND, options.parent_span, self, :kv) do |obs_handler|
48
+ obs_handler.add_durability_level(options.durability_level)
49
+ resp = @backend.document_append(@collection.bucket_name, @collection.scope_name, @collection.name,
50
+ id, content, options.to_backend, obs_handler)
51
+ Collection::MutationResult.new do |res|
52
+ res.cas = resp[:cas]
53
+ res.mutation_token = @collection.send(:extract_mutation_token, resp)
54
+ end
49
55
  end
50
56
  end
51
57
 
@@ -62,11 +68,14 @@ module Couchbase
62
68
  #
63
69
  # @return [Collection::MutationResult]
64
70
  def prepend(id, content, options = Options::Prepend::DEFAULT)
65
- resp = @backend.document_prepend(@collection.bucket_name, @collection.scope_name, @collection.name,
66
- id, content, options.to_backend)
67
- Collection::MutationResult.new do |res|
68
- res.cas = resp[:cas]
69
- res.mutation_token = @collection.send(:extract_mutation_token, resp)
71
+ @observability.record_operation(Observability::OP_PREPEND, options.parent_span, self, :kv) do |obs_handler|
72
+ obs_handler.add_durability_level(options.durability_level)
73
+ resp = @backend.document_prepend(@collection.bucket_name, @collection.scope_name, @collection.name,
74
+ id, content, options.to_backend, obs_handler)
75
+ Collection::MutationResult.new do |res|
76
+ res.cas = resp[:cas]
77
+ res.mutation_token = @collection.send(:extract_mutation_token, resp)
78
+ end
70
79
  end
71
80
  end
72
81
 
@@ -83,12 +92,15 @@ module Couchbase
83
92
  #
84
93
  # @return [CounterResult]
85
94
  def increment(id, options = Options::Increment::DEFAULT)
86
- resp = @backend.document_increment(@collection.bucket_name, @collection.scope_name, @collection.name, id,
87
- options.to_backend)
88
- CounterResult.new do |res|
89
- res.cas = resp[:cas]
90
- res.content = resp[:content]
91
- res.mutation_token = @collection.send(:extract_mutation_token, resp)
95
+ @observability.record_operation(Observability::OP_INCREMENT, options.parent_span, self, :kv) do |obs_handler|
96
+ obs_handler.add_durability_level(options.durability_level)
97
+ resp = @backend.document_increment(@collection.bucket_name, @collection.scope_name, @collection.name, id,
98
+ options.to_backend, obs_handler)
99
+ CounterResult.new do |res|
100
+ res.cas = resp[:cas]
101
+ res.content = resp[:content]
102
+ res.mutation_token = @collection.send(:extract_mutation_token, resp)
103
+ end
92
104
  end
93
105
  end
94
106
 
@@ -105,12 +117,15 @@ module Couchbase
105
117
  #
106
118
  # @return [CounterResult]
107
119
  def decrement(id, options = Options::Decrement::DEFAULT)
108
- resp = @backend.document_decrement(@collection.bucket_name, @collection.scope_name, @collection.name, id,
109
- options.to_backend)
110
- CounterResult.new do |res|
111
- res.cas = resp[:cas]
112
- res.content = resp[:content]
113
- res.mutation_token = @collection.send(:extract_mutation_token, resp)
120
+ @observability.record_operation(Observability::OP_DECREMENT, options.parent_span, self, :kv) do |obs_handler|
121
+ obs_handler.add_durability_level(options.durability_level)
122
+ resp = @backend.document_decrement(@collection.bucket_name, @collection.scope_name, @collection.name, id,
123
+ options.to_backend, obs_handler)
124
+ CounterResult.new do |res|
125
+ res.cas = resp[:cas]
126
+ res.content = resp[:content]
127
+ res.mutation_token = @collection.send(:extract_mutation_token, resp)
128
+ end
114
129
  end
115
130
  end
116
131
 
@@ -30,17 +30,20 @@ module Couchbase
30
30
  alias inspect to_s
31
31
 
32
32
  # @param [Couchbase::Backend] backend
33
- def initialize(backend, name)
33
+ #
34
+ # @api private
35
+ def initialize(backend, name, observability)
34
36
  backend.open_bucket(name, true)
35
37
  @backend = backend
36
38
  @name = name
39
+ @observability = observability
37
40
  end
38
41
 
39
42
  # Get default scope
40
43
  #
41
44
  # @return [Scope]
42
45
  def default_scope
43
- Scope.new(@backend, @name, "_default")
46
+ Scope.new(@backend, @name, "_default", @observability)
44
47
  end
45
48
 
46
49
  # Get a named scope
@@ -49,7 +52,7 @@ module Couchbase
49
52
  #
50
53
  # @return [Scope]
51
54
  def scope(scope_name)
52
- Scope.new(@backend, @name, scope_name)
55
+ Scope.new(@backend, @name, scope_name, @observability)
53
56
  end
54
57
 
55
58
  # Opens the named collection in the default scope of the bucket
@@ -65,7 +68,7 @@ module Couchbase
65
68
  #
66
69
  # @return [Collection]
67
70
  def default_collection
68
- Collection.new(@backend, @name, "_default", "_default")
71
+ Collection.new(@backend, @name, "_default", "_default", @observability)
69
72
  end
70
73
 
71
74
  # Performs query to view index.
@@ -82,18 +85,24 @@ module Couchbase
82
85
  # ))
83
86
  #
84
87
  # @return [ViewResult]
88
+ #
89
+ # @deprecated Views are deprecated in Couchbase Server 7.0+, and will be removed from a future server version.
90
+ # Views are not compatible with the Magma storage engine. Instead of views, use indexes and queries using the
91
+ # Index Service (GSI) and the Query Service (SQL++).
85
92
  def view_query(design_document_name, view_name, options = Options::View::DEFAULT)
86
- resp = @backend.document_view(@name, design_document_name, view_name, options.namespace, options.to_backend)
87
- ViewResult.new do |res|
88
- res.meta_data = ViewMetaData.new do |meta|
89
- meta.total_rows = resp[:meta][:total_rows]
90
- meta.debug_info = resp[:meta][:debug_info]
91
- end
92
- res.rows = resp[:rows].map do |entry|
93
- ViewRow.new do |row|
94
- row.id = entry[:id] if entry.key?(:id)
95
- row.key = JSON.parse(entry[:key])
96
- row.value = JSON.parse(entry[:value])
93
+ @observability.record_operation(Observability::OP_VIEW_QUERY, options.parent_span, self, :views) do |obs_handler|
94
+ resp = @backend.document_view(@name, design_document_name, view_name, options.namespace, options.to_backend, obs_handler)
95
+ ViewResult.new do |res|
96
+ res.meta_data = ViewMetaData.new do |meta|
97
+ meta.total_rows = resp[:meta][:total_rows]
98
+ meta.debug_info = resp[:meta][:debug_info]
99
+ end
100
+ res.rows = resp[:rows].map do |entry|
101
+ ViewRow.new do |row|
102
+ row.id = entry[:id] if entry.key?(:id)
103
+ row.key = JSON.parse(entry[:key])
104
+ row.value = JSON.parse(entry[:value])
105
+ end
97
106
  end
98
107
  end
99
108
  end
@@ -101,12 +110,16 @@ module Couchbase
101
110
 
102
111
  # @return [Management::CollectionManager]
103
112
  def collections
104
- Management::CollectionManager.new(@backend, @name)
113
+ Management::CollectionManager.new(@backend, @name, @observability)
105
114
  end
106
115
 
107
116
  # @return [Management::ViewIndexManager]
117
+ #
118
+ # @deprecated Views are deprecated in Couchbase Server 7.0+, and will be removed from a future server version.
119
+ # Views are not compatible with the Magma storage engine. Instead of views, use indexes and queries using the
120
+ # Index Service (GSI) and the Query Service (SQL++).
108
121
  def view_indexes
109
- Management::ViewIndexManager.new(@backend, @name)
122
+ Management::ViewIndexManager.new(@backend, @name, @observability)
110
123
  end
111
124
 
112
125
  # Performs application-level ping requests against services in the couchbase cluster
@@ -115,20 +128,22 @@ module Couchbase
115
128
  #
116
129
  # @return [PingResult]
117
130
  def ping(options = Options::Ping::DEFAULT)
118
- resp = @backend.ping(@name, options.to_backend)
119
- PingResult.new do |res|
120
- res.version = resp[:version]
121
- res.id = resp[:id]
122
- res.sdk = resp[:sdk]
123
- resp[:services].each do |type, svcs|
124
- res.services[type] = svcs.map do |svc|
125
- PingResult::ServiceInfo.new do |info|
126
- info.id = svc[:id]
127
- info.state = svc[:state]
128
- info.latency = svc[:latency]
129
- info.remote = svc[:remote]
130
- info.local = svc[:local]
131
- info.error = svc[:error]
131
+ @observability.record_operation(Observability::OP_PING, options.parent_span, self) do |_obs_handler|
132
+ resp = @backend.ping(@name, options.to_backend)
133
+ PingResult.new do |res|
134
+ res.version = resp[:version]
135
+ res.id = resp[:id]
136
+ res.sdk = resp[:sdk]
137
+ resp[:services].each do |type, svcs|
138
+ res.services[type] = svcs.map do |svc|
139
+ PingResult::ServiceInfo.new do |info|
140
+ info.id = svc[:id]
141
+ info.state = svc[:state]
142
+ info.latency = svc[:latency]
143
+ info.remote = svc[:remote]
144
+ info.local = svc[:local]
145
+ info.error = svc[:error]
146
+ end
132
147
  end
133
148
  end
134
149
  end
@@ -28,6 +28,12 @@ require "couchbase/analytics_options"
28
28
  require "couchbase/diagnostics"
29
29
 
30
30
  require "couchbase/protostellar"
31
+ require "couchbase/utils/observability"
32
+
33
+ require "couchbase/tracing/threshold_logging_tracer"
34
+ require "couchbase/tracing/noop_tracer"
35
+ require "couchbase/metrics/noop_meter"
36
+ require "couchbase/metrics/logging_meter"
31
37
 
32
38
  module Couchbase
33
39
  # The main entry point when connecting to a Couchbase cluster.
@@ -87,7 +93,39 @@ module Couchbase
87
93
  #
88
94
  # @return [Bucket]
89
95
  def bucket(name)
90
- Bucket.new(@backend, name)
96
+ Bucket.new(@backend, name, @observability)
97
+ end
98
+
99
+ # Updates the authenticator used for this cluster connection
100
+ #
101
+ # @param [PasswordAuthenticator, CertificateAuthenticator, JWTAuthenticator] authenticator the new authenticator
102
+ def update_authenticator(authenticator)
103
+ credentials = {}
104
+
105
+ case authenticator
106
+ when PasswordAuthenticator
107
+ credentials[:username] = authenticator.username
108
+ raise ArgumentError, "missing username" unless credentials[:username]
109
+
110
+ credentials[:password] = authenticator.password
111
+ raise ArgumentError, "missing password" unless credentials[:password]
112
+
113
+ when CertificateAuthenticator
114
+ credentials[:certificate_path] = authenticator.certificate_path
115
+ raise ArgumentError, "missing certificate path" unless credentials[:certificate_path]
116
+
117
+ credentials[:key_path] = authenticator.key_path
118
+ raise ArgumentError, "missing key path" unless credentials[:key_path]
119
+
120
+ when JWTAuthenticator
121
+ credentials[:jwt] = authenticator.token
122
+ raise ArgumentError, "missing token" unless credentials[:jwt]
123
+
124
+ else
125
+ raise ArgumentError, "argument must be an authenticator"
126
+ end
127
+
128
+ @backend.update_credentials(credentials)
91
129
  end
92
130
 
93
131
  # Performs a query against the query (N1QL) services
@@ -109,30 +147,34 @@ module Couchbase
109
147
  #
110
148
  # @return [QueryResult]
111
149
  def query(statement, options = Options::Query::DEFAULT)
112
- resp = @backend.document_query(statement, options.to_backend)
113
-
114
- QueryResult.new do |res|
115
- res.meta_data = QueryMetaData.new do |meta|
116
- meta.status = resp[:meta][:status]
117
- meta.request_id = resp[:meta][:request_id]
118
- meta.client_context_id = resp[:meta][:client_context_id]
119
- meta.signature = JSON.parse(resp[:meta][:signature]) if resp[:meta][:signature]
120
- meta.profile = JSON.parse(resp[:meta][:profile]) if resp[:meta][:profile]
121
- meta.metrics = QueryMetrics.new do |metrics|
122
- if resp[:meta][:metrics]
123
- metrics.elapsed_time = resp[:meta][:metrics][:elapsed_time]
124
- metrics.execution_time = resp[:meta][:metrics][:execution_time]
125
- metrics.sort_count = resp[:meta][:metrics][:sort_count]
126
- metrics.result_count = resp[:meta][:metrics][:result_count]
127
- metrics.result_size = resp[:meta][:metrics][:result_size]
128
- metrics.mutation_count = resp[:meta][:metrics][:mutation_count]
129
- metrics.error_count = resp[:meta][:metrics][:error_count]
130
- metrics.warning_count = resp[:meta][:metrics][:warning_count]
150
+ @observability.record_operation(Observability::OP_QUERY, options.parent_span, self, :query) do |obs_handler|
151
+ obs_handler.add_query_statement(statement, options)
152
+
153
+ resp = @backend.document_query(statement, options.to_backend, obs_handler)
154
+
155
+ QueryResult.new do |res|
156
+ res.meta_data = QueryMetaData.new do |meta|
157
+ meta.status = resp[:meta][:status]
158
+ meta.request_id = resp[:meta][:request_id]
159
+ meta.client_context_id = resp[:meta][:client_context_id]
160
+ meta.signature = JSON.parse(resp[:meta][:signature]) if resp[:meta][:signature]
161
+ meta.profile = JSON.parse(resp[:meta][:profile]) if resp[:meta][:profile]
162
+ meta.metrics = QueryMetrics.new do |metrics|
163
+ if resp[:meta][:metrics]
164
+ metrics.elapsed_time = resp[:meta][:metrics][:elapsed_time]
165
+ metrics.execution_time = resp[:meta][:metrics][:execution_time]
166
+ metrics.sort_count = resp[:meta][:metrics][:sort_count]
167
+ metrics.result_count = resp[:meta][:metrics][:result_count]
168
+ metrics.result_size = resp[:meta][:metrics][:result_size]
169
+ metrics.mutation_count = resp[:meta][:metrics][:mutation_count]
170
+ metrics.error_count = resp[:meta][:metrics][:error_count]
171
+ metrics.warning_count = resp[:meta][:metrics][:warning_count]
172
+ end
131
173
  end
174
+ meta.warnings = resp[:warnings].map { |warn| QueryWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
132
175
  end
133
- meta.warnings = resp[:warnings].map { |warn| QueryWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
176
+ res.instance_variable_set(:@rows, resp[:rows])
134
177
  end
135
- res.instance_variable_set(:@rows, resp[:rows])
136
178
  end
137
179
  end
138
180
 
@@ -147,30 +189,34 @@ module Couchbase
147
189
  #
148
190
  # @return [AnalyticsResult]
149
191
  def analytics_query(statement, options = Options::Analytics::DEFAULT)
150
- resp = @backend.document_analytics(statement, options.to_backend)
151
-
152
- AnalyticsResult.new do |res|
153
- res.transcoder = options.transcoder
154
- res.meta_data = AnalyticsMetaData.new do |meta|
155
- meta.status = resp[:meta][:status]
156
- meta.request_id = resp[:meta][:request_id]
157
- meta.client_context_id = resp[:meta][:client_context_id]
158
- meta.signature = JSON.parse(resp[:meta][:signature]) if resp[:meta][:signature]
159
- meta.profile = JSON.parse(resp[:meta][:profile]) if resp[:meta][:profile]
160
- meta.metrics = AnalyticsMetrics.new do |metrics|
161
- if resp[:meta][:metrics]
162
- metrics.elapsed_time = resp[:meta][:metrics][:elapsed_time]
163
- metrics.execution_time = resp[:meta][:metrics][:execution_time]
164
- metrics.result_count = resp[:meta][:metrics][:result_count]
165
- metrics.result_size = resp[:meta][:metrics][:result_size]
166
- metrics.error_count = resp[:meta][:metrics][:error_count]
167
- metrics.warning_count = resp[:meta][:metrics][:warning_count]
168
- metrics.processed_objects = resp[:meta][:metrics][:processed_objects]
192
+ @observability.record_operation(Observability::OP_ANALYTICS_QUERY, options.parent_span, self, :analytics) do |obs_handler|
193
+ obs_handler.add_query_statement(statement, options)
194
+
195
+ resp = @backend.document_analytics(statement, options.to_backend, obs_handler)
196
+
197
+ AnalyticsResult.new do |res|
198
+ res.transcoder = options.transcoder
199
+ res.meta_data = AnalyticsMetaData.new do |meta|
200
+ meta.status = resp[:meta][:status]
201
+ meta.request_id = resp[:meta][:request_id]
202
+ meta.client_context_id = resp[:meta][:client_context_id]
203
+ meta.signature = JSON.parse(resp[:meta][:signature]) if resp[:meta][:signature]
204
+ meta.profile = JSON.parse(resp[:meta][:profile]) if resp[:meta][:profile]
205
+ meta.metrics = AnalyticsMetrics.new do |metrics|
206
+ if resp[:meta][:metrics]
207
+ metrics.elapsed_time = resp[:meta][:metrics][:elapsed_time]
208
+ metrics.execution_time = resp[:meta][:metrics][:execution_time]
209
+ metrics.result_count = resp[:meta][:metrics][:result_count]
210
+ metrics.result_size = resp[:meta][:metrics][:result_size]
211
+ metrics.error_count = resp[:meta][:metrics][:error_count]
212
+ metrics.warning_count = resp[:meta][:metrics][:warning_count]
213
+ metrics.processed_objects = resp[:meta][:metrics][:processed_objects]
214
+ end
169
215
  end
216
+ res[:warnings] = resp[:warnings].map { |warn| AnalyticsWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
170
217
  end
171
- res[:warnings] = resp[:warnings].map { |warn| AnalyticsWarning.new(warn[:code], warn[:message]) } if resp[:warnings]
218
+ res.instance_variable_set(:@rows, resp[:rows])
172
219
  end
173
- res.instance_variable_set(:@rows, resp[:rows])
174
220
  end
175
221
  end
176
222
 
@@ -191,8 +237,10 @@ module Couchbase
191
237
  #
192
238
  # @return [SearchResult]
193
239
  def search_query(index_name, query, options = Options::Search::DEFAULT)
194
- resp = @backend.document_search(nil, nil, index_name, JSON.generate(query), {}, options.to_backend)
195
- convert_search_result(resp, options)
240
+ @observability.record_operation(Observability::OP_SEARCH_QUERY, options.parent_span, self, :search) do |obs_handler|
241
+ resp = @backend.document_search(nil, nil, index_name, JSON.generate(query), {}, options.to_backend, obs_handler)
242
+ convert_search_result(resp, options)
243
+ end
196
244
  end
197
245
 
198
246
  # Performs a request against the Full Text Search (FTS) service.
@@ -203,34 +251,37 @@ module Couchbase
203
251
  #
204
252
  # @return [SearchResult]
205
253
  def search(index_name, search_request, options = Options::Search::DEFAULT)
206
- encoded_query, encoded_req = search_request.to_backend
207
- resp = @backend.document_search(nil, nil, index_name, encoded_query, encoded_req, options.to_backend(show_request: false))
208
- convert_search_result(resp, options)
254
+ @observability.record_operation(Observability::OP_SEARCH_QUERY, options.parent_span, self, :search) do |obs_handler|
255
+ encoded_query, encoded_req = search_request.to_backend
256
+ resp = @backend.document_search(nil, nil, index_name, encoded_query, encoded_req, options.to_backend(show_request: false),
257
+ obs_handler)
258
+ convert_search_result(resp, options)
259
+ end
209
260
  end
210
261
 
211
262
  # @return [Management::UserManager]
212
263
  def users
213
- Management::UserManager.new(@backend)
264
+ Management::UserManager.new(@backend, @observability)
214
265
  end
215
266
 
216
267
  # @return [Management::BucketManager]
217
268
  def buckets
218
- Management::BucketManager.new(@backend)
269
+ Management::BucketManager.new(@backend, @observability)
219
270
  end
220
271
 
221
272
  # @return [Management::QueryIndexManager]
222
273
  def query_indexes
223
- Management::QueryIndexManager.new(@backend)
274
+ Management::QueryIndexManager.new(@backend, @observability)
224
275
  end
225
276
 
226
277
  # @return [Management::AnalyticsIndexManager]
227
278
  def analytics_indexes
228
- Management::AnalyticsIndexManager.new(@backend)
279
+ Management::AnalyticsIndexManager.new(@backend, @observability)
229
280
  end
230
281
 
231
282
  # @return [Management::SearchIndexManager]
232
283
  def search_indexes
233
- Management::SearchIndexManager.new(@backend)
284
+ Management::SearchIndexManager.new(@backend, @observability)
234
285
  end
235
286
 
236
287
  # Closes all connections to services and free allocated resources
@@ -238,6 +289,7 @@ module Couchbase
238
289
  # @return [void]
239
290
  def disconnect
240
291
  @backend.close
292
+ @observability.close
241
293
  end
242
294
 
243
295
  # Creates diagnostic report that can be used to determine the health of the network connections.
@@ -332,24 +384,28 @@ module Couchbase
332
384
  raise ArgumentError, "missing username" unless credentials[:username]
333
385
  raise ArgumentError, "missing password" unless credentials[:password]
334
386
  when Options::Cluster
335
- open_options = options&.to_backend || {}
336
- authenticator = options&.authenticator
387
+ tracer = options.tracer
388
+ meter = options.meter
389
+ open_options = options.to_backend || {}
390
+ authenticator = options.authenticator
337
391
  case authenticator
338
392
  when PasswordAuthenticator
339
- credentials[:username] = authenticator&.username
393
+ credentials[:username] = authenticator.username
340
394
  raise ArgumentError, "missing username" unless credentials[:username]
341
395
 
342
- credentials[:password] = authenticator&.password
396
+ credentials[:password] = authenticator.password
343
397
  raise ArgumentError, "missing password" unless credentials[:password]
344
398
 
345
- open_options[:allowed_sasl_mechanisms] = authenticator&.allowed_sasl_mechanisms
399
+ open_options[:allowed_sasl_mechanisms] = authenticator.allowed_sasl_mechanisms
346
400
  when CertificateAuthenticator
347
- credentials[:certificate_path] = authenticator&.certificate_path
401
+ credentials[:certificate_path] = authenticator.certificate_path
348
402
  raise ArgumentError, "missing certificate path" unless credentials[:certificate_path]
349
403
 
350
- credentials[:key_path] = authenticator&.key_path
404
+ credentials[:key_path] = authenticator.key_path
351
405
  raise ArgumentError, "missing key path" unless credentials[:key_path]
352
-
406
+ when JWTAuthenticator
407
+ credentials[:jwt] = authenticator.token
408
+ raise ArgumentError, "missing token" unless credentials[:jwt]
353
409
  else
354
410
  raise ArgumentError, "options must have authenticator configured"
355
411
  end
@@ -359,6 +415,35 @@ module Couchbase
359
415
  end
360
416
 
361
417
  @backend = Backend.new
418
+
419
+ @observability = Observability::Wrapper.new(backend: @backend) do |w|
420
+ w.tracer = if !open_options[:enable_tracing].nil? && !open_options[:enable_tracing]
421
+ Tracing::NoopTracer.new
422
+ elsif tracer.nil?
423
+ Tracing::ThresholdLoggingTracer.new(
424
+ emit_interval: open_options[:threshold_emit_interval],
425
+ kv_threshold: open_options[:key_value_threshold],
426
+ query_threshold: open_options[:query_threshold],
427
+ views_threshold: open_options[:view_threshold],
428
+ search_threshold: open_options[:search_threshold],
429
+ analytics_threshold: open_options[:analytics_threshold],
430
+ management_threshold: open_options[:management_threshold],
431
+ sample_size: open_options[:threshold_sample_size],
432
+ )
433
+ else
434
+ tracer
435
+ end
436
+ w.meter = if !open_options[:enable_metrics].nil? && !open_options[:enable_metrics]
437
+ Metrics::NoopMeter.new
438
+ elsif meter.nil?
439
+ Metrics::LoggingMeter.new(
440
+ emit_interval: open_options[:metrics_emit_interval],
441
+ )
442
+ else
443
+ meter
444
+ end
445
+ end
446
+
362
447
  @backend.open(connection_string, credentials, open_options)
363
448
  end
364
449