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,164 @@
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
+ #include "orphan_reporter.hxx"
19
+
20
+ #include <couchbase/build_info.hxx>
21
+
22
+ #include "logger/logger.hxx"
23
+ #include "utils/concurrent_fixed_priority_queue.hxx"
24
+ #include "utils/json.hxx"
25
+
26
+ #include <asio/steady_timer.hpp>
27
+ #include <tao/json/value.hpp>
28
+
29
+ namespace couchbase::core
30
+ {
31
+ auto
32
+ orphan_attributes::operator<(const orphan_attributes& other) const -> bool
33
+ {
34
+ return total_duration < other.total_duration;
35
+ }
36
+
37
+ auto
38
+ orphan_attributes::operator>(const orphan_attributes& other) const -> bool
39
+ {
40
+ return total_duration > other.total_duration;
41
+ }
42
+
43
+ auto
44
+ orphan_attributes::to_json() const -> tao::json::value
45
+ {
46
+ return tao::json::value{
47
+ { "total_duration_us", total_duration.count() },
48
+ { "last_server_duration_us", last_server_duration.count() },
49
+ { "total_server_duration_us", total_server_duration.count() },
50
+ { "operation_name", operation_name },
51
+ { "last_local_id", connection_id },
52
+ { "operation_id", operation_id },
53
+ { "last_local_socket", last_local_socket },
54
+ { "last_remote_socket", last_remote_socket },
55
+ };
56
+ }
57
+
58
+ class orphan_reporter_impl : public std::enable_shared_from_this<orphan_reporter_impl>
59
+ {
60
+ public:
61
+ orphan_reporter_impl(asio::io_context& ctx, const orphan_reporter_options& options)
62
+ : options_{ options }
63
+ , orphan_queue_{ options.sample_size }
64
+ , emit_timer_{ ctx }
65
+ {
66
+ }
67
+
68
+ void add_orphan(orphan_attributes&& orphan)
69
+ {
70
+ orphan_queue_.emplace(std::move(orphan));
71
+ }
72
+
73
+ void start()
74
+ {
75
+ rearm();
76
+ }
77
+
78
+ void stop()
79
+ {
80
+ emit_timer_.cancel();
81
+ }
82
+
83
+ auto flush_and_create_output() -> std::optional<std::string>
84
+ {
85
+ if (orphan_queue_.empty()) {
86
+ return std::nullopt;
87
+ }
88
+
89
+ auto [queue, dropped_count] = orphan_queue_.steal_data();
90
+
91
+ auto total_count = queue.size() + dropped_count;
92
+
93
+ // We only do orphan reporting for KV at the moment. If we extend this to HTTP services, we must
94
+ // update this to handle other types of services as well.
95
+ tao::json::value report{
96
+ #if COUCHBASE_CXX_CLIENT_DEBUG_BUILD
97
+ { "emit_interval_ms", options_.emit_interval.count() },
98
+ { "sample_size", options_.sample_size },
99
+ #endif
100
+ { "kv", tao::json::value{ { "total_count", total_count } } },
101
+ };
102
+
103
+ tao::json::value entries = tao::json::empty_array;
104
+ while (!queue.empty()) {
105
+ entries.emplace_back(queue.top().to_json());
106
+ queue.pop();
107
+ }
108
+ report["kv"]["top_requests"] = entries;
109
+
110
+ return utils::json::generate(report);
111
+ }
112
+
113
+ private:
114
+ void rearm()
115
+ {
116
+ emit_timer_.expires_after(options_.emit_interval);
117
+ emit_timer_.async_wait([self = shared_from_this()](std::error_code ec) -> void {
118
+ if (ec == asio::error::operation_aborted) {
119
+ return;
120
+ }
121
+
122
+ if (auto report = self->flush_and_create_output(); report.has_value()) {
123
+ CB_LOG_WARNING("Orphan responses observed: {}", report.value());
124
+ }
125
+
126
+ self->rearm();
127
+ });
128
+ }
129
+
130
+ orphan_reporter_options options_;
131
+ utils::concurrent_fixed_priority_queue<orphan_attributes> orphan_queue_;
132
+ asio::steady_timer emit_timer_;
133
+ };
134
+
135
+ orphan_reporter::orphan_reporter(asio::io_context& ctx, const orphan_reporter_options& options)
136
+ : impl_{ std::make_shared<orphan_reporter_impl>(ctx, options) }
137
+ {
138
+ }
139
+
140
+ void
141
+ orphan_reporter::add_orphan(orphan_attributes&& orphan)
142
+ {
143
+ impl_->add_orphan(std::move(orphan));
144
+ }
145
+
146
+ void
147
+ orphan_reporter::start()
148
+ {
149
+ impl_->start();
150
+ }
151
+
152
+ void
153
+ orphan_reporter::stop()
154
+ {
155
+ impl_->stop();
156
+ }
157
+
158
+ auto
159
+ orphan_reporter::flush_and_create_output() -> std::optional<std::string>
160
+ {
161
+ return impl_->flush_and_create_output();
162
+ }
163
+
164
+ } // namespace couchbase::core
@@ -0,0 +1,65 @@
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 "core/protocol/client_opcode.hxx"
21
+
22
+ #include <asio/io_context.hpp>
23
+ #include <tao/json/value.hpp>
24
+
25
+ #include <chrono>
26
+ #include <memory>
27
+
28
+ namespace couchbase::core
29
+ {
30
+ struct orphan_reporter_options {
31
+ std::chrono::milliseconds emit_interval{ std::chrono::seconds{ 10 } };
32
+ std::size_t sample_size{ 64 };
33
+ };
34
+
35
+ struct orphan_attributes {
36
+ std::string connection_id;
37
+ std::string operation_id;
38
+ std::string last_remote_socket;
39
+ std::string last_local_socket;
40
+ std::chrono::microseconds total_duration;
41
+ std::chrono::microseconds last_server_duration{ 0 };
42
+ std::chrono::microseconds total_server_duration{ 0 };
43
+ std::string operation_name;
44
+
45
+ auto operator<(const orphan_attributes& other) const -> bool;
46
+ auto operator>(const orphan_attributes& other) const -> bool;
47
+ auto to_json() const -> tao::json::value;
48
+ };
49
+
50
+ class orphan_reporter_impl;
51
+
52
+ class orphan_reporter
53
+ {
54
+ public:
55
+ orphan_reporter(asio::io_context& ctx, const orphan_reporter_options& options);
56
+
57
+ void add_orphan(orphan_attributes&& orphan);
58
+ void start();
59
+ void stop();
60
+ auto flush_and_create_output() -> std::optional<std::string>;
61
+
62
+ private:
63
+ std::shared_ptr<orphan_reporter_impl> impl_;
64
+ };
65
+ } // namespace couchbase::core
@@ -3,6 +3,7 @@ add_library(
3
3
  client.cc
4
4
  context.cc
5
5
  mechanism.cc
6
+ oauthbearer/oauthbearer.cc
6
7
  plain/plain.cc
7
8
  scram-sha/scram-sha.cc
8
9
  scram-sha/stringutils.cc)
