diff --git a/Couchbase/AppTelemetryConfiguration.php b/Couchbase/AppTelemetryConfiguration.php new file mode 100644 index 00000000..436baa52 --- /dev/null +++ b/Couchbase/AppTelemetryConfiguration.php @@ -0,0 +1,114 @@ +enabled = $enabled; + return $this; + } + + /** + * Specifies an endpoint to override the application metrics endpoint discovered during configuration. + * + * @param string $endpoint + * + * @return AppTelemetryConfiguration + * @since 4.5.0 + */ + public function endpoint(string $endpoint): AppTelemetryConfiguration + { + $this->endpoint = $endpoint; + return $this; + } + + /** + * Specifies the time to wait before attempting a websocket reconnection, specified in millseconds. + * + * @param int $milliseconds + * + * @return AppTelemetryConfiguration + * @since 4.5.0 + */ + public function backoff(int $milliseconds): AppTelemetryConfiguration + { + $this->backoffMilliseconds = $milliseconds; + return $this; + } + + /** + * Specifies the time to wait between sending consecutive websocket PING commands to the server, specified in millseconds. + * + * @param int $milliseconds + * + * @return AppTelemetryConfiguration + * @since 4.5.0 + */ + public function pingInterval(int $milliseconds): AppTelemetryConfiguration + { + $this->pingIntervalMilliseconds = $milliseconds; + return $this; + } + + /** + * Specifies the time allowed for the server to respond to websocket PING command, specified in millseconds. + * + * @param int $milliseconds + * + * @return AppTelemetryConfiguration + * @since 4.5.0 + */ + public function pingTimeout(int $milliseconds): AppTelemetryConfiguration + { + $this->pingTimeoutMilliseconds = $milliseconds; + return $this; + } + + /** + * @internal + */ + public function export(): array + { + return [ + 'enabled' => $this->enabled, + 'endpoint' => $this->endpoint, + 'backoff' => $this->backoffMilliseconds, + 'pingInterval' => $this->pingIntervalMilliseconds, + 'pingTimeout' => $this->pingTimeoutMilliseconds, + ]; + } +} diff --git a/Couchbase/ClusterOptions.php b/Couchbase/ClusterOptions.php index 10269740..b99a8811 100644 --- a/Couchbase/ClusterOptions.php +++ b/Couchbase/ClusterOptions.php @@ -66,6 +66,7 @@ class ClusterOptions private ?ThresholdLoggingOptions $thresholdLoggingTracerOptions = null; private ?LoggingMeterOptions $loggingMeterOptions = null; private ?TransactionsConfiguration $transactionsConfiguration = null; + private ?AppTelemetryConfiguration $appTelemetryConfiguration = null; private ?Authenticator $authenticator; @@ -490,6 +491,18 @@ public function transactionsConfiguration(TransactionsConfiguration $options): C return $this; } + /** + * @param AppTelemetryConfiguration $options + * + * @return ClusterOptions + * @since 4.5.0 + */ + public function appTelemetryConfiguration(AppTelemetryConfiguration $options): ClusterOptions + { + $this->appTelemetryConfiguration = $options; + return $this; + } + /** * Select the server group to use for replica APIs. * @@ -609,6 +622,8 @@ public function export(): array 'thresholdLoggingTracerOptions' => $this->thresholdLoggingTracerOptions == null ? null : $this->thresholdLoggingTracerOptions->export(), 'loggingMeterOptions' => $this->loggingMeterOptions == null ? null : $this->loggingMeterOptions->export(), + 'appTelemetryConfiguration' => + $this->appTelemetryConfiguration == null ? null : $this->appTelemetryConfiguration->export(), ]; } } diff --git a/src/deps/couchbase-cxx-client b/src/deps/couchbase-cxx-client index c2439a40..ad4836b5 160000 --- a/src/deps/couchbase-cxx-client +++ b/src/deps/couchbase-cxx-client @@ -1 +1 @@ -Subproject commit c2439a404fa6b276862fe81150b1326bf98e6164 +Subproject commit ad4836b55aedb1d475d5e87514f27f630d00913e diff --git a/src/wrapper/connection_handle.cxx b/src/wrapper/connection_handle.cxx index a3e85c82..375e21f1 100644 --- a/src/wrapper/connection_handle.cxx +++ b/src/wrapper/connection_handle.cxx @@ -6222,6 +6222,39 @@ apply_options(couchbase::cluster_options& cluster_options, zval* options) -> cor } ZEND_HASH_FOREACH_END(); } + + if (zend_binary_strcmp(ZSTR_VAL(key), ZSTR_LEN(key), ZEND_STRL("appTelemetryConfiguration")) == 0) { + if (value == nullptr || Z_TYPE_P(value) == IS_NULL) { + continue; + } + + const zend_string* k = nullptr; + const zval* v = nullptr; + ZEND_HASH_FOREACH_STR_KEY_VAL(Z_ARRVAL_P(value), k, v) + { + options::assign_boolean(ZEND_STRL("enabled"), k, v, [&](auto v) { + cluster_options.application_telemetry().enable(v); + }); + + options::assign_string(ZEND_STRL("endpoint"), k, v, [&](auto v) { + cluster_options.application_telemetry().override_endpoint(std::move(v)); + }); + + options::assign_duration(ZEND_STRL("backoff"), k, v, [&](auto v) { + cluster_options.application_telemetry().backoff_interval(v); + }); + + options::assign_duration(ZEND_STRL("pingInterval"), k, v, [&](auto v) { + cluster_options.application_telemetry().ping_interval(v); + }); + + options::assign_duration(ZEND_STRL("pingTimeout"), k, v, [&](auto v) { + cluster_options.application_telemetry().ping_timeout(v); + }); + } + ZEND_HASH_FOREACH_END(); + } + } catch (const core_error_info& e) { return e; }