diff --git a/doc/manual/src/installation.md b/doc/manual/src/installation.md index c038a450..94a12041 100644 --- a/doc/manual/src/installation.md +++ b/doc/manual/src/installation.md @@ -187,6 +187,18 @@ following: } } +Statsd Configuration +-------------------- + +By default, Hydra will send stats to statsd at `localhost:8125`. Point Hydra to a different server via: + +``` + + host = alternative.host + port = 18125 + +``` + Using LDAP as authentication backend (optional) ----------------------------------------------- @@ -234,4 +246,4 @@ general any LDAP group of the form *hydra\_some\_role* (notice the role_value: dn role_search_options: deref: always - + diff --git a/src/lib/Hydra/Helper/Nix.pm b/src/lib/Hydra/Helper/Nix.pm index e50723bf..c1f395c9 100644 --- a/src/lib/Hydra/Helper/Nix.pm +++ b/src/lib/Hydra/Helper/Nix.pm @@ -15,7 +15,7 @@ use IPC::Run; our @ISA = qw(Exporter); our @EXPORT = qw( getHydraHome getHydraConfig getBaseUrl - getSCMCacheDir + getSCMCacheDir getStatsdConfig registerRoot getGCRootsDir gcRootFor jobsetOverview jobsetOverview_ getDrvLogPath findLog @@ -55,6 +55,23 @@ sub getHydraConfig { } +# Return hash of statsd configuration of the following shape: +# ( +# host => string, +# port => digit +# ) +sub getStatsdConfig { + my ($config) = @_; + my $cfg = $config->{statsd}; + my %statsd = defined $cfg ? ref $cfg eq "HASH" ? %$cfg : ($cfg) : (); + + return { + "host" => %statsd{'host'} // 'localhost', + "port" => %statsd{'port'} // 8125, + } +} + + sub getBaseUrl { my ($config) = @_; return $config->{'base_uri'} // "http://" . hostname_long . ":3000"; diff --git a/src/script/hydra-eval-jobset b/src/script/hydra-eval-jobset index a608dc91..f4a044eb 100755 --- a/src/script/hydra-eval-jobset +++ b/src/script/hydra-eval-jobset @@ -33,6 +33,10 @@ my $plugins = [Hydra::Plugin->instantiate(db => $db, config => $config)]; my $dryRun = defined $ENV{'HYDRA_DRY_RUN'}; +my $statsdConfig = Hydra::Helper::Nix::getStatsdConfig($config); +$Net::Statsd::HOST = $statsdConfig->{'host'}; +$Net::Statsd::PORT = $statsdConfig->{'port'}; + alarm 3600; # FIXME: make configurable diff --git a/src/script/hydra-send-stats b/src/script/hydra-send-stats index 110a8809..8c7d2cd5 100755 --- a/src/script/hydra-send-stats +++ b/src/script/hydra-send-stats @@ -9,6 +9,11 @@ use JSON; STDERR->autoflush(1); binmode STDERR, ":encoding(utf8)"; +my $config = getHydraConfig(); +my $statsdConfig = Hydra::Helper::Nix::getStatsdConfig($config); +$Net::Statsd::HOST = $statsdConfig->{'host'}; +$Net::Statsd::PORT = $statsdConfig->{'port'}; + sub gauge { my ($name, $val) = @_; die unless defined $val; diff --git a/t/Config/statsd.t b/t/Config/statsd.t new file mode 100644 index 00000000..be042127 --- /dev/null +++ b/t/Config/statsd.t @@ -0,0 +1,61 @@ +use strict; +use Setup; + +my %ctx = test_init(hydra_config => q| + + host = foo.bar + port = 18125 + +|); + +require Hydra::Helper::Nix; +use Test2::V0; + +is(Hydra::Helper::Nix::getStatsdConfig(Hydra::Helper::Nix::getHydraConfig()), { + 'host' => "foo.bar", + 'port' => 18125 +}, "Reading specific configuration from the hydra.conf works"); + +is(Hydra::Helper::Nix::getStatsdConfig(), { + 'host' => "localhost", + 'port' => 8125 +}, "A totally empty configuration yields default options"); + +is(Hydra::Helper::Nix::getStatsdConfig({ + "statsd" => { + + } +}), { + 'host' => "localhost", + 'port' => 8125 +}, "A empty statsd block yields default options"); + +is(Hydra::Helper::Nix::getStatsdConfig({ + "statsd" => { + 'host' => "statsdhost" + } +}), { + 'host' => "statsdhost", + 'port' => 8125 +}, "An overridden statsd host propogates, but the other defaults are returned"); + +is(Hydra::Helper::Nix::getStatsdConfig({ + "statsd" => { + 'port' => 5218 + } +}), { + 'host' => "localhost", + 'port' => 5218 +}, "An overridden statsd port propogates, but the other defaults are returned"); + +is(Hydra::Helper::Nix::getStatsdConfig({ + "statsd" => { + 'host' => 'my.statsd.host', + 'port' => 5218 + } +}), { + 'host' => "my.statsd.host", + 'port' => 5218 +}, "An overridden statsd port and host propogate"); + +done_testing;