couchbase 3.7.0 → 3.8.1

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 (349) 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 -665
  6. data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
  7. data/ext/couchbase/CMakeLists.txt +26 -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/error_context/base_error_context.hxx +32 -0
  33. data/ext/couchbase/core/error_context/key_value.cxx +1 -0
  34. data/ext/couchbase/core/error_context/key_value.hxx +23 -0
  35. data/ext/couchbase/core/error_context/key_value_error_context.hxx +35 -0
  36. data/ext/couchbase/core/error_context/subdocument_error_context.hxx +41 -0
  37. data/ext/couchbase/core/free_form_http_request.hxx +0 -2
  38. data/ext/couchbase/core/http_component.cxx +12 -48
  39. data/ext/couchbase/core/impl/analytics.cxx +3 -2
  40. data/ext/couchbase/core/impl/analytics.hxx +2 -1
  41. data/ext/couchbase/core/impl/analytics_index_manager.cxx +249 -137
  42. data/ext/couchbase/core/impl/binary_collection.cxx +239 -128
  43. data/ext/couchbase/core/impl/bucket_manager.cxx +87 -35
  44. data/ext/couchbase/core/impl/collection.cxx +914 -372
  45. data/ext/couchbase/core/impl/collection_manager.cxx +89 -49
  46. data/ext/couchbase/core/impl/dns_srv_tracker.cxx +4 -4
  47. data/ext/couchbase/core/impl/error.cxx +49 -17
  48. data/ext/couchbase/core/impl/error.hxx +15 -10
  49. data/ext/couchbase/core/impl/get_all_replicas.hxx +1 -1
  50. data/ext/couchbase/core/impl/get_any_replica.hxx +2 -1
  51. data/ext/couchbase/core/impl/get_replica.hxx +2 -0
  52. data/ext/couchbase/core/impl/invoke_with_node_id.hxx +44 -0
  53. data/ext/couchbase/core/impl/lookup_in_replica.hxx +1 -1
  54. data/ext/couchbase/core/impl/node_id.cxx +110 -0
  55. data/ext/couchbase/core/impl/node_id.hxx +40 -0
  56. data/ext/couchbase/core/impl/observability_recorder.cxx +161 -0
  57. data/ext/couchbase/core/impl/observability_recorder.hxx +77 -0
  58. data/ext/couchbase/core/impl/observe_seqno.hxx +2 -0
  59. data/ext/couchbase/core/impl/public_bucket.cxx +31 -7
  60. data/ext/couchbase/core/impl/public_cluster.cxx +107 -19
  61. data/ext/couchbase/core/impl/query.cxx +6 -3
  62. data/ext/couchbase/core/impl/query.hxx +3 -1
  63. data/ext/couchbase/core/impl/query_index_manager.cxx +267 -102
  64. data/ext/couchbase/core/impl/scope.cxx +53 -11
  65. data/ext/couchbase/core/impl/search.cxx +8 -4
  66. data/ext/couchbase/core/impl/search.hxx +6 -2
  67. data/ext/couchbase/core/impl/search_index_manager.cxx +131 -41
  68. data/ext/couchbase/core/impl/with_cancellation.hxx +75 -0
  69. data/ext/couchbase/core/io/config_tracker.cxx +9 -9
  70. data/ext/couchbase/core/io/config_tracker.hxx +2 -1
  71. data/ext/couchbase/core/io/http_command.hxx +98 -49
  72. data/ext/couchbase/core/io/http_context.hxx +2 -0
  73. data/ext/couchbase/core/io/http_session.cxx +23 -10
  74. data/ext/couchbase/core/io/http_session.hxx +17 -9
  75. data/ext/couchbase/core/io/http_session_manager.hxx +245 -270
  76. data/ext/couchbase/core/io/http_traits.hxx +0 -7
  77. data/ext/couchbase/core/io/mcbp_command.hxx +123 -44
  78. data/ext/couchbase/core/io/mcbp_session.cxx +251 -26
  79. data/ext/couchbase/core/io/mcbp_session.hxx +9 -1
  80. data/ext/couchbase/core/io/mcbp_traits.hxx +0 -8
  81. data/ext/couchbase/core/io/streams.cxx +3 -3
  82. data/ext/couchbase/core/io/streams.hxx +3 -2
  83. data/ext/couchbase/core/meta/features.hxx +15 -0
  84. data/ext/couchbase/core/meta/version.cxx +13 -0
  85. data/ext/couchbase/core/meta/version.hxx +3 -0
  86. data/ext/couchbase/core/metrics/constants.hxx +23 -0
  87. data/ext/couchbase/core/metrics/logging_meter.cxx +5 -5
  88. data/ext/couchbase/core/metrics/meter_wrapper.cxx +65 -63
  89. data/ext/couchbase/core/metrics/meter_wrapper.hxx +12 -10
  90. data/ext/couchbase/core/operations/document_analytics.hxx +0 -5
  91. data/ext/couchbase/core/operations/document_append.hxx +0 -4
  92. data/ext/couchbase/core/operations/document_decrement.hxx +0 -5
  93. data/ext/couchbase/core/operations/document_exists.hxx +0 -7
  94. data/ext/couchbase/core/operations/document_get.hxx +0 -7
  95. data/ext/couchbase/core/operations/document_get_all_replicas.hxx +89 -29
  96. data/ext/couchbase/core/operations/document_get_and_lock.hxx +0 -9
  97. data/ext/couchbase/core/operations/document_get_and_touch.hxx +0 -9
  98. data/ext/couchbase/core/operations/document_get_any_replica.hxx +83 -2
  99. data/ext/couchbase/core/operations/document_get_projected.cxx +3 -4
  100. data/ext/couchbase/core/operations/document_get_projected.hxx +0 -9
  101. data/ext/couchbase/core/operations/document_increment.hxx +0 -5
  102. data/ext/couchbase/core/operations/document_insert.hxx +0 -4
  103. data/ext/couchbase/core/operations/document_lookup_in.hxx +0 -9
  104. data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +50 -4
  105. data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +121 -43
  106. data/ext/couchbase/core/operations/document_mutate_in.hxx +0 -5
  107. data/ext/couchbase/core/operations/document_prepend.hxx +0 -4
  108. data/ext/couchbase/core/operations/document_query.cxx +12 -12
  109. data/ext/couchbase/core/operations/document_query.hxx +0 -4
  110. data/ext/couchbase/core/operations/document_remove.hxx +0 -4
  111. data/ext/couchbase/core/operations/document_replace.hxx +0 -4
  112. data/ext/couchbase/core/operations/document_search.hxx +0 -7
  113. data/ext/couchbase/core/operations/document_touch.hxx +0 -7
  114. data/ext/couchbase/core/operations/document_unlock.hxx +0 -6
  115. data/ext/couchbase/core/operations/document_upsert.hxx +0 -4
  116. data/ext/couchbase/core/operations/document_view.cxx +2 -0
  117. data/ext/couchbase/core/operations/document_view.hxx +10 -13
  118. data/ext/couchbase/core/operations/http_noop.hxx +2 -0
  119. data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +2 -0
  120. data/ext/couchbase/core/operations/management/analytics_dataset_drop.hxx +2 -0
  121. data/ext/couchbase/core/operations/management/analytics_dataset_get_all.hxx +2 -0
  122. data/ext/couchbase/core/operations/management/analytics_dataverse_create.hxx +2 -0
  123. data/ext/couchbase/core/operations/management/analytics_dataverse_drop.hxx +2 -0
  124. data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.hxx +2 -0
  125. data/ext/couchbase/core/operations/management/analytics_index_create.hxx +2 -0
  126. data/ext/couchbase/core/operations/management/analytics_index_drop.hxx +2 -0
  127. data/ext/couchbase/core/operations/management/analytics_index_get_all.hxx +2 -0
  128. data/ext/couchbase/core/operations/management/analytics_link_connect.hxx +2 -0
  129. data/ext/couchbase/core/operations/management/analytics_link_create.hxx +2 -0
  130. data/ext/couchbase/core/operations/management/analytics_link_disconnect.hxx +2 -0
  131. data/ext/couchbase/core/operations/management/analytics_link_drop.hxx +2 -0
  132. data/ext/couchbase/core/operations/management/analytics_link_get_all.hxx +2 -0
  133. data/ext/couchbase/core/operations/management/analytics_link_replace.hxx +2 -0
  134. data/ext/couchbase/core/operations/management/bucket_create.hxx +2 -0
  135. data/ext/couchbase/core/operations/management/bucket_describe.hxx +2 -0
  136. data/ext/couchbase/core/operations/management/bucket_drop.hxx +2 -0
  137. data/ext/couchbase/core/operations/management/bucket_flush.hxx +2 -0
  138. data/ext/couchbase/core/operations/management/bucket_get.hxx +2 -0
  139. data/ext/couchbase/core/operations/management/bucket_get_all.hxx +2 -0
  140. data/ext/couchbase/core/operations/management/bucket_update.hxx +2 -0
  141. data/ext/couchbase/core/operations/management/change_password.hxx +2 -0
  142. data/ext/couchbase/core/operations/management/cluster_describe.hxx +2 -0
  143. data/ext/couchbase/core/operations/management/cluster_developer_preview_enable.hxx +2 -0
  144. data/ext/couchbase/core/operations/management/collection_create.cxx +11 -11
  145. data/ext/couchbase/core/operations/management/collection_create.hxx +2 -0
  146. data/ext/couchbase/core/operations/management/collection_drop.cxx +11 -11
  147. data/ext/couchbase/core/operations/management/collection_drop.hxx +2 -0
  148. data/ext/couchbase/core/operations/management/collection_update.cxx +11 -11
  149. data/ext/couchbase/core/operations/management/collection_update.hxx +2 -0
  150. data/ext/couchbase/core/operations/management/collections_manifest_get.hxx +2 -0
  151. data/ext/couchbase/core/operations/management/error_utils.cxx +13 -7
  152. data/ext/couchbase/core/operations/management/eventing_deploy_function.hxx +2 -0
  153. data/ext/couchbase/core/operations/management/eventing_drop_function.hxx +2 -0
  154. data/ext/couchbase/core/operations/management/eventing_get_all_functions.hxx +2 -0
  155. data/ext/couchbase/core/operations/management/eventing_get_function.hxx +2 -0
  156. data/ext/couchbase/core/operations/management/eventing_get_status.hxx +2 -0
  157. data/ext/couchbase/core/operations/management/eventing_pause_function.hxx +2 -0
  158. data/ext/couchbase/core/operations/management/eventing_resume_function.hxx +2 -0
  159. data/ext/couchbase/core/operations/management/eventing_undeploy_function.hxx +2 -0
  160. data/ext/couchbase/core/operations/management/eventing_upsert_function.hxx +2 -0
  161. data/ext/couchbase/core/operations/management/freeform.hxx +2 -0
  162. data/ext/couchbase/core/operations/management/group_drop.hxx +2 -0
  163. data/ext/couchbase/core/operations/management/group_get.hxx +2 -0
  164. data/ext/couchbase/core/operations/management/group_get_all.hxx +2 -0
  165. data/ext/couchbase/core/operations/management/group_upsert.hxx +2 -0
  166. data/ext/couchbase/core/operations/management/query_index_build.hxx +2 -0
  167. data/ext/couchbase/core/operations/management/query_index_build_deferred.hxx +68 -30
  168. data/ext/couchbase/core/operations/management/query_index_create.cxx +5 -4
  169. data/ext/couchbase/core/operations/management/query_index_create.hxx +2 -0
  170. data/ext/couchbase/core/operations/management/query_index_drop.cxx +7 -6
  171. data/ext/couchbase/core/operations/management/query_index_drop.hxx +2 -0
  172. data/ext/couchbase/core/operations/management/query_index_get_all.hxx +4 -3
  173. data/ext/couchbase/core/operations/management/query_index_get_all_deferred.hxx +2 -1
  174. data/ext/couchbase/core/operations/management/role_get_all.hxx +2 -0
  175. data/ext/couchbase/core/operations/management/scope_create.cxx +12 -13
  176. data/ext/couchbase/core/operations/management/scope_create.hxx +2 -0
  177. data/ext/couchbase/core/operations/management/scope_drop.cxx +8 -9
  178. data/ext/couchbase/core/operations/management/scope_drop.hxx +2 -0
  179. data/ext/couchbase/core/operations/management/scope_get_all.hxx +2 -0
  180. data/ext/couchbase/core/operations/management/search_get_stats.hxx +2 -0
  181. data/ext/couchbase/core/operations/management/search_index_analyze_document.hxx +2 -0
  182. data/ext/couchbase/core/operations/management/search_index_control_ingest.hxx +2 -0
  183. data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.hxx +2 -0
  184. data/ext/couchbase/core/operations/management/search_index_control_query.hxx +2 -0
  185. data/ext/couchbase/core/operations/management/search_index_drop.hxx +2 -0
  186. data/ext/couchbase/core/operations/management/search_index_get.hxx +2 -0
  187. data/ext/couchbase/core/operations/management/search_index_get_all.hxx +2 -0
  188. data/ext/couchbase/core/operations/management/search_index_get_documents_count.hxx +2 -0
  189. data/ext/couchbase/core/operations/management/search_index_get_stats.hxx +2 -0
  190. data/ext/couchbase/core/operations/management/search_index_upsert.hxx +2 -0
  191. data/ext/couchbase/core/operations/management/user_drop.hxx +2 -0
  192. data/ext/couchbase/core/operations/management/user_get.hxx +2 -0
  193. data/ext/couchbase/core/operations/management/user_get_all.hxx +2 -0
  194. data/ext/couchbase/core/operations/management/user_upsert.hxx +2 -0
  195. data/ext/couchbase/core/operations/management/view_index_drop.hxx +2 -0
  196. data/ext/couchbase/core/operations/management/view_index_get.hxx +2 -0
  197. data/ext/couchbase/core/operations/management/view_index_get_all.hxx +2 -0
  198. data/ext/couchbase/core/operations/management/view_index_upsert.hxx +2 -0
  199. data/ext/couchbase/core/operations/operation_traits.hxx +6 -0
  200. data/ext/couchbase/core/operations.hxx +0 -1
  201. data/ext/couchbase/core/operations_fwd.hxx +8 -0
  202. data/ext/couchbase/core/origin.cxx +67 -12
  203. data/ext/couchbase/core/origin.hxx +13 -8
  204. data/ext/couchbase/core/orphan_reporter.cxx +164 -0
  205. data/ext/couchbase/core/orphan_reporter.hxx +65 -0
  206. data/ext/couchbase/core/sasl/CMakeLists.txt +1 -0
  207. data/ext/couchbase/core/sasl/client.cc +6 -0
  208. data/ext/couchbase/core/sasl/mechanism.cc +2 -1
  209. data/ext/couchbase/core/sasl/mechanism.h +2 -1
  210. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.cc +41 -0
  211. data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.h +47 -0
  212. data/ext/couchbase/core/tls_context_provider.cxx +44 -0
  213. data/ext/couchbase/core/tls_context_provider.hxx +44 -0
  214. data/ext/couchbase/core/topology/configuration.cxx +21 -0
  215. data/ext/couchbase/core/topology/configuration.hxx +28 -0
  216. data/ext/couchbase/core/tracing/attribute_helpers.hxx +45 -0
  217. data/ext/couchbase/core/tracing/constants.hxx +148 -68
  218. data/ext/couchbase/core/tracing/threshold_logging_options.hxx +0 -3
  219. data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +122 -170
  220. data/ext/couchbase/core/tracing/tracer_wrapper.cxx +17 -24
  221. data/ext/couchbase/core/tracing/tracer_wrapper.hxx +8 -10
  222. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.cxx +114 -0
  223. data/ext/couchbase/core/tracing/wrapper_sdk_tracer.hxx +85 -0
  224. data/ext/couchbase/core/transactions/attempt_context_impl.cxx +16 -14
  225. data/ext/couchbase/core/transactions/attempt_context_impl.hxx +4 -4
  226. data/ext/couchbase/core/transactions/transactions.cxx +1 -1
  227. data/ext/couchbase/core/transactions/transactions_cleanup.cxx +1 -2
  228. data/ext/couchbase/core/utils/byteswap.hxx +12 -0
  229. data/ext/couchbase/core/utils/concurrent_fixed_priority_queue.hxx +102 -0
  230. data/ext/couchbase/core/utils/connection_string.cxx +2 -0
  231. data/ext/couchbase/core/utils/contains_string.cxx +61 -0
  232. data/ext/couchbase/core/utils/contains_string.hxx +26 -0
  233. data/ext/couchbase/couchbase/certificate_authenticator.hxx +1 -0
  234. data/ext/couchbase/couchbase/cluster.hxx +47 -0
  235. data/ext/couchbase/couchbase/cluster_options.hxx +16 -0
  236. data/ext/couchbase/couchbase/collection.hxx +133 -15
  237. data/ext/couchbase/couchbase/error.hxx +16 -0
  238. data/ext/couchbase/couchbase/error_codes.hxx +48 -48
  239. data/ext/couchbase/couchbase/jwt_authenticator.hxx +52 -0
  240. data/ext/couchbase/couchbase/metrics/meter.hxx +2 -1
  241. data/ext/couchbase/couchbase/metrics/otel_meter.hxx +75 -80
  242. data/ext/couchbase/couchbase/network_options.hxx +19 -0
  243. data/ext/couchbase/couchbase/node_id.hxx +123 -0
  244. data/ext/couchbase/couchbase/node_id_for_options.hxx +61 -0
  245. data/ext/couchbase/couchbase/node_ids_options.hxx +62 -0
  246. data/ext/couchbase/couchbase/password_authenticator.hxx +1 -0
  247. data/ext/couchbase/couchbase/result.hxx +42 -0
  248. data/ext/couchbase/couchbase/tracing/otel_tracer.hxx +15 -17
  249. data/ext/couchbase/couchbase/tracing/request_span.hxx +2 -2
  250. data/ext/couchbase.cxx +4 -0
  251. data/ext/extconf.rb +1 -0
  252. data/ext/rcb_analytics.cxx +157 -47
  253. data/ext/rcb_backend.cxx +118 -71
  254. data/ext/rcb_buckets.cxx +39 -16
  255. data/ext/rcb_collections.cxx +36 -12
  256. data/ext/rcb_crud.cxx +589 -294
  257. data/ext/rcb_hdr_histogram.cxx +219 -0
  258. data/ext/rcb_hdr_histogram.hxx +28 -0
  259. data/ext/rcb_logger.cxx +15 -17
  260. data/ext/rcb_multi.cxx +142 -59
  261. data/ext/rcb_observability.cxx +132 -0
  262. data/ext/rcb_observability.hxx +49 -0
  263. data/ext/rcb_query.cxx +77 -27
  264. data/ext/rcb_search.cxx +92 -31
  265. data/ext/rcb_users.cxx +69 -26
  266. data/ext/rcb_utils.cxx +91 -0
  267. data/ext/rcb_utils.hxx +141 -168
  268. data/ext/rcb_views.cxx +36 -12
  269. data/lib/active_support/cache/couchbase_store.rb +6 -6
  270. data/lib/couchbase/authenticator.rb +14 -0
  271. data/lib/couchbase/binary_collection.rb +37 -22
  272. data/lib/couchbase/bucket.rb +46 -31
  273. data/lib/couchbase/cluster.rb +146 -61
  274. data/lib/couchbase/collection.rb +257 -186
  275. data/lib/couchbase/datastructures/couchbase_list.rb +82 -50
  276. data/lib/couchbase/datastructures/couchbase_map.rb +87 -50
  277. data/lib/couchbase/datastructures/couchbase_queue.rb +65 -38
  278. data/lib/couchbase/datastructures/couchbase_set.rb +58 -41
  279. data/lib/couchbase/deprecations.rb +1 -1
  280. data/lib/couchbase/diagnostics.rb +8 -8
  281. data/lib/couchbase/errors.rb +7 -1
  282. data/lib/couchbase/json_transcoder.rb +1 -1
  283. data/lib/couchbase/management/analytics_index_manager.rb +90 -59
  284. data/lib/couchbase/management/bucket_manager.rb +73 -45
  285. data/lib/couchbase/management/collection_manager.rb +86 -43
  286. data/lib/couchbase/management/collection_query_index_manager.rb +56 -33
  287. data/lib/couchbase/management/query_index_manager.rb +88 -36
  288. data/lib/couchbase/management/scope_search_index_manager.rb +119 -52
  289. data/lib/couchbase/management/search_index_manager.rb +401 -178
  290. data/lib/couchbase/management/user_manager.rb +343 -174
  291. data/lib/couchbase/management/view_index_manager.rb +166 -73
  292. data/lib/couchbase/metrics/logging_meter.rb +108 -0
  293. data/lib/couchbase/metrics/logging_value_recorder.rb +50 -0
  294. data/lib/couchbase/metrics/meter.rb +27 -0
  295. data/lib/couchbase/metrics/noop_meter.rb +30 -0
  296. data/lib/couchbase/metrics/noop_value_recorder.rb +27 -0
  297. data/lib/couchbase/metrics/value_recorder.rb +25 -0
  298. data/lib/couchbase/options.rb +71 -5
  299. data/lib/couchbase/protostellar/client.rb +0 -2
  300. data/lib/couchbase/protostellar/cluster.rb +7 -0
  301. data/lib/couchbase/protostellar/generated/admin/analytics/v1/analytics_pb.rb +54 -0
  302. data/lib/couchbase/protostellar/generated/admin/analytics/v1/analytics_services_pb.rb +51 -0
  303. data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_pb.rb +5 -24
  304. data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_services_pb.rb +16 -0
  305. data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_pb.rb +5 -24
  306. data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_services_pb.rb +16 -0
  307. data/lib/couchbase/protostellar/generated/admin/query/v1/query_pb.rb +5 -24
  308. data/lib/couchbase/protostellar/generated/admin/query/v1/query_services_pb.rb +18 -0
  309. data/lib/couchbase/protostellar/generated/admin/search/v1/search_pb.rb +2 -23
  310. data/lib/couchbase/protostellar/generated/admin/search/v1/search_services_pb.rb +23 -0
  311. data/lib/couchbase/protostellar/generated/analytics/v1/analytics_pb.rb +4 -25
  312. data/lib/couchbase/protostellar/generated/analytics/v1/analytics_services_pb.rb +10 -0
  313. data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_pb.rb +6 -25
  314. data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_services_pb.rb +18 -0
  315. data/lib/couchbase/protostellar/generated/internal/xdcr/v1/xdcr_pb.rb +46 -0
  316. data/lib/couchbase/protostellar/generated/internal/xdcr/v1/xdcr_services_pb.rb +56 -0
  317. data/lib/couchbase/protostellar/generated/kv/v1/kv_pb.rb +3 -26
  318. data/lib/couchbase/protostellar/generated/kv/v1/kv_services_pb.rb +47 -0
  319. data/lib/couchbase/protostellar/generated/query/v1/query_pb.rb +4 -26
  320. data/lib/couchbase/protostellar/generated/query/v1/query_services_pb.rb +10 -0
  321. data/lib/couchbase/protostellar/generated/routing/v2/routing_pb.rb +26 -0
  322. data/lib/couchbase/protostellar/generated/routing/v2/routing_services_pb.rb +43 -0
  323. data/lib/couchbase/protostellar/generated/search/v1/search_pb.rb +5 -26
  324. data/lib/couchbase/protostellar/generated/search/v1/search_services_pb.rb +11 -0
  325. data/lib/couchbase/protostellar/generated/transactions/v1/transactions_pb.rb +2 -23
  326. data/lib/couchbase/protostellar/generated/transactions/v1/transactions_services_pb.rb +30 -0
  327. data/lib/couchbase/protostellar/generated/view/v1/view_pb.rb +2 -23
  328. data/lib/couchbase/protostellar/generated/view/v1/view_services_pb.rb +9 -0
  329. data/lib/couchbase/protostellar/request_generator/admin/collection.rb +4 -2
  330. data/lib/couchbase/protostellar/request_generator/admin/query.rb +2 -0
  331. data/lib/couchbase/protostellar/request_generator/kv.rb +1 -1
  332. data/lib/couchbase/protostellar/scope.rb +4 -0
  333. data/lib/couchbase/scope.rb +62 -48
  334. data/lib/couchbase/search_options.rb +18 -18
  335. data/lib/couchbase/tracing/noop_span.rb +29 -0
  336. data/lib/couchbase/tracing/noop_tracer.rb +29 -0
  337. data/lib/couchbase/tracing/request_span.rb +34 -0
  338. data/lib/couchbase/tracing/request_tracer.rb +28 -0
  339. data/lib/couchbase/tracing/threshold_logging_span.rb +112 -0
  340. data/lib/couchbase/tracing/threshold_logging_tracer.rb +231 -0
  341. data/lib/couchbase/utils/hdr_histogram.rb +55 -0
  342. data/lib/couchbase/utils/observability.rb +263 -0
  343. data/lib/couchbase/utils/observability_constants.rb +200 -0
  344. data/lib/couchbase/utils/stdlib_logger_adapter.rb +1 -3
  345. data/lib/couchbase/version.rb +1 -1
  346. data/lib/couchbase.rb +2 -2
  347. metadata +72 -8
  348. data/lib/couchbase/protostellar/generated/routing/v1/routing_pb.rb +0 -52
  349. data/lib/couchbase/protostellar/generated/routing/v1/routing_services_pb.rb +0 -30