@@ -17,6 +17,7 @@
17
17
 
18
18
  #include "client.h"
19
19
 
20
+ #include "core/sasl/oauthbearer/oauthbearer.h"
20
21
  #include "core/sasl/plain/plain.h"
21
22
  #include "core/sasl/scram-sha/scram-sha.h"
22
23
 
@@ -43,6 +44,11 @@ ClientContext::ClientContext(GetUsernameCallback user_cb,
43
44
  break;
44
45
  case Mechanism::PLAIN:
45
46
  backend = std::make_unique<mechanism::plain::ClientBackend>(user_cb, password_cb, *this);
47
+ break;
48
+ case Mechanism::OAUTHBEARER:
49
+ backend =
50
+ std::make_unique<mechanism::oauthbearer::ClientBackend>(user_cb, password_cb, *this);
51
+ break;
46
52
  }
47
53
 
48
54
  if (!backend) {
@@ -30,7 +30,8 @@ select_mechanism(const std::vector<std::string>& available_mechanisms) -> Mechan
30
30
  { std::string{ "SCRAM-SHA512" }, Mechanism::SCRAM_SHA512 },
31
31
  { std::string{ "SCRAM-SHA256" }, Mechanism::SCRAM_SHA256 },
32
32
  { std::string{ "SCRAM-SHA1" }, Mechanism::SCRAM_SHA1 },
33
- { std::string{ "PLAIN" }, Mechanism::PLAIN }
33
+ { std::string{ "PLAIN" }, Mechanism::PLAIN },
34
+ { std::string{ "OAUTHBEARER" }, Mechanism::OAUTHBEARER },
34
35
  };
35
36
 
36
37
  for (const auto& [name, code] : mechs) {
@@ -30,7 +30,8 @@ enum class Mechanism {
30
30
  SCRAM_SHA512,
31
31
  SCRAM_SHA256,
32
32
  SCRAM_SHA1,
33
- PLAIN
33
+ PLAIN,
34
+ OAUTHBEARER,
34
35
  };
35
36
 
36
37
  class unknown_mechanism : public std::invalid_argument
@@ -0,0 +1,41 @@
1
+ /*
2
+ * Copyright 2018 Couchbase, Inc.
3
+ *
4
+ * Licensed under the Apache License, Version 2.0 (the "License");
5
+ * you may not use this file except in compliance with the License.
6
+ * You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software
11
+ * distributed under the License is distributed on an "AS IS" BASIS,
12
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13
+ * See the License for the specific language governing permissions and
14
+ * limitations under the License.
15
+ */
16
+
17
+ #include "oauthbearer.h"
18
+
19
+ #include <spdlog/fmt/bundled/core.h>
20
+
21
+ namespace couchbase::core::sasl::mechanism::oauthbearer
22
+ {
23
+ auto
24
+ ClientBackend::start() -> std::pair<error, std::string_view>
25
+ {
26
+ auto header = std::string{ "n,," };
27
+ header.push_back(0x01);
28
+ header.append(fmt::format("auth=Bearer {}", passwordCallback()));
29
+ header.push_back(0x01);
30
+ header.push_back(0x01);
31
+ client_message = header;
32
+ return { error::OK, client_message };
33
+ }
34
+
35
+ auto
36
+ ClientBackend::step(std::string_view /*input*/) -> std::pair<error, std::string_view>
37
+ {
38
+ throw std::logic_error("ClientBackend::step(): OAUTHBEARER auth should not call step");
39
+ }
40
+
41
+ } // namespace couchbase::core::sasl::mechanism::oauthbearer
@@ -0,0 +1,47 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2016 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
+ #pragma once
18
+
19
+ #include "core/sasl/client.h"
20
+
21
+ /// Extremely simple prototype of an OAUTHBEARER mechanism as
22
+ /// desceribed in https://datatracker.ietf.org/doc/html/rfc7628 and
23
+ /// https://datatracker.ietf.org/doc/html/rfc6750
24
+ namespace couchbase::core::sasl::mechanism::oauthbearer
25
+ {
26
+
27
+ class ClientBackend : public MechanismBackend
28
+ {
29
+ public:
30
+ ClientBackend(GetUsernameCallback& user_cb, GetPasswordCallback& password_cb, ClientContext& ctx)
31
+ : MechanismBackend(user_cb, password_cb, ctx)
32
+ {
33
+ }
34
+
35
+ [[nodiscard]] auto get_name() const -> std::string_view override
36
+ {
37
+ return "OAUTHBEARER";
38
+ }
39
+
40
+ auto start() -> std::pair<error, std::string_view> override;
41
+
42
+ auto step(std::string_view) -> std::pair<error, std::string_view> override;
43
+
44
+ private:
45
+ std::string client_message;
46
+ };
47
+ } // namespace couchbase::core::sasl::mechanism::oauthbearer
@@ -0,0 +1,44 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2022-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
6
+ * except in compliance with the License. You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software distributed under
11
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
12
+ * ANY KIND, either express or implied. See the License for the specific language governing
13
+ * permissions and limitations under the License.
14
+ */
15
+
16
+ #include "tls_context_provider.hxx"
17
+
18
+ #include <asio/ssl/context.hpp>
19
+
20
+ namespace couchbase::core
21
+ {
22
+
23
+ tls_context_provider::tls_context_provider()
24
+ : ctx_(std::make_shared<asio::ssl::context>(asio::ssl::context::tls_client))
25
+ {
26
+ }
27
+
28
+ tls_context_provider::tls_context_provider(std::shared_ptr<asio::ssl::context> ctx)
29
+ : ctx_(std::move(ctx))
30
+ {
31
+ }
32
+
33
+ auto
34
+ tls_context_provider::get_ctx() const -> std::shared_ptr<asio::ssl::context>
35
+ {
36
+ return std::atomic_load(&ctx_);
37
+ }
38
+
39
+ void
40
+ tls_context_provider::set_ctx(std::shared_ptr<asio::ssl::context> new_ctx)
41
+ {
42
+ std::atomic_store(&ctx_, std::move(new_ctx));
43
+ }
44
+ } // namespace couchbase::core
@@ -0,0 +1,44 @@
1
+ /* -*- Mode: C++; tab-width: 4; c-basic-offset: 4; indent-tabs-mode: nil -*- */
2
+ /*
3
+ * Copyright 2022-Present Couchbase, Inc.
4
+ *
5
+ * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file
6
+ * except in compliance with the License. You may obtain a copy of the License at
7
+ *
8
+ * http://www.apache.org/licenses/LICENSE-2.0
9
+ *
10
+ * Unless required by applicable law or agreed to in writing, software distributed under
11
+ * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF
12
+ * ANY KIND, either express or implied. See the License for the specific language governing
13
+ * permissions and limitations under the License.
14
+ */
15
+
16
+ #pragma once
17
+
18
+ #include <memory>
19
+
20
+ namespace asio
21
+ {
22
+ namespace ssl
23
+ {
24
+ class context;
25
+ } // namespace ssl
26
+ } // namespace asio
27
+
28
+ namespace couchbase::core
29
+ {
30
+
31
+ class tls_context_provider
32
+ {
33
+ public:
34
+ tls_context_provider();
35
+
36
+ explicit tls_context_provider(std::shared_ptr<asio::ssl::context> ctx);
37
+
38
+ void set_ctx(std::shared_ptr<asio::ssl::context> new_ctx);
39
+ [[nodiscard]] auto get_ctx() const -> std::shared_ptr<asio::ssl::context>;
40
+
41
+ private:
42
+ std::shared_ptr<asio::ssl::context> ctx_;
43
+ };
44
+ } // namespace couchbase::core
@@ -0,0 +1,45 @@
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/durability_level.hxx>
21
+ #include <couchbase/tracing/request_span.hxx>
22
+
23
+ #include "constants.hxx"
24
+
25
+ namespace couchbase::core::tracing
26
+ {
27
+ void inline set_durability_level_attribute(
28
+ const std::shared_ptr<couchbase::tracing::request_span>& span,
29
+ const durability_level durability)
30
+ {
31
+ switch (durability) {
32
+ case durability_level::none:
33
+ break;
34
+ case durability_level::majority:
35
+ span->add_tag(attributes::op::durability_level, "majority");
36
+ break;
37
+ case durability_level::majority_and_persist_to_active:
38
+ span->add_tag(attributes::op::durability_level, "majority_and_persist_active");
39
+ break;
40
+ case durability_level::persist_to_majority:
41
+ span->add_tag(attributes::op::durability_level, "persist_majority");
42
+ break;
43
+ }
44
+ }
45
+ } // namespace couchbase::core::tracing