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
@@ -0,0 +1,77 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2025. Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License");
6
+ * you may not use this file except in compliance with the License.
7
+ * You may obtain a copy of the License at
8
+ *
9
+ * http://www.apache.org/licenses/LICENSE-2.0
10
+ *
11
+ * Unless required by applicable law or agreed to in writing, software
12
+ * distributed under the License is distributed on an "AS IS" BASIS,
13
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14
+ * See the License for the specific language governing permissions and
15
+ * limitations under the License.
16
+ */
17
+
18
+ #pragma once
19
+
20
+ #include <couchbase/analytics_options.hxx>
21
+ #include <couchbase/collection.hxx>
22
+ #include <couchbase/durability_level.hxx>
23
+ #include <couchbase/query_options.hxx>
24
+ #include <couchbase/tracing/request_span.hxx>
25
+
26
+ #include "core/metrics/meter_wrapper.hxx"
27
+ #include "core/tracing/constants.hxx"
28
+ #include "core/tracing/tracer_wrapper.hxx"
29
+
30
+ #include <memory>
31
+ #include <string>
32
+
33
+ namespace couchbase::core::impl
34
+ {
35
+ class observability_recorder
36
+ {
37
+ public:
38
+ static auto create(std::string op_name,
39
+ std::shared_ptr<couchbase::tracing::request_span> parent_span,
40
+ std::weak_ptr<tracing::tracer_wrapper> tracer,
41
+ std::weak_ptr<metrics::meter_wrapper> meter)
42
+ -> std::unique_ptr<observability_recorder>;
43
+
44
+ [[nodiscard]] auto operation_span() -> const std::shared_ptr<couchbase::tracing::request_span>&;
45
+
46
+ [[nodiscard]] auto create_request_encoding_span() const
47
+ -> std::shared_ptr<couchbase::tracing::request_span>;
48
+ [[nodiscard]] auto record_suboperation(std::string subop_name) const
49
+ -> std::unique_ptr<observability_recorder>;
50
+
51
+ void with_service(const std::string& service);
52
+ void with_collection_name(const std::string& collection_name);
53
+ void with_scope_name(const std::string& scope_name);
54
+ void with_bucket_name(const std::string& bucket_name);
55
+ void with_durability(couchbase::durability_level durability);
56
+ void with_query_statement(const std::string& statement,
57
+ const query_options::built& query_options);
58
+ void with_query_statement(const std::string& statement,
59
+ const analytics_options::built& analytics_options);
60
+
61
+ void finish(std::error_code ec);
62
+ void finish(std::size_t retry_attempts, std::error_code ec);
63
+
64
+ observability_recorder(std::string op_name,
65
+ std::shared_ptr<couchbase::tracing::request_span> parent_span,
66
+ std::weak_ptr<tracing::tracer_wrapper> tracer,
67
+ std::weak_ptr<metrics::meter_wrapper> meter);
68
+
69
+ private:
70
+ std::string op_name_;
71
+ std::weak_ptr<tracing::tracer_wrapper> tracer_;
72
+ std::weak_ptr<metrics::meter_wrapper> meter_;
73
+ std::shared_ptr<couchbase::tracing::request_span> span_;
74
+ std::chrono::time_point<std::chrono::steady_clock> start_time_;
75
+ metrics::metric_attributes metric_attributes_{};
76
+ };
77
+ } // namespace couchbase::core::impl
@@ -23,6 +23,7 @@
23
23
  #include "core/io/retry_context.hxx"
24
24
  #include "core/protocol/client_request.hxx"
25
25
  #include "core/protocol/cmd_observe_seqno.hxx"
26
+ #include "core/public_fwd.hxx"
26
27
  #include "core/timeout_defaults.hxx"
27
28
 
28
29
  namespace couchbase::core::impl