@@ -28,13 +28,6 @@ struct supports_sticky_node : public std::false_type {
28
28
  template<typename T>
29
29
  inline constexpr bool supports_sticky_node_v = supports_sticky_node<T>::value;
30
30
 
31
- template<typename T>
32
- struct supports_parent_span : public std::false_type {
33
- };
34
-
35
- template<typename T>
36
- inline constexpr bool supports_parent_span_v = supports_parent_span<T>::value;
37
-
38
31
  template<typename T>
39
32
  struct supports_readonly : public std::false_type {
40
33
  };
@@ -21,6 +21,7 @@
21
21
  #include "core/document_id_fmt.hxx"
22
22
  #include "core/error_context/key_value_error_map_info.hxx"
23
23
  #include "core/metrics/meter_wrapper.hxx"
24
+ #include "core/operations/operation_traits.hxx"
24
25
  #include "core/platform/uuid.h"
25
26
  #include "core/protocol/client_request.hxx"
26
27
  #include "core/protocol/client_response.hxx"
@@ -66,10 +67,14 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
66
67
  std::string id_{ fmt::format("{:02x}/{}",
67
68
  static_cast<std::uint8_t>(encoded_request_type::body_type::opcode),
68
69
  uuid::to_string(uuid::random())) };
70
+ #ifdef COUCHBASE_CXX_CLIENT_CREATE_OPERATION_SPAN_IN_CORE
69
71
  std::shared_ptr<couchbase::tracing::request_span> span_{ nullptr };
70
- std::shared_ptr<couchbase::tracing::request_span> parent_span{ nullptr };
72
+ #endif
73
+ std::shared_ptr<couchbase::tracing::request_span> parent_span_{ nullptr };
71
74
  std::optional<std::string> last_dispatched_from_{};
72
75
  std::optional<std::string> last_dispatched_to_{};
76
+ std::chrono::time_point<std::chrono::steady_clock> started_at_{};
77
+ std::vector<std::chrono::microseconds> server_durations_{};
73
78
 
74
79
  mcbp_command(asio::io_context& ctx,
75
80
  std::shared_ptr<Manager> manager,
@@ -80,6 +85,7 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
80
85
  , request(req)
81
86
  , manager_(manager)
82
87
  , timeout_(request.timeout.value_or(default_timeout))
88
+ , parent_span_(request.parent_span)
83
89
  {
84
90
  if constexpr (io::mcbp_traits::supports_durability_v<Request>) {
85
91
  if (request.durability_level != durability_level::none &&
@@ -93,19 +99,19 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
93
99
  timeout_ = durability_timeout_floor;
94
100
  }
95
101
  }
96
- if constexpr (io::mcbp_traits::supports_parent_span_v<Request>) {
97
- parent_span = request.parent_span;
98
- }
99
102
  }
100
103
 
101
104
  void start(mcbp_command_handler&& handler)
102
105
  {
106
+ started_at_ = std::chrono::steady_clock::now();
107
+ #ifdef COUCHBASE_CXX_CLIENT_CREATE_OPERATION_SPAN_IN_CORE
103
108
  span_ = manager_->tracer()->create_span(
104
- tracing::span_name_for_mcbp_command(encoded_request_type::body_type::opcode), parent_span);
109
+ tracing::span_name_for_mcbp_command(encoded_request_type::body_type::opcode), parent_span_);
105
110
  if (span_->uses_tags()) {
106
- span_->add_tag(tracing::attributes::service, tracing::service::key_value);
107
- span_->add_tag(tracing::attributes::instance, request.id.bucket());
111
+ span_->add_tag(tracing::attributes::op::service, tracing::service::key_value);
112
+ span_->add_tag(tracing::attributes::op::bucket_name, request.id.bucket());
108
113
  }
114
+ #endif
109
115
 
110
116
  handler_ = std::move(handler);
111
117
  deadline.expires_after(timeout_);
@@ -115,20 +121,32 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
115
121
  }
116
122
  self->cancel(retry_reason::do_not_retry);
117
123
  });
