[pve-devel] [PATCH manager] add graphite tcp support

Martin Verges martin.verges at croit.io
Tue Nov 5 22:34:07 CET 2019


This change allows sending statistics to graphite over TCP.

So far only UDP is possible, which is not available in some environments, like behind a loadbalancer.

Configuration example:
~ $ cat /etc/pve/status.cfg

graphite:
    server 10.20.30.40
    port 2003
    path proxmox
    proto tcp
    timeout 3

Signed-off-by: Martin Verges <martin.verges at croit.io>
---
 PVE/Status/Graphite.pm | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/PVE/Status/Graphite.pm b/PVE/Status/Graphite.pm
index d0e1563d..4b224360 100644
--- a/PVE/Status/Graphite.pm
+++ b/PVE/Status/Graphite.pm
@@ -4,11 +4,13 @@ use strict;
 use warnings;
 
 use PVE::Status::Plugin;
+use IO::Socket::Timeout;
 
 # example config (/etc/pve/status.cfg)
 #graphite:
 #	server test
 #	port 2003
+#	proto udp
 #	path proxmox.mycluster
 #	disable 0
 #
@@ -25,6 +27,17 @@ sub properties {
 	    type => 'string', format => 'graphite-path',
 	    description => "root graphite path (ex: proxmox.mycluster.mykey)",
 	},
+	timeout => {
+	    type => 'integer',
+	    description => "graphite tcp socket timeout (default=3)",
+	    optional => 1
+	},
+	proto => {
+	    type => 'string',
+	    enum => ['udp', 'tcp'],
+	    description => "send graphite data using tcp or udp (default)",
+	    optional => 1,
+	},
     };
 }
 
@@ -32,6 +45,8 @@ sub options {
     return {
 	server => {},
 	port => { optional => 1 },
+	proto => { optional => 1 },
+	timeout => { optional => 1 },
 	path => { optional => 1 },
 	disable => { optional => 1 },
     };
@@ -76,13 +91,21 @@ sub write_graphite_hash {
     my $host = $plugin_config->{server};
     my $port = $plugin_config->{port} ? $plugin_config->{port} : 2003;
     my $path = $plugin_config->{path} ? $plugin_config->{path} : 'proxmox';
+    my $proto = $plugin_config->{proto} ? $plugin_config->{proto} : 'udp';
+    my $timeout = $plugin_config->{timeout} ? $plugin_config->{timeout} : 3;
 
     my $carbon_socket = IO::Socket::IP->new(
 	PeerAddr    => $host,
 	PeerPort    => $port,
-	Proto       => 'udp',
+	Proto       => $proto,
+	Timeout     => $timeout,
     ) || die "couldn't create carbon socket [$host]:$port - $@\n";
 
+    if ( $proto eq 'tcp' ) {
+	IO::Socket::Timeout->enable_timeouts_on($carbon_socket);
+	$carbon_socket->read_timeout($timeout);
+	$carbon_socket->write_timeout($timeout);
+    }
     write_graphite($carbon_socket, $d, $ctime, $path.".$object");
 
     $carbon_socket->close() if $carbon_socket;
-- 
2.20.1




More information about the pve-devel mailing list