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.
- checksums.yaml +4 -4
- data/README.md +3 -3
- data/ext/CMakeLists.txt +4 -1
- data/ext/cache/extconf_include.rb +4 -3
- data/ext/cache/mozilla-ca-bundle.crt +66 -665
- data/ext/cache/mozilla-ca-bundle.sha256 +1 -1
- data/ext/couchbase/CMakeLists.txt +26 -11
- data/ext/couchbase/cmake/APKBUILD.in +17 -1
- data/ext/couchbase/cmake/Bundler.cmake +9 -1
- data/ext/couchbase/cmake/Cache.cmake +48 -19
- data/ext/couchbase/cmake/CompilerOptions.cmake +3 -1
- data/ext/couchbase/cmake/OpenSSL.cmake +10 -2
- data/ext/couchbase/cmake/Packaging.cmake +48 -8
- data/ext/couchbase/cmake/ThirdPartyDependencies.cmake +43 -1
- data/ext/couchbase/cmake/build_config.hxx.in +2 -0
- data/ext/couchbase/cmake/couchbase-cxx-client.spec.in +18 -0
- data/ext/couchbase/cmake/tarball_glob.txt +10 -0
- data/ext/couchbase/core/app_telemetry_meter.cxx +1 -0
- data/ext/couchbase/core/app_telemetry_reporter.cxx +45 -43
- data/ext/couchbase/core/app_telemetry_reporter.hxx +4 -3
- data/ext/couchbase/core/bucket.cxx +128 -13
- data/ext/couchbase/core/bucket.hxx +12 -2
- data/ext/couchbase/core/cluster.cxx +304 -152
- data/ext/couchbase/core/cluster.hxx +32 -0
- data/ext/couchbase/core/cluster_credentials.cxx +25 -0
- data/ext/couchbase/core/cluster_credentials.hxx +5 -0
- data/ext/couchbase/core/cluster_label_listener.cxx +72 -0
- data/ext/couchbase/core/cluster_label_listener.hxx +46 -0
- data/ext/couchbase/core/cluster_options.hxx +4 -0
- data/ext/couchbase/core/deprecation_utils.hxx +26 -0
- data/ext/couchbase/core/error.hxx +27 -0
- data/ext/couchbase/core/error_context/base_error_context.hxx +32 -0
- data/ext/couchbase/core/error_context/key_value.cxx +1 -0
- data/ext/couchbase/core/error_context/key_value.hxx +23 -0
- data/ext/couchbase/core/error_context/key_value_error_context.hxx +35 -0
- data/ext/couchbase/core/error_context/subdocument_error_context.hxx +41 -0
- data/ext/couchbase/core/free_form_http_request.hxx +0 -2
- data/ext/couchbase/core/http_component.cxx +12 -48
- data/ext/couchbase/core/impl/analytics.cxx +3 -2
- data/ext/couchbase/core/impl/analytics.hxx +2 -1
- data/ext/couchbase/core/impl/analytics_index_manager.cxx +249 -137
- data/ext/couchbase/core/impl/binary_collection.cxx +239 -128
- data/ext/couchbase/core/impl/bucket_manager.cxx +87 -35
- data/ext/couchbase/core/impl/collection.cxx +914 -372
- data/ext/couchbase/core/impl/collection_manager.cxx +89 -49
- data/ext/couchbase/core/impl/dns_srv_tracker.cxx +4 -4
- data/ext/couchbase/core/impl/error.cxx +49 -17
- data/ext/couchbase/core/impl/error.hxx +15 -10
- data/ext/couchbase/core/impl/get_all_replicas.hxx +1 -1
- data/ext/couchbase/core/impl/get_any_replica.hxx +2 -1
- data/ext/couchbase/core/impl/get_replica.hxx +2 -0
- data/ext/couchbase/core/impl/invoke_with_node_id.hxx +44 -0
- data/ext/couchbase/core/impl/lookup_in_replica.hxx +1 -1
- data/ext/couchbase/core/impl/node_id.cxx +110 -0
- data/ext/couchbase/core/impl/node_id.hxx +40 -0
- data/ext/couchbase/core/impl/observability_recorder.cxx +161 -0
- data/ext/couchbase/core/impl/observability_recorder.hxx +77 -0
- data/ext/couchbase/core/impl/observe_seqno.hxx +2 -0
- data/ext/couchbase/core/impl/public_bucket.cxx +31 -7
- data/ext/couchbase/core/impl/public_cluster.cxx +107 -19
- data/ext/couchbase/core/impl/query.cxx +6 -3
- data/ext/couchbase/core/impl/query.hxx +3 -1
- data/ext/couchbase/core/impl/query_index_manager.cxx +267 -102
- data/ext/couchbase/core/impl/scope.cxx +53 -11
- data/ext/couchbase/core/impl/search.cxx +8 -4
- data/ext/couchbase/core/impl/search.hxx +6 -2
- data/ext/couchbase/core/impl/search_index_manager.cxx +131 -41
- data/ext/couchbase/core/impl/with_cancellation.hxx +75 -0
- data/ext/couchbase/core/io/config_tracker.cxx +9 -9
- data/ext/couchbase/core/io/config_tracker.hxx +2 -1
- data/ext/couchbase/core/io/http_command.hxx +98 -49
- data/ext/couchbase/core/io/http_context.hxx +2 -0
- data/ext/couchbase/core/io/http_session.cxx +23 -10
- data/ext/couchbase/core/io/http_session.hxx +17 -9
- data/ext/couchbase/core/io/http_session_manager.hxx +245 -270
- data/ext/couchbase/core/io/http_traits.hxx +0 -7
- data/ext/couchbase/core/io/mcbp_command.hxx +123 -44
- data/ext/couchbase/core/io/mcbp_session.cxx +251 -26
- data/ext/couchbase/core/io/mcbp_session.hxx +9 -1
- data/ext/couchbase/core/io/mcbp_traits.hxx +0 -8
- data/ext/couchbase/core/io/streams.cxx +3 -3
- data/ext/couchbase/core/io/streams.hxx +3 -2
- data/ext/couchbase/core/meta/features.hxx +15 -0
- data/ext/couchbase/core/meta/version.cxx +13 -0
- data/ext/couchbase/core/meta/version.hxx +3 -0
- data/ext/couchbase/core/metrics/constants.hxx +23 -0
- data/ext/couchbase/core/metrics/logging_meter.cxx +5 -5
- data/ext/couchbase/core/metrics/meter_wrapper.cxx +65 -63
- data/ext/couchbase/core/metrics/meter_wrapper.hxx +12 -10
- data/ext/couchbase/core/operations/document_analytics.hxx +0 -5
- data/ext/couchbase/core/operations/document_append.hxx +0 -4
- data/ext/couchbase/core/operations/document_decrement.hxx +0 -5
- data/ext/couchbase/core/operations/document_exists.hxx +0 -7
- data/ext/couchbase/core/operations/document_get.hxx +0 -7
- data/ext/couchbase/core/operations/document_get_all_replicas.hxx +89 -29
- data/ext/couchbase/core/operations/document_get_and_lock.hxx +0 -9
- data/ext/couchbase/core/operations/document_get_and_touch.hxx +0 -9
- data/ext/couchbase/core/operations/document_get_any_replica.hxx +83 -2
- data/ext/couchbase/core/operations/document_get_projected.cxx +3 -4
- data/ext/couchbase/core/operations/document_get_projected.hxx +0 -9
- data/ext/couchbase/core/operations/document_increment.hxx +0 -5
- data/ext/couchbase/core/operations/document_insert.hxx +0 -4
- data/ext/couchbase/core/operations/document_lookup_in.hxx +0 -9
- data/ext/couchbase/core/operations/document_lookup_in_all_replicas.hxx +50 -4
- data/ext/couchbase/core/operations/document_lookup_in_any_replica.hxx +121 -43
- data/ext/couchbase/core/operations/document_mutate_in.hxx +0 -5
- data/ext/couchbase/core/operations/document_prepend.hxx +0 -4
- data/ext/couchbase/core/operations/document_query.cxx +12 -12
- data/ext/couchbase/core/operations/document_query.hxx +0 -4
- data/ext/couchbase/core/operations/document_remove.hxx +0 -4
- data/ext/couchbase/core/operations/document_replace.hxx +0 -4
- data/ext/couchbase/core/operations/document_search.hxx +0 -7
- data/ext/couchbase/core/operations/document_touch.hxx +0 -7
- data/ext/couchbase/core/operations/document_unlock.hxx +0 -6
- data/ext/couchbase/core/operations/document_upsert.hxx +0 -4
- data/ext/couchbase/core/operations/document_view.cxx +2 -0
- data/ext/couchbase/core/operations/document_view.hxx +10 -13
- data/ext/couchbase/core/operations/http_noop.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_dataset_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_dataset_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_dataset_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_dataverse_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_dataverse_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_get_pending_mutations.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_index_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_index_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_index_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_connect.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_disconnect.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/analytics_link_replace.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_describe.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_flush.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/bucket_update.hxx +2 -0
- data/ext/couchbase/core/operations/management/change_password.hxx +2 -0
- data/ext/couchbase/core/operations/management/cluster_describe.hxx +2 -0
- data/ext/couchbase/core/operations/management/cluster_developer_preview_enable.hxx +2 -0
- data/ext/couchbase/core/operations/management/collection_create.cxx +11 -11
- data/ext/couchbase/core/operations/management/collection_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/collection_drop.cxx +11 -11
- data/ext/couchbase/core/operations/management/collection_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/collection_update.cxx +11 -11
- data/ext/couchbase/core/operations/management/collection_update.hxx +2 -0
- data/ext/couchbase/core/operations/management/collections_manifest_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/error_utils.cxx +13 -7
- data/ext/couchbase/core/operations/management/eventing_deploy_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_drop_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_get_all_functions.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_get_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_get_status.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_pause_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_resume_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_undeploy_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/eventing_upsert_function.hxx +2 -0
- data/ext/couchbase/core/operations/management/freeform.hxx +2 -0
- data/ext/couchbase/core/operations/management/group_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/group_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/group_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/group_upsert.hxx +2 -0
- data/ext/couchbase/core/operations/management/query_index_build.hxx +2 -0
- data/ext/couchbase/core/operations/management/query_index_build_deferred.hxx +68 -30
- data/ext/couchbase/core/operations/management/query_index_create.cxx +5 -4
- data/ext/couchbase/core/operations/management/query_index_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/query_index_drop.cxx +7 -6
- data/ext/couchbase/core/operations/management/query_index_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/query_index_get_all.hxx +4 -3
- data/ext/couchbase/core/operations/management/query_index_get_all_deferred.hxx +2 -1
- data/ext/couchbase/core/operations/management/role_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/scope_create.cxx +12 -13
- data/ext/couchbase/core/operations/management/scope_create.hxx +2 -0
- data/ext/couchbase/core/operations/management/scope_drop.cxx +8 -9
- data/ext/couchbase/core/operations/management/scope_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/scope_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_get_stats.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_analyze_document.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_control_ingest.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_control_plan_freeze.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_control_query.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_get_documents_count.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_get_stats.hxx +2 -0
- data/ext/couchbase/core/operations/management/search_index_upsert.hxx +2 -0
- data/ext/couchbase/core/operations/management/user_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/user_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/user_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/user_upsert.hxx +2 -0
- data/ext/couchbase/core/operations/management/view_index_drop.hxx +2 -0
- data/ext/couchbase/core/operations/management/view_index_get.hxx +2 -0
- data/ext/couchbase/core/operations/management/view_index_get_all.hxx +2 -0
- data/ext/couchbase/core/operations/management/view_index_upsert.hxx +2 -0
- data/ext/couchbase/core/operations/operation_traits.hxx +6 -0
- data/ext/couchbase/core/operations.hxx +0 -1
- data/ext/couchbase/core/operations_fwd.hxx +8 -0
- data/ext/couchbase/core/origin.cxx +67 -12
- data/ext/couchbase/core/origin.hxx +13 -8
- data/ext/couchbase/core/orphan_reporter.cxx +164 -0
- data/ext/couchbase/core/orphan_reporter.hxx +65 -0
- data/ext/couchbase/core/sasl/CMakeLists.txt +1 -0
- data/ext/couchbase/core/sasl/client.cc +6 -0
- data/ext/couchbase/core/sasl/mechanism.cc +2 -1
- data/ext/couchbase/core/sasl/mechanism.h +2 -1
- data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.cc +41 -0
- data/ext/couchbase/core/sasl/oauthbearer/oauthbearer.h +47 -0
- data/ext/couchbase/core/tls_context_provider.cxx +44 -0
- data/ext/couchbase/core/tls_context_provider.hxx +44 -0
- data/ext/couchbase/core/topology/configuration.cxx +21 -0
- data/ext/couchbase/core/topology/configuration.hxx +28 -0
- data/ext/couchbase/core/tracing/attribute_helpers.hxx +45 -0
- data/ext/couchbase/core/tracing/constants.hxx +148 -68
- data/ext/couchbase/core/tracing/threshold_logging_options.hxx +0 -3
- data/ext/couchbase/core/tracing/threshold_logging_tracer.cxx +122 -170
- data/ext/couchbase/core/tracing/tracer_wrapper.cxx +17 -24
- data/ext/couchbase/core/tracing/tracer_wrapper.hxx +8 -10
- data/ext/couchbase/core/tracing/wrapper_sdk_tracer.cxx +114 -0
- data/ext/couchbase/core/tracing/wrapper_sdk_tracer.hxx +85 -0
- data/ext/couchbase/core/transactions/attempt_context_impl.cxx +16 -14
- data/ext/couchbase/core/transactions/attempt_context_impl.hxx +4 -4
- data/ext/couchbase/core/transactions/transactions.cxx +1 -1
- data/ext/couchbase/core/transactions/transactions_cleanup.cxx +1 -2
- data/ext/couchbase/core/utils/byteswap.hxx +12 -0
- data/ext/couchbase/core/utils/concurrent_fixed_priority_queue.hxx +102 -0
- data/ext/couchbase/core/utils/connection_string.cxx +2 -0
- data/ext/couchbase/core/utils/contains_string.cxx +61 -0
- data/ext/couchbase/core/utils/contains_string.hxx +26 -0
- data/ext/couchbase/couchbase/certificate_authenticator.hxx +1 -0
- data/ext/couchbase/couchbase/cluster.hxx +47 -0
- data/ext/couchbase/couchbase/cluster_options.hxx +16 -0
- data/ext/couchbase/couchbase/collection.hxx +133 -15
- data/ext/couchbase/couchbase/error.hxx +16 -0
- data/ext/couchbase/couchbase/error_codes.hxx +48 -48
- data/ext/couchbase/couchbase/jwt_authenticator.hxx +52 -0
- data/ext/couchbase/couchbase/metrics/meter.hxx +2 -1
- data/ext/couchbase/couchbase/metrics/otel_meter.hxx +75 -80
- data/ext/couchbase/couchbase/network_options.hxx +19 -0
- data/ext/couchbase/couchbase/node_id.hxx +123 -0
- data/ext/couchbase/couchbase/node_id_for_options.hxx +61 -0
- data/ext/couchbase/couchbase/node_ids_options.hxx +62 -0
- data/ext/couchbase/couchbase/password_authenticator.hxx +1 -0
- data/ext/couchbase/couchbase/result.hxx +42 -0
- data/ext/couchbase/couchbase/tracing/otel_tracer.hxx +15 -17
- data/ext/couchbase/couchbase/tracing/request_span.hxx +2 -2
- data/ext/couchbase.cxx +4 -0
- data/ext/extconf.rb +1 -0
- data/ext/rcb_analytics.cxx +157 -47
- data/ext/rcb_backend.cxx +118 -71
- data/ext/rcb_buckets.cxx +39 -16
- data/ext/rcb_collections.cxx +36 -12
- data/ext/rcb_crud.cxx +589 -294
- data/ext/rcb_hdr_histogram.cxx +219 -0
- data/ext/rcb_hdr_histogram.hxx +28 -0
- data/ext/rcb_logger.cxx +15 -17
- data/ext/rcb_multi.cxx +142 -59
- data/ext/rcb_observability.cxx +132 -0
- data/ext/rcb_observability.hxx +49 -0
- data/ext/rcb_query.cxx +77 -27
- data/ext/rcb_search.cxx +92 -31
- data/ext/rcb_users.cxx +69 -26
- data/ext/rcb_utils.cxx +91 -0
- data/ext/rcb_utils.hxx +141 -168
- data/ext/rcb_views.cxx +36 -12
- data/lib/active_support/cache/couchbase_store.rb +6 -6
- data/lib/couchbase/authenticator.rb +14 -0
- data/lib/couchbase/binary_collection.rb +37 -22
- data/lib/couchbase/bucket.rb +46 -31
- data/lib/couchbase/cluster.rb +146 -61
- data/lib/couchbase/collection.rb +257 -186
- data/lib/couchbase/datastructures/couchbase_list.rb +82 -50
- data/lib/couchbase/datastructures/couchbase_map.rb +87 -50
- data/lib/couchbase/datastructures/couchbase_queue.rb +65 -38
- data/lib/couchbase/datastructures/couchbase_set.rb +58 -41
- data/lib/couchbase/deprecations.rb +1 -1
- data/lib/couchbase/diagnostics.rb +8 -8
- data/lib/couchbase/errors.rb +7 -1
- data/lib/couchbase/json_transcoder.rb +1 -1
- data/lib/couchbase/management/analytics_index_manager.rb +90 -59
- data/lib/couchbase/management/bucket_manager.rb +73 -45
- data/lib/couchbase/management/collection_manager.rb +86 -43
- data/lib/couchbase/management/collection_query_index_manager.rb +56 -33
- data/lib/couchbase/management/query_index_manager.rb +88 -36
- data/lib/couchbase/management/scope_search_index_manager.rb +119 -52
- data/lib/couchbase/management/search_index_manager.rb +401 -178
- data/lib/couchbase/management/user_manager.rb +343 -174
- data/lib/couchbase/management/view_index_manager.rb +166 -73
- data/lib/couchbase/metrics/logging_meter.rb +108 -0
- data/lib/couchbase/metrics/logging_value_recorder.rb +50 -0
- data/lib/couchbase/metrics/meter.rb +27 -0
- data/lib/couchbase/metrics/noop_meter.rb +30 -0
- data/lib/couchbase/metrics/noop_value_recorder.rb +27 -0
- data/lib/couchbase/metrics/value_recorder.rb +25 -0
- data/lib/couchbase/options.rb +71 -5
- data/lib/couchbase/protostellar/client.rb +0 -2
- data/lib/couchbase/protostellar/cluster.rb +7 -0
- data/lib/couchbase/protostellar/generated/admin/analytics/v1/analytics_pb.rb +54 -0
- data/lib/couchbase/protostellar/generated/admin/analytics/v1/analytics_services_pb.rb +51 -0
- data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_pb.rb +5 -24
- data/lib/couchbase/protostellar/generated/admin/bucket/v1/bucket_services_pb.rb +16 -0
- data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_pb.rb +5 -24
- data/lib/couchbase/protostellar/generated/admin/collection/v1/collection_services_pb.rb +16 -0
- data/lib/couchbase/protostellar/generated/admin/query/v1/query_pb.rb +5 -24
- data/lib/couchbase/protostellar/generated/admin/query/v1/query_services_pb.rb +18 -0
- data/lib/couchbase/protostellar/generated/admin/search/v1/search_pb.rb +2 -23
- data/lib/couchbase/protostellar/generated/admin/search/v1/search_services_pb.rb +23 -0
- data/lib/couchbase/protostellar/generated/analytics/v1/analytics_pb.rb +4 -25
- data/lib/couchbase/protostellar/generated/analytics/v1/analytics_services_pb.rb +10 -0
- data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_pb.rb +6 -25
- data/lib/couchbase/protostellar/generated/internal/hooks/v1/hooks_services_pb.rb +18 -0
- data/lib/couchbase/protostellar/generated/internal/xdcr/v1/xdcr_pb.rb +46 -0
- data/lib/couchbase/protostellar/generated/internal/xdcr/v1/xdcr_services_pb.rb +56 -0
- data/lib/couchbase/protostellar/generated/kv/v1/kv_pb.rb +3 -26
- data/lib/couchbase/protostellar/generated/kv/v1/kv_services_pb.rb +47 -0
- data/lib/couchbase/protostellar/generated/query/v1/query_pb.rb +4 -26
- data/lib/couchbase/protostellar/generated/query/v1/query_services_pb.rb +10 -0
- data/lib/couchbase/protostellar/generated/routing/v2/routing_pb.rb +26 -0
- data/lib/couchbase/protostellar/generated/routing/v2/routing_services_pb.rb +43 -0
- data/lib/couchbase/protostellar/generated/search/v1/search_pb.rb +5 -26
- data/lib/couchbase/protostellar/generated/search/v1/search_services_pb.rb +11 -0
- data/lib/couchbase/protostellar/generated/transactions/v1/transactions_pb.rb +2 -23
- data/lib/couchbase/protostellar/generated/transactions/v1/transactions_services_pb.rb +30 -0
- data/lib/couchbase/protostellar/generated/view/v1/view_pb.rb +2 -23
- data/lib/couchbase/protostellar/generated/view/v1/view_services_pb.rb +9 -0
- data/lib/couchbase/protostellar/request_generator/admin/collection.rb +4 -2
- data/lib/couchbase/protostellar/request_generator/admin/query.rb +2 -0
- data/lib/couchbase/protostellar/request_generator/kv.rb +1 -1
- data/lib/couchbase/protostellar/scope.rb +4 -0
- data/lib/couchbase/scope.rb +62 -48
- data/lib/couchbase/search_options.rb +18 -18
- data/lib/couchbase/tracing/noop_span.rb +29 -0
- data/lib/couchbase/tracing/noop_tracer.rb +29 -0
- data/lib/couchbase/tracing/request_span.rb +34 -0
- data/lib/couchbase/tracing/request_tracer.rb +28 -0
- data/lib/couchbase/tracing/threshold_logging_span.rb +112 -0
- data/lib/couchbase/tracing/threshold_logging_tracer.rb +231 -0
- data/lib/couchbase/utils/hdr_histogram.rb +55 -0
- data/lib/couchbase/utils/observability.rb +263 -0
- data/lib/couchbase/utils/observability_constants.rb +200 -0
- data/lib/couchbase/utils/stdlib_logger_adapter.rb +1 -3
- data/lib/couchbase/version.rb +1 -1
- data/lib/couchbase.rb +2 -2
- metadata +72 -8
- data/lib/couchbase/protostellar/generated/routing/v1/routing_pb.rb +0 -52
- data/lib/couchbase/protostellar/generated/routing/v1/routing_services_pb.rb +0 -30
|
@@ -26,6 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
#include <tao/json.hpp>
|
|
28
28
|
|
|
29
|
+
#include <mutex>
|
|
29
30
|
#include <random>
|
|
30
31
|
#include <utility>
|
|
31
32
|
|
|
@@ -99,6 +100,19 @@ struct traits<couchbase::core::io::dns::dns_config> {
|
|
|
99
100
|
}
|
|
100
101
|
};
|
|
101
102
|
|
|
103
|
+
template<>
|
|
104
|
+
struct traits<couchbase::core::orphan_reporter_options> {
|
|
105
|
+
template<template<typename...> class Traits>
|
|
106
|
+
static void assign(tao::json::basic_value<Traits>& v,
|
|
107
|
+
const couchbase::core::orphan_reporter_options& o)
|
|
108
|
+
{
|
|
109
|
+
v = {
|
|
110
|
+
{ "emit_interval", o.emit_interval },
|
|
111
|
+
{ "sample_size", o.sample_size },
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
};
|
|
115
|
+
|
|
102
116
|
template<>
|
|
103
117
|
struct traits<couchbase::core::tracing::threshold_logging_options> {
|
|
104
118
|
template<template<typename...> class Traits>
|
|
@@ -106,8 +120,6 @@ struct traits<couchbase::core::tracing::threshold_logging_options> {
|
|
|
106
120
|
const couchbase::core::tracing::threshold_logging_options& o)
|
|
107
121
|
{
|
|
108
122
|
v = {
|
|
109
|
-
{ "orphaned_emit_interval", o.orphaned_emit_interval },
|
|
110
|
-
{ "orphaned_sample_size", o.orphaned_sample_size },
|
|
111
123
|
{ "threshold_emit_interval", o.threshold_emit_interval },
|
|
112
124
|
{ "threshold_sample_size", o.threshold_sample_size },
|
|
113
125
|
{ "key_value_threshold", o.key_value_threshold },
|
|
@@ -275,12 +287,14 @@ origin::to_json() const -> std::string
|
|
|
275
287
|
{ "enable_compression", options_.enable_compression },
|
|
276
288
|
{ "enable_tracing", options_.enable_tracing },
|
|
277
289
|
{ "enable_metrics", options_.enable_metrics },
|
|
290
|
+
{ "enable_orphan_reporting", options_.enable_orphan_reporting },
|
|
278
291
|
{ "tcp_keep_alive_interval", options_.tcp_keep_alive_interval },
|
|
279
292
|
{ "config_idle_redial_timeout", options_.config_idle_redial_timeout },
|
|
280
293
|
{ "max_http_connections", options_.max_http_connections },
|
|
281
294
|
{ "idle_http_connection_timeout", options_.idle_http_connection_timeout },
|
|
282
295
|
{ "metrics_options", options_.metrics_options },
|
|
283
296
|
{ "tracing_options", options_.tracing_options },
|
|
297
|
+
{ "orphan_reporter_options", options_.orphan_options },
|
|
284
298
|
{ "transactions_options", options_.transactions },
|
|
285
299
|
{ "server_group", options_.server_group },
|
|
286
300
|
#endif
|
|
@@ -302,12 +316,36 @@ origin::to_json() const -> std::string
|
|
|
302
316
|
|
|
303
317
|
} // namespace couchbase::core
|
|
304
318
|
|
|
319
|
+
couchbase::core::origin::origin(origin&& other) noexcept
|
|
320
|
+
: options_(std::move(other.options_))
|
|
321
|
+
, nodes_(std::move(other.nodes_))
|
|
322
|
+
, next_node_(other.next_node_)
|
|
323
|
+
, exhausted_(other.exhausted_)
|
|
324
|
+
, connection_string_(std::move(other.connection_string_))
|
|
325
|
+
, credentials_(std::move(other.credentials_))
|
|
326
|
+
{
|
|
327
|
+
}
|
|
328
|
+
|
|
329
|
+
auto
|
|
330
|
+
couchbase::core::origin::operator=(origin&& other) noexcept -> origin&
|
|
331
|
+
{
|
|
332
|
+
if (this != &other) {
|
|
333
|
+
options_ = std::move(other.options_);
|
|
334
|
+
nodes_ = std::move(other.nodes_);
|
|
335
|
+
next_node_ = other.next_node_;
|
|
336
|
+
exhausted_ = other.exhausted_;
|
|
337
|
+
connection_string_ = std::move(other.connection_string_);
|
|
338
|
+
credentials_ = std::move(other.credentials_);
|
|
339
|
+
}
|
|
340
|
+
return *this;
|
|
341
|
+
}
|
|
342
|
+
|
|
305
343
|
couchbase::core::origin::origin(const couchbase::core::origin& other)
|
|
306
344
|
: options_(other.options_)
|
|
307
|
-
, credentials_(other.credentials_)
|
|
308
345
|
, nodes_(other.nodes_)
|
|
309
346
|
, next_node_(nodes_.begin())
|
|
310
347
|
{
|
|
348
|
+
update_credentials(other.credentials());
|
|
311
349
|
}
|
|
312
350
|
|
|
313
351
|
couchbase::core::origin::origin(origin other, const topology::configuration& config)
|
|
@@ -321,9 +359,9 @@ couchbase::core::origin::origin(couchbase::core::cluster_credentials auth,
|
|
|
321
359
|
std::uint16_t port,
|
|
322
360
|
couchbase::core::cluster_options options)
|
|
323
361
|
: options_(std::move(options))
|
|
324
|
-
, credentials_(std::move(auth))
|
|
325
362
|
, nodes_{ { hostname, std::to_string(port) } }
|
|
326
363
|
, next_node_(nodes_.begin())
|
|
364
|
+
, credentials_(std::move(auth))
|
|
327
365
|
{
|
|
328
366
|
}
|
|
329
367
|
couchbase::core::origin::origin(couchbase::core::cluster_credentials auth,
|
|
@@ -331,16 +369,16 @@ couchbase::core::origin::origin(couchbase::core::cluster_credentials auth,
|
|
|
331
369
|
const std::string& port,
|
|
332
370
|
couchbase::core::cluster_options options)
|
|
333
371
|
: options_(std::move(options))
|
|
334
|
-
, credentials_(std::move(auth))
|
|
335
372
|
, nodes_{ { hostname, port } }
|
|
336
373
|
, next_node_(nodes_.begin())
|
|
374
|
+
, credentials_(std::move(auth))
|
|
337
375
|
{
|
|
338
376
|
}
|
|
339
377
|
couchbase::core::origin::origin(couchbase::core::cluster_credentials auth,
|
|
340
378
|
const couchbase::core::utils::connection_string& connstr)
|
|
341
379
|
: options_(connstr.options)
|
|
342
|
-
, credentials_(std::move(auth))
|
|
343
380
|
, connection_string_(connstr.input)
|
|
381
|
+
, credentials_(std::move(auth))
|
|
344
382
|
{
|
|
345
383
|
nodes_.reserve(connstr.bootstrap_nodes.size());
|
|
346
384
|
for (const auto& node : connstr.bootstrap_nodes) {
|
|
@@ -358,7 +396,7 @@ couchbase::core::origin::operator=(const couchbase::core::origin& other) -> couc
|
|
|
358
396
|
{
|
|
359
397
|
if (this != &other) {
|
|
360
398
|
options_ = other.options_;
|
|
361
|
-
|
|
399
|
+
update_credentials(other.credentials());
|
|
362
400
|
nodes_ = other.nodes_;
|
|
363
401
|
next_node_ = nodes_.begin();
|
|
364
402
|
exhausted_ = false;
|
|
@@ -371,26 +409,36 @@ couchbase::core::origin::connection_string() const -> const std::string&
|
|
|
371
409
|
return connection_string_;
|
|
372
410
|
}
|
|
373
411
|
auto
|
|
374
|
-
couchbase::core::origin::username() const ->
|
|
412
|
+
couchbase::core::origin::username() const -> std::string
|
|
375
413
|
{
|
|
414
|
+
const std::shared_lock lock(credentials_mutex_);
|
|
376
415
|
return credentials_.username;
|
|
377
416
|
}
|
|
378
417
|
auto
|
|
379
|
-
couchbase::core::origin::password() const ->
|
|
418
|
+
couchbase::core::origin::password() const -> std::string
|
|
380
419
|
{
|
|
420
|
+
const std::shared_lock lock(credentials_mutex_);
|
|
381
421
|
return credentials_.password;
|
|
382
422
|
}
|
|
383
423
|
auto
|
|
384
|
-
couchbase::core::origin::certificate_path() const ->
|
|
424
|
+
couchbase::core::origin::certificate_path() const -> std::string
|
|
385
425
|
{
|
|
426
|
+
const std::shared_lock lock(credentials_mutex_);
|
|
386
427
|
return credentials_.certificate_path;
|
|
387
428
|
}
|
|
388
429
|
auto
|
|
389
|
-
couchbase::core::origin::key_path() const ->
|
|
430
|
+
couchbase::core::origin::key_path() const -> std::string
|
|
390
431
|
{
|
|
432
|
+
const std::shared_lock lock(credentials_mutex_);
|
|
391
433
|
return credentials_.key_path;
|
|
392
434
|
}
|
|
393
435
|
auto
|
|
436
|
+
couchbase::core::origin::jwt_token() const -> std::string
|
|
437
|
+
{
|
|
438
|
+
const std::shared_lock lock(credentials_mutex_);
|
|
439
|
+
return credentials_.jwt_token;
|
|
440
|
+
}
|
|
441
|
+
auto
|
|
394
442
|
couchbase::core::origin::get_hostnames() const -> std::vector<std::string>
|
|
395
443
|
{
|
|
396
444
|
std::vector<std::string> res;
|
|
@@ -455,6 +503,12 @@ couchbase::core::origin::set_nodes_from_config(const topology::configuration& co
|
|
|
455
503
|
}
|
|
456
504
|
next_node_ = nodes_.begin();
|
|
457
505
|
}
|
|
506
|
+
void
|
|
507
|
+
couchbase::core::origin::update_credentials(cluster_credentials auth)
|
|
508
|
+
{
|
|
509
|
+
const std::unique_lock lock(credentials_mutex_);
|
|
510
|
+
credentials_ = std::move(auth);
|
|
511
|
+
}
|
|
458
512
|
auto
|
|
459
513
|
couchbase::core::origin::next_address() -> std::pair<std::string, std::string>
|
|
460
514
|
{
|
|
@@ -490,7 +544,8 @@ couchbase::core::origin::options() -> couchbase::core::cluster_options&
|
|
|
490
544
|
return options_;
|
|
491
545
|
}
|
|
492
546
|
auto
|
|
493
|
-
couchbase::core::origin::credentials() const ->
|
|
547
|
+
couchbase::core::origin::credentials() const -> couchbase::core::cluster_credentials
|
|
494
548
|
{
|
|
549
|
+
const std::shared_lock lock(credentials_mutex_);
|
|
495
550
|
return credentials_;
|
|
496
551
|
}
|
|
@@ -20,6 +20,7 @@
|
|
|
20
20
|
#include "cluster_credentials.hxx"
|
|
21
21
|
#include "cluster_options.hxx"
|
|
22
22
|
|
|
23
|
+
#include <shared_mutex>
|
|
23
24
|
#include <string>
|
|
24
25
|
#include <utility>
|
|
25
26
|
#include <vector>
|
|
@@ -43,7 +44,7 @@ struct origin {
|
|
|
43
44
|
origin() = default;
|
|
44
45
|
~origin() = default;
|
|
45
46
|
|
|
46
|
-
origin(origin&& other)
|
|
47
|
+
origin(origin&& other) noexcept;
|
|
47
48
|
origin(const origin& other);
|
|
48
49
|
origin(origin other, const topology::configuration& config);
|
|
49
50
|
origin(cluster_credentials auth,
|
|
@@ -55,14 +56,15 @@ struct origin {
|
|
|
55
56
|
const std::string& port,
|
|
56
57
|
cluster_options options);
|
|
57
58
|
origin(cluster_credentials auth, const utils::connection_string& connstr);
|
|
58
|
-
auto operator=(origin&& other) -> origin
|
|
59
|
+
auto operator=(origin&& other) noexcept -> origin&;
|
|
59
60
|
auto operator=(const origin& other) -> origin&;
|
|
60
61
|
|
|
61
62
|
[[nodiscard]] auto connection_string() const -> const std::string&;
|
|
62
|
-
[[nodiscard]] auto username() const ->
|
|
63
|
-
[[nodiscard]] auto password() const ->
|
|
64
|
-
[[nodiscard]] auto certificate_path() const ->
|
|
65
|
-
[[nodiscard]] auto key_path() const ->
|
|
63
|
+
[[nodiscard]] auto username() const -> std::string;
|
|
64
|
+
[[nodiscard]] auto password() const -> std::string;
|
|
65
|
+
[[nodiscard]] auto certificate_path() const -> std::string;
|
|
66
|
+
[[nodiscard]] auto key_path() const -> std::string;
|
|
67
|
+
[[nodiscard]] auto jwt_token() const -> std::string;
|
|
66
68
|
|
|
67
69
|
[[nodiscard]] auto get_hostnames() const -> std::vector<std::string>;
|
|
68
70
|
[[nodiscard]] auto get_nodes() const -> std::vector<std::string>;
|
|
@@ -71,6 +73,8 @@ struct origin {
|
|
|
71
73
|
void set_nodes(node_list nodes);
|
|
72
74
|
void set_nodes_from_config(const topology::configuration& config);
|
|
73
75
|
|
|
76
|
+
void update_credentials(cluster_credentials auth);
|
|
77
|
+
|
|
74
78
|
[[nodiscard]] auto next_address() -> std::pair<std::string, std::string>;
|
|
75
79
|
|
|
76
80
|
[[nodiscard]] auto exhausted() const -> bool;
|
|
@@ -79,16 +83,17 @@ struct origin {
|
|
|
79
83
|
|
|
80
84
|
[[nodiscard]] auto options() const -> const couchbase::core::cluster_options&;
|
|
81
85
|
[[nodiscard]] auto options() -> couchbase::core::cluster_options&;
|
|
82
|
-
[[nodiscard]] auto credentials() const ->
|
|
86
|
+
[[nodiscard]] auto credentials() const -> couchbase::core::cluster_credentials;
|
|
83
87
|
[[nodiscard]] auto to_json() const -> std::string;
|
|
84
88
|
|
|
85
89
|
private:
|
|
86
90
|
couchbase::core::cluster_options options_{};
|
|
87
|
-
cluster_credentials credentials_{};
|
|
88
91
|
node_list nodes_{};
|
|
89
92
|
node_list::iterator next_node_{};
|
|
90
93
|
bool exhausted_{ false };
|
|
91
94
|
std::string connection_string_{};
|
|
95
|
+
cluster_credentials credentials_{};
|
|
96
|
+
mutable std::shared_mutex credentials_mutex_{};
|
|
92
97
|
};
|
|
93
98
|
|
|
94
99
|
} // namespace couchbase::core
|
|
@@ -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
|
|
@@ -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) {
|
|
@@ -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
|