124
+
125
+ if constexpr (is_cancellable_operation_v<Request>) {
126
+ request.cancel_token->setup([weak_self = this->weak_from_this()] {
127
+ if (auto self = weak_self.lock()) {
128
+ self->cancel(retry_reason::do_not_retry, false);
129
+ }
130
+ });
131
+ }
118
132
  }
119
133
 
120
- void cancel(retry_reason reason)
134
+ void cancel(retry_reason reason, bool is_timeout = true)
121
135
  {
122
136
  if (opaque_ && session_) {
123
137
  if (session_->cancel(opaque_.value(), asio::error::operation_aborted, reason)) {
124
138
  handler_ = nullptr;
125
139
  }
126
140
  }
127
- invoke_handler(
128
- request.retries.idempotent() || !opaque_.has_value()
129
- ? errc::common::unambiguous_timeout // safe to retry or has not been sent to the server
130
- : errc::common::ambiguous_timeout // non-idempotent and has been sent to the server
131
- );
141
+ if (is_timeout) {
142
+ invoke_handler(
143
+ request.retries.idempotent() || !opaque_.has_value()
144
+ ? errc::common::unambiguous_timeout // safe to retry or has not been sent to the server
145
+ : errc::common::ambiguous_timeout // non-idempotent and has been sent to the server
146
+ );
147
+ } else {
148
+ invoke_handler(errc::common::request_canceled);
149
+ }
132
150
  }
