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
@@ -15,9 +15,114 @@
15
15
  # limitations under the License.
16
16
 
17
17
  require "couchbase/errors"
18
+ require "couchbase/options"
18
19
 
19
20
  module Couchbase
20
21
  module Management
22
+ module Options
23
+ module View
24
+ # Options for {ViewIndexManager#get_design_document}
25
+ class GetDesignDocument < Couchbase::Options::Base
26
+ # Creates an instance of options for {ViewIndexManager#get_design_document}
27
+ #
28
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
29
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
30
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
31
+ #
32
+ # @yieldparam [GetDesignDocument]
33
+ def initialize(timeout: nil,
34
+ retry_strategy: nil,
35
+ parent_span: nil)
36
+ super
37
+ yield self if block_given?
38
+ end
39
+
40
+ # @api private
41
+ DEFAULT = new.freeze
42
+ end
43
+
44
+ # Options for {ViewIndexManager#get_all_design_documents}
45
+ class GetAllDesignDocuments < Couchbase::Options::Base
46
+ # Creates an instance of options for {ViewIndexManager#get_all_design_documents}
47
+ #
48
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
49
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
50
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
51
+ #
52
+ # @yieldparam [GetAllDesignDocuments]
53
+ def initialize(timeout: nil,
54
+ retry_strategy: nil,
55
+ parent_span: nil)
56
+ super
57
+ yield self if block_given?
58
+ end
59
+
60
+ # @api private
61
+ DEFAULT = new.freeze
62
+ end
63
+
64
+ # Options for {ViewIndexManager#upsert_design_document}
65
+ class UpsertDesignDocument < Couchbase::Options::Base
66
+ # Creates an instance of options for {ViewIndexManager#upsert_design_document}
67
+ #
68
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
69
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
70
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
71
+ #
72
+ # @yieldparam [UpsertDesignDocument]
73
+ def initialize(timeout: nil,
74
+ retry_strategy: nil,
75
+ parent_span: nil)
76
+ super
77
+ yield self if block_given?
78
+ end
79
+
80
+ # @api private
81
+ DEFAULT = new.freeze
82
+ end
83
+
84
+ # Options for {ViewIndexManager#drop_design_document}
85
+ class DropDesignDocument < Couchbase::Options::Base
86
+ # Creates an instance of options for {ViewIndexManager#drop_design_document}
87
+ #
88
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
89
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
90
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
91
+ #
92
+ # @yieldparam [DropDesignDocument]
93
+ def initialize(timeout: nil,
94
+ retry_strategy: nil,
95
+ parent_span: nil)
96
+ super
97
+ yield self if block_given?
98
+ end
99
+
100
+ # @api private
101
+ DEFAULT = new.freeze
102
+ end
103
+
104
+ # Options for {ViewIndexManager#publish_design_document}
105
+ class PublishDesignDocument < Couchbase::Options::Base
106
+ # Creates an instance of options for {ViewIndexManager#publish_design_document}
107
+ #
108
+ # @param [Integer, #in_milliseconds, nil] timeout the time in milliseconds allowed for the operation to complete
109
+ # @param [Proc, nil] retry_strategy the custom retry strategy, if set
110
+ # @param [Span, nil] parent_span if set holds the parent span, that should be used for this request
111
+ #
112
+ # @yieldparam [PublishDesignDocument]
113
+ def initialize(timeout: nil,
114
+ retry_strategy: nil,
115
+ parent_span: nil)
116
+ super
117
+ yield self if block_given?
118
+ end
119
+
120
+ # @api private
121
+ DEFAULT = new.freeze
122
+ end
123
+ end
124
+ end
125
+
21
126
  # The View Index Manager interface contains the means for managing design documents used for views.
22
127
  #
23
128
  # A design document belongs to either the "development" or "production" namespace. A development document has a name
@@ -33,6 +138,10 @@ module Couchbase
33
138
  # All methods (except publish) have a required "namespace" argument indicating whether the operation targets a
34
139
  # development document or a production document. The type of this argument is [Symbol] with allowed values
35
140
  # +:production+ and +:development+.
141
+ #
142
+ # @deprecated Views are deprecated in Couchbase Server 7.0+, and will be removed from a future server version.
143
+ # Views are not compatible with the Magma storage engine. Instead of views, use indexes and queries using the
144
+ # Index Service (GSI) and the Query Service (SQL++).
36
145
  class ViewIndexManager
37
146
  alias inspect to_s
38
147
 
@@ -41,35 +150,41 @@ module Couchbase
41
150
 
42
151
  # @param [Couchbase::Backend] backend
43
152
  # @param [String] bucket_name
44
- def initialize(backend, bucket_name)
153
+ # @param [Observability::Wrapper] observability wrapper
154
+ def initialize(backend, bucket_name, observability)
45
155
  @backend = backend
46
156
  @bucket_name = bucket_name
157
+ @observability = observability
47
158
  end
48
159
 
49
160
  # Fetches a design document from the server
50
161
  #
51
162
  # @param [String] name the name of the design document
52
163
  # @param [:production, :development] namespace the namespace
53
- # @param [GetDesignDocumentOptions] options
164
+ # @param [Options::View::GetDesignDocument] options
54
165
  #
55
166
  # @return [DesignDocument]
56
167
  #
57
168
  # @raise [Error::DesignDocumentNotFound]
58
- def get_design_document(name, namespace, options = GetDesignDocumentOptions.new)
59
- resp = @backend.view_index_get(@bucket_name, name, namespace, options.timeout)
60
- extract_design_document(resp)
169
+ def get_design_document(name, namespace, options = Options::View::GetDesignDocument::DEFAULT)
170
+ @observability.record_operation(Observability::OP_VM_GET_DESIGN_DOCUMENT, options.parent_span, self, :views) do |obs_handler|
171
+ resp = @backend.view_index_get(@bucket_name, name, namespace, options.timeout, obs_handler)
172
+ extract_design_document(resp)
173
+ end
61
174
  end
62
175
 
63
176
  # Fetches all design documents from the server
64
177
  #
65
178
  # @param [:production, :development] namespace the namespace
66
- # @param [GetAllDesignDocumentsOptions] options
179
+ # @param [Options::View::GetAllDesignDocuments] options
67
180
  #
68
181
  # @return [Array<DesignDocument>]
69
- def get_all_design_documents(namespace, options = GetAllDesignDocumentsOptions.new)
70
- resp = @backend.view_index_get_all(@bucket_name, namespace, options.timeout)
71
- resp.map do |entry|
72
- extract_design_document(entry)
182
+ def get_all_design_documents(namespace, options = Options::View::GetAllDesignDocuments::DEFAULT)
183
+ @observability.record_operation(Observability::OP_VM_GET_ALL_DESIGN_DOCUMENTS, options.parent_span, self, :views) do |obs_handler|
184
+ resp = @backend.view_index_get_all(@bucket_name, namespace, options.timeout, obs_handler)
185
+ resp.map do |entry|
186
+ extract_design_document(entry)
187
+ end
73
188
  end
74
189
  end
75
190
 
@@ -77,33 +192,37 @@ module Couchbase
77
192
  #
78
193
  # @param [DesignDocument] document
79
194
  # @param [:production, :development] namespace the namespace
80
- # @param [UpsertDesignDocumentOptions] options
195
+ # @param [Options::View::UpsertDesignDocument] options
81
196
  #
82
197
  # @return [void]
83
- def upsert_design_document(document, namespace, options = UpsertDesignDocumentOptions.new)
84
- @backend.view_index_upsert(@bucket_name, {
85
- name: document.name,
86
- views: document.views.map do |name, view|
87
- {
88
- name: name,
89
- map: view.map_function,
90
- reduce: view.reduce_function,
91
- }
92
- end,
93
- }, namespace, options.timeout)
198
+ def upsert_design_document(document, namespace, options = Options::View::UpsertDesignDocument::DEFAULT)
199
+ @observability.record_operation(Observability::OP_VM_UPSERT_DESIGN_DOCUMENT, options.parent_span, self, :views) do |obs_handler|
200
+ @backend.view_index_upsert(@bucket_name, {
201
+ name: document.name,
202
+ views: document.views.map do |name, view|
203
+ {
204
+ name: name,
205
+ map: view.map_function,
206
+ reduce: view.reduce_function,
207
+ }
208
+ end,
209
+ }, namespace, options.timeout, obs_handler)
210
+ end
94
211
  end
95
212
 
96
213
  # Removes the design document
97
214
  #
98
215
  # @param [String] name design document name
99
216
  # @param [:production, :development] namespace the namespace
100
- # @param [DropDesignDocumentOptions] options
217
+ # @param [Options::View::DropDesignDocument] options
101
218
  #
102
219
  # @return [void]
103
220
  #
104
221
  # @raise [Error::DesignDocumentNotFound]
105
- def drop_design_document(name, namespace, options = DropDesignDocumentOptions.new)
106
- @backend.view_index_drop(@bucket_name, name, namespace, options.timeout)
222
+ def drop_design_document(name, namespace, options = Options::View::DropDesignDocument::DEFAULT)
223
+ @observability.record_operation(Observability::OP_VM_DROP_DESIGN_DOCUMENT, options.parent_span, self, :views) do |obs_handler|
224
+ @backend.view_index_drop(@bucket_name, name, namespace, options.timeout, obs_handler)
225
+ end
107
226
  end
108
227
 
109
228
  # Publishes the design document.
@@ -112,66 +231,40 @@ module Couchbase
112
231
  # it to the production namespace.
113
232
  #
114
233
  # @param [String] name design document name
115
- # @param [PublishDesignDocumentOptions] options
234
+ # @param [Options::View::PublishDesignDocument] options
116
235
  #
117
236
  # @return [void]
118
237
  #
119
238
  # @raise [ArgumentError]
120
239
  # @raise [Error::DesignDocumentNotFound]
121
- def publish_design_document(name, options = PublishDesignDocumentOptions.new)
122
- document = get_design_document(name, :development, GetDesignDocumentOptions.new { |o| o.timeout = options.timeout })
123
- upsert_design_document(document, :production, UpsertDesignDocumentOptions.new { |o| o.timeout = options.timeout })
124
- end
125
-
126
- class GetDesignDocumentOptions
127
- # @return [Integer] the time in milliseconds allowed for the operation to complete
128
- attr_accessor :timeout
129
-
130
- # @yieldparam [GetDesignDocumentOptions] self
131
- def initialize
132
- yield self if block_given?
133
- end
134
- end
135
-
136
- class GetAllDesignDocumentsOptions
137
- # @return [Integer] the time in milliseconds allowed for the operation to complete
138
- attr_accessor :timeout
139
-
140
- # @yieldparam [GetAllDesignDocumentsOptions] self
141
- def initialize
142
- yield self if block_given?
240
+ def publish_design_document(name, options = Options::View::PublishDesignDocument::DEFAULT)
241
+ @observability.record_operation(Observability::OP_VM_PUBLISH_DESIGN_DOCUMENT, options.parent_span, self, :views) do |obs_handler|
242
+ document = get_design_document(name, :development,
243
+ Options::View::GetDesignDocument.new(timeout: options.timeout, parent_span: obs_handler.op_span))
244
+ upsert_design_document(document, :production,
245
+ Options::View::UpsertDesignDocument.new(timeout: options.timeout, parent_span: obs_handler.op_span))
143
246
  end
144
247
  end
145
248
 
146
- class UpsertDesignDocumentOptions
147
- # @return [Integer] the time in milliseconds allowed for the operation to complete
148
- attr_accessor :timeout
149
-
150
- # @yieldparam [UpsertDesignDocumentOptions] self
151
- def initialize
152
- yield self if block_given?
153
- end
154
- end
249
+ # @api private
250
+ # @deprecated use {Options::View::GetDesignDocument} instead
251
+ GetDesignDocumentOptions = Options::View::GetDesignDocument
155
252
 
156
- class DropDesignDocumentOptions
157
- # @return [Integer] the time in milliseconds allowed for the operation to complete
158
- attr_accessor :timeout
253
+ # @api private
254
+ # @deprecated use {Options::View::GetAllDesignDocuments} instead
255
+ GetAllDesignDocumentsOptions = Options::View::GetAllDesignDocuments
159
256
 
160
- # @yieldparam [DropDesignDocumentOptions] self
161
- def initialize
162
- yield self if block_given?
163
- end
164
- end
257
+ # @api private
258
+ # @deprecated use {Options::View::UpsertDesignDocument} instead
259
+ UpsertDesignDocumentOptions = Options::View::UpsertDesignDocument
165
260
 
166
- class PublishDesignDocumentOptions
167
- # @return [Integer] the time in milliseconds allowed for the operation to complete
168
- attr_accessor :timeout
261
+ # @api private
262
+ # @deprecated use {Options::View::DropDesignDocument} instead
263
+ DropDesignDocumentOptions = Options::View::DropDesignDocument
169
264
 
170
- # @yieldparam [PublishDesignDocumentOptions] self
171
- def initialize
172
- yield self if block_given?
173
- end
174
- end
265
+ # @api private
266
+ # @deprecated use {Options::View::PublishDesignDocument} instead
267
+ PublishDesignDocumentOptions = Options::View::PublishDesignDocument
175
268
 
176
269
  private
177
270
 
@@ -0,0 +1,108 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2025-Present 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
+ require_relative "logging_value_recorder"
18
+ require_relative "meter"
19
+ require_relative "noop_meter"
20
+ require "couchbase/utils/observability_constants"
21
+ require "couchbase/utils/stdlib_logger_adapter"
22
+ require "couchbase/logger"
23
+
24
+ require "concurrent/map"
25
+ require "concurrent/timer_task"
26
+
27
+ module Couchbase
28
+ module Metrics
29
+ class LoggingMeter < Meter
30
+ # @api private
31
+ DEFAULT_EMIT_INTERVAL = 600_000 # milliseconds
32
+
33
+ def initialize(emit_interval: nil)
34
+ super()
35
+ @emit_interval = emit_interval || DEFAULT_EMIT_INTERVAL
36
+ @value_recorders = {
37
+ Observability::ATTR_VALUE_SERVICE_KV => Concurrent::Map.new,
38
+ Observability::ATTR_VALUE_SERVICE_QUERY => Concurrent::Map.new,
39
+ Observability::ATTR_VALUE_SERVICE_VIEWS => Concurrent::Map.new,
40
+ Observability::ATTR_VALUE_SERVICE_SEARCH => Concurrent::Map.new,
41
+ Observability::ATTR_VALUE_SERVICE_ANALYTICS => Concurrent::Map.new,
42
+ Observability::ATTR_VALUE_SERVICE_MANAGEMENT => Concurrent::Map.new,
43
+ }
44
+
45
+ # TODO(DC): Find better solution for logging
46
+ @logger = Couchbase.logger || Logger.new($stdout, Utils::StdlibLoggerAdapter.map_spdlog_level(Couchbase.log_level))
47
+ @task = Concurrent::TimerTask.new(execution_interval: @emit_interval / 1_000.0) do
48
+ report = create_report
49
+ return if report.empty?
50
+
51
+ @logger.info("Metrics: #{report.to_json}")
52
+ rescue StandardError => e
53
+ @logger.debug("Failed to log metrics: #{e.message}")
54
+ end
55
+ end
56
+
57
+ def value_recorder(name, tags)
58
+ return NoopMeter::VALUE_RECORDER_INSTANCE unless name == Observability::METER_NAME_OPERATION_DURATION
59
+
60
+ operation_name = tags[Observability::ATTR_OPERATION_NAME]
61
+ service = tags[Observability::ATTR_SERVICE]
62
+
63
+ return NoopMeter::VALUE_RECORDER_INSTANCE if operation_name.nil? || service.nil?
64
+
65
+ @value_recorders[service].put_if_absent(
66
+ operation_name,
67
+ LoggingValueRecorder.new(
68
+ operation_name: operation_name,
69
+ service: service,
70
+ ),
71
+ )
72
+
73
+ @value_recorders[service][operation_name]
74
+ end
75
+
76
+ def create_report
77
+ operations = {}
78
+ @value_recorders.each do |service, recorders|
79
+ recorders.each_key do |operation_name|
80
+ recorder = recorders[operation_name]
81
+ operation_report = recorder.report_and_reset
82
+ if operation_report
83
+ operations[service] ||= {}
84
+ operations[service][operation_name] = operation_report
85
+ end
86
+ end
87
+ end
88
+ if operations.empty?
89
+ {}
90
+ else
91
+ {
92
+ meta: {
93
+ emit_interval_ms: @emit_interval,
94
+ },
95
+ operations: operations,
96
+ }
97
+ end
98
+ end
99
+
100
+ def close
101
+ @task.shutdown
102
+ @value_recorders.each_value do |operation_map|
103
+ operation_map.each_value(&:close)
104
+ end
105
+ end
106
+ end
107
+ end
108
+ end
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2025-Present 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
+ require_relative "value_recorder"
18
+ require "couchbase/utils/hdr_histogram"
19
+
20
+ module Couchbase
21
+ module Metrics
22
+ class LoggingValueRecorder < ValueRecorder
23
+ attr_reader :operation_name
24
+ attr_reader :service
25
+
26
+ def initialize(operation_name:, service:)
27
+ super()
28
+ @operation_name = operation_name
29
+ @service = service
30
+ @histogram = Utils::HdrHistogram.new(
31
+ lowest_discernible_value: 1, # 1 microsecond
32
+ highest_trackable_value: 30_000_000, # 30 seconds
33
+ significant_figures: 3,
34
+ )
35
+ end
36
+
37
+ def record_value(value)
38
+ @histogram.record_value(value)
39
+ end
40
+
41
+ def report_and_reset
42
+ @histogram.report_and_reset
43
+ end
44
+
45
+ def close
46
+ @histogram.close
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2025-Present 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
+ module Couchbase
18
+ module Metrics
19
+ class Meter
20
+ def value_recorder(name, tags)
21
+ raise NotImplementedError, "The meter does not implement #value_recorder"
22
+ end
23
+
24
+ def close; end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2025-Present 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
+ require_relative 'meter'
18
+ require_relative 'noop_value_recorder'
19
+
20
+ module Couchbase
21
+ module Metrics
22
+ class NoopMeter < Meter
23
+ def value_recorder(_name, _tags)
24
+ VALUE_RECORDER_INSTANCE
25
+ end
26
+
27
+ VALUE_RECORDER_INSTANCE = NoopValueRecorder.new.freeze
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2025-Present 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
+ require_relative 'value_recorder'
18
+
19
+ module Couchbase
20
+ module Metrics
21
+ class NoopValueRecorder < ValueRecorder
22
+ def record_value(_value)
23
+ # Do nothing
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,25 @@
1
+ # frozen_string_literal: true
2
+
3
+ # Copyright 2025-Present 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
+ module Couchbase
18
+ module Metrics
19
+ class ValueRecorder
20
+ def record_value(value)
21
+ raise NotImplementedError, "The value recorder does not implement #record_value"
22
+ end
23
+ end
24
+ end
25
+ end