]> arthur.barton.de Git - netdata.git/commitdiff
Merge pull request #1373 from jimcooley/master
authorCosta Tsaousis <costa@tsaousis.gr>
Thu, 15 Dec 2016 22:43:53 +0000 (00:43 +0200)
committerGitHub <noreply@github.com>
Thu, 15 Dec 2016 22:43:53 +0000 (00:43 +0200)
pagerduty.com notifications

python.d/postgres.chart.py
src/freebsd_sysctl.c

index 257e66205afaf70007b7ba1707c8e554cfd4d3c7..919b6f8eebef60a57fa002f56fdaa2d626679158 100644 (file)
@@ -88,10 +88,10 @@ SELECT
 FROM (
     SELECT
         client_addr, client_hostname, state,
-        ('x' || lpad(split_part(sent_location,   '/', 1), 8, '0'))::bit(32)::bigint AS sent_xlog,
-        ('x' || lpad(split_part(replay_location, '/', 1), 8, '0'))::bit(32)::bigint AS replay_xlog,
-        ('x' || lpad(split_part(sent_location,   '/', 2), 8, '0'))::bit(32)::bigint AS sent_offset,
-        ('x' || lpad(split_part(replay_location, '/', 2), 8, '0'))::bit(32)::bigint AS replay_offset
+        ('x' || lpad(split_part(sent_location::text,   '/', 1), 8, '0'))::bit(32)::bigint AS sent_xlog,
+        ('x' || lpad(split_part(replay_location::text, '/', 1), 8, '0'))::bit(32)::bigint AS replay_xlog,
+        ('x' || lpad(split_part(sent_location::text,   '/', 2), 8, '0'))::bit(32)::bigint AS sent_offset,
+        ('x' || lpad(split_part(replay_location::text, '/', 2), 8, '0'))::bit(32)::bigint AS replay_offset
     FROM pg_stat_replication
 ) AS s;
 """
@@ -248,7 +248,7 @@ class Service(SimpleService):
 
     def _add_database_stat_chart(self, chart_template_name, database_name):
         chart_template = CHARTS[chart_template_name]
-        chart_name = "{}_{}".format(database_name, chart_template_name)
+        chart_name = "{0}_{1}".format(database_name, chart_template_name)
         if chart_name not in self.order:
             self.order.insert(0, chart_name)
             name, title, units, family, context, chart_type = chart_template['options']
@@ -265,11 +265,11 @@ class Service(SimpleService):
 
             self.definitions[chart_name]['lines'] = []
             for line in deepcopy(chart_template['lines']):
-                line[0] = "{}_{}".format(database_name, line[0])
+                line[0] = "{0}_{1}".format(database_name, line[0])
                 self.definitions[chart_name]['lines'].append(line)
 
     def _add_database_lock_chart(self, database_name):
-        chart_name = "{}_locks".format(database_name)
+        chart_name = "{0}_locks".format(database_name)
         if chart_name not in self.order:
             self.order.insert(-1, chart_name)
             self.definitions[chart_name] = dict(
@@ -286,7 +286,7 @@ class Service(SimpleService):
             )
 
             for lock_type in LOCK_TYPES:
-                lock_id = "{}_{}".format(database_name, lock_type)
+                lock_id = "{0}_{1}".format(database_name, lock_type)
                 label = re.sub("([a-z])([A-Z])", "\g<1> \g<2>", lock_type)
                 self.definitions[chart_name]['lines'].append([lock_id, label, 'absolute'])
 
@@ -318,17 +318,17 @@ class Service(SimpleService):
         cursor.execute(DATABASE)
         for row in cursor:
             database_name = row.get('database_name')
-            self.data["{}_{}".format(database_name, 'db_stat_xact_commit')]   = int(row.get('xact_commit',   0))
-            self.data["{}_{}".format(database_name, 'db_stat_xact_rollback')] = int(row.get('xact_rollback', 0))
-            self.data["{}_{}".format(database_name, 'db_stat_blks_read')]     = int(row.get('blks_read',     0))
-            self.data["{}_{}".format(database_name, 'db_stat_blks_hit')]      = int(row.get('blks_hit',      0))
-            self.data["{}_{}".format(database_name, 'db_stat_tup_returned')]  = int(row.get('tup_returned',  0))
-            self.data["{}_{}".format(database_name, 'db_stat_tup_fetched')]   = int(row.get('tup_fetched',   0))
-            self.data["{}_{}".format(database_name, 'db_stat_tup_inserted')]  = int(row.get('tup_inserted',  0))
-            self.data["{}_{}".format(database_name, 'db_stat_tup_updated')]   = int(row.get('tup_updated',   0))
-            self.data["{}_{}".format(database_name, 'db_stat_tup_deleted')]   = int(row.get('tup_deleted',   0))
-            self.data["{}_{}".format(database_name, 'db_stat_conflicts')]     = int(row.get('conflicts',     0))
-            self.data["{}_{}".format(database_name, 'db_stat_connections')]   = int(row.get('connections',   0))
+            self.data["{0}_{1}".format(database_name, 'db_stat_xact_commit')]   = int(row.get('xact_commit',   0))
+            self.data["{0}_{1}".format(database_name, 'db_stat_xact_rollback')] = int(row.get('xact_rollback', 0))
+            self.data["{0}_{1}".format(database_name, 'db_stat_blks_read')]     = int(row.get('blks_read',     0))
+            self.data["{0}_{1}".format(database_name, 'db_stat_blks_hit')]      = int(row.get('blks_hit',      0))
+            self.data["{0}_{1}".format(database_name, 'db_stat_tup_returned')]  = int(row.get('tup_returned',  0))
+            self.data["{0}_{1}".format(database_name, 'db_stat_tup_fetched')]   = int(row.get('tup_fetched',   0))
+            self.data["{0}_{1}".format(database_name, 'db_stat_tup_inserted')]  = int(row.get('tup_inserted',  0))
+            self.data["{0}_{1}".format(database_name, 'db_stat_tup_updated')]   = int(row.get('tup_updated',   0))
+            self.data["{0}_{1}".format(database_name, 'db_stat_tup_deleted')]   = int(row.get('tup_deleted',   0))
+            self.data["{0}_{1}".format(database_name, 'db_stat_conflicts')]     = int(row.get('conflicts',     0))
+            self.data["{0}_{1}".format(database_name, 'db_stat_connections')]   = int(row.get('connections',   0))
 
     def add_backend_stats(self, cursor):
         cursor.execute(BACKENDS)
@@ -355,12 +355,12 @@ class Service(SimpleService):
         # zero out all current lock values
         for database_name in self.databases:
             for lock_type in LOCK_TYPES:
-                self.data["{}_{}".format(database_name, lock_type)] = 0
+                self.data["{0}_{1}".format(database_name, lock_type)] = 0
 
         # populate those that have current locks
         for row in cursor:
             database_name, lock_type, lock_count = row
-            self.data["{}_{}".format(database_name, lock_type)] = lock_count
+            self.data["{0}_{1}".format(database_name, lock_type)] = lock_count
 
     def add_wal_stats(self, cursor):
         cursor.execute(ARCHIVE)
index c0932c410d3a8d3fb96b0cefa612b1d9d53e17a2..d4786531f376109b32a0b56d6887f7d0da83613e 100644 (file)
 #undef _KERNEL
 // NEEDED BY: struct sysctl_netisr_workstream, struct sysctl_netisr_work
 #include <net/netisr.h>
+// NEEDED BY: struct ifaddrs, getifaddrs()
+#include <net/if.h>
+#include <ifaddrs.h>
 // NEEDED BY: do_disk_io
 #define RRD_TYPE_DISK "disk"
 
 // FreeBSD calculates load averages once every 5 seconds
 #define MIN_LOADAVG_UPDATE_EVERY 5
 
+// NEEDED BY: do_bandwidth
+#define IFA_DATA(s) (((struct if_data *)ifa->ifa_data)->ifi_ ## s)
+
 int do_freebsd_sysctl(int update_every, usec_t dt) {
     (void)dt;
 
     static int do_cpu = -1, do_cpu_cores = -1, do_interrupts = -1, do_context = -1, do_forks = -1, do_processes = -1,
         do_loadavg = -1, do_all_processes = -1, do_disk_io = -1, do_swap = -1, do_ram = -1, do_swapio = -1,
         do_pgfaults = -1, do_committed = -1, do_ipc_semaphores = -1, do_ipc_shared_mem = -1, do_ipc_msg_queues = -1,
-        do_dev_intr = -1, do_soft_intr = -1, do_netisr = -1, do_netisr_per_core = -1;
+        do_dev_intr = -1, do_soft_intr = -1, do_netisr = -1, do_netisr_per_core = -1, do_bandwidth = -1;
 
     if (unlikely(do_cpu == -1)) {
         do_cpu                  = config_get_boolean("plugin:freebsd:sysctl", "cpu utilization", 1);
@@ -50,6 +56,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
         do_ipc_msg_queues       = config_get_boolean("plugin:freebsd:sysctl", "ipc message queues", 1);
         do_netisr               = config_get_boolean("plugin:freebsd:sysctl", "netisr", 1);
         do_netisr_per_core      = config_get_boolean("plugin:freebsd:sysctl", "netisr per core", 1);
+        do_bandwidth            = config_get_boolean("plugin:freebsd:sysctl", "bandwidth", 1);
     }
 
     RRDSET *st;
@@ -57,6 +64,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
     int system_pagesize = getpagesize(); // wouldn't it be better to get value directly from hw.pagesize?
     int i, n;
     int common_error = 0;
+    size_t size;
 
     // NEEDED BY: do_loadavg
     static usec_t last_loadavg_usec = 0;
@@ -105,7 +113,7 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
     } prev_dstat;
 
     // NEEDED BY: do_swap
-    size_t mibsize, size;
+    size_t mibsize;
     int mib[3]; // CTL_MAXNAME = 24 maximum mib components (sysctl.h)
     struct xswdev xsw;
     struct total_xsw {
@@ -159,6 +167,13 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
     } *netisr_stats = NULL;
     char netstat_cpuid[21]; // no more than 4 digits expected
 
+    // NEEDED BY: do_bandwidth
+    struct ifaddrs *ifa, *ifap;
+    struct iftot {
+        u_long  ift_ibytes;
+        u_long  ift_obytes;
+    } iftot = {0, 0};
+
     // --------------------------------------------------------------------
 
     if (last_loadavg_usec <= dt) {
@@ -1029,5 +1044,149 @@ int do_freebsd_sysctl(int update_every, usec_t dt) {
         }
     }
 
+    // --------------------------------------------------------------------
+
+    if (likely(do_bandwidth)) {
+        if (unlikely(getifaddrs(&ifap))) {
+            error("FREEBSD: getifaddrs()");
+            do_bandwidth = 0;
+            error("DISABLED: system.ipv4");
+        } else {
+            iftot.ift_ibytes = iftot.ift_obytes = 0;
+            for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+                if (ifa->ifa_addr->sa_family != AF_INET)
+                        continue;
+                iftot.ift_ibytes += IFA_DATA(ibytes);
+                iftot.ift_obytes += IFA_DATA(obytes);
+            }
+
+            st = rrdset_find("system.ipv4");
+            if (unlikely(!st)) {
+                st = rrdset_create("system", "ipv4", NULL, "network", NULL, "IPv4 Bandwidth", "kilobits/s", 500, update_every, RRDSET_TYPE_AREA);
+
+                rrddim_add(st, "InOctets", "received", 8, 1024, RRDDIM_INCREMENTAL);
+                rrddim_add(st, "OutOctets", "sent", -8, 1024, RRDDIM_INCREMENTAL);
+            }
+            else rrdset_next(st);
+
+            rrddim_set(st, "InOctets", iftot.ift_ibytes);
+            rrddim_set(st, "OutOctets", iftot.ift_obytes);
+            rrdset_done(st);
+
+            // --------------------------------------------------------------------
+
+            iftot.ift_ibytes = iftot.ift_obytes = 0;
+            for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+                if (ifa->ifa_addr->sa_family != AF_INET6)
+                        continue;
+                iftot.ift_ibytes += IFA_DATA(ibytes);
+                iftot.ift_obytes += IFA_DATA(obytes);
+            }
+
+            st = rrdset_find("system.ipv6");
+            if (unlikely(!st)) {
+                st = rrdset_create("system", "ipv6", NULL, "network", NULL, "IPv6 Bandwidth", "kilobits/s", 500, update_every, RRDSET_TYPE_AREA);
+
+                rrddim_add(st, "received", NULL, 8, 1024, RRDDIM_INCREMENTAL);
+                rrddim_add(st, "sent", NULL, -8, 1024, RRDDIM_INCREMENTAL);
+            }
+            else rrdset_next(st);
+
+            rrddim_set(st, "sent", iftot.ift_obytes);
+            rrddim_set(st, "received", iftot.ift_ibytes);
+            rrdset_done(st);
+
+            for (ifa = ifap; ifa; ifa = ifa->ifa_next) {
+                if (ifa->ifa_addr->sa_family != AF_LINK)
+                        continue;
+
+                // --------------------------------------------------------------------
+
+                st = rrdset_find_bytype("net", ifa->ifa_name);
+                if (unlikely(!st)) {
+                    st = rrdset_create("net", ifa->ifa_name, NULL, ifa->ifa_name, "net.net", "Bandwidth", "kilobits/s", 7000, update_every, RRDSET_TYPE_AREA);
+
+                    rrddim_add(st, "received", NULL, 8, 1024, RRDDIM_INCREMENTAL);
+                    rrddim_add(st, "sent", NULL, -8, 1024, RRDDIM_INCREMENTAL);
+                }
+                else rrdset_next(st);
+
+                rrddim_set(st, "received", IFA_DATA(ibytes));
+                rrddim_set(st, "sent", IFA_DATA(obytes));
+                rrdset_done(st);
+
+                // --------------------------------------------------------------------
+
+                st = rrdset_find_bytype("net_packets", ifa->ifa_name);
+                if (unlikely(!st)) {
+                    st = rrdset_create("net_packets", ifa->ifa_name, NULL, ifa->ifa_name, "net.packets", "Packets", "packets/s", 7001, update_every, RRDSET_TYPE_LINE);
+                    st->isdetail = 1;
+
+                    rrddim_add(st, "received", NULL, 1, 1, RRDDIM_INCREMENTAL);
+                    rrddim_add(st, "sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
+                    rrddim_add(st, "multicast_received", NULL, 1, 1, RRDDIM_INCREMENTAL);
+                    rrddim_add(st, "multicast_sent", NULL, -1, 1, RRDDIM_INCREMENTAL);
+                }
+                else rrdset_next(st);
+
+                rrddim_set(st, "received", IFA_DATA(ipackets));
+                rrddim_set(st, "sent", IFA_DATA(opackets));
+                rrddim_set(st, "multicast_received", IFA_DATA(imcasts));
+                rrddim_set(st, "multicast_sent", IFA_DATA(omcasts));
+                rrdset_done(st);
+
+                // --------------------------------------------------------------------
+
+                st = rrdset_find_bytype("net_errors", ifa->ifa_name);
+                if (unlikely(!st)) {
+                    st = rrdset_create("net_errors", ifa->ifa_name, NULL, ifa->ifa_name, "net.errors", "Interface Errors", "errors/s", 7002, update_every, RRDSET_TYPE_LINE);
+                    st->isdetail = 1;
+
+                    rrddim_add(st, "inbound", NULL, 1, 1, RRDDIM_INCREMENTAL);
+                    rrddim_add(st, "outbound", NULL, -1, 1, RRDDIM_INCREMENTAL);
+                }
+                else rrdset_next(st);
+
+                rrddim_set(st, "inbound", IFA_DATA(ierrors));
+                rrddim_set(st, "outbound", IFA_DATA(oerrors));
+                rrdset_done(st);
+
+                // --------------------------------------------------------------------
+
+                st = rrdset_find_bytype("net_drops", ifa->ifa_name);
+                if (unlikely(!st)) {
+                    st = rrdset_create("net_drops", ifa->ifa_name, NULL, ifa->ifa_name, "net.drops", "Interface Drops", "drops/s", 7003, update_every, RRDSET_TYPE_LINE);
+                    st->isdetail = 1;
+
+                    rrddim_add(st, "inbound", NULL, 1, 1, RRDDIM_INCREMENTAL);
+                    rrddim_add(st, "outbound", NULL, -1, 1, RRDDIM_INCREMENTAL);
+                }
+                else rrdset_next(st);
+
+                rrddim_set(st, "inbound", IFA_DATA(iqdrops));
+                rrddim_set(st, "outbound", IFA_DATA(oqdrops));
+                rrdset_done(st);
+
+                // --------------------------------------------------------------------
+
+                st = rrdset_find_bytype("net_events", ifa->ifa_name);
+                if (unlikely(!st)) {
+                    st = rrdset_create("net_events", ifa->ifa_name, NULL, ifa->ifa_name, "net.events", "Network Interface Events", "events/s", 7006, update_every, RRDSET_TYPE_LINE);
+                    st->isdetail = 1;
+
+                    rrddim_add(st, "frames", NULL, 1, 1, RRDDIM_INCREMENTAL);
+                    rrddim_add(st, "collisions", NULL, -1, 1, RRDDIM_INCREMENTAL);
+                    rrddim_add(st, "carrier", NULL, -1, 1, RRDDIM_INCREMENTAL);
+                }
+                else rrdset_next(st);
+
+                rrddim_set(st, "collisions", IFA_DATA(collisions));
+                rrdset_done(st);
+            }
+
+            freeifaddrs(ifap);
+        }
+    }
+
     return 0;
 }