mirror of
https://github.com/Icinga/icingaweb2-module-graphite.git
synced 2026-05-28 04:34:57 -04:00
Add Graphite Web HTTP request timeout option
If the Graphite Web server is unreachable, all requests for frontend pages containing graphs hang until the backend HTTP request times out, resulting in a very poor UX. The Guzzle documentation states that the default behaviour is to wait indefinitely, however in our testing the cURL handler has an internal default of 30 seconds: https://docs.guzzlephp.org/en/stable/request-options.html#timeout This commit makes the HTTP request timeout configurable and sets a reasonable default of 10 seconds.
This commit is contained in:
parent
f4cdeee6f0
commit
fc85e6cb05
3 changed files with 48 additions and 3 deletions
|
|
@ -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
|
||||
]
|
||||
]
|
||||
]);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -73,6 +73,7 @@ trait GraphingTrait
|
|||
->setUser($graphite->user)
|
||||
->setPassword($graphite->password)
|
||||
->setInsecure((bool) $graphite->insecure)
|
||||
->setTimeout(isset($graphite->timeout) ? intval($graphite->timeout) : 10)
|
||||
);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue