diff --git a/application/forms/Config/BackendForm.php b/application/forms/Config/BackendForm.php index 90e0af2..fb3970b 100644 --- a/application/forms/Config/BackendForm.php +++ b/application/forms/Config/BackendForm.php @@ -53,6 +53,16 @@ class BackendForm extends ConfigForm 'label' => $this->translate('Connect insecurely'), 'description' => $this->translate('Check this to not verify the remote\'s TLS certificate') ] + ], + [ + 'number', + 'graphite_timeout', + [ + 'label' => $this->translate('Request timeout'), + 'description' => $this->translate('The timeout for HTTP requests to Graphite Web'), + 'min' => 0, + 'placeholder' => 10 + ] ] ]); } diff --git a/library/Graphite/Graphing/GraphingTrait.php b/library/Graphite/Graphing/GraphingTrait.php index a1c1cdc..463c61c 100644 --- a/library/Graphite/Graphing/GraphingTrait.php +++ b/library/Graphite/Graphing/GraphingTrait.php @@ -73,6 +73,7 @@ trait GraphingTrait ->setUser($graphite->user) ->setPassword($graphite->password) ->setInsecure((bool) $graphite->insecure) + ->setTimeout(isset($graphite->timeout) ? intval($graphite->timeout) : 10) ); } diff --git a/library/Graphite/Graphing/GraphiteWebClient.php b/library/Graphite/Graphing/GraphiteWebClient.php index 982a2af..9d8196a 100644 --- a/library/Graphite/Graphing/GraphiteWebClient.php +++ b/library/Graphite/Graphing/GraphiteWebClient.php @@ -40,6 +40,13 @@ class GraphiteWebClient */ protected $insecure = false; + /** + * Timeout for every Graphite Web HTTP request + * + * @var ?int + */ + protected $timeout; + /** * HTTP client * @@ -79,9 +86,12 @@ class GraphiteWebClient // TODO(ak): keep connections alive (TCP handshakes are a bit expensive and TLS handshakes are very expensive) return (string) $this->httpClient->send( new Request($method, $this->completeUrl($url)->getAbsoluteUrl(), $headers, $body), - ['curl' => [ - CURLOPT_SSL_VERIFYPEER => ! $this->insecure - ]] + [ + 'curl' => [ + CURLOPT_SSL_VERIFYPEER => ! $this->insecure + ], + 'timeout' => $this->timeout ?? 10 + ] )->getBody(); } @@ -195,4 +205,28 @@ class GraphiteWebClient return $this; } + + /** + * Get the HTTP request timeout + * + * @return ?int + */ + public function getTimeout(): ?int + { + return $this->timeout; + } + + /** + * Set the HTTP request timeout + * + * @param ?int $timeout + * + * @return $this + */ + public function setTimeout(?int $timeout): self + { + $this->timeout = $timeout; + + return $this; + } }