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;