@@ -59,6 +60,7 @@ struct observe_seqno_request {
59
60
  std::uint16_t partition{};
60
61
  std::uint32_t opaque{};
61
62
  io::retry_context<true> retries{};
63
+ std::shared_ptr<couchbase::tracing::request_span> parent_span{ nullptr };
62
64
 
63
65
  [[nodiscard]] auto encode_to(encoded_request_type& encoded,
64
66
  core::mcbp_context&& context) const -> std::error_code;
@@ -18,7 +18,10 @@
18
18
  #include <couchbase/bucket.hxx>
19
19
 
20
20
  #include "core/cluster.hxx"
21
+ #include "core/tracing/constants.hxx"
22
+ #include "core/tracing/tracer_wrapper.hxx"
21
23
  #include "diagnostics.hxx"
24
+ #include "observability_recorder.hxx"
22
25
 
23
26
  #include <couchbase/collection.hxx>
24
27
  #include <couchbase/collection_manager.hxx>
@@ -63,16 +66,37 @@ public:
63
66
 
64
67
  void ping(const ping_options::built& options, ping_handler&& handler) const
65
68
  {
66
- return core_.ping(options.report_id,
67
- name_,
68
- core::impl::to_core_service_types(options.service_types),
69
- options.timeout,
70
- [handler = std::move(handler)](const auto& resp) mutable {
71
- return handler({}, core::impl::build_result(resp));
72
- });
69
+ auto obs_rec = create_observability_recorder(
70
+ core::tracing::operation::ping, std::nullopt, options.parent_span);
71
+ return core_.ping(
72
+ options.report_id,
73
+ name_,
74
+ core::impl::to_core_service_types(options.service_types),
75
+ options.timeout,
76
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
77
+ obs_rec->finish({});
78
+ return handler({}, core::impl::build_result(resp));
79
+ });
73
80
  }
74
81
 
75
82
  private:
83
+ [[nodiscard]] auto create_observability_recorder(
84
+ const std::string& operation_name,
85
+ const std::optional<core::service_type> service,
86
+ const std::shared_ptr<tracing::request_span>& parent_span) const
87
+ -> std::unique_ptr<core::impl::observability_recorder>
88
+ {
89
+ auto rec = core::impl::observability_recorder::create(
90
+ operation_name, parent_span, core_.tracer(), core_.meter());
91
+
92
+ rec->with_bucket_name(name_);
93
+ if (service.has_value()) {
94
+ rec->with_service(core::tracing::service_name_for_http_service(service.value()));
95
+ }
96
+
97
+ return rec;
98
+ }
99
+
76
100
  core::cluster core_;
77
101
  std::string name_;
78
102
  std::shared_ptr<crypto::manager> crypto_manager_;
@@ -25,12 +25,15 @@
25
25
  #include "core/io/ip_protocol.hxx"
26
26
  #include "core/origin.hxx"
27
27
  #include "core/tls_verify_mode.hxx"
28
+ #include "core/tracing/constants.hxx"
29
+ #include "core/tracing/tracer_wrapper.hxx"
28
30
  #include "core/transactions.hxx"
29
31
  #include "core/utils/connection_string.hxx"
30
32
  #include "core/utils/movable_function.hxx"
31
33
  #include "diagnostics.hxx"
32
34
  #include "error.hxx"
33
35
  #include "internal_search_result.hxx"
36
+ #include "observability_recorder.hxx"
34
37
  #include "query.hxx"
35
38
  #include "search.hxx"
36
39
 
@@ -87,6 +90,7 @@ options_to_origin(const std::string& connection_string, cluster_options::built o
87
90
  auth.password = std::move(opts.password);
88
91
  auth.certificate_path = std::move(opts.certificate_path);
89
92
  auth.key_path = std::move(opts.key_path);
93
+ auth.jwt_token = std::move(opts.jwt_token);
90
94
  auth.allowed_sasl_mechanisms = std::move(opts.allowed_sasl_mechanisms);
91
95
 
92
96
  core::cluster_options user_options;
@@ -146,6 +150,7 @@ options_to_origin(const std::string& connection_string, cluster_options::built o
146
150
  user_options.tcp_keep_alive_interval = opts.network.tcp_keep_alive_interval;
147
151
  user_options.config_poll_interval = opts.network.config_poll_interval;
148
152
  user_options.idle_http_connection_timeout = opts.network.idle_http_connection_timeout;
153
+ user_options.enable_lazy_connections = opts.network.enable_lazy_connections;
149
154
  if (opts.network.max_http_connections) {
150
155
  user_options.max_http_connections = opts.network.max_http_connections.value();
151
156
  }
@@ -178,8 +183,8 @@ options_to_origin(const std::string& connection_string, cluster_options::built o
178
183
  user_options.enable_tracing = opts.tracing.enabled;
179
184
  if (opts.tracing.enabled) {
180
185
  user_options.tracer = opts.tracing.tracer;
181
- user_options.tracing_options.orphaned_emit_interval = opts.tracing.orphaned_emit_interval;
182
- user_options.tracing_options.orphaned_sample_size = opts.tracing.orphaned_sample_size;
186
+ user_options.orphan_options.emit_interval = opts.tracing.orphaned_emit_interval;
187
+ user_options.orphan_options.sample_size = opts.tracing.orphaned_sample_size;
183
188
 
184
189
  user_options.tracing_options.threshold_emit_interval = opts.tracing.threshold_emit_interval;
185
190
  user_options.tracing_options.threshold_sample_size = opts.tracing.threshold_sample_size;
@@ -320,9 +325,16 @@ public:
320
325
 
321
326
  void query(std::string statement, query_options::built options, query_handler&& handler) const
322
327
  {
328
+ auto obs_rec = create_observability_recorder(
329
+ core::tracing::operation::query, core::service_type::query, options.parent_span);
330
+ obs_rec->with_query_statement(statement, options);
331
+
332
+ auto request = core::impl::build_query_request(
333
+ std::move(statement), {}, std::move(options), obs_rec->operation_span());
334
+
323
335
  return core_.execute(
324
- core::impl::build_query_request(std::move(statement), {}, std::move(options)),
325
- [handler = std::move(handler)](auto resp) {
336
+ std::move(request), [obs_rec = std::move(obs_rec), handler = std::move(handler)](auto resp) {
337
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
326
338
  return handler(core::impl::make_error(resp.ctx), core::impl::build_result(resp));
327
339
  });
328
340
  }
@@ -331,30 +343,45 @@ public:
331
343
  analytics_options::built options,
332
344
  analytics_handler&& handler) const
333
345
  {
346
+ auto obs_rec = create_observability_recorder(
347
+ core::tracing::operation::analytics, core::service_type::analytics, options.parent_span);
348
+ obs_rec->with_query_statement(statement, options);
349
+
350
+ auto request = core::impl::build_analytics_request(
351
+ std::move(statement), std::move(options), {}, {}, obs_rec->operation_span());
352
+
334
353
  return core_.execute(
335
- core::impl::build_analytics_request(std::move(statement), std::move(options), {}, {}),
336
- [handler = std::move(handler)](auto resp) {
354
+ std::move(request), [obs_rec = std::move(obs_rec), handler = std::move(handler)](auto resp) {
355
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
337
356
  return handler(core::impl::make_error(resp.ctx), core::impl::build_result(resp));
338
357
  });
339
358
  }
340
359
 
341
360
  void ping(const ping_options::built& options, ping_handler&& handler) const
342
361
  {
343
- return core_.ping(options.report_id,
344
- {},
345
- core::impl::to_core_service_types(options.service_types),
346
- options.timeout,
347
- [handler = std::move(handler)](const auto& resp) mutable {
348
- return handler({}, core::impl::build_result(resp));
349
- });
362
+ auto obs_rec = create_observability_recorder(
363
+ core::tracing::operation::ping, std::nullopt, options.parent_span);
364
+ return core_.ping(
365
+ options.report_id,
366
+ {},
367
+ core::impl::to_core_service_types(options.service_types),
368
+ options.timeout,
369
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
370
+ obs_rec->finish({});
371
+ return handler({}, core::impl::build_result(resp));
372
+ });
350
373
  };
351
374
 
352
375
  void diagnostics(const diagnostics_options::built& options, diagnostics_handler&& handler) const
353
376
  {
354
- return core_.diagnostics(options.report_id,
355
- [handler = std::move(handler)](const auto& resp) mutable {
356
- return handler({}, core::impl::build_result(resp));
357
- });
377
+ auto obs_rec = create_observability_recorder(
378
+ core::tracing::operation::diagnostics, std::nullopt, options.parent_span);
379
+ return core_.diagnostics(
380
+ options.report_id,
381
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
382
+ obs_rec->finish({});
383
+ return handler({}, core::impl::build_result(resp));
384
+ });
358
385
  }
359
386
 
360
387
  void search(std::string index_name,
@@ -362,14 +389,29 @@ public:
362
389
  const search_options::built& options,
363
390
  search_handler&& handler) const
364
391
  {
392
+ auto obs_rec = create_observability_recorder(
393
+ core::tracing::operation::search, core::service_type::search, options.parent_span);
394
+
395
+ auto core_req = core::impl::build_search_request(
396
+ std::move(index_name), std::move(request), options, {}, {}, obs_rec->operation_span());
365
397
  return core_.execute(
366
- core::impl::build_search_request(std::move(index_name), std::move(request), options, {}, {}),
367
- [handler = std::move(handler)](const auto& resp) mutable {
398
+ std::move(core_req),
399
+ [obs_rec = std::move(obs_rec), handler = std::move(handler)](const auto& resp) mutable {
400
+ obs_rec->finish(resp.ctx.retry_attempts, resp.ctx.ec);
368
401
  return handler(core::impl::make_error(resp.ctx),
369
402
  search_result{ internal_search_result{ resp } });
370
403
  });
371
404
  }
372
405
 
406
+ auto set_authenticator(const core::cluster_credentials& auth) const -> error
407
+ {
408
+ auto e = core_.update_credentials(auth);
409
+ if (e.ec) {
410
+ return core::impl::make_error(e);
411
+ }
412
+ return {};
413
+ }
414
+
373
415
  void notify_fork(fork_event event)
374
416
  {
375
417
  if (event == fork_event::prepare) {
@@ -427,6 +469,20 @@ private:
427
469
  }
428
470
  }
429
471
 
472
+ [[nodiscard]] auto create_observability_recorder(
473
+ const std::string& operation_name,
474
+ const std::optional<core::service_type> service,
475
+ const std::shared_ptr<tracing::request_span>& parent_span) const
476
+ -> std::unique_ptr<core::impl::observability_recorder>
477
+ {
478
+ auto rec = core::impl::observability_recorder::create(
479
+ operation_name, parent_span, core_.tracer(), core_.meter());
480
+ if (service.has_value()) {
481
+ rec->with_service(core::tracing::service_name_for_http_service(service.value()));
482
+ }
483
+ return rec;
484
+ }
485
+
430
486
  std::string connection_string_;
431
487
  cluster_options::built options_;
432
488
  asio::io_context io_{ ASIO_CONCURRENCY_HINT_SAFE };
@@ -633,6 +689,38 @@ cluster::close() -> std::future<void>
633
689
  return future;
634
690
  }
635
691
 
692
+ auto
693
+ cluster::set_authenticator(const password_authenticator& authenticator) -> couchbase::error
694
+ {
695
+ core::cluster_credentials auth;
696
+ auth.username = authenticator.username_;
697
+ auth.password = authenticator.password_;
698
+ if (authenticator.ldap_compatible_) {
699
+ auth.allowed_sasl_mechanisms = { { "PLAIN" } };
700
+ }
701
+
702
+ return impl_->set_authenticator(auth);
703
+ }
704
+
705
+ auto
706
+ cluster::set_authenticator(const certificate_authenticator& authenticator) -> couchbase::error
707
+ {
708
+ core::cluster_credentials auth;
709
+ auth.certificate_path = authenticator.certificate_path_;
710
+ auth.key_path = authenticator.key_path_;
711
+
712
+ return impl_->set_authenticator(auth);
713
+ }
714
+
715
+ auto
716
+ cluster::set_authenticator(const jwt_authenticator& authenticator) -> error
717
+ {
718
+ core::cluster_credentials auth;
719
+ auth.jwt_token = authenticator.token_;
720
+
721
+ return impl_->set_authenticator(auth);
722
+ }
723
+
636
724
  auto
637
725
  cluster::query_indexes() const -> query_index_manager
638
726
  {
@@ -167,7 +167,9 @@ build_result(operations::query_response& resp) -> query_result
167
167
  auto
168
168
  build_query_request(std::string statement,
169
169
  std::optional<std::string> query_context,
170
- query_options::built options) -> core::operations::query_request
170
+ query_options::built options,
171
+ std::shared_ptr<couchbase::tracing::request_span> op_span)
172
+ -> core::operations::query_request
171
173
  {
172
174
  operations::query_request request{
173
175
  std::move(statement), options.adhoc,
@@ -180,7 +182,7 @@ build_query_request(std::string statement,
180
182
  std::move(query_context), std::move(options.client_context_id),
181
183
  options.timeout, options.profile,
182
184
  };
183
- request.parent_span = options.parent_span;
185
+ request.parent_span = std::move(op_span);
184
186
  if (!options.raw.empty()) {
185
187
  for (auto& [name, value] : options.raw) {
186
188
  request.raw[name] = std::move(value);
@@ -232,6 +234,7 @@ build_transaction_query_result(operations::query_response resp,
232
234
  auto
233
235
  build_transaction_query_request(query_options::built opts) -> core::operations::query_request
234
236
  {
235
- return core::impl::build_query_request("", {}, std::move(opts));
237
+ auto parent_span_from_caller = opts.parent_span;
238
+ return core::impl::build_query_request("", {}, std::move(opts), parent_span_from_caller);
236
239
  }
237
240
  } // namespace couchbase::core::impl
@@ -26,7 +26,9 @@ namespace couchbase::core::impl
26
26
  auto
27
27
  build_query_request(std::string statement,
28
28
  std::optional<std::string> query_context,
29
- query_options::built options) -> core::operations::query_request;
29
+ query_options::built options,
30
+ std::shared_ptr<couchbase::tracing::request_span> op_span)
31
+ -> core::operations::query_request;
30
32
 
31
33
  auto
32
34
  build_result(operations::query_response& resp) -> query_result;