133
151
 
134
152
  void invoke_handler(std::error_code ec, std::optional<io::mcbp_message>&& msg = {})
@@ -137,15 +155,12 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
137
155
  deadline.cancel();
138
156
  mcbp_command_handler handler{};
139
157
  std::swap(handler, handler_);
158
+ #ifdef COUCHBASE_CXX_CLIENT_CREATE_OPERATION_SPAN_IN_CORE
140
159
  if (span_ != nullptr) {
141
- if (msg) {
142
- auto server_duration_us =
143
- static_cast<std::uint64_t>(protocol::parse_server_duration_us(msg.value()));
144
- span_->add_tag(tracing::attributes::server_duration, server_duration_us);
145
- }
146
160
  span_->end();
147
161
  span_ = nullptr;
148
162
  }
163
+ #endif
149
164
  if (handler) {
150
165
  const auto& node_uuid = session_ ? session_->node_uuid() : "";
151
166
  auto telemetry_recorder =
@@ -232,9 +247,6 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
232
247
  {
233
248
  opaque_ = session_->next_opaque();
234
249
  request.opaque = *opaque_;
235
- if (span_->uses_tags()) {
236
- span_->add_tag(tracing::attributes::operation_id, fmt::format("0x{:x}", request.opaque));
237
- }
238
250
  if (request.id.use_collections() && !request.id.is_collection_resolved()) {
239
251
  if (session_->supports_feature(protocol::hello_feature::collections)) {
240
252
  auto collection_id = session_->get_collection_uid(request.id.collection_path());
@@ -267,14 +279,23 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
267
279
  }
268
280
  }
269
281
 
282
+ auto dispatch_span = create_dispatch_span();
270
283
  session_->write_and_subscribe(
271
284
  request.opaque,
272
285
  encoded.data(session_->supports_feature(protocol::hello_feature::snappy)),
273
- [self = this->shared_from_this(), start = std::chrono::steady_clock::now()](
286
+ [self = this->shared_from_this(),
287
+ start = std::chrono::steady_clock::now(),
288
+ dispatch_span = std::move(dispatch_span)](
274
289
  std::error_code ec,
275
290
  retry_reason reason,
276
291
  io::mcbp_message&& msg,
277
292
  std::optional<key_value_error_map_info> /* error_info */) mutable {
293
+ {
294
+ const auto server_duration_us =
295
+ static_cast<std::uint64_t>(protocol::parse_server_duration_us(msg));
296
+ self->server_durations_.emplace_back(std::chrono::microseconds(server_duration_us));
297
+ self->close_dispatch_span(dispatch_span, server_duration_us);
298
+ }
278
299
  {
279
300
  auto latency = std::chrono::duration_cast<std::chrono::milliseconds>(
280
301
  std::chrono::steady_clock::now() - start);
@@ -304,30 +325,30 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
304
325
  telemetry_recorder->record_latency(category, latency);
305
326
  }
306
327
 
307
- metrics::metric_attributes attrs{
308
- service_type::key_value,
309
- self->request.observability_identifier,
310
- ec,
311
- self->request.id.bucket(),
312
- self->request.id.scope(),
313
- self->request.id.collection(),
314
- };
315
- self->manager_->meter()->record_value(std::move(attrs), start);
328
+ #ifdef COUCHBASE_CXX_CLIENT_CREATE_OPERATION_SPAN_IN_CORE
329
+ {
330
+ metrics::metric_attributes attrs{
331
+ service_type::key_value,
332
+ self->request.observability_identifier,
333
+ ec,
334
+ self->request.id.bucket(),
335
+ self->request.id.scope(),
336
+ self->request.id.collection(),
337
+ };
338
+ self->manager_->meter()->record_value(std::move(attrs), start);
339
+ }
340
+ #endif
316
341
 
317
342
  self->retry_backoff.cancel();
318
343
  if (ec == asio::error::operation_aborted) {
319
- if (self->span_->uses_tags()) {
320
- self->span_->add_tag(tracing::attributes::orphan, "aborted");
321
- }
344
+ self->manager_->orphan_reporter()->add_orphan(self->create_orphan_attributes());
322
345
  return self->invoke_handler(make_error_code(self->request.retries.idempotent()
323
346
  ? errc::common::unambiguous_timeout
324
347
  : errc::common::ambiguous_timeout));
325
348
  }
326
349
  if (ec == errc::common::request_canceled) {
327
350
  if (!self->request.retries.idempotent() && !allows_non_idempotent_retry(reason)) {
328
- if (self->span_->uses_tags()) {
329
- self->span_->add_tag(tracing::attributes::orphan, "canceled");
330
- }
351
+ self->manager_->orphan_reporter()->add_orphan(self->create_orphan_attributes());
331
352
  return self->invoke_handler(ec);
332
353
  }
333
354
  return io::retry_orchestrator::maybe_retry(self->manager_, self, reason, ec);
@@ -395,18 +416,76 @@ struct mcbp_command : public std::enable_shared_from_this<mcbp_command<Manager,
395
416
 
396
417
  void send_to(io::mcbp_session session)
397
418
  {
398
- if (!handler_ || !span_) {
419
+ if (!handler_) {
420
+ #ifdef COUCHBASE_CXX_CLIENT_CREATE_OPERATION_SPAN_IN_CORE
421
+ if (!span_) {
422
+ // TODO(DC): Is this necessary? Background:
423
+ // https://github.com/couchbase/couchbase-cxx-client/pull/160
424
+ return;
425
+ }
426
+ #endif
399
427
  return;
400
428
  }
401
429
  session_ = std::move(session);
402
- if (span_->uses_tags())
403
- span_->add_tag(tracing::attributes::remote_socket, session_->remote_address());
404
- if (span_->uses_tags())
405
- span_->add_tag(tracing::attributes::local_socket, session_->local_address());
406
- if (span_->uses_tags())
407
- span_->add_tag(tracing::attributes::local_id, session_->id());
408
430
  send();
409
431
  }
432
+
433
+ private:
434
+ [[nodiscard]] auto create_orphan_attributes() -> orphan_attributes
435
+ {
436
+ orphan_attributes attrs;
437
+
438
+ attrs.operation_name = Request::observability_identifier;
439
+ attrs.connection_id = session_->id();
440
+ attrs.operation_id = fmt::format("0x{:x}", request.opaque);
441
+ attrs.last_remote_socket = session_->remote_address();
442
+ attrs.last_local_socket = session_->local_address();
443
+ if (!server_durations_.empty()) {
444
+ attrs.last_server_duration = server_durations_.back();
445
+ for (const auto d : server_durations_) {
446
+ attrs.total_server_duration += d;
447
+ }
448
+ }
449
+ attrs.total_duration = std::chrono::duration_cast<std::chrono::microseconds>(
450
+ std::chrono::steady_clock::now() - started_at_);
451
+
452
+ return attrs;
453
+ }
454
+
455
+ [[nodiscard]] auto create_dispatch_span() const
456
+ -> std::shared_ptr<couchbase::tracing::request_span>
457
+ {
458
+ #ifdef COUCHBASE_CXX_CLIENT_CREATE_OPERATION_SPAN_IN_CORE
459
+ std::shared_ptr<couchbase::tracing::request_span> dispatch_span =
460
+ manager_->tracer()->create_span(tracing::operation::step_dispatch, span_);
461
+ #else
462
+ std::shared_ptr<couchbase::tracing::request_span> dispatch_span =
463
+ manager_->tracer()->create_span(tracing::operation::step_dispatch, parent_span_);
464
+ #endif
465
+ if (dispatch_span->uses_tags()) {
466
+ dispatch_span->add_tag(tracing::attributes::dispatch::network_transport, "tcp");
467
+ dispatch_span->add_tag(tracing::attributes::dispatch::operation_id,
468
+ fmt::format("0x{:x}", request.opaque));
469
+ dispatch_span->add_tag(tracing::attributes::dispatch::local_id, session_->id());
470
+ }
471
+ return dispatch_span;
472
+ }
473
+
474
+ void close_dispatch_span(const std::shared_ptr<couchbase::tracing::request_span>& dispatch_span,
475
+ const std::uint64_t server_duration_us) const
476
+ {
477
+ if (dispatch_span->uses_tags()) {
478
+ dispatch_span->add_tag(tracing::attributes::dispatch::server_duration, server_duration_us);
479
+ dispatch_span->add_tag(tracing::attributes::dispatch::server_address,
480
+ session_->canonical_hostname());
481
+ dispatch_span->add_tag(tracing::attributes::dispatch::server_port,
482
+ session_->canonical_port_number());
483
+ dispatch_span->add_tag(tracing::attributes::dispatch::peer_address,
484
+ session_->remote_hostname());
485
+ dispatch_span->add_tag(tracing::attributes::dispatch::peer_port, session_->remote_port());
486
+ }
487
+ dispatch_span->end();
488
+ }
410
489
  };
411
490
 
412
491
  } // namespace couchbase::core::operations