Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,12 @@ This module requires the frontend module:

- https://github.com/NETWAYS/icingaweb2-module-perfdatagraphs

## Known Issues

> too_many_buckets_exception

Lower the `max_data_points` so that less buckets are calculated or reduce the number of metrics being fetched via the `metrics_include/exclude` settings.

## Installation Requirements

* PHP version ≥ 8.0
Expand Down
16 changes: 12 additions & 4 deletions application/forms/PerfdataGraphsElasticsearchConfigForm.php
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,17 @@ public function createElements(array $formData)
'description' => t('Skip the TLS verification'),
'label' => t('Skip the TLS verification')
]);

$this->addElement('number', 'elasticsearch_api_max_data_points', [
'label' => t('The maximum numbers of datapoints each series returns'),
'description' => t(' '),
'description' => t(
'The maximum numbers of datapoints each series returns.'
. ' The module will use an aggregations query to downsample to this number.'
),
'required' => false,
'placeholder' => 5000,
]);
}

public function addSubmitButton()
Expand Down Expand Up @@ -160,10 +171,7 @@ public static function validateFormData($form): array
$password = $form->getValue('elasticsearch_api_password', '');
$index = $form->getValue('elasticsearch_api_index', 'icinga2');
$tlsVerify = (bool) $form->getValue('elasticsearch_api_tls_insecure', false);

// TODO: Not yet implemented
$maxDataPoints = 10000;
// $maxDataPoints = $form->getValue('elasticsearch_max_data_points', 10000);
$maxDataPoints = (int) $form->getValue('elasticsearch_api_max_data_points', 5000);

$writer = $form->getValue('elasticsearch_icinga_writer', '');

Expand Down
4 changes: 1 addition & 3 deletions library/Perfdatagraphselasticsearch/Client/BaseClient.php
Original file line number Diff line number Diff line change
Expand Up @@ -22,16 +22,14 @@
abstract class BaseClient
{
protected Transport $transport;

// TODO: Currently unused
protected int $maxDataPoints;

/**
* parseDuration parses the duration string from the frontend
* into something we can use with the API (from parameter).
*
* @param string $duration ISO8601 Duration
* @param string $now current time (used in testing)
* @param DateTime $now current time (used in testing)
* @return string
*/
public function parseDuration(\DateTime $now, string $duration): string
Expand Down
1 change: 1 addition & 0 deletions library/Perfdatagraphselasticsearch/Client/ESInterface.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,5 +19,6 @@ public function fetchMetrics(
bool $isHostCheck,
array $includeMetrics,
array $excludeMetrics,
int $checkInterval
): PerfdataResponse;
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,8 +13,9 @@
use Icinga\Application\Logger;
use Icinga\Util\Json;

use GuzzleHttp\Client;
use DateTime;
use Exception;
use GuzzleHttp\Client;

/**
* ElasticsearchClient is used with with Icinga2 ElasticsearchWriter
Expand Down Expand Up @@ -63,7 +64,7 @@ public static function fromConfig(Config $moduleConfig = null): ESInterface
'api_url' => 'http://localhost:9200',
'api_index' => 'icinga2',
'api_timeout' => 10,
'api_max_data_points' => 10000,
'api_max_data_points' => 5000,
'api_username' => '',
'api_password' => '',
'api_tls_insecure' => false,
Expand All @@ -83,11 +84,11 @@ public static function fromConfig(Config $moduleConfig = null): ESInterface
$baseURI = rtrim($moduleConfig->get('elasticsearch', 'api_url', $default['api_url']), '/');
$index = rtrim($moduleConfig->get('elasticsearch', 'api_index', $default['api_index']), 'icinga2');
$timeout = (int) $moduleConfig->get('elasticsearch', 'api_timeout', $default['api_timeout']);
$maxDataPoints = (int) $moduleConfig->get('elasticsearch', 'api_max_data_points', $default['api_max_data_points']);
$username = $moduleConfig->get('elasticsearch', 'api_username', $default['api_username']);
$password = $moduleConfig->get('elasticsearch', 'api_password', $default['api_password']);
// Hint: We use a "skip TLS" logic in the UI, but Guzzle uses "verify TLS"
$tlsVerify = !(bool) $moduleConfig->get('elasticsearch', 'api_tls_insecure', $default['api_tls_insecure']);
$maxDataPoints = (int) $moduleConfig->get('elasticsearch', 'api_max_data_points', $default['api_max_data_points']);

return new static($baseURI, $username, $password, $maxDataPoints, $timeout, $tlsVerify, $index);
}
Expand Down Expand Up @@ -126,7 +127,11 @@ public function fetchMetrics(
bool $isHostCheck,
array $includeMetrics,
array $excludeMetrics,
int $checkInterval = 0
): PerfdataResponse {
$now = new DateTime();
$from = $this->parseDuration($now, $from);

$params = [
'size' => 2000,
'sort' => '@timestamp:asc',
Expand Down
Loading