From a82b4c30cb0d7f84ba91c83332bc61d0d78e318f Mon Sep 17 00:00:00 2001 From: Brian Brazil Date: Sun, 20 Dec 2015 00:57:52 +0000 Subject: [PATCH] Add linux conntrack collector. --- collector/conntrack_linux.go | 81 +++++++++++++++++++ collector/fixtures/e2e-output.txt | 6 ++ .../proc/sys/net/netfilter/nf_conntrack_count | 1 + .../proc/sys/net/netfilter/nf_conntrack_max | 1 + end-to-end-test.sh | 2 +- node_exporter.go | 2 +- 6 files changed, 91 insertions(+), 2 deletions(-) create mode 100644 collector/conntrack_linux.go create mode 100644 collector/fixtures/proc/sys/net/netfilter/nf_conntrack_count create mode 100644 collector/fixtures/proc/sys/net/netfilter/nf_conntrack_max diff --git a/collector/conntrack_linux.go b/collector/conntrack_linux.go new file mode 100644 index 00000000..943155b4 --- /dev/null +++ b/collector/conntrack_linux.go @@ -0,0 +1,81 @@ +// Copyright 2015 The Prometheus Authors +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +// +build !noconntrack + +package collector + +import ( + "io/ioutil" + "strconv" + "strings" + + "github.com/prometheus/client_golang/prometheus" +) + +type conntrackCollector struct { + current *prometheus.Desc + limit *prometheus.Desc +} + +func init() { + Factories["conntrack"] = NewConntrackCollector +} + +// Takes a prometheus registry and returns a new Collector exposing +// conntrack stats +func NewConntrackCollector() (Collector, error) { + return &conntrackCollector{ + current: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, "", "nf_conntrack_entries"), + "Number of currently allocated flow entries for connection tracking.", + nil, nil, + ), + limit: prometheus.NewDesc( + prometheus.BuildFQName(Namespace, "", "nf_conntrack_entries_limit"), + "Maximum size of connection tracking table.", + nil, nil, + ), + }, nil +} + +func (c *conntrackCollector) Update(ch chan<- prometheus.Metric) (err error) { + value, err := readUintFromFile(procFilePath("sys/net/netfilter/nf_conntrack_count")) + if err != nil { + // Conntrack probably not loaded into the kernel. + return nil + } + ch <- prometheus.MustNewConstMetric( + c.current, prometheus.GaugeValue, float64(value)) + + value, err = readUintFromFile(procFilePath("sys/net/netfilter/nf_conntrack_max")) + if err != nil { + return nil + } + ch <- prometheus.MustNewConstMetric( + c.limit, prometheus.GaugeValue, float64(value)) + + return nil +} + +func readUintFromFile(path string) (uint64, error) { + data, err := ioutil.ReadFile(path) + if err != nil { + return 0, err + } + value, err := strconv.ParseUint(strings.TrimSpace(string(data)), 10, 64) + if err != nil { + return 0, err + } + return value, nil +} diff --git a/collector/fixtures/e2e-output.txt b/collector/fixtures/e2e-output.txt index 16d006c5..13db9173 100644 --- a/collector/fixtures/e2e-output.txt +++ b/collector/fixtures/e2e-output.txt @@ -1274,6 +1274,12 @@ node_network_transmit_packets{device="lxcbr0"} 28339 node_network_transmit_packets{device="tun0"} 934 node_network_transmit_packets{device="veth4B09XN"} 10640 node_network_transmit_packets{device="wlan0"} 1.17262e+07 +# HELP node_nf_conntrack_entries Number of currently allocated flow entries for connection tracking. +# TYPE node_nf_conntrack_entries gauge +node_nf_conntrack_entries 123 +# HELP node_nf_conntrack_entries_limit Maximum size of connection tracking table. +# TYPE node_nf_conntrack_entries_limit gauge +node_nf_conntrack_entries_limit 65536 # HELP node_procs_blocked Number of processes blocked waiting for I/O to complete. # TYPE node_procs_blocked gauge node_procs_blocked 0 diff --git a/collector/fixtures/proc/sys/net/netfilter/nf_conntrack_count b/collector/fixtures/proc/sys/net/netfilter/nf_conntrack_count new file mode 100644 index 00000000..190a1803 --- /dev/null +++ b/collector/fixtures/proc/sys/net/netfilter/nf_conntrack_count @@ -0,0 +1 @@ +123 diff --git a/collector/fixtures/proc/sys/net/netfilter/nf_conntrack_max b/collector/fixtures/proc/sys/net/netfilter/nf_conntrack_max new file mode 100644 index 00000000..e2ed8f4d --- /dev/null +++ b/collector/fixtures/proc/sys/net/netfilter/nf_conntrack_max @@ -0,0 +1 @@ +65536 diff --git a/end-to-end-test.sh b/end-to-end-test.sh index f88a2076..0294364d 100755 --- a/end-to-end-test.sh +++ b/end-to-end-test.sh @@ -42,7 +42,7 @@ fi ./node_exporter \ -collector.procfs="collector/fixtures/proc" \ -collector.sysfs="collector/fixtures/sys" \ - -collectors.enabled="diskstats,filefd,loadavg,mdadm,meminfo,netdev,netstat,sockstat,stat,textfile,bonding,megacli" \ + -collectors.enabled="conntrack,diskstats,filefd,loadavg,mdadm,meminfo,netdev,netstat,sockstat,stat,textfile,bonding,megacli" \ -collector.textfile.directory="collector/fixtures/textfile/two_metric_files/" \ -collector.megacli.command="collector/fixtures/megacli" \ -web.listen-address "127.0.0.1:${port}" \ diff --git a/node_exporter.go b/node_exporter.go index 2a075d02..b1e2549e 100644 --- a/node_exporter.go +++ b/node_exporter.go @@ -42,7 +42,7 @@ var ( listenAddress = flag.String("web.listen-address", ":9100", "Address on which to expose metrics and web interface.") metricsPath = flag.String("web.telemetry-path", "/metrics", "Path under which to expose metrics.") enabledCollectors = flag.String("collectors.enabled", - filterAvailableCollectors("diskstats,filefd,filesystem,loadavg,mdadm,meminfo,netdev,netstat,sockstat,stat,textfile,time,uname"), + filterAvailableCollectors("conntrack,diskstats,filefd,filesystem,loadavg,mdadm,meminfo,netdev,netstat,sockstat,stat,textfile,time,uname"), "Comma-separated list of collectors to use.") printCollectors = flag.Bool("collectors.print", false, "If true, print available collectors and exit.")