From 7094c2ce2cf5c03d53c94b408a409c2465096465 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Tue, 12 Nov 2019 00:04:01 -0800 Subject: [PATCH 01/85] this is just a start, nothing works yet --- Gopkg.lock | 77 ++++++++++++++++++++++++++++++++++++++++ examples/MANUAL.md | 16 +++++++-- examples/up.conf.example | 10 +++++- examples/up.json.example | 1 + examples/up.xml.example | 11 +++++- examples/up.yaml.example | 9 ++++- unifipoller/config.go | 2 ++ unifipoller/start.go | 25 ++++++++++--- unifipoller/unifi.go | 27 +++++++++----- 9 files changed, 160 insertions(+), 18 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index ebe365dd5..2c504530f 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -9,6 +9,22 @@ revision = "3012a1dbe2e4bd1391d42b32f0577cb7bbc7f005" version = "v0.3.1" +[[projects]] + digest = "1:d6afaeed1502aa28e80a4ed0981d570ad91b2579193404256ce672ed0a609e0d" + name = "github.com/beorn7/perks" + packages = ["quantile"] + pruneopts = "UT" + revision = "37c8de3658fcb183f997c4e13e8337516ab753e6" + version = "v1.0.1" + +[[projects]] + digest = "1:573ca21d3669500ff845bdebee890eb7fc7f0f50c59f2132f2a0c6b03d85086a" + name = "github.com/golang/protobuf" + packages = ["proto"] + pruneopts = "UT" + revision = "6c65a5562fc06764971b7c5d05c76c75e84bdbf7" + version = "v1.3.2" + [[projects]] branch = "master" digest = "1:50708c8fc92aec981df5c446581cf9f90ba9e2a5692118e0ce75d4534aaa14a2" @@ -21,6 +37,58 @@ pruneopts = "UT" revision = "fc22c7df067eefd070157f157893fbce961d6359" +[[projects]] + digest = "1:ff5ebae34cfbf047d505ee150de27e60570e8c394b3b8fdbb720ff6ac71985fc" + name = "github.com/matttproud/golang_protobuf_extensions" + packages = ["pbutil"] + pruneopts = "UT" + revision = "c12348ce28de40eed0136aa2b644d0ee0650e56c" + version = "v1.0.1" + +[[projects]] + digest = "1:eb04f69c8991e52eff33c428bd729e04208bf03235be88e4df0d88497c6861b9" + name = "github.com/prometheus/client_golang" + packages = [ + "prometheus", + "prometheus/internal", + "prometheus/promhttp", + ] + pruneopts = "UT" + revision = "170205fb58decfd011f1550d4cfb737230d7ae4f" + version = "v1.1.0" + +[[projects]] + branch = "master" + digest = "1:2d5cd61daa5565187e1d96bae64dbbc6080dacf741448e9629c64fd93203b0d4" + name = "github.com/prometheus/client_model" + packages = ["go"] + pruneopts = "UT" + revision = "14fe0d1b01d4d5fc031dd4bec1823bd3ebbe8016" + +[[projects]] + digest = "1:f119e3205d3a1f0f19dbd7038eb37528e2c6f0933269dc344e305951fb87d632" + name = "github.com/prometheus/common" + packages = [ + "expfmt", + "internal/bitbucket.org/ww/goautoneg", + "model", + ] + pruneopts = "UT" + revision = "287d3e634a1e550c9e463dd7e5a75a422c614505" + version = "v0.7.0" + +[[projects]] + digest = "1:3e363393b80d8f142984a811464eb7e34064700626cc111887373ea76f8ea0bf" + name = "github.com/prometheus/procfs" + packages = [ + ".", + "internal/fs", + "internal/util", + ] + pruneopts = "UT" + revision = "8a055596020d692cf491851e47ba3e302d9f90ce" + version = "v0.0.6" + [[projects]] digest = "1:524b71991fc7d9246cc7dc2d9e0886ccb97648091c63e30eef619e6862c955dd" name = "github.com/spf13/pflag" @@ -29,6 +97,14 @@ revision = "2e9d26c8c37aae03e3f9d4e90b7116f5accb7cab" version = "v1.0.5" +[[projects]] + branch = "master" + digest = "1:71b15a23c3c47b97dd98f97c6afde8da4de9f21dec38c34e2ac2e04dc7b09167" + name = "golang.org/x/sys" + packages = ["windows"] + pruneopts = "UT" + revision = "d32e6e3b99c40f2bfaea45ea9596ed539eed1c0d" + [[projects]] digest = "1:e74d5f03545d51228b9539aaffc5eb8a692fcb22f38fa60253437b1fc063a73b" name = "golift.io/unifi" @@ -51,6 +127,7 @@ input-imports = [ "github.com/BurntSushi/toml", "github.com/influxdata/influxdb1-client/v2", + "github.com/prometheus/client_golang/prometheus/promhttp", "github.com/spf13/pflag", "golift.io/unifi", "gopkg.in/yaml.v2", diff --git a/examples/MANUAL.md b/examples/MANUAL.md index c9ecd0de7..16038cf46 100644 --- a/examples/MANUAL.md +++ b/examples/MANUAL.md @@ -89,10 +89,10 @@ is provided so the application can be easily adapted to any environment. mode default: "influx" * Value: influx This default mode runs this application as a daemon. It will poll - the controller at the configured interval. Providing an invalid value - will run in this default mode. + the controller at the configured interval and report measurements to + InfluxDB. Providing an invalid value will run in this default mode. - * Value: influxlambda - (the only other available option right now) + * Value: influxlambda Setting this value will invoke a run-once mode where the application immediately polls the controller and reports the metrics to InfluxDB. Then it exits. This mode is useful in an AWS Lambda or a crontab where @@ -101,6 +101,16 @@ is provided so the application can be easily adapted to any environment. This mode can also be combined with a "test database" in InfluxDB to give yourself a "test config file" you may run ad-hoc to test changes. + * Value: prometheus + In this mode the application opens an http interface and exports the + measurements at /metrics for collection by prometheus. Enabling this + mode disables InfluxDB usage entirely. + + http_listen default: 0.0.0.0:61317 + This option controls the IP and port the http listener uses when the + mode is set to prometheus. This setting has no effect when other modes + are in use. + influx_url default: http://127.0.0.1:8086 This is the URL where the Influx web server is available. diff --git a/examples/up.conf.example b/examples/up.conf.example index ae6497e7a..e702ec28d 100644 --- a/examples/up.conf.example +++ b/examples/up.conf.example @@ -24,13 +24,21 @@ quiet = false # an invalid mode will also result in "influx". In this default mode the application # runs as a daemon and polls the controller at the configured interval. # -# There is only one other option at this time: "influxlambda" +# There are two other options at this time: "influxlambda" and "prometheus" # # Lambda mode makes the application exit after collecting and reporting metrics # to InfluxDB one time. This mode requires an external process like an AWS Lambda # or a simple crontab to keep the timings accurate on UniFi Poller run intervals. +# +# Prometheus mode opens an HTTP server on port 61317 and exports the metrics at +# /metrics for polling collection by a prometheus server. This disables influxdb. mode = "influx" + +# This controls on which ip and port /metrics is exported when mode is "prometheus". +# This has no effect in other modes. Must contain a colon and port. +http_listen = "0.0.0.0:61317" + # InfluxDB does not require auth by default, so the user/password are probably unimportant. influx_url = "http://127.0.0.1:8086" influx_user = "unifi" diff --git a/examples/up.json.example b/examples/up.json.example index e59ec7c34..7b67ac5b9 100644 --- a/examples/up.json.example +++ b/examples/up.json.example @@ -4,6 +4,7 @@ "debug": false, "quiet": false, "mode": "influx", + "http_listen": "0.0.0.0:61317", "influx_url": "http://127.0.0.1:8086", "influx_user": "unifi", "influx_pass": "unifi", diff --git a/examples/up.xml.example b/examples/up.xml.example index 87f1cac54..f77503e5d 100644 --- a/examples/up.xml.example +++ b/examples/up.xml.example @@ -40,14 +40,23 @@ # an invalid mode will also result in "influx". In this default mode the application # runs as a daemon and polls the controller at the configured interval. # - # There is only one other option at this time: "influxlambda" + # There are two other options at this time: "influxlambda" and "prometheus" # # Lambda mode makes the application exit after collecting and reporting metrics # to InfluxDB one time. This mode requires an external process like an AWS Lambda # or a simple crontab to keep the timings accurate on UniFi Poller run intervals. + # + # Prometheus mode opens an HTTP server on port 61317 and exports the metrics at + # /metrics for polling collection by a prometheus server. This disables influxdb. --> influx + + 0.0.0.0:61317 + diff --git a/examples/up.yaml.example b/examples/up.yaml.example index 1042c4e1b..c55b8d951 100644 --- a/examples/up.yaml.example +++ b/examples/up.yaml.example @@ -25,13 +25,20 @@ quiet: false # an invalid mode will also result in "influx". In this default mode the application # runs as a daemon and polls the controller at the configured interval. # -# There is only one other option at this time: "influxlambda" +# There are two other options at this time: "influxlambda" and "prometheus" # # Lambda mode makes the application exit after collecting and reporting metrics # to InfluxDB one time. This mode requires an external process like an AWS Lambda # or a simple crontab to keep the timings accurate on UniFi Poller run intervals. +# +# Prometheus mode opens an HTTP server on port 61317 and exports the metrics at +# /metrics for polling collection by a prometheus server. This disables influxdb. mode: "influx" +# This controls on which ip and port /metrics is exported when mode is "prometheus". +# This has no effect in other modes. Must contain a colon and port. +http_listen: "0.0.0.0:61317" + # InfluxDB does not require auth by default, so the user/password are probably unimportant. influx_url: "http://127.0.0.1:8086" influx_user: "unifi" diff --git a/unifipoller/config.go b/unifipoller/config.go index 56516dda8..7a4bdbfea 100644 --- a/unifipoller/config.go +++ b/unifipoller/config.go @@ -31,6 +31,7 @@ const ( defaultInfluxURL = "http://127.0.0.1:8086" defaultUnifiUser = "influx" defaultUnifiURL = "https://127.0.0.1:8443" + defaultHTTPListen = ":61317" ) // ENVConfigPrefix is the prefix appended to an env variable tag @@ -77,6 +78,7 @@ type Config struct { ReAuth bool `json:"reauthenticate" toml:"reauthenticate" xml:"reauthenticate" yaml:"reauthenticate" env:"REAUTHENTICATE"` InfxBadSSL bool `json:"influx_insecure_ssl" toml:"influx_insecure_ssl" xml:"influx_insecure_ssl" yaml:"influx_insecure_ssl" env:"INFLUX_INSECURE_SSL"` Mode string `json:"mode" toml:"mode" xml:"mode" yaml:"mode" env:"POLLING_MODE"` + HTTPListen string `json:"http_listen" toml:"http_listen" xml:"http_listen" yaml:"http_listen" env:"HTTP_LISTEN"` InfluxURL string `json:"influx_url,omitempty" toml:"influx_url,omitempty" xml:"influx_url" yaml:"influx_url" env:"INFLUX_URL"` InfluxUser string `json:"influx_user,omitempty" toml:"influx_user,omitempty" xml:"influx_user" yaml:"influx_user" env:"INFLUX_USER"` InfluxPass string `json:"influx_pass,omitempty" toml:"influx_pass,omitempty" xml:"influx_pass" yaml:"influx_pass" env:"INFLUX_PASS"` diff --git a/unifipoller/start.go b/unifipoller/start.go index 334119a18..d154cd882 100644 --- a/unifipoller/start.go +++ b/unifipoller/start.go @@ -4,11 +4,13 @@ import ( "crypto/tls" "fmt" "log" + "net/http" "os" "strings" "time" influx "github.com/influxdata/influxdb1-client/v2" + "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/spf13/pflag" "golift.io/unifi" ) @@ -30,6 +32,7 @@ func Start() error { UnifiBase: defaultUnifiURL, Interval: Duration{defaultInterval}, Sites: []string{"all"}, + HTTPListen: defaultHTTPListen, }} up.Flag.Parse(os.Args[1:]) if up.Flag.ShowVer { @@ -83,14 +86,28 @@ func (u *UnifiPoller) Run() (err error) { if err = u.GetInfluxDB(); err != nil { return err } - u.Logf("Logging Measurements to InfluxDB at %s as user %s", u.Config.InfluxURL, u.Config.InfluxUser) + switch strings.ToLower(u.Config.Mode) { case "influxlambda", "lambdainflux", "lambda_influx", "influx_lambda": - u.LogDebugf("Lambda Mode Enabled") + u.Logf("Logging Measurements to InfluxDB at %s as user %s one time (lambda mode)", + u.Config.InfluxURL, u.Config.InfluxUser) u.LastCheck = time.Now() - return u.CollectAndReport() + return u.CollectAndProcess(u.ReportMetrics) + case "prometheus", "exporter": + u.Logf("Exporting Measurements at https://%s/metrics for Prometheus", u.Config.HTTPListen) + u.Config.Mode = "http exporter" + http.Handle("/metrics", promhttp.Handler()) + go func() { + err = http.ListenAndServe(u.Config.HTTPListen, nil) + if err != http.ErrServerClosed { + log.Fatalf("[ERROR] http server: %v", err) + } + }() + return u.PollController(u.ExportMetrics) default: - return u.PollController() + u.Logf("Logging Measurements to InfluxDB at %s as user %s", u.Config.InfluxURL, u.Config.InfluxUser) + u.Config.Mode = "influx poller" + return u.PollController(u.ReportMetrics) } } diff --git a/unifipoller/unifi.go b/unifipoller/unifi.go index 57fd8c514..b74b7bc44 100644 --- a/unifipoller/unifi.go +++ b/unifipoller/unifi.go @@ -43,11 +43,12 @@ FIRST: return nil } -// PollController runs forever, polling UniFi, and pushing to influx. +// PollController runs forever, polling UniFi +// and pushing to influx OR exporting for prometheus. // This is started by Run() after everything checks out. -func (u *UnifiPoller) PollController() error { +func (u *UnifiPoller) PollController(process func(*Metrics) error) error { interval := u.Config.Interval.Round(time.Second) - log.Println("[INFO] Everything checks out! Poller started, interval:", interval) + log.Printf("[INFO] Everything checks out! Poller started in %v mode, interval: %v", u.Config.Mode, interval) ticker := time.NewTicker(interval) for u.LastCheck = range ticker.C { var err error @@ -60,7 +61,7 @@ func (u *UnifiPoller) PollController() error { } if err == nil { // Only run this if the authentication procedure didn't return error. - _ = u.CollectAndReport() + _ = u.CollectAndProcess(process) } if u.errorCount > 0 { return fmt.Errorf("controller or influxdb errors, stopping poller") @@ -69,12 +70,13 @@ func (u *UnifiPoller) PollController() error { return nil } -// CollectAndReport collects measurements and reports them to influxdb. +// CollectAndProcess collects measurements and then passese them into the +// provided method. The method is either an http exporter or an influxdb update. // Can be called once or in a ticker loop. This function and all the ones below // handle their own logging. An error is returned so the calling function may // determine if there was a read or write error and act on it. This is currently // called in two places in this library. One returns an error, one does not. -func (u *UnifiPoller) CollectAndReport() error { +func (u *UnifiPoller) CollectAndProcess(process func(*Metrics) error) error { metrics, err := u.CollectMetrics() if err != nil { return err @@ -82,8 +84,8 @@ func (u *UnifiPoller) CollectAndReport() error { if err := u.AugmentMetrics(metrics); err != nil { return err } - err = u.ReportMetrics(metrics) - u.LogError(err, "reporting metrics") + err = process(metrics) + u.LogError(err, "processing metrics") return err } @@ -145,6 +147,15 @@ func (u *UnifiPoller) AugmentMetrics(metrics *Metrics) error { return nil } +// ExportMetrics updates the internal metrics provided via +// HTTP at /metrics for prometheus collection. +func (u *UnifiPoller) ExportMetrics(metrics *Metrics) error { + /* + This is where it gets complicated, and probably deserves its own package. + */ + return nil +} + // ReportMetrics batches all the metrics and writes them to InfluxDB. // Returns an error if the write to influx fails. func (u *UnifiPoller) ReportMetrics(metrics *Metrics) error { From e2af4d9f72e4ca686d3c00cc79727a7c319cf00a Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Tue, 12 Nov 2019 00:05:40 -0800 Subject: [PATCH 02/85] rename internal package --- main.go | 4 ++-- {unifipoller => pollerunifi}/build_macos.go | 2 +- {unifipoller => pollerunifi}/build_unix.go | 2 +- {unifipoller => pollerunifi}/build_windows.go | 2 +- {unifipoller => pollerunifi}/config.go | 2 +- {unifipoller => pollerunifi}/dumper.go | 2 +- {unifipoller => pollerunifi}/helpers.go | 2 +- {unifipoller => pollerunifi}/influx_clients.go | 2 +- {unifipoller => pollerunifi}/influx_ids.go | 2 +- {unifipoller => pollerunifi}/influx_site.go | 2 +- {unifipoller => pollerunifi}/influx_uap.go | 2 +- {unifipoller => pollerunifi}/influx_udm.go | 2 +- {unifipoller => pollerunifi}/influx_usg.go | 2 +- {unifipoller => pollerunifi}/influx_usw.go | 2 +- {unifipoller => pollerunifi}/start.go | 2 +- {unifipoller => pollerunifi}/unifi.go | 2 +- 16 files changed, 17 insertions(+), 17 deletions(-) rename {unifipoller => pollerunifi}/build_macos.go (88%) rename {unifipoller => pollerunifi}/build_unix.go (88%) rename {unifipoller => pollerunifi}/build_windows.go (88%) rename {unifipoller => pollerunifi}/config.go (99%) rename {unifipoller => pollerunifi}/dumper.go (98%) rename {unifipoller => pollerunifi}/helpers.go (98%) rename {unifipoller => pollerunifi}/influx_clients.go (99%) rename {unifipoller => pollerunifi}/influx_ids.go (98%) rename {unifipoller => pollerunifi}/influx_site.go (99%) rename {unifipoller => pollerunifi}/influx_uap.go (99%) rename {unifipoller => pollerunifi}/influx_udm.go (99%) rename {unifipoller => pollerunifi}/influx_usg.go (99%) rename {unifipoller => pollerunifi}/influx_usw.go (99%) rename {unifipoller => pollerunifi}/start.go (99%) rename {unifipoller => pollerunifi}/unifi.go (99%) diff --git a/main.go b/main.go index 768d4af60..f3d3178f0 100644 --- a/main.go +++ b/main.go @@ -3,12 +3,12 @@ package main import ( "log" - "github.com/davidnewhall/unifi-poller/unifipoller" + "github.com/davidnewhall/unifi-poller/pollerunifi" ) // Keep it simple. func main() { - if err := unifipoller.Start(); err != nil { + if err := pollerunifi.Start(); err != nil { log.Fatalln("[ERROR]", err) } } diff --git a/unifipoller/build_macos.go b/pollerunifi/build_macos.go similarity index 88% rename from unifipoller/build_macos.go rename to pollerunifi/build_macos.go index d3eb3f508..373263a30 100644 --- a/unifipoller/build_macos.go +++ b/pollerunifi/build_macos.go @@ -1,6 +1,6 @@ // +build darwin -package unifipoller +package pollerunifi // DefaultConfFile is where to find config is --config is not prvided. const DefaultConfFile = "/usr/local/etc/unifi-poller/up.conf" diff --git a/unifipoller/build_unix.go b/pollerunifi/build_unix.go similarity index 88% rename from unifipoller/build_unix.go rename to pollerunifi/build_unix.go index 5fd6bdca3..8be9e2404 100644 --- a/unifipoller/build_unix.go +++ b/pollerunifi/build_unix.go @@ -1,6 +1,6 @@ // +build !windows,!darwin -package unifipoller +package pollerunifi // DefaultConfFile is where to find config is --config is not prvided. const DefaultConfFile = "/etc/unifi-poller/up.conf" diff --git a/unifipoller/build_windows.go b/pollerunifi/build_windows.go similarity index 88% rename from unifipoller/build_windows.go rename to pollerunifi/build_windows.go index 529a6570c..2a0538a78 100644 --- a/unifipoller/build_windows.go +++ b/pollerunifi/build_windows.go @@ -1,6 +1,6 @@ // +build windows -package unifipoller +package pollerunifi // DefaultConfFile is where to find config is --config is not prvided. const DefaultConfFile = `C:\ProgramData\unifi-poller\up.conf` diff --git a/unifipoller/config.go b/pollerunifi/config.go similarity index 99% rename from unifipoller/config.go rename to pollerunifi/config.go index 7a4bdbfea..8953c2f59 100644 --- a/unifipoller/config.go +++ b/pollerunifi/config.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( "encoding/json" diff --git a/unifipoller/dumper.go b/pollerunifi/dumper.go similarity index 98% rename from unifipoller/dumper.go rename to pollerunifi/dumper.go index 01d821ef7..8d20e217a 100644 --- a/unifipoller/dumper.go +++ b/pollerunifi/dumper.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( "fmt" diff --git a/unifipoller/helpers.go b/pollerunifi/helpers.go similarity index 98% rename from unifipoller/helpers.go rename to pollerunifi/helpers.go index 8adf54be4..6583daa7c 100644 --- a/unifipoller/helpers.go +++ b/pollerunifi/helpers.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( "fmt" diff --git a/unifipoller/influx_clients.go b/pollerunifi/influx_clients.go similarity index 99% rename from unifipoller/influx_clients.go rename to pollerunifi/influx_clients.go index 3ecb8ce0d..883528c50 100644 --- a/unifipoller/influx_clients.go +++ b/pollerunifi/influx_clients.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( "time" diff --git a/unifipoller/influx_ids.go b/pollerunifi/influx_ids.go similarity index 98% rename from unifipoller/influx_ids.go rename to pollerunifi/influx_ids.go index 2e78cc280..1c4c5378a 100644 --- a/unifipoller/influx_ids.go +++ b/pollerunifi/influx_ids.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( influx "github.com/influxdata/influxdb1-client/v2" diff --git a/unifipoller/influx_site.go b/pollerunifi/influx_site.go similarity index 99% rename from unifipoller/influx_site.go rename to pollerunifi/influx_site.go index 5cd45964a..c025e14a1 100644 --- a/unifipoller/influx_site.go +++ b/pollerunifi/influx_site.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( "strings" diff --git a/unifipoller/influx_uap.go b/pollerunifi/influx_uap.go similarity index 99% rename from unifipoller/influx_uap.go rename to pollerunifi/influx_uap.go index 968682f6b..6563440ad 100644 --- a/unifipoller/influx_uap.go +++ b/pollerunifi/influx_uap.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( "time" diff --git a/unifipoller/influx_udm.go b/pollerunifi/influx_udm.go similarity index 99% rename from unifipoller/influx_udm.go rename to pollerunifi/influx_udm.go index 2062c32c8..0ff7ecfcb 100644 --- a/unifipoller/influx_udm.go +++ b/pollerunifi/influx_udm.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( "time" diff --git a/unifipoller/influx_usg.go b/pollerunifi/influx_usg.go similarity index 99% rename from unifipoller/influx_usg.go rename to pollerunifi/influx_usg.go index 4549247a9..57dfdd123 100644 --- a/unifipoller/influx_usg.go +++ b/pollerunifi/influx_usg.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( "strings" diff --git a/unifipoller/influx_usw.go b/pollerunifi/influx_usw.go similarity index 99% rename from unifipoller/influx_usw.go rename to pollerunifi/influx_usw.go index f4c743f13..fe39f95d8 100644 --- a/unifipoller/influx_usw.go +++ b/pollerunifi/influx_usw.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( "time" diff --git a/unifipoller/start.go b/pollerunifi/start.go similarity index 99% rename from unifipoller/start.go rename to pollerunifi/start.go index d154cd882..ae5c48cb3 100644 --- a/unifipoller/start.go +++ b/pollerunifi/start.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( "crypto/tls" diff --git a/unifipoller/unifi.go b/pollerunifi/unifi.go similarity index 99% rename from unifipoller/unifi.go rename to pollerunifi/unifi.go index b74b7bc44..aac1f625c 100644 --- a/unifipoller/unifi.go +++ b/pollerunifi/unifi.go @@ -1,4 +1,4 @@ -package unifipoller +package pollerunifi import ( "fmt" From 641095f2af5e7eab259db57ae774d8ddc86f7ab2 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Tue, 12 Nov 2019 00:08:57 -0800 Subject: [PATCH 03/85] split influx code into new package --- .../influx_clients.go => pollerinflux/clients.go | 2 +- pollerunifi/influx_ids.go => pollerinflux/ids.go | 2 +- .../influx_site.go => pollerinflux/site.go | 2 +- pollerunifi/influx_uap.go => pollerinflux/uap.go | 2 +- pollerunifi/influx_udm.go => pollerinflux/udm.go | 2 +- pollerunifi/influx_usg.go => pollerinflux/usg.go | 2 +- pollerunifi/influx_usw.go => pollerinflux/usw.go | 2 +- pollerunifi/unifi.go | 15 ++++++++------- 8 files changed, 15 insertions(+), 14 deletions(-) rename pollerunifi/influx_clients.go => pollerinflux/clients.go (99%) rename pollerunifi/influx_ids.go => pollerinflux/ids.go (98%) rename pollerunifi/influx_site.go => pollerinflux/site.go (99%) rename pollerunifi/influx_uap.go => pollerinflux/uap.go (99%) rename pollerunifi/influx_udm.go => pollerinflux/udm.go (99%) rename pollerunifi/influx_usg.go => pollerinflux/usg.go (99%) rename pollerunifi/influx_usw.go => pollerinflux/usw.go (99%) diff --git a/pollerunifi/influx_clients.go b/pollerinflux/clients.go similarity index 99% rename from pollerunifi/influx_clients.go rename to pollerinflux/clients.go index 883528c50..45f08e1ce 100644 --- a/pollerunifi/influx_clients.go +++ b/pollerinflux/clients.go @@ -1,4 +1,4 @@ -package pollerunifi +package pollerinflux import ( "time" diff --git a/pollerunifi/influx_ids.go b/pollerinflux/ids.go similarity index 98% rename from pollerunifi/influx_ids.go rename to pollerinflux/ids.go index 1c4c5378a..740f66be8 100644 --- a/pollerunifi/influx_ids.go +++ b/pollerinflux/ids.go @@ -1,4 +1,4 @@ -package pollerunifi +package pollerinflux import ( influx "github.com/influxdata/influxdb1-client/v2" diff --git a/pollerunifi/influx_site.go b/pollerinflux/site.go similarity index 99% rename from pollerunifi/influx_site.go rename to pollerinflux/site.go index c025e14a1..0f12bbe4f 100644 --- a/pollerunifi/influx_site.go +++ b/pollerinflux/site.go @@ -1,4 +1,4 @@ -package pollerunifi +package pollerinflux import ( "strings" diff --git a/pollerunifi/influx_uap.go b/pollerinflux/uap.go similarity index 99% rename from pollerunifi/influx_uap.go rename to pollerinflux/uap.go index 6563440ad..fc0668ff3 100644 --- a/pollerunifi/influx_uap.go +++ b/pollerinflux/uap.go @@ -1,4 +1,4 @@ -package pollerunifi +package pollerinflux import ( "time" diff --git a/pollerunifi/influx_udm.go b/pollerinflux/udm.go similarity index 99% rename from pollerunifi/influx_udm.go rename to pollerinflux/udm.go index 0ff7ecfcb..54d66389f 100644 --- a/pollerunifi/influx_udm.go +++ b/pollerinflux/udm.go @@ -1,4 +1,4 @@ -package pollerunifi +package pollerinflux import ( "time" diff --git a/pollerunifi/influx_usg.go b/pollerinflux/usg.go similarity index 99% rename from pollerunifi/influx_usg.go rename to pollerinflux/usg.go index 57dfdd123..40c922338 100644 --- a/pollerunifi/influx_usg.go +++ b/pollerinflux/usg.go @@ -1,4 +1,4 @@ -package pollerunifi +package pollerinflux import ( "strings" diff --git a/pollerunifi/influx_usw.go b/pollerinflux/usw.go similarity index 99% rename from pollerunifi/influx_usw.go rename to pollerinflux/usw.go index fe39f95d8..aa608bb8d 100644 --- a/pollerunifi/influx_usw.go +++ b/pollerinflux/usw.go @@ -1,4 +1,4 @@ -package pollerunifi +package pollerinflux import ( "time" diff --git a/pollerunifi/unifi.go b/pollerunifi/unifi.go index aac1f625c..fe1db125b 100644 --- a/pollerunifi/unifi.go +++ b/pollerunifi/unifi.go @@ -6,6 +6,7 @@ import ( "strings" "time" + "github.com/davidnewhall/unifi-poller/pollerinflux" influx "github.com/influxdata/influxdb1-client/v2" "golift.io/unifi" ) @@ -205,15 +206,15 @@ func (m *Metrics) ProcessPoints() []error { } for _, asset := range m.Sites { - pts, err := SitePoints(asset, m.TS) + pts, err := pollerinflux.SitePoints(asset, m.TS) processPoints(m, pts, err) } for _, asset := range m.Clients { - pts, err := ClientPoints(asset, m.TS) + pts, err := pollerinflux.ClientPoints(asset, m.TS) processPoints(m, pts, err) } for _, asset := range m.IDSList { - pts, err := IDSPoints(asset) // no m.TS. + pts, err := pollerinflux.IDSPoints(asset) // no m.TS. processPoints(m, pts, err) } @@ -221,19 +222,19 @@ func (m *Metrics) ProcessPoints() []error { return errs } for _, asset := range m.Devices.UAPs { - pts, err := UAPPoints(asset, m.TS) + pts, err := pollerinflux.UAPPoints(asset, m.TS) processPoints(m, pts, err) } for _, asset := range m.Devices.USGs { - pts, err := USGPoints(asset, m.TS) + pts, err := pollerinflux.USGPoints(asset, m.TS) processPoints(m, pts, err) } for _, asset := range m.Devices.USWs { - pts, err := USWPoints(asset, m.TS) + pts, err := pollerinflux.USWPoints(asset, m.TS) processPoints(m, pts, err) } for _, asset := range m.Devices.UDMs { - pts, err := UDMPoints(asset, m.TS) + pts, err := pollerinflux.UDMPoints(asset, m.TS) processPoints(m, pts, err) } return errs From f6c73e7edbce33e403412bbfe7c11a07997fe1a4 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Tue, 12 Nov 2019 00:31:44 -0800 Subject: [PATCH 04/85] Rename all the packages --- influx/README.md | 4 ++ {pollerinflux => influx}/clients.go | 2 +- {pollerinflux => influx}/ids.go | 2 +- influx/metrics.go | 75 ++++++++++++++++++++++ {pollerinflux => influx}/site.go | 2 +- {pollerinflux => influx}/uap.go | 2 +- {pollerinflux => influx}/udm.go | 2 +- {pollerinflux => influx}/usg.go | 2 +- {pollerinflux => influx}/usw.go | 2 +- main.go | 4 +- {pollerunifi => poller}/build_macos.go | 2 +- {pollerunifi => poller}/build_unix.go | 2 +- {pollerunifi => poller}/build_windows.go | 2 +- {pollerunifi => poller}/config.go | 12 +--- {pollerunifi => poller}/dumper.go | 5 +- {pollerunifi => poller}/helpers.go | 2 +- {pollerunifi => poller}/start.go | 7 ++- {pollerunifi => poller}/unifi.go | 79 ++++-------------------- prometheus/README.md | 4 ++ 19 files changed, 117 insertions(+), 95 deletions(-) create mode 100644 influx/README.md rename {pollerinflux => influx}/clients.go (99%) rename {pollerinflux => influx}/ids.go (98%) create mode 100644 influx/metrics.go rename {pollerinflux => influx}/site.go (99%) rename {pollerinflux => influx}/uap.go (99%) rename {pollerinflux => influx}/udm.go (99%) rename {pollerinflux => influx}/usg.go (99%) rename {pollerinflux => influx}/usw.go (99%) rename {pollerunifi => poller}/build_macos.go (88%) rename {pollerunifi => poller}/build_unix.go (88%) rename {pollerunifi => poller}/build_windows.go (88%) rename {pollerunifi => poller}/config.go (96%) rename {pollerunifi => poller}/dumper.go (98%) rename {pollerunifi => poller}/helpers.go (98%) rename {pollerunifi => poller}/start.go (95%) rename {pollerunifi => poller}/unifi.go (71%) create mode 100644 prometheus/README.md diff --git a/influx/README.md b/influx/README.md new file mode 100644 index 000000000..cbc606c01 --- /dev/null +++ b/influx/README.md @@ -0,0 +1,4 @@ +# influx + +This package provides the methods to turn UniFi measurements into influx +data-points with appropriate tags and fields. diff --git a/pollerinflux/clients.go b/influx/clients.go similarity index 99% rename from pollerinflux/clients.go rename to influx/clients.go index 45f08e1ce..114a93985 100644 --- a/pollerinflux/clients.go +++ b/influx/clients.go @@ -1,4 +1,4 @@ -package pollerinflux +package influx import ( "time" diff --git a/pollerinflux/ids.go b/influx/ids.go similarity index 98% rename from pollerinflux/ids.go rename to influx/ids.go index 740f66be8..33f743ba7 100644 --- a/pollerinflux/ids.go +++ b/influx/ids.go @@ -1,4 +1,4 @@ -package pollerinflux +package influx import ( influx "github.com/influxdata/influxdb1-client/v2" diff --git a/influx/metrics.go b/influx/metrics.go new file mode 100644 index 000000000..7eb494957 --- /dev/null +++ b/influx/metrics.go @@ -0,0 +1,75 @@ +// Package influx provides the methods to turn UniFi measurements into influx +// data-points with appropriate tags and fields. +package influx + +import ( + "time" + + client "github.com/influxdata/influxdb1-client/v2" + "golift.io/unifi" +) + +// Metrics contains all the data from the controller and an influx endpoint to send it to. +type Metrics struct { + TS time.Time + unifi.Sites + unifi.IDSList + unifi.Clients + *unifi.Devices + client.BatchPoints +} + +// ProcessPoints batches all device and client data into influxdb data points. +// Call this after you've collected all the data you care about. +// This function is sorta weird and returns a slice of errors. The reasoning is +// that some points may process while others fail, so we attempt to process them +// all. This is (usually) run in a loop, so we can't really exit on error, +// we just log the errors and tally them on a counter. In reality, this never +// returns any errors because we control the data going in; cool right? But we +// still check&log it in case the data going is skewed up and causes errors! +func (m *Metrics) ProcessPoints() []error { + errs := []error{} + processPoints := func(m *Metrics, p []*client.Point, err error) { + switch { + case err != nil: + errs = append(errs, err) + case p == nil: + default: + m.BatchPoints.AddPoints(p) + } + } + + for _, asset := range m.Sites { + pts, err := SitePoints(asset, m.TS) + processPoints(m, pts, err) + } + for _, asset := range m.Clients { + pts, err := ClientPoints(asset, m.TS) + processPoints(m, pts, err) + } + for _, asset := range m.IDSList { + pts, err := IDSPoints(asset) // no m.TS. + processPoints(m, pts, err) + } + + if m.Devices == nil { + return errs + } + for _, asset := range m.Devices.UAPs { + pts, err := UAPPoints(asset, m.TS) + processPoints(m, pts, err) + } + for _, asset := range m.Devices.USGs { + pts, err := USGPoints(asset, m.TS) + processPoints(m, pts, err) + } + for _, asset := range m.Devices.USWs { + pts, err := USWPoints(asset, m.TS) + processPoints(m, pts, err) + } + for _, asset := range m.Devices.UDMs { + pts, err := UDMPoints(asset, m.TS) + processPoints(m, pts, err) + } + return errs +} diff --git a/pollerinflux/site.go b/influx/site.go similarity index 99% rename from pollerinflux/site.go rename to influx/site.go index 0f12bbe4f..786190242 100644 --- a/pollerinflux/site.go +++ b/influx/site.go @@ -1,4 +1,4 @@ -package pollerinflux +package influx import ( "strings" diff --git a/pollerinflux/uap.go b/influx/uap.go similarity index 99% rename from pollerinflux/uap.go rename to influx/uap.go index fc0668ff3..02394e7cc 100644 --- a/pollerinflux/uap.go +++ b/influx/uap.go @@ -1,4 +1,4 @@ -package pollerinflux +package influx import ( "time" diff --git a/pollerinflux/udm.go b/influx/udm.go similarity index 99% rename from pollerinflux/udm.go rename to influx/udm.go index 54d66389f..2bbff5255 100644 --- a/pollerinflux/udm.go +++ b/influx/udm.go @@ -1,4 +1,4 @@ -package pollerinflux +package influx import ( "time" diff --git a/pollerinflux/usg.go b/influx/usg.go similarity index 99% rename from pollerinflux/usg.go rename to influx/usg.go index 40c922338..8b358d0bd 100644 --- a/pollerinflux/usg.go +++ b/influx/usg.go @@ -1,4 +1,4 @@ -package pollerinflux +package influx import ( "strings" diff --git a/pollerinflux/usw.go b/influx/usw.go similarity index 99% rename from pollerinflux/usw.go rename to influx/usw.go index aa608bb8d..f2d1f9ea9 100644 --- a/pollerinflux/usw.go +++ b/influx/usw.go @@ -1,4 +1,4 @@ -package pollerinflux +package influx import ( "time" diff --git a/main.go b/main.go index f3d3178f0..c9ec4f3c7 100644 --- a/main.go +++ b/main.go @@ -3,12 +3,12 @@ package main import ( "log" - "github.com/davidnewhall/unifi-poller/pollerunifi" + "github.com/davidnewhall/unifi-poller/poller" ) // Keep it simple. func main() { - if err := pollerunifi.Start(); err != nil { + if err := poller.Start(); err != nil { log.Fatalln("[ERROR]", err) } } diff --git a/pollerunifi/build_macos.go b/poller/build_macos.go similarity index 88% rename from pollerunifi/build_macos.go rename to poller/build_macos.go index 373263a30..1ab324714 100644 --- a/pollerunifi/build_macos.go +++ b/poller/build_macos.go @@ -1,6 +1,6 @@ // +build darwin -package pollerunifi +package poller // DefaultConfFile is where to find config is --config is not prvided. const DefaultConfFile = "/usr/local/etc/unifi-poller/up.conf" diff --git a/pollerunifi/build_unix.go b/poller/build_unix.go similarity index 88% rename from pollerunifi/build_unix.go rename to poller/build_unix.go index 8be9e2404..c1001ac9b 100644 --- a/pollerunifi/build_unix.go +++ b/poller/build_unix.go @@ -1,6 +1,6 @@ // +build !windows,!darwin -package pollerunifi +package poller // DefaultConfFile is where to find config is --config is not prvided. const DefaultConfFile = "/etc/unifi-poller/up.conf" diff --git a/pollerunifi/build_windows.go b/poller/build_windows.go similarity index 88% rename from pollerunifi/build_windows.go rename to poller/build_windows.go index 2a0538a78..5c31504fe 100644 --- a/pollerunifi/build_windows.go +++ b/poller/build_windows.go @@ -1,6 +1,6 @@ // +build windows -package pollerunifi +package poller // DefaultConfFile is where to find config is --config is not prvided. const DefaultConfFile = `C:\ProgramData\unifi-poller\up.conf` diff --git a/pollerunifi/config.go b/poller/config.go similarity index 96% rename from pollerunifi/config.go rename to poller/config.go index 8953c2f59..58ef0f9b1 100644 --- a/pollerunifi/config.go +++ b/poller/config.go @@ -1,4 +1,4 @@ -package pollerunifi +package poller import ( "encoding/json" @@ -56,16 +56,6 @@ type Flag struct { *pflag.FlagSet } -// Metrics contains all the data from the controller and an influx endpoint to send it to. -type Metrics struct { - TS time.Time - unifi.Sites - unifi.IDSList - unifi.Clients - *unifi.Devices - influx.BatchPoints -} - // Config represents the data needed to poll a controller and report to influxdb. // This is all of the data stored in the config file. // Any with explicit defaults have omitempty on json and toml tags. diff --git a/pollerunifi/dumper.go b/poller/dumper.go similarity index 98% rename from pollerunifi/dumper.go rename to poller/dumper.go index 8d20e217a..da825485f 100644 --- a/pollerunifi/dumper.go +++ b/poller/dumper.go @@ -1,4 +1,4 @@ -package pollerunifi +package poller import ( "fmt" @@ -20,14 +20,17 @@ func (u *UnifiPoller) DumpJSONPayload() (err error) { if err != nil { return err } + fmt.Fprintf(os.Stderr, "[INFO] Authenticated to UniFi Controller @ %v as user %v", u.Config.UnifiBase, u.Config.UnifiUser) if err := u.CheckSites(); err != nil { return err } + u.Unifi.ErrorLog = func(m string, v ...interface{}) { fmt.Fprintf(os.Stderr, "[ERROR] "+m, v...) } // Log all errors to stderr. + switch sites, err := u.GetFilteredSites(); { case err != nil: return err diff --git a/pollerunifi/helpers.go b/poller/helpers.go similarity index 98% rename from pollerunifi/helpers.go rename to poller/helpers.go index 6583daa7c..3ac9bf4d8 100644 --- a/pollerunifi/helpers.go +++ b/poller/helpers.go @@ -1,4 +1,4 @@ -package pollerunifi +package poller import ( "fmt" diff --git a/pollerunifi/start.go b/poller/start.go similarity index 95% rename from pollerunifi/start.go rename to poller/start.go index ae5c48cb3..d9cbf8a87 100644 --- a/pollerunifi/start.go +++ b/poller/start.go @@ -1,4 +1,5 @@ -package pollerunifi +// Package poller provides the CLI interface to setup unifi-poller. +package poller import ( "crypto/tls" @@ -9,7 +10,7 @@ import ( "strings" "time" - influx "github.com/influxdata/influxdb1-client/v2" + client "github.com/influxdata/influxdb1-client/v2" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/spf13/pflag" "golift.io/unifi" @@ -113,7 +114,7 @@ func (u *UnifiPoller) Run() (err error) { // GetInfluxDB returns an InfluxDB interface. func (u *UnifiPoller) GetInfluxDB() (err error) { - u.Influx, err = influx.NewHTTPClient(influx.HTTPConfig{ + u.Influx, err = client.NewHTTPClient(client.HTTPConfig{ Addr: u.Config.InfluxURL, Username: u.Config.InfluxUser, Password: u.Config.InfluxPass, diff --git a/pollerunifi/unifi.go b/poller/unifi.go similarity index 71% rename from pollerunifi/unifi.go rename to poller/unifi.go index fe1db125b..4e78ed198 100644 --- a/pollerunifi/unifi.go +++ b/poller/unifi.go @@ -1,4 +1,4 @@ -package pollerunifi +package poller import ( "fmt" @@ -6,8 +6,8 @@ import ( "strings" "time" - "github.com/davidnewhall/unifi-poller/pollerinflux" - influx "github.com/influxdata/influxdb1-client/v2" + "github.com/davidnewhall/unifi-poller/influx" + client "github.com/influxdata/influxdb1-client/v2" "golift.io/unifi" ) @@ -47,7 +47,7 @@ FIRST: // PollController runs forever, polling UniFi // and pushing to influx OR exporting for prometheus. // This is started by Run() after everything checks out. -func (u *UnifiPoller) PollController(process func(*Metrics) error) error { +func (u *UnifiPoller) PollController(process func(*influx.Metrics) error) error { interval := u.Config.Interval.Round(time.Second) log.Printf("[INFO] Everything checks out! Poller started in %v mode, interval: %v", u.Config.Mode, interval) ticker := time.NewTicker(interval) @@ -77,7 +77,7 @@ func (u *UnifiPoller) PollController(process func(*Metrics) error) error { // handle their own logging. An error is returned so the calling function may // determine if there was a read or write error and act on it. This is currently // called in two places in this library. One returns an error, one does not. -func (u *UnifiPoller) CollectAndProcess(process func(*Metrics) error) error { +func (u *UnifiPoller) CollectAndProcess(process func(*influx.Metrics) error) error { metrics, err := u.CollectMetrics() if err != nil { return err @@ -92,8 +92,8 @@ func (u *UnifiPoller) CollectAndProcess(process func(*Metrics) error) error { // CollectMetrics grabs all the measurements from a UniFi controller and returns them. // This also creates an InfluxDB writer, and returns an error if that fails. -func (u *UnifiPoller) CollectMetrics() (*Metrics, error) { - m := &Metrics{TS: u.LastCheck} // At this point, it's the Current Check. +func (u *UnifiPoller) CollectMetrics() (*influx.Metrics, error) { + m := &influx.Metrics{TS: u.LastCheck} // At this point, it's the Current Check. var err error // Get the sites we care about. m.Sites, err = u.GetFilteredSites() @@ -109,7 +109,7 @@ func (u *UnifiPoller) CollectMetrics() (*Metrics, error) { m.Devices, err = u.Unifi.GetDevices(m.Sites) u.LogError(err, "unifi.GetDevices()") // Make a new Influx Points Batcher. - m.BatchPoints, err = influx.NewBatchPoints(influx.BatchPointsConfig{Database: u.Config.InfluxDB}) + m.BatchPoints, err = client.NewBatchPoints(client.BatchPointsConfig{Database: u.Config.InfluxDB}) u.LogError(err, "influx.NewBatchPoints") return m, err } @@ -117,7 +117,7 @@ func (u *UnifiPoller) CollectMetrics() (*Metrics, error) { // AugmentMetrics is our middleware layer between collecting metrics and writing them. // This is where we can manipuate the returned data or make arbitrary decisions. // This function currently adds parent device names to client metrics. -func (u *UnifiPoller) AugmentMetrics(metrics *Metrics) error { +func (u *UnifiPoller) AugmentMetrics(metrics *influx.Metrics) error { if metrics == nil || metrics.Devices == nil || metrics.Clients == nil { return fmt.Errorf("nil metrics, augment impossible") } @@ -150,7 +150,7 @@ func (u *UnifiPoller) AugmentMetrics(metrics *Metrics) error { // ExportMetrics updates the internal metrics provided via // HTTP at /metrics for prometheus collection. -func (u *UnifiPoller) ExportMetrics(metrics *Metrics) error { +func (u *UnifiPoller) ExportMetrics(metrics *influx.Metrics) error { /* This is where it gets complicated, and probably deserves its own package. */ @@ -159,10 +159,10 @@ func (u *UnifiPoller) ExportMetrics(metrics *Metrics) error { // ReportMetrics batches all the metrics and writes them to InfluxDB. // Returns an error if the write to influx fails. -func (u *UnifiPoller) ReportMetrics(metrics *Metrics) error { +func (u *UnifiPoller) ReportMetrics(metrics *influx.Metrics) error { // Batch (and send) all the points. for _, err := range metrics.ProcessPoints() { - u.LogError(err, "asset.Points()") + u.LogError(err, "metrics.ProcessPoints") } err := u.Influx.Write(metrics.BatchPoints) if err != nil { @@ -185,61 +185,6 @@ func (u *UnifiPoller) ReportMetrics(metrics *Metrics) error { return nil } -// ProcessPoints batches all device and client data into influxdb data points. -// Call this after you've collected all the data you care about. -// This function is sorta weird and returns a slice of errors. The reasoning is -// that some points may process while others fail, so we attempt to process them -// all. This is (usually) run in a loop, so we can't really exit on error, -// we just log the errors and tally them on a counter. In reality, this never -// returns any errors because we control the data going in; cool right? But we -// still check&log it in case the data going is skewed up and causes errors! -func (m *Metrics) ProcessPoints() []error { - errs := []error{} - processPoints := func(m *Metrics, p []*influx.Point, err error) { - switch { - case err != nil: - errs = append(errs, err) - case p == nil: - default: - m.BatchPoints.AddPoints(p) - } - } - - for _, asset := range m.Sites { - pts, err := pollerinflux.SitePoints(asset, m.TS) - processPoints(m, pts, err) - } - for _, asset := range m.Clients { - pts, err := pollerinflux.ClientPoints(asset, m.TS) - processPoints(m, pts, err) - } - for _, asset := range m.IDSList { - pts, err := pollerinflux.IDSPoints(asset) // no m.TS. - processPoints(m, pts, err) - } - - if m.Devices == nil { - return errs - } - for _, asset := range m.Devices.UAPs { - pts, err := pollerinflux.UAPPoints(asset, m.TS) - processPoints(m, pts, err) - } - for _, asset := range m.Devices.USGs { - pts, err := pollerinflux.USGPoints(asset, m.TS) - processPoints(m, pts, err) - } - for _, asset := range m.Devices.USWs { - pts, err := pollerinflux.USWPoints(asset, m.TS) - processPoints(m, pts, err) - } - for _, asset := range m.Devices.UDMs { - pts, err := pollerinflux.UDMPoints(asset, m.TS) - processPoints(m, pts, err) - } - return errs -} - // GetFilteredSites returns a list of sites to fetch data for. // Omits requested but unconfigured sites. Grabs the full list from the // controller and returns the sites provided in the config file. diff --git a/prometheus/README.md b/prometheus/README.md new file mode 100644 index 000000000..f883cfd4a --- /dev/null +++ b/prometheus/README.md @@ -0,0 +1,4 @@ +# prometheus + +This package provides the methods to turn UniFi measurements into prometheus +exported metrics with an HTTP listener. From dd27f90a62a4ab0240390f2f7c292b5090ba1385 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Tue, 12 Nov 2019 01:30:40 -0800 Subject: [PATCH 05/85] a few more steps --- influx/metrics.go | 12 ++----- metrics/metrics.go | 16 +++++++++ poller/start.go | 11 +++++-- poller/unifi.go | 73 +++++++++++++++++++++++++++--------------- prometheus/exporter.go | 13 ++++++++ 5 files changed, 88 insertions(+), 37 deletions(-) create mode 100644 metrics/metrics.go create mode 100644 prometheus/exporter.go diff --git a/influx/metrics.go b/influx/metrics.go index 7eb494957..d49cfa8be 100644 --- a/influx/metrics.go +++ b/influx/metrics.go @@ -3,19 +3,13 @@ package influx import ( - "time" - + "github.com/davidnewhall/unifi-poller/metrics" client "github.com/influxdata/influxdb1-client/v2" - "golift.io/unifi" ) // Metrics contains all the data from the controller and an influx endpoint to send it to. type Metrics struct { - TS time.Time - unifi.Sites - unifi.IDSList - unifi.Clients - *unifi.Devices + *metrics.Metrics client.BatchPoints } @@ -35,7 +29,7 @@ func (m *Metrics) ProcessPoints() []error { errs = append(errs, err) case p == nil: default: - m.BatchPoints.AddPoints(p) + m.AddPoints(p) } } diff --git a/metrics/metrics.go b/metrics/metrics.go new file mode 100644 index 000000000..2d38f54ef --- /dev/null +++ b/metrics/metrics.go @@ -0,0 +1,16 @@ +package metrics + +import ( + "time" + + "golift.io/unifi" +) + +// Metrics is a type shared by the exporting and reporting packages. +type Metrics struct { + TS time.Time + unifi.Sites + unifi.IDSList + unifi.Clients + *unifi.Devices +} diff --git a/poller/start.go b/poller/start.go index d9cbf8a87..0ffe483b7 100644 --- a/poller/start.go +++ b/poller/start.go @@ -84,16 +84,17 @@ func (u *UnifiPoller) Run() (err error) { } u.Logf("Polling UniFi Controller at %s v%s as user %s. Sites: %v", u.Config.UnifiBase, u.Unifi.ServerVersion, u.Config.UnifiUser, u.Config.Sites) - if err = u.GetInfluxDB(); err != nil { - return err - } switch strings.ToLower(u.Config.Mode) { case "influxlambda", "lambdainflux", "lambda_influx", "influx_lambda": + if err = u.GetInfluxDB(); err != nil { + return err + } u.Logf("Logging Measurements to InfluxDB at %s as user %s one time (lambda mode)", u.Config.InfluxURL, u.Config.InfluxUser) u.LastCheck = time.Now() return u.CollectAndProcess(u.ReportMetrics) + case "prometheus", "exporter": u.Logf("Exporting Measurements at https://%s/metrics for Prometheus", u.Config.HTTPListen) u.Config.Mode = "http exporter" @@ -105,7 +106,11 @@ func (u *UnifiPoller) Run() (err error) { } }() return u.PollController(u.ExportMetrics) + default: + if err = u.GetInfluxDB(); err != nil { + return err + } u.Logf("Logging Measurements to InfluxDB at %s as user %s", u.Config.InfluxURL, u.Config.InfluxUser) u.Config.Mode = "influx poller" return u.PollController(u.ReportMetrics) diff --git a/poller/unifi.go b/poller/unifi.go index 4e78ed198..f69c9815d 100644 --- a/poller/unifi.go +++ b/poller/unifi.go @@ -7,6 +7,8 @@ import ( "time" "github.com/davidnewhall/unifi-poller/influx" + "github.com/davidnewhall/unifi-poller/metrics" + "github.com/davidnewhall/unifi-poller/prometheus" client "github.com/influxdata/influxdb1-client/v2" "golift.io/unifi" ) @@ -47,7 +49,7 @@ FIRST: // PollController runs forever, polling UniFi // and pushing to influx OR exporting for prometheus. // This is started by Run() after everything checks out. -func (u *UnifiPoller) PollController(process func(*influx.Metrics) error) error { +func (u *UnifiPoller) PollController(process func(*metrics.Metrics) error) error { interval := u.Config.Interval.Round(time.Second) log.Printf("[INFO] Everything checks out! Poller started in %v mode, interval: %v", u.Config.Mode, interval) ticker := time.NewTicker(interval) @@ -65,7 +67,7 @@ func (u *UnifiPoller) PollController(process func(*influx.Metrics) error) error _ = u.CollectAndProcess(process) } if u.errorCount > 0 { - return fmt.Errorf("controller or influxdb errors, stopping poller") + return fmt.Errorf("too many errors, stopping poller") } } return nil @@ -77,7 +79,7 @@ func (u *UnifiPoller) PollController(process func(*influx.Metrics) error) error // handle their own logging. An error is returned so the calling function may // determine if there was a read or write error and act on it. This is currently // called in two places in this library. One returns an error, one does not. -func (u *UnifiPoller) CollectAndProcess(process func(*influx.Metrics) error) error { +func (u *UnifiPoller) CollectAndProcess(process func(*metrics.Metrics) error) error { metrics, err := u.CollectMetrics() if err != nil { return err @@ -91,9 +93,8 @@ func (u *UnifiPoller) CollectAndProcess(process func(*influx.Metrics) error) err } // CollectMetrics grabs all the measurements from a UniFi controller and returns them. -// This also creates an InfluxDB writer, and returns an error if that fails. -func (u *UnifiPoller) CollectMetrics() (*influx.Metrics, error) { - m := &influx.Metrics{TS: u.LastCheck} // At this point, it's the Current Check. +func (u *UnifiPoller) CollectMetrics() (*metrics.Metrics, error) { + m := &metrics.Metrics{TS: u.LastCheck} // At this point, it's the Current Check. var err error // Get the sites we care about. m.Sites, err = u.GetFilteredSites() @@ -108,16 +109,13 @@ func (u *UnifiPoller) CollectMetrics() (*influx.Metrics, error) { u.LogError(err, "unifi.GetClients()") m.Devices, err = u.Unifi.GetDevices(m.Sites) u.LogError(err, "unifi.GetDevices()") - // Make a new Influx Points Batcher. - m.BatchPoints, err = client.NewBatchPoints(client.BatchPointsConfig{Database: u.Config.InfluxDB}) - u.LogError(err, "influx.NewBatchPoints") return m, err } // AugmentMetrics is our middleware layer between collecting metrics and writing them. // This is where we can manipuate the returned data or make arbitrary decisions. // This function currently adds parent device names to client metrics. -func (u *UnifiPoller) AugmentMetrics(metrics *influx.Metrics) error { +func (u *UnifiPoller) AugmentMetrics(metrics *metrics.Metrics) error { if metrics == nil || metrics.Devices == nil || metrics.Clients == nil { return fmt.Errorf("nil metrics, augment impossible") } @@ -150,39 +148,64 @@ func (u *UnifiPoller) AugmentMetrics(metrics *influx.Metrics) error { // ExportMetrics updates the internal metrics provided via // HTTP at /metrics for prometheus collection. -func (u *UnifiPoller) ExportMetrics(metrics *influx.Metrics) error { - /* - This is where it gets complicated, and probably deserves its own package. - */ +func (u *UnifiPoller) ExportMetrics(metrics *metrics.Metrics) error { + m := &prometheus.Metrics{Metrics: metrics} + for _, err := range m.ProcessExports() { + u.LogError(err, "prometheus.ProcessExports") + } + u.LogExportReport(m) return nil } +// LogExportReport writes a log line after exporting metrics via HTTP. +func (u *UnifiPoller) LogExportReport(m *prometheus.Metrics) { + idsMsg := "" + if u.Config.CollectIDS { + idsMsg = fmt.Sprintf(", IDS Events: %d, ", len(m.IDSList)) + } + u.Logf("UniFi Measurements Exported. Sites: %d, Clients: %d, "+ + "Wireless APs: %d, Gateways: %d, Switches: %d%s", + len(m.Sites), len(m.Clients), len(m.UAPs), + len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg) +} + // ReportMetrics batches all the metrics and writes them to InfluxDB. -// Returns an error if the write to influx fails. -func (u *UnifiPoller) ReportMetrics(metrics *influx.Metrics) error { +// This creates an InfluxDB writer, and returns an error if the write fails. +func (u *UnifiPoller) ReportMetrics(metrics *metrics.Metrics) error { // Batch (and send) all the points. - for _, err := range metrics.ProcessPoints() { - u.LogError(err, "metrics.ProcessPoints") - } - err := u.Influx.Write(metrics.BatchPoints) + m := &influx.Metrics{Metrics: metrics} + // Make a new Influx Points Batcher. + var err error + m.BatchPoints, err = client.NewBatchPoints(client.BatchPointsConfig{Database: u.Config.InfluxDB}) if err != nil { + return fmt.Errorf("influx.NewBatchPoints: %v", err) + } + for _, err := range m.ProcessPoints() { + u.LogError(err, "influx.ProcessPoints") + } + if err = u.Influx.Write(m.BatchPoints); err != nil { return fmt.Errorf("influxdb.Write(points): %v", err) } + u.LogInfluxReport(m) + return nil +} + +// LogInfluxReport writes a log message after exporting to influxdb. +func (u *UnifiPoller) LogInfluxReport(m *influx.Metrics) { var fields, points int - for _, p := range metrics.Points() { + for _, p := range m.Points() { points++ i, _ := p.Fields() fields += len(i) } idsMsg := "" if u.Config.CollectIDS { - idsMsg = fmt.Sprintf("IDS Events: %d, ", len(metrics.IDSList)) + idsMsg = fmt.Sprintf("IDS Events: %d, ", len(m.IDSList)) } u.Logf("UniFi Measurements Recorded. Sites: %d, Clients: %d, "+ "Wireless APs: %d, Gateways: %d, Switches: %d, %sPoints: %d, Fields: %d", - len(metrics.Sites), len(metrics.Clients), len(metrics.UAPs), - len(metrics.UDMs)+len(metrics.USGs), len(metrics.USWs), idsMsg, points, fields) - return nil + len(m.Sites), len(m.Clients), len(m.UAPs), + len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg, points, fields) } // GetFilteredSites returns a list of sites to fetch data for. diff --git a/prometheus/exporter.go b/prometheus/exporter.go new file mode 100644 index 000000000..506ae8904 --- /dev/null +++ b/prometheus/exporter.go @@ -0,0 +1,13 @@ +package prometheus + +import "github.com/davidnewhall/unifi-poller/metrics" + +// Metrics contains all the data from the controller. +type Metrics struct { + *metrics.Metrics +} + +// ProcessExports turns the data into exported data. +func (m *Metrics) ProcessExports() []error { + return nil +} From 9bd4737730fdf93d8485f06f6baefe208907b942 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 00:52:13 -0800 Subject: [PATCH 06/85] Base layout .. maybe. --- Gopkg.lock | 5 +- examples/up.conf.example | 1 - poller/start.go | 30 ++-- poller/unifi.go | 66 +++++---- prometheus/exporter.go | 13 -- {prometheus => promunifi}/README.md | 2 +- promunifi/clients.go | 213 ++++++++++++++++++++++++++++ promunifi/collector.go | 135 ++++++++++++++++++ promunifi/ids.go | 10 ++ promunifi/site.go | 10 ++ promunifi/uap.go | 10 ++ promunifi/udm.go | 10 ++ promunifi/usg.go | 10 ++ promunifi/usw.go | 10 ++ 14 files changed, 471 insertions(+), 54 deletions(-) delete mode 100644 prometheus/exporter.go rename {prometheus => promunifi}/README.md (69%) create mode 100644 promunifi/clients.go create mode 100644 promunifi/collector.go create mode 100644 promunifi/ids.go create mode 100644 promunifi/site.go create mode 100644 promunifi/uap.go create mode 100644 promunifi/udm.go create mode 100644 promunifi/usg.go create mode 100644 promunifi/usw.go diff --git a/Gopkg.lock b/Gopkg.lock index 2c504530f..f8e483d86 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -46,11 +46,12 @@ version = "v1.0.1" [[projects]] - digest = "1:eb04f69c8991e52eff33c428bd729e04208bf03235be88e4df0d88497c6861b9" + digest = "1:eb8832cdc904ff89b70c524ab305bf3384c6411f9df6b9f2a41fddc2220e6613" name = "github.com/prometheus/client_golang" packages = [ "prometheus", "prometheus/internal", + "prometheus/promauto", "prometheus/promhttp", ] pruneopts = "UT" @@ -127,6 +128,8 @@ input-imports = [ "github.com/BurntSushi/toml", "github.com/influxdata/influxdb1-client/v2", + "github.com/prometheus/client_golang/prometheus", + "github.com/prometheus/client_golang/prometheus/promauto", "github.com/prometheus/client_golang/prometheus/promhttp", "github.com/spf13/pflag", "golift.io/unifi", diff --git a/examples/up.conf.example b/examples/up.conf.example index e702ec28d..82c1f9b13 100644 --- a/examples/up.conf.example +++ b/examples/up.conf.example @@ -34,7 +34,6 @@ quiet = false # /metrics for polling collection by a prometheus server. This disables influxdb. mode = "influx" - # This controls on which ip and port /metrics is exported when mode is "prometheus". # This has no effect in other modes. Must contain a colon and port. http_listen = "0.0.0.0:61317" diff --git a/poller/start.go b/poller/start.go index 0ffe483b7..871a55f2f 100644 --- a/poller/start.go +++ b/poller/start.go @@ -10,7 +10,9 @@ import ( "strings" "time" + "github.com/davidnewhall/unifi-poller/promunifi" client "github.com/influxdata/influxdb1-client/v2" + "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/spf13/pflag" "golift.io/unifi" @@ -98,19 +100,24 @@ func (u *UnifiPoller) Run() (err error) { case "prometheus", "exporter": u.Logf("Exporting Measurements at https://%s/metrics for Prometheus", u.Config.HTTPListen) u.Config.Mode = "http exporter" - http.Handle("/metrics", promhttp.Handler()) - go func() { - err = http.ListenAndServe(u.Config.HTTPListen, nil) - if err != http.ErrServerClosed { - log.Fatalf("[ERROR] http server: %v", err) - } - }() - return u.PollController(u.ExportMetrics) + http.Handle("/metrics", http.HandlerFunc(u.PromHandler)) + prometheus.MustRegister(promunifi.NewUnifiCollector(promunifi.UnifiCollectorOpts{ + CollectFn: u.ExportMetrics, + ReportErrors: true, + Namespace: "unifi", + CollectIDS: true, + })) + err = http.ListenAndServe(u.Config.HTTPListen, nil) + if err != http.ErrServerClosed { + return err + } + return nil default: if err = u.GetInfluxDB(); err != nil { return err } + u.Logf("Logging Measurements to InfluxDB at %s as user %s", u.Config.InfluxURL, u.Config.InfluxUser) u.Config.Mode = "influx poller" return u.PollController(u.ReportMetrics) @@ -128,9 +135,16 @@ func (u *UnifiPoller) GetInfluxDB() (err error) { if err != nil { return fmt.Errorf("influxdb: %v", err) } + return nil } +// PromHandler logs /metrics requests and serves them with the prometheus handler. +func (u *UnifiPoller) PromHandler(w http.ResponseWriter, r *http.Request) { + u.LogDebugf("/metrics endpoint polled by %v", r.RemoteAddr) + promhttp.Handler().ServeHTTP(w, r) +} + // GetUnifi returns a UniFi controller interface. func (u *UnifiPoller) GetUnifi() (err error) { // Create an authenticated session to the Unifi Controller. diff --git a/poller/unifi.go b/poller/unifi.go index f69c9815d..9b4a87b4b 100644 --- a/poller/unifi.go +++ b/poller/unifi.go @@ -8,7 +8,6 @@ import ( "github.com/davidnewhall/unifi-poller/influx" "github.com/davidnewhall/unifi-poller/metrics" - "github.com/davidnewhall/unifi-poller/prometheus" client "github.com/influxdata/influxdb1-client/v2" "golift.io/unifi" ) @@ -84,14 +83,45 @@ func (u *UnifiPoller) CollectAndProcess(process func(*metrics.Metrics) error) er if err != nil { return err } - if err := u.AugmentMetrics(metrics); err != nil { - return err - } + u.AugmentMetrics(metrics) err = process(metrics) u.LogError(err, "processing metrics") return err } +// ExportMetrics updates the internal metrics provided via +// HTTP at /metrics for prometheus collection. +func (u *UnifiPoller) ExportMetrics() *metrics.Metrics { + if u.Config.ReAuth { + u.LogDebugf("Re-authenticating to UniFi Controller") + // Some users need to re-auth every interval because the cookie times out. + if err := u.Unifi.Login(); err != nil { + u.LogError(err, "re-authenticating") + return nil + } + } + metrics, err := u.CollectMetrics() + if err != nil { + u.LogErrorf("collecting metrics: %v", err) + return nil + } + u.AugmentMetrics(metrics) + u.LogExportReport(metrics) + return metrics +} + +// LogExportReport writes a log line after exporting metrics via HTTP. +func (u *UnifiPoller) LogExportReport(m *metrics.Metrics) { + idsMsg := "" + if u.Config.CollectIDS { + idsMsg = fmt.Sprintf(", IDS Events: %d, ", len(m.IDSList)) + } + u.Logf("UniFi Measurements Exported. Sites: %d, Clients: %d, "+ + "Wireless APs: %d, Gateways: %d, Switches: %d%s", + len(m.Sites), len(m.Clients), len(m.UAPs), + len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg) +} + // CollectMetrics grabs all the measurements from a UniFi controller and returns them. func (u *UnifiPoller) CollectMetrics() (*metrics.Metrics, error) { m := &metrics.Metrics{TS: u.LastCheck} // At this point, it's the Current Check. @@ -115,9 +145,9 @@ func (u *UnifiPoller) CollectMetrics() (*metrics.Metrics, error) { // AugmentMetrics is our middleware layer between collecting metrics and writing them. // This is where we can manipuate the returned data or make arbitrary decisions. // This function currently adds parent device names to client metrics. -func (u *UnifiPoller) AugmentMetrics(metrics *metrics.Metrics) error { +func (u *UnifiPoller) AugmentMetrics(metrics *metrics.Metrics) { if metrics == nil || metrics.Devices == nil || metrics.Clients == nil { - return fmt.Errorf("nil metrics, augment impossible") + return } devices := make(map[string]string) bssdIDs := make(map[string]string) @@ -143,30 +173,6 @@ func (u *UnifiPoller) AugmentMetrics(metrics *metrics.Metrics) error { metrics.Clients[i].GwName = devices[c.GwMac] metrics.Clients[i].RadioDescription = bssdIDs[metrics.Clients[i].Bssid] + metrics.Clients[i].RadioProto } - return nil -} - -// ExportMetrics updates the internal metrics provided via -// HTTP at /metrics for prometheus collection. -func (u *UnifiPoller) ExportMetrics(metrics *metrics.Metrics) error { - m := &prometheus.Metrics{Metrics: metrics} - for _, err := range m.ProcessExports() { - u.LogError(err, "prometheus.ProcessExports") - } - u.LogExportReport(m) - return nil -} - -// LogExportReport writes a log line after exporting metrics via HTTP. -func (u *UnifiPoller) LogExportReport(m *prometheus.Metrics) { - idsMsg := "" - if u.Config.CollectIDS { - idsMsg = fmt.Sprintf(", IDS Events: %d, ", len(m.IDSList)) - } - u.Logf("UniFi Measurements Exported. Sites: %d, Clients: %d, "+ - "Wireless APs: %d, Gateways: %d, Switches: %d%s", - len(m.Sites), len(m.Clients), len(m.UAPs), - len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg) } // ReportMetrics batches all the metrics and writes them to InfluxDB. diff --git a/prometheus/exporter.go b/prometheus/exporter.go deleted file mode 100644 index 506ae8904..000000000 --- a/prometheus/exporter.go +++ /dev/null @@ -1,13 +0,0 @@ -package prometheus - -import "github.com/davidnewhall/unifi-poller/metrics" - -// Metrics contains all the data from the controller. -type Metrics struct { - *metrics.Metrics -} - -// ProcessExports turns the data into exported data. -func (m *Metrics) ProcessExports() []error { - return nil -} diff --git a/prometheus/README.md b/promunifi/README.md similarity index 69% rename from prometheus/README.md rename to promunifi/README.md index f883cfd4a..27e9ef042 100644 --- a/prometheus/README.md +++ b/promunifi/README.md @@ -1,4 +1,4 @@ # prometheus This package provides the methods to turn UniFi measurements into prometheus -exported metrics with an HTTP listener. +exported metrics. diff --git a/promunifi/clients.go b/promunifi/clients.go new file mode 100644 index 000000000..f4511c98b --- /dev/null +++ b/promunifi/clients.go @@ -0,0 +1,213 @@ +package promunifi + +import ( + "github.com/prometheus/client_golang/prometheus" + "golift.io/unifi" +) + +type client struct { + Anomalies *prometheus.Desc + BytesR *prometheus.Desc + CCQ *prometheus.Desc + Noise *prometheus.Desc + RoamCount *prometheus.Desc + RSSI *prometheus.Desc + RxBytes *prometheus.Desc + RxBytesR *prometheus.Desc + RxPackets *prometheus.Desc + RxRate *prometheus.Desc + Signal *prometheus.Desc + TxBytes *prometheus.Desc + TxBytesR *prometheus.Desc + TxPackets *prometheus.Desc + TxPower *prometheus.Desc + TxRate *prometheus.Desc + Uptime *prometheus.Desc + WifiTxAttempts *prometheus.Desc + WiredRxBytes *prometheus.Desc + WiredRxBytesR *prometheus.Desc + WiredRxPackets *prometheus.Desc + WiredTxBytes *prometheus.Desc + WiredTxBytesR *prometheus.Desc + WiredTxPackets *prometheus.Desc + DpiStatsApp *prometheus.Desc + DpiStatsCat *prometheus.Desc + DpiStatsRxBytes *prometheus.Desc + DpiStatsRxPackets *prometheus.Desc + DpiStatsTxBytes *prometheus.Desc + DpiStatsTxPackets *prometheus.Desc +} + +func descClient(ns string) *client { + labels := []string{"id", "mac", "user_id", "site_id", "site_name", + "network_id", "ap_mac", "gw_mac", "sw_mac", "ap_name", "gw_name", + "sw_name", "radio_name", "radio", "radio_proto", "name", "channel", + "vlan", "ip", "essid", "bssid", "radio_desc"} + ns2 := "client" + + return &client{ + Anomalies: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "anomalies"), + "Client Anomalies", labels, nil, + ), + BytesR: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "bytesr"), + "Client Data Rate", labels, nil, + ), + CCQ: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "ccq"), + "Client Connection Quality", labels, nil, + ), + Noise: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "noise"), + "Client AP Noise", labels, nil, + ), + RoamCount: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "roamcount"), + "Client Roam Counter", labels, nil, + ), + RSSI: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "rssi"), + "Client RSSI", labels, nil, + ), + RxBytes: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "rxbytes"), + "Client Receive Bytes", labels, nil, + ), + RxBytesR: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "rxbytesr"), + "Client Receive Data Rate", labels, nil, + ), + RxPackets: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "rxpackets"), + "Client Receive Packets", labels, nil, + ), + RxRate: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "rxrate"), + "Client Receive Rate", labels, nil, + ), + Signal: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "signal"), + "Client Signal Strength", labels, nil, + ), + TxBytes: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "txbytes"), + "Client Transmit Bytes", labels, nil, + ), + TxBytesR: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "txbytesr"), + "Client Transmit Data Rate", labels, nil, + ), + TxPackets: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "txpackets"), + "Client Transmit Packets", labels, nil, + ), + TxPower: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "txpower"), + "Client Transmit Power", labels, nil, + ), + TxRate: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "txrate"), + "Client Transmit Rate", labels, nil, + ), + Uptime: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "uptime"), + "Client Uptime", labels, nil, + ), + WifiTxAttempts: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "wifitxattempts"), + "Client Wifi Transmit Attempts", labels, nil, + ), + WiredRxBytes: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "wiredrxbytes"), + "Client Wired Receive Bytes", labels, nil, + ), + WiredRxBytesR: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "wiredrxbytesr"), + "Client Wired Receive Data Rate", labels, nil, + ), + WiredRxPackets: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "wiredrxpackets"), + "Client Wired Receive Packets", labels, nil, + ), + WiredTxBytes: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "wiredtxbytes"), + "Client Wired Transmit Bytes", labels, nil, + ), + WiredTxBytesR: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "wiredtxbytesr"), + "Client Wired Data Rate", labels, nil, + ), + WiredTxPackets: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "wiredtxpackets"), + "Client Wired Transmit Packets", labels, nil, + ), + DpiStatsApp: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "dpistatsapp"), + "Client DPI Stats App", labels, nil, + ), + DpiStatsCat: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "dpistatscat"), + "Client DPI Stats Cat", labels, nil, + ), + DpiStatsRxBytes: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "dpistatsrxbytes"), + "Client DPI Stats Receive Bytes", labels, nil, + ), + DpiStatsRxPackets: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "dpistatsrxpackets"), + "Client DPI Stats Receive Packets", labels, nil, + ), + DpiStatsTxBytes: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "dpistatstxbytes"), + "Client DPI Stats Transmit Bytes", labels, nil, + ), + DpiStatsTxPackets: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "dpistatstxpackets"), + "Client DPI Stats Transmit Packets", labels, nil, + ), + } +} + +// CollectClient exports Clients' Data +func (u *unifiCollector) exportClient(c *unifi.Client) []*metricExports { + labels := []string{c.ID, c.Mac, c.UserID, c.SiteID, c.SiteName, + c.NetworkID, c.ApMac, c.GwMac, c.SwMac, c.ApName, c.GwName, + c.SwName, c.RadioName, c.Radio, c.RadioProto, c.Name, c.Channel.Txt, + c.Vlan.Txt, c.IP, c.Essid, c.Bssid, c.RadioDescription, + } + + return []*metricExports{ + {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labels}, + {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labels}, + {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labels}, + {u.Client.CCQ, prometheus.GaugeValue, c.Ccq, labels}, + {u.Client.Noise, prometheus.GaugeValue, c.Noise, labels}, + {u.Client.RoamCount, prometheus.CounterValue, c.RoamCount, labels}, + {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labels}, + {u.Client.RxBytes, prometheus.CounterValue, c.RxBytes, labels}, + {u.Client.RxBytesR, prometheus.GaugeValue, c.RxBytesR, labels}, + {u.Client.RxPackets, prometheus.CounterValue, c.RxPackets, labels}, + {u.Client.RxRate, prometheus.GaugeValue, c.RxRate, labels}, + {u.Client.Signal, prometheus.GaugeValue, c.Signal, labels}, + {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labels}, + {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labels}, + {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labels}, + {u.Client.TxPower, prometheus.GaugeValue, c.TxPower, labels}, + {u.Client.TxRate, prometheus.CounterValue, c.TxRate, labels}, + {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, + {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labels}, + {u.Client.WiredRxBytes, prometheus.CounterValue, c.WiredRxBytes, labels}, + {u.Client.WiredRxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labels}, + {u.Client.WiredRxPackets, prometheus.CounterValue, c.WiredRxPackets, labels}, + {u.Client.WiredTxBytes, prometheus.CounterValue, c.TxRate, labels}, + {u.Client.WiredTxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labels}, + {u.Client.WiredTxPackets, prometheus.CounterValue, c.WiredTxPackets, labels}, + {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, + {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat, labels}, + {u.Client.DpiStatsRxBytes, prometheus.CounterValue, c.DpiStats.RxBytes, labels}, + {u.Client.DpiStatsRxPackets, prometheus.CounterValue, c.DpiStats.RxPackets, labels}, + {u.Client.DpiStatsTxBytes, prometheus.CounterValue, c.DpiStats.TxBytes, labels}, + {u.Client.DpiStatsTxPackets, prometheus.CounterValue, c.DpiStats.TxPackets, labels}, + } +} diff --git a/promunifi/collector.go b/promunifi/collector.go new file mode 100644 index 000000000..9487231b6 --- /dev/null +++ b/promunifi/collector.go @@ -0,0 +1,135 @@ +package promunifi + +import ( + "fmt" + "reflect" + "time" + + "github.com/davidnewhall/unifi-poller/metrics" + "github.com/prometheus/client_golang/prometheus" +) + +// UnifiCollectorOpts defines the data needed to collect and report UniFi Metrics. +type UnifiCollectorOpts struct { + // If non-empty, each of the collected metrics is prefixed by the + // provided string and an underscore ("_"). + Namespace string + // If true, any error encountered during collection is reported as an + // invalid metric (see NewInvalidMetric). Otherwise, errors are ignored + // and the collected metrics will be incomplete. (Possibly, no metrics + // will be collected at all.) + ReportErrors bool + // This function is passed to the Collect() method. The Collect method runs This + // function to retreive the latest UniFi + CollectFn func() *metrics.Metrics + // Setting this to true will enable IDS exports. + CollectIDS bool +} + +type unifiCollector struct { + opts UnifiCollectorOpts + Client *client + // UAP *UAP + // USG *USG + // USW *USW + // UDM *UDM + // IDS *IDS + // Site *Site +} + +type metricExports struct { + Desc *prometheus.Desc + ValueType prometheus.ValueType + Value interface{} + Labels []string +} + +// NewUnifiCollector returns a prometheus collector that will export any available +// UniFi metrics. You must provide a collection function in the opts. +func NewUnifiCollector(opts UnifiCollectorOpts) prometheus.Collector { + if opts.CollectFn == nil { + panic("nil collector function") + } + return &unifiCollector{ + opts: opts, + Client: descClient(opts.Namespace), + // UAP: descUAP(opts.Namespace), + // USG: descUSG(opts.Namespace), + // USW: descUSW(opts.Namespace), + // UDM: descUDM(opts.Namespace), + // Site: descSite(opts.Namespace), + // IDS: descIDS(opts.Namespace), + } +} + +// Describe satisfies the prometheus Collector. This returns all of the +// metric descriptions that this packages produces. +func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { + describe := func(from interface{}) { + v := reflect.ValueOf(from) + // Loop each struct member and send it to the provided channel. + for i := 0; i < v.NumField(); i++ { + desc, ok := v.Field(i).Interface().(*prometheus.Desc) + if ok && desc != nil { + ch <- desc + } + } + } + describe(u.Client) + // describe(u.UAP) + // describe(u.USG) + // describe(u.USW) + // describe(u.UDM) + // describe(u.Site) + // if u.opts.CollectIDS { + // describe(u.IDS) + // } +} + +// Collect satisifes the prometheus Collector. This runs the input method to get +// the current metrics (from another package) then exports them for prometheus. +func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { + m := u.opts.CollectFn() + + for _, asset := range m.Clients { + u.export(ch, u.exportClient(asset), m.TS) + } + for _, asset := range m.Sites { + u.export(ch, u.exportSite(asset), m.TS) + } + if u.opts.CollectIDS { + for _, asset := range m.IDSList { + u.export(ch, u.exportIDS(asset), m.TS) + } + } + + if m.Devices == nil { + return + } + + for _, asset := range m.Devices.UAPs { + u.export(ch, u.exportUAP(asset), m.TS) + } + for _, asset := range m.Devices.USGs { + u.export(ch, u.exportUSG(asset), m.TS) + } + for _, asset := range m.Devices.USWs { + u.export(ch, u.exportUSW(asset), m.TS) + } + for _, asset := range m.Devices.UDMs { + u.export(ch, u.exportUDM(asset), m.TS) + } +} + +func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricExports, ts time.Time) { + for _, e := range exports { + v, ok := e.Value.(float64) + if !ok { + if u.opts.ReportErrors { + ch <- prometheus.NewInvalidMetric(e.Desc, fmt.Errorf("not a number")) + } + return + } + ch <- prometheus.NewMetricWithTimestamp(ts, prometheus.MustNewConstMetric(e.Desc, e.ValueType, v, e.Labels...)) + } +} diff --git a/promunifi/ids.go b/promunifi/ids.go new file mode 100644 index 000000000..f49639e74 --- /dev/null +++ b/promunifi/ids.go @@ -0,0 +1,10 @@ +package promunifi + +import ( + "golift.io/unifi" +) + +// exportIDS exports Intrusion Detection System Data +func (u *unifiCollector) exportIDS(i *unifi.IDS) []*metricExports { + return nil +} diff --git a/promunifi/site.go b/promunifi/site.go new file mode 100644 index 000000000..03af7aa0b --- /dev/null +++ b/promunifi/site.go @@ -0,0 +1,10 @@ +package promunifi + +import ( + "golift.io/unifi" +) + +// exportSite exports Network Site Data +func (u *unifiCollector) exportSite(s *unifi.Site) []*metricExports { + return nil +} diff --git a/promunifi/uap.go b/promunifi/uap.go new file mode 100644 index 000000000..2608f3f4f --- /dev/null +++ b/promunifi/uap.go @@ -0,0 +1,10 @@ +package promunifi + +import ( + "golift.io/unifi" +) + +// exportUAP exports Access Point Data +func (u *unifiCollector) exportUAP(a *unifi.UAP) []*metricExports { + return nil +} diff --git a/promunifi/udm.go b/promunifi/udm.go new file mode 100644 index 000000000..dc9e6c4a4 --- /dev/null +++ b/promunifi/udm.go @@ -0,0 +1,10 @@ +package promunifi + +import ( + "golift.io/unifi" +) + +// exportUDM exports UniFi Dream Machine (and Pro) Data +func (u *unifiCollector) exportUDM(d *unifi.UDM) []*metricExports { + return nil +} diff --git a/promunifi/usg.go b/promunifi/usg.go new file mode 100644 index 000000000..240c0bdf8 --- /dev/null +++ b/promunifi/usg.go @@ -0,0 +1,10 @@ +package promunifi + +import ( + "golift.io/unifi" +) + +// exportUSG Exports Security Gateway Data +func (u *unifiCollector) exportUSG(s *unifi.USG) []*metricExports { + return nil +} diff --git a/promunifi/usw.go b/promunifi/usw.go new file mode 100644 index 000000000..d190f8f7b --- /dev/null +++ b/promunifi/usw.go @@ -0,0 +1,10 @@ +package promunifi + +import ( + "golift.io/unifi" +) + +// exportUSW exports Network Switch Data +func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { + return nil +} From f62115f0ad38cd5cae1599b672107f0f47eba461 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 01:12:33 -0800 Subject: [PATCH 07/85] fix a bug and send a few more pieces into the mix --- poller/start.go | 17 +++------------- poller/unifi.go | 12 +++++------ promunifi/collector.go | 46 +++++++++++++++++++++++------------------- promunifi/ids.go | 7 +++++++ promunifi/site.go | 7 +++++++ promunifi/uap.go | 7 +++++++ promunifi/udm.go | 7 +++++++ promunifi/usg.go | 7 +++++++ promunifi/usw.go | 7 +++++++ 9 files changed, 75 insertions(+), 42 deletions(-) diff --git a/poller/start.go b/poller/start.go index 871a55f2f..38ac87cc1 100644 --- a/poller/start.go +++ b/poller/start.go @@ -99,19 +99,14 @@ func (u *UnifiPoller) Run() (err error) { case "prometheus", "exporter": u.Logf("Exporting Measurements at https://%s/metrics for Prometheus", u.Config.HTTPListen) - u.Config.Mode = "http exporter" - http.Handle("/metrics", http.HandlerFunc(u.PromHandler)) + http.Handle("/metrics", promhttp.Handler()) prometheus.MustRegister(promunifi.NewUnifiCollector(promunifi.UnifiCollectorOpts{ + Namespace: "unifi", CollectFn: u.ExportMetrics, ReportErrors: true, - Namespace: "unifi", CollectIDS: true, })) - err = http.ListenAndServe(u.Config.HTTPListen, nil) - if err != http.ErrServerClosed { - return err - } - return nil + return http.ListenAndServe(u.Config.HTTPListen, nil) default: if err = u.GetInfluxDB(); err != nil { @@ -139,12 +134,6 @@ func (u *UnifiPoller) GetInfluxDB() (err error) { return nil } -// PromHandler logs /metrics requests and serves them with the prometheus handler. -func (u *UnifiPoller) PromHandler(w http.ResponseWriter, r *http.Request) { - u.LogDebugf("/metrics endpoint polled by %v", r.RemoteAddr) - promhttp.Handler().ServeHTTP(w, r) -} - // GetUnifi returns a UniFi controller interface. func (u *UnifiPoller) GetUnifi() (err error) { // Create an authenticated session to the Unifi Controller. diff --git a/poller/unifi.go b/poller/unifi.go index 9b4a87b4b..e103c87a3 100644 --- a/poller/unifi.go +++ b/poller/unifi.go @@ -100,18 +100,14 @@ func (u *UnifiPoller) ExportMetrics() *metrics.Metrics { return nil } } - metrics, err := u.CollectMetrics() + + m, err := u.CollectMetrics() if err != nil { u.LogErrorf("collecting metrics: %v", err) return nil } - u.AugmentMetrics(metrics) - u.LogExportReport(metrics) - return metrics -} + u.AugmentMetrics(m) -// LogExportReport writes a log line after exporting metrics via HTTP. -func (u *UnifiPoller) LogExportReport(m *metrics.Metrics) { idsMsg := "" if u.Config.CollectIDS { idsMsg = fmt.Sprintf(", IDS Events: %d, ", len(m.IDSList)) @@ -120,6 +116,8 @@ func (u *UnifiPoller) LogExportReport(m *metrics.Metrics) { "Wireless APs: %d, Gateways: %d, Switches: %d%s", len(m.Sites), len(m.Clients), len(m.UAPs), len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg) + + return m } // CollectMetrics grabs all the measurements from a UniFi controller and returns them. diff --git a/promunifi/collector.go b/promunifi/collector.go index 9487231b6..b72dc5695 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -29,12 +29,12 @@ type UnifiCollectorOpts struct { type unifiCollector struct { opts UnifiCollectorOpts Client *client - // UAP *UAP - // USG *USG - // USW *USW - // UDM *UDM - // IDS *IDS - // Site *Site + UAP *uap + USG *usg + USW *usw + UDM *udm + IDS *ids + Site *site } type metricExports struct { @@ -53,12 +53,12 @@ func NewUnifiCollector(opts UnifiCollectorOpts) prometheus.Collector { return &unifiCollector{ opts: opts, Client: descClient(opts.Namespace), - // UAP: descUAP(opts.Namespace), - // USG: descUSG(opts.Namespace), - // USW: descUSW(opts.Namespace), - // UDM: descUDM(opts.Namespace), - // Site: descSite(opts.Namespace), - // IDS: descIDS(opts.Namespace), + UAP: descUAP(opts.Namespace), + USG: descUSG(opts.Namespace), + USW: descUSW(opts.Namespace), + UDM: descUDM(opts.Namespace), + Site: descSite(opts.Namespace), + IDS: descIDS(opts.Namespace), } } @@ -66,7 +66,8 @@ func NewUnifiCollector(opts UnifiCollectorOpts) prometheus.Collector { // metric descriptions that this packages produces. func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { describe := func(from interface{}) { - v := reflect.ValueOf(from) + v := reflect.Indirect(reflect.ValueOf(from)) + // Loop each struct member and send it to the provided channel. for i := 0; i < v.NumField(); i++ { desc, ok := v.Field(i).Interface().(*prometheus.Desc) @@ -76,20 +77,23 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { } } describe(u.Client) - // describe(u.UAP) - // describe(u.USG) - // describe(u.USW) - // describe(u.UDM) - // describe(u.Site) - // if u.opts.CollectIDS { - // describe(u.IDS) - // } + describe(u.UAP) + describe(u.USG) + describe(u.USW) + describe(u.UDM) + describe(u.Site) + if u.opts.CollectIDS { + describe(u.IDS) + } } // Collect satisifes the prometheus Collector. This runs the input method to get // the current metrics (from another package) then exports them for prometheus. func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { m := u.opts.CollectFn() + if m == nil { + return + } for _, asset := range m.Clients { u.export(ch, u.exportClient(asset), m.TS) diff --git a/promunifi/ids.go b/promunifi/ids.go index f49639e74..badd23d86 100644 --- a/promunifi/ids.go +++ b/promunifi/ids.go @@ -4,6 +4,13 @@ import ( "golift.io/unifi" ) +type ids struct { +} + +func descIDS(ns string) *ids { + return &ids{} +} + // exportIDS exports Intrusion Detection System Data func (u *unifiCollector) exportIDS(i *unifi.IDS) []*metricExports { return nil diff --git a/promunifi/site.go b/promunifi/site.go index 03af7aa0b..77bad2ee6 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -4,6 +4,13 @@ import ( "golift.io/unifi" ) +type site struct { +} + +func descSite(ns string) *site { + return &site{} +} + // exportSite exports Network Site Data func (u *unifiCollector) exportSite(s *unifi.Site) []*metricExports { return nil diff --git a/promunifi/uap.go b/promunifi/uap.go index 2608f3f4f..3088f793d 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -4,6 +4,13 @@ import ( "golift.io/unifi" ) +type uap struct { +} + +func descUAP(ns string) *uap { + return &uap{} +} + // exportUAP exports Access Point Data func (u *unifiCollector) exportUAP(a *unifi.UAP) []*metricExports { return nil diff --git a/promunifi/udm.go b/promunifi/udm.go index dc9e6c4a4..917478ca4 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -4,6 +4,13 @@ import ( "golift.io/unifi" ) +type udm struct { +} + +func descUDM(ns string) *udm { + return &udm{} +} + // exportUDM exports UniFi Dream Machine (and Pro) Data func (u *unifiCollector) exportUDM(d *unifi.UDM) []*metricExports { return nil diff --git a/promunifi/usg.go b/promunifi/usg.go index 240c0bdf8..edda70ee7 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -4,6 +4,13 @@ import ( "golift.io/unifi" ) +type usg struct { +} + +func descUSG(ns string) *usg { + return &usg{} +} + // exportUSG Exports Security Gateway Data func (u *unifiCollector) exportUSG(s *unifi.USG) []*metricExports { return nil diff --git a/promunifi/usw.go b/promunifi/usw.go index d190f8f7b..2938d37c9 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -4,6 +4,13 @@ import ( "golift.io/unifi" ) +type usw struct { +} + +func descUSW(ns string) *usw { + return &usw{} +} + // exportUSW exports Network Switch Data func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { return nil From 681df8326e3b1a693b302f3a66fa285eff417d7a Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 01:21:30 -0800 Subject: [PATCH 08/85] rename package --- {influx => influxunifi}/README.md | 0 {influx => influxunifi}/clients.go | 2 +- {influx => influxunifi}/ids.go | 2 +- {influx => influxunifi}/metrics.go | 2 +- {influx => influxunifi}/site.go | 2 +- {influx => influxunifi}/uap.go | 2 +- {influx => influxunifi}/udm.go | 2 +- {influx => influxunifi}/usg.go | 2 +- {influx => influxunifi}/usw.go | 2 +- poller/unifi.go | 10 +++++----- promunifi/collector.go | 2 ++ 11 files changed, 15 insertions(+), 13 deletions(-) rename {influx => influxunifi}/README.md (100%) rename {influx => influxunifi}/clients.go (99%) rename {influx => influxunifi}/ids.go (98%) rename {influx => influxunifi}/metrics.go (99%) rename {influx => influxunifi}/site.go (99%) rename {influx => influxunifi}/uap.go (99%) rename {influx => influxunifi}/udm.go (99%) rename {influx => influxunifi}/usg.go (99%) rename {influx => influxunifi}/usw.go (99%) diff --git a/influx/README.md b/influxunifi/README.md similarity index 100% rename from influx/README.md rename to influxunifi/README.md diff --git a/influx/clients.go b/influxunifi/clients.go similarity index 99% rename from influx/clients.go rename to influxunifi/clients.go index 114a93985..5a57331b2 100644 --- a/influx/clients.go +++ b/influxunifi/clients.go @@ -1,4 +1,4 @@ -package influx +package influxunifi import ( "time" diff --git a/influx/ids.go b/influxunifi/ids.go similarity index 98% rename from influx/ids.go rename to influxunifi/ids.go index 33f743ba7..bf444f5ff 100644 --- a/influx/ids.go +++ b/influxunifi/ids.go @@ -1,4 +1,4 @@ -package influx +package influxunifi import ( influx "github.com/influxdata/influxdb1-client/v2" diff --git a/influx/metrics.go b/influxunifi/metrics.go similarity index 99% rename from influx/metrics.go rename to influxunifi/metrics.go index d49cfa8be..3919c8c79 100644 --- a/influx/metrics.go +++ b/influxunifi/metrics.go @@ -1,6 +1,6 @@ // Package influx provides the methods to turn UniFi measurements into influx // data-points with appropriate tags and fields. -package influx +package influxunifi import ( "github.com/davidnewhall/unifi-poller/metrics" diff --git a/influx/site.go b/influxunifi/site.go similarity index 99% rename from influx/site.go rename to influxunifi/site.go index 786190242..0bd647ac9 100644 --- a/influx/site.go +++ b/influxunifi/site.go @@ -1,4 +1,4 @@ -package influx +package influxunifi import ( "strings" diff --git a/influx/uap.go b/influxunifi/uap.go similarity index 99% rename from influx/uap.go rename to influxunifi/uap.go index 02394e7cc..1744b0c04 100644 --- a/influx/uap.go +++ b/influxunifi/uap.go @@ -1,4 +1,4 @@ -package influx +package influxunifi import ( "time" diff --git a/influx/udm.go b/influxunifi/udm.go similarity index 99% rename from influx/udm.go rename to influxunifi/udm.go index 2bbff5255..fa9681158 100644 --- a/influx/udm.go +++ b/influxunifi/udm.go @@ -1,4 +1,4 @@ -package influx +package influxunifi import ( "time" diff --git a/influx/usg.go b/influxunifi/usg.go similarity index 99% rename from influx/usg.go rename to influxunifi/usg.go index 8b358d0bd..606011c0a 100644 --- a/influx/usg.go +++ b/influxunifi/usg.go @@ -1,4 +1,4 @@ -package influx +package influxunifi import ( "strings" diff --git a/influx/usw.go b/influxunifi/usw.go similarity index 99% rename from influx/usw.go rename to influxunifi/usw.go index f2d1f9ea9..225a43405 100644 --- a/influx/usw.go +++ b/influxunifi/usw.go @@ -1,4 +1,4 @@ -package influx +package influxunifi import ( "time" diff --git a/poller/unifi.go b/poller/unifi.go index e103c87a3..b9d34011f 100644 --- a/poller/unifi.go +++ b/poller/unifi.go @@ -6,7 +6,7 @@ import ( "strings" "time" - "github.com/davidnewhall/unifi-poller/influx" + "github.com/davidnewhall/unifi-poller/influxunifi" "github.com/davidnewhall/unifi-poller/metrics" client "github.com/influxdata/influxdb1-client/v2" "golift.io/unifi" @@ -90,7 +90,7 @@ func (u *UnifiPoller) CollectAndProcess(process func(*metrics.Metrics) error) er } // ExportMetrics updates the internal metrics provided via -// HTTP at /metrics for prometheus collection. +// HTTP at /metrics for prometheus collection. This is run by Prometheus. func (u *UnifiPoller) ExportMetrics() *metrics.Metrics { if u.Config.ReAuth { u.LogDebugf("Re-authenticating to UniFi Controller") @@ -100,7 +100,7 @@ func (u *UnifiPoller) ExportMetrics() *metrics.Metrics { return nil } } - + u.LastCheck = time.Now() m, err := u.CollectMetrics() if err != nil { u.LogErrorf("collecting metrics: %v", err) @@ -177,7 +177,7 @@ func (u *UnifiPoller) AugmentMetrics(metrics *metrics.Metrics) { // This creates an InfluxDB writer, and returns an error if the write fails. func (u *UnifiPoller) ReportMetrics(metrics *metrics.Metrics) error { // Batch (and send) all the points. - m := &influx.Metrics{Metrics: metrics} + m := &influxunifi.Metrics{Metrics: metrics} // Make a new Influx Points Batcher. var err error m.BatchPoints, err = client.NewBatchPoints(client.BatchPointsConfig{Database: u.Config.InfluxDB}) @@ -195,7 +195,7 @@ func (u *UnifiPoller) ReportMetrics(metrics *metrics.Metrics) error { } // LogInfluxReport writes a log message after exporting to influxdb. -func (u *UnifiPoller) LogInfluxReport(m *influx.Metrics) { +func (u *UnifiPoller) LogInfluxReport(m *influxunifi.Metrics) { var fields, points int for _, p := range m.Points() { points++ diff --git a/promunifi/collector.go b/promunifi/collector.go index b72dc5695..1af860d45 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -50,6 +50,7 @@ func NewUnifiCollector(opts UnifiCollectorOpts) prometheus.Collector { if opts.CollectFn == nil { panic("nil collector function") } + return &unifiCollector{ opts: opts, Client: descClient(opts.Namespace), @@ -76,6 +77,7 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { } } } + describe(u.Client) describe(u.UAP) describe(u.USG) From e7292ed11949f5f66aca440a9d1bc25cca60f8ed Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 01:26:07 -0800 Subject: [PATCH 09/85] a few bugs --- promunifi/clients.go | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index f4511c98b..72ee57996 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -178,7 +178,6 @@ func (u *unifiCollector) exportClient(c *unifi.Client) []*metricExports { } return []*metricExports{ - {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labels}, {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labels}, {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labels}, {u.Client.CCQ, prometheus.GaugeValue, c.Ccq, labels}, @@ -203,11 +202,11 @@ func (u *unifiCollector) exportClient(c *unifi.Client) []*metricExports { {u.Client.WiredTxBytes, prometheus.CounterValue, c.TxRate, labels}, {u.Client.WiredTxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labels}, {u.Client.WiredTxPackets, prometheus.CounterValue, c.WiredTxPackets, labels}, - {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, - {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat, labels}, - {u.Client.DpiStatsRxBytes, prometheus.CounterValue, c.DpiStats.RxBytes, labels}, - {u.Client.DpiStatsRxPackets, prometheus.CounterValue, c.DpiStats.RxPackets, labels}, - {u.Client.DpiStatsTxBytes, prometheus.CounterValue, c.DpiStats.TxBytes, labels}, - {u.Client.DpiStatsTxPackets, prometheus.CounterValue, c.DpiStats.TxPackets, labels}, + {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App.Val, labels}, + {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat.Val, labels}, + {u.Client.DpiStatsRxBytes, prometheus.CounterValue, c.DpiStats.RxBytes.Val, labels}, + {u.Client.DpiStatsRxPackets, prometheus.CounterValue, c.DpiStats.RxPackets.Val, labels}, + {u.Client.DpiStatsTxBytes, prometheus.CounterValue, c.DpiStats.TxBytes.Val, labels}, + {u.Client.DpiStatsTxPackets, prometheus.CounterValue, c.DpiStats.TxPackets.Val, labels}, } } From 6f32f7dd604e0bb4c8f582ab0c4eeea61e3a7000 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 01:52:41 -0800 Subject: [PATCH 10/85] new files --- poller/influx.go | 48 ++++++++++++++++ poller/prometheus.go | 39 +++++++++++++ poller/start.go | 6 +- poller/unifi.go | 126 +++++++++-------------------------------- promunifi/collector.go | 18 +++--- 5 files changed, 126 insertions(+), 111 deletions(-) create mode 100644 poller/influx.go create mode 100644 poller/prometheus.go diff --git a/poller/influx.go b/poller/influx.go new file mode 100644 index 000000000..1d0af593c --- /dev/null +++ b/poller/influx.go @@ -0,0 +1,48 @@ +package poller + +import ( + "fmt" + + "github.com/davidnewhall/unifi-poller/influxunifi" + "github.com/davidnewhall/unifi-poller/metrics" + client "github.com/influxdata/influxdb1-client/v2" +) + +// ReportMetrics batches all the metrics and writes them to InfluxDB. +// This creates an InfluxDB writer, and returns an error if the write fails. +func (u *UnifiPoller) ReportMetrics(metrics *metrics.Metrics) error { + // Batch (and send) all the points. + m := &influxunifi.Metrics{Metrics: metrics} + // Make a new Influx Points Batcher. + var err error + m.BatchPoints, err = client.NewBatchPoints(client.BatchPointsConfig{Database: u.Config.InfluxDB}) + if err != nil { + return fmt.Errorf("influx.NewBatchPoints: %v", err) + } + for _, err := range m.ProcessPoints() { + u.LogError(err, "influx.ProcessPoints") + } + if err = u.Influx.Write(m.BatchPoints); err != nil { + return fmt.Errorf("influxdb.Write(points): %v", err) + } + u.LogInfluxReport(m) + return nil +} + +// LogInfluxReport writes a log message after exporting to influxdb. +func (u *UnifiPoller) LogInfluxReport(m *influxunifi.Metrics) { + var fields, points int + for _, p := range m.Points() { + points++ + i, _ := p.Fields() + fields += len(i) + } + idsMsg := "" + if u.Config.CollectIDS { + idsMsg = fmt.Sprintf("IDS Events: %d, ", len(m.IDSList)) + } + u.Logf("UniFi Measurements Recorded. Sites: %d, Clients: %d, "+ + "Wireless APs: %d, Gateways: %d, Switches: %d, %sPoints: %d, Fields: %d", + len(m.Sites), len(m.Clients), len(m.UAPs), + len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg, points, fields) +} diff --git a/poller/prometheus.go b/poller/prometheus.go new file mode 100644 index 000000000..07eeb7a77 --- /dev/null +++ b/poller/prometheus.go @@ -0,0 +1,39 @@ +package poller + +import ( + "fmt" + "time" + + "github.com/davidnewhall/unifi-poller/metrics" +) + +// ExportMetrics updates the internal metrics provided via +// HTTP at /metrics for prometheus collection. This is run by Prometheus. +func (u *UnifiPoller) ExportMetrics() *metrics.Metrics { + if u.Config.ReAuth { + u.LogDebugf("Re-authenticating to UniFi Controller") + // Some users need to re-auth every interval because the cookie times out. + if err := u.Unifi.Login(); err != nil { + u.LogError(err, "re-authenticating") + return nil + } + } + u.LastCheck = time.Now() + m, err := u.CollectMetrics() + if err != nil { + u.LogErrorf("collecting metrics: %v", err) + return nil + } + u.AugmentMetrics(m) + + idsMsg := "" + if u.Config.CollectIDS { + idsMsg = fmt.Sprintf(", IDS Events: %d, ", len(m.IDSList)) + } + u.Logf("UniFi Measurements Exported. Sites: %d, Clients: %d, "+ + "Wireless APs: %d, Gateways: %d, Switches: %d%s", + len(m.Sites), len(m.Clients), len(m.UAPs), + len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg) + + return m +} diff --git a/poller/start.go b/poller/start.go index 38ac87cc1..4ad0a3800 100644 --- a/poller/start.go +++ b/poller/start.go @@ -11,7 +11,7 @@ import ( "time" "github.com/davidnewhall/unifi-poller/promunifi" - client "github.com/influxdata/influxdb1-client/v2" + influx "github.com/influxdata/influxdb1-client/v2" "github.com/prometheus/client_golang/prometheus" "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/spf13/pflag" @@ -100,7 +100,7 @@ func (u *UnifiPoller) Run() (err error) { case "prometheus", "exporter": u.Logf("Exporting Measurements at https://%s/metrics for Prometheus", u.Config.HTTPListen) http.Handle("/metrics", promhttp.Handler()) - prometheus.MustRegister(promunifi.NewUnifiCollector(promunifi.UnifiCollectorOpts{ + prometheus.MustRegister(promunifi.NewUnifiCollector(promunifi.UnifiCollectorCnfg{ Namespace: "unifi", CollectFn: u.ExportMetrics, ReportErrors: true, @@ -121,7 +121,7 @@ func (u *UnifiPoller) Run() (err error) { // GetInfluxDB returns an InfluxDB interface. func (u *UnifiPoller) GetInfluxDB() (err error) { - u.Influx, err = client.NewHTTPClient(client.HTTPConfig{ + u.Influx, err = influx.NewHTTPClient(influx.HTTPConfig{ Addr: u.Config.InfluxURL, Username: u.Config.InfluxUser, Password: u.Config.InfluxPass, diff --git a/poller/unifi.go b/poller/unifi.go index b9d34011f..dd7680220 100644 --- a/poller/unifi.go +++ b/poller/unifi.go @@ -6,12 +6,37 @@ import ( "strings" "time" - "github.com/davidnewhall/unifi-poller/influxunifi" "github.com/davidnewhall/unifi-poller/metrics" - client "github.com/influxdata/influxdb1-client/v2" "golift.io/unifi" ) +// PollController runs forever, polling UniFi +// and pushing to influx OR exporting for prometheus. +// This is started by Run() after everything checks out. +func (u *UnifiPoller) PollController(process func(*metrics.Metrics) error) error { + interval := u.Config.Interval.Round(time.Second) + log.Printf("[INFO] Everything checks out! Poller started in %v mode, interval: %v", u.Config.Mode, interval) + ticker := time.NewTicker(interval) + for u.LastCheck = range ticker.C { + var err error + if u.Config.ReAuth { + u.LogDebugf("Re-authenticating to UniFi Controller") + // Some users need to re-auth every interval because the cookie times out. + if err = u.Unifi.Login(); err != nil { + u.LogError(err, "re-authenticating") + } + } + if err == nil { + // Only run this if the authentication procedure didn't return error. + _ = u.CollectAndProcess(process) + } + if u.errorCount > 0 { + return fmt.Errorf("too many errors, stopping poller") + } + } + return nil +} + // CheckSites makes sure the list of provided sites exists on the controller. // This does not run in Lambda (run-once) mode. func (u *UnifiPoller) CheckSites() error { @@ -45,33 +70,6 @@ FIRST: return nil } -// PollController runs forever, polling UniFi -// and pushing to influx OR exporting for prometheus. -// This is started by Run() after everything checks out. -func (u *UnifiPoller) PollController(process func(*metrics.Metrics) error) error { - interval := u.Config.Interval.Round(time.Second) - log.Printf("[INFO] Everything checks out! Poller started in %v mode, interval: %v", u.Config.Mode, interval) - ticker := time.NewTicker(interval) - for u.LastCheck = range ticker.C { - var err error - if u.Config.ReAuth { - u.LogDebugf("Re-authenticating to UniFi Controller") - // Some users need to re-auth every interval because the cookie times out. - if err = u.Unifi.Login(); err != nil { - u.LogError(err, "re-authenticating") - } - } - if err == nil { - // Only run this if the authentication procedure didn't return error. - _ = u.CollectAndProcess(process) - } - if u.errorCount > 0 { - return fmt.Errorf("too many errors, stopping poller") - } - } - return nil -} - // CollectAndProcess collects measurements and then passese them into the // provided method. The method is either an http exporter or an influxdb update. // Can be called once or in a ticker loop. This function and all the ones below @@ -89,37 +87,6 @@ func (u *UnifiPoller) CollectAndProcess(process func(*metrics.Metrics) error) er return err } -// ExportMetrics updates the internal metrics provided via -// HTTP at /metrics for prometheus collection. This is run by Prometheus. -func (u *UnifiPoller) ExportMetrics() *metrics.Metrics { - if u.Config.ReAuth { - u.LogDebugf("Re-authenticating to UniFi Controller") - // Some users need to re-auth every interval because the cookie times out. - if err := u.Unifi.Login(); err != nil { - u.LogError(err, "re-authenticating") - return nil - } - } - u.LastCheck = time.Now() - m, err := u.CollectMetrics() - if err != nil { - u.LogErrorf("collecting metrics: %v", err) - return nil - } - u.AugmentMetrics(m) - - idsMsg := "" - if u.Config.CollectIDS { - idsMsg = fmt.Sprintf(", IDS Events: %d, ", len(m.IDSList)) - } - u.Logf("UniFi Measurements Exported. Sites: %d, Clients: %d, "+ - "Wireless APs: %d, Gateways: %d, Switches: %d%s", - len(m.Sites), len(m.Clients), len(m.UAPs), - len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg) - - return m -} - // CollectMetrics grabs all the measurements from a UniFi controller and returns them. func (u *UnifiPoller) CollectMetrics() (*metrics.Metrics, error) { m := &metrics.Metrics{TS: u.LastCheck} // At this point, it's the Current Check. @@ -173,45 +140,6 @@ func (u *UnifiPoller) AugmentMetrics(metrics *metrics.Metrics) { } } -// ReportMetrics batches all the metrics and writes them to InfluxDB. -// This creates an InfluxDB writer, and returns an error if the write fails. -func (u *UnifiPoller) ReportMetrics(metrics *metrics.Metrics) error { - // Batch (and send) all the points. - m := &influxunifi.Metrics{Metrics: metrics} - // Make a new Influx Points Batcher. - var err error - m.BatchPoints, err = client.NewBatchPoints(client.BatchPointsConfig{Database: u.Config.InfluxDB}) - if err != nil { - return fmt.Errorf("influx.NewBatchPoints: %v", err) - } - for _, err := range m.ProcessPoints() { - u.LogError(err, "influx.ProcessPoints") - } - if err = u.Influx.Write(m.BatchPoints); err != nil { - return fmt.Errorf("influxdb.Write(points): %v", err) - } - u.LogInfluxReport(m) - return nil -} - -// LogInfluxReport writes a log message after exporting to influxdb. -func (u *UnifiPoller) LogInfluxReport(m *influxunifi.Metrics) { - var fields, points int - for _, p := range m.Points() { - points++ - i, _ := p.Fields() - fields += len(i) - } - idsMsg := "" - if u.Config.CollectIDS { - idsMsg = fmt.Sprintf("IDS Events: %d, ", len(m.IDSList)) - } - u.Logf("UniFi Measurements Recorded. Sites: %d, Clients: %d, "+ - "Wireless APs: %d, Gateways: %d, Switches: %d, %sPoints: %d, Fields: %d", - len(m.Sites), len(m.Clients), len(m.UAPs), - len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg, points, fields) -} - // GetFilteredSites returns a list of sites to fetch data for. // Omits requested but unconfigured sites. Grabs the full list from the // controller and returns the sites provided in the config file. diff --git a/promunifi/collector.go b/promunifi/collector.go index 1af860d45..2632019dc 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -9,8 +9,8 @@ import ( "github.com/prometheus/client_golang/prometheus" ) -// UnifiCollectorOpts defines the data needed to collect and report UniFi Metrics. -type UnifiCollectorOpts struct { +// UnifiCollectorCnfg defines the data needed to collect and report UniFi Metrics. +type UnifiCollectorCnfg struct { // If non-empty, each of the collected metrics is prefixed by the // provided string and an underscore ("_"). Namespace string @@ -27,7 +27,7 @@ type UnifiCollectorOpts struct { } type unifiCollector struct { - opts UnifiCollectorOpts + Config UnifiCollectorCnfg Client *client UAP *uap USG *usg @@ -46,13 +46,13 @@ type metricExports struct { // NewUnifiCollector returns a prometheus collector that will export any available // UniFi metrics. You must provide a collection function in the opts. -func NewUnifiCollector(opts UnifiCollectorOpts) prometheus.Collector { +func NewUnifiCollector(opts UnifiCollectorCnfg) prometheus.Collector { if opts.CollectFn == nil { panic("nil collector function") } return &unifiCollector{ - opts: opts, + Config: opts, Client: descClient(opts.Namespace), UAP: descUAP(opts.Namespace), USG: descUSG(opts.Namespace), @@ -84,7 +84,7 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { describe(u.USW) describe(u.UDM) describe(u.Site) - if u.opts.CollectIDS { + if u.Config.CollectIDS { describe(u.IDS) } } @@ -92,7 +92,7 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { // Collect satisifes the prometheus Collector. This runs the input method to get // the current metrics (from another package) then exports them for prometheus. func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { - m := u.opts.CollectFn() + m := u.Config.CollectFn() if m == nil { return } @@ -103,7 +103,7 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { for _, asset := range m.Sites { u.export(ch, u.exportSite(asset), m.TS) } - if u.opts.CollectIDS { + if u.Config.CollectIDS { for _, asset := range m.IDSList { u.export(ch, u.exportIDS(asset), m.TS) } @@ -131,7 +131,7 @@ func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricEx for _, e := range exports { v, ok := e.Value.(float64) if !ok { - if u.opts.ReportErrors { + if u.Config.ReportErrors { ch <- prometheus.NewInvalidMetric(e.Desc, fmt.Errorf("not a number")) } return From bee5a5901cecafb31fa123c0e5d111964311467d Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 03:02:25 -0800 Subject: [PATCH 11/85] add site code --- examples/MANUAL.md | 2 +- examples/up.conf.example | 1 + examples/up.xml.example | 1 + examples/up.yaml.example | 1 + promunifi/README.md | 4 +- promunifi/clients.go | 60 +++++++-------- promunifi/collector.go | 11 ++- promunifi/site.go | 161 ++++++++++++++++++++++++++++++++++++++- 8 files changed, 203 insertions(+), 38 deletions(-) diff --git a/examples/MANUAL.md b/examples/MANUAL.md index 16038cf46..0840f9a1f 100644 --- a/examples/MANUAL.md +++ b/examples/MANUAL.md @@ -104,7 +104,7 @@ is provided so the application can be easily adapted to any environment. * Value: prometheus In this mode the application opens an http interface and exports the measurements at /metrics for collection by prometheus. Enabling this - mode disables InfluxDB usage entirely. + mode disables InfluxDB usage entirely. This is BETA. http_listen default: 0.0.0.0:61317 This option controls the IP and port the http listener uses when the diff --git a/examples/up.conf.example b/examples/up.conf.example index 82c1f9b13..a89fd780c 100644 --- a/examples/up.conf.example +++ b/examples/up.conf.example @@ -32,6 +32,7 @@ quiet = false # # Prometheus mode opens an HTTP server on port 61317 and exports the metrics at # /metrics for polling collection by a prometheus server. This disables influxdb. +# IMPORTANT: The prometheus mode is still beta and doesn't work very well. mode = "influx" # This controls on which ip and port /metrics is exported when mode is "prometheus". diff --git a/examples/up.xml.example b/examples/up.xml.example index f77503e5d..e37f88682 100644 --- a/examples/up.xml.example +++ b/examples/up.xml.example @@ -48,6 +48,7 @@ # # Prometheus mode opens an HTTP server on port 61317 and exports the metrics at # /metrics for polling collection by a prometheus server. This disables influxdb. + # IMPORTANT: The prometheus mode is still beta and doesn't work very well. --> influx diff --git a/examples/up.yaml.example b/examples/up.yaml.example index c55b8d951..8de731777 100644 --- a/examples/up.yaml.example +++ b/examples/up.yaml.example @@ -33,6 +33,7 @@ quiet: false # # Prometheus mode opens an HTTP server on port 61317 and exports the metrics at # /metrics for polling collection by a prometheus server. This disables influxdb. +# IMPORTANT: The prometheus mode is still beta and doesn't work very well. mode: "influx" # This controls on which ip and port /metrics is exported when mode is "prometheus". diff --git a/promunifi/README.md b/promunifi/README.md index 27e9ef042..d0ca905d7 100644 --- a/promunifi/README.md +++ b/promunifi/README.md @@ -1,4 +1,4 @@ # prometheus -This package provides the methods to turn UniFi measurements into prometheus -exported metrics. +This package provides the interface to turn UniFi measurements into prometheus +exported metrics. Requires the poller package for actual UniFi data collection. diff --git a/promunifi/clients.go b/promunifi/clients.go index 72ee57996..d54be9c5a 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -47,123 +47,123 @@ func descClient(ns string) *client { return &client{ Anomalies: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "anomalies"), + prometheus.BuildFQName(ns, ns2, "Anomalies"), "Client Anomalies", labels, nil, ), BytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "bytesr"), + prometheus.BuildFQName(ns, ns2, "BytesR"), "Client Data Rate", labels, nil, ), CCQ: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "ccq"), + prometheus.BuildFQName(ns, ns2, "CCQ"), "Client Connection Quality", labels, nil, ), Noise: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "noise"), + prometheus.BuildFQName(ns, ns2, "Noise"), "Client AP Noise", labels, nil, ), RoamCount: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "roamcount"), + prometheus.BuildFQName(ns, ns2, "RoamCount"), "Client Roam Counter", labels, nil, ), RSSI: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "rssi"), + prometheus.BuildFQName(ns, ns2, "RSSI"), "Client RSSI", labels, nil, ), RxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "rxbytes"), + prometheus.BuildFQName(ns, ns2, "RxBytes"), "Client Receive Bytes", labels, nil, ), RxBytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "rxbytesr"), + prometheus.BuildFQName(ns, ns2, "RxBytesR"), "Client Receive Data Rate", labels, nil, ), RxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "rxpackets"), + prometheus.BuildFQName(ns, ns2, "RxPackets"), "Client Receive Packets", labels, nil, ), RxRate: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "rxrate"), + prometheus.BuildFQName(ns, ns2, "RxRate"), "Client Receive Rate", labels, nil, ), Signal: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "signal"), + prometheus.BuildFQName(ns, ns2, "Signal"), "Client Signal Strength", labels, nil, ), TxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "txbytes"), + prometheus.BuildFQName(ns, ns2, "TxBytes"), "Client Transmit Bytes", labels, nil, ), TxBytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "txbytesr"), + prometheus.BuildFQName(ns, ns2, "TxBytesR"), "Client Transmit Data Rate", labels, nil, ), TxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "txpackets"), + prometheus.BuildFQName(ns, ns2, "TxPackets"), "Client Transmit Packets", labels, nil, ), TxPower: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "txpower"), + prometheus.BuildFQName(ns, ns2, "TxPower"), "Client Transmit Power", labels, nil, ), TxRate: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "txrate"), + prometheus.BuildFQName(ns, ns2, "TxRate"), "Client Transmit Rate", labels, nil, ), Uptime: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "uptime"), + prometheus.BuildFQName(ns, ns2, "Uptime"), "Client Uptime", labels, nil, ), WifiTxAttempts: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "wifitxattempts"), + prometheus.BuildFQName(ns, ns2, "WifiTxAttempts"), "Client Wifi Transmit Attempts", labels, nil, ), WiredRxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "wiredrxbytes"), + prometheus.BuildFQName(ns, ns2, "WiredRxBytes"), "Client Wired Receive Bytes", labels, nil, ), WiredRxBytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "wiredrxbytesr"), + prometheus.BuildFQName(ns, ns2, "WiredRxBytesR"), "Client Wired Receive Data Rate", labels, nil, ), WiredRxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "wiredrxpackets"), + prometheus.BuildFQName(ns, ns2, "WiredRxPackets"), "Client Wired Receive Packets", labels, nil, ), WiredTxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "wiredtxbytes"), + prometheus.BuildFQName(ns, ns2, "WiredTxBytes"), "Client Wired Transmit Bytes", labels, nil, ), WiredTxBytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "wiredtxbytesr"), + prometheus.BuildFQName(ns, ns2, "WiredTxBytesR"), "Client Wired Data Rate", labels, nil, ), WiredTxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "wiredtxpackets"), + prometheus.BuildFQName(ns, ns2, "WiredTxPackets"), "Client Wired Transmit Packets", labels, nil, ), DpiStatsApp: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "dpistatsapp"), + prometheus.BuildFQName(ns, ns2, "DpiStatsApp"), "Client DPI Stats App", labels, nil, ), DpiStatsCat: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "dpistatscat"), + prometheus.BuildFQName(ns, ns2, "DpiStatsCat"), "Client DPI Stats Cat", labels, nil, ), DpiStatsRxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "dpistatsrxbytes"), + prometheus.BuildFQName(ns, ns2, "DpiStatsRxBytes"), "Client DPI Stats Receive Bytes", labels, nil, ), DpiStatsRxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "dpistatsrxpackets"), + prometheus.BuildFQName(ns, ns2, "DpiStatsRxPackets"), "Client DPI Stats Receive Packets", labels, nil, ), DpiStatsTxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "dpistatstxbytes"), + prometheus.BuildFQName(ns, ns2, "DpiStatsTxBytes"), "Client DPI Stats Transmit Bytes", labels, nil, ), DpiStatsTxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "dpistatstxpackets"), + prometheus.BuildFQName(ns, ns2, "DpiStatsTxPackets"), "Client DPI Stats Transmit Packets", labels, nil, ), } diff --git a/promunifi/collector.go b/promunifi/collector.go index 2632019dc..d2661c82b 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -131,10 +131,15 @@ func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricEx for _, e := range exports { v, ok := e.Value.(float64) if !ok { - if u.Config.ReportErrors { - ch <- prometheus.NewInvalidMetric(e.Desc, fmt.Errorf("not a number")) + j, ok := e.Value.(int64) + v = float64(j) + if !ok { + // log.Printf("not a number: %v %v", e.Value, e.Desc.String()) + if u.Config.ReportErrors { + ch <- prometheus.NewInvalidMetric(e.Desc, fmt.Errorf("not a number: %v", e.Value)) + } + continue } - return } ch <- prometheus.NewMetricWithTimestamp(ts, prometheus.MustNewConstMetric(e.Desc, e.ValueType, v, e.Labels...)) } diff --git a/promunifi/site.go b/promunifi/site.go index 77bad2ee6..defaaf17b 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -1,17 +1,174 @@ package promunifi import ( + "github.com/prometheus/client_golang/prometheus" "golift.io/unifi" ) type site struct { + NumUser *prometheus.Desc + NumGuest *prometheus.Desc + NumIot *prometheus.Desc + TxBytesR *prometheus.Desc + RxBytesR *prometheus.Desc + NumAp *prometheus.Desc + NumAdopted *prometheus.Desc + NumDisabled *prometheus.Desc + NumDisconnected *prometheus.Desc + NumPending *prometheus.Desc + NumGw *prometheus.Desc + NumSw *prometheus.Desc + NumSta *prometheus.Desc + Latency *prometheus.Desc + Drops *prometheus.Desc + XputUp *prometheus.Desc + XputDown *prometheus.Desc + SpeedtestPing *prometheus.Desc + RemoteUserNumActive *prometheus.Desc + RemoteUserNumInactive *prometheus.Desc + RemoteUserRxBytes *prometheus.Desc + RemoteUserTxBytes *prometheus.Desc + RemoteUserRxPackets *prometheus.Desc + RemoteUserTxPackets *prometheus.Desc } +// XXX: The help values can be more verbose. func descSite(ns string) *site { - return &site{} + labels := []string{"name", "desc", "site_name", "subsystem", "status", "gwversion"} + ns2 := "site" + + return &site{ + NumUser: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "NumUser"), + "NumUser", labels, nil, + ), + NumGuest: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "NumGuest"), + "NumGuest", labels, nil, + ), + NumIot: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "NumIot"), + "NumIot", labels, nil, + ), + TxBytesR: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "TxBytesR"), + "TxBytesR", labels, nil, + ), + RxBytesR: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "RxBytesR"), + "RxBytesR", labels, nil, + ), + NumAp: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "NumAp"), + "NumAp", labels, nil, + ), + NumAdopted: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "NumAdopted"), + "NumAdopted", labels, nil, + ), + NumDisabled: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "NumDisabled"), + "NumDisabled", labels, nil, + ), + NumDisconnected: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "NumDisconnected"), + "NumDisconnected", labels, nil, + ), + NumPending: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "NumPending"), + "NumPending", labels, nil, + ), + NumGw: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "NumGw"), + "NumGw", labels, nil, + ), + NumSw: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "NumSw"), + "NumSw", labels, nil, + ), + NumSta: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "NumSta"), + "NumSta", labels, nil, + ), + Latency: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "Latency"), + "Latency", labels, nil, + ), + Drops: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "Drops"), + "Drops", labels, nil, + ), + XputUp: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "XputUp"), + "XputUp", labels, nil, + ), + XputDown: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "XputDown"), + "XputDown", labels, nil, + ), + SpeedtestPing: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "SpeedtestPing"), + "SpeedtestPing", labels, nil, + ), + RemoteUserNumActive: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "RemoteUserNumActive"), + "RemoteUserNumActive", labels, nil, + ), + RemoteUserNumInactive: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "RemoteUserNumInactive"), + "RemoteUserNumInactive", labels, nil, + ), + RemoteUserRxBytes: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "RemoteUserRxBytes"), + "RemoteUserRxBytes", labels, nil, + ), + RemoteUserTxBytes: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "RemoteUserTxBytes"), + "RemoteUserTxBytes", labels, nil, + ), + RemoteUserRxPackets: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "RemoteUserRxPackets"), + "RemoteUserRxPackets", labels, nil, + ), + RemoteUserTxPackets: prometheus.NewDesc( + prometheus.BuildFQName(ns, ns2, "RemoteUserTxPackets"), + "RemoteUserTxPackets", labels, nil, + ), + } } // exportSite exports Network Site Data func (u *unifiCollector) exportSite(s *unifi.Site) []*metricExports { - return nil + labels := []string{s.Name, s.Desc, s.SiteName} + var m []*metricExports + for _, h := range s.Health { + l := append(labels, h.Subsystem, h.Status, h.GwVersion) + m = append(m, &metricExports{u.Site.NumUser, prometheus.CounterValue, h.NumUser.Val, l}) + m = append(m, &metricExports{u.Site.NumGuest, prometheus.CounterValue, h.NumGuest.Val, l}) + m = append(m, &metricExports{u.Site.NumIot, prometheus.CounterValue, h.NumIot.Val, l}) + m = append(m, &metricExports{u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR.Val, l}) + m = append(m, &metricExports{u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR.Val, l}) + m = append(m, &metricExports{u.Site.NumAp, prometheus.CounterValue, h.NumAp.Val, l}) + m = append(m, &metricExports{u.Site.NumAdopted, prometheus.CounterValue, h.NumAdopted.Val, l}) + m = append(m, &metricExports{u.Site.NumDisabled, prometheus.CounterValue, h.NumDisabled.Val, l}) + m = append(m, &metricExports{u.Site.NumDisconnected, prometheus.CounterValue, h.NumDisconnected.Val, l}) + m = append(m, &metricExports{u.Site.NumPending, prometheus.CounterValue, h.NumPending.Val, l}) + m = append(m, &metricExports{u.Site.NumGw, prometheus.CounterValue, h.NumGw.Val, l}) + m = append(m, &metricExports{u.Site.NumSw, prometheus.CounterValue, h.NumSw.Val, l}) + m = append(m, &metricExports{u.Site.NumSta, prometheus.CounterValue, h.NumSta.Val, l}) + m = append(m, &metricExports{u.Site.Latency, prometheus.GaugeValue, h.Latency.Val, l}) + m = append(m, &metricExports{u.Site.Drops, prometheus.CounterValue, h.Drops.Val, l}) + m = append(m, &metricExports{u.Site.XputUp, prometheus.GaugeValue, h.XputUp.Val, l}) + m = append(m, &metricExports{u.Site.XputDown, prometheus.GaugeValue, h.XputDown.Val, l}) + m = append(m, &metricExports{u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing.Val, l}) + if h.Subsystem == "vpn" { + m = append(m, &metricExports{u.Site.RemoteUserNumActive, prometheus.CounterValue, h.RemoteUserNumActive.Val, l}) + m = append(m, &metricExports{u.Site.RemoteUserNumInactive, prometheus.CounterValue, h.RemoteUserNumInactive.Val, l}) + m = append(m, &metricExports{u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes.Val, l}) + m = append(m, &metricExports{u.Site.RemoteUserTxBytes, prometheus.CounterValue, h.RemoteUserTxBytes.Val, l}) + m = append(m, &metricExports{u.Site.RemoteUserRxPackets, prometheus.CounterValue, h.RemoteUserRxPackets.Val, l}) + m = append(m, &metricExports{u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets.Val, l}) + } + } + return m } From 403961efdf4929c04ebf2accd3374dc11f5a10ec Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 10:11:58 -0800 Subject: [PATCH 12/85] dont need that anymore --- poller/influx.go | 16 ++++++++++++++++ poller/start.go | 4 ++-- poller/unifi.go | 21 ++------------------- 3 files changed, 20 insertions(+), 21 deletions(-) diff --git a/poller/influx.go b/poller/influx.go index 1d0af593c..d3173c4cf 100644 --- a/poller/influx.go +++ b/poller/influx.go @@ -8,6 +8,22 @@ import ( client "github.com/influxdata/influxdb1-client/v2" ) +// CollectAndProcess collects measurements and then reports them to InfluxDB +// Can be called once or in a ticker loop. This function and all the ones below +// handle their own logging. An error is returned so the calling function may +// determine if there was a read or write error and act on it. This is currently +// called in two places in this library. One returns an error, one does not. +func (u *UnifiPoller) CollectAndProcess() error { + metrics, err := u.CollectMetrics() + if err != nil { + return err + } + u.AugmentMetrics(metrics) + err = u.ReportMetrics(metrics) + u.LogError(err, "processing metrics") + return err +} + // ReportMetrics batches all the metrics and writes them to InfluxDB. // This creates an InfluxDB writer, and returns an error if the write fails. func (u *UnifiPoller) ReportMetrics(metrics *metrics.Metrics) error { diff --git a/poller/start.go b/poller/start.go index 4ad0a3800..13f02621b 100644 --- a/poller/start.go +++ b/poller/start.go @@ -95,7 +95,7 @@ func (u *UnifiPoller) Run() (err error) { u.Logf("Logging Measurements to InfluxDB at %s as user %s one time (lambda mode)", u.Config.InfluxURL, u.Config.InfluxUser) u.LastCheck = time.Now() - return u.CollectAndProcess(u.ReportMetrics) + return u.CollectAndProcess() case "prometheus", "exporter": u.Logf("Exporting Measurements at https://%s/metrics for Prometheus", u.Config.HTTPListen) @@ -115,7 +115,7 @@ func (u *UnifiPoller) Run() (err error) { u.Logf("Logging Measurements to InfluxDB at %s as user %s", u.Config.InfluxURL, u.Config.InfluxUser) u.Config.Mode = "influx poller" - return u.PollController(u.ReportMetrics) + return u.PollController() } } diff --git a/poller/unifi.go b/poller/unifi.go index dd7680220..26dc4bf2d 100644 --- a/poller/unifi.go +++ b/poller/unifi.go @@ -13,7 +13,7 @@ import ( // PollController runs forever, polling UniFi // and pushing to influx OR exporting for prometheus. // This is started by Run() after everything checks out. -func (u *UnifiPoller) PollController(process func(*metrics.Metrics) error) error { +func (u *UnifiPoller) PollController() error { interval := u.Config.Interval.Round(time.Second) log.Printf("[INFO] Everything checks out! Poller started in %v mode, interval: %v", u.Config.Mode, interval) ticker := time.NewTicker(interval) @@ -28,7 +28,7 @@ func (u *UnifiPoller) PollController(process func(*metrics.Metrics) error) error } if err == nil { // Only run this if the authentication procedure didn't return error. - _ = u.CollectAndProcess(process) + _ = u.CollectAndProcess() } if u.errorCount > 0 { return fmt.Errorf("too many errors, stopping poller") @@ -70,23 +70,6 @@ FIRST: return nil } -// CollectAndProcess collects measurements and then passese them into the -// provided method. The method is either an http exporter or an influxdb update. -// Can be called once or in a ticker loop. This function and all the ones below -// handle their own logging. An error is returned so the calling function may -// determine if there was a read or write error and act on it. This is currently -// called in two places in this library. One returns an error, one does not. -func (u *UnifiPoller) CollectAndProcess(process func(*metrics.Metrics) error) error { - metrics, err := u.CollectMetrics() - if err != nil { - return err - } - u.AugmentMetrics(metrics) - err = process(metrics) - u.LogError(err, "processing metrics") - return err -} - // CollectMetrics grabs all the measurements from a UniFi controller and returns them. func (u *UnifiPoller) CollectMetrics() (*metrics.Metrics, error) { m := &metrics.Metrics{TS: u.LastCheck} // At this point, it's the Current Check. From a270474022dc9534d60eab88248d7e6da7246b1d Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 11:03:17 -0800 Subject: [PATCH 13/85] dep ensure --- Gopkg.lock | 4 +--- poller/config.go | 1 + 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index f8e483d86..50c77254e 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -46,12 +46,11 @@ version = "v1.0.1" [[projects]] - digest = "1:eb8832cdc904ff89b70c524ab305bf3384c6411f9df6b9f2a41fddc2220e6613" + digest = "1:eb04f69c8991e52eff33c428bd729e04208bf03235be88e4df0d88497c6861b9" name = "github.com/prometheus/client_golang" packages = [ "prometheus", "prometheus/internal", - "prometheus/promauto", "prometheus/promhttp", ] pruneopts = "UT" @@ -129,7 +128,6 @@ "github.com/BurntSushi/toml", "github.com/influxdata/influxdb1-client/v2", "github.com/prometheus/client_golang/prometheus", - "github.com/prometheus/client_golang/prometheus/promauto", "github.com/prometheus/client_golang/prometheus/promhttp", "github.com/spf13/pflag", "golift.io/unifi", diff --git a/poller/config.go b/poller/config.go index 58ef0f9b1..a80ca2395 100644 --- a/poller/config.go +++ b/poller/config.go @@ -145,5 +145,6 @@ func (c *Config) ParseENV() error { c.SetBool(val) } } + return nil } From 5a286459f14032af9be2d9b4d1af7acfb557340e Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 11:55:00 -0800 Subject: [PATCH 14/85] code shrinking --- promunifi/clients.go | 155 +++++++++-------------------------------- promunifi/collector.go | 25 ++++++- promunifi/site.go | 125 ++++++++------------------------- 3 files changed, 86 insertions(+), 219 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index d54be9c5a..8f3823c16 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -39,133 +39,46 @@ type client struct { } func descClient(ns string) *client { + if ns += "_client_"; ns == "_client_" { + ns = "client_" + } + labels := []string{"id", "mac", "user_id", "site_id", "site_name", "network_id", "ap_mac", "gw_mac", "sw_mac", "ap_name", "gw_name", "sw_name", "radio_name", "radio", "radio_proto", "name", "channel", "vlan", "ip", "essid", "bssid", "radio_desc"} - ns2 := "client" return &client{ - Anomalies: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "Anomalies"), - "Client Anomalies", labels, nil, - ), - BytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "BytesR"), - "Client Data Rate", labels, nil, - ), - CCQ: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "CCQ"), - "Client Connection Quality", labels, nil, - ), - Noise: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "Noise"), - "Client AP Noise", labels, nil, - ), - RoamCount: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RoamCount"), - "Client Roam Counter", labels, nil, - ), - RSSI: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RSSI"), - "Client RSSI", labels, nil, - ), - RxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RxBytes"), - "Client Receive Bytes", labels, nil, - ), - RxBytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RxBytesR"), - "Client Receive Data Rate", labels, nil, - ), - RxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RxPackets"), - "Client Receive Packets", labels, nil, - ), - RxRate: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RxRate"), - "Client Receive Rate", labels, nil, - ), - Signal: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "Signal"), - "Client Signal Strength", labels, nil, - ), - TxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "TxBytes"), - "Client Transmit Bytes", labels, nil, - ), - TxBytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "TxBytesR"), - "Client Transmit Data Rate", labels, nil, - ), - TxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "TxPackets"), - "Client Transmit Packets", labels, nil, - ), - TxPower: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "TxPower"), - "Client Transmit Power", labels, nil, - ), - TxRate: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "TxRate"), - "Client Transmit Rate", labels, nil, - ), - Uptime: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "Uptime"), - "Client Uptime", labels, nil, - ), - WifiTxAttempts: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "WifiTxAttempts"), - "Client Wifi Transmit Attempts", labels, nil, - ), - WiredRxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "WiredRxBytes"), - "Client Wired Receive Bytes", labels, nil, - ), - WiredRxBytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "WiredRxBytesR"), - "Client Wired Receive Data Rate", labels, nil, - ), - WiredRxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "WiredRxPackets"), - "Client Wired Receive Packets", labels, nil, - ), - WiredTxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "WiredTxBytes"), - "Client Wired Transmit Bytes", labels, nil, - ), - WiredTxBytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "WiredTxBytesR"), - "Client Wired Data Rate", labels, nil, - ), - WiredTxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "WiredTxPackets"), - "Client Wired Transmit Packets", labels, nil, - ), - DpiStatsApp: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "DpiStatsApp"), - "Client DPI Stats App", labels, nil, - ), - DpiStatsCat: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "DpiStatsCat"), - "Client DPI Stats Cat", labels, nil, - ), - DpiStatsRxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "DpiStatsRxBytes"), - "Client DPI Stats Receive Bytes", labels, nil, - ), - DpiStatsRxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "DpiStatsRxPackets"), - "Client DPI Stats Receive Packets", labels, nil, - ), - DpiStatsTxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "DpiStatsTxBytes"), - "Client DPI Stats Transmit Bytes", labels, nil, - ), - DpiStatsTxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "DpiStatsTxPackets"), - "Client DPI Stats Transmit Packets", labels, nil, - ), + Anomalies: prometheus.NewDesc(ns+"Anomalies", "Client Anomalies", labels, nil), + BytesR: prometheus.NewDesc(ns+"BytesR", "Client Data Rate", labels, nil), + CCQ: prometheus.NewDesc(ns+"CCQ", "Client Connection Quality", labels, nil), + Noise: prometheus.NewDesc(ns+"Noise", "Client AP Noise", labels, nil), + RoamCount: prometheus.NewDesc(ns+"RoamCount", "Client Roam Counter", labels, nil), + RSSI: prometheus.NewDesc(ns+"RSSI", "Client RSSI", labels, nil), + RxBytes: prometheus.NewDesc(ns+"RxBytes", "Client Receive Bytes", labels, nil), + RxBytesR: prometheus.NewDesc(ns+"RxBytesR", "Client Receive Data Rate", labels, nil), + RxPackets: prometheus.NewDesc(ns+"RxPackets", "Client Receive Packets", labels, nil), + RxRate: prometheus.NewDesc(ns+"RxRate", "Client Receive Rate", labels, nil), + Signal: prometheus.NewDesc(ns+"Signal", "Client Signal Strength", labels, nil), + TxBytes: prometheus.NewDesc(ns+"TxBytes", "Client Transmit Bytes", labels, nil), + TxBytesR: prometheus.NewDesc(ns+"TxBytesR", "Client Transmit Data Rate", labels, nil), + TxPackets: prometheus.NewDesc(ns+"TxPackets", "Client Transmit Packets", labels, nil), + TxPower: prometheus.NewDesc(ns+"TxPower", "Client Transmit Power", labels, nil), + TxRate: prometheus.NewDesc(ns+"TxRate", "Client Transmit Rate", labels, nil), + Uptime: prometheus.NewDesc(ns+"Uptime", "Client Uptime", labels, nil), + WifiTxAttempts: prometheus.NewDesc(ns+"WifiTxAttempts", "Client Wifi Transmit Attempts", labels, nil), + WiredRxBytes: prometheus.NewDesc(ns+"WiredRxBytes", "Client Wired Receive Bytes", labels, nil), + WiredRxBytesR: prometheus.NewDesc(ns+"WiredRxBytesR", "Client Wired Receive Data Rate", labels, nil), + WiredRxPackets: prometheus.NewDesc(ns+"WiredRxPackets", "Client Wired Receive Packets", labels, nil), + WiredTxBytes: prometheus.NewDesc(ns+"WiredTxBytes", "Client Wired Transmit Bytes", labels, nil), + WiredTxBytesR: prometheus.NewDesc(ns+"WiredTxBytesR", "Client Wired Data Rate", labels, nil), + WiredTxPackets: prometheus.NewDesc(ns+"WiredTxPackets", "Client Wired Transmit Packets", labels, nil), + DpiStatsApp: prometheus.NewDesc(ns+"DpiStatsApp", "Client DPI Stats App", labels, nil), + DpiStatsCat: prometheus.NewDesc(ns+"DpiStatsCat", "Client DPI Stats Cat", labels, nil), + DpiStatsRxBytes: prometheus.NewDesc(ns+"DpiStatsRxBytes", "Client DPI Stats Receive Bytes", labels, nil), + DpiStatsRxPackets: prometheus.NewDesc(ns+"DpiStatsRxPackets", "Client DPI Stats Receive Packets", labels, nil), + DpiStatsTxBytes: prometheus.NewDesc(ns+"DpiStatsTxBytes", "Client DPI Stats Transmit Bytes", labels, nil), + DpiStatsTxPackets: prometheus.NewDesc(ns+"DpiStatsTxPackets", "Client DPI Stats Transmit Packets", labels, nil), } } diff --git a/promunifi/collector.go b/promunifi/collector.go index d2661c82b..251d8bc35 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -7,6 +7,7 @@ import ( "github.com/davidnewhall/unifi-poller/metrics" "github.com/prometheus/client_golang/prometheus" + "golift.io/unifi" ) // UnifiCollectorCnfg defines the data needed to collect and report UniFi Metrics. @@ -127,12 +128,12 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { } } +/* func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricExports, ts time.Time) { for _, e := range exports { v, ok := e.Value.(float64) if !ok { j, ok := e.Value.(int64) - v = float64(j) if !ok { // log.Printf("not a number: %v %v", e.Value, e.Desc.String()) if u.Config.ReportErrors { @@ -140,7 +141,29 @@ func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricEx } continue } + v = float64(j) } ch <- prometheus.NewMetricWithTimestamp(ts, prometheus.MustNewConstMetric(e.Desc, e.ValueType, v, e.Labels...)) } +}*/ + +func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricExports, ts time.Time) { + for _, e := range exports { + var val float64 + switch v := e.Value.(type) { + case float64: + val = v + case int64: + val = float64(v) + case unifi.FlexInt: + val = v.Val + default: + if u.Config.ReportErrors { + ch <- prometheus.NewInvalidMetric(e.Desc, fmt.Errorf("not a number: %v", e.Value)) + } + continue + } + ch <- prometheus.NewMetricWithTimestamp(ts, prometheus.MustNewConstMetric(e.Desc, e.ValueType, val, e.Labels...)) + } + } diff --git a/promunifi/site.go b/promunifi/site.go index defaaf17b..c61c701fa 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -34,106 +34,37 @@ type site struct { // XXX: The help values can be more verbose. func descSite(ns string) *site { + if ns += "_site_"; ns == "_site_" { + ns = "site_" + } + labels := []string{"name", "desc", "site_name", "subsystem", "status", "gwversion"} - ns2 := "site" return &site{ - NumUser: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "NumUser"), - "NumUser", labels, nil, - ), - NumGuest: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "NumGuest"), - "NumGuest", labels, nil, - ), - NumIot: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "NumIot"), - "NumIot", labels, nil, - ), - TxBytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "TxBytesR"), - "TxBytesR", labels, nil, - ), - RxBytesR: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RxBytesR"), - "RxBytesR", labels, nil, - ), - NumAp: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "NumAp"), - "NumAp", labels, nil, - ), - NumAdopted: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "NumAdopted"), - "NumAdopted", labels, nil, - ), - NumDisabled: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "NumDisabled"), - "NumDisabled", labels, nil, - ), - NumDisconnected: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "NumDisconnected"), - "NumDisconnected", labels, nil, - ), - NumPending: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "NumPending"), - "NumPending", labels, nil, - ), - NumGw: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "NumGw"), - "NumGw", labels, nil, - ), - NumSw: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "NumSw"), - "NumSw", labels, nil, - ), - NumSta: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "NumSta"), - "NumSta", labels, nil, - ), - Latency: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "Latency"), - "Latency", labels, nil, - ), - Drops: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "Drops"), - "Drops", labels, nil, - ), - XputUp: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "XputUp"), - "XputUp", labels, nil, - ), - XputDown: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "XputDown"), - "XputDown", labels, nil, - ), - SpeedtestPing: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "SpeedtestPing"), - "SpeedtestPing", labels, nil, - ), - RemoteUserNumActive: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RemoteUserNumActive"), - "RemoteUserNumActive", labels, nil, - ), - RemoteUserNumInactive: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RemoteUserNumInactive"), - "RemoteUserNumInactive", labels, nil, - ), - RemoteUserRxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RemoteUserRxBytes"), - "RemoteUserRxBytes", labels, nil, - ), - RemoteUserTxBytes: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RemoteUserTxBytes"), - "RemoteUserTxBytes", labels, nil, - ), - RemoteUserRxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RemoteUserRxPackets"), - "RemoteUserRxPackets", labels, nil, - ), - RemoteUserTxPackets: prometheus.NewDesc( - prometheus.BuildFQName(ns, ns2, "RemoteUserTxPackets"), - "RemoteUserTxPackets", labels, nil, - ), + NumUser: prometheus.NewDesc(ns+"NumUser", "NumUser", labels, nil), + NumGuest: prometheus.NewDesc(ns+"NumGuest", "NumGuest", labels, nil), + NumIot: prometheus.NewDesc(ns+"NumIot", "NumIot", labels, nil), + TxBytesR: prometheus.NewDesc(ns+"TxBytesR", "TxBytesR", labels, nil), + RxBytesR: prometheus.NewDesc(ns+"RxBytesR", "RxBytesR", labels, nil), + NumAp: prometheus.NewDesc(ns+"NumAp", "NumAp", labels, nil), + NumAdopted: prometheus.NewDesc(ns+"NumAdopted", "NumAdopted", labels, nil), + NumDisabled: prometheus.NewDesc(ns+"NumDisabled", "NumDisabled", labels, nil), + NumDisconnected: prometheus.NewDesc(ns+"NumDisconnected", "NumDisconnected", labels, nil), + NumPending: prometheus.NewDesc(ns+"NumPending", "NumPending", labels, nil), + NumGw: prometheus.NewDesc(ns+"NumGw", "NumGw", labels, nil), + NumSw: prometheus.NewDesc(ns+"NumSw", "NumSw", labels, nil), + NumSta: prometheus.NewDesc(ns+"NumSta", "NumSta", labels, nil), + Latency: prometheus.NewDesc(ns+"Latency", "Latency", labels, nil), + Drops: prometheus.NewDesc(ns+"Drops", "Drops", labels, nil), + XputUp: prometheus.NewDesc(ns+"XputUp", "XputUp", labels, nil), + XputDown: prometheus.NewDesc(ns+"XputDown", "XputDown", labels, nil), + SpeedtestPing: prometheus.NewDesc(ns+"SpeedtestPing", "SpeedtestPing", labels, nil), + RemoteUserNumActive: prometheus.NewDesc(ns+"RemoteUserNumActive", "RemoteUserNumActive", labels, nil), + RemoteUserNumInactive: prometheus.NewDesc(ns+"RemoteUserNumInactive", "RemoteUserNumInactive", labels, nil), + RemoteUserRxBytes: prometheus.NewDesc(ns+"RemoteUserRxBytes", "RemoteUserRxBytes", labels, nil), + RemoteUserTxBytes: prometheus.NewDesc(ns+"RemoteUserTxBytes", "RemoteUserTxBytes", labels, nil), + RemoteUserRxPackets: prometheus.NewDesc(ns+"RemoteUserRxPackets", "RemoteUserRxPackets", labels, nil), + RemoteUserTxPackets: prometheus.NewDesc(ns+"RemoteUserTxPackets", "RemoteUserTxPackets", labels, nil), } } From c9e137e1f9893b575aa38e9653e7ad2c738126f6 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 14:03:59 -0800 Subject: [PATCH 15/85] Add USW and conuter --- poller/config.go | 1 + poller/prometheus.go | 16 +++--- poller/start.go | 7 +-- promunifi/collector.go | 68 ++++++++++------------- promunifi/usw.go | 119 ++++++++++++++++++++++++++++++++++++++++- 5 files changed, 159 insertions(+), 52 deletions(-) diff --git a/poller/config.go b/poller/config.go index a80ca2395..c5df02ace 100644 --- a/poller/config.go +++ b/poller/config.go @@ -24,6 +24,7 @@ var Version = "development" const ( // App defaults in case they're missing from the config. + defaultNamespace = "unifi" defaultInterval = 30 * time.Second defaultInfluxDB = "unifi" defaultInfluxUser = "unifi" diff --git a/poller/prometheus.go b/poller/prometheus.go index 07eeb7a77..f0dea3ea3 100644 --- a/poller/prometheus.go +++ b/poller/prometheus.go @@ -9,31 +9,33 @@ import ( // ExportMetrics updates the internal metrics provided via // HTTP at /metrics for prometheus collection. This is run by Prometheus. -func (u *UnifiPoller) ExportMetrics() *metrics.Metrics { +func (u *UnifiPoller) ExportMetrics() (*metrics.Metrics, error) { if u.Config.ReAuth { u.LogDebugf("Re-authenticating to UniFi Controller") // Some users need to re-auth every interval because the cookie times out. if err := u.Unifi.Login(); err != nil { u.LogError(err, "re-authenticating") - return nil + return nil, err } } u.LastCheck = time.Now() m, err := u.CollectMetrics() if err != nil { u.LogErrorf("collecting metrics: %v", err) - return nil + return nil, err } u.AugmentMetrics(m) + return m, nil +} +// LogExportReport is called after prometheus exports metrics. This is run by Prometheus. +func (u *UnifiPoller) LogExportReport(m *metrics.Metrics, count int64) { idsMsg := "" if u.Config.CollectIDS { idsMsg = fmt.Sprintf(", IDS Events: %d, ", len(m.IDSList)) } u.Logf("UniFi Measurements Exported. Sites: %d, Clients: %d, "+ - "Wireless APs: %d, Gateways: %d, Switches: %d%s", + "Wireless APs: %d, Gateways: %d, Switches: %d%s, Metrics: %d", len(m.Sites), len(m.Clients), len(m.UAPs), - len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg) - - return m + len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg, count) } diff --git a/poller/start.go b/poller/start.go index 13f02621b..7c0f89a97 100644 --- a/poller/start.go +++ b/poller/start.go @@ -101,10 +101,11 @@ func (u *UnifiPoller) Run() (err error) { u.Logf("Exporting Measurements at https://%s/metrics for Prometheus", u.Config.HTTPListen) http.Handle("/metrics", promhttp.Handler()) prometheus.MustRegister(promunifi.NewUnifiCollector(promunifi.UnifiCollectorCnfg{ - Namespace: "unifi", + Namespace: defaultNamespace, // XXX: pass this in from config. CollectFn: u.ExportMetrics, - ReportErrors: true, - CollectIDS: true, + LoggerFn: u.LogExportReport, + CollectIDS: u.Config.CollectIDS, + ReportErrors: true, // XXX: Does this need to be configurable? })) return http.ListenAndServe(u.Config.HTTPListen, nil) diff --git a/promunifi/collector.go b/promunifi/collector.go index 251d8bc35..791e65c77 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -22,7 +22,9 @@ type UnifiCollectorCnfg struct { ReportErrors bool // This function is passed to the Collect() method. The Collect method runs This // function to retreive the latest UniFi - CollectFn func() *metrics.Metrics + CollectFn func() (*metrics.Metrics, error) + // provide a logger function if you want to run a routine *after* prometheus checks in. + LoggerFn func(*metrics.Metrics, int64) // Setting this to true will enable IDS exports. CollectIDS bool } @@ -93,61 +95,46 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { // Collect satisifes the prometheus Collector. This runs the input method to get // the current metrics (from another package) then exports them for prometheus. func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { - m := u.Config.CollectFn() - if m == nil { + var count int64 + m, err := u.Config.CollectFn() + if err != nil { + ch <- prometheus.NewInvalidMetric(prometheus.NewInvalidDesc(fmt.Errorf("metric fetch failed")), err) return } for _, asset := range m.Clients { - u.export(ch, u.exportClient(asset), m.TS) + count += u.export(ch, u.exportClient(asset), m.TS) } for _, asset := range m.Sites { - u.export(ch, u.exportSite(asset), m.TS) + count += u.export(ch, u.exportSite(asset), m.TS) } if u.Config.CollectIDS { for _, asset := range m.IDSList { - u.export(ch, u.exportIDS(asset), m.TS) + count += u.export(ch, u.exportIDS(asset), m.TS) } } - if m.Devices == nil { - return + if m.Devices != nil { + for _, asset := range m.Devices.UAPs { + count += u.export(ch, u.exportUAP(asset), m.TS) + } + for _, asset := range m.Devices.USGs { + count += u.export(ch, u.exportUSG(asset), m.TS) + } + for _, asset := range m.Devices.USWs { + count += u.export(ch, u.exportUSW(asset), m.TS) + } + for _, asset := range m.Devices.UDMs { + count += u.export(ch, u.exportUDM(asset), m.TS) + } } - for _, asset := range m.Devices.UAPs { - u.export(ch, u.exportUAP(asset), m.TS) - } - for _, asset := range m.Devices.USGs { - u.export(ch, u.exportUSG(asset), m.TS) - } - for _, asset := range m.Devices.USWs { - u.export(ch, u.exportUSW(asset), m.TS) - } - for _, asset := range m.Devices.UDMs { - u.export(ch, u.exportUDM(asset), m.TS) + if u.Config.LoggerFn != nil { + u.Config.LoggerFn(m, count) } } -/* -func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricExports, ts time.Time) { - for _, e := range exports { - v, ok := e.Value.(float64) - if !ok { - j, ok := e.Value.(int64) - if !ok { - // log.Printf("not a number: %v %v", e.Value, e.Desc.String()) - if u.Config.ReportErrors { - ch <- prometheus.NewInvalidMetric(e.Desc, fmt.Errorf("not a number: %v", e.Value)) - } - continue - } - v = float64(j) - } - ch <- prometheus.NewMetricWithTimestamp(ts, prometheus.MustNewConstMetric(e.Desc, e.ValueType, v, e.Labels...)) - } -}*/ - -func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricExports, ts time.Time) { +func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricExports, ts time.Time) (count int64) { for _, e := range exports { var val float64 switch v := e.Value.(type) { @@ -163,7 +150,8 @@ func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricEx } continue } + count++ ch <- prometheus.NewMetricWithTimestamp(ts, prometheus.MustNewConstMetric(e.Desc, e.ValueType, val, e.Labels...)) } - + return } diff --git a/promunifi/usw.go b/promunifi/usw.go index 2938d37c9..c91076e40 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -1,17 +1,132 @@ package promunifi import ( + "github.com/prometheus/client_golang/prometheus" "golift.io/unifi" ) type usw struct { + Uptime *prometheus.Desc `json:"uptime"` + Temperature *prometheus.Desc `json:"general_temperature"` + TotalMaxPower *prometheus.Desc `json:"total_max_power"` + FanLevel *prometheus.Desc `json:"fan_level"` + TotalTxBytes *prometheus.Desc `json:"total_tx_bytes"` + TotalRxBytes *prometheus.Desc `json:"total_rx_bytes"` + TotalBytes *prometheus.Desc `json:"bytes"` + NumSta *prometheus.Desc `json:"num_sta"` + UserNumSta *prometheus.Desc `json:"user-num_sta"` + GuestNumSta *prometheus.Desc `json:"guest-num_sta"` + // Port data. + PoeCurrent *prometheus.Desc `json:"poe_current,omitempty"` + PoePower *prometheus.Desc `json:"poe_power,omitempty"` + PoeVoltage *prometheus.Desc `json:"poe_voltage,omitempty"` + RxBroadcast *prometheus.Desc `json:"rx_broadcast"` + RxBytes *prometheus.Desc `json:"rx_bytes"` + RxBytesR *prometheus.Desc `json:"rx_bytes-r"` + RxDropped *prometheus.Desc `json:"rx_dropped"` + RxErrors *prometheus.Desc `json:"rx_errors"` + RxMulticast *prometheus.Desc `json:"rx_multicast"` + RxPackets *prometheus.Desc `json:"rx_packets"` + Satisfaction *prometheus.Desc `json:"satisfaction,omitempty"` + Speed *prometheus.Desc `json:"speed"` + TxBroadcast *prometheus.Desc `json:"tx_broadcast"` + TxBytes *prometheus.Desc `json:"tx_bytes"` + TxBytesR *prometheus.Desc `json:"tx_bytes-r"` + TxDropped *prometheus.Desc `json:"tx_dropped"` + TxErrors *prometheus.Desc `json:"tx_errors"` + TxMulticast *prometheus.Desc `json:"tx_multicast"` + TxPackets *prometheus.Desc `json:"tx_packets"` } func descUSW(ns string) *usw { - return &usw{} + if ns += "_usw_"; ns == "_usw_" { + ns = "usw_" + } + pns := ns + "port_" + // The first five labels for switch are shared with (the same as) switch ports. + labels := []string{"site_name", "mac", "model", "name", "serial", "site_id", + "type", "version", "device_id", "oid"} + // Copy labels, and replace last four with different names. + labelP := append(append([]string(nil), labels[:6]...), + "port_num", "port_name", "port_mac", "port_ip") + + return &usw{ + // switch data + Uptime: prometheus.NewDesc(ns+"Uptime", "Uptime", labels, nil), + Temperature: prometheus.NewDesc(ns+"Temperature", "Temperature", labels, nil), + TotalMaxPower: prometheus.NewDesc(ns+"TotalMaxPower", "TotalMaxPower", labels, nil), + FanLevel: prometheus.NewDesc(ns+"FanLevel", "FanLevel", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"TxBytes", "TxBytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"RxBytes", "RxBytes", labels, nil), + TotalBytes: prometheus.NewDesc(ns+"Bytes", "Bytes", labels, nil), + NumSta: prometheus.NewDesc(ns+"NumSta", "NumSta", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"UserNumSta", "UserNumSta", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"GuestNumSta", "GuestNumSta", labels, nil), + // per-port data + PoeCurrent: prometheus.NewDesc(pns+"PoeCurrent", "PoeCurrent", labelP, nil), + PoePower: prometheus.NewDesc(pns+"PoePower", "PoePower", labelP, nil), + PoeVoltage: prometheus.NewDesc(pns+"PoeVoltage", "PoeVoltage", labelP, nil), + RxBroadcast: prometheus.NewDesc(pns+"RxBroadcast", "RxBroadcast", labelP, nil), + RxBytes: prometheus.NewDesc(pns+"RxBytes", "RxBytes", labelP, nil), + RxBytesR: prometheus.NewDesc(pns+"RxBytesR", "RxBytesR", labelP, nil), + RxDropped: prometheus.NewDesc(pns+"RxDropped", "RxDropped", labelP, nil), + RxErrors: prometheus.NewDesc(pns+"RxErrors", "RxErrors", labelP, nil), + RxMulticast: prometheus.NewDesc(pns+"RxMulticast", "RxMulticast", labelP, nil), + RxPackets: prometheus.NewDesc(pns+"RxPackets", "RxPackets", labelP, nil), + Satisfaction: prometheus.NewDesc(pns+"Satisfaction", "Satisfaction", labelP, nil), + Speed: prometheus.NewDesc(pns+"Speed", "Speed", labelP, nil), + TxBroadcast: prometheus.NewDesc(pns+"TxBroadcast", "TxBroadcast", labelP, nil), + TxBytes: prometheus.NewDesc(pns+"TxBytes", "TxBytes", labelP, nil), + TxBytesR: prometheus.NewDesc(pns+"TxBytesR", "TxBytesR", labelP, nil), + TxDropped: prometheus.NewDesc(pns+"TxDropped", "TxDropped", labelP, nil), + TxErrors: prometheus.NewDesc(pns+"TxErrors", "TxErrors", labelP, nil), + TxMulticast: prometheus.NewDesc(pns+"TxMulticast", "TxMulticast", labelP, nil), + TxPackets: prometheus.NewDesc(pns+"TxPackets", "TxPackets", labelP, nil), + } } // exportUSW exports Network Switch Data func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { - return nil + labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID, + s.Type, s.Version, s.DeviceID, s.Stat.Oid} + + // Switch data. + m := []*metricExports{ + {u.USW.Uptime, prometheus.GaugeValue, s.Uptime, labels}, + {u.USW.Temperature, prometheus.GaugeValue, s.GeneralTemperature, labels}, + {u.USW.TotalMaxPower, prometheus.GaugeValue, s.TotalMaxPower, labels}, + {u.USW.FanLevel, prometheus.GaugeValue, s.FanLevel, labels}, + {u.USW.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, + {u.USW.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, + {u.USW.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, + {u.USW.NumSta, prometheus.GaugeValue, s.NumSta, labels}, + {u.USW.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, + {u.USW.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, + } + + // Per-port data on the switch + for _, p := range s.PortTable { + // Copy labels, and replace last four with different data. + l := append(append([]string(nil), labels[:6]...), p.PortIdx.Txt, p.Name, p.Mac, p.IP) + m = append(m, &metricExports{u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}) + m = append(m, &metricExports{u.USW.PoePower, prometheus.GaugeValue, p.PoePower, l}) + m = append(m, &metricExports{u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, l}) + m = append(m, &metricExports{u.USW.RxBroadcast, prometheus.CounterValue, p.RxBroadcast, l}) + m = append(m, &metricExports{u.USW.RxBytes, prometheus.CounterValue, p.RxBytes, l}) + m = append(m, &metricExports{u.USW.RxBytesR, prometheus.GaugeValue, p.RxBytesR, l}) + m = append(m, &metricExports{u.USW.RxDropped, prometheus.CounterValue, p.RxDropped, l}) + m = append(m, &metricExports{u.USW.RxErrors, prometheus.CounterValue, p.RxErrors, l}) + m = append(m, &metricExports{u.USW.RxMulticast, prometheus.CounterValue, p.RxMulticast, l}) + m = append(m, &metricExports{u.USW.RxPackets, prometheus.CounterValue, p.RxPackets, l}) + m = append(m, &metricExports{u.USW.Satisfaction, prometheus.GaugeValue, p.Satisfaction, l}) + m = append(m, &metricExports{u.USW.Speed, prometheus.GaugeValue, p.Speed, l}) + m = append(m, &metricExports{u.USW.TxBroadcast, prometheus.CounterValue, p.TxBroadcast, l}) + m = append(m, &metricExports{u.USW.TxBytes, prometheus.CounterValue, p.TxBytes, l}) + m = append(m, &metricExports{u.USW.TxBytesR, prometheus.GaugeValue, p.TxBytesR, l}) + m = append(m, &metricExports{u.USW.TxDropped, prometheus.CounterValue, p.TxDropped, l}) + m = append(m, &metricExports{u.USW.TxErrors, prometheus.CounterValue, p.TxErrors, l}) + m = append(m, &metricExports{u.USW.TxMulticast, prometheus.CounterValue, p.TxMulticast, l}) + } + + return m } From a7ebbdb596270d0d488d95498aeccfcd876aeb28 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 14:27:23 -0800 Subject: [PATCH 16/85] some cleanup --- poller/prometheus.go | 4 ++-- poller/start.go | 3 +-- promunifi/collector.go | 37 ++++++++++++++++++++----------------- promunifi/ids.go | 2 ++ promunifi/usw.go | 4 ++-- 5 files changed, 27 insertions(+), 23 deletions(-) diff --git a/poller/prometheus.go b/poller/prometheus.go index f0dea3ea3..4fa134de8 100644 --- a/poller/prometheus.go +++ b/poller/prometheus.go @@ -8,7 +8,7 @@ import ( ) // ExportMetrics updates the internal metrics provided via -// HTTP at /metrics for prometheus collection. This is run by Prometheus. +// HTTP at /metrics for prometheus collection. This is run by Prometheus CollectFn. func (u *UnifiPoller) ExportMetrics() (*metrics.Metrics, error) { if u.Config.ReAuth { u.LogDebugf("Re-authenticating to UniFi Controller") @@ -28,7 +28,7 @@ func (u *UnifiPoller) ExportMetrics() (*metrics.Metrics, error) { return m, nil } -// LogExportReport is called after prometheus exports metrics. This is run by Prometheus. +// LogExportReport is called after prometheus exports metrics. This is run by Prometheus as LoggingFn func (u *UnifiPoller) LogExportReport(m *metrics.Metrics, count int64) { idsMsg := "" if u.Config.CollectIDS { diff --git a/poller/start.go b/poller/start.go index 7c0f89a97..8acfe85bc 100644 --- a/poller/start.go +++ b/poller/start.go @@ -103,7 +103,7 @@ func (u *UnifiPoller) Run() (err error) { prometheus.MustRegister(promunifi.NewUnifiCollector(promunifi.UnifiCollectorCnfg{ Namespace: defaultNamespace, // XXX: pass this in from config. CollectFn: u.ExportMetrics, - LoggerFn: u.LogExportReport, + LoggingFn: u.LogExportReport, CollectIDS: u.Config.CollectIDS, ReportErrors: true, // XXX: Does this need to be configurable? })) @@ -113,7 +113,6 @@ func (u *UnifiPoller) Run() (err error) { if err = u.GetInfluxDB(); err != nil { return err } - u.Logf("Logging Measurements to InfluxDB at %s as user %s", u.Config.InfluxURL, u.Config.InfluxUser) u.Config.Mode = "influx poller" return u.PollController() diff --git a/promunifi/collector.go b/promunifi/collector.go index 791e65c77..5df018e1c 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -24,7 +24,7 @@ type UnifiCollectorCnfg struct { // function to retreive the latest UniFi CollectFn func() (*metrics.Metrics, error) // provide a logger function if you want to run a routine *after* prometheus checks in. - LoggerFn func(*metrics.Metrics, int64) + LoggingFn func(*metrics.Metrics, int64) // Setting this to true will enable IDS exports. CollectIDS bool } @@ -98,10 +98,15 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { var count int64 m, err := u.Config.CollectFn() if err != nil { - ch <- prometheus.NewInvalidMetric(prometheus.NewInvalidDesc(fmt.Errorf("metric fetch failed")), err) + ch <- prometheus.NewInvalidMetric( + prometheus.NewInvalidDesc(fmt.Errorf("metric fetch failed")), err) return } + if u.Config.LoggingFn != nil { + defer func() { u.Config.LoggingFn(m, count) }() + } + for _, asset := range m.Clients { count += u.export(ch, u.exportClient(asset), m.TS) } @@ -114,23 +119,21 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { } } - if m.Devices != nil { - for _, asset := range m.Devices.UAPs { - count += u.export(ch, u.exportUAP(asset), m.TS) - } - for _, asset := range m.Devices.USGs { - count += u.export(ch, u.exportUSG(asset), m.TS) - } - for _, asset := range m.Devices.USWs { - count += u.export(ch, u.exportUSW(asset), m.TS) - } - for _, asset := range m.Devices.UDMs { - count += u.export(ch, u.exportUDM(asset), m.TS) - } + if m.Devices == nil { + return } - if u.Config.LoggerFn != nil { - u.Config.LoggerFn(m, count) + for _, asset := range m.Devices.UAPs { + count += u.export(ch, u.exportUAP(asset), m.TS) + } + for _, asset := range m.Devices.USGs { + count += u.export(ch, u.exportUSG(asset), m.TS) + } + for _, asset := range m.Devices.USWs { + count += u.export(ch, u.exportUSW(asset), m.TS) + } + for _, asset := range m.Devices.UDMs { + count += u.export(ch, u.exportUDM(asset), m.TS) } } diff --git a/promunifi/ids.go b/promunifi/ids.go index badd23d86..35a274289 100644 --- a/promunifi/ids.go +++ b/promunifi/ids.go @@ -4,6 +4,8 @@ import ( "golift.io/unifi" ) +/* The IDS data goes into prometheus cleanly. This probably wont happen. */ + type ids struct { } diff --git a/promunifi/usw.go b/promunifi/usw.go index c91076e40..df8ac9995 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -47,7 +47,7 @@ func descUSW(ns string) *usw { labels := []string{"site_name", "mac", "model", "name", "serial", "site_id", "type", "version", "device_id", "oid"} // Copy labels, and replace last four with different names. - labelP := append(append([]string(nil), labels[:6]...), + labelP := append(append([]string{}, labels[:6]...), "port_num", "port_name", "port_mac", "port_ip") return &usw{ @@ -107,7 +107,7 @@ func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { // Per-port data on the switch for _, p := range s.PortTable { // Copy labels, and replace last four with different data. - l := append(append([]string(nil), labels[:6]...), p.PortIdx.Txt, p.Name, p.Mac, p.IP) + l := append(append([]string{}, labels[:6]...), p.PortIdx.Txt, p.Name, p.Mac, p.IP) m = append(m, &metricExports{u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}) m = append(m, &metricExports{u.USW.PoePower, prometheus.GaugeValue, p.PoePower, l}) m = append(m, &metricExports{u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, l}) From 9d0d9e97f93f89477651bd15cdf482acb946359f Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 14:27:51 -0800 Subject: [PATCH 17/85] fix comment --- promunifi/ids.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/promunifi/ids.go b/promunifi/ids.go index 35a274289..f8c64894e 100644 --- a/promunifi/ids.go +++ b/promunifi/ids.go @@ -4,7 +4,7 @@ import ( "golift.io/unifi" ) -/* The IDS data goes into prometheus cleanly. This probably wont happen. */ +/* The IDS data does not go into prometheus cleanly. This probably wont happen. */ type ids struct { } From ed94bed4da5bc506c3668ed07f37a746973270fe Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 17:18:37 -0800 Subject: [PATCH 18/85] better logging --- poller/prometheus.go | 38 ++++++++++++++++++++-------------- promunifi/collector.go | 47 ++++++++++++++++++++++++++++++++---------- 2 files changed, 59 insertions(+), 26 deletions(-) diff --git a/poller/prometheus.go b/poller/prometheus.go index 4fa134de8..3cfb626f6 100644 --- a/poller/prometheus.go +++ b/poller/prometheus.go @@ -5,37 +5,45 @@ import ( "time" "github.com/davidnewhall/unifi-poller/metrics" + "github.com/davidnewhall/unifi-poller/promunifi" ) // ExportMetrics updates the internal metrics provided via -// HTTP at /metrics for prometheus collection. This is run by Prometheus CollectFn. +// HTTP at /metrics for prometheus collection. +// This is run by Prometheus as CollectFn. func (u *UnifiPoller) ExportMetrics() (*metrics.Metrics, error) { - if u.Config.ReAuth { - u.LogDebugf("Re-authenticating to UniFi Controller") - // Some users need to re-auth every interval because the cookie times out. - if err := u.Unifi.Login(); err != nil { - u.LogError(err, "re-authenticating") - return nil, err - } - } u.LastCheck = time.Now() m, err := u.CollectMetrics() if err != nil { u.LogErrorf("collecting metrics: %v", err) - return nil, err + u.Logf("Re-authenticating to UniFi Controller") + if err := u.Unifi.Login(); err != nil { + u.LogError(err, "re-authenticating") + return nil, err + } + if m, err = u.CollectMetrics(); err != nil { + u.LogErrorf("collecting metrics: %v", err) + return nil, err + } } + u.AugmentMetrics(m) return m, nil } -// LogExportReport is called after prometheus exports metrics. This is run by Prometheus as LoggingFn -func (u *UnifiPoller) LogExportReport(m *metrics.Metrics, count int64) { +// LogExportReport is called after prometheus exports metrics. +// This is run by Prometheus as LoggingFn +func (u *UnifiPoller) LogExportReport(report *promunifi.Report) { + m := report.Metrics idsMsg := "" if u.Config.CollectIDS { idsMsg = fmt.Sprintf(", IDS Events: %d, ", len(m.IDSList)) } + u.Logf("UniFi Measurements Exported. Sites: %d, Clients: %d, "+ - "Wireless APs: %d, Gateways: %d, Switches: %d%s, Metrics: %d", - len(m.Sites), len(m.Clients), len(m.UAPs), - len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg, count) + "Wireless APs: %d, Gateways: %d, Switches: %d%s, Descs: %d, "+ + "Metrics: %d, Errors: %d, Elapsed: %v", + len(m.Sites), len(m.Clients), len(m.UAPs), len(m.UDMs)+len(m.USGs), + len(m.USWs), idsMsg, report.Descs, report.Total, report.Errors, + report.Elapsed.Round(time.Millisecond)) } diff --git a/promunifi/collector.go b/promunifi/collector.go index 5df018e1c..d6c93c62c 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -24,7 +24,7 @@ type UnifiCollectorCnfg struct { // function to retreive the latest UniFi CollectFn func() (*metrics.Metrics, error) // provide a logger function if you want to run a routine *after* prometheus checks in. - LoggingFn func(*metrics.Metrics, int64) + LoggingFn func(*Report) // Setting this to true will enable IDS exports. CollectIDS bool } @@ -47,6 +47,15 @@ type metricExports struct { Labels []string } +// Report is passed into LoggingFn to log the export metrics to stdout (outside this package). +type Report struct { + Total int + Errors int + Descs int + Metrics *metrics.Metrics + Elapsed time.Duration +} + // NewUnifiCollector returns a prometheus collector that will export any available // UniFi metrics. You must provide a collection function in the opts. func NewUnifiCollector(opts UnifiCollectorCnfg) prometheus.Collector { @@ -95,7 +104,7 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { // Collect satisifes the prometheus Collector. This runs the input method to get // the current metrics (from another package) then exports them for prometheus. func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { - var count int64 + start := time.Now() m, err := u.Config.CollectFn() if err != nil { ch <- prometheus.NewInvalidMetric( @@ -103,19 +112,34 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { return } + descs := make(map[*prometheus.Desc]bool) // used as a counter + r := &Report{Metrics: m} if u.Config.LoggingFn != nil { - defer func() { u.Config.LoggingFn(m, count) }() + defer func() { + r.Elapsed = time.Since(start) + r.Descs = len(descs) + u.Config.LoggingFn(r) + }() + } + + process := func(m []*metricExports, ts time.Time) { + count, errors := u.export(ch, m, ts) + r.Total += count + r.Errors += errors + for _, d := range m { + descs[d.Desc] = true + } } for _, asset := range m.Clients { - count += u.export(ch, u.exportClient(asset), m.TS) + process(u.exportClient(asset), m.TS) } for _, asset := range m.Sites { - count += u.export(ch, u.exportSite(asset), m.TS) + process(u.exportSite(asset), m.TS) } if u.Config.CollectIDS { for _, asset := range m.IDSList { - count += u.export(ch, u.exportIDS(asset), m.TS) + process(u.exportIDS(asset), m.TS) } } @@ -124,20 +148,20 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { } for _, asset := range m.Devices.UAPs { - count += u.export(ch, u.exportUAP(asset), m.TS) + process(u.exportUAP(asset), m.TS) } for _, asset := range m.Devices.USGs { - count += u.export(ch, u.exportUSG(asset), m.TS) + process(u.exportUSG(asset), m.TS) } for _, asset := range m.Devices.USWs { - count += u.export(ch, u.exportUSW(asset), m.TS) + process(u.exportUSW(asset), m.TS) } for _, asset := range m.Devices.UDMs { - count += u.export(ch, u.exportUDM(asset), m.TS) + process(u.exportUDM(asset), m.TS) } } -func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricExports, ts time.Time) (count int64) { +func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricExports, ts time.Time) (count, errors int) { for _, e := range exports { var val float64 switch v := e.Value.(type) { @@ -148,6 +172,7 @@ func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricEx case unifi.FlexInt: val = v.Val default: + errors++ if u.Config.ReportErrors { ch <- prometheus.NewInvalidMetric(e.Desc, fmt.Errorf("not a number: %v", e.Value)) } From cc666773055786472f40df41f1b17a567ad020f4 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 18:13:02 -0800 Subject: [PATCH 19/85] remove IDS, fix metric names to standards, remove timestamp --- promunifi/clients.go | 64 +++++++++++------------ promunifi/collector.go | 32 ++++-------- promunifi/ids.go | 19 ------- promunifi/site.go | 48 ++++++++--------- promunifi/usw.go | 116 ++++++++++++++++++++--------------------- 5 files changed, 124 insertions(+), 155 deletions(-) delete mode 100644 promunifi/ids.go diff --git a/promunifi/clients.go b/promunifi/clients.go index 8f3823c16..b0f4065a0 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -49,36 +49,36 @@ func descClient(ns string) *client { "vlan", "ip", "essid", "bssid", "radio_desc"} return &client{ - Anomalies: prometheus.NewDesc(ns+"Anomalies", "Client Anomalies", labels, nil), - BytesR: prometheus.NewDesc(ns+"BytesR", "Client Data Rate", labels, nil), - CCQ: prometheus.NewDesc(ns+"CCQ", "Client Connection Quality", labels, nil), - Noise: prometheus.NewDesc(ns+"Noise", "Client AP Noise", labels, nil), - RoamCount: prometheus.NewDesc(ns+"RoamCount", "Client Roam Counter", labels, nil), - RSSI: prometheus.NewDesc(ns+"RSSI", "Client RSSI", labels, nil), - RxBytes: prometheus.NewDesc(ns+"RxBytes", "Client Receive Bytes", labels, nil), - RxBytesR: prometheus.NewDesc(ns+"RxBytesR", "Client Receive Data Rate", labels, nil), - RxPackets: prometheus.NewDesc(ns+"RxPackets", "Client Receive Packets", labels, nil), - RxRate: prometheus.NewDesc(ns+"RxRate", "Client Receive Rate", labels, nil), - Signal: prometheus.NewDesc(ns+"Signal", "Client Signal Strength", labels, nil), - TxBytes: prometheus.NewDesc(ns+"TxBytes", "Client Transmit Bytes", labels, nil), - TxBytesR: prometheus.NewDesc(ns+"TxBytesR", "Client Transmit Data Rate", labels, nil), - TxPackets: prometheus.NewDesc(ns+"TxPackets", "Client Transmit Packets", labels, nil), - TxPower: prometheus.NewDesc(ns+"TxPower", "Client Transmit Power", labels, nil), - TxRate: prometheus.NewDesc(ns+"TxRate", "Client Transmit Rate", labels, nil), - Uptime: prometheus.NewDesc(ns+"Uptime", "Client Uptime", labels, nil), - WifiTxAttempts: prometheus.NewDesc(ns+"WifiTxAttempts", "Client Wifi Transmit Attempts", labels, nil), - WiredRxBytes: prometheus.NewDesc(ns+"WiredRxBytes", "Client Wired Receive Bytes", labels, nil), - WiredRxBytesR: prometheus.NewDesc(ns+"WiredRxBytesR", "Client Wired Receive Data Rate", labels, nil), - WiredRxPackets: prometheus.NewDesc(ns+"WiredRxPackets", "Client Wired Receive Packets", labels, nil), - WiredTxBytes: prometheus.NewDesc(ns+"WiredTxBytes", "Client Wired Transmit Bytes", labels, nil), - WiredTxBytesR: prometheus.NewDesc(ns+"WiredTxBytesR", "Client Wired Data Rate", labels, nil), - WiredTxPackets: prometheus.NewDesc(ns+"WiredTxPackets", "Client Wired Transmit Packets", labels, nil), - DpiStatsApp: prometheus.NewDesc(ns+"DpiStatsApp", "Client DPI Stats App", labels, nil), - DpiStatsCat: prometheus.NewDesc(ns+"DpiStatsCat", "Client DPI Stats Cat", labels, nil), - DpiStatsRxBytes: prometheus.NewDesc(ns+"DpiStatsRxBytes", "Client DPI Stats Receive Bytes", labels, nil), - DpiStatsRxPackets: prometheus.NewDesc(ns+"DpiStatsRxPackets", "Client DPI Stats Receive Packets", labels, nil), - DpiStatsTxBytes: prometheus.NewDesc(ns+"DpiStatsTxBytes", "Client DPI Stats Transmit Bytes", labels, nil), - DpiStatsTxPackets: prometheus.NewDesc(ns+"DpiStatsTxPackets", "Client DPI Stats Transmit Packets", labels, nil), + Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labels, nil), + BytesR: prometheus.NewDesc(ns+"bytes_rate", "Client Data Rate", labels, nil), + CCQ: prometheus.NewDesc(ns+"ccq", "Client Connection Quality", labels, nil), + Noise: prometheus.NewDesc(ns+"noise", "Client AP Noise", labels, nil), + RoamCount: prometheus.NewDesc(ns+"roam_total", "Client Roam Counter", labels, nil), + RSSI: prometheus.NewDesc(ns+"rssi", "Client RSSI", labels, nil), + RxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "Client Receive Bytes", labels, nil), + RxBytesR: prometheus.NewDesc(ns+"rx_bytes_rate", "Client Receive Data Rate", labels, nil), + RxPackets: prometheus.NewDesc(ns+"rx_packets", "Client Receive Packets", labels, nil), + RxRate: prometheus.NewDesc(ns+"rx_rate", "Client Receive Rate", labels, nil), + Signal: prometheus.NewDesc(ns+"signal", "Client Signal Strength", labels, nil), + TxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "Client Transmit Bytes", labels, nil), + TxBytesR: prometheus.NewDesc(ns+"tx_bytes_rate", "Client Transmit Data Rate", labels, nil), + TxPackets: prometheus.NewDesc(ns+"tx_packets", "Client Transmit Packets", labels, nil), + TxPower: prometheus.NewDesc(ns+"tx_power", "Client Transmit Power", labels, nil), + TxRate: prometheus.NewDesc(ns+"tx_rate", "Client Transmit Rate", labels, nil), + Uptime: prometheus.NewDesc(ns+"uptime", "Client Uptime", labels, nil), + WifiTxAttempts: prometheus.NewDesc(ns+"wifi_tx_attempts_total", "Client Wifi Transmit Attempts", labels, nil), + WiredRxBytes: prometheus.NewDesc(ns+"wired_rx_bytes_total", "Client Wired Receive Bytes", labels, nil), + WiredRxBytesR: prometheus.NewDesc(ns+"wired_rx_bytes_rate", "Client Wired Receive Data Rate", labels, nil), + WiredRxPackets: prometheus.NewDesc(ns+"wired_rx_packets_total", "Client Wired Receive Packets", labels, nil), + WiredTxBytes: prometheus.NewDesc(ns+"wired_tx_bytes_total", "Client Wired Transmit Bytes", labels, nil), + WiredTxBytesR: prometheus.NewDesc(ns+"wired_tx_bytes_rate", "Client Wired Data Rate", labels, nil), + WiredTxPackets: prometheus.NewDesc(ns+"wired_tx_packets_total", "Client Wired Transmit Packets", labels, nil), + DpiStatsApp: prometheus.NewDesc(ns+"dpi_stats_app", "Client DPI Stats App", labels, nil), + DpiStatsCat: prometheus.NewDesc(ns+"dpi_stats_cat", "Client DPI Stats Cat", labels, nil), + DpiStatsRxBytes: prometheus.NewDesc(ns+"dpi_stats_rx_bytes_total", "Client DPI Stats Receive Bytes", labels, nil), + DpiStatsRxPackets: prometheus.NewDesc(ns+"dpi_stats_rx_packets_total", "Client DPI Stats Receive Packets", labels, nil), + DpiStatsTxBytes: prometheus.NewDesc(ns+"dpi_stats_tx_bytes_total", "Client DPI Stats Transmit Bytes", labels, nil), + DpiStatsTxPackets: prometheus.NewDesc(ns+"dpi_stats_tx_packets_total", "Client DPI Stats Transmit Packets", labels, nil), } } @@ -106,13 +106,13 @@ func (u *unifiCollector) exportClient(c *unifi.Client) []*metricExports { {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labels}, {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labels}, {u.Client.TxPower, prometheus.GaugeValue, c.TxPower, labels}, - {u.Client.TxRate, prometheus.CounterValue, c.TxRate, labels}, + {u.Client.TxRate, prometheus.GaugeValue, c.TxRate, labels}, {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labels}, {u.Client.WiredRxBytes, prometheus.CounterValue, c.WiredRxBytes, labels}, {u.Client.WiredRxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labels}, {u.Client.WiredRxPackets, prometheus.CounterValue, c.WiredRxPackets, labels}, - {u.Client.WiredTxBytes, prometheus.CounterValue, c.TxRate, labels}, + {u.Client.WiredTxBytes, prometheus.CounterValue, c.WiredTxBytes, labels}, {u.Client.WiredTxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labels}, {u.Client.WiredTxPackets, prometheus.CounterValue, c.WiredTxPackets, labels}, {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App.Val, labels}, diff --git a/promunifi/collector.go b/promunifi/collector.go index d6c93c62c..7497011ca 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -25,8 +25,6 @@ type UnifiCollectorCnfg struct { CollectFn func() (*metrics.Metrics, error) // provide a logger function if you want to run a routine *after* prometheus checks in. LoggingFn func(*Report) - // Setting this to true will enable IDS exports. - CollectIDS bool } type unifiCollector struct { @@ -36,7 +34,6 @@ type unifiCollector struct { USG *usg USW *usw UDM *udm - IDS *ids Site *site } @@ -71,7 +68,6 @@ func NewUnifiCollector(opts UnifiCollectorCnfg) prometheus.Collector { USW: descUSW(opts.Namespace), UDM: descUDM(opts.Namespace), Site: descSite(opts.Namespace), - IDS: descIDS(opts.Namespace), } } @@ -96,9 +92,6 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { describe(u.USW) describe(u.UDM) describe(u.Site) - if u.Config.CollectIDS { - describe(u.IDS) - } } // Collect satisifes the prometheus Collector. This runs the input method to get @@ -122,8 +115,8 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { }() } - process := func(m []*metricExports, ts time.Time) { - count, errors := u.export(ch, m, ts) + process := func(m []*metricExports) { + count, errors := u.export(ch, m) r.Total += count r.Errors += errors for _, d := range m { @@ -132,15 +125,10 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { } for _, asset := range m.Clients { - process(u.exportClient(asset), m.TS) + process(u.exportClient(asset)) } for _, asset := range m.Sites { - process(u.exportSite(asset), m.TS) - } - if u.Config.CollectIDS { - for _, asset := range m.IDSList { - process(u.exportIDS(asset), m.TS) - } + process(u.exportSite(asset)) } if m.Devices == nil { @@ -148,20 +136,20 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { } for _, asset := range m.Devices.UAPs { - process(u.exportUAP(asset), m.TS) + process(u.exportUAP(asset)) } for _, asset := range m.Devices.USGs { - process(u.exportUSG(asset), m.TS) + process(u.exportUSG(asset)) } for _, asset := range m.Devices.USWs { - process(u.exportUSW(asset), m.TS) + process(u.exportUSW(asset)) } for _, asset := range m.Devices.UDMs { - process(u.exportUDM(asset), m.TS) + process(u.exportUDM(asset)) } } -func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricExports, ts time.Time) (count, errors int) { +func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricExports) (count, errors int) { for _, e := range exports { var val float64 switch v := e.Value.(type) { @@ -179,7 +167,7 @@ func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricEx continue } count++ - ch <- prometheus.NewMetricWithTimestamp(ts, prometheus.MustNewConstMetric(e.Desc, e.ValueType, val, e.Labels...)) + ch <- prometheus.MustNewConstMetric(e.Desc, e.ValueType, val, e.Labels...) } return } diff --git a/promunifi/ids.go b/promunifi/ids.go deleted file mode 100644 index f8c64894e..000000000 --- a/promunifi/ids.go +++ /dev/null @@ -1,19 +0,0 @@ -package promunifi - -import ( - "golift.io/unifi" -) - -/* The IDS data does not go into prometheus cleanly. This probably wont happen. */ - -type ids struct { -} - -func descIDS(ns string) *ids { - return &ids{} -} - -// exportIDS exports Intrusion Detection System Data -func (u *unifiCollector) exportIDS(i *unifi.IDS) []*metricExports { - return nil -} diff --git a/promunifi/site.go b/promunifi/site.go index c61c701fa..78719d098 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -41,30 +41,30 @@ func descSite(ns string) *site { labels := []string{"name", "desc", "site_name", "subsystem", "status", "gwversion"} return &site{ - NumUser: prometheus.NewDesc(ns+"NumUser", "NumUser", labels, nil), - NumGuest: prometheus.NewDesc(ns+"NumGuest", "NumGuest", labels, nil), - NumIot: prometheus.NewDesc(ns+"NumIot", "NumIot", labels, nil), - TxBytesR: prometheus.NewDesc(ns+"TxBytesR", "TxBytesR", labels, nil), - RxBytesR: prometheus.NewDesc(ns+"RxBytesR", "RxBytesR", labels, nil), - NumAp: prometheus.NewDesc(ns+"NumAp", "NumAp", labels, nil), - NumAdopted: prometheus.NewDesc(ns+"NumAdopted", "NumAdopted", labels, nil), - NumDisabled: prometheus.NewDesc(ns+"NumDisabled", "NumDisabled", labels, nil), - NumDisconnected: prometheus.NewDesc(ns+"NumDisconnected", "NumDisconnected", labels, nil), - NumPending: prometheus.NewDesc(ns+"NumPending", "NumPending", labels, nil), - NumGw: prometheus.NewDesc(ns+"NumGw", "NumGw", labels, nil), - NumSw: prometheus.NewDesc(ns+"NumSw", "NumSw", labels, nil), - NumSta: prometheus.NewDesc(ns+"NumSta", "NumSta", labels, nil), - Latency: prometheus.NewDesc(ns+"Latency", "Latency", labels, nil), - Drops: prometheus.NewDesc(ns+"Drops", "Drops", labels, nil), - XputUp: prometheus.NewDesc(ns+"XputUp", "XputUp", labels, nil), - XputDown: prometheus.NewDesc(ns+"XputDown", "XputDown", labels, nil), - SpeedtestPing: prometheus.NewDesc(ns+"SpeedtestPing", "SpeedtestPing", labels, nil), - RemoteUserNumActive: prometheus.NewDesc(ns+"RemoteUserNumActive", "RemoteUserNumActive", labels, nil), - RemoteUserNumInactive: prometheus.NewDesc(ns+"RemoteUserNumInactive", "RemoteUserNumInactive", labels, nil), - RemoteUserRxBytes: prometheus.NewDesc(ns+"RemoteUserRxBytes", "RemoteUserRxBytes", labels, nil), - RemoteUserTxBytes: prometheus.NewDesc(ns+"RemoteUserTxBytes", "RemoteUserTxBytes", labels, nil), - RemoteUserRxPackets: prometheus.NewDesc(ns+"RemoteUserRxPackets", "RemoteUserRxPackets", labels, nil), - RemoteUserTxPackets: prometheus.NewDesc(ns+"RemoteUserTxPackets", "RemoteUserTxPackets", labels, nil), + NumUser: prometheus.NewDesc(ns+"user_total", "NumUser", labels, nil), + NumGuest: prometheus.NewDesc(ns+"guest_total", "NumGuest", labels, nil), + NumIot: prometheus.NewDesc(ns+"iot_total", "NumIot", labels, nil), + TxBytesR: prometheus.NewDesc(ns+"tx_bytes_rate", "TxBytesR", labels, nil), + RxBytesR: prometheus.NewDesc(ns+"rx_bytes_rate", "RxBytesR", labels, nil), + NumAp: prometheus.NewDesc(ns+"ap_total", "NumAp", labels, nil), + NumAdopted: prometheus.NewDesc(ns+"adopted_total", "NumAdopted", labels, nil), + NumDisabled: prometheus.NewDesc(ns+"disabled_total", "NumDisabled", labels, nil), + NumDisconnected: prometheus.NewDesc(ns+"disconnected_total", "NumDisconnected", labels, nil), + NumPending: prometheus.NewDesc(ns+"pending_total", "NumPending", labels, nil), + NumGw: prometheus.NewDesc(ns+"gw_total", "NumGw", labels, nil), + NumSw: prometheus.NewDesc(ns+"sw_total", "NumSw", labels, nil), + NumSta: prometheus.NewDesc(ns+"stations_total", "NumSta", labels, nil), + Latency: prometheus.NewDesc(ns+"latency", "Latency", labels, nil), + Drops: prometheus.NewDesc(ns+"drops_total", "Drops", labels, nil), + XputUp: prometheus.NewDesc(ns+"xput_up", "XputUp", labels, nil), + XputDown: prometheus.NewDesc(ns+"xput_down", "XputDown", labels, nil), + SpeedtestPing: prometheus.NewDesc(ns+"speedtest_ping", "SpeedtestPing", labels, nil), + RemoteUserNumActive: prometheus.NewDesc(ns+"remote_user_active_total", "RemoteUserNumActive", labels, nil), + RemoteUserNumInactive: prometheus.NewDesc(ns+"remote_user_inactive_total", "RemoteUserNumInactive", labels, nil), + RemoteUserRxBytes: prometheus.NewDesc(ns+"remote_user_rx_bytes_total", "RemoteUserRxBytes", labels, nil), + RemoteUserTxBytes: prometheus.NewDesc(ns+"remote_user_tx_bytes_total", "RemoteUserTxBytes", labels, nil), + RemoteUserRxPackets: prometheus.NewDesc(ns+"remote_user_rx_packets_total", "RemoteUserRxPackets", labels, nil), + RemoteUserTxPackets: prometheus.NewDesc(ns+"remote_user_tx_packets_total", "RemoteUserTxPackets", labels, nil), } } diff --git a/promunifi/usw.go b/promunifi/usw.go index df8ac9995..e07800b52 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -6,36 +6,36 @@ import ( ) type usw struct { - Uptime *prometheus.Desc `json:"uptime"` - Temperature *prometheus.Desc `json:"general_temperature"` - TotalMaxPower *prometheus.Desc `json:"total_max_power"` - FanLevel *prometheus.Desc `json:"fan_level"` - TotalTxBytes *prometheus.Desc `json:"total_tx_bytes"` - TotalRxBytes *prometheus.Desc `json:"total_rx_bytes"` - TotalBytes *prometheus.Desc `json:"bytes"` - NumSta *prometheus.Desc `json:"num_sta"` - UserNumSta *prometheus.Desc `json:"user-num_sta"` - GuestNumSta *prometheus.Desc `json:"guest-num_sta"` + Uptime *prometheus.Desc + Temperature *prometheus.Desc + TotalMaxPower *prometheus.Desc + FanLevel *prometheus.Desc + TotalTxBytes *prometheus.Desc + TotalRxBytes *prometheus.Desc + TotalBytes *prometheus.Desc + NumSta *prometheus.Desc + UserNumSta *prometheus.Desc + GuestNumSta *prometheus.Desc // Port data. - PoeCurrent *prometheus.Desc `json:"poe_current,omitempty"` - PoePower *prometheus.Desc `json:"poe_power,omitempty"` - PoeVoltage *prometheus.Desc `json:"poe_voltage,omitempty"` - RxBroadcast *prometheus.Desc `json:"rx_broadcast"` - RxBytes *prometheus.Desc `json:"rx_bytes"` - RxBytesR *prometheus.Desc `json:"rx_bytes-r"` - RxDropped *prometheus.Desc `json:"rx_dropped"` - RxErrors *prometheus.Desc `json:"rx_errors"` - RxMulticast *prometheus.Desc `json:"rx_multicast"` - RxPackets *prometheus.Desc `json:"rx_packets"` - Satisfaction *prometheus.Desc `json:"satisfaction,omitempty"` - Speed *prometheus.Desc `json:"speed"` - TxBroadcast *prometheus.Desc `json:"tx_broadcast"` - TxBytes *prometheus.Desc `json:"tx_bytes"` - TxBytesR *prometheus.Desc `json:"tx_bytes-r"` - TxDropped *prometheus.Desc `json:"tx_dropped"` - TxErrors *prometheus.Desc `json:"tx_errors"` - TxMulticast *prometheus.Desc `json:"tx_multicast"` - TxPackets *prometheus.Desc `json:"tx_packets"` + PoeCurrent *prometheus.Desc + PoePower *prometheus.Desc + PoeVoltage *prometheus.Desc + RxBroadcast *prometheus.Desc + RxBytes *prometheus.Desc + RxBytesR *prometheus.Desc + RxDropped *prometheus.Desc + RxErrors *prometheus.Desc + RxMulticast *prometheus.Desc + RxPackets *prometheus.Desc + Satisfaction *prometheus.Desc + Speed *prometheus.Desc + TxBroadcast *prometheus.Desc + TxBytes *prometheus.Desc + TxBytesR *prometheus.Desc + TxDropped *prometheus.Desc + TxErrors *prometheus.Desc + TxMulticast *prometheus.Desc + TxPackets *prometheus.Desc } func descUSW(ns string) *usw { @@ -52,36 +52,36 @@ func descUSW(ns string) *usw { return &usw{ // switch data - Uptime: prometheus.NewDesc(ns+"Uptime", "Uptime", labels, nil), - Temperature: prometheus.NewDesc(ns+"Temperature", "Temperature", labels, nil), - TotalMaxPower: prometheus.NewDesc(ns+"TotalMaxPower", "TotalMaxPower", labels, nil), - FanLevel: prometheus.NewDesc(ns+"FanLevel", "FanLevel", labels, nil), - TotalTxBytes: prometheus.NewDesc(ns+"TxBytes", "TxBytes", labels, nil), - TotalRxBytes: prometheus.NewDesc(ns+"RxBytes", "RxBytes", labels, nil), - TotalBytes: prometheus.NewDesc(ns+"Bytes", "Bytes", labels, nil), - NumSta: prometheus.NewDesc(ns+"NumSta", "NumSta", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"UserNumSta", "UserNumSta", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"GuestNumSta", "GuestNumSta", labels, nil), + Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), + Temperature: prometheus.NewDesc(ns+"temperature", "Temperature", labels, nil), + TotalMaxPower: prometheus.NewDesc(ns+"max_power_total", "TotalMaxPower", labels, nil), + FanLevel: prometheus.NewDesc(ns+"fan_level", "FanLevel", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "TxBytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "RxBytes", labels, nil), + TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Bytes", labels, nil), + NumSta: prometheus.NewDesc(ns+"stations_total", "NumSta", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "UserNumSta", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"stations_guest_total", "GuestNumSta", labels, nil), // per-port data - PoeCurrent: prometheus.NewDesc(pns+"PoeCurrent", "PoeCurrent", labelP, nil), - PoePower: prometheus.NewDesc(pns+"PoePower", "PoePower", labelP, nil), - PoeVoltage: prometheus.NewDesc(pns+"PoeVoltage", "PoeVoltage", labelP, nil), - RxBroadcast: prometheus.NewDesc(pns+"RxBroadcast", "RxBroadcast", labelP, nil), - RxBytes: prometheus.NewDesc(pns+"RxBytes", "RxBytes", labelP, nil), - RxBytesR: prometheus.NewDesc(pns+"RxBytesR", "RxBytesR", labelP, nil), - RxDropped: prometheus.NewDesc(pns+"RxDropped", "RxDropped", labelP, nil), - RxErrors: prometheus.NewDesc(pns+"RxErrors", "RxErrors", labelP, nil), - RxMulticast: prometheus.NewDesc(pns+"RxMulticast", "RxMulticast", labelP, nil), - RxPackets: prometheus.NewDesc(pns+"RxPackets", "RxPackets", labelP, nil), - Satisfaction: prometheus.NewDesc(pns+"Satisfaction", "Satisfaction", labelP, nil), - Speed: prometheus.NewDesc(pns+"Speed", "Speed", labelP, nil), - TxBroadcast: prometheus.NewDesc(pns+"TxBroadcast", "TxBroadcast", labelP, nil), - TxBytes: prometheus.NewDesc(pns+"TxBytes", "TxBytes", labelP, nil), - TxBytesR: prometheus.NewDesc(pns+"TxBytesR", "TxBytesR", labelP, nil), - TxDropped: prometheus.NewDesc(pns+"TxDropped", "TxDropped", labelP, nil), - TxErrors: prometheus.NewDesc(pns+"TxErrors", "TxErrors", labelP, nil), - TxMulticast: prometheus.NewDesc(pns+"TxMulticast", "TxMulticast", labelP, nil), - TxPackets: prometheus.NewDesc(pns+"TxPackets", "TxPackets", labelP, nil), + PoeCurrent: prometheus.NewDesc(pns+"poe_current", "PoeCurrent", labelP, nil), + PoePower: prometheus.NewDesc(pns+"poe_power", "PoePower", labelP, nil), + PoeVoltage: prometheus.NewDesc(pns+"poe_voltage", "PoeVoltage", labelP, nil), + RxBroadcast: prometheus.NewDesc(pns+"rx_broadcast_total", "RxBroadcast", labelP, nil), + RxBytes: prometheus.NewDesc(pns+"rx_bytes_total", "RxBytes", labelP, nil), + RxBytesR: prometheus.NewDesc(pns+"rx_bytes_rate", "RxBytesR", labelP, nil), + RxDropped: prometheus.NewDesc(pns+"rx_dropped_total", "RxDropped", labelP, nil), + RxErrors: prometheus.NewDesc(pns+"rx_errors_total", "RxErrors", labelP, nil), + RxMulticast: prometheus.NewDesc(pns+"rx_multicast_total", "RxMulticast", labelP, nil), + RxPackets: prometheus.NewDesc(pns+"rx_packets_total", "RxPackets", labelP, nil), + Satisfaction: prometheus.NewDesc(pns+"satisfaction", "Satisfaction", labelP, nil), + Speed: prometheus.NewDesc(pns+"speed", "Speed", labelP, nil), + TxBroadcast: prometheus.NewDesc(pns+"tx_broadcast_total", "TxBroadcast", labelP, nil), + TxBytes: prometheus.NewDesc(pns+"tx_bytes_total", "TxBytes", labelP, nil), + TxBytesR: prometheus.NewDesc(pns+"tx_bytes_rate", "TxBytesR", labelP, nil), + TxDropped: prometheus.NewDesc(pns+"tx_dropped_total", "TxDropped", labelP, nil), + TxErrors: prometheus.NewDesc(pns+"tx_errors_total", "TxErrors", labelP, nil), + TxMulticast: prometheus.NewDesc(pns+"tx_multicast_total", "TxMulticast", labelP, nil), + TxPackets: prometheus.NewDesc(pns+"tx_packets_total", "TxPackets", labelP, nil), } } From 647618e41a67757d72d2fc96f22aaf2ee3f3c1ce Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 18:13:35 -0800 Subject: [PATCH 20/85] missed one --- poller/start.go | 1 - 1 file changed, 1 deletion(-) diff --git a/poller/start.go b/poller/start.go index 8acfe85bc..931f40f12 100644 --- a/poller/start.go +++ b/poller/start.go @@ -104,7 +104,6 @@ func (u *UnifiPoller) Run() (err error) { Namespace: defaultNamespace, // XXX: pass this in from config. CollectFn: u.ExportMetrics, LoggingFn: u.LogExportReport, - CollectIDS: u.Config.CollectIDS, ReportErrors: true, // XXX: Does this need to be configurable? })) return http.ListenAndServe(u.Config.HTTPListen, nil) From 39c421d9ab4caa92fb45346ba8d124a3fb95d879 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 18:21:30 -0800 Subject: [PATCH 21/85] a few more fixes --- promunifi/clients.go | 4 ++-- promunifi/site.go | 44 ++++++++++++++++++++++---------------------- 2 files changed, 24 insertions(+), 24 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index b0f4065a0..4743118a9 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -57,12 +57,12 @@ func descClient(ns string) *client { RSSI: prometheus.NewDesc(ns+"rssi", "Client RSSI", labels, nil), RxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "Client Receive Bytes", labels, nil), RxBytesR: prometheus.NewDesc(ns+"rx_bytes_rate", "Client Receive Data Rate", labels, nil), - RxPackets: prometheus.NewDesc(ns+"rx_packets", "Client Receive Packets", labels, nil), + RxPackets: prometheus.NewDesc(ns+"rx_packets_total", "Client Receive Packets", labels, nil), RxRate: prometheus.NewDesc(ns+"rx_rate", "Client Receive Rate", labels, nil), Signal: prometheus.NewDesc(ns+"signal", "Client Signal Strength", labels, nil), TxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "Client Transmit Bytes", labels, nil), TxBytesR: prometheus.NewDesc(ns+"tx_bytes_rate", "Client Transmit Data Rate", labels, nil), - TxPackets: prometheus.NewDesc(ns+"tx_packets", "Client Transmit Packets", labels, nil), + TxPackets: prometheus.NewDesc(ns+"tx_packets_total", "Client Transmit Packets", labels, nil), TxPower: prometheus.NewDesc(ns+"tx_power", "Client Transmit Power", labels, nil), TxRate: prometheus.NewDesc(ns+"tx_rate", "Client Transmit Rate", labels, nil), Uptime: prometheus.NewDesc(ns+"uptime", "Client Uptime", labels, nil), diff --git a/promunifi/site.go b/promunifi/site.go index 78719d098..5186cf91c 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -41,30 +41,30 @@ func descSite(ns string) *site { labels := []string{"name", "desc", "site_name", "subsystem", "status", "gwversion"} return &site{ - NumUser: prometheus.NewDesc(ns+"user_total", "NumUser", labels, nil), - NumGuest: prometheus.NewDesc(ns+"guest_total", "NumGuest", labels, nil), - NumIot: prometheus.NewDesc(ns+"iot_total", "NumIot", labels, nil), - TxBytesR: prometheus.NewDesc(ns+"tx_bytes_rate", "TxBytesR", labels, nil), - RxBytesR: prometheus.NewDesc(ns+"rx_bytes_rate", "RxBytesR", labels, nil), - NumAp: prometheus.NewDesc(ns+"ap_total", "NumAp", labels, nil), - NumAdopted: prometheus.NewDesc(ns+"adopted_total", "NumAdopted", labels, nil), - NumDisabled: prometheus.NewDesc(ns+"disabled_total", "NumDisabled", labels, nil), - NumDisconnected: prometheus.NewDesc(ns+"disconnected_total", "NumDisconnected", labels, nil), - NumPending: prometheus.NewDesc(ns+"pending_total", "NumPending", labels, nil), - NumGw: prometheus.NewDesc(ns+"gw_total", "NumGw", labels, nil), - NumSw: prometheus.NewDesc(ns+"sw_total", "NumSw", labels, nil), - NumSta: prometheus.NewDesc(ns+"stations_total", "NumSta", labels, nil), + NumUser: prometheus.NewDesc(ns+"user_total", "Number of Users", labels, nil), + NumGuest: prometheus.NewDesc(ns+"guest_total", "Number of Guests", labels, nil), + NumIot: prometheus.NewDesc(ns+"iot_total", "Number of IoT Devices", labels, nil), + TxBytesR: prometheus.NewDesc(ns+"tx_bytes_rate", "Bytes Transmit Rate", labels, nil), + RxBytesR: prometheus.NewDesc(ns+"rx_bytes_rate", "Bytes Receive Rate", labels, nil), + NumAp: prometheus.NewDesc(ns+"ap_total", "Access Point Count", labels, nil), + NumAdopted: prometheus.NewDesc(ns+"adopted_total", "Adoption Count", labels, nil), + NumDisabled: prometheus.NewDesc(ns+"disabled_total", "Disabled Count", labels, nil), + NumDisconnected: prometheus.NewDesc(ns+"disconnected_total", "Disconnected Count", labels, nil), + NumPending: prometheus.NewDesc(ns+"pending_total", "Pending Count", labels, nil), + NumGw: prometheus.NewDesc(ns+"gateways_total", "Gateway Count", labels, nil), + NumSw: prometheus.NewDesc(ns+"switches_total", "Switch Count", labels, nil), + NumSta: prometheus.NewDesc(ns+"stations_total", "Station Count", labels, nil), Latency: prometheus.NewDesc(ns+"latency", "Latency", labels, nil), Drops: prometheus.NewDesc(ns+"drops_total", "Drops", labels, nil), - XputUp: prometheus.NewDesc(ns+"xput_up", "XputUp", labels, nil), - XputDown: prometheus.NewDesc(ns+"xput_down", "XputDown", labels, nil), - SpeedtestPing: prometheus.NewDesc(ns+"speedtest_ping", "SpeedtestPing", labels, nil), - RemoteUserNumActive: prometheus.NewDesc(ns+"remote_user_active_total", "RemoteUserNumActive", labels, nil), - RemoteUserNumInactive: prometheus.NewDesc(ns+"remote_user_inactive_total", "RemoteUserNumInactive", labels, nil), - RemoteUserRxBytes: prometheus.NewDesc(ns+"remote_user_rx_bytes_total", "RemoteUserRxBytes", labels, nil), - RemoteUserTxBytes: prometheus.NewDesc(ns+"remote_user_tx_bytes_total", "RemoteUserTxBytes", labels, nil), - RemoteUserRxPackets: prometheus.NewDesc(ns+"remote_user_rx_packets_total", "RemoteUserRxPackets", labels, nil), - RemoteUserTxPackets: prometheus.NewDesc(ns+"remote_user_tx_packets_total", "RemoteUserTxPackets", labels, nil), + XputUp: prometheus.NewDesc(ns+"xput_up_rate", "Speedtest Upload", labels, nil), + XputDown: prometheus.NewDesc(ns+"xput_down_rate", "Speedtest Download", labels, nil), + SpeedtestPing: prometheus.NewDesc(ns+"speedtest_ping", "Speedtest Ping", labels, nil), + RemoteUserNumActive: prometheus.NewDesc(ns+"remote_user_active_total", "Remote Users Active", labels, nil), + RemoteUserNumInactive: prometheus.NewDesc(ns+"remote_user_inactive_total", "Remote Users Inactive", labels, nil), + RemoteUserRxBytes: prometheus.NewDesc(ns+"remote_user_rx_bytes_total", "Remote Users Receive Bytes", labels, nil), + RemoteUserTxBytes: prometheus.NewDesc(ns+"remote_user_tx_bytes_total", "Remote Users Transmit Bytes", labels, nil), + RemoteUserRxPackets: prometheus.NewDesc(ns+"remote_user_rx_packets_total", "Remote Users Receive Packets", labels, nil), + RemoteUserTxPackets: prometheus.NewDesc(ns+"remote_user_tx_packets_total", "Remote Users Transmit Packets", labels, nil), } } From 1775f6e804319f6fcf19ee0cec0b22b4d00428d6 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 18:24:26 -0800 Subject: [PATCH 22/85] and some more desciprion fixes --- promunifi/usw.go | 50 ++++++++++++++++++++++++------------------------ 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/promunifi/usw.go b/promunifi/usw.go index e07800b52..bceb3150d 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -54,34 +54,34 @@ func descUSW(ns string) *usw { // switch data Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), Temperature: prometheus.NewDesc(ns+"temperature", "Temperature", labels, nil), - TotalMaxPower: prometheus.NewDesc(ns+"max_power_total", "TotalMaxPower", labels, nil), - FanLevel: prometheus.NewDesc(ns+"fan_level", "FanLevel", labels, nil), - TotalTxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "TxBytes", labels, nil), - TotalRxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "RxBytes", labels, nil), - TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Bytes", labels, nil), - NumSta: prometheus.NewDesc(ns+"stations_total", "NumSta", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "UserNumSta", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"stations_guest_total", "GuestNumSta", labels, nil), + TotalMaxPower: prometheus.NewDesc(ns+"max_power_total", "Total Max Power", labels, nil), + FanLevel: prometheus.NewDesc(ns+"fan_level", "Fan Level", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "Transmit Bytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "Receive Bytes", labels, nil), + TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes", labels, nil), + NumSta: prometheus.NewDesc(ns+"stations_total", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"stations_guest_total", "Number of Guest Stations", labels, nil), // per-port data - PoeCurrent: prometheus.NewDesc(pns+"poe_current", "PoeCurrent", labelP, nil), - PoePower: prometheus.NewDesc(pns+"poe_power", "PoePower", labelP, nil), - PoeVoltage: prometheus.NewDesc(pns+"poe_voltage", "PoeVoltage", labelP, nil), - RxBroadcast: prometheus.NewDesc(pns+"rx_broadcast_total", "RxBroadcast", labelP, nil), - RxBytes: prometheus.NewDesc(pns+"rx_bytes_total", "RxBytes", labelP, nil), - RxBytesR: prometheus.NewDesc(pns+"rx_bytes_rate", "RxBytesR", labelP, nil), - RxDropped: prometheus.NewDesc(pns+"rx_dropped_total", "RxDropped", labelP, nil), - RxErrors: prometheus.NewDesc(pns+"rx_errors_total", "RxErrors", labelP, nil), - RxMulticast: prometheus.NewDesc(pns+"rx_multicast_total", "RxMulticast", labelP, nil), - RxPackets: prometheus.NewDesc(pns+"rx_packets_total", "RxPackets", labelP, nil), + PoeCurrent: prometheus.NewDesc(pns+"poe_current", "POE Current", labelP, nil), + PoePower: prometheus.NewDesc(pns+"poe_power", "POE Power", labelP, nil), + PoeVoltage: prometheus.NewDesc(pns+"poe_voltage", "POE Voltage", labelP, nil), + RxBroadcast: prometheus.NewDesc(pns+"rx_broadcast_total", "Receive Broadcast", labelP, nil), + RxBytes: prometheus.NewDesc(pns+"rx_bytes_total", "Total Receive Bytes", labelP, nil), + RxBytesR: prometheus.NewDesc(pns+"rx_bytes_rate", "Receive Bytes Rate", labelP, nil), + RxDropped: prometheus.NewDesc(pns+"rx_dropped_total", "Total Receive Dropped", labelP, nil), + RxErrors: prometheus.NewDesc(pns+"rx_errors_total", "Total Receive Errors", labelP, nil), + RxMulticast: prometheus.NewDesc(pns+"rx_multicast_total", "Total Receive Multicast", labelP, nil), + RxPackets: prometheus.NewDesc(pns+"rx_packets_total", "Total Receive Packets", labelP, nil), Satisfaction: prometheus.NewDesc(pns+"satisfaction", "Satisfaction", labelP, nil), Speed: prometheus.NewDesc(pns+"speed", "Speed", labelP, nil), - TxBroadcast: prometheus.NewDesc(pns+"tx_broadcast_total", "TxBroadcast", labelP, nil), - TxBytes: prometheus.NewDesc(pns+"tx_bytes_total", "TxBytes", labelP, nil), - TxBytesR: prometheus.NewDesc(pns+"tx_bytes_rate", "TxBytesR", labelP, nil), - TxDropped: prometheus.NewDesc(pns+"tx_dropped_total", "TxDropped", labelP, nil), - TxErrors: prometheus.NewDesc(pns+"tx_errors_total", "TxErrors", labelP, nil), - TxMulticast: prometheus.NewDesc(pns+"tx_multicast_total", "TxMulticast", labelP, nil), - TxPackets: prometheus.NewDesc(pns+"tx_packets_total", "TxPackets", labelP, nil), + TxBroadcast: prometheus.NewDesc(pns+"tx_broadcast_total", "Total Transmit Broadcast", labelP, nil), + TxBytes: prometheus.NewDesc(pns+"tx_bytes_total", "Total Transmit Bytes", labelP, nil), + TxBytesR: prometheus.NewDesc(pns+"tx_bytes_rate", "Transmit Bytes Rate", labelP, nil), + TxDropped: prometheus.NewDesc(pns+"tx_dropped_total", "Total Transmit Dropped", labelP, nil), + TxErrors: prometheus.NewDesc(pns+"tx_errors_total", "Total Transmit Errors", labelP, nil), + TxMulticast: prometheus.NewDesc(pns+"tx_multicast_total", "Total Tranmist Multicast", labelP, nil), + TxPackets: prometheus.NewDesc(pns+"tx_packets_total", "Total Transmit Packets", labelP, nil), } } From 4a7366966237feed9d8e5c98e78e38d8d00ca87e Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 20:35:20 -0800 Subject: [PATCH 23/85] add switch sys stats --- promunifi/usw.go | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+) diff --git a/promunifi/usw.go b/promunifi/usw.go index bceb3150d..45b5c8228 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -16,6 +16,15 @@ type usw struct { NumSta *prometheus.Desc UserNumSta *prometheus.Desc GuestNumSta *prometheus.Desc + // System Stats + Loadavg1 *prometheus.Desc + Loadavg5 *prometheus.Desc + Loadavg15 *prometheus.Desc + MemBuffer *prometheus.Desc + MemTotal *prometheus.Desc + MemUsed *prometheus.Desc + CPU *prometheus.Desc + Mem *prometheus.Desc // Port data. PoeCurrent *prometheus.Desc PoePower *prometheus.Desc @@ -62,6 +71,14 @@ func descUSW(ns string) *usw { NumSta: prometheus.NewDesc(ns+"stations_total", "Number of Stations", labels, nil), UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "Number of User Stations", labels, nil), GuestNumSta: prometheus.NewDesc(ns+"stations_guest_total", "Number of Guest Stations", labels, nil), + Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), + Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), + Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), + MemUsed: prometheus.NewDesc(ns+"memory_used", "System Memory Used", labels, nil), + MemTotal: prometheus.NewDesc(ns+"memory_installed", "System Installed Memory", labels, nil), + MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), + CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), + Mem: prometheus.NewDesc(ns+"memory", "System Memory % Utilized", labels, nil), // this may not be right. // per-port data PoeCurrent: prometheus.NewDesc(pns+"poe_current", "POE Current", labelP, nil), PoePower: prometheus.NewDesc(pns+"poe_power", "POE Power", labelP, nil), @@ -102,6 +119,14 @@ func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { {u.USW.NumSta, prometheus.GaugeValue, s.NumSta, labels}, {u.USW.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, {u.USW.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, + {u.USW.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, + {u.USW.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, + {u.USW.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, + {u.USW.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, + {u.USW.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, + {u.USW.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, + {u.USW.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, + {u.USW.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, } // Per-port data on the switch From 39c6fdc472b829cc11c85a63900b6b1f4fdce24f Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Sun, 17 Nov 2019 21:43:47 -0800 Subject: [PATCH 24/85] add usg exports --- promunifi/usg.go | 153 ++++++++++++++++++++++++++++++++++++++++++++++- promunifi/usw.go | 8 +-- 2 files changed, 155 insertions(+), 6 deletions(-) diff --git a/promunifi/usg.go b/promunifi/usg.go index edda70ee7..e756281da 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -1,17 +1,166 @@ package promunifi import ( + "github.com/prometheus/client_golang/prometheus" "golift.io/unifi" ) type usg struct { + Uptime *prometheus.Desc + Temperature *prometheus.Desc + TotalMaxPower *prometheus.Desc + FanLevel *prometheus.Desc + TotalTxBytes *prometheus.Desc + TotalRxBytes *prometheus.Desc + TotalBytes *prometheus.Desc + NumSta *prometheus.Desc + UserNumSta *prometheus.Desc + GuestNumSta *prometheus.Desc + NumDesktop *prometheus.Desc + NumMobile *prometheus.Desc + NumHandheld *prometheus.Desc + Loadavg1 *prometheus.Desc + Loadavg5 *prometheus.Desc + Loadavg15 *prometheus.Desc + MemBuffer *prometheus.Desc + MemTotal *prometheus.Desc + MemUsed *prometheus.Desc + CPU *prometheus.Desc + Mem *prometheus.Desc + WanRxPackets *prometheus.Desc + WanRxBytes *prometheus.Desc + WanRxDropped *prometheus.Desc + WanRxErrors *prometheus.Desc + WanTxPackets *prometheus.Desc + WanTxBytes *prometheus.Desc + LanRxPackets *prometheus.Desc + LanRxBytes *prometheus.Desc + LanRxDropped *prometheus.Desc + LanTxPackets *prometheus.Desc + LanTxBytes *prometheus.Desc + WanRxBroadcast *prometheus.Desc + WanRxBytesR *prometheus.Desc + WanRxMulticast *prometheus.Desc + WanSpeed *prometheus.Desc + WanTxBroadcast *prometheus.Desc + WanTxBytesR *prometheus.Desc + WanTxDropped *prometheus.Desc + WanTxErrors *prometheus.Desc + WanTxMulticast *prometheus.Desc } func descUSG(ns string) *usg { - return &usg{} + if ns += "_usg_"; ns == "_usg_" { + ns = "usg_" + } + labels := []string{"site_name", "mac", "model", "name", "serial", "site_id", + "type", "version", "device_id", "oid"} + labelWan := append([]string{"port"}, labels...) + + return &usg{ + Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "Total Transmitted Bytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "Total Received Bytes", labels, nil), + TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transfered", labels, nil), + NumSta: prometheus.NewDesc(ns+"stations_total", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"stations_guest_total", "Number of Guest Stations", labels, nil), + NumDesktop: prometheus.NewDesc(ns+"desktops_total", "Number of Desktops", labels, nil), + NumMobile: prometheus.NewDesc(ns+"mobile_total", "Number of Mobiles", labels, nil), + NumHandheld: prometheus.NewDesc(ns+"handheld_total", "Number of Handhelds", labels, nil), + Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), + Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), + Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), + MemUsed: prometheus.NewDesc(ns+"memory_used", "System Memory Used", labels, nil), + MemTotal: prometheus.NewDesc(ns+"memory_installed", "System Installed Memory", labels, nil), + MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), + CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), + Mem: prometheus.NewDesc(ns+"memory", "System Memory % Utilized", labels, nil), // this may not be %. + WanRxPackets: prometheus.NewDesc(ns+"wan_rx_packets_total", "WAN Receive Packets Total", labelWan, nil), + WanRxBytes: prometheus.NewDesc(ns+"wan_rx_bytes_total", "WAN Receive Bytes Total", labelWan, nil), + WanRxDropped: prometheus.NewDesc(ns+"wan_rx_dropped_total", "WAN Receive Dropped Total", labelWan, nil), + WanRxErrors: prometheus.NewDesc(ns+"wan_rx_errors_total", "WAN Receive Errors Total", labelWan, nil), + WanTxPackets: prometheus.NewDesc(ns+"wan_tx_packets_total", "WAN Transmit Packets Total", labelWan, nil), + WanTxBytes: prometheus.NewDesc(ns+"wan_tx_bytes_total", "WAN Transmit Bytes Total", labelWan, nil), + WanRxBroadcast: prometheus.NewDesc(ns+"wan_rx_broadcast_total", "WAN Receive Broadcast Total", labelWan, nil), + WanRxBytesR: prometheus.NewDesc(ns+"wan_rx_bytes_rate", "WAN Receive Bytes Rate", labelWan, nil), + WanRxMulticast: prometheus.NewDesc(ns+"wan_rx_multicast_total", "WAN Receive Multicast Total", labelWan, nil), + WanSpeed: prometheus.NewDesc(ns+"wan_speed", "WAN Speed", labelWan, nil), + WanTxBroadcast: prometheus.NewDesc(ns+"wan_tx_broadcast_total", "WAN Transmit Broadcast Total", labelWan, nil), + WanTxBytesR: prometheus.NewDesc(ns+"wan_tx_bytes_rate", "WAN Transmit Bytes Rate", labelWan, nil), + WanTxDropped: prometheus.NewDesc(ns+"wan_tx_dropped_total", "WAN Transmit Dropped Total", labelWan, nil), + WanTxErrors: prometheus.NewDesc(ns+"wan_tx_errors_total", "WAN Transmit Errors Total", labelWan, nil), + WanTxMulticast: prometheus.NewDesc(ns+"wan_tx_multicast_total", "WAN Transmit Multicast Total", labelWan, nil), + LanRxPackets: prometheus.NewDesc(ns+"lan_rx_packets_total", "LAN Receive Packets Total", labels, nil), + LanRxBytes: prometheus.NewDesc(ns+"lan_rx_bytes_total", "LAN Receive Bytes Total", labels, nil), + LanRxDropped: prometheus.NewDesc(ns+"lan_rx_dropped_total", "LAN Receive Dropped Total", labels, nil), + LanTxPackets: prometheus.NewDesc(ns+"lan_tx_packets_total", "LAN Transmit Packets Total", labels, nil), + LanTxBytes: prometheus.NewDesc(ns+"lan_tx_bytes_total", "LAN Transmit Bytes Total", labels, nil), + } } // exportUSG Exports Security Gateway Data +// uplink and port tables structs are ignored. that data should be in other exported fields. func (u *unifiCollector) exportUSG(s *unifi.USG) []*metricExports { - return nil + labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID, + s.Type, s.Version, s.DeviceID, s.Stat.Gw.Oid} + labelWan := append([]string{"all"}, labels...) + + // Gateway System Data. + m := []*metricExports{ + {u.USG.Uptime, prometheus.GaugeValue, s.Uptime, labels}, + {u.USG.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, + {u.USG.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, + {u.USG.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, + {u.USG.NumSta, prometheus.GaugeValue, s.NumSta, labels}, + {u.USG.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, + {u.USG.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, + {u.USG.NumDesktop, prometheus.CounterValue, s.NumDesktop, labels}, + {u.USG.NumMobile, prometheus.CounterValue, s.NumMobile, labels}, + {u.USG.NumHandheld, prometheus.CounterValue, s.NumHandheld, labels}, + {u.USG.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, + {u.USG.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, + {u.USG.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, + {u.USG.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, + {u.USG.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, + {u.USG.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, + {u.USG.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, + {u.USG.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + {u.USG.WanRxPackets, prometheus.CounterValue, s.Stat.Gw.WanRxPackets, labelWan}, + {u.USG.WanRxBytes, prometheus.CounterValue, s.Stat.Gw.WanRxBytes, labelWan}, + {u.USG.WanRxDropped, prometheus.CounterValue, s.Stat.Gw.WanRxDropped, labelWan}, + {u.USG.WanTxPackets, prometheus.CounterValue, s.Stat.Gw.WanTxPackets, labelWan}, + {u.USG.WanTxBytes, prometheus.CounterValue, s.Stat.Gw.WanTxBytes, labelWan}, + {u.USG.WanRxErrors, prometheus.CounterValue, s.Stat.Gw.WanRxErrors, labelWan}, + {u.USG.LanRxPackets, prometheus.CounterValue, s.Stat.Gw.LanRxPackets, labels}, + {u.USG.LanRxBytes, prometheus.CounterValue, s.Stat.Gw.LanRxBytes, labels}, + {u.USG.LanTxPackets, prometheus.CounterValue, s.Stat.Gw.LanTxPackets, labels}, + {u.USG.LanTxBytes, prometheus.CounterValue, s.Stat.Gw.LanTxBytes, labels}, + {u.USG.LanRxDropped, prometheus.CounterValue, s.Stat.Gw.LanRxDropped, labels}, + // speed test status in a struct too, get that. + } + + for _, j := range []unifi.Wan{s.Wan1, s.Wan2} { + if !j.Up.Val { + continue // only record UP interfaces. + } + labelWan := append([]string{j.Name}, labels...) + m = append(m, []*metricExports{ + {u.USG.WanRxPackets, prometheus.CounterValue, j.RxPackets, labelWan}, + {u.USG.WanRxBytes, prometheus.CounterValue, j.RxBytes, labelWan}, + {u.USG.WanRxDropped, prometheus.CounterValue, j.RxDropped, labelWan}, + {u.USG.WanRxErrors, prometheus.CounterValue, j.RxErrors, labelWan}, + {u.USG.WanTxPackets, prometheus.CounterValue, j.TxPackets, labelWan}, + {u.USG.WanTxBytes, prometheus.CounterValue, j.TxBytes, labelWan}, + {u.USG.WanRxBroadcast, prometheus.CounterValue, j.RxBroadcast, labelWan}, + {u.USG.WanRxMulticast, prometheus.CounterValue, j.RxMulticast, labelWan}, + {u.USG.WanSpeed, prometheus.CounterValue, j.Speed, labelWan}, + {u.USG.WanTxBroadcast, prometheus.CounterValue, j.TxBroadcast, labelWan}, + {u.USG.WanTxBytesR, prometheus.CounterValue, j.TxBytesR, labelWan}, + {u.USG.WanTxDropped, prometheus.CounterValue, j.TxDropped, labelWan}, + {u.USG.WanTxErrors, prometheus.CounterValue, j.TxErrors, labelWan}, + {u.USG.WanTxMulticast, prometheus.CounterValue, j.TxMulticast, labelWan}, + }...) + } + return m } diff --git a/promunifi/usw.go b/promunifi/usw.go index 45b5c8228..892cfba0f 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -65,9 +65,9 @@ func descUSW(ns string) *usw { Temperature: prometheus.NewDesc(ns+"temperature", "Temperature", labels, nil), TotalMaxPower: prometheus.NewDesc(ns+"max_power_total", "Total Max Power", labels, nil), FanLevel: prometheus.NewDesc(ns+"fan_level", "Fan Level", labels, nil), - TotalTxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "Transmit Bytes", labels, nil), - TotalRxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "Receive Bytes", labels, nil), - TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "Total Transmitted Bytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "Total Received Bytes", labels, nil), + TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transfered", labels, nil), NumSta: prometheus.NewDesc(ns+"stations_total", "Number of Stations", labels, nil), UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "Number of User Stations", labels, nil), GuestNumSta: prometheus.NewDesc(ns+"stations_guest_total", "Number of Guest Stations", labels, nil), @@ -78,7 +78,7 @@ func descUSW(ns string) *usw { MemTotal: prometheus.NewDesc(ns+"memory_installed", "System Installed Memory", labels, nil), MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), - Mem: prometheus.NewDesc(ns+"memory", "System Memory % Utilized", labels, nil), // this may not be right. + Mem: prometheus.NewDesc(ns+"memory", "System Memory % Utilized", labels, nil), // this may not be %. // per-port data PoeCurrent: prometheus.NewDesc(pns+"poe_current", "POE Current", labelP, nil), PoePower: prometheus.NewDesc(pns+"poe_power", "POE Power", labelP, nil), From 6016c74a993d33bf801461b7b4c502d40064a2c7 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 18 Nov 2019 00:01:33 -0800 Subject: [PATCH 25/85] less appendage --- promunifi/site.go | 52 +++++++++++++++++++++++++---------------------- promunifi/usg.go | 43 ++++++++++++++++++++++----------------- promunifi/usw.go | 41 +++++++++++++++++++------------------ 3 files changed, 73 insertions(+), 63 deletions(-) diff --git a/promunifi/site.go b/promunifi/site.go index 5186cf91c..f3364616c 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -74,31 +74,35 @@ func (u *unifiCollector) exportSite(s *unifi.Site) []*metricExports { var m []*metricExports for _, h := range s.Health { l := append(labels, h.Subsystem, h.Status, h.GwVersion) - m = append(m, &metricExports{u.Site.NumUser, prometheus.CounterValue, h.NumUser.Val, l}) - m = append(m, &metricExports{u.Site.NumGuest, prometheus.CounterValue, h.NumGuest.Val, l}) - m = append(m, &metricExports{u.Site.NumIot, prometheus.CounterValue, h.NumIot.Val, l}) - m = append(m, &metricExports{u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR.Val, l}) - m = append(m, &metricExports{u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR.Val, l}) - m = append(m, &metricExports{u.Site.NumAp, prometheus.CounterValue, h.NumAp.Val, l}) - m = append(m, &metricExports{u.Site.NumAdopted, prometheus.CounterValue, h.NumAdopted.Val, l}) - m = append(m, &metricExports{u.Site.NumDisabled, prometheus.CounterValue, h.NumDisabled.Val, l}) - m = append(m, &metricExports{u.Site.NumDisconnected, prometheus.CounterValue, h.NumDisconnected.Val, l}) - m = append(m, &metricExports{u.Site.NumPending, prometheus.CounterValue, h.NumPending.Val, l}) - m = append(m, &metricExports{u.Site.NumGw, prometheus.CounterValue, h.NumGw.Val, l}) - m = append(m, &metricExports{u.Site.NumSw, prometheus.CounterValue, h.NumSw.Val, l}) - m = append(m, &metricExports{u.Site.NumSta, prometheus.CounterValue, h.NumSta.Val, l}) - m = append(m, &metricExports{u.Site.Latency, prometheus.GaugeValue, h.Latency.Val, l}) - m = append(m, &metricExports{u.Site.Drops, prometheus.CounterValue, h.Drops.Val, l}) - m = append(m, &metricExports{u.Site.XputUp, prometheus.GaugeValue, h.XputUp.Val, l}) - m = append(m, &metricExports{u.Site.XputDown, prometheus.GaugeValue, h.XputDown.Val, l}) - m = append(m, &metricExports{u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing.Val, l}) + m = append(m, []*metricExports{ + {u.Site.NumUser, prometheus.CounterValue, h.NumUser.Val, l}, + {u.Site.NumGuest, prometheus.CounterValue, h.NumGuest.Val, l}, + {u.Site.NumIot, prometheus.CounterValue, h.NumIot.Val, l}, + {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR.Val, l}, + {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR.Val, l}, + {u.Site.NumAp, prometheus.CounterValue, h.NumAp.Val, l}, + {u.Site.NumAdopted, prometheus.CounterValue, h.NumAdopted.Val, l}, + {u.Site.NumDisabled, prometheus.CounterValue, h.NumDisabled.Val, l}, + {u.Site.NumDisconnected, prometheus.CounterValue, h.NumDisconnected.Val, l}, + {u.Site.NumPending, prometheus.CounterValue, h.NumPending.Val, l}, + {u.Site.NumGw, prometheus.CounterValue, h.NumGw.Val, l}, + {u.Site.NumSw, prometheus.CounterValue, h.NumSw.Val, l}, + {u.Site.NumSta, prometheus.CounterValue, h.NumSta.Val, l}, + {u.Site.Latency, prometheus.GaugeValue, h.Latency.Val, l}, + {u.Site.Drops, prometheus.CounterValue, h.Drops.Val, l}, + {u.Site.XputUp, prometheus.GaugeValue, h.XputUp.Val, l}, + {u.Site.XputDown, prometheus.GaugeValue, h.XputDown.Val, l}, + {u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing.Val, l}, + }...) if h.Subsystem == "vpn" { - m = append(m, &metricExports{u.Site.RemoteUserNumActive, prometheus.CounterValue, h.RemoteUserNumActive.Val, l}) - m = append(m, &metricExports{u.Site.RemoteUserNumInactive, prometheus.CounterValue, h.RemoteUserNumInactive.Val, l}) - m = append(m, &metricExports{u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes.Val, l}) - m = append(m, &metricExports{u.Site.RemoteUserTxBytes, prometheus.CounterValue, h.RemoteUserTxBytes.Val, l}) - m = append(m, &metricExports{u.Site.RemoteUserRxPackets, prometheus.CounterValue, h.RemoteUserRxPackets.Val, l}) - m = append(m, &metricExports{u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets.Val, l}) + m = append(m, []*metricExports{ + {u.Site.RemoteUserNumActive, prometheus.CounterValue, h.RemoteUserNumActive.Val, l}, + {u.Site.RemoteUserNumInactive, prometheus.CounterValue, h.RemoteUserNumInactive.Val, l}, + {u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes.Val, l}, + {u.Site.RemoteUserTxBytes, prometheus.CounterValue, h.RemoteUserTxBytes.Val, l}, + {u.Site.RemoteUserRxPackets, prometheus.CounterValue, h.RemoteUserRxPackets.Val, l}, + {u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets.Val, l}, + }...) } } return m diff --git a/promunifi/usg.go b/promunifi/usg.go index e756281da..6e87ff0e2 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -47,6 +47,7 @@ type usg struct { WanTxDropped *prometheus.Desc WanTxErrors *prometheus.Desc WanTxMulticast *prometheus.Desc + WanBytesR *prometheus.Desc } func descUSG(ns string) *usg { @@ -75,7 +76,7 @@ func descUSG(ns string) *usg { MemTotal: prometheus.NewDesc(ns+"memory_installed", "System Installed Memory", labels, nil), MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), - Mem: prometheus.NewDesc(ns+"memory", "System Memory % Utilized", labels, nil), // this may not be %. + Mem: prometheus.NewDesc(ns+"memory_utilization", "System Memory % Utilized", labels, nil), // this may not be %. WanRxPackets: prometheus.NewDesc(ns+"wan_rx_packets_total", "WAN Receive Packets Total", labelWan, nil), WanRxBytes: prometheus.NewDesc(ns+"wan_rx_bytes_total", "WAN Receive Bytes Total", labelWan, nil), WanRxDropped: prometheus.NewDesc(ns+"wan_rx_dropped_total", "WAN Receive Dropped Total", labelWan, nil), @@ -91,6 +92,7 @@ func descUSG(ns string) *usg { WanTxDropped: prometheus.NewDesc(ns+"wan_tx_dropped_total", "WAN Transmit Dropped Total", labelWan, nil), WanTxErrors: prometheus.NewDesc(ns+"wan_tx_errors_total", "WAN Transmit Errors Total", labelWan, nil), WanTxMulticast: prometheus.NewDesc(ns+"wan_tx_multicast_total", "WAN Transmit Multicast Total", labelWan, nil), + WanBytesR: prometheus.NewDesc(ns+"wan_bytes_rate", "WAN Transfer Rate", labelWan, nil), LanRxPackets: prometheus.NewDesc(ns+"lan_rx_packets_total", "LAN Receive Packets Total", labels, nil), LanRxBytes: prometheus.NewDesc(ns+"lan_rx_bytes_total", "LAN Receive Bytes Total", labels, nil), LanRxDropped: prometheus.NewDesc(ns+"lan_rx_dropped_total", "LAN Receive Dropped Total", labels, nil), @@ -137,30 +139,33 @@ func (u *unifiCollector) exportUSG(s *unifi.USG) []*metricExports { {u.USG.LanTxPackets, prometheus.CounterValue, s.Stat.Gw.LanTxPackets, labels}, {u.USG.LanTxBytes, prometheus.CounterValue, s.Stat.Gw.LanTxBytes, labels}, {u.USG.LanRxDropped, prometheus.CounterValue, s.Stat.Gw.LanRxDropped, labels}, - // speed test status in a struct too, get that. + // speed test status in a struct too, get that? } - for _, j := range []unifi.Wan{s.Wan1, s.Wan2} { - if !j.Up.Val { + for _, wan := range []unifi.Wan{s.Wan1, s.Wan2} { + if !wan.Up.Val { continue // only record UP interfaces. } - labelWan := append([]string{j.Name}, labels...) + labelWan := append([]string{wan.Name}, labels...) + m = append(m, []*metricExports{ - {u.USG.WanRxPackets, prometheus.CounterValue, j.RxPackets, labelWan}, - {u.USG.WanRxBytes, prometheus.CounterValue, j.RxBytes, labelWan}, - {u.USG.WanRxDropped, prometheus.CounterValue, j.RxDropped, labelWan}, - {u.USG.WanRxErrors, prometheus.CounterValue, j.RxErrors, labelWan}, - {u.USG.WanTxPackets, prometheus.CounterValue, j.TxPackets, labelWan}, - {u.USG.WanTxBytes, prometheus.CounterValue, j.TxBytes, labelWan}, - {u.USG.WanRxBroadcast, prometheus.CounterValue, j.RxBroadcast, labelWan}, - {u.USG.WanRxMulticast, prometheus.CounterValue, j.RxMulticast, labelWan}, - {u.USG.WanSpeed, prometheus.CounterValue, j.Speed, labelWan}, - {u.USG.WanTxBroadcast, prometheus.CounterValue, j.TxBroadcast, labelWan}, - {u.USG.WanTxBytesR, prometheus.CounterValue, j.TxBytesR, labelWan}, - {u.USG.WanTxDropped, prometheus.CounterValue, j.TxDropped, labelWan}, - {u.USG.WanTxErrors, prometheus.CounterValue, j.TxErrors, labelWan}, - {u.USG.WanTxMulticast, prometheus.CounterValue, j.TxMulticast, labelWan}, + {u.USG.WanRxPackets, prometheus.CounterValue, wan.RxPackets, labelWan}, + {u.USG.WanRxBytes, prometheus.CounterValue, wan.RxBytes, labelWan}, + {u.USG.WanRxDropped, prometheus.CounterValue, wan.RxDropped, labelWan}, + {u.USG.WanRxErrors, prometheus.CounterValue, wan.RxErrors, labelWan}, + {u.USG.WanTxPackets, prometheus.CounterValue, wan.TxPackets, labelWan}, + {u.USG.WanTxBytes, prometheus.CounterValue, wan.TxBytes, labelWan}, + {u.USG.WanRxBroadcast, prometheus.CounterValue, wan.RxBroadcast, labelWan}, + {u.USG.WanRxMulticast, prometheus.CounterValue, wan.RxMulticast, labelWan}, + {u.USG.WanSpeed, prometheus.CounterValue, wan.Speed, labelWan}, + {u.USG.WanTxBroadcast, prometheus.CounterValue, wan.TxBroadcast, labelWan}, + {u.USG.WanTxBytesR, prometheus.CounterValue, wan.TxBytesR, labelWan}, + {u.USG.WanTxDropped, prometheus.CounterValue, wan.TxDropped, labelWan}, + {u.USG.WanTxErrors, prometheus.CounterValue, wan.TxErrors, labelWan}, + {u.USG.WanTxMulticast, prometheus.CounterValue, wan.TxMulticast, labelWan}, + {u.USG.WanBytesR, prometheus.GaugeValue, wan.BytesR, labelWan}, }...) } + return m } diff --git a/promunifi/usw.go b/promunifi/usw.go index 892cfba0f..7f6613a70 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -74,7 +74,7 @@ func descUSW(ns string) *usw { Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), - MemUsed: prometheus.NewDesc(ns+"memory_used", "System Memory Used", labels, nil), + MemUsed: prometheus.NewDesc(ns+"memory_utilization", "System Memory Used", labels, nil), MemTotal: prometheus.NewDesc(ns+"memory_installed", "System Installed Memory", labels, nil), MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), @@ -133,25 +133,26 @@ func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { for _, p := range s.PortTable { // Copy labels, and replace last four with different data. l := append(append([]string{}, labels[:6]...), p.PortIdx.Txt, p.Name, p.Mac, p.IP) - m = append(m, &metricExports{u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}) - m = append(m, &metricExports{u.USW.PoePower, prometheus.GaugeValue, p.PoePower, l}) - m = append(m, &metricExports{u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, l}) - m = append(m, &metricExports{u.USW.RxBroadcast, prometheus.CounterValue, p.RxBroadcast, l}) - m = append(m, &metricExports{u.USW.RxBytes, prometheus.CounterValue, p.RxBytes, l}) - m = append(m, &metricExports{u.USW.RxBytesR, prometheus.GaugeValue, p.RxBytesR, l}) - m = append(m, &metricExports{u.USW.RxDropped, prometheus.CounterValue, p.RxDropped, l}) - m = append(m, &metricExports{u.USW.RxErrors, prometheus.CounterValue, p.RxErrors, l}) - m = append(m, &metricExports{u.USW.RxMulticast, prometheus.CounterValue, p.RxMulticast, l}) - m = append(m, &metricExports{u.USW.RxPackets, prometheus.CounterValue, p.RxPackets, l}) - m = append(m, &metricExports{u.USW.Satisfaction, prometheus.GaugeValue, p.Satisfaction, l}) - m = append(m, &metricExports{u.USW.Speed, prometheus.GaugeValue, p.Speed, l}) - m = append(m, &metricExports{u.USW.TxBroadcast, prometheus.CounterValue, p.TxBroadcast, l}) - m = append(m, &metricExports{u.USW.TxBytes, prometheus.CounterValue, p.TxBytes, l}) - m = append(m, &metricExports{u.USW.TxBytesR, prometheus.GaugeValue, p.TxBytesR, l}) - m = append(m, &metricExports{u.USW.TxDropped, prometheus.CounterValue, p.TxDropped, l}) - m = append(m, &metricExports{u.USW.TxErrors, prometheus.CounterValue, p.TxErrors, l}) - m = append(m, &metricExports{u.USW.TxMulticast, prometheus.CounterValue, p.TxMulticast, l}) + m = append(m, []*metricExports{ + {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}, + {u.USW.PoePower, prometheus.GaugeValue, p.PoePower, l}, + {u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, l}, + {u.USW.RxBroadcast, prometheus.CounterValue, p.RxBroadcast, l}, + {u.USW.RxBytes, prometheus.CounterValue, p.RxBytes, l}, + {u.USW.RxBytesR, prometheus.GaugeValue, p.RxBytesR, l}, + {u.USW.RxDropped, prometheus.CounterValue, p.RxDropped, l}, + {u.USW.RxErrors, prometheus.CounterValue, p.RxErrors, l}, + {u.USW.RxMulticast, prometheus.CounterValue, p.RxMulticast, l}, + {u.USW.RxPackets, prometheus.CounterValue, p.RxPackets, l}, + {u.USW.Satisfaction, prometheus.GaugeValue, p.Satisfaction, l}, + {u.USW.Speed, prometheus.GaugeValue, p.Speed, l}, + {u.USW.TxBroadcast, prometheus.CounterValue, p.TxBroadcast, l}, + {u.USW.TxBytes, prometheus.CounterValue, p.TxBytes, l}, + {u.USW.TxBytesR, prometheus.GaugeValue, p.TxBytesR, l}, + {u.USW.TxDropped, prometheus.CounterValue, p.TxDropped, l}, + {u.USW.TxErrors, prometheus.CounterValue, p.TxErrors, l}, + {u.USW.TxMulticast, prometheus.CounterValue, p.TxMulticast, l}, + }...) } - return m } From ae2877cce9bcef7c7f86bde4d44f4bc8cae02946 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 18 Nov 2019 00:14:11 -0800 Subject: [PATCH 26/85] Add speed test stats to usg --- promunifi/usg.go | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/promunifi/usg.go b/promunifi/usg.go index 6e87ff0e2..634ab219f 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -48,6 +48,10 @@ type usg struct { WanTxErrors *prometheus.Desc WanTxMulticast *prometheus.Desc WanBytesR *prometheus.Desc + Latency *prometheus.Desc + Runtime *prometheus.Desc + XputDownload *prometheus.Desc + XputUpload *prometheus.Desc } func descUSG(ns string) *usg { @@ -98,6 +102,10 @@ func descUSG(ns string) *usg { LanRxDropped: prometheus.NewDesc(ns+"lan_rx_dropped_total", "LAN Receive Dropped Total", labels, nil), LanTxPackets: prometheus.NewDesc(ns+"lan_tx_packets_total", "LAN Transmit Packets Total", labels, nil), LanTxBytes: prometheus.NewDesc(ns+"lan_tx_bytes_total", "LAN Transmit Bytes Total", labels, nil), + Latency: prometheus.NewDesc(ns+"speedtest_latency", "Speedtest Latency", labels, nil), + Runtime: prometheus.NewDesc(ns+"speedtest_runtime", "Speedtest Run Time", labels, nil), + XputDownload: prometheus.NewDesc(ns+"speedtest_download_rate", "Speedtest Download Rate", labels, nil), + XputUpload: prometheus.NewDesc(ns+"speedtest_upload_rate", "Speedtest Upload Rate", labels, nil), } } @@ -128,6 +136,7 @@ func (u *unifiCollector) exportUSG(s *unifi.USG) []*metricExports { {u.USG.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, {u.USG.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, {u.USG.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + // Combined Port Stats {u.USG.WanRxPackets, prometheus.CounterValue, s.Stat.Gw.WanRxPackets, labelWan}, {u.USG.WanRxBytes, prometheus.CounterValue, s.Stat.Gw.WanRxBytes, labelWan}, {u.USG.WanRxDropped, prometheus.CounterValue, s.Stat.Gw.WanRxDropped, labelWan}, @@ -139,9 +148,14 @@ func (u *unifiCollector) exportUSG(s *unifi.USG) []*metricExports { {u.USG.LanTxPackets, prometheus.CounterValue, s.Stat.Gw.LanTxPackets, labels}, {u.USG.LanTxBytes, prometheus.CounterValue, s.Stat.Gw.LanTxBytes, labels}, {u.USG.LanRxDropped, prometheus.CounterValue, s.Stat.Gw.LanRxDropped, labels}, - // speed test status in a struct too, get that? + // Speed Test Stats + {u.USG.Latency, prometheus.GaugeValue, s.SpeedtestStatus.Latency, labels}, + {u.USG.Runtime, prometheus.GaugeValue, s.SpeedtestStatus.Runtime, labels}, + {u.USG.XputDownload, prometheus.GaugeValue, s.SpeedtestStatus.XputDownload, labels}, + {u.USG.XputUpload, prometheus.GaugeValue, s.SpeedtestStatus.XputUpload, labels}, } + // WAN Ports' Stats for _, wan := range []unifi.Wan{s.Wan1, s.Wan2} { if !wan.Up.Val { continue // only record UP interfaces. From b7918e0c21dd03b0791c3ff862313fa0073c3272 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 18 Nov 2019 01:06:25 -0800 Subject: [PATCH 27/85] Add more usw data, start uap --- promunifi/uap.go | 122 +++++++++++++++++++++++++++++++++++++++++++++-- promunifi/usg.go | 4 +- promunifi/usw.go | 73 ++++++++++++++++++++++++---- 3 files changed, 186 insertions(+), 13 deletions(-) diff --git a/promunifi/uap.go b/promunifi/uap.go index 3088f793d..581055f3d 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -1,17 +1,133 @@ package promunifi import ( + "github.com/prometheus/client_golang/prometheus" "golift.io/unifi" ) type uap struct { + Uptime *prometheus.Desc + TotalTxBytes *prometheus.Desc + TotalRxBytes *prometheus.Desc + TotalBytes *prometheus.Desc + BytesD *prometheus.Desc + TxBytesD *prometheus.Desc + RxBytesD *prometheus.Desc + BytesR *prometheus.Desc + NumSta *prometheus.Desc + UserNumSta *prometheus.Desc + GuestNumSta *prometheus.Desc + // System Stats + Loadavg1 *prometheus.Desc + Loadavg5 *prometheus.Desc + Loadavg15 *prometheus.Desc + MemBuffer *prometheus.Desc + MemTotal *prometheus.Desc + MemUsed *prometheus.Desc + CPU *prometheus.Desc + Mem *prometheus.Desc + // Ap Traffic Stats -- not sure about these yet. + ApBytes *prometheus.Desc + ApWifiTxDropped *prometheus.Desc + ApRxErrors *prometheus.Desc + ApRxDropped *prometheus.Desc + ApRxFrags *prometheus.Desc + ApRxCrypts *prometheus.Desc + ApTxPackets *prometheus.Desc + ApTxBytes *prometheus.Desc + ApTxErrors *prometheus.Desc + ApTxDropped *prometheus.Desc + ApTxRetries *prometheus.Desc + ApRxPackets *prometheus.Desc + ApRxBytes *prometheus.Desc + UserRxDropped *prometheus.Desc + GuestRxDropped *prometheus.Desc + UserRxErrors *prometheus.Desc + GuestRxErrors *prometheus.Desc + UserRxPackets *prometheus.Desc + GuestRxPackets *prometheus.Desc + UserRxBytes *prometheus.Desc + GuestRxBytes *prometheus.Desc + UserRxCrypts *prometheus.Desc + GuestRxCrypts *prometheus.Desc + UserRxFrags *prometheus.Desc + GuestRxFrags *prometheus.Desc + UserTxPackets *prometheus.Desc + GuestTxPackets *prometheus.Desc + UserTxBytes *prometheus.Desc + GuestTxBytes *prometheus.Desc + UserTxErrors *prometheus.Desc + GuestTxErrors *prometheus.Desc + UserTxDropped *prometheus.Desc + GuestTxDropped *prometheus.Desc + UserTxRetries *prometheus.Desc + GuestTxRetries *prometheus.Desc + MacFilterRejections *prometheus.Desc + UserMacFilterRejections *prometheus.Desc + GuestMacFilterRejections *prometheus.Desc + WifiTxAttempts *prometheus.Desc + UserWifiTxDropped *prometheus.Desc + GuestWifiTxDropped *prometheus.Desc + UserWifiTxAttempts *prometheus.Desc + GuestWifiTxAttempts *prometheus.Desc } func descUAP(ns string) *uap { - return &uap{} + if ns += "_uap_"; ns == "_uap_" { + ns = "uap_" + } + labels := []string{"site_name", "mac", "model", "name", "serial", "site_id", + "type", "version", "device_id", "ip"} + + return &uap{ + Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "Total Transmitted Bytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "Total Received Bytes", labels, nil), + TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transfered", labels, nil), + BytesD: prometheus.NewDesc(ns+"bytes_d_total", "Total Bytes D???", labels, nil), + TxBytesD: prometheus.NewDesc(ns+"bytes_d_tx", "Transmit Bytes D???", labels, nil), + RxBytesD: prometheus.NewDesc(ns+"bytes_d_rx", "Receive Bytes D???", labels, nil), + BytesR: prometheus.NewDesc(ns+"bytes_rate", "Transfer Rate", labels, nil), + NumSta: prometheus.NewDesc(ns+"stations_total", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"stations_guest_total", "Number of Guest Stations", labels, nil), + Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), + Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), + Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), + MemUsed: prometheus.NewDesc(ns+"memory_utilization", "System Memory Used", labels, nil), + MemTotal: prometheus.NewDesc(ns+"memory_installed", "System Installed Memory", labels, nil), + MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), + CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), + Mem: prometheus.NewDesc(ns+"memory", "System Memory % Utilized", labels, nil), + } } // exportUAP exports Access Point Data -func (u *unifiCollector) exportUAP(a *unifi.UAP) []*metricExports { - return nil +func (u *unifiCollector) exportUAP(s *unifi.UAP) []*metricExports { + labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID, + s.Type, s.Version, s.DeviceID, s.IP} + + // Switch data. + m := []*metricExports{ + {u.UAP.Uptime, prometheus.GaugeValue, s.Uptime, labels}, + {u.UAP.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, + {u.UAP.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, + {u.UAP.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, + {u.UAP.BytesD, prometheus.CounterValue, s.BytesD, labels}, // not sure if these 3 Ds are counters or gauges. + {u.UAP.TxBytesD, prometheus.CounterValue, s.TxBytesD, labels}, + {u.UAP.RxBytesD, prometheus.CounterValue, s.RxBytesD, labels}, + {u.UAP.BytesR, prometheus.GaugeValue, s.BytesR, labels}, + {u.UAP.NumSta, prometheus.GaugeValue, s.NumSta, labels}, + {u.UAP.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, + {u.UAP.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, + {u.UAP.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, + {u.UAP.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, + {u.UAP.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, + {u.UAP.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, + {u.UAP.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, + {u.UAP.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, + {u.UAP.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, + {u.UAP.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + } + return m } diff --git a/promunifi/usg.go b/promunifi/usg.go index 634ab219f..93d92bae1 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -59,7 +59,7 @@ func descUSG(ns string) *usg { ns = "usg_" } labels := []string{"site_name", "mac", "model", "name", "serial", "site_id", - "type", "version", "device_id", "oid"} + "type", "version", "device_id", "ip"} labelWan := append([]string{"port"}, labels...) return &usg{ @@ -113,7 +113,7 @@ func descUSG(ns string) *usg { // uplink and port tables structs are ignored. that data should be in other exported fields. func (u *unifiCollector) exportUSG(s *unifi.USG) []*metricExports { labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID, - s.Type, s.Version, s.DeviceID, s.Stat.Gw.Oid} + s.Type, s.Version, s.DeviceID, s.IP} labelWan := append([]string{"all"}, labels...) // Gateway System Data. diff --git a/promunifi/usw.go b/promunifi/usw.go index 7f6613a70..4d89b5882 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -25,6 +25,23 @@ type usw struct { MemUsed *prometheus.Desc CPU *prometheus.Desc Mem *prometheus.Desc + // Switch "total" traffic stats + SwRxPackets *prometheus.Desc + SwRxBytes *prometheus.Desc + SwRxErrors *prometheus.Desc + SwRxDropped *prometheus.Desc + SwRxCrypts *prometheus.Desc + SwRxFrags *prometheus.Desc + SwTxPackets *prometheus.Desc + SwTxBytes *prometheus.Desc + SwTxErrors *prometheus.Desc + SwTxDropped *prometheus.Desc + SwTxRetries *prometheus.Desc + SwRxMulticast *prometheus.Desc + SwRxBroadcast *prometheus.Desc + SwTxMulticast *prometheus.Desc + SwTxBroadcast *prometheus.Desc + SwBytes *prometheus.Desc // Port data. PoeCurrent *prometheus.Desc PoePower *prometheus.Desc @@ -54,7 +71,7 @@ func descUSW(ns string) *usw { pns := ns + "port_" // The first five labels for switch are shared with (the same as) switch ports. labels := []string{"site_name", "mac", "model", "name", "serial", "site_id", - "type", "version", "device_id", "oid"} + "type", "version", "device_id", "ip"} // Copy labels, and replace last four with different names. labelP := append(append([]string{}, labels[:6]...), "port_num", "port_name", "port_mac", "port_ip") @@ -65,8 +82,8 @@ func descUSW(ns string) *usw { Temperature: prometheus.NewDesc(ns+"temperature", "Temperature", labels, nil), TotalMaxPower: prometheus.NewDesc(ns+"max_power_total", "Total Max Power", labels, nil), FanLevel: prometheus.NewDesc(ns+"fan_level", "Fan Level", labels, nil), - TotalTxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "Total Transmitted Bytes", labels, nil), - TotalRxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "Total Received Bytes", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Total Transmitted Bytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transfered", labels, nil), NumSta: prometheus.NewDesc(ns+"stations_total", "Number of Stations", labels, nil), UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "Number of User Stations", labels, nil), @@ -79,6 +96,24 @@ func descUSW(ns string) *usw { MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), Mem: prometheus.NewDesc(ns+"memory", "System Memory % Utilized", labels, nil), // this may not be %. + + SwRxPackets: prometheus.NewDesc(ns+"switch_packets_rx_total", "Switch Packets Received Total", labels, nil), + SwRxBytes: prometheus.NewDesc(ns+"switch_bytes_rx_total", "Switch Bytes Received Total", labels, nil), + SwRxErrors: prometheus.NewDesc(ns+"switch_errors_rx_total", "Switch Errors Received Total", labels, nil), + SwRxDropped: prometheus.NewDesc(ns+"switch_dropped_rx_total", "Switch Dropped Received Total", labels, nil), + SwRxCrypts: prometheus.NewDesc(ns+"switch_crypts_rx_total", "Switch Crypts Received Total", labels, nil), + SwRxFrags: prometheus.NewDesc(ns+"switch_frags_rx_total", "Switch Frags Received Total", labels, nil), + SwTxPackets: prometheus.NewDesc(ns+"switch_packets_tx_total", "Switch Packets Transmit Total", labels, nil), + SwTxBytes: prometheus.NewDesc(ns+"switch_bytes_tx_total", "Switch Bytes Transmit Total", labels, nil), + SwTxErrors: prometheus.NewDesc(ns+"switch_errors_tx_total", "Switch Errors Transmit Total", labels, nil), + SwTxDropped: prometheus.NewDesc(ns+"switch_dropped_tx_total", "Switch Dropped Transmit Total", labels, nil), + SwTxRetries: prometheus.NewDesc(ns+"switch_retries_tx_total", "Switch Retries Transmit Total", labels, nil), + SwRxMulticast: prometheus.NewDesc(ns+"switch_multicast_rx_total", "Switch Multicast Receive Total", labels, nil), + SwRxBroadcast: prometheus.NewDesc(ns+"switch_broadcast_rx_total", "Switch Broadcast Receive Total", labels, nil), + SwTxMulticast: prometheus.NewDesc(ns+"switch_multicast_tx_total", "Switch Multicast Transmit Total", labels, nil), + SwTxBroadcast: prometheus.NewDesc(ns+"switch_broadcast_tx_total", "Switch Broadcast Transmit Total", labels, nil), + SwBytes: prometheus.NewDesc(ns+"switch_bytes_total", "Switch Bytes Transfered Total", labels, nil), + // per-port data PoeCurrent: prometheus.NewDesc(pns+"poe_current", "POE Current", labelP, nil), PoePower: prometheus.NewDesc(pns+"poe_power", "POE Power", labelP, nil), @@ -105,7 +140,7 @@ func descUSW(ns string) *usw { // exportUSW exports Network Switch Data func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID, - s.Type, s.Version, s.DeviceID, s.Stat.Oid} + s.Type, s.Version, s.DeviceID, s.IP} // Switch data. m := []*metricExports{ @@ -127,12 +162,34 @@ func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { {u.USW.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, {u.USW.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, {u.USW.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + {u.USW.SwRxPackets, prometheus.CounterValue, s.Stat.Sw.RxPackets, labels}, + {u.USW.SwRxBytes, prometheus.CounterValue, s.Stat.Sw.RxBytes, labels}, + {u.USW.SwRxErrors, prometheus.CounterValue, s.Stat.Sw.RxErrors, labels}, + {u.USW.SwRxDropped, prometheus.CounterValue, s.Stat.Sw.RxDropped, labels}, + {u.USW.SwRxCrypts, prometheus.CounterValue, s.Stat.Sw.RxCrypts, labels}, + {u.USW.SwRxFrags, prometheus.CounterValue, s.Stat.Sw.RxFrags, labels}, + {u.USW.SwTxPackets, prometheus.CounterValue, s.Stat.Sw.TxPackets, labels}, + {u.USW.SwTxBytes, prometheus.CounterValue, s.Stat.Sw.TxBytes, labels}, + {u.USW.SwTxErrors, prometheus.CounterValue, s.Stat.Sw.TxErrors, labels}, + {u.USW.SwTxDropped, prometheus.CounterValue, s.Stat.Sw.TxDropped, labels}, + {u.USW.SwTxRetries, prometheus.CounterValue, s.Stat.Sw.TxRetries, labels}, + {u.USW.SwRxMulticast, prometheus.CounterValue, s.Stat.Sw.RxMulticast, labels}, + {u.USW.SwRxBroadcast, prometheus.CounterValue, s.Stat.Sw.RxBroadcast, labels}, + {u.USW.SwTxMulticast, prometheus.CounterValue, s.Stat.Sw.TxMulticast, labels}, + {u.USW.SwTxBroadcast, prometheus.CounterValue, s.Stat.Sw.TxBroadcast, labels}, + {u.USW.SwBytes, prometheus.CounterValue, s.Stat.Sw.Bytes, labels}, } + // Remove last four labels. + m = append(m, u.exportPortTable(s.PortTable, labels[:6])...) + return m +} - // Per-port data on the switch - for _, p := range s.PortTable { - // Copy labels, and replace last four with different data. - l := append(append([]string{}, labels[:6]...), p.PortIdx.Txt, p.Name, p.Mac, p.IP) +func (u *unifiCollector) exportPortTable(pt []unifi.Port, labels []string) []*metricExports { + var m []*metricExports + // Per-port data on a switch + for _, p := range pt { + // Copy labels, and add four new ones. + l := append(append([]string{}, labels...), p.PortIdx.Txt, p.Name, p.Mac, p.IP) m = append(m, []*metricExports{ {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}, {u.USW.PoePower, prometheus.GaugeValue, p.PoePower, l}, From ba42bb3c13a1378ba8815476bd782fef68c26267 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 18 Nov 2019 01:19:30 -0800 Subject: [PATCH 28/85] spread things out --- promunifi/usg.go | 42 ++++++++++++++++++++++-------------------- promunifi/usw.go | 7 ++----- 2 files changed, 24 insertions(+), 25 deletions(-) diff --git a/promunifi/usg.go b/promunifi/usg.go index 93d92bae1..a76f7c8ed 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -117,7 +117,7 @@ func (u *unifiCollector) exportUSG(s *unifi.USG) []*metricExports { labelWan := append([]string{"all"}, labels...) // Gateway System Data. - m := []*metricExports{ + return append([]*metricExports{ {u.USG.Uptime, prometheus.GaugeValue, s.Uptime, labels}, {u.USG.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, {u.USG.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, @@ -153,31 +153,33 @@ func (u *unifiCollector) exportUSG(s *unifi.USG) []*metricExports { {u.USG.Runtime, prometheus.GaugeValue, s.SpeedtestStatus.Runtime, labels}, {u.USG.XputDownload, prometheus.GaugeValue, s.SpeedtestStatus.XputDownload, labels}, {u.USG.XputUpload, prometheus.GaugeValue, s.SpeedtestStatus.XputUpload, labels}, - } + }, u.exportWANPorts(labels, s.Wan1, s.Wan2)...) +} - // WAN Ports' Stats - for _, wan := range []unifi.Wan{s.Wan1, s.Wan2} { +func (u *unifiCollector) exportWANPorts(labels []string, wans ...unifi.Wan) []*metricExports { + var m []*metricExports + for _, wan := range wans { if !wan.Up.Val { continue // only record UP interfaces. } - labelWan := append([]string{wan.Name}, labels...) + l := append([]string{wan.Name}, labels...) m = append(m, []*metricExports{ - {u.USG.WanRxPackets, prometheus.CounterValue, wan.RxPackets, labelWan}, - {u.USG.WanRxBytes, prometheus.CounterValue, wan.RxBytes, labelWan}, - {u.USG.WanRxDropped, prometheus.CounterValue, wan.RxDropped, labelWan}, - {u.USG.WanRxErrors, prometheus.CounterValue, wan.RxErrors, labelWan}, - {u.USG.WanTxPackets, prometheus.CounterValue, wan.TxPackets, labelWan}, - {u.USG.WanTxBytes, prometheus.CounterValue, wan.TxBytes, labelWan}, - {u.USG.WanRxBroadcast, prometheus.CounterValue, wan.RxBroadcast, labelWan}, - {u.USG.WanRxMulticast, prometheus.CounterValue, wan.RxMulticast, labelWan}, - {u.USG.WanSpeed, prometheus.CounterValue, wan.Speed, labelWan}, - {u.USG.WanTxBroadcast, prometheus.CounterValue, wan.TxBroadcast, labelWan}, - {u.USG.WanTxBytesR, prometheus.CounterValue, wan.TxBytesR, labelWan}, - {u.USG.WanTxDropped, prometheus.CounterValue, wan.TxDropped, labelWan}, - {u.USG.WanTxErrors, prometheus.CounterValue, wan.TxErrors, labelWan}, - {u.USG.WanTxMulticast, prometheus.CounterValue, wan.TxMulticast, labelWan}, - {u.USG.WanBytesR, prometheus.GaugeValue, wan.BytesR, labelWan}, + {u.USG.WanRxPackets, prometheus.CounterValue, wan.RxPackets, l}, + {u.USG.WanRxBytes, prometheus.CounterValue, wan.RxBytes, l}, + {u.USG.WanRxDropped, prometheus.CounterValue, wan.RxDropped, l}, + {u.USG.WanRxErrors, prometheus.CounterValue, wan.RxErrors, l}, + {u.USG.WanTxPackets, prometheus.CounterValue, wan.TxPackets, l}, + {u.USG.WanTxBytes, prometheus.CounterValue, wan.TxBytes, l}, + {u.USG.WanRxBroadcast, prometheus.CounterValue, wan.RxBroadcast, l}, + {u.USG.WanRxMulticast, prometheus.CounterValue, wan.RxMulticast, l}, + {u.USG.WanSpeed, prometheus.CounterValue, wan.Speed, l}, + {u.USG.WanTxBroadcast, prometheus.CounterValue, wan.TxBroadcast, l}, + {u.USG.WanTxBytesR, prometheus.CounterValue, wan.TxBytesR, l}, + {u.USG.WanTxDropped, prometheus.CounterValue, wan.TxDropped, l}, + {u.USG.WanTxErrors, prometheus.CounterValue, wan.TxErrors, l}, + {u.USG.WanTxMulticast, prometheus.CounterValue, wan.TxMulticast, l}, + {u.USG.WanBytesR, prometheus.GaugeValue, wan.BytesR, l}, }...) } diff --git a/promunifi/usw.go b/promunifi/usw.go index 4d89b5882..bf926b56f 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -143,7 +143,7 @@ func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { s.Type, s.Version, s.DeviceID, s.IP} // Switch data. - m := []*metricExports{ + return append([]*metricExports{ {u.USW.Uptime, prometheus.GaugeValue, s.Uptime, labels}, {u.USW.Temperature, prometheus.GaugeValue, s.GeneralTemperature, labels}, {u.USW.TotalMaxPower, prometheus.GaugeValue, s.TotalMaxPower, labels}, @@ -178,10 +178,7 @@ func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { {u.USW.SwTxMulticast, prometheus.CounterValue, s.Stat.Sw.TxMulticast, labels}, {u.USW.SwTxBroadcast, prometheus.CounterValue, s.Stat.Sw.TxBroadcast, labels}, {u.USW.SwBytes, prometheus.CounterValue, s.Stat.Sw.Bytes, labels}, - } - // Remove last four labels. - m = append(m, u.exportPortTable(s.PortTable, labels[:6])...) - return m + }, u.exportPortTable(s.PortTable, labels[:6])...) } func (u *unifiCollector) exportPortTable(pt []unifi.Port, labels []string) []*metricExports { From 8a01655d910ab4770e2eb0a29e4d303621433181 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 18 Nov 2019 01:26:49 -0800 Subject: [PATCH 29/85] found a bug in site code --- promunifi/site.go | 18 +++++++++++------- promunifi/uap.go | 48 +++++++++++++++++++++++------------------------ promunifi/usg.go | 6 +++--- promunifi/usw.go | 8 +++++--- 4 files changed, 43 insertions(+), 37 deletions(-) diff --git a/promunifi/site.go b/promunifi/site.go index f3364616c..88741016b 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -37,8 +37,7 @@ func descSite(ns string) *site { if ns += "_site_"; ns == "_site_" { ns = "site_" } - - labels := []string{"name", "desc", "site_name", "subsystem", "status", "gwversion"} + labels := []string{"subsystem", "status", "gwversion", "name", "desc", "site_name"} return &site{ NumUser: prometheus.NewDesc(ns+"user_total", "Number of Users", labels, nil), @@ -71,10 +70,13 @@ func descSite(ns string) *site { // exportSite exports Network Site Data func (u *unifiCollector) exportSite(s *unifi.Site) []*metricExports { labels := []string{s.Name, s.Desc, s.SiteName} - var m []*metricExports + var metrics []*metricExports + for _, h := range s.Health { - l := append(labels, h.Subsystem, h.Status, h.GwVersion) - m = append(m, []*metricExports{ + l := append([]string{h.Subsystem, h.Status, h.GwVersion}, labels...) + + // XXX: More of these are subsystem specific (like the vpn/remote user stuff below) + metrics = append(metrics, []*metricExports{ {u.Site.NumUser, prometheus.CounterValue, h.NumUser.Val, l}, {u.Site.NumGuest, prometheus.CounterValue, h.NumGuest.Val, l}, {u.Site.NumIot, prometheus.CounterValue, h.NumIot.Val, l}, @@ -94,8 +96,9 @@ func (u *unifiCollector) exportSite(s *unifi.Site) []*metricExports { {u.Site.XputDown, prometheus.GaugeValue, h.XputDown.Val, l}, {u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing.Val, l}, }...) + if h.Subsystem == "vpn" { - m = append(m, []*metricExports{ + metrics = append(metrics, []*metricExports{ {u.Site.RemoteUserNumActive, prometheus.CounterValue, h.RemoteUserNumActive.Val, l}, {u.Site.RemoteUserNumInactive, prometheus.CounterValue, h.RemoteUserNumInactive.Val, l}, {u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes.Val, l}, @@ -105,5 +108,6 @@ func (u *unifiCollector) exportSite(s *unifi.Site) []*metricExports { }...) } } - return m + + return metrics } diff --git a/promunifi/uap.go b/promunifi/uap.go index 581055f3d..676434d02 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -103,31 +103,31 @@ func descUAP(ns string) *uap { } // exportUAP exports Access Point Data -func (u *unifiCollector) exportUAP(s *unifi.UAP) []*metricExports { - labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID, - s.Type, s.Version, s.DeviceID, s.IP} +func (u *unifiCollector) exportUAP(a *unifi.UAP) []*metricExports { + labels := []string{a.SiteName, a.Mac, a.Model, a.Name, a.Serial, a.SiteID, + a.Type, a.Version, a.DeviceID, a.IP} // Switch data. - m := []*metricExports{ - {u.UAP.Uptime, prometheus.GaugeValue, s.Uptime, labels}, - {u.UAP.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, - {u.UAP.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, - {u.UAP.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, - {u.UAP.BytesD, prometheus.CounterValue, s.BytesD, labels}, // not sure if these 3 Ds are counters or gauges. - {u.UAP.TxBytesD, prometheus.CounterValue, s.TxBytesD, labels}, - {u.UAP.RxBytesD, prometheus.CounterValue, s.RxBytesD, labels}, - {u.UAP.BytesR, prometheus.GaugeValue, s.BytesR, labels}, - {u.UAP.NumSta, prometheus.GaugeValue, s.NumSta, labels}, - {u.UAP.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, - {u.UAP.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, - {u.UAP.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, - {u.UAP.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, - {u.UAP.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, - {u.UAP.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, - {u.UAP.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, - {u.UAP.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, - {u.UAP.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, - {u.UAP.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + metrics := []*metricExports{ + {u.UAP.Uptime, prometheus.GaugeValue, a.Uptime, labels}, + {u.UAP.TotalTxBytes, prometheus.CounterValue, a.TxBytes, labels}, + {u.UAP.TotalRxBytes, prometheus.CounterValue, a.RxBytes, labels}, + {u.UAP.TotalBytes, prometheus.CounterValue, a.Bytes, labels}, + {u.UAP.BytesD, prometheus.CounterValue, a.BytesD, labels}, // not sure if these 3 Ds are counters or gauges. + {u.UAP.TxBytesD, prometheus.CounterValue, a.TxBytesD, labels}, + {u.UAP.RxBytesD, prometheus.CounterValue, a.RxBytesD, labels}, + {u.UAP.BytesR, prometheus.GaugeValue, a.BytesR, labels}, + {u.UAP.NumSta, prometheus.GaugeValue, a.NumSta, labels}, + {u.UAP.UserNumSta, prometheus.GaugeValue, a.UserNumSta, labels}, + {u.UAP.GuestNumSta, prometheus.GaugeValue, a.GuestNumSta, labels}, + {u.UAP.Loadavg1, prometheus.GaugeValue, a.SysStats.Loadavg1, labels}, + {u.UAP.Loadavg5, prometheus.GaugeValue, a.SysStats.Loadavg5, labels}, + {u.UAP.Loadavg15, prometheus.GaugeValue, a.SysStats.Loadavg15, labels}, + {u.UAP.MemUsed, prometheus.GaugeValue, a.SysStats.MemUsed, labels}, + {u.UAP.MemTotal, prometheus.GaugeValue, a.SysStats.MemTotal, labels}, + {u.UAP.MemBuffer, prometheus.GaugeValue, a.SysStats.MemBuffer, labels}, + {u.UAP.CPU, prometheus.GaugeValue, a.SystemStats.CPU, labels}, + {u.UAP.Mem, prometheus.GaugeValue, a.SystemStats.Mem, labels}, } - return m + return metrics } diff --git a/promunifi/usg.go b/promunifi/usg.go index a76f7c8ed..f641672a4 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -157,14 +157,14 @@ func (u *unifiCollector) exportUSG(s *unifi.USG) []*metricExports { } func (u *unifiCollector) exportWANPorts(labels []string, wans ...unifi.Wan) []*metricExports { - var m []*metricExports + var metrics []*metricExports for _, wan := range wans { if !wan.Up.Val { continue // only record UP interfaces. } l := append([]string{wan.Name}, labels...) - m = append(m, []*metricExports{ + metrics = append(metrics, []*metricExports{ {u.USG.WanRxPackets, prometheus.CounterValue, wan.RxPackets, l}, {u.USG.WanRxBytes, prometheus.CounterValue, wan.RxBytes, l}, {u.USG.WanRxDropped, prometheus.CounterValue, wan.RxDropped, l}, @@ -183,5 +183,5 @@ func (u *unifiCollector) exportWANPorts(labels []string, wans ...unifi.Wan) []*m }...) } - return m + return metrics } diff --git a/promunifi/usw.go b/promunifi/usw.go index bf926b56f..1cebf857a 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -182,12 +182,13 @@ func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { } func (u *unifiCollector) exportPortTable(pt []unifi.Port, labels []string) []*metricExports { - var m []*metricExports + var metrics []*metricExports // Per-port data on a switch for _, p := range pt { // Copy labels, and add four new ones. l := append(append([]string{}, labels...), p.PortIdx.Txt, p.Name, p.Mac, p.IP) - m = append(m, []*metricExports{ + + metrics = append(metrics, []*metricExports{ {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}, {u.USW.PoePower, prometheus.GaugeValue, p.PoePower, l}, {u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, l}, @@ -208,5 +209,6 @@ func (u *unifiCollector) exportPortTable(pt []unifi.Port, labels []string) []*me {u.USW.TxMulticast, prometheus.CounterValue, p.TxMulticast, l}, }...) } - return m + + return metrics } From 1798f31dfa2e567d3353de49b9082c0efa356ccf Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 18 Nov 2019 01:38:34 -0800 Subject: [PATCH 30/85] this makes more sense --- promunifi/usw.go | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/promunifi/usw.go b/promunifi/usw.go index 1cebf857a..866590d9d 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -70,11 +70,10 @@ func descUSW(ns string) *usw { } pns := ns + "port_" // The first five labels for switch are shared with (the same as) switch ports. - labels := []string{"site_name", "mac", "model", "name", "serial", "site_id", - "type", "version", "device_id", "ip"} - // Copy labels, and replace last four with different names. - labelP := append(append([]string{}, labels[:6]...), - "port_num", "port_name", "port_mac", "port_ip") + labels := []string{"type", "version", "device_id", "ip", + "site_name", "mac", "model", "name", "serial", "site_id"} + // Copy labels, and replace first four with different names. + labelP := append([]string{"port_num", "port_name", "port_mac", "port_ip"}, labels[5:]...) return &usw{ // switch data @@ -139,8 +138,8 @@ func descUSW(ns string) *usw { // exportUSW exports Network Switch Data func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { - labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID, - s.Type, s.Version, s.DeviceID, s.IP} + labels := []string{s.Type, s.Version, s.DeviceID, s.IP, + s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID} // Switch data. return append([]*metricExports{ @@ -178,7 +177,7 @@ func (u *unifiCollector) exportUSW(s *unifi.USW) []*metricExports { {u.USW.SwTxMulticast, prometheus.CounterValue, s.Stat.Sw.TxMulticast, labels}, {u.USW.SwTxBroadcast, prometheus.CounterValue, s.Stat.Sw.TxBroadcast, labels}, {u.USW.SwBytes, prometheus.CounterValue, s.Stat.Sw.Bytes, labels}, - }, u.exportPortTable(s.PortTable, labels[:6])...) + }, u.exportPortTable(s.PortTable, labels[5:])...) } func (u *unifiCollector) exportPortTable(pt []unifi.Port, labels []string) []*metricExports { @@ -186,7 +185,7 @@ func (u *unifiCollector) exportPortTable(pt []unifi.Port, labels []string) []*me // Per-port data on a switch for _, p := range pt { // Copy labels, and add four new ones. - l := append(append([]string{}, labels...), p.PortIdx.Txt, p.Name, p.Mac, p.IP) + l := append([]string{p.PortIdx.Txt, p.Name, p.Mac, p.IP}, labels...) metrics = append(metrics, []*metricExports{ {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}, From 166c4a21f0af2ed24776e94a97aa324749d0b680 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 18 Nov 2019 02:10:16 -0800 Subject: [PATCH 31/85] rename some things --- promunifi/collector.go | 42 ++++++++++++++++++++++++------------------ 1 file changed, 24 insertions(+), 18 deletions(-) diff --git a/promunifi/collector.go b/promunifi/collector.go index 7497011ca..d431b1e9c 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -98,7 +98,7 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { // the current metrics (from another package) then exports them for prometheus. func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { start := time.Now() - m, err := u.Config.CollectFn() + unifiMetrics, err := u.Config.CollectFn() if err != nil { ch <- prometheus.NewInvalidMetric( prometheus.NewInvalidDesc(fmt.Errorf("metric fetch failed")), err) @@ -106,7 +106,7 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { } descs := make(map[*prometheus.Desc]bool) // used as a counter - r := &Report{Metrics: m} + r := &Report{Metrics: unifiMetrics} if u.Config.LoggingFn != nil { defer func() { r.Elapsed = time.Since(start) @@ -115,50 +115,54 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { }() } - process := func(m []*metricExports) { - count, errors := u.export(ch, m) + export := func(metrics []*metricExports) { + count, errors := u.export(ch, metrics) r.Total += count r.Errors += errors - for _, d := range m { + for _, d := range metrics { descs[d.Desc] = true } } - for _, asset := range m.Clients { - process(u.exportClient(asset)) + for _, asset := range r.Metrics.Clients { + export(u.exportClient(asset)) } - for _, asset := range m.Sites { - process(u.exportSite(asset)) + for _, asset := range r.Metrics.Sites { + export(u.exportSite(asset)) } - if m.Devices == nil { + if r.Metrics.Devices == nil { return } - for _, asset := range m.Devices.UAPs { - process(u.exportUAP(asset)) + for _, asset := range r.Metrics.Devices.UAPs { + export(u.exportUAP(asset)) } - for _, asset := range m.Devices.USGs { - process(u.exportUSG(asset)) + for _, asset := range r.Metrics.Devices.USGs { + export(u.exportUSG(asset)) } - for _, asset := range m.Devices.USWs { - process(u.exportUSW(asset)) + for _, asset := range r.Metrics.Devices.USWs { + export(u.exportUSW(asset)) } - for _, asset := range m.Devices.UDMs { - process(u.exportUDM(asset)) + for _, asset := range r.Metrics.Devices.UDMs { + export(u.exportUDM(asset)) } } func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricExports) (count, errors int) { for _, e := range exports { var val float64 + switch v := e.Value.(type) { case float64: val = v + case int64: val = float64(v) + case unifi.FlexInt: val = v.Val + default: errors++ if u.Config.ReportErrors { @@ -166,8 +170,10 @@ func (u *unifiCollector) export(ch chan<- prometheus.Metric, exports []*metricEx } continue } + count++ ch <- prometheus.MustNewConstMetric(e.Desc, e.ValueType, val, e.Labels...) } + return } From 7e35c87dabf21bb92898ee280d5b05ded54a267b Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 18 Nov 2019 02:41:20 -0800 Subject: [PATCH 32/85] move tx/rx labels around --- promunifi/clients.go | 36 ++++++++++++++++++------------------ promunifi/collector.go | 6 +++--- promunifi/site.go | 4 ++-- promunifi/uap.go | 2 +- promunifi/usg.go | 42 +++++++++++++++++++++--------------------- promunifi/usw.go | 30 +++++++++++++++--------------- 6 files changed, 60 insertions(+), 60 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 4743118a9..e3c973b1f 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -55,30 +55,30 @@ func descClient(ns string) *client { Noise: prometheus.NewDesc(ns+"noise", "Client AP Noise", labels, nil), RoamCount: prometheus.NewDesc(ns+"roam_total", "Client Roam Counter", labels, nil), RSSI: prometheus.NewDesc(ns+"rssi", "Client RSSI", labels, nil), - RxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "Client Receive Bytes", labels, nil), - RxBytesR: prometheus.NewDesc(ns+"rx_bytes_rate", "Client Receive Data Rate", labels, nil), - RxPackets: prometheus.NewDesc(ns+"rx_packets_total", "Client Receive Packets", labels, nil), - RxRate: prometheus.NewDesc(ns+"rx_rate", "Client Receive Rate", labels, nil), + RxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Client Receive Bytes", labels, nil), + RxBytesR: prometheus.NewDesc(ns+"bytes_rx_rate", "Client Receive Data Rate", labels, nil), + RxPackets: prometheus.NewDesc(ns+"packets_rx_total", "Client Receive Packets", labels, nil), + RxRate: prometheus.NewDesc(ns+"rate", "Client Receive Rate", labels, nil), Signal: prometheus.NewDesc(ns+"signal", "Client Signal Strength", labels, nil), - TxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "Client Transmit Bytes", labels, nil), - TxBytesR: prometheus.NewDesc(ns+"tx_bytes_rate", "Client Transmit Data Rate", labels, nil), - TxPackets: prometheus.NewDesc(ns+"tx_packets_total", "Client Transmit Packets", labels, nil), + TxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Client Transmit Bytes", labels, nil), + TxBytesR: prometheus.NewDesc(ns+"bytes_tx_rate", "Client Transmit Data Rate", labels, nil), + TxPackets: prometheus.NewDesc(ns+"packets_tx_total", "Client Transmit Packets", labels, nil), TxPower: prometheus.NewDesc(ns+"tx_power", "Client Transmit Power", labels, nil), TxRate: prometheus.NewDesc(ns+"tx_rate", "Client Transmit Rate", labels, nil), Uptime: prometheus.NewDesc(ns+"uptime", "Client Uptime", labels, nil), - WifiTxAttempts: prometheus.NewDesc(ns+"wifi_tx_attempts_total", "Client Wifi Transmit Attempts", labels, nil), - WiredRxBytes: prometheus.NewDesc(ns+"wired_rx_bytes_total", "Client Wired Receive Bytes", labels, nil), - WiredRxBytesR: prometheus.NewDesc(ns+"wired_rx_bytes_rate", "Client Wired Receive Data Rate", labels, nil), - WiredRxPackets: prometheus.NewDesc(ns+"wired_rx_packets_total", "Client Wired Receive Packets", labels, nil), - WiredTxBytes: prometheus.NewDesc(ns+"wired_tx_bytes_total", "Client Wired Transmit Bytes", labels, nil), - WiredTxBytesR: prometheus.NewDesc(ns+"wired_tx_bytes_rate", "Client Wired Data Rate", labels, nil), - WiredTxPackets: prometheus.NewDesc(ns+"wired_tx_packets_total", "Client Wired Transmit Packets", labels, nil), + WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_tx_total", "Client Wifi Transmit Attempts", labels, nil), + WiredRxBytes: prometheus.NewDesc(ns+"wired_bytes_rx_total", "Client Wired Receive Bytes", labels, nil), + WiredRxBytesR: prometheus.NewDesc(ns+"wired_bytes_rx_rate", "Client Wired Receive Data Rate", labels, nil), + WiredRxPackets: prometheus.NewDesc(ns+"wired_packets_rx_total", "Client Wired Receive Packets", labels, nil), + WiredTxBytes: prometheus.NewDesc(ns+"wired_bytes_tx_total", "Client Wired Transmit Bytes", labels, nil), + WiredTxBytesR: prometheus.NewDesc(ns+"wired_bytes_tx_rate", "Client Wired Data Rate", labels, nil), + WiredTxPackets: prometheus.NewDesc(ns+"wired_packets_tx_total", "Client Wired Transmit Packets", labels, nil), DpiStatsApp: prometheus.NewDesc(ns+"dpi_stats_app", "Client DPI Stats App", labels, nil), DpiStatsCat: prometheus.NewDesc(ns+"dpi_stats_cat", "Client DPI Stats Cat", labels, nil), - DpiStatsRxBytes: prometheus.NewDesc(ns+"dpi_stats_rx_bytes_total", "Client DPI Stats Receive Bytes", labels, nil), - DpiStatsRxPackets: prometheus.NewDesc(ns+"dpi_stats_rx_packets_total", "Client DPI Stats Receive Packets", labels, nil), - DpiStatsTxBytes: prometheus.NewDesc(ns+"dpi_stats_tx_bytes_total", "Client DPI Stats Transmit Bytes", labels, nil), - DpiStatsTxPackets: prometheus.NewDesc(ns+"dpi_stats_tx_packets_total", "Client DPI Stats Transmit Packets", labels, nil), + DpiStatsRxBytes: prometheus.NewDesc(ns+"dpi_stats_bytes_rx_total", "Client DPI Stats Receive Bytes", labels, nil), + DpiStatsRxPackets: prometheus.NewDesc(ns+"dpi_stats_packets_rx_total", "Client DPI Stats Receive Packets", labels, nil), + DpiStatsTxBytes: prometheus.NewDesc(ns+"dpi_stats_bytes_tx_total", "Client DPI Stats Transmit Bytes", labels, nil), + DpiStatsTxPackets: prometheus.NewDesc(ns+"dpi_stats_packets_tx_total", "Client DPI Stats Transmit Packets", labels, nil), } } diff --git a/promunifi/collector.go b/promunifi/collector.go index d431b1e9c..400841c12 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -17,13 +17,13 @@ type UnifiCollectorCnfg struct { Namespace string // If true, any error encountered during collection is reported as an // invalid metric (see NewInvalidMetric). Otherwise, errors are ignored - // and the collected metrics will be incomplete. (Possibly, no metrics - // will be collected at all.) + // and the collected metrics will be incomplete. Possibly, no metrics + // will be collected at all. ReportErrors bool // This function is passed to the Collect() method. The Collect method runs This // function to retreive the latest UniFi CollectFn func() (*metrics.Metrics, error) - // provide a logger function if you want to run a routine *after* prometheus checks in. + // Provide a logger function if you want to run a routine *after* prometheus checks in. LoggingFn func(*Report) } diff --git a/promunifi/site.go b/promunifi/site.go index 88741016b..5e8d0eaf2 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -43,8 +43,8 @@ func descSite(ns string) *site { NumUser: prometheus.NewDesc(ns+"user_total", "Number of Users", labels, nil), NumGuest: prometheus.NewDesc(ns+"guest_total", "Number of Guests", labels, nil), NumIot: prometheus.NewDesc(ns+"iot_total", "Number of IoT Devices", labels, nil), - TxBytesR: prometheus.NewDesc(ns+"tx_bytes_rate", "Bytes Transmit Rate", labels, nil), - RxBytesR: prometheus.NewDesc(ns+"rx_bytes_rate", "Bytes Receive Rate", labels, nil), + TxBytesR: prometheus.NewDesc(ns+"bytes_tx_rate", "Bytes Transmit Rate", labels, nil), + RxBytesR: prometheus.NewDesc(ns+"bytes_rx_rate", "Bytes Receive Rate", labels, nil), NumAp: prometheus.NewDesc(ns+"ap_total", "Access Point Count", labels, nil), NumAdopted: prometheus.NewDesc(ns+"adopted_total", "Adoption Count", labels, nil), NumDisabled: prometheus.NewDesc(ns+"disabled_total", "Disabled Count", labels, nil), diff --git a/promunifi/uap.go b/promunifi/uap.go index 676434d02..9d42e095f 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -98,7 +98,7 @@ func descUAP(ns string) *uap { MemTotal: prometheus.NewDesc(ns+"memory_installed", "System Installed Memory", labels, nil), MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), - Mem: prometheus.NewDesc(ns+"memory", "System Memory % Utilized", labels, nil), + Mem: prometheus.NewDesc(ns+"memory_utilization", "System Memory % Utilized", labels, nil), } } diff --git a/promunifi/usg.go b/promunifi/usg.go index f641672a4..0bf68be8a 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -64,8 +64,8 @@ func descUSG(ns string) *usg { return &usg{ Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), - TotalTxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "Total Transmitted Bytes", labels, nil), - TotalRxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "Total Received Bytes", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Total Transmitted Bytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transfered", labels, nil), NumSta: prometheus.NewDesc(ns+"stations_total", "Number of Stations", labels, nil), UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "Number of User Stations", labels, nil), @@ -81,27 +81,27 @@ func descUSG(ns string) *usg { MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), Mem: prometheus.NewDesc(ns+"memory_utilization", "System Memory % Utilized", labels, nil), // this may not be %. - WanRxPackets: prometheus.NewDesc(ns+"wan_rx_packets_total", "WAN Receive Packets Total", labelWan, nil), - WanRxBytes: prometheus.NewDesc(ns+"wan_rx_bytes_total", "WAN Receive Bytes Total", labelWan, nil), - WanRxDropped: prometheus.NewDesc(ns+"wan_rx_dropped_total", "WAN Receive Dropped Total", labelWan, nil), - WanRxErrors: prometheus.NewDesc(ns+"wan_rx_errors_total", "WAN Receive Errors Total", labelWan, nil), - WanTxPackets: prometheus.NewDesc(ns+"wan_tx_packets_total", "WAN Transmit Packets Total", labelWan, nil), - WanTxBytes: prometheus.NewDesc(ns+"wan_tx_bytes_total", "WAN Transmit Bytes Total", labelWan, nil), - WanRxBroadcast: prometheus.NewDesc(ns+"wan_rx_broadcast_total", "WAN Receive Broadcast Total", labelWan, nil), - WanRxBytesR: prometheus.NewDesc(ns+"wan_rx_bytes_rate", "WAN Receive Bytes Rate", labelWan, nil), - WanRxMulticast: prometheus.NewDesc(ns+"wan_rx_multicast_total", "WAN Receive Multicast Total", labelWan, nil), + WanRxPackets: prometheus.NewDesc(ns+"wan_packets_rx_total", "WAN Receive Packets Total", labelWan, nil), + WanRxBytes: prometheus.NewDesc(ns+"wan_bytes_rx_total", "WAN Receive Bytes Total", labelWan, nil), + WanRxDropped: prometheus.NewDesc(ns+"wan_dropped_rx_total", "WAN Receive Dropped Total", labelWan, nil), + WanRxErrors: prometheus.NewDesc(ns+"wan_errors_rx_total", "WAN Receive Errors Total", labelWan, nil), + WanTxPackets: prometheus.NewDesc(ns+"wan_packets_tx_total", "WAN Transmit Packets Total", labelWan, nil), + WanTxBytes: prometheus.NewDesc(ns+"wan_bytes_tx_total", "WAN Transmit Bytes Total", labelWan, nil), + WanRxBroadcast: prometheus.NewDesc(ns+"wan_broadcast_rx_total", "WAN Receive Broadcast Total", labelWan, nil), + WanRxBytesR: prometheus.NewDesc(ns+"wan_bytes_rx_rate", "WAN Receive Bytes Rate", labelWan, nil), + WanRxMulticast: prometheus.NewDesc(ns+"wan_ulticast_rx_total", "WAN Receive Multicast Total", labelWan, nil), WanSpeed: prometheus.NewDesc(ns+"wan_speed", "WAN Speed", labelWan, nil), - WanTxBroadcast: prometheus.NewDesc(ns+"wan_tx_broadcast_total", "WAN Transmit Broadcast Total", labelWan, nil), - WanTxBytesR: prometheus.NewDesc(ns+"wan_tx_bytes_rate", "WAN Transmit Bytes Rate", labelWan, nil), - WanTxDropped: prometheus.NewDesc(ns+"wan_tx_dropped_total", "WAN Transmit Dropped Total", labelWan, nil), - WanTxErrors: prometheus.NewDesc(ns+"wan_tx_errors_total", "WAN Transmit Errors Total", labelWan, nil), - WanTxMulticast: prometheus.NewDesc(ns+"wan_tx_multicast_total", "WAN Transmit Multicast Total", labelWan, nil), + WanTxBroadcast: prometheus.NewDesc(ns+"wan_broadcast_tx_total", "WAN Transmit Broadcast Total", labelWan, nil), + WanTxBytesR: prometheus.NewDesc(ns+"wan_bytes_tx_rate", "WAN Transmit Bytes Rate", labelWan, nil), + WanTxDropped: prometheus.NewDesc(ns+"wan_dropped_tx_total", "WAN Transmit Dropped Total", labelWan, nil), + WanTxErrors: prometheus.NewDesc(ns+"wan_errors_tx_total", "WAN Transmit Errors Total", labelWan, nil), + WanTxMulticast: prometheus.NewDesc(ns+"wan_multicast_tx_total", "WAN Transmit Multicast Total", labelWan, nil), WanBytesR: prometheus.NewDesc(ns+"wan_bytes_rate", "WAN Transfer Rate", labelWan, nil), - LanRxPackets: prometheus.NewDesc(ns+"lan_rx_packets_total", "LAN Receive Packets Total", labels, nil), - LanRxBytes: prometheus.NewDesc(ns+"lan_rx_bytes_total", "LAN Receive Bytes Total", labels, nil), - LanRxDropped: prometheus.NewDesc(ns+"lan_rx_dropped_total", "LAN Receive Dropped Total", labels, nil), - LanTxPackets: prometheus.NewDesc(ns+"lan_tx_packets_total", "LAN Transmit Packets Total", labels, nil), - LanTxBytes: prometheus.NewDesc(ns+"lan_tx_bytes_total", "LAN Transmit Bytes Total", labels, nil), + LanRxPackets: prometheus.NewDesc(ns+"lan_packets_rx_total", "LAN Receive Packets Total", labels, nil), + LanRxBytes: prometheus.NewDesc(ns+"lan_bytes_rx_total", "LAN Receive Bytes Total", labels, nil), + LanRxDropped: prometheus.NewDesc(ns+"lan_dropped_rx_total", "LAN Receive Dropped Total", labels, nil), + LanTxPackets: prometheus.NewDesc(ns+"lan_packets_tx_total", "LAN Transmit Packets Total", labels, nil), + LanTxBytes: prometheus.NewDesc(ns+"lan_bytes_tx_total", "LAN Transmit Bytes Total", labels, nil), Latency: prometheus.NewDesc(ns+"speedtest_latency", "Speedtest Latency", labels, nil), Runtime: prometheus.NewDesc(ns+"speedtest_runtime", "Speedtest Run Time", labels, nil), XputDownload: prometheus.NewDesc(ns+"speedtest_download_rate", "Speedtest Download Rate", labels, nil), diff --git a/promunifi/usw.go b/promunifi/usw.go index 866590d9d..ac2ab5acd 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -94,7 +94,7 @@ func descUSW(ns string) *usw { MemTotal: prometheus.NewDesc(ns+"memory_installed", "System Installed Memory", labels, nil), MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), - Mem: prometheus.NewDesc(ns+"memory", "System Memory % Utilized", labels, nil), // this may not be %. + Mem: prometheus.NewDesc(ns+"memory_utilization", "System Memory % Utilized", labels, nil), // this may not be %. SwRxPackets: prometheus.NewDesc(ns+"switch_packets_rx_total", "Switch Packets Received Total", labels, nil), SwRxBytes: prometheus.NewDesc(ns+"switch_bytes_rx_total", "Switch Bytes Received Total", labels, nil), @@ -117,22 +117,22 @@ func descUSW(ns string) *usw { PoeCurrent: prometheus.NewDesc(pns+"poe_current", "POE Current", labelP, nil), PoePower: prometheus.NewDesc(pns+"poe_power", "POE Power", labelP, nil), PoeVoltage: prometheus.NewDesc(pns+"poe_voltage", "POE Voltage", labelP, nil), - RxBroadcast: prometheus.NewDesc(pns+"rx_broadcast_total", "Receive Broadcast", labelP, nil), - RxBytes: prometheus.NewDesc(pns+"rx_bytes_total", "Total Receive Bytes", labelP, nil), - RxBytesR: prometheus.NewDesc(pns+"rx_bytes_rate", "Receive Bytes Rate", labelP, nil), - RxDropped: prometheus.NewDesc(pns+"rx_dropped_total", "Total Receive Dropped", labelP, nil), - RxErrors: prometheus.NewDesc(pns+"rx_errors_total", "Total Receive Errors", labelP, nil), - RxMulticast: prometheus.NewDesc(pns+"rx_multicast_total", "Total Receive Multicast", labelP, nil), - RxPackets: prometheus.NewDesc(pns+"rx_packets_total", "Total Receive Packets", labelP, nil), + RxBroadcast: prometheus.NewDesc(pns+"broadcast_rx_total", "Receive Broadcast", labelP, nil), + RxBytes: prometheus.NewDesc(pns+"bytes_rx_total", "Total Receive Bytes", labelP, nil), + RxBytesR: prometheus.NewDesc(pns+"bytes_rx_rate", "Receive Bytes Rate", labelP, nil), + RxDropped: prometheus.NewDesc(pns+"dropped_rx_total", "Total Receive Dropped", labelP, nil), + RxErrors: prometheus.NewDesc(pns+"errors_rx_total", "Total Receive Errors", labelP, nil), + RxMulticast: prometheus.NewDesc(pns+"multicast_rx_total", "Total Receive Multicast", labelP, nil), + RxPackets: prometheus.NewDesc(pns+"packets_rx_total", "Total Receive Packets", labelP, nil), Satisfaction: prometheus.NewDesc(pns+"satisfaction", "Satisfaction", labelP, nil), Speed: prometheus.NewDesc(pns+"speed", "Speed", labelP, nil), - TxBroadcast: prometheus.NewDesc(pns+"tx_broadcast_total", "Total Transmit Broadcast", labelP, nil), - TxBytes: prometheus.NewDesc(pns+"tx_bytes_total", "Total Transmit Bytes", labelP, nil), - TxBytesR: prometheus.NewDesc(pns+"tx_bytes_rate", "Transmit Bytes Rate", labelP, nil), - TxDropped: prometheus.NewDesc(pns+"tx_dropped_total", "Total Transmit Dropped", labelP, nil), - TxErrors: prometheus.NewDesc(pns+"tx_errors_total", "Total Transmit Errors", labelP, nil), - TxMulticast: prometheus.NewDesc(pns+"tx_multicast_total", "Total Tranmist Multicast", labelP, nil), - TxPackets: prometheus.NewDesc(pns+"tx_packets_total", "Total Transmit Packets", labelP, nil), + TxBroadcast: prometheus.NewDesc(pns+"broadcast_tx_total", "Total Transmit Broadcast", labelP, nil), + TxBytes: prometheus.NewDesc(pns+"bytes_tx_total", "Total Transmit Bytes", labelP, nil), + TxBytesR: prometheus.NewDesc(pns+"bytes_tx_rate", "Transmit Bytes Rate", labelP, nil), + TxDropped: prometheus.NewDesc(pns+"dropped_tx_total", "Total Transmit Dropped", labelP, nil), + TxErrors: prometheus.NewDesc(pns+"errors_tx_total", "Total Transmit Errors", labelP, nil), + TxMulticast: prometheus.NewDesc(pns+"multicast_tx_total", "Total Tranmist Multicast", labelP, nil), + TxPackets: prometheus.NewDesc(pns+"packets_tx_total", "Total Transmit Packets", labelP, nil), } } From 6cb1fb8f78c2096331449a14afa931a6b71b189c Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 18 Nov 2019 02:43:13 -0800 Subject: [PATCH 33/85] missed a couple --- promunifi/clients.go | 4 ++-- promunifi/uap.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index e3c973b1f..5dcfad2d4 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -63,8 +63,8 @@ func descClient(ns string) *client { TxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Client Transmit Bytes", labels, nil), TxBytesR: prometheus.NewDesc(ns+"bytes_tx_rate", "Client Transmit Data Rate", labels, nil), TxPackets: prometheus.NewDesc(ns+"packets_tx_total", "Client Transmit Packets", labels, nil), - TxPower: prometheus.NewDesc(ns+"tx_power", "Client Transmit Power", labels, nil), - TxRate: prometheus.NewDesc(ns+"tx_rate", "Client Transmit Rate", labels, nil), + TxPower: prometheus.NewDesc(ns+"radio_tx_power", "Client Transmit Power", labels, nil), + TxRate: prometheus.NewDesc(ns+"bytes_tx_rate", "Client Transmit Rate", labels, nil), Uptime: prometheus.NewDesc(ns+"uptime", "Client Uptime", labels, nil), WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_tx_total", "Client Wifi Transmit Attempts", labels, nil), WiredRxBytes: prometheus.NewDesc(ns+"wired_bytes_rx_total", "Client Wired Receive Bytes", labels, nil), diff --git a/promunifi/uap.go b/promunifi/uap.go index 9d42e095f..c1f3872b9 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -81,8 +81,8 @@ func descUAP(ns string) *uap { return &uap{ Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), - TotalTxBytes: prometheus.NewDesc(ns+"tx_bytes_total", "Total Transmitted Bytes", labels, nil), - TotalRxBytes: prometheus.NewDesc(ns+"rx_bytes_total", "Total Received Bytes", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Total Transmitted Bytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transfered", labels, nil), BytesD: prometheus.NewDesc(ns+"bytes_d_total", "Total Bytes D???", labels, nil), TxBytesD: prometheus.NewDesc(ns+"bytes_d_tx", "Transmit Bytes D???", labels, nil), From 1ffbcccaca9a4ed3bb38cb5a875d00eb6b137d19 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 18 Nov 2019 03:07:23 -0800 Subject: [PATCH 34/85] fix bugs --- poller/config.go | 3 ++- poller/start.go | 9 +++++---- promunifi/clients.go | 2 +- promunifi/uap.go | 6 +++--- promunifi/usg.go | 6 +++--- promunifi/usw.go | 6 +++--- 6 files changed, 17 insertions(+), 15 deletions(-) diff --git a/poller/config.go b/poller/config.go index c5df02ace..1fdb09274 100644 --- a/poller/config.go +++ b/poller/config.go @@ -24,7 +24,7 @@ var Version = "development" const ( // App defaults in case they're missing from the config. - defaultNamespace = "unifi" + appName = "unifi-poller" defaultInterval = 30 * time.Second defaultInfluxDB = "unifi" defaultInfluxUser = "unifi" @@ -70,6 +70,7 @@ type Config struct { InfxBadSSL bool `json:"influx_insecure_ssl" toml:"influx_insecure_ssl" xml:"influx_insecure_ssl" yaml:"influx_insecure_ssl" env:"INFLUX_INSECURE_SSL"` Mode string `json:"mode" toml:"mode" xml:"mode" yaml:"mode" env:"POLLING_MODE"` HTTPListen string `json:"http_listen" toml:"http_listen" xml:"http_listen" yaml:"http_listen" env:"HTTP_LISTEN"` + Namespace string `json:"namespace" toml:"namespace" xml:"namespace" yaml:"namespace" env:"NAMESPACE"` InfluxURL string `json:"influx_url,omitempty" toml:"influx_url,omitempty" xml:"influx_url" yaml:"influx_url" env:"INFLUX_URL"` InfluxUser string `json:"influx_user,omitempty" toml:"influx_user,omitempty" xml:"influx_user" yaml:"influx_user" env:"INFLUX_USER"` InfluxPass string `json:"influx_pass,omitempty" toml:"influx_pass,omitempty" xml:"influx_pass" yaml:"influx_pass" env:"INFLUX_PASS"` diff --git a/poller/start.go b/poller/start.go index 931f40f12..2d647ae8c 100644 --- a/poller/start.go +++ b/poller/start.go @@ -36,10 +36,11 @@ func Start() error { Interval: Duration{defaultInterval}, Sites: []string{"all"}, HTTPListen: defaultHTTPListen, + Namespace: appName, }} up.Flag.Parse(os.Args[1:]) if up.Flag.ShowVer { - fmt.Printf("unifi-poller v%s\n", Version) + fmt.Printf("%s v%s\n", appName, Version) return nil // don't run anything else w/ version request. } if up.Flag.DumpJSON == "" { // do not print this when dumping JSON. @@ -59,9 +60,9 @@ func Start() error { // Parse turns CLI arguments into data structures. Called by Start() on startup. func (f *Flag) Parse(args []string) { - f.FlagSet = pflag.NewFlagSet("unifi-poller", pflag.ExitOnError) + f.FlagSet = pflag.NewFlagSet(appName, pflag.ExitOnError) f.Usage = func() { - fmt.Println("Usage: unifi-poller [--config=/path/to/up.conf] [--version]") + fmt.Printf("Usage: %s [--config=/path/to/up.conf] [--version]", appName) f.PrintDefaults() } f.StringVarP(&f.DumpJSON, "dumpjson", "j", "", @@ -101,7 +102,7 @@ func (u *UnifiPoller) Run() (err error) { u.Logf("Exporting Measurements at https://%s/metrics for Prometheus", u.Config.HTTPListen) http.Handle("/metrics", promhttp.Handler()) prometheus.MustRegister(promunifi.NewUnifiCollector(promunifi.UnifiCollectorCnfg{ - Namespace: defaultNamespace, // XXX: pass this in from config. + Namespace: strings.Replace(u.Config.Namespace, "-", "", -1), CollectFn: u.ExportMetrics, LoggingFn: u.LogExportReport, ReportErrors: true, // XXX: Does this need to be configurable? diff --git a/promunifi/clients.go b/promunifi/clients.go index 5dcfad2d4..cefa6866e 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -64,7 +64,7 @@ func descClient(ns string) *client { TxBytesR: prometheus.NewDesc(ns+"bytes_tx_rate", "Client Transmit Data Rate", labels, nil), TxPackets: prometheus.NewDesc(ns+"packets_tx_total", "Client Transmit Packets", labels, nil), TxPower: prometheus.NewDesc(ns+"radio_tx_power", "Client Transmit Power", labels, nil), - TxRate: prometheus.NewDesc(ns+"bytes_tx_rate", "Client Transmit Rate", labels, nil), + TxRate: prometheus.NewDesc(ns+"radio_tx_rate", "Client Transmit Rate", labels, nil), Uptime: prometheus.NewDesc(ns+"uptime", "Client Uptime", labels, nil), WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_tx_total", "Client Wifi Transmit Attempts", labels, nil), WiredRxBytes: prometheus.NewDesc(ns+"wired_bytes_rx_total", "Client Wired Receive Bytes", labels, nil), diff --git a/promunifi/uap.go b/promunifi/uap.go index c1f3872b9..8e9869a3b 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -94,9 +94,9 @@ func descUAP(ns string) *uap { Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), - MemUsed: prometheus.NewDesc(ns+"memory_utilization", "System Memory Used", labels, nil), - MemTotal: prometheus.NewDesc(ns+"memory_installed", "System Installed Memory", labels, nil), - MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), + MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil), + MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil), + MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil), CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), Mem: prometheus.NewDesc(ns+"memory_utilization", "System Memory % Utilized", labels, nil), } diff --git a/promunifi/usg.go b/promunifi/usg.go index 0bf68be8a..cfc6d3218 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -76,9 +76,9 @@ func descUSG(ns string) *usg { Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), - MemUsed: prometheus.NewDesc(ns+"memory_used", "System Memory Used", labels, nil), - MemTotal: prometheus.NewDesc(ns+"memory_installed", "System Installed Memory", labels, nil), - MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), + MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil), + MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil), + MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil), CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), Mem: prometheus.NewDesc(ns+"memory_utilization", "System Memory % Utilized", labels, nil), // this may not be %. WanRxPackets: prometheus.NewDesc(ns+"wan_packets_rx_total", "WAN Receive Packets Total", labelWan, nil), diff --git a/promunifi/usw.go b/promunifi/usw.go index ac2ab5acd..dc1b947f3 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -90,9 +90,9 @@ func descUSW(ns string) *usw { Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), - MemUsed: prometheus.NewDesc(ns+"memory_utilization", "System Memory Used", labels, nil), - MemTotal: prometheus.NewDesc(ns+"memory_installed", "System Installed Memory", labels, nil), - MemBuffer: prometheus.NewDesc(ns+"memory_buffer", "System Memory Buffer", labels, nil), + MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil), + MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil), + MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil), CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), Mem: prometheus.NewDesc(ns+"memory_utilization", "System Memory % Utilized", labels, nil), // this may not be %. From 1b759630022538a7cfed7a38bbe6ebaae6cca396 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 25 Nov 2019 00:17:59 -0800 Subject: [PATCH 35/85] Updates --- examples/MANUAL.md | 4 ++-- main.go | 2 +- poller/config.go | 2 +- poller/prometheus.go | 2 +- poller/start.go | 39 +++++++++++++++++++++++++++------------ 5 files changed, 32 insertions(+), 17 deletions(-) diff --git a/examples/MANUAL.md b/examples/MANUAL.md index 0840f9a1f..ea45d1322 100644 --- a/examples/MANUAL.md +++ b/examples/MANUAL.md @@ -106,10 +106,10 @@ is provided so the application can be easily adapted to any environment. measurements at /metrics for collection by prometheus. Enabling this mode disables InfluxDB usage entirely. This is BETA. - http_listen default: 0.0.0.0:61317 + http_listen default: 0.0.0.0:9130 This option controls the IP and port the http listener uses when the mode is set to prometheus. This setting has no effect when other modes - are in use. + are in use. Metrics become available at the /metrics URI. influx_url default: http://127.0.0.1:8086 This is the URL where the Influx web server is available. diff --git a/main.go b/main.go index c9ec4f3c7..f98e65c44 100644 --- a/main.go +++ b/main.go @@ -8,7 +8,7 @@ import ( // Keep it simple. func main() { - if err := poller.Start(); err != nil { + if err := poller.New().Start(); err != nil { log.Fatalln("[ERROR]", err) } } diff --git a/poller/config.go b/poller/config.go index 1fdb09274..0f12ff089 100644 --- a/poller/config.go +++ b/poller/config.go @@ -32,7 +32,7 @@ const ( defaultInfluxURL = "http://127.0.0.1:8086" defaultUnifiUser = "influx" defaultUnifiURL = "https://127.0.0.1:8443" - defaultHTTPListen = ":61317" + defaultHTTPListen = "0.0.0.0:9130" ) // ENVConfigPrefix is the prefix appended to an env variable tag diff --git a/poller/prometheus.go b/poller/prometheus.go index 3cfb626f6..c811ef47c 100644 --- a/poller/prometheus.go +++ b/poller/prometheus.go @@ -12,7 +12,6 @@ import ( // HTTP at /metrics for prometheus collection. // This is run by Prometheus as CollectFn. func (u *UnifiPoller) ExportMetrics() (*metrics.Metrics, error) { - u.LastCheck = time.Now() m, err := u.CollectMetrics() if err != nil { u.LogErrorf("collecting metrics: %v", err) @@ -21,6 +20,7 @@ func (u *UnifiPoller) ExportMetrics() (*metrics.Metrics, error) { u.LogError(err, "re-authenticating") return nil, err } + if m, err = u.CollectMetrics(); err != nil { u.LogErrorf("collecting metrics: %v", err) return nil, err diff --git a/poller/start.go b/poller/start.go index 2d647ae8c..9e808d5c4 100644 --- a/poller/start.go +++ b/poller/start.go @@ -18,43 +18,57 @@ import ( "golift.io/unifi" ) -// Start begins the application from a CLI. -// Parses flags, parses config and executes Run(). -func Start() error { - log.SetFlags(log.LstdFlags) - up := &UnifiPoller{ - Flag: &Flag{}, +// New returns a new poller struct preloaded with default values. +// No need to call this if you call Start.c +func New() *UnifiPoller { + return &UnifiPoller{ Config: &Config{ - // Preload our defaults. InfluxURL: defaultInfluxURL, InfluxUser: defaultInfluxUser, InfluxPass: defaultInfluxPass, InfluxDB: defaultInfluxDB, UnifiUser: defaultUnifiUser, - UnifiPass: os.Getenv("UNIFI_PASSWORD"), // deprecated name. + UnifiPass: defaultUnifiUser, UnifiBase: defaultUnifiURL, Interval: Duration{defaultInterval}, Sites: []string{"all"}, HTTPListen: defaultHTTPListen, Namespace: appName, - }} + }, Flag: &Flag{}, + } +} + +// Start begins the application from a CLI. +// Parses flags, parses config and executes Run(). +func (u *UnifiPoller) Start() error { + log.SetFlags(log.LstdFlags) + up := New() up.Flag.Parse(os.Args[1:]) + if up.Flag.ShowVer { fmt.Printf("%s v%s\n", appName, Version) return nil // don't run anything else w/ version request. } + if up.Flag.DumpJSON == "" { // do not print this when dumping JSON. up.Logf("Loading Configuration File: %s", up.Flag.ConfigFile) } + // Parse config file. if err := up.Config.ParseFile(up.Flag.ConfigFile); err != nil { up.Flag.Usage() return err } + // Update Config with ENV variable overrides. if err := up.Config.ParseENV(); err != nil { return err } + + if up.Flag.DumpJSON != "" { + return up.DumpJSONPayload() + } + return up.Run() } @@ -65,6 +79,7 @@ func (f *Flag) Parse(args []string) { fmt.Printf("Usage: %s [--config=/path/to/up.conf] [--version]", appName) f.PrintDefaults() } + f.StringVarP(&f.DumpJSON, "dumpjson", "j", "", "This debug option prints a json payload and exits. See man page for more info.") f.StringVarP(&f.ConfigFile, "config", "c", DefaultConfFile, "Poller config file path.") @@ -74,17 +89,16 @@ func (f *Flag) Parse(args []string) { // Run invokes all the application logic and routines. func (u *UnifiPoller) Run() (err error) { - if u.Flag.DumpJSON != "" { - return u.DumpJSONPayload() - } if u.Config.Debug { log.SetFlags(log.Lshortfile | log.Lmicroseconds | log.Ldate) u.LogDebugf("Debug Logging Enabled") } + log.Printf("[INFO] UniFi Poller v%v Starting Up! PID: %d", Version, os.Getpid()) if err = u.GetUnifi(); err != nil { return err } + u.Logf("Polling UniFi Controller at %s v%s as user %s. Sites: %v", u.Config.UnifiBase, u.Unifi.ServerVersion, u.Config.UnifiUser, u.Config.Sites) @@ -149,5 +163,6 @@ func (u *UnifiPoller) GetUnifi() (err error) { return fmt.Errorf("unifi controller: %v", err) } u.LogDebugf("Authenticated with controller successfully") + return u.CheckSites() } From 640075da9416585abae66a4ea2cd53f469418ad1 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Mon, 25 Nov 2019 00:19:05 -0800 Subject: [PATCH 36/85] fix more port numbers --- examples/up.conf.example | 4 ++-- examples/up.json.example | 2 +- examples/up.xml.example | 4 ++-- examples/up.yaml.example | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/examples/up.conf.example b/examples/up.conf.example index a89fd780c..ea5679106 100644 --- a/examples/up.conf.example +++ b/examples/up.conf.example @@ -30,14 +30,14 @@ quiet = false # to InfluxDB one time. This mode requires an external process like an AWS Lambda # or a simple crontab to keep the timings accurate on UniFi Poller run intervals. # -# Prometheus mode opens an HTTP server on port 61317 and exports the metrics at +# Prometheus mode opens an HTTP server on port 9130 and exports the metrics at # /metrics for polling collection by a prometheus server. This disables influxdb. # IMPORTANT: The prometheus mode is still beta and doesn't work very well. mode = "influx" # This controls on which ip and port /metrics is exported when mode is "prometheus". # This has no effect in other modes. Must contain a colon and port. -http_listen = "0.0.0.0:61317" +http_listen = "0.0.0.0:9130" # InfluxDB does not require auth by default, so the user/password are probably unimportant. influx_url = "http://127.0.0.1:8086" diff --git a/examples/up.json.example b/examples/up.json.example index 7b67ac5b9..e99615053 100644 --- a/examples/up.json.example +++ b/examples/up.json.example @@ -4,7 +4,7 @@ "debug": false, "quiet": false, "mode": "influx", - "http_listen": "0.0.0.0:61317", + "http_listen": "0.0.0.0:9130", "influx_url": "http://127.0.0.1:8086", "influx_user": "unifi", "influx_pass": "unifi", diff --git a/examples/up.xml.example b/examples/up.xml.example index e37f88682..f608fd68c 100644 --- a/examples/up.xml.example +++ b/examples/up.xml.example @@ -46,7 +46,7 @@ # to InfluxDB one time. This mode requires an external process like an AWS Lambda # or a simple crontab to keep the timings accurate on UniFi Poller run intervals. # - # Prometheus mode opens an HTTP server on port 61317 and exports the metrics at + # Prometheus mode opens an HTTP server on port 9130 and exports the metrics at # /metrics for polling collection by a prometheus server. This disables influxdb. # IMPORTANT: The prometheus mode is still beta and doesn't work very well. --> @@ -56,7 +56,7 @@ # This controls on which ip and port /metrics is exported when mode is "prometheus". # This has no effect in other modes. Must contain a colon and port. --> - 0.0.0.0:61317 + 0.0.0.0:9130 influx diff --git a/examples/up.yaml.example b/examples/up.yaml.example index 53ebf9237..adf3f019a 100644 --- a/examples/up.yaml.example +++ b/examples/up.yaml.example @@ -33,7 +33,7 @@ quiet: false # # Prometheus mode opens an HTTP server on port 9130 and exports the metrics at # /metrics for polling collection by a prometheus server. This disables influxdb. -# IMPORTANT: The prometheus mode is still beta and doesn't work very well. +# IMPORTANT: The prometheus mode is still beta and isn't tested very well. mode: "influx" # This controls on which ip and port /metrics is exported when mode is "prometheus". From dce7501a403ae3a7fd86dfc8de0602ecfaaa4534 Mon Sep 17 00:00:00 2001 From: David Newhall II Date: Wed, 27 Nov 2019 03:08:22 -0800 Subject: [PATCH 47/85] Update promunifi/clients.go Co-Authored-By: Ben Kochie --- promunifi/clients.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 546cd27fe..672727d87 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -52,7 +52,7 @@ func descClient(ns string) *uclient { Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labels, nil), BytesR: prometheus.NewDesc(ns+"bytes_rate", "Client Data Rate", labels, nil), CCQ: prometheus.NewDesc(ns+"ccq", "Client Connection Quality", labels, nil), - Noise: prometheus.NewDesc(ns+"noise", "Client AP Noise", labels, nil), + Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labels, nil), RoamCount: prometheus.NewDesc(ns+"roam_total", "Client Roam Counter", labels, nil), RSSI: prometheus.NewDesc(ns+"rssi", "Client RSSI", labels, nil), RxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Client Receive Bytes", labels, nil), From 7956f8e0ee1aff6556e0a26d9ff36c23a08ebfbb Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Wed, 27 Nov 2019 21:22:37 -0800 Subject: [PATCH 48/85] fix the names --- promunifi/clients.go | 48 ++++++++-------- promunifi/site.go | 123 +++++++++++++++++++++++++--------------- promunifi/uap.go | 130 +++++++++++++++++++++---------------------- promunifi/usg.go | 62 ++++++++++----------- promunifi/usw.go | 70 +++++++++++------------ 5 files changed, 233 insertions(+), 200 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 672727d87..78705fc35 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -50,35 +50,35 @@ func descClient(ns string) *uclient { return &uclient{ Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labels, nil), - BytesR: prometheus.NewDesc(ns+"bytes_rate", "Client Data Rate", labels, nil), - CCQ: prometheus.NewDesc(ns+"ccq", "Client Connection Quality", labels, nil), + BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labels, nil), + CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labels, nil), Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labels, nil), - RoamCount: prometheus.NewDesc(ns+"roam_total", "Client Roam Counter", labels, nil), + RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labels, nil), RSSI: prometheus.NewDesc(ns+"rssi", "Client RSSI", labels, nil), - RxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Client Receive Bytes", labels, nil), - RxBytesR: prometheus.NewDesc(ns+"bytes_rx_rate", "Client Receive Data Rate", labels, nil), - RxPackets: prometheus.NewDesc(ns+"packets_rx_total", "Client Receive Packets", labels, nil), - RxRate: prometheus.NewDesc(ns+"rate", "Client Receive Rate", labels, nil), - Signal: prometheus.NewDesc(ns+"signal", "Client Signal Strength", labels, nil), - TxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Client Transmit Bytes", labels, nil), - TxBytesR: prometheus.NewDesc(ns+"bytes_tx_rate", "Client Transmit Data Rate", labels, nil), - TxPackets: prometheus.NewDesc(ns+"packets_tx_total", "Client Transmit Packets", labels, nil), - TxPower: prometheus.NewDesc(ns+"radio_tx_power", "Client Transmit Power", labels, nil), - TxRate: prometheus.NewDesc(ns+"radio_tx_rate", "Client Transmit Rate", labels, nil), + RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labels, nil), + RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labels, nil), + RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labels, nil), + RxRate: prometheus.NewDesc(ns+"radio_receive_rate", "Client Receive Rate", labels, nil), + Signal: prometheus.NewDesc(ns+"radio_signal", "Client Signal Strength", labels, nil), + TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labels, nil), + TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labels, nil), + TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labels, nil), + TxPower: prometheus.NewDesc(ns+"radio_transmit_power", "Client Transmit Power", labels, nil), + TxRate: prometheus.NewDesc(ns+"radio_transmit_rate", "Client Transmit Rate", labels, nil), Uptime: prometheus.NewDesc(ns+"uptime", "Client Uptime", labels, nil), - WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_tx_total", "Client Wifi Transmit Attempts", labels, nil), - WiredRxBytes: prometheus.NewDesc(ns+"wired_bytes_rx_total", "Client Wired Receive Bytes", labels, nil), - WiredRxBytesR: prometheus.NewDesc(ns+"wired_bytes_rx_rate", "Client Wired Receive Data Rate", labels, nil), - WiredRxPackets: prometheus.NewDesc(ns+"wired_packets_rx_total", "Client Wired Receive Packets", labels, nil), - WiredTxBytes: prometheus.NewDesc(ns+"wired_bytes_tx_total", "Client Wired Transmit Bytes", labels, nil), - WiredTxBytesR: prometheus.NewDesc(ns+"wired_bytes_tx_rate", "Client Wired Data Rate", labels, nil), - WiredTxPackets: prometheus.NewDesc(ns+"wired_packets_tx_total", "Client Wired Transmit Packets", labels, nil), + WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labels, nil), + WiredRxBytes: prometheus.NewDesc(ns+"wired_receive_bytes_total", "Client Wired Receive Bytes", labels, nil), + WiredRxBytesR: prometheus.NewDesc(ns+"wired_receive_rate_bytes", "Client Wired Receive Data Rate", labels, nil), + WiredRxPackets: prometheus.NewDesc(ns+"wired_receive_packets_total", "Client Wired Receive Packets", labels, nil), + WiredTxBytes: prometheus.NewDesc(ns+"wired_transmit_bytes_total", "Client Wired Transmit Bytes", labels, nil), + WiredTxBytesR: prometheus.NewDesc(ns+"wired_transmit_rate_bytes", "Client Wired Data Rate", labels, nil), + WiredTxPackets: prometheus.NewDesc(ns+"wired_transmit_packets_total", "Client Wired Transmit Packets", labels, nil), DpiStatsApp: prometheus.NewDesc(ns+"dpi_stats_app", "Client DPI Stats App", labels, nil), DpiStatsCat: prometheus.NewDesc(ns+"dpi_stats_cat", "Client DPI Stats Cat", labels, nil), - DpiStatsRxBytes: prometheus.NewDesc(ns+"dpi_stats_bytes_rx_total", "Client DPI Stats Receive Bytes", labels, nil), - DpiStatsRxPackets: prometheus.NewDesc(ns+"dpi_stats_packets_rx_total", "Client DPI Stats Receive Packets", labels, nil), - DpiStatsTxBytes: prometheus.NewDesc(ns+"dpi_stats_bytes_tx_total", "Client DPI Stats Transmit Bytes", labels, nil), - DpiStatsTxPackets: prometheus.NewDesc(ns+"dpi_stats_packets_tx_total", "Client DPI Stats Transmit Packets", labels, nil), + DpiStatsRxBytes: prometheus.NewDesc(ns+"dpi_stats_receive_bytes_total", "Client DPI Stats Receive Bytes", labels, nil), + DpiStatsRxPackets: prometheus.NewDesc(ns+"dpi_stats_receive_packets_total", "Client DPI Stats Receive Packets", labels, nil), + DpiStatsTxBytes: prometheus.NewDesc(ns+"dpi_stats_transmit_bytes_total", "Client DPI Stats Transmit Bytes", labels, nil), + DpiStatsTxPackets: prometheus.NewDesc(ns+"dpi_stats_transmit_packets_total", "Client DPI Stats Transmit Packets", labels, nil), } } diff --git a/promunifi/site.go b/promunifi/site.go index f525a819c..9ee5ee8e3 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -21,6 +21,7 @@ type site struct { NumSta *prometheus.Desc Latency *prometheus.Desc Drops *prometheus.Desc + Uptime *prometheus.Desc XputUp *prometheus.Desc XputDown *prometheus.Desc SpeedtestPing *prometheus.Desc @@ -36,33 +37,34 @@ func descSite(ns string) *site { if ns += "_site_"; ns == "_site_" { ns = "site_" } - labels := []string{"subsystem", "status", "gwversion", "name", "desc", "site_name"} + labels := []string{"subsystem", "status", "name", "desc", "site_name"} return &site{ - NumUser: prometheus.NewDesc(ns+"user_total", "Number of Users", labels, nil), - NumGuest: prometheus.NewDesc(ns+"guest_total", "Number of Guests", labels, nil), - NumIot: prometheus.NewDesc(ns+"iot_total", "Number of IoT Devices", labels, nil), - TxBytesR: prometheus.NewDesc(ns+"bytes_tx_rate", "Bytes Transmit Rate", labels, nil), - RxBytesR: prometheus.NewDesc(ns+"bytes_rx_rate", "Bytes Receive Rate", labels, nil), - NumAp: prometheus.NewDesc(ns+"ap_total", "Access Point Count", labels, nil), - NumAdopted: prometheus.NewDesc(ns+"adopted_total", "Adoption Count", labels, nil), - NumDisabled: prometheus.NewDesc(ns+"disabled_total", "Disabled Count", labels, nil), - NumDisconnected: prometheus.NewDesc(ns+"disconnected_total", "Disconnected Count", labels, nil), - NumPending: prometheus.NewDesc(ns+"pending_total", "Pending Count", labels, nil), - NumGw: prometheus.NewDesc(ns+"gateways_total", "Gateway Count", labels, nil), - NumSw: prometheus.NewDesc(ns+"switches_total", "Switch Count", labels, nil), - NumSta: prometheus.NewDesc(ns+"stations_total", "Station Count", labels, nil), - Latency: prometheus.NewDesc(ns+"latency", "Latency", labels, nil), - Drops: prometheus.NewDesc(ns+"drops_total", "Drops", labels, nil), + NumUser: prometheus.NewDesc(ns+"num_user_total", "Number of Users", labels, nil), + NumGuest: prometheus.NewDesc(ns+"num_guest_total", "Number of Guests", labels, nil), + NumIot: prometheus.NewDesc(ns+"num_iot_total", "Number of IoT Devices", labels, nil), + TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Bytes Transmit Rate", labels, nil), + RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Bytes Receive Rate", labels, nil), + NumAp: prometheus.NewDesc(ns+"num_ap_total", "Access Point Count", labels, nil), + NumAdopted: prometheus.NewDesc(ns+"num_adopted_total", "Adoption Count", labels, nil), + NumDisabled: prometheus.NewDesc(ns+"num_disabled_total", "Disabled Count", labels, nil), + NumDisconnected: prometheus.NewDesc(ns+"num_disconnected_total", "Disconnected Count", labels, nil), + NumPending: prometheus.NewDesc(ns+"num_pending_total", "Pending Count", labels, nil), + NumGw: prometheus.NewDesc(ns+"num_gateways_total", "Gateway Count", labels, nil), + NumSw: prometheus.NewDesc(ns+"num_switches_total", "Switch Count", labels, nil), + NumSta: prometheus.NewDesc(ns+"num_stations_total", "Station Count", labels, nil), + Latency: prometheus.NewDesc(ns+"latency_ms", "Latency", labels, nil), + Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Uptime", labels, nil), + Drops: prometheus.NewDesc(ns+"intenet_drops_total", "Internet (WAN) Disconnections", labels, nil), XputUp: prometheus.NewDesc(ns+"xput_up_rate", "Speedtest Upload", labels, nil), XputDown: prometheus.NewDesc(ns+"xput_down_rate", "Speedtest Download", labels, nil), SpeedtestPing: prometheus.NewDesc(ns+"speedtest_ping", "Speedtest Ping", labels, nil), - RemoteUserNumActive: prometheus.NewDesc(ns+"remote_user_active_total", "Remote Users Active", labels, nil), - RemoteUserNumInactive: prometheus.NewDesc(ns+"remote_user_inactive_total", "Remote Users Inactive", labels, nil), - RemoteUserRxBytes: prometheus.NewDesc(ns+"remote_user_rx_bytes_total", "Remote Users Receive Bytes", labels, nil), - RemoteUserTxBytes: prometheus.NewDesc(ns+"remote_user_tx_bytes_total", "Remote Users Transmit Bytes", labels, nil), - RemoteUserRxPackets: prometheus.NewDesc(ns+"remote_user_rx_packets_total", "Remote Users Receive Packets", labels, nil), - RemoteUserTxPackets: prometheus.NewDesc(ns+"remote_user_tx_packets_total", "Remote Users Transmit Packets", labels, nil), + RemoteUserNumActive: prometheus.NewDesc(ns+"num_remote_user_active_total", "Remote Users Active", labels, nil), + RemoteUserNumInactive: prometheus.NewDesc(ns+"num_remote_user_inactive_total", "Remote Users Inactive", labels, nil), + RemoteUserRxBytes: prometheus.NewDesc(ns+"remote_user_receive_bytes_total", "Remote Users Receive Bytes", labels, nil), + RemoteUserTxBytes: prometheus.NewDesc(ns+"remote_user_transmit_bytes_total", "Remote Users Transmit Bytes", labels, nil), + RemoteUserRxPackets: prometheus.NewDesc(ns+"remote_user_receive_packets_total", "Remote Users Receive Packets", labels, nil), + RemoteUserTxPackets: prometheus.NewDesc(ns+"remote_user_transmit_packets_total", "Remote Users Transmit Packets", labels, nil), } } @@ -71,31 +73,15 @@ func (u *unifiCollector) exportSites(sites unifi.Sites, r *Report) { metrics := []*metricExports{} labels := []string{s.Name, s.Desc, s.SiteName} for _, h := range s.Health { - l := append([]string{h.Subsystem, h.Status, h.GwVersion}, labels...) + l := append([]string{h.Subsystem, h.Status}, labels...) - // XXX: More of these are subsystem specific (like the vpn/remote user stuff below) - metrics = append(metrics, []*metricExports{ - {u.Site.NumUser, prometheus.CounterValue, h.NumUser.Val, l}, - {u.Site.NumGuest, prometheus.CounterValue, h.NumGuest.Val, l}, - {u.Site.NumIot, prometheus.CounterValue, h.NumIot.Val, l}, - {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR.Val, l}, - {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR.Val, l}, - {u.Site.NumAp, prometheus.CounterValue, h.NumAp.Val, l}, - {u.Site.NumAdopted, prometheus.CounterValue, h.NumAdopted.Val, l}, - {u.Site.NumDisabled, prometheus.CounterValue, h.NumDisabled.Val, l}, - {u.Site.NumDisconnected, prometheus.CounterValue, h.NumDisconnected.Val, l}, - {u.Site.NumPending, prometheus.CounterValue, h.NumPending.Val, l}, - {u.Site.NumGw, prometheus.CounterValue, h.NumGw.Val, l}, - {u.Site.NumSw, prometheus.CounterValue, h.NumSw.Val, l}, - {u.Site.NumSta, prometheus.CounterValue, h.NumSta.Val, l}, - {u.Site.Latency, prometheus.GaugeValue, h.Latency.Val, l}, - {u.Site.Drops, prometheus.CounterValue, h.Drops.Val, l}, - {u.Site.XputUp, prometheus.GaugeValue, h.XputUp.Val, l}, - {u.Site.XputDown, prometheus.GaugeValue, h.XputDown.Val, l}, - {u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing.Val, l}, - }...) + if h.Subsystem != "vpn" { + metrics = append(metrics, []*metricExports{ + {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR.Val, l}, + {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR.Val, l}, + }...) - if h.Subsystem == "vpn" { + } else { metrics = append(metrics, []*metricExports{ {u.Site.RemoteUserNumActive, prometheus.CounterValue, h.RemoteUserNumActive.Val, l}, {u.Site.RemoteUserNumInactive, prometheus.CounterValue, h.RemoteUserNumInactive.Val, l}, @@ -105,6 +91,53 @@ func (u *unifiCollector) exportSites(sites unifi.Sites, r *Report) { {u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets.Val, l}, }...) } + + if h.Subsystem == "lan" || h.Subsystem == "wlan" || h.Subsystem == "wan" { + metrics = append(metrics, []*metricExports{ + {u.Site.NumAdopted, prometheus.CounterValue, h.NumAdopted.Val, l}, + {u.Site.NumDisconnected, prometheus.CounterValue, h.NumDisconnected.Val, l}, + {u.Site.NumPending, prometheus.CounterValue, h.NumPending.Val, l}, + }...) + } + + if h.Subsystem == "lan" || h.Subsystem == "wlan" { + metrics = append(metrics, []*metricExports{ + {u.Site.NumUser, prometheus.CounterValue, h.NumUser.Val, l}, + {u.Site.NumGuest, prometheus.CounterValue, h.NumGuest.Val, l}, + {u.Site.NumIot, prometheus.CounterValue, h.NumIot.Val, l}, + }...) + } + + if h.Subsystem == "wlan" { + metrics = append(metrics, []*metricExports{ + {u.Site.NumAp, prometheus.CounterValue, h.NumAp.Val, l}, + {u.Site.NumDisabled, prometheus.CounterValue, h.NumDisabled.Val, l}, + }...) + } + + if h.Subsystem == "wan" { + metrics = append(metrics, []*metricExports{ + {u.Site.NumGw, prometheus.CounterValue, h.NumGw.Val, l}, + {u.Site.NumSta, prometheus.CounterValue, h.NumSta.Val, l}, + }...) + } + + if h.Subsystem == "lan" { + metrics = append(metrics, []*metricExports{ + {u.Site.NumSw, prometheus.CounterValue, h.NumSw.Val, l}, + }...) + } + + if h.Subsystem == "www" { + metrics = append(metrics, []*metricExports{ + {u.Site.Uptime, prometheus.GaugeValue, h.Latency.Val, l}, + {u.Site.Latency, prometheus.GaugeValue, h.Latency.Val, l}, + {u.Site.XputUp, prometheus.GaugeValue, h.XputUp.Val, l}, + {u.Site.XputDown, prometheus.GaugeValue, h.XputDown.Val, l}, + {u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing.Val, l}, + {u.Site.Drops, prometheus.CounterValue, h.Drops.Val, l}, + }...) + } } r.ch <- metrics } diff --git a/promunifi/uap.go b/promunifi/uap.go index 2aac58108..32c4195be 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -114,39 +114,39 @@ func descUAP(ns string) *uap { return &uap{ Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), - TotalTxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Total Transmitted Bytes", labels, nil), - TotalRxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Total Received Bytes", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Total Transmitted Bytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil), - BytesD: prometheus.NewDesc(ns+"bytes_d_total", "Total Bytes D???", labels, nil), - TxBytesD: prometheus.NewDesc(ns+"bytes_d_tx", "Transmit Bytes D???", labels, nil), - RxBytesD: prometheus.NewDesc(ns+"bytes_d_rx", "Receive Bytes D???", labels, nil), - BytesR: prometheus.NewDesc(ns+"bytes_rate", "Transfer Rate", labels, nil), - NumSta: prometheus.NewDesc(ns+"stations_total", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"stations_guest_total", "Number of Guest Stations", labels, nil), + BytesD: prometheus.NewDesc(ns+"d_bytes", "Total Bytes D???", labels, nil), + TxBytesD: prometheus.NewDesc(ns+"d_tranmsit_bytes", "Transmit Bytes D???", labels, nil), + RxBytesD: prometheus.NewDesc(ns+"d_receive_bytes", "Receive Bytes D???", labels, nil), + BytesR: prometheus.NewDesc(ns+"rate_bytes", "Transfer Rate", labels, nil), + NumSta: prometheus.NewDesc(ns+"num_stations_total", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"num_stations_user_total", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest_total", "Number of Guest Stations", labels, nil), Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil), MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil), MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil), - CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), - Mem: prometheus.NewDesc(ns+"memory_utilization", "System Memory % Utilized", labels, nil), - ApBytes: prometheus.NewDesc(ns+"bytes_transferred_total", "Total Bytes Moved", labels, nil), + CPU: prometheus.NewDesc(ns+"cpu_utilization_percent", "System CPU % Utilized", labels, nil), + Mem: prometheus.NewDesc(ns+"memory_utilization_percent", "System Memory % Utilized", labels, nil), + ApBytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Total Bytes Moved", labels, nil), // 3x each - stat table: total, guest, user ApWifiTxDropped: prometheus.NewDesc(ns+"stat_wifi_transmt_dropped_total", "Wifi Transmissions Dropped", labelA, nil), - ApRxErrors: prometheus.NewDesc(ns+"stat_errors_rx_total", "Receive Errors", labelA, nil), - ApRxDropped: prometheus.NewDesc(ns+"stat_dropped_rx_total", "Receive Dropped", labelA, nil), - ApRxFrags: prometheus.NewDesc(ns+"stat_frags_rx_total", "Received Frags", labelA, nil), - ApRxCrypts: prometheus.NewDesc(ns+"stat_crypts_rx_total", "Receive Crypts", labelA, nil), - ApTxPackets: prometheus.NewDesc(ns+"stat_packets_tx_total", "Transmit Packets", labelA, nil), - ApTxBytes: prometheus.NewDesc(ns+"stat_bytes_tx_total", "Transmit Bytes", labelA, nil), - ApTxErrors: prometheus.NewDesc(ns+"stat_errors_tx_total", "Transmit Errors", labelA, nil), - ApTxDropped: prometheus.NewDesc(ns+"stat_dropped_tx_total", "Transmit Dropped", labelA, nil), + ApRxErrors: prometheus.NewDesc(ns+"stat_receive_errors_total", "Receive Errors", labelA, nil), + ApRxDropped: prometheus.NewDesc(ns+"stat_receive_dropped_total", "Receive Dropped", labelA, nil), + ApRxFrags: prometheus.NewDesc(ns+"stat_receive_frags_total", "Received Frags", labelA, nil), + ApRxCrypts: prometheus.NewDesc(ns+"stat_receive_crypts_total", "Receive Crypts", labelA, nil), + ApTxPackets: prometheus.NewDesc(ns+"stat_transmit_packets_total", "Transmit Packets", labelA, nil), + ApTxBytes: prometheus.NewDesc(ns+"stat_transmit_bytes_total", "Transmit Bytes", labelA, nil), + ApTxErrors: prometheus.NewDesc(ns+"stat_transmit_errors_total", "Transmit Errors", labelA, nil), + ApTxDropped: prometheus.NewDesc(ns+"stat_transmit_dropped_total", "Transmit Dropped", labelA, nil), ApTxRetries: prometheus.NewDesc(ns+"stat_retries_tx_total", "Transmit Retries", labelA, nil), - ApRxPackets: prometheus.NewDesc(ns+"stat_packets_rx_total", "Receive Packets", labelA, nil), - ApRxBytes: prometheus.NewDesc(ns+"stat_bytes_rx_total", "Receive Bytes", labelA, nil), + ApRxPackets: prometheus.NewDesc(ns+"stat_receive_packets_total", "Receive Packets", labelA, nil), + ApRxBytes: prometheus.NewDesc(ns+"stat_receive_bytes_total", "Receive Bytes", labelA, nil), WifiTxAttempts: prometheus.NewDesc(ns+"stat_wifi_transmit_attempts_total", "Wifi Transmission Attempts", labelA, nil), MacFilterRejections: prometheus.NewDesc(ns+"stat_mac_filter_rejects_total", "MAC Filter Rejections", labelA, nil), @@ -154,61 +154,61 @@ func descUAP(ns string) *uap { VAPCcq: prometheus.NewDesc(ns+"vap_ccq", "VAP Client Connection Quality", labelV, nil), VAPMacFilterRejections: prometheus.NewDesc(ns+"vap_mac_filter_rejects_total", "VAP MAC Filter Rejections", labelV, nil), VAPNumSatisfactionSta: prometheus.NewDesc(ns+"vap_num_satisfaction_stations", "VAP Number Satisifaction Stations", labelV, nil), - VAPAvgClientSignal: prometheus.NewDesc(ns+"vap_avg_client_signal", "VAP Average Client Signal", labelV, nil), + VAPAvgClientSignal: prometheus.NewDesc(ns+"vap_average_client_signal", "VAP Average Client Signal", labelV, nil), VAPSatisfaction: prometheus.NewDesc(ns+"vap_satisfaction", "VAP Satisfaction", labelV, nil), VAPSatisfactionNow: prometheus.NewDesc(ns+"vap_satisfaction_now", "VAP Satisfaction Now", labelV, nil), - VAPRxBytes: prometheus.NewDesc(ns+"vap_bytes_rx_total", "VAP Bytes Received", labelV, nil), - VAPRxCrypts: prometheus.NewDesc(ns+"vap_crypts_rx_total", "VAP Crypts Received", labelV, nil), - VAPRxDropped: prometheus.NewDesc(ns+"vap_dropped_rx_total", "VAP Dropped Received", labelV, nil), - VAPRxErrors: prometheus.NewDesc(ns+"vap_errors_rx_total", "VAP Errors Received", labelV, nil), - VAPRxFrags: prometheus.NewDesc(ns+"vap_frags_rx_total", "VAP Frags Received", labelV, nil), - VAPRxNwids: prometheus.NewDesc(ns+"vap_nwids_rx_total", "VAP Nwids Received", labelV, nil), - VAPRxPackets: prometheus.NewDesc(ns+"vap_packets_rx_total", "VAP Packets Received", labelV, nil), - VAPTxBytes: prometheus.NewDesc(ns+"vap_bytes_tx_total", "VAP Bytes Transmitted", labelV, nil), - VAPTxDropped: prometheus.NewDesc(ns+"vap_dropped_tx_total", "VAP Dropped Transmitted", labelV, nil), - VAPTxErrors: prometheus.NewDesc(ns+"vap_errors_tx_total", "VAP Errors Transmitted", labelV, nil), - VAPTxPackets: prometheus.NewDesc(ns+"vap_packets_tx_total", "VAP Packets Transmitted", labelV, nil), - VAPTxPower: prometheus.NewDesc(ns+"vap_power_tx", "VAP Transmit Power", labelV, nil), - VAPTxRetries: prometheus.NewDesc(ns+"vap_retries_tx_total", "VAP Retries Transmitted", labelV, nil), - VAPTxCombinedRetries: prometheus.NewDesc(ns+"vap_retries_combined_tx_total", "VAP Retries Combined Transmitted", labelV, nil), - VAPTxDataMpduBytes: prometheus.NewDesc(ns+"vap_data_mpdu_bytes_tx_total", "VAP Data MPDU Bytes Transmitted", labelV, nil), - VAPTxRtsRetries: prometheus.NewDesc(ns+"vap_rts_retries_tx_total", "VAP RTS Retries Transmitted", labelV, nil), - VAPTxSuccess: prometheus.NewDesc(ns+"vap_success_tx_total", "VAP Success Transmits", labelV, nil), - VAPTxTotal: prometheus.NewDesc(ns+"vap_tx_total", "VAP Transmit Total", labelV, nil), - VAPTxGoodbytes: prometheus.NewDesc(ns+"vap_goodbyes_tx", "VAP Goodbyes Transmitted", labelV, nil), - VAPTxLatAvg: prometheus.NewDesc(ns+"vap_lat_avg_tx", "VAP Latency Average Transmit", labelV, nil), - VAPTxLatMax: prometheus.NewDesc(ns+"vap_lat_max_tx", "VAP Latency Maximum Transmit", labelV, nil), - VAPTxLatMin: prometheus.NewDesc(ns+"vap_lat_min_tx", "VAP Latency Minimum Transmit", labelV, nil), - VAPRxGoodbytes: prometheus.NewDesc(ns+"vap_goodbyes_rx", "VAP Goodbyes Received", labelV, nil), - VAPRxLatAvg: prometheus.NewDesc(ns+"vap_lat_avg_rx", "VAP Latency Average Receive", labelV, nil), - VAPRxLatMax: prometheus.NewDesc(ns+"vap_lat_max_rx", "VAP Latency Maximum Receive", labelV, nil), - VAPRxLatMin: prometheus.NewDesc(ns+"vap_lat_min_rx", "VAP Latency Minimum Receive", labelV, nil), - VAPWifiTxLatencyMovAvg: prometheus.NewDesc(ns+"vap_latency_tx_mov_avg", "VAP Latency Moving Average Tramsit", labelV, nil), - VAPWifiTxLatencyMovMax: prometheus.NewDesc(ns+"vap_latency_tx_mov_max", "VAP Latency Moving Maximum Tramsit", labelV, nil), - VAPWifiTxLatencyMovMin: prometheus.NewDesc(ns+"vap_latency_tx_mov_min", "VAP Latency Moving Minimum Tramsit", labelV, nil), - VAPWifiTxLatencyMovTotal: prometheus.NewDesc(ns+"vap_latency_tx_mov_total", "VAP Latency Moving Total Tramsit", labelV, nil), - VAPWifiTxLatencyMovCount: prometheus.NewDesc(ns+"vap_latency_tx_mov_count", "VAP Latency Moving Count Tramsit", labelV, nil), + VAPRxBytes: prometheus.NewDesc(ns+"vap_receive_bytes_total", "VAP Bytes Received", labelV, nil), + VAPRxCrypts: prometheus.NewDesc(ns+"vap_receive_crypts_total", "VAP Crypts Received", labelV, nil), + VAPRxDropped: prometheus.NewDesc(ns+"vap_receive_dropped_total", "VAP Dropped Received", labelV, nil), + VAPRxErrors: prometheus.NewDesc(ns+"vap_receive_errors_total", "VAP Errors Received", labelV, nil), + VAPRxFrags: prometheus.NewDesc(ns+"vap_receive_frags_total", "VAP Frags Received", labelV, nil), + VAPRxNwids: prometheus.NewDesc(ns+"vap_receive_nwids_total", "VAP Nwids Received", labelV, nil), + VAPRxPackets: prometheus.NewDesc(ns+"vap_receive_packets_total", "VAP Packets Received", labelV, nil), + VAPTxBytes: prometheus.NewDesc(ns+"vap_transmit_bytes_total", "VAP Bytes Transmitted", labelV, nil), + VAPTxDropped: prometheus.NewDesc(ns+"vap_transmit_dropped_total", "VAP Dropped Transmitted", labelV, nil), + VAPTxErrors: prometheus.NewDesc(ns+"vap_transmit_errors_total", "VAP Errors Transmitted", labelV, nil), + VAPTxPackets: prometheus.NewDesc(ns+"vap_transmit_packets_total", "VAP Packets Transmitted", labelV, nil), + VAPTxPower: prometheus.NewDesc(ns+"vap_transmit_power", "VAP Transmit Power", labelV, nil), + VAPTxRetries: prometheus.NewDesc(ns+"vap_transmit_retries_total", "VAP Retries Transmitted", labelV, nil), + VAPTxCombinedRetries: prometheus.NewDesc(ns+"vap_transmit_retries_combined_total", "VAP Retries Combined Transmitted", labelV, nil), + VAPTxDataMpduBytes: prometheus.NewDesc(ns+"vap_data_mpdu_transmit_bytes_total", "VAP Data MPDU Bytes Transmitted", labelV, nil), + VAPTxRtsRetries: prometheus.NewDesc(ns+"vap_trnamsit_rts_retries_total", "VAP RTS Retries Transmitted", labelV, nil), + VAPTxSuccess: prometheus.NewDesc(ns+"vap_transmit_success_total", "VAP Success Transmits", labelV, nil), + VAPTxTotal: prometheus.NewDesc(ns+"vap_transmit_total", "VAP Transmit Total", labelV, nil), + VAPTxGoodbytes: prometheus.NewDesc(ns+"vap_transmit_goodbyes", "VAP Goodbyes Transmitted", labelV, nil), + VAPTxLatAvg: prometheus.NewDesc(ns+"vap_transmit_latency_average", "VAP Latency Average Transmit", labelV, nil), + VAPTxLatMax: prometheus.NewDesc(ns+"vap_transmit_latency_maximum", "VAP Latency Maximum Transmit", labelV, nil), + VAPTxLatMin: prometheus.NewDesc(ns+"vap_transmit_latency_minimum", "VAP Latency Minimum Transmit", labelV, nil), + VAPRxGoodbytes: prometheus.NewDesc(ns+"vap_receive_goodbyes", "VAP Goodbyes Received", labelV, nil), + VAPRxLatAvg: prometheus.NewDesc(ns+"vap_receive_latency_average", "VAP Latency Average Receive", labelV, nil), + VAPRxLatMax: prometheus.NewDesc(ns+"vap_receive_latency_maximum", "VAP Latency Maximum Receive", labelV, nil), + VAPRxLatMin: prometheus.NewDesc(ns+"vap_receive_latency_minimum", "VAP Latency Minimum Receive", labelV, nil), + VAPWifiTxLatencyMovAvg: prometheus.NewDesc(ns+"vap_transmit_latency_moving_avg", "VAP Latency Moving Average Tramsit", labelV, nil), + VAPWifiTxLatencyMovMax: prometheus.NewDesc(ns+"vap_transmit_latency_moving_max", "VAP Latency Moving Maximum Tramsit", labelV, nil), + VAPWifiTxLatencyMovMin: prometheus.NewDesc(ns+"vap_transmit_latency_moving_min", "VAP Latency Moving Minimum Tramsit", labelV, nil), + VAPWifiTxLatencyMovTotal: prometheus.NewDesc(ns+"vap_transmit_latency_moving_total", "VAP Latency Moving Total Tramsit", labelV, nil), + VAPWifiTxLatencyMovCount: prometheus.NewDesc(ns+"vap_transmit_latency_moving_count", "VAP Latency Moving Count Tramsit", labelV, nil), // N each - 1 per Radio. 1-4 radios per AP usually RadioCurrentAntennaGain: prometheus.NewDesc(ns+"radio_current_antenna_gain", "Radio Current Antenna Gain", labelR, nil), RadioHt: prometheus.NewDesc(ns+"radio_ht", "Radio HT", labelR, nil), - RadioMaxTxpower: prometheus.NewDesc(ns+"radio_max_tx_power", "Radio Maximum Transmit Power", labelR, nil), - RadioMinTxpower: prometheus.NewDesc(ns+"radio_min_tx_power", "Radio Minimum Transmit Power", labelR, nil), + RadioMaxTxpower: prometheus.NewDesc(ns+"radio_max_transmit_power", "Radio Maximum Transmit Power", labelR, nil), + RadioMinTxpower: prometheus.NewDesc(ns+"radio_min_transmit_power", "Radio Minimum Transmit Power", labelR, nil), RadioNss: prometheus.NewDesc(ns+"radio_nss", "Radio Nss", labelR, nil), RadioRadioCaps: prometheus.NewDesc(ns+"radio_caps", "Radio Capabilities", labelR, nil), - RadioTxPower: prometheus.NewDesc(ns+"radio_tx_power", "Radio Transmit Power", labelR, nil), + RadioTxPower: prometheus.NewDesc(ns+"radio_transmit_power", "Radio Transmit Power", labelR, nil), RadioAstBeXmit: prometheus.NewDesc(ns+"radio_ast_be_xmit", "Radio AstBe Transmit", labelR, nil), RadioChannel: prometheus.NewDesc(ns+"radio_channel", "Radio Channel", labelR, nil), - RadioCuSelfRx: prometheus.NewDesc(ns+"radio_cu_self_rx", "Radio Channel Utilization Receive", labelR, nil), - RadioCuSelfTx: prometheus.NewDesc(ns+"radio_cu_self_tx", "Radio Channel Utilization Transmit", labelR, nil), - RadioCuTotal: prometheus.NewDesc(ns+"radio_cu_total", "Radio Channel Utilization", labelR, nil), + RadioCuSelfRx: prometheus.NewDesc(ns+"radio_channel_utilization_receive", "Radio Channel Utilization Receive", labelR, nil), + RadioCuSelfTx: prometheus.NewDesc(ns+"radio_channel_utilization_transmit", "Radio Channel Utilization Transmit", labelR, nil), + RadioCuTotal: prometheus.NewDesc(ns+"radio_channel_utilization_total", "Radio Channel Utilization", labelR, nil), RadioExtchannel: prometheus.NewDesc(ns+"radio_ext_channel", "Radio Ext Channel", labelR, nil), RadioGain: prometheus.NewDesc(ns+"radio_gain", "Radio Gain", labelR, nil), - RadioGuestNumSta: prometheus.NewDesc(ns+"radio_guest_stations_total", "Radio Guest Station Count", labelR, nil), - RadioNumSta: prometheus.NewDesc(ns+"radio_stations_total", "Radio Total Station Count", labelR, nil), - RadioUserNumSta: prometheus.NewDesc(ns+"radio_user_stations_total", "Radio User Station Count", labelR, nil), - RadioTxPackets: prometheus.NewDesc(ns+"radio_packets_tx_total", "Radio Transmitted Packets", labelR, nil), - RadioTxRetries: prometheus.NewDesc(ns+"radio_retries_tx_total", "Radio Transmit Retries", labelR, nil), + RadioGuestNumSta: prometheus.NewDesc(ns+"radio_num_guest_stations_total", "Radio Guest Station Count", labelR, nil), + RadioNumSta: prometheus.NewDesc(ns+"radio_num_stations_total", "Radio Total Station Count", labelR, nil), + RadioUserNumSta: prometheus.NewDesc(ns+"radio_num_user_stations_total", "Radio User Station Count", labelR, nil), + RadioTxPackets: prometheus.NewDesc(ns+"radio_transmit_packets_total", "Radio Transmitted Packets", labelR, nil), + RadioTxRetries: prometheus.NewDesc(ns+"radio_transmit_retries_total", "Radio Transmit Retries", labelR, nil), } } diff --git a/promunifi/usg.go b/promunifi/usg.go index ffa6ad0e8..6977ffbff 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -64,44 +64,44 @@ func descUSG(ns string) *usg { return &usg{ Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), - TotalTxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Total Transmitted Bytes", labels, nil), - TotalRxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Total Received Bytes", labels, nil), - TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil), - NumSta: prometheus.NewDesc(ns+"stations_total", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"stations_guest_total", "Number of Guest Stations", labels, nil), - NumDesktop: prometheus.NewDesc(ns+"desktops_total", "Number of Desktops", labels, nil), - NumMobile: prometheus.NewDesc(ns+"mobile_total", "Number of Mobiles", labels, nil), - NumHandheld: prometheus.NewDesc(ns+"handheld_total", "Number of Handhelds", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Total Transmitted Bytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil), + TotalBytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Total Bytes Transferred", labels, nil), + NumSta: prometheus.NewDesc(ns+"num_stations_total", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"num_stations_user_total", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest_total", "Number of Guest Stations", labels, nil), + NumDesktop: prometheus.NewDesc(ns+"num_desktops_total", "Number of Desktops", labels, nil), + NumMobile: prometheus.NewDesc(ns+"num_mobile_total", "Number of Mobiles", labels, nil), + NumHandheld: prometheus.NewDesc(ns+"num_handheld_total", "Number of Handhelds", labels, nil), Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil), MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil), MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil), - CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), - Mem: prometheus.NewDesc(ns+"memory_utilization", "System Memory % Utilized", labels, nil), // this may not be %. - WanRxPackets: prometheus.NewDesc(ns+"wan_packets_rx_total", "WAN Receive Packets Total", labelWan, nil), - WanRxBytes: prometheus.NewDesc(ns+"wan_bytes_rx_total", "WAN Receive Bytes Total", labelWan, nil), - WanRxDropped: prometheus.NewDesc(ns+"wan_dropped_rx_total", "WAN Receive Dropped Total", labelWan, nil), - WanRxErrors: prometheus.NewDesc(ns+"wan_errors_rx_total", "WAN Receive Errors Total", labelWan, nil), - WanTxPackets: prometheus.NewDesc(ns+"wan_packets_tx_total", "WAN Transmit Packets Total", labelWan, nil), - WanTxBytes: prometheus.NewDesc(ns+"wan_bytes_tx_total", "WAN Transmit Bytes Total", labelWan, nil), - WanRxBroadcast: prometheus.NewDesc(ns+"wan_broadcast_rx_total", "WAN Receive Broadcast Total", labelWan, nil), - WanRxBytesR: prometheus.NewDesc(ns+"wan_bytes_rx_rate", "WAN Receive Bytes Rate", labelWan, nil), - WanRxMulticast: prometheus.NewDesc(ns+"wan_ulticast_rx_total", "WAN Receive Multicast Total", labelWan, nil), + CPU: prometheus.NewDesc(ns+"cpu_utilization_percent", "System CPU % Utilized", labels, nil), + Mem: prometheus.NewDesc(ns+"memory_utilization_percent", "System Memory % Utilized", labels, nil), + WanRxPackets: prometheus.NewDesc(ns+"wan_receive_packets_total", "WAN Receive Packets Total", labelWan, nil), + WanRxBytes: prometheus.NewDesc(ns+"wan_receive_bytes_total", "WAN Receive Bytes Total", labelWan, nil), + WanRxDropped: prometheus.NewDesc(ns+"wan_receive_dropped_total", "WAN Receive Dropped Total", labelWan, nil), + WanRxErrors: prometheus.NewDesc(ns+"wan_receive_errors_total", "WAN Receive Errors Total", labelWan, nil), + WanTxPackets: prometheus.NewDesc(ns+"wan_transmit_packets_total", "WAN Transmit Packets Total", labelWan, nil), + WanTxBytes: prometheus.NewDesc(ns+"wan_transmit_bytes_total", "WAN Transmit Bytes Total", labelWan, nil), + WanRxBroadcast: prometheus.NewDesc(ns+"wan_receive_broadcast_total", "WAN Receive Broadcast Total", labelWan, nil), + WanRxBytesR: prometheus.NewDesc(ns+"wan_receive_rate_bytes", "WAN Receive Bytes Rate", labelWan, nil), + WanRxMulticast: prometheus.NewDesc(ns+"wan_receive_multicast_total", "WAN Receive Multicast Total", labelWan, nil), WanSpeed: prometheus.NewDesc(ns+"wan_speed", "WAN Speed", labelWan, nil), - WanTxBroadcast: prometheus.NewDesc(ns+"wan_broadcast_tx_total", "WAN Transmit Broadcast Total", labelWan, nil), - WanTxBytesR: prometheus.NewDesc(ns+"wan_bytes_tx_rate", "WAN Transmit Bytes Rate", labelWan, nil), - WanTxDropped: prometheus.NewDesc(ns+"wan_dropped_tx_total", "WAN Transmit Dropped Total", labelWan, nil), - WanTxErrors: prometheus.NewDesc(ns+"wan_errors_tx_total", "WAN Transmit Errors Total", labelWan, nil), - WanTxMulticast: prometheus.NewDesc(ns+"wan_multicast_tx_total", "WAN Transmit Multicast Total", labelWan, nil), - WanBytesR: prometheus.NewDesc(ns+"wan_bytes_rate", "WAN Transfer Rate", labelWan, nil), - LanRxPackets: prometheus.NewDesc(ns+"lan_packets_rx_total", "LAN Receive Packets Total", labels, nil), - LanRxBytes: prometheus.NewDesc(ns+"lan_bytes_rx_total", "LAN Receive Bytes Total", labels, nil), - LanRxDropped: prometheus.NewDesc(ns+"lan_dropped_rx_total", "LAN Receive Dropped Total", labels, nil), - LanTxPackets: prometheus.NewDesc(ns+"lan_packets_tx_total", "LAN Transmit Packets Total", labels, nil), - LanTxBytes: prometheus.NewDesc(ns+"lan_bytes_tx_total", "LAN Transmit Bytes Total", labels, nil), + WanTxBroadcast: prometheus.NewDesc(ns+"wan_transmit_broadcast_total", "WAN Transmit Broadcast Total", labelWan, nil), + WanTxBytesR: prometheus.NewDesc(ns+"wan_transmit_rate_bytes", "WAN Transmit Bytes Rate", labelWan, nil), + WanTxDropped: prometheus.NewDesc(ns+"wan_transmit_dropped_total", "WAN Transmit Dropped Total", labelWan, nil), + WanTxErrors: prometheus.NewDesc(ns+"wan_transmit_errors_total", "WAN Transmit Errors Total", labelWan, nil), + WanTxMulticast: prometheus.NewDesc(ns+"wan_transmit_multicast_total", "WAN Transmit Multicast Total", labelWan, nil), + WanBytesR: prometheus.NewDesc(ns+"wan_rate_bytes", "WAN Transfer Rate", labelWan, nil), + LanRxPackets: prometheus.NewDesc(ns+"lan_receive_packets_total", "LAN Receive Packets Total", labels, nil), + LanRxBytes: prometheus.NewDesc(ns+"lan_receive_bytes_total", "LAN Receive Bytes Total", labels, nil), + LanRxDropped: prometheus.NewDesc(ns+"lan_receive_dropped_total", "LAN Receive Dropped Total", labels, nil), + LanTxPackets: prometheus.NewDesc(ns+"lan_transmit_packets_total", "LAN Transmit Packets Total", labels, nil), + LanTxBytes: prometheus.NewDesc(ns+"lan_transmit_bytes_total", "LAN Transmit Bytes Total", labels, nil), Latency: prometheus.NewDesc(ns+"speedtest_latency", "Speedtest Latency", labels, nil), Runtime: prometheus.NewDesc(ns+"speedtest_runtime", "Speedtest Run Time", labels, nil), XputDownload: prometheus.NewDesc(ns+"speedtest_download_rate", "Speedtest Download Rate", labels, nil), diff --git a/promunifi/usw.go b/promunifi/usw.go index adae94eb7..e6e60f78c 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -84,55 +84,55 @@ func descUSW(ns string) *usw { TotalTxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Total Transmitted Bytes", labels, nil), TotalRxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil), - NumSta: prometheus.NewDesc(ns+"stations_total", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"stations_user_total", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"stations_guest_total", "Number of Guest Stations", labels, nil), + NumSta: prometheus.NewDesc(ns+"num_stations_total", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"num_stations_user_total", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest_total", "Number of Guest Stations", labels, nil), Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil), MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil), MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil), - CPU: prometheus.NewDesc(ns+"cpu_utilization", "System CPU % Utilized", labels, nil), - Mem: prometheus.NewDesc(ns+"memory_utilization", "System Memory % Utilized", labels, nil), // this may not be %. + CPU: prometheus.NewDesc(ns+"cpu_utilization_percent", "System CPU % Utilized", labels, nil), + Mem: prometheus.NewDesc(ns+"memory_utilization_percent", "System Memory % Utilized", labels, nil), - SwRxPackets: prometheus.NewDesc(ns+"switch_packets_rx_total", "Switch Packets Received Total", labels, nil), - SwRxBytes: prometheus.NewDesc(ns+"switch_bytes_rx_total", "Switch Bytes Received Total", labels, nil), - SwRxErrors: prometheus.NewDesc(ns+"switch_errors_rx_total", "Switch Errors Received Total", labels, nil), - SwRxDropped: prometheus.NewDesc(ns+"switch_dropped_rx_total", "Switch Dropped Received Total", labels, nil), - SwRxCrypts: prometheus.NewDesc(ns+"switch_crypts_rx_total", "Switch Crypts Received Total", labels, nil), - SwRxFrags: prometheus.NewDesc(ns+"switch_frags_rx_total", "Switch Frags Received Total", labels, nil), - SwTxPackets: prometheus.NewDesc(ns+"switch_packets_tx_total", "Switch Packets Transmit Total", labels, nil), - SwTxBytes: prometheus.NewDesc(ns+"switch_bytes_tx_total", "Switch Bytes Transmit Total", labels, nil), - SwTxErrors: prometheus.NewDesc(ns+"switch_errors_tx_total", "Switch Errors Transmit Total", labels, nil), - SwTxDropped: prometheus.NewDesc(ns+"switch_dropped_tx_total", "Switch Dropped Transmit Total", labels, nil), - SwTxRetries: prometheus.NewDesc(ns+"switch_retries_tx_total", "Switch Retries Transmit Total", labels, nil), - SwRxMulticast: prometheus.NewDesc(ns+"switch_multicast_rx_total", "Switch Multicast Receive Total", labels, nil), - SwRxBroadcast: prometheus.NewDesc(ns+"switch_broadcast_rx_total", "Switch Broadcast Receive Total", labels, nil), - SwTxMulticast: prometheus.NewDesc(ns+"switch_multicast_tx_total", "Switch Multicast Transmit Total", labels, nil), - SwTxBroadcast: prometheus.NewDesc(ns+"switch_broadcast_tx_total", "Switch Broadcast Transmit Total", labels, nil), + SwRxPackets: prometheus.NewDesc(ns+"switch_receive_packets_total", "Switch Packets Received Total", labels, nil), + SwRxBytes: prometheus.NewDesc(ns+"switch_receive_bytes_total", "Switch Bytes Received Total", labels, nil), + SwRxErrors: prometheus.NewDesc(ns+"switch_receive_errors_total", "Switch Errors Received Total", labels, nil), + SwRxDropped: prometheus.NewDesc(ns+"switch_receive_dropped_total", "Switch Dropped Received Total", labels, nil), + SwRxCrypts: prometheus.NewDesc(ns+"switch_receive_crypts_total", "Switch Crypts Received Total", labels, nil), + SwRxFrags: prometheus.NewDesc(ns+"switch_receive_frags_total", "Switch Frags Received Total", labels, nil), + SwTxPackets: prometheus.NewDesc(ns+"switch_transmit_packets_total", "Switch Packets Transmit Total", labels, nil), + SwTxBytes: prometheus.NewDesc(ns+"switch_transmit_bytes_total", "Switch Bytes Transmit Total", labels, nil), + SwTxErrors: prometheus.NewDesc(ns+"switch_transmit_errors_total", "Switch Errors Transmit Total", labels, nil), + SwTxDropped: prometheus.NewDesc(ns+"switch_transmit_dropped_total", "Switch Dropped Transmit Total", labels, nil), + SwTxRetries: prometheus.NewDesc(ns+"switch_transmit_retries_total", "Switch Retries Transmit Total", labels, nil), + SwRxMulticast: prometheus.NewDesc(ns+"switch_receive_multicast_total", "Switch Multicast Receive Total", labels, nil), + SwRxBroadcast: prometheus.NewDesc(ns+"switch_receive_broadcast_total", "Switch Broadcast Receive Total", labels, nil), + SwTxMulticast: prometheus.NewDesc(ns+"switch_transmit_multicast_total", "Switch Multicast Transmit Total", labels, nil), + SwTxBroadcast: prometheus.NewDesc(ns+"switch_transmit_broadcast_total", "Switch Broadcast Transmit Total", labels, nil), SwBytes: prometheus.NewDesc(ns+"switch_bytes_total", "Switch Bytes Transferred Total", labels, nil), // per-port data PoeCurrent: prometheus.NewDesc(pns+"poe_current", "POE Current", labelP, nil), PoePower: prometheus.NewDesc(pns+"poe_power", "POE Power", labelP, nil), PoeVoltage: prometheus.NewDesc(pns+"poe_voltage", "POE Voltage", labelP, nil), - RxBroadcast: prometheus.NewDesc(pns+"broadcast_rx_total", "Receive Broadcast", labelP, nil), - RxBytes: prometheus.NewDesc(pns+"bytes_rx_total", "Total Receive Bytes", labelP, nil), - RxBytesR: prometheus.NewDesc(pns+"bytes_rx_rate", "Receive Bytes Rate", labelP, nil), - RxDropped: prometheus.NewDesc(pns+"dropped_rx_total", "Total Receive Dropped", labelP, nil), - RxErrors: prometheus.NewDesc(pns+"errors_rx_total", "Total Receive Errors", labelP, nil), - RxMulticast: prometheus.NewDesc(pns+"multicast_rx_total", "Total Receive Multicast", labelP, nil), - RxPackets: prometheus.NewDesc(pns+"packets_rx_total", "Total Receive Packets", labelP, nil), + RxBroadcast: prometheus.NewDesc(pns+"receive_broadcast_total", "Receive Broadcast", labelP, nil), + RxBytes: prometheus.NewDesc(pns+"receive_bytes_total", "Total Receive Bytes", labelP, nil), + RxBytesR: prometheus.NewDesc(pns+"receive_rate_bytes", "Receive Bytes Rate", labelP, nil), + RxDropped: prometheus.NewDesc(pns+"receive_dropped_total", "Total Receive Dropped", labelP, nil), + RxErrors: prometheus.NewDesc(pns+"receive_errors_total", "Total Receive Errors", labelP, nil), + RxMulticast: prometheus.NewDesc(pns+"receive_multicast_total", "Total Receive Multicast", labelP, nil), + RxPackets: prometheus.NewDesc(pns+"receive_packets_total", "Total Receive Packets", labelP, nil), Satisfaction: prometheus.NewDesc(pns+"satisfaction", "Satisfaction", labelP, nil), - Speed: prometheus.NewDesc(pns+"speed", "Speed", labelP, nil), - TxBroadcast: prometheus.NewDesc(pns+"broadcast_tx_total", "Total Transmit Broadcast", labelP, nil), - TxBytes: prometheus.NewDesc(pns+"bytes_tx_total", "Total Transmit Bytes", labelP, nil), - TxBytesR: prometheus.NewDesc(pns+"bytes_tx_rate", "Transmit Bytes Rate", labelP, nil), - TxDropped: prometheus.NewDesc(pns+"dropped_tx_total", "Total Transmit Dropped", labelP, nil), - TxErrors: prometheus.NewDesc(pns+"errors_tx_total", "Total Transmit Errors", labelP, nil), - TxMulticast: prometheus.NewDesc(pns+"multicast_tx_total", "Total Tranmist Multicast", labelP, nil), - TxPackets: prometheus.NewDesc(pns+"packets_tx_total", "Total Transmit Packets", labelP, nil), + Speed: prometheus.NewDesc(pns+"port_speed", "Speed", labelP, nil), + TxBroadcast: prometheus.NewDesc(pns+"transmit_broadcast_total", "Total Transmit Broadcast", labelP, nil), + TxBytes: prometheus.NewDesc(pns+"transmit_bytes_total", "Total Transmit Bytes", labelP, nil), + TxBytesR: prometheus.NewDesc(pns+"transmit_rate_bytes", "Transmit Bytes Rate", labelP, nil), + TxDropped: prometheus.NewDesc(pns+"transmit_dropped_total", "Total Transmit Dropped", labelP, nil), + TxErrors: prometheus.NewDesc(pns+"transmit_errors_total", "Total Transmit Errors", labelP, nil), + TxMulticast: prometheus.NewDesc(pns+"transmit_multicast_total", "Total Tranmist Multicast", labelP, nil), + TxPackets: prometheus.NewDesc(pns+"transmit_packets_total", "Total Transmit Packets", labelP, nil), } } From a1b47e7242a8f25dbf68676a90eace9a9654c308 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Wed, 27 Nov 2019 21:33:22 -0800 Subject: [PATCH 49/85] fix linter --- promunifi/site.go | 81 +++++++++++++++++++++++++---------------------- 1 file changed, 44 insertions(+), 37 deletions(-) diff --git a/promunifi/site.go b/promunifi/site.go index 9ee5ee8e3..4e1ca9369 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -5,6 +5,14 @@ import ( "golift.io/unifi" ) +const ( + subsystemLAN = "lan" + subsystemVPN = "vpn" + subsystemWWW = "www" + subsystemWLAN = "wlan" + subsystemWAN = "wan" +) + type site struct { NumUser *prometheus.Desc NumGuest *prometheus.Desc @@ -75,12 +83,11 @@ func (u *unifiCollector) exportSites(sites unifi.Sites, r *Report) { for _, h := range s.Health { l := append([]string{h.Subsystem, h.Status}, labels...) - if h.Subsystem != "vpn" { + if h.Subsystem != subsystemVPN { metrics = append(metrics, []*metricExports{ {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR.Val, l}, {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR.Val, l}, }...) - } else { metrics = append(metrics, []*metricExports{ {u.Site.RemoteUserNumActive, prometheus.CounterValue, h.RemoteUserNumActive.Val, l}, @@ -92,51 +99,51 @@ func (u *unifiCollector) exportSites(sites unifi.Sites, r *Report) { }...) } - if h.Subsystem == "lan" || h.Subsystem == "wlan" || h.Subsystem == "wan" { + if h.Subsystem == subsystemWWW { metrics = append(metrics, []*metricExports{ - {u.Site.NumAdopted, prometheus.CounterValue, h.NumAdopted.Val, l}, - {u.Site.NumDisconnected, prometheus.CounterValue, h.NumDisconnected.Val, l}, - {u.Site.NumPending, prometheus.CounterValue, h.NumPending.Val, l}, + {u.Site.Uptime, prometheus.GaugeValue, h.Latency.Val, l}, + {u.Site.Latency, prometheus.GaugeValue, h.Latency.Val, l}, + {u.Site.XputUp, prometheus.GaugeValue, h.XputUp.Val, l}, + {u.Site.XputDown, prometheus.GaugeValue, h.XputDown.Val, l}, + {u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing.Val, l}, + {u.Site.Drops, prometheus.CounterValue, h.Drops.Val, l}, }...) } - if h.Subsystem == "lan" || h.Subsystem == "wlan" { + if h.Subsystem == subsystemLAN || h.Subsystem == subsystemWLAN || h.Subsystem == subsystemWAN { metrics = append(metrics, []*metricExports{ - {u.Site.NumUser, prometheus.CounterValue, h.NumUser.Val, l}, - {u.Site.NumGuest, prometheus.CounterValue, h.NumGuest.Val, l}, - {u.Site.NumIot, prometheus.CounterValue, h.NumIot.Val, l}, + {u.Site.NumAdopted, prometheus.CounterValue, h.NumAdopted.Val, l}, + {u.Site.NumDisconnected, prometheus.CounterValue, h.NumDisconnected.Val, l}, + {u.Site.NumPending, prometheus.CounterValue, h.NumPending.Val, l}, }...) - } - if h.Subsystem == "wlan" { - metrics = append(metrics, []*metricExports{ - {u.Site.NumAp, prometheus.CounterValue, h.NumAp.Val, l}, - {u.Site.NumDisabled, prometheus.CounterValue, h.NumDisabled.Val, l}, - }...) - } + if h.Subsystem == subsystemLAN || h.Subsystem == subsystemWLAN { + metrics = append(metrics, []*metricExports{ + {u.Site.NumUser, prometheus.CounterValue, h.NumUser.Val, l}, + {u.Site.NumGuest, prometheus.CounterValue, h.NumGuest.Val, l}, + {u.Site.NumIot, prometheus.CounterValue, h.NumIot.Val, l}, + }...) + } - if h.Subsystem == "wan" { - metrics = append(metrics, []*metricExports{ - {u.Site.NumGw, prometheus.CounterValue, h.NumGw.Val, l}, - {u.Site.NumSta, prometheus.CounterValue, h.NumSta.Val, l}, - }...) - } + if h.Subsystem == subsystemWLAN { + metrics = append(metrics, []*metricExports{ + {u.Site.NumAp, prometheus.CounterValue, h.NumAp.Val, l}, + {u.Site.NumDisabled, prometheus.CounterValue, h.NumDisabled.Val, l}, + }...) + } - if h.Subsystem == "lan" { - metrics = append(metrics, []*metricExports{ - {u.Site.NumSw, prometheus.CounterValue, h.NumSw.Val, l}, - }...) - } + if h.Subsystem == subsystemWAN { + metrics = append(metrics, []*metricExports{ + {u.Site.NumGw, prometheus.CounterValue, h.NumGw.Val, l}, + {u.Site.NumSta, prometheus.CounterValue, h.NumSta.Val, l}, + }...) + } - if h.Subsystem == "www" { - metrics = append(metrics, []*metricExports{ - {u.Site.Uptime, prometheus.GaugeValue, h.Latency.Val, l}, - {u.Site.Latency, prometheus.GaugeValue, h.Latency.Val, l}, - {u.Site.XputUp, prometheus.GaugeValue, h.XputUp.Val, l}, - {u.Site.XputDown, prometheus.GaugeValue, h.XputDown.Val, l}, - {u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing.Val, l}, - {u.Site.Drops, prometheus.CounterValue, h.Drops.Val, l}, - }...) + if h.Subsystem == subsystemLAN { + metrics = append(metrics, []*metricExports{ + {u.Site.NumSw, prometheus.CounterValue, h.NumSw.Val, l}, + }...) + } } } r.ch <- metrics From ad29c5906863d87f9d8952e94d6f215a8ac2f3a8 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Wed, 27 Nov 2019 22:04:12 -0800 Subject: [PATCH 50/85] clean up site and clients --- promunifi/clients.go | 121 +++++++++++++++++++++++-------------------- promunifi/site.go | 4 ++ promunifi/usg.go | 4 +- 3 files changed, 72 insertions(+), 57 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 78705fc35..68ad18ed8 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -43,84 +43,95 @@ func descClient(ns string) *uclient { ns = "client_" } - labels := []string{"id", "mac", "user_id", "site_id", "site_name", - "network_id", "ap_mac", "gw_mac", "sw_mac", "ap_name", "gw_name", - "sw_name", "radio_name", "radio", "radio_proto", "name", "channel", - "vlan", "ip", "essid", "bssid", "radio_desc"} + labels := []string{"name", "mac", "user_id", "site_name", "gw_mac", "gw_name", "sw_mac", "sw_name", "vlan", "ip"} + labelWired := append([]string{"sw_port"}, labels...) + labelWireless := append([]string{"ap_mac", "ap_name", "radio_name", "radio", "radio_proto", "channel", "essid", "bssid", "radio_desc"}, labels...) return &uclient{ - Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labels, nil), - BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labels, nil), - CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labels, nil), - Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labels, nil), - RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labels, nil), - RSSI: prometheus.NewDesc(ns+"rssi", "Client RSSI", labels, nil), - RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labels, nil), - RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labels, nil), - RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labels, nil), - RxRate: prometheus.NewDesc(ns+"radio_receive_rate", "Client Receive Rate", labels, nil), - Signal: prometheus.NewDesc(ns+"radio_signal", "Client Signal Strength", labels, nil), - TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labels, nil), - TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labels, nil), - TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labels, nil), - TxPower: prometheus.NewDesc(ns+"radio_transmit_power", "Client Transmit Power", labels, nil), - TxRate: prometheus.NewDesc(ns+"radio_transmit_rate", "Client Transmit Rate", labels, nil), - Uptime: prometheus.NewDesc(ns+"uptime", "Client Uptime", labels, nil), - WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labels, nil), - WiredRxBytes: prometheus.NewDesc(ns+"wired_receive_bytes_total", "Client Wired Receive Bytes", labels, nil), - WiredRxBytesR: prometheus.NewDesc(ns+"wired_receive_rate_bytes", "Client Wired Receive Data Rate", labels, nil), - WiredRxPackets: prometheus.NewDesc(ns+"wired_receive_packets_total", "Client Wired Receive Packets", labels, nil), - WiredTxBytes: prometheus.NewDesc(ns+"wired_transmit_bytes_total", "Client Wired Transmit Bytes", labels, nil), - WiredTxBytesR: prometheus.NewDesc(ns+"wired_transmit_rate_bytes", "Client Wired Data Rate", labels, nil), - WiredTxPackets: prometheus.NewDesc(ns+"wired_transmit_packets_total", "Client Wired Transmit Packets", labels, nil), + Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labelWireless, nil), + BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labelWireless, nil), + CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labelWireless, nil), + Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labelWireless, nil), + RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labelWireless, nil), + RSSI: prometheus.NewDesc(ns+"rssi", "Client RSSI", labelWireless, nil), + RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labelWireless, nil), + RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labelWireless, nil), + RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labelWireless, nil), + RxRate: prometheus.NewDesc(ns+"radio_receive_rate", "Client Receive Rate", labelWireless, nil), + Signal: prometheus.NewDesc(ns+"radio_signal", "Client Signal Strength", labelWireless, nil), + TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labelWireless, nil), + TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labelWireless, nil), + TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labelWireless, nil), + TxPower: prometheus.NewDesc(ns+"radio_transmit_power", "Client Transmit Power", labelWireless, nil), + TxRate: prometheus.NewDesc(ns+"radio_transmit_rate", "Client Transmit Rate", labelWireless, nil), + WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelWireless, nil), + + WiredRxBytes: prometheus.NewDesc(ns+"wired_receive_bytes_total", "Client Wired Receive Bytes", labelWired, nil), + WiredRxBytesR: prometheus.NewDesc(ns+"wired_receive_rate_bytes", "Client Wired Receive Data Rate", labelWired, nil), + WiredRxPackets: prometheus.NewDesc(ns+"wired_receive_packets_total", "Client Wired Receive Packets", labelWired, nil), + WiredTxBytes: prometheus.NewDesc(ns+"wired_transmit_bytes_total", "Client Wired Transmit Bytes", labelWired, nil), + WiredTxBytesR: prometheus.NewDesc(ns+"wired_transmit_rate_bytes", "Client Wired Data Rate", labelWired, nil), + WiredTxPackets: prometheus.NewDesc(ns+"wired_transmit_packets_total", "Client Wired Transmit Packets", labelWired, nil), + + Uptime: prometheus.NewDesc(ns+"uptime", "Client Uptime", labels, nil), + /* needs more "looking into" DpiStatsApp: prometheus.NewDesc(ns+"dpi_stats_app", "Client DPI Stats App", labels, nil), DpiStatsCat: prometheus.NewDesc(ns+"dpi_stats_cat", "Client DPI Stats Cat", labels, nil), DpiStatsRxBytes: prometheus.NewDesc(ns+"dpi_stats_receive_bytes_total", "Client DPI Stats Receive Bytes", labels, nil), DpiStatsRxPackets: prometheus.NewDesc(ns+"dpi_stats_receive_packets_total", "Client DPI Stats Receive Packets", labels, nil), DpiStatsTxBytes: prometheus.NewDesc(ns+"dpi_stats_transmit_bytes_total", "Client DPI Stats Transmit Bytes", labels, nil), DpiStatsTxPackets: prometheus.NewDesc(ns+"dpi_stats_transmit_packets_total", "Client DPI Stats Transmit Packets", labels, nil), + */ } } func (u *unifiCollector) exportClients(clients []*unifi.Client, r *Report) { for _, c := range clients { - labels := []string{c.ID, c.Mac, c.UserID, c.SiteID, c.SiteName, - c.NetworkID, c.ApMac, c.GwMac, c.SwMac, c.ApName, c.GwName, - c.SwName, c.RadioName, c.Radio, c.RadioProto, c.Name, c.Channel.Txt, - c.Vlan.Txt, c.IP, c.Essid, c.Bssid, c.RadioDescription, + labels := []string{c.Name, c.Mac, c.UserID, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP} + labelWired := append([]string{c.SwPort.Txt}, labels...) + labelWireless := append([]string{c.ApMac, c.ApName, c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription}, labels...) + + if c.IsWired.Val { + r.ch <- []*metricExports{ + {u.Client.WiredRxBytes, prometheus.CounterValue, c.WiredRxBytes, labelWired}, + {u.Client.WiredRxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labelWired}, + {u.Client.WiredRxPackets, prometheus.CounterValue, c.WiredRxPackets, labelWired}, + {u.Client.WiredTxBytes, prometheus.CounterValue, c.WiredTxBytes, labelWired}, + {u.Client.WiredTxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labelWired}, + {u.Client.WiredTxPackets, prometheus.CounterValue, c.WiredTxPackets, labelWired}, + } + } else { + r.ch <- []*metricExports{ + {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labelWireless}, + {u.Client.CCQ, prometheus.GaugeValue, c.Ccq, labelWireless}, + {u.Client.Noise, prometheus.GaugeValue, c.Noise, labelWireless}, + {u.Client.RoamCount, prometheus.CounterValue, c.RoamCount, labelWireless}, + {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labelWireless}, + {u.Client.Signal, prometheus.GaugeValue, c.Signal, labelWireless}, + {u.Client.TxPower, prometheus.GaugeValue, c.TxPower, labelWireless}, + {u.Client.TxRate, prometheus.GaugeValue, c.TxRate, labelWireless}, + {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labelWireless}, + {u.Client.RxRate, prometheus.GaugeValue, c.RxRate, labelWireless}, + {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labelWireless}, + {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labelWireless}, + {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labelWireless}, + {u.Client.RxBytes, prometheus.CounterValue, c.RxBytes, labelWireless}, + {u.Client.RxBytesR, prometheus.GaugeValue, c.RxBytesR, labelWireless}, + {u.Client.RxPackets, prometheus.CounterValue, c.RxPackets, labelWireless}, + {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labelWireless}, + } } r.ch <- []*metricExports{ - {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labels}, - {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labels}, - {u.Client.CCQ, prometheus.GaugeValue, c.Ccq, labels}, - {u.Client.Noise, prometheus.GaugeValue, c.Noise, labels}, - {u.Client.RoamCount, prometheus.CounterValue, c.RoamCount, labels}, - {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labels}, - {u.Client.RxBytes, prometheus.CounterValue, c.RxBytes, labels}, - {u.Client.RxBytesR, prometheus.GaugeValue, c.RxBytesR, labels}, - {u.Client.RxPackets, prometheus.CounterValue, c.RxPackets, labels}, - {u.Client.RxRate, prometheus.GaugeValue, c.RxRate, labels}, - {u.Client.Signal, prometheus.GaugeValue, c.Signal, labels}, - {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labels}, - {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labels}, - {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labels}, - {u.Client.TxPower, prometheus.GaugeValue, c.TxPower, labels}, - {u.Client.TxRate, prometheus.GaugeValue, c.TxRate, labels}, {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, - {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labels}, - {u.Client.WiredRxBytes, prometheus.CounterValue, c.WiredRxBytes, labels}, - {u.Client.WiredRxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labels}, - {u.Client.WiredRxPackets, prometheus.CounterValue, c.WiredRxPackets, labels}, - {u.Client.WiredTxBytes, prometheus.CounterValue, c.WiredTxBytes, labels}, - {u.Client.WiredTxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labels}, - {u.Client.WiredTxPackets, prometheus.CounterValue, c.WiredTxPackets, labels}, + /* needs more "looking into" {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat, labels}, {u.Client.DpiStatsRxBytes, prometheus.CounterValue, c.DpiStats.RxBytes, labels}, {u.Client.DpiStatsRxPackets, prometheus.CounterValue, c.DpiStats.RxPackets, labels}, {u.Client.DpiStatsTxBytes, prometheus.CounterValue, c.DpiStats.TxBytes, labels}, {u.Client.DpiStatsTxPackets, prometheus.CounterValue, c.DpiStats.TxPackets, labels}, + */ } } } diff --git a/promunifi/site.go b/promunifi/site.go index 4e1ca9369..61ebbe050 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -5,6 +5,8 @@ import ( "golift.io/unifi" ) +// Each site has five subsystems. +// Some of them share data, but generally each one has its own data set. const ( subsystemLAN = "lan" subsystemVPN = "vpn" @@ -80,6 +82,7 @@ func (u *unifiCollector) exportSites(sites unifi.Sites, r *Report) { for _, s := range sites { metrics := []*metricExports{} labels := []string{s.Name, s.Desc, s.SiteName} + for _, h := range s.Health { l := append([]string{h.Subsystem, h.Status}, labels...) @@ -146,6 +149,7 @@ func (u *unifiCollector) exportSites(sites unifi.Sites, r *Report) { } } } + r.ch <- metrics } } diff --git a/promunifi/usg.go b/promunifi/usg.go index 6977ffbff..396f0f6a6 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -59,7 +59,7 @@ func descUSG(ns string) *usg { ns = "usg_" } labels := []string{"site_name", "mac", "model", "name", "serial", "site_id", - "type", "version", "device_id", "ip"} + "type", "version", "ip"} labelWan := append([]string{"port"}, labels...) return &usg{ @@ -112,7 +112,7 @@ func descUSG(ns string) *usg { func (u *unifiCollector) exportUSGs(usgs []*unifi.USG, r *Report) { for _, s := range usgs { labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID, - s.Type, s.Version, s.DeviceID, s.IP} + s.Type, s.Version, s.IP} labelWan := append([]string{"all"}, labels...) // Gateway System Data. From 0cb23507353b359c18cf7ebe57ae06dffead9f3c Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Wed, 27 Nov 2019 22:20:48 -0800 Subject: [PATCH 51/85] trim a few more zeros --- promunifi/clients.go | 74 ++++++++++++++++++++++---------------------- promunifi/usw.go | 28 +++++++++++------ 2 files changed, 56 insertions(+), 46 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 68ad18ed8..5ad0e2eae 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -43,35 +43,37 @@ func descClient(ns string) *uclient { ns = "client_" } - labels := []string{"name", "mac", "user_id", "site_name", "gw_mac", "gw_name", "sw_mac", "sw_name", "vlan", "ip"} + labels := []string{"name", "mac", "site_name", "gw_mac", "gw_name", "sw_mac", "sw_name", "vlan", "ip", "oui", "network"} labelWired := append([]string{"sw_port"}, labels...) labelWireless := append([]string{"ap_mac", "ap_name", "radio_name", "radio", "radio_proto", "channel", "essid", "bssid", "radio_desc"}, labels...) + wireless := prometheus.Labels{"wired": "false"} + wired := prometheus.Labels{"wired": "true"} return &uclient{ - Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labelWireless, nil), - BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labelWireless, nil), - CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labelWireless, nil), - Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labelWireless, nil), - RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labelWireless, nil), - RSSI: prometheus.NewDesc(ns+"rssi", "Client RSSI", labelWireless, nil), - RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labelWireless, nil), - RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labelWireless, nil), - RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labelWireless, nil), - RxRate: prometheus.NewDesc(ns+"radio_receive_rate", "Client Receive Rate", labelWireless, nil), - Signal: prometheus.NewDesc(ns+"radio_signal", "Client Signal Strength", labelWireless, nil), - TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labelWireless, nil), - TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labelWireless, nil), - TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labelWireless, nil), - TxPower: prometheus.NewDesc(ns+"radio_transmit_power", "Client Transmit Power", labelWireless, nil), - TxRate: prometheus.NewDesc(ns+"radio_transmit_rate", "Client Transmit Rate", labelWireless, nil), - WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelWireless, nil), + Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labelWireless, wireless), + BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labelWireless, wireless), + CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labelWireless, wireless), + Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labelWireless, wireless), + RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labelWireless, wireless), + RSSI: prometheus.NewDesc(ns+"rssi", "Client RSSI", labelWireless, wireless), + RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labelWireless, wireless), + RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labelWireless, wireless), + RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labelWireless, wireless), + RxRate: prometheus.NewDesc(ns+"radio_receive_rate", "Client Receive Rate", labelWireless, wireless), + Signal: prometheus.NewDesc(ns+"radio_signal", "Client Signal Strength", labelWireless, wireless), + TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labelWireless, wireless), + TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labelWireless, wireless), + TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labelWireless, wireless), + TxPower: prometheus.NewDesc(ns+"radio_transmit_power", "Client Transmit Power", labelWireless, wireless), + TxRate: prometheus.NewDesc(ns+"radio_transmit_rate", "Client Transmit Rate", labelWireless, wireless), + WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelWireless, wireless), - WiredRxBytes: prometheus.NewDesc(ns+"wired_receive_bytes_total", "Client Wired Receive Bytes", labelWired, nil), - WiredRxBytesR: prometheus.NewDesc(ns+"wired_receive_rate_bytes", "Client Wired Receive Data Rate", labelWired, nil), - WiredRxPackets: prometheus.NewDesc(ns+"wired_receive_packets_total", "Client Wired Receive Packets", labelWired, nil), - WiredTxBytes: prometheus.NewDesc(ns+"wired_transmit_bytes_total", "Client Wired Transmit Bytes", labelWired, nil), - WiredTxBytesR: prometheus.NewDesc(ns+"wired_transmit_rate_bytes", "Client Wired Data Rate", labelWired, nil), - WiredTxPackets: prometheus.NewDesc(ns+"wired_transmit_packets_total", "Client Wired Transmit Packets", labelWired, nil), + WiredRxBytes: prometheus.NewDesc(ns+"wired_receive_bytes_total", "Client Wired Receive Bytes", labelWired, wired), + WiredRxBytesR: prometheus.NewDesc(ns+"wired_receive_rate_bytes", "Client Wired Receive Data Rate", labelWired, wired), + WiredRxPackets: prometheus.NewDesc(ns+"wired_receive_packets_total", "Client Wired Receive Packets", labelWired, wired), + WiredTxBytes: prometheus.NewDesc(ns+"wired_transmit_bytes_total", "Client Wired Transmit Bytes", labelWired, wired), + WiredTxBytesR: prometheus.NewDesc(ns+"wired_transmit_rate_bytes", "Client Wired Data Rate", labelWired, wired), + WiredTxPackets: prometheus.NewDesc(ns+"wired_transmit_packets_total", "Client Wired Transmit Packets", labelWired, wired), Uptime: prometheus.NewDesc(ns+"uptime", "Client Uptime", labels, nil), /* needs more "looking into" @@ -87,7 +89,7 @@ func descClient(ns string) *uclient { func (u *unifiCollector) exportClients(clients []*unifi.Client, r *Report) { for _, c := range clients { - labels := []string{c.Name, c.Mac, c.UserID, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP} + labels := []string{c.Name, c.Mac, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network} labelWired := append([]string{c.SwPort.Txt}, labels...) labelWireless := append([]string{c.ApMac, c.ApName, c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription}, labels...) @@ -99,6 +101,7 @@ func (u *unifiCollector) exportClients(clients []*unifi.Client, r *Report) { {u.Client.WiredTxBytes, prometheus.CounterValue, c.WiredTxBytes, labelWired}, {u.Client.WiredTxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labelWired}, {u.Client.WiredTxPackets, prometheus.CounterValue, c.WiredTxPackets, labelWired}, + {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, } } else { r.ch <- []*metricExports{ @@ -119,19 +122,16 @@ func (u *unifiCollector) exportClients(clients []*unifi.Client, r *Report) { {u.Client.RxBytesR, prometheus.GaugeValue, c.RxBytesR, labelWireless}, {u.Client.RxPackets, prometheus.CounterValue, c.RxPackets, labelWireless}, {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labelWireless}, + {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, } } - - r.ch <- []*metricExports{ - {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, - /* needs more "looking into" - {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, - {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat, labels}, - {u.Client.DpiStatsRxBytes, prometheus.CounterValue, c.DpiStats.RxBytes, labels}, - {u.Client.DpiStatsRxPackets, prometheus.CounterValue, c.DpiStats.RxPackets, labels}, - {u.Client.DpiStatsTxBytes, prometheus.CounterValue, c.DpiStats.TxBytes, labels}, - {u.Client.DpiStatsTxPackets, prometheus.CounterValue, c.DpiStats.TxPackets, labels}, - */ - } + /* needs more "looking into" + {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, + {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat, labels}, + {u.Client.DpiStatsRxBytes, prometheus.CounterValue, c.DpiStats.RxBytes, labels}, + {u.Client.DpiStatsRxPackets, prometheus.CounterValue, c.DpiStats.RxPackets, labels}, + {u.Client.DpiStatsTxBytes, prometheus.CounterValue, c.DpiStats.TxBytes, labels}, + {u.Client.DpiStatsTxPackets, prometheus.CounterValue, c.DpiStats.TxPackets, labels}, + */ } } diff --git a/promunifi/usw.go b/promunifi/usw.go index e6e60f78c..27bed7447 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -70,7 +70,7 @@ func descUSW(ns string) *usw { } pns := ns + "port_" // The first five labels for switch are shared with (the same as) switch ports. - labels := []string{"type", "version", "device_id", "ip", + labels := []string{"type", "version", "ip", "site_name", "mac", "model", "name", "serial", "site_id"} // Copy labels, and replace first four with different names. labelP := append([]string{"port_num", "port_name", "port_mac", "port_ip"}, labels[5:]...) @@ -138,15 +138,21 @@ func descUSW(ns string) *usw { func (u *unifiCollector) exportUSWs(usws []*unifi.USW, r *Report) { for _, s := range usws { - labels := []string{s.Type, s.Version, s.DeviceID, s.IP, + labels := []string{s.Type, s.Version, s.IP, s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID} + metrics := []*metricExports{} + if s.HasTemperature.Val { + metrics = append(metrics, &metricExports{u.USW.Temperature, prometheus.GaugeValue, s.GeneralTemperature, labels}) + } + if s.HasFan.Val { + metrics = append(metrics, &metricExports{u.USW.FanLevel, prometheus.GaugeValue, s.FanLevel, labels}) + } + // Switch data. - r.ch <- append([]*metricExports{ + r.ch <- append(metrics, append([]*metricExports{ {u.USW.Uptime, prometheus.GaugeValue, s.Uptime, labels}, - {u.USW.Temperature, prometheus.GaugeValue, s.GeneralTemperature, labels}, {u.USW.TotalMaxPower, prometheus.GaugeValue, s.TotalMaxPower, labels}, - {u.USW.FanLevel, prometheus.GaugeValue, s.FanLevel, labels}, {u.USW.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, {u.USW.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, {u.USW.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, @@ -177,7 +183,7 @@ func (u *unifiCollector) exportUSWs(usws []*unifi.USW, r *Report) { {u.USW.SwTxMulticast, prometheus.CounterValue, s.Stat.Sw.TxMulticast, labels}, {u.USW.SwTxBroadcast, prometheus.CounterValue, s.Stat.Sw.TxBroadcast, labels}, {u.USW.SwBytes, prometheus.CounterValue, s.Stat.Sw.Bytes, labels}, - }, u.exportPortTable(s.PortTable, labels[5:])...) + }, u.exportPortTable(s.PortTable, labels[5:])...)...) } } @@ -187,10 +193,14 @@ func (u *unifiCollector) exportPortTable(pt []unifi.Port, labels []string) []*me for _, p := range pt { // Copy labels, and add four new ones. l := append([]string{p.PortIdx.Txt, p.Name, p.Mac, p.IP}, labels...) + if p.PoeEnable.Val && p.PortPoe.Val { + metrics = append(metrics, []*metricExports{ + {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}, + {u.USW.PoePower, prometheus.GaugeValue, p.PoePower, l}, + {u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, l}, + }...) + } metrics = append(metrics, []*metricExports{ - {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}, - {u.USW.PoePower, prometheus.GaugeValue, p.PoePower, l}, - {u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, l}, {u.USW.RxBroadcast, prometheus.CounterValue, p.RxBroadcast, l}, {u.USW.RxBytes, prometheus.CounterValue, p.RxBytes, l}, {u.USW.RxBytesR, prometheus.GaugeValue, p.RxBytesR, l}, From faae635c0cdbb58698299ce24139d81139ec9274 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Wed, 27 Nov 2019 22:31:46 -0800 Subject: [PATCH 52/85] track zeros --- poller/prometheus.go | 4 ++-- promunifi/collector.go | 16 ++++++++++++---- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/poller/prometheus.go b/poller/prometheus.go index c811ef47c..b53f7c621 100644 --- a/poller/prometheus.go +++ b/poller/prometheus.go @@ -42,8 +42,8 @@ func (u *UnifiPoller) LogExportReport(report *promunifi.Report) { u.Logf("UniFi Measurements Exported. Sites: %d, Clients: %d, "+ "Wireless APs: %d, Gateways: %d, Switches: %d%s, Descs: %d, "+ - "Metrics: %d, Errors: %d, Elapsed: %v", + "Metrics: %d, Errors: %d, Zeros: %d, Elapsed: %v", len(m.Sites), len(m.Clients), len(m.UAPs), len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg, report.Descs, report.Total, report.Errors, - report.Elapsed.Round(time.Millisecond)) + report.Zeros, report.Elapsed.Round(time.Millisecond)) } diff --git a/promunifi/collector.go b/promunifi/collector.go index f5b00a9b0..0ea3e588d 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -50,6 +50,7 @@ type metricExports struct { type Report struct { Total int Errors int + Zeros int Descs int Metrics *metrics.Metrics Elapsed time.Duration @@ -140,22 +141,29 @@ func (u *unifiCollector) exportMetrics(ch chan<- prometheus.Metric, r *Report) { for _, m := range newMetrics { r.Total++ descs[m.Desc] = true + var value float64 switch v := m.Value.(type) { case unifi.FlexInt: - ch <- prometheus.MustNewConstMetric(m.Desc, m.ValueType, v.Val, m.Labels...) + value = v.Val case float64: - ch <- prometheus.MustNewConstMetric(m.Desc, m.ValueType, v, m.Labels...) + value = v case int64: - ch <- prometheus.MustNewConstMetric(m.Desc, m.ValueType, float64(v), m.Labels...) + value = float64(v) case int: - ch <- prometheus.MustNewConstMetric(m.Desc, m.ValueType, float64(v), m.Labels...) + value = float64(v) default: r.Errors++ if u.Config.ReportErrors { ch <- prometheus.NewInvalidMetric(m.Desc, fmt.Errorf("not a number: %v", m.Value)) } + continue } + + if value == 0 { + r.Zeros++ + } + ch <- prometheus.MustNewConstMetric(m.Desc, m.ValueType, value, m.Labels...) } r.wg.Done() } From 8d2244b02fe97bdbf1c388ff4e278b9ca2b2fcc5 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 02:25:33 -0800 Subject: [PATCH 53/85] more fixes --- promunifi/clients.go | 94 +++++++++++++----------- promunifi/collector.go | 31 ++++---- promunifi/site.go | 161 +++++++++++++++++++++-------------------- promunifi/uap.go | 161 ++++++++++++++++++++++------------------- promunifi/udm.go | 21 ++++-- promunifi/usg.go | 131 +++++++++++++++++---------------- promunifi/usw.go | 130 ++++++++++++++++++--------------- 7 files changed, 393 insertions(+), 336 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 5ad0e2eae..b6cbb54e6 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -59,13 +59,13 @@ func descClient(ns string) *uclient { RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labelWireless, wireless), RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labelWireless, wireless), RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labelWireless, wireless), - RxRate: prometheus.NewDesc(ns+"radio_receive_rate", "Client Receive Rate", labelWireless, wireless), - Signal: prometheus.NewDesc(ns+"radio_signal", "Client Signal Strength", labelWireless, wireless), + RxRate: prometheus.NewDesc(ns+"radio_receive_rate_mbps", "Client Receive Rate", labelWireless, wireless), + Signal: prometheus.NewDesc(ns+"radio_signal_db", "Client Signal Strength", labelWireless, wireless), TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labelWireless, wireless), TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labelWireless, wireless), TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labelWireless, wireless), TxPower: prometheus.NewDesc(ns+"radio_transmit_power", "Client Transmit Power", labelWireless, wireless), - TxRate: prometheus.NewDesc(ns+"radio_transmit_rate", "Client Transmit Rate", labelWireless, wireless), + TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_mbps", "Client Transmit Rate", labelWireless, wireless), WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelWireless, wireless), WiredRxBytes: prometheus.NewDesc(ns+"wired_receive_bytes_total", "Client Wired Receive Bytes", labelWired, wired), @@ -87,44 +87,56 @@ func descClient(ns string) *uclient { } } -func (u *unifiCollector) exportClients(clients []*unifi.Client, r *Report) { - for _, c := range clients { - labels := []string{c.Name, c.Mac, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network} - labelWired := append([]string{c.SwPort.Txt}, labels...) - labelWireless := append([]string{c.ApMac, c.ApName, c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription}, labels...) - - if c.IsWired.Val { - r.ch <- []*metricExports{ - {u.Client.WiredRxBytes, prometheus.CounterValue, c.WiredRxBytes, labelWired}, - {u.Client.WiredRxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labelWired}, - {u.Client.WiredRxPackets, prometheus.CounterValue, c.WiredRxPackets, labelWired}, - {u.Client.WiredTxBytes, prometheus.CounterValue, c.WiredTxBytes, labelWired}, - {u.Client.WiredTxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labelWired}, - {u.Client.WiredTxPackets, prometheus.CounterValue, c.WiredTxPackets, labelWired}, - {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, - } - } else { - r.ch <- []*metricExports{ - {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labelWireless}, - {u.Client.CCQ, prometheus.GaugeValue, c.Ccq, labelWireless}, - {u.Client.Noise, prometheus.GaugeValue, c.Noise, labelWireless}, - {u.Client.RoamCount, prometheus.CounterValue, c.RoamCount, labelWireless}, - {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labelWireless}, - {u.Client.Signal, prometheus.GaugeValue, c.Signal, labelWireless}, - {u.Client.TxPower, prometheus.GaugeValue, c.TxPower, labelWireless}, - {u.Client.TxRate, prometheus.GaugeValue, c.TxRate, labelWireless}, - {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labelWireless}, - {u.Client.RxRate, prometheus.GaugeValue, c.RxRate, labelWireless}, - {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labelWireless}, - {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labelWireless}, - {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labelWireless}, - {u.Client.RxBytes, prometheus.CounterValue, c.RxBytes, labelWireless}, - {u.Client.RxBytesR, prometheus.GaugeValue, c.RxBytesR, labelWireless}, - {u.Client.RxPackets, prometheus.CounterValue, c.RxPackets, labelWireless}, - {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labelWireless}, - {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, - } +func (u *unifiCollector) exportClients(r *Report) { + if r.Metrics == nil || len(r.Metrics.Clients) < 1 { + return + } + r.wg.Add(1) + go func() { + defer r.wg.Done() + for _, c := range r.Metrics.Clients { + u.exportClient(r, c) } + }() +} + +func (u *unifiCollector) exportClient(r *Report, c *unifi.Client) { + labels := []string{c.Name, c.Mac, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network} + labelWired := append([]string{c.SwPort.Txt}, labels...) + labelWireless := append([]string{c.ApMac, c.ApName, c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription}, labels...) + + if c.IsWired.Val { + r.send([]*metricExports{ + {u.Client.WiredRxBytes, prometheus.CounterValue, c.WiredRxBytes, labelWired}, + {u.Client.WiredRxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labelWired}, + {u.Client.WiredRxPackets, prometheus.CounterValue, c.WiredRxPackets, labelWired}, + {u.Client.WiredTxBytes, prometheus.CounterValue, c.WiredTxBytes, labelWired}, + {u.Client.WiredTxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labelWired}, + {u.Client.WiredTxPackets, prometheus.CounterValue, c.WiredTxPackets, labelWired}, + }) + } else { + r.send([]*metricExports{ + {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labelWireless}, + {u.Client.CCQ, prometheus.GaugeValue, c.Ccq, labelWireless}, + {u.Client.Noise, prometheus.GaugeValue, c.Noise, labelWireless}, + {u.Client.RoamCount, prometheus.CounterValue, c.RoamCount, labelWireless}, + {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labelWireless}, + {u.Client.Signal, prometheus.GaugeValue, c.Signal, labelWireless}, + {u.Client.TxPower, prometheus.GaugeValue, c.TxPower, labelWireless}, + {u.Client.TxRate, prometheus.GaugeValue, c.TxRate / 1000, labelWireless}, + {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labelWireless}, + {u.Client.RxRate, prometheus.GaugeValue, c.RxRate / 1000, labelWireless}, + {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labelWireless}, + {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labelWireless}, + {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labelWireless}, + {u.Client.RxBytes, prometheus.CounterValue, c.RxBytes, labelWireless}, + {u.Client.RxBytesR, prometheus.GaugeValue, c.RxBytesR, labelWireless}, + {u.Client.RxPackets, prometheus.CounterValue, c.RxPackets, labelWireless}, + {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labelWireless}, + }) + } + r.send([]*metricExports{ + {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, /* needs more "looking into" {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat, labels}, @@ -133,5 +145,5 @@ func (u *unifiCollector) exportClients(clients []*unifi.Client, r *Report) { {u.Client.DpiStatsTxBytes, prometheus.CounterValue, c.DpiStats.TxBytes, labels}, {u.Client.DpiStatsTxPackets, prometheus.CounterValue, c.DpiStats.TxPackets, labels}, */ - } + }) } diff --git a/promunifi/collector.go b/promunifi/collector.go index 0ea3e588d..9bdbdd291 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -104,7 +104,7 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { // the current metrics (from another package) then exports them for prometheus. func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { var err error - r := &Report{Start: time.Now(), ch: make(chan []*metricExports)} + r := &Report{Start: time.Now(), ch: make(chan []*metricExports, 50)} defer func() { r.wg.Wait() close(r.ch) @@ -116,26 +116,18 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { return } - go u.exportMetrics(ch, r) - - r.wg.Add(len(r.Metrics.Clients) + len(r.Metrics.Sites)) - go u.exportClients(r.Metrics.Clients, r) - go u.exportSites(r.Metrics.Sites, r) - - if r.Metrics.Devices == nil { - return - } - - r.wg.Add(len(r.Metrics.UAPs) + len(r.Metrics.USWs) + len(r.Metrics.USGs) + len(r.Metrics.UDMs)) - go u.exportUAPs(r.Metrics.UAPs, r) - go u.exportUSWs(r.Metrics.USWs, r) - go u.exportUSGs(r.Metrics.USGs, r) - u.exportUDMs(r.Metrics.UDMs, r) + go u.exportMetrics(r, ch) + u.exportClients(r) + u.exportSites(r) + u.exportUAPs(r) + u.exportUSWs(r) + u.exportUSGs(r) + u.exportUDMs(r) } // This is closely tied to the method above with a sync.WaitGroup. // This method runs in a go routine and exits when the channel closes. -func (u *unifiCollector) exportMetrics(ch chan<- prometheus.Metric, r *Report) { +func (u *unifiCollector) exportMetrics(r *Report, ch chan<- prometheus.Metric) { descs := make(map[*prometheus.Desc]bool) // used as a counter for newMetrics := range r.ch { for _, m := range newMetrics { @@ -174,3 +166,8 @@ func (u *unifiCollector) exportMetrics(ch chan<- prometheus.Metric, r *Report) { r.Descs, r.Elapsed = len(descs), time.Since(r.Start) u.Config.LoggingFn(r) } + +func (r *Report) send(m []*metricExports) { + r.wg.Add(1) + r.ch <- m +} diff --git a/promunifi/site.go b/promunifi/site.go index 61ebbe050..731f844f0 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -50,27 +50,27 @@ func descSite(ns string) *site { labels := []string{"subsystem", "status", "name", "desc", "site_name"} return &site{ - NumUser: prometheus.NewDesc(ns+"num_user_total", "Number of Users", labels, nil), - NumGuest: prometheus.NewDesc(ns+"num_guest_total", "Number of Guests", labels, nil), - NumIot: prometheus.NewDesc(ns+"num_iot_total", "Number of IoT Devices", labels, nil), + NumUser: prometheus.NewDesc(ns+"num_user", "Number of Users", labels, nil), + NumGuest: prometheus.NewDesc(ns+"num_guest", "Number of Guests", labels, nil), + NumIot: prometheus.NewDesc(ns+"num_iot", "Number of IoT Devices", labels, nil), TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Bytes Transmit Rate", labels, nil), RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Bytes Receive Rate", labels, nil), - NumAp: prometheus.NewDesc(ns+"num_ap_total", "Access Point Count", labels, nil), - NumAdopted: prometheus.NewDesc(ns+"num_adopted_total", "Adoption Count", labels, nil), - NumDisabled: prometheus.NewDesc(ns+"num_disabled_total", "Disabled Count", labels, nil), - NumDisconnected: prometheus.NewDesc(ns+"num_disconnected_total", "Disconnected Count", labels, nil), - NumPending: prometheus.NewDesc(ns+"num_pending_total", "Pending Count", labels, nil), - NumGw: prometheus.NewDesc(ns+"num_gateways_total", "Gateway Count", labels, nil), - NumSw: prometheus.NewDesc(ns+"num_switches_total", "Switch Count", labels, nil), - NumSta: prometheus.NewDesc(ns+"num_stations_total", "Station Count", labels, nil), - Latency: prometheus.NewDesc(ns+"latency_ms", "Latency", labels, nil), + NumAp: prometheus.NewDesc(ns+"num_ap", "Access Point Count", labels, nil), + NumAdopted: prometheus.NewDesc(ns+"num_adopted", "Adoption Count", labels, nil), + NumDisabled: prometheus.NewDesc(ns+"num_disabled", "Disabled Count", labels, nil), + NumDisconnected: prometheus.NewDesc(ns+"num_disconnected", "Disconnected Count", labels, nil), + NumPending: prometheus.NewDesc(ns+"num_pending", "Pending Count", labels, nil), + NumGw: prometheus.NewDesc(ns+"num_gateways", "Gateway Count", labels, nil), + NumSw: prometheus.NewDesc(ns+"num_switches", "Switch Count", labels, nil), + NumSta: prometheus.NewDesc(ns+"num_stations", "Station Count", labels, nil), + Latency: prometheus.NewDesc(ns+"latency_seconds", "Latency", labels, nil), Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Uptime", labels, nil), Drops: prometheus.NewDesc(ns+"intenet_drops_total", "Internet (WAN) Disconnections", labels, nil), XputUp: prometheus.NewDesc(ns+"xput_up_rate", "Speedtest Upload", labels, nil), XputDown: prometheus.NewDesc(ns+"xput_down_rate", "Speedtest Download", labels, nil), SpeedtestPing: prometheus.NewDesc(ns+"speedtest_ping", "Speedtest Ping", labels, nil), - RemoteUserNumActive: prometheus.NewDesc(ns+"num_remote_user_active_total", "Remote Users Active", labels, nil), - RemoteUserNumInactive: prometheus.NewDesc(ns+"num_remote_user_inactive_total", "Remote Users Inactive", labels, nil), + RemoteUserNumActive: prometheus.NewDesc(ns+"num_remote_user_active", "Remote Users Active", labels, nil), + RemoteUserNumInactive: prometheus.NewDesc(ns+"num_remote_user_inactive", "Remote Users Inactive", labels, nil), RemoteUserRxBytes: prometheus.NewDesc(ns+"remote_user_receive_bytes_total", "Remote Users Receive Bytes", labels, nil), RemoteUserTxBytes: prometheus.NewDesc(ns+"remote_user_transmit_bytes_total", "Remote Users Transmit Bytes", labels, nil), RemoteUserRxPackets: prometheus.NewDesc(ns+"remote_user_receive_packets_total", "Remote Users Receive Packets", labels, nil), @@ -78,78 +78,85 @@ func descSite(ns string) *site { } } -func (u *unifiCollector) exportSites(sites unifi.Sites, r *Report) { - for _, s := range sites { - metrics := []*metricExports{} - labels := []string{s.Name, s.Desc, s.SiteName} +func (u *unifiCollector) exportSites(r *Report) { + if r.Metrics == nil || len(r.Metrics.Sites) < 1 { + return + } + r.wg.Add(1) + go func() { + defer r.wg.Done() + for _, s := range r.Metrics.Sites { + u.exportSite(r, s) + } + }() +} - for _, h := range s.Health { - l := append([]string{h.Subsystem, h.Status}, labels...) +func (u *unifiCollector) exportSite(r *Report, s *unifi.Site) { + labels := []string{s.Name, s.Desc, s.SiteName} + for _, h := range s.Health { + l := append([]string{h.Subsystem, h.Status}, labels...) - if h.Subsystem != subsystemVPN { - metrics = append(metrics, []*metricExports{ - {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR.Val, l}, - {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR.Val, l}, - }...) - } else { - metrics = append(metrics, []*metricExports{ - {u.Site.RemoteUserNumActive, prometheus.CounterValue, h.RemoteUserNumActive.Val, l}, - {u.Site.RemoteUserNumInactive, prometheus.CounterValue, h.RemoteUserNumInactive.Val, l}, - {u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes.Val, l}, - {u.Site.RemoteUserTxBytes, prometheus.CounterValue, h.RemoteUserTxBytes.Val, l}, - {u.Site.RemoteUserRxPackets, prometheus.CounterValue, h.RemoteUserRxPackets.Val, l}, - {u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets.Val, l}, - }...) - } + if h.Subsystem != subsystemVPN { + r.send([]*metricExports{ + {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l}, + {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l}, + }) + } else { + r.send([]*metricExports{ + {u.Site.RemoteUserNumActive, prometheus.GaugeValue, h.RemoteUserNumActive, l}, + {u.Site.RemoteUserNumInactive, prometheus.GaugeValue, h.RemoteUserNumInactive, l}, + {u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes, l}, + {u.Site.RemoteUserTxBytes, prometheus.CounterValue, h.RemoteUserTxBytes, l}, + {u.Site.RemoteUserRxPackets, prometheus.CounterValue, h.RemoteUserRxPackets, l}, + {u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets, l}, + }) + } - if h.Subsystem == subsystemWWW { - metrics = append(metrics, []*metricExports{ - {u.Site.Uptime, prometheus.GaugeValue, h.Latency.Val, l}, - {u.Site.Latency, prometheus.GaugeValue, h.Latency.Val, l}, - {u.Site.XputUp, prometheus.GaugeValue, h.XputUp.Val, l}, - {u.Site.XputDown, prometheus.GaugeValue, h.XputDown.Val, l}, - {u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing.Val, l}, - {u.Site.Drops, prometheus.CounterValue, h.Drops.Val, l}, - }...) - } + if h.Subsystem == subsystemWWW { + r.send([]*metricExports{ + {u.Site.Uptime, prometheus.GaugeValue, h.Latency, l}, + {u.Site.Latency, prometheus.GaugeValue, h.Latency.Val / 1000, l}, + {u.Site.XputUp, prometheus.GaugeValue, h.XputUp, l}, + {u.Site.XputDown, prometheus.GaugeValue, h.XputDown, l}, + {u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing, l}, + {u.Site.Drops, prometheus.CounterValue, h.Drops, l}, + }) + } - if h.Subsystem == subsystemLAN || h.Subsystem == subsystemWLAN || h.Subsystem == subsystemWAN { - metrics = append(metrics, []*metricExports{ - {u.Site.NumAdopted, prometheus.CounterValue, h.NumAdopted.Val, l}, - {u.Site.NumDisconnected, prometheus.CounterValue, h.NumDisconnected.Val, l}, - {u.Site.NumPending, prometheus.CounterValue, h.NumPending.Val, l}, - }...) + if h.Subsystem == subsystemLAN || h.Subsystem == subsystemWLAN || h.Subsystem == subsystemWAN { + r.send([]*metricExports{ + {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, l}, + {u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, l}, + {u.Site.NumPending, prometheus.GaugeValue, h.NumPending, l}, + }) - if h.Subsystem == subsystemLAN || h.Subsystem == subsystemWLAN { - metrics = append(metrics, []*metricExports{ - {u.Site.NumUser, prometheus.CounterValue, h.NumUser.Val, l}, - {u.Site.NumGuest, prometheus.CounterValue, h.NumGuest.Val, l}, - {u.Site.NumIot, prometheus.CounterValue, h.NumIot.Val, l}, - }...) - } + if h.Subsystem == subsystemLAN || h.Subsystem == subsystemWLAN { + r.send([]*metricExports{ + {u.Site.NumUser, prometheus.GaugeValue, h.NumUser, l}, + {u.Site.NumGuest, prometheus.GaugeValue, h.NumGuest, l}, + {u.Site.NumIot, prometheus.GaugeValue, h.NumIot, l}, + }) + } - if h.Subsystem == subsystemWLAN { - metrics = append(metrics, []*metricExports{ - {u.Site.NumAp, prometheus.CounterValue, h.NumAp.Val, l}, - {u.Site.NumDisabled, prometheus.CounterValue, h.NumDisabled.Val, l}, - }...) - } + if h.Subsystem == subsystemWLAN { + r.send([]*metricExports{ + {u.Site.NumAp, prometheus.GaugeValue, h.NumAp, l}, + {u.Site.NumDisabled, prometheus.GaugeValue, h.NumDisabled, l}, + }) + } - if h.Subsystem == subsystemWAN { - metrics = append(metrics, []*metricExports{ - {u.Site.NumGw, prometheus.CounterValue, h.NumGw.Val, l}, - {u.Site.NumSta, prometheus.CounterValue, h.NumSta.Val, l}, - }...) - } + if h.Subsystem == subsystemWAN { + r.send([]*metricExports{ + {u.Site.NumGw, prometheus.GaugeValue, h.NumGw, l}, + {u.Site.NumSta, prometheus.GaugeValue, h.NumSta, l}, + }) + } - if h.Subsystem == subsystemLAN { - metrics = append(metrics, []*metricExports{ - {u.Site.NumSw, prometheus.CounterValue, h.NumSw.Val, l}, - }...) - } + if h.Subsystem == subsystemLAN { + r.send([]*metricExports{ + {u.Site.NumSw, prometheus.GaugeValue, h.NumSw, l}, + }) } } - - r.ch <- metrics } } diff --git a/promunifi/uap.go b/promunifi/uap.go index 32c4195be..5c3ea2f3a 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -49,6 +49,7 @@ type uap struct { VAPAvgClientSignal *prometheus.Desc VAPSatisfaction *prometheus.Desc VAPSatisfactionNow *prometheus.Desc + VAPDNSAvgLatency *prometheus.Desc VAPRxBytes *prometheus.Desc VAPRxCrypts *prometheus.Desc VAPRxDropped *prometheus.Desc @@ -106,11 +107,10 @@ func descUAP(ns string) *uap { if ns += "_uap_"; ns == "_uap_" { ns = "uap_" } - labels := []string{"ip", "site_name", "mac", "model", "name", "serial", "site_id", - "type", "version", "device_id"} + labels := []string{"ip", "site_name", "mac", "model", "name", "serial", "type", "version"} labelA := append([]string{"stat"}, labels[2:]...) - labelV := append([]string{"vap_name", "bssid", "radio_name", "essid"}, labels[2:]...) - labelR := append([]string{"radio_name", "radio", "wlan_group_id"}, labels[2:]...) + labelV := append([]string{"vap_name", "bssid", "radio_name", "essid", "usage"}, labels[2:]...) + labelR := append([]string{"radio_name", "radio"}, labels[2:]...) return &uap{ Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), @@ -121,9 +121,9 @@ func descUAP(ns string) *uap { TxBytesD: prometheus.NewDesc(ns+"d_tranmsit_bytes", "Transmit Bytes D???", labels, nil), RxBytesD: prometheus.NewDesc(ns+"d_receive_bytes", "Receive Bytes D???", labels, nil), BytesR: prometheus.NewDesc(ns+"rate_bytes", "Transfer Rate", labels, nil), - NumSta: prometheus.NewDesc(ns+"num_stations_total", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"num_stations_user_total", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest_total", "Number of Guest Stations", labels, nil), + NumSta: prometheus.NewDesc(ns+"num_stations", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"num_stations_user", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest", "Number of Guest Stations", labels, nil), Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), @@ -155,8 +155,9 @@ func descUAP(ns string) *uap { VAPMacFilterRejections: prometheus.NewDesc(ns+"vap_mac_filter_rejects_total", "VAP MAC Filter Rejections", labelV, nil), VAPNumSatisfactionSta: prometheus.NewDesc(ns+"vap_num_satisfaction_stations", "VAP Number Satisifaction Stations", labelV, nil), VAPAvgClientSignal: prometheus.NewDesc(ns+"vap_average_client_signal", "VAP Average Client Signal", labelV, nil), - VAPSatisfaction: prometheus.NewDesc(ns+"vap_satisfaction", "VAP Satisfaction", labelV, nil), - VAPSatisfactionNow: prometheus.NewDesc(ns+"vap_satisfaction_now", "VAP Satisfaction Now", labelV, nil), + VAPSatisfaction: prometheus.NewDesc(ns+"vap_satisfaction_percent", "VAP Satisfaction", labelV, nil), + VAPSatisfactionNow: prometheus.NewDesc(ns+"vap_satisfaction_now_percent", "VAP Satisfaction Now", labelV, nil), + VAPDNSAvgLatency: prometheus.NewDesc(ns+"vap_dns_latency_average_seconds", "VAP DNS Latency Average", labelV, nil), VAPRxBytes: prometheus.NewDesc(ns+"vap_receive_bytes_total", "VAP Bytes Received", labelV, nil), VAPRxCrypts: prometheus.NewDesc(ns+"vap_receive_crypts_total", "VAP Crypts Received", labelV, nil), VAPRxDropped: prometheus.NewDesc(ns+"vap_receive_dropped_total", "VAP Dropped Received", labelV, nil), @@ -172,20 +173,20 @@ func descUAP(ns string) *uap { VAPTxRetries: prometheus.NewDesc(ns+"vap_transmit_retries_total", "VAP Retries Transmitted", labelV, nil), VAPTxCombinedRetries: prometheus.NewDesc(ns+"vap_transmit_retries_combined_total", "VAP Retries Combined Transmitted", labelV, nil), VAPTxDataMpduBytes: prometheus.NewDesc(ns+"vap_data_mpdu_transmit_bytes_total", "VAP Data MPDU Bytes Transmitted", labelV, nil), - VAPTxRtsRetries: prometheus.NewDesc(ns+"vap_trnamsit_rts_retries_total", "VAP RTS Retries Transmitted", labelV, nil), + VAPTxRtsRetries: prometheus.NewDesc(ns+"vap_transmit_rts_retries_total", "VAP RTS Retries Transmitted", labelV, nil), VAPTxSuccess: prometheus.NewDesc(ns+"vap_transmit_success_total", "VAP Success Transmits", labelV, nil), VAPTxTotal: prometheus.NewDesc(ns+"vap_transmit_total", "VAP Transmit Total", labelV, nil), VAPTxGoodbytes: prometheus.NewDesc(ns+"vap_transmit_goodbyes", "VAP Goodbyes Transmitted", labelV, nil), - VAPTxLatAvg: prometheus.NewDesc(ns+"vap_transmit_latency_average", "VAP Latency Average Transmit", labelV, nil), - VAPTxLatMax: prometheus.NewDesc(ns+"vap_transmit_latency_maximum", "VAP Latency Maximum Transmit", labelV, nil), - VAPTxLatMin: prometheus.NewDesc(ns+"vap_transmit_latency_minimum", "VAP Latency Minimum Transmit", labelV, nil), + VAPTxLatAvg: prometheus.NewDesc(ns+"vap_transmit_latency_average_seconds", "VAP Latency Average Transmit", labelV, nil), + VAPTxLatMax: prometheus.NewDesc(ns+"vap_transmit_latency_maximum_seconds", "VAP Latency Maximum Transmit", labelV, nil), + VAPTxLatMin: prometheus.NewDesc(ns+"vap_transmit_latency_minimum_seconds", "VAP Latency Minimum Transmit", labelV, nil), VAPRxGoodbytes: prometheus.NewDesc(ns+"vap_receive_goodbyes", "VAP Goodbyes Received", labelV, nil), - VAPRxLatAvg: prometheus.NewDesc(ns+"vap_receive_latency_average", "VAP Latency Average Receive", labelV, nil), - VAPRxLatMax: prometheus.NewDesc(ns+"vap_receive_latency_maximum", "VAP Latency Maximum Receive", labelV, nil), - VAPRxLatMin: prometheus.NewDesc(ns+"vap_receive_latency_minimum", "VAP Latency Minimum Receive", labelV, nil), - VAPWifiTxLatencyMovAvg: prometheus.NewDesc(ns+"vap_transmit_latency_moving_avg", "VAP Latency Moving Average Tramsit", labelV, nil), - VAPWifiTxLatencyMovMax: prometheus.NewDesc(ns+"vap_transmit_latency_moving_max", "VAP Latency Moving Maximum Tramsit", labelV, nil), - VAPWifiTxLatencyMovMin: prometheus.NewDesc(ns+"vap_transmit_latency_moving_min", "VAP Latency Moving Minimum Tramsit", labelV, nil), + VAPRxLatAvg: prometheus.NewDesc(ns+"vap_receive_latency_average_seconds", "VAP Latency Average Receive", labelV, nil), + VAPRxLatMax: prometheus.NewDesc(ns+"vap_receive_latency_maximum_seconds", "VAP Latency Maximum Receive", labelV, nil), + VAPRxLatMin: prometheus.NewDesc(ns+"vap_receive_latency_minimum_seconds", "VAP Latency Minimum Receive", labelV, nil), + VAPWifiTxLatencyMovAvg: prometheus.NewDesc(ns+"vap_transmit_latency_moving_avg_seconds", "VAP Latency Moving Average Tramsit", labelV, nil), + VAPWifiTxLatencyMovMax: prometheus.NewDesc(ns+"vap_transmit_latency_moving_max_seconds", "VAP Latency Moving Maximum Tramsit", labelV, nil), + VAPWifiTxLatencyMovMin: prometheus.NewDesc(ns+"vap_transmit_latency_moving_min_seconds", "VAP Latency Moving Minimum Tramsit", labelV, nil), VAPWifiTxLatencyMovTotal: prometheus.NewDesc(ns+"vap_transmit_latency_moving_total", "VAP Latency Moving Total Tramsit", labelV, nil), VAPWifiTxLatencyMovCount: prometheus.NewDesc(ns+"vap_transmit_latency_moving_count", "VAP Latency Moving Count Tramsit", labelV, nil), @@ -204,52 +205,62 @@ func descUAP(ns string) *uap { RadioCuTotal: prometheus.NewDesc(ns+"radio_channel_utilization_total", "Radio Channel Utilization", labelR, nil), RadioExtchannel: prometheus.NewDesc(ns+"radio_ext_channel", "Radio Ext Channel", labelR, nil), RadioGain: prometheus.NewDesc(ns+"radio_gain", "Radio Gain", labelR, nil), - RadioGuestNumSta: prometheus.NewDesc(ns+"radio_num_guest_stations_total", "Radio Guest Station Count", labelR, nil), - RadioNumSta: prometheus.NewDesc(ns+"radio_num_stations_total", "Radio Total Station Count", labelR, nil), - RadioUserNumSta: prometheus.NewDesc(ns+"radio_num_user_stations_total", "Radio User Station Count", labelR, nil), + RadioGuestNumSta: prometheus.NewDesc(ns+"radio_num_guest_stations", "Radio Guest Station Count", labelR, nil), + RadioNumSta: prometheus.NewDesc(ns+"radio_num_stations", "Radio Total Station Count", labelR, nil), + RadioUserNumSta: prometheus.NewDesc(ns+"radio_num_user_stations", "Radio User Station Count", labelR, nil), RadioTxPackets: prometheus.NewDesc(ns+"radio_transmit_packets_total", "Radio Transmitted Packets", labelR, nil), RadioTxRetries: prometheus.NewDesc(ns+"radio_transmit_retries_total", "Radio Transmit Retries", labelR, nil), } } -func (u *unifiCollector) exportUAPs(uaps []*unifi.UAP, r *Report) { - for _, a := range uaps { - labels := []string{a.IP, a.SiteName, a.Mac, a.Model, a.Name, a.Serial, a.SiteID, - a.Type, a.Version, a.DeviceID} - - // AP data. - r.ch <- append(append([]*metricExports{ - {u.UAP.Uptime, prometheus.GaugeValue, a.Uptime, labels}, - {u.UAP.TotalTxBytes, prometheus.CounterValue, a.TxBytes, labels}, - {u.UAP.TotalRxBytes, prometheus.CounterValue, a.RxBytes, labels}, - {u.UAP.TotalBytes, prometheus.CounterValue, a.Bytes, labels}, - {u.UAP.BytesD, prometheus.CounterValue, a.BytesD, labels}, // not sure if these 3 Ds are counters or gauges. - {u.UAP.TxBytesD, prometheus.CounterValue, a.TxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. - {u.UAP.RxBytesD, prometheus.CounterValue, a.RxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. - {u.UAP.BytesR, prometheus.GaugeValue, a.BytesR, labels}, - {u.UAP.NumSta, prometheus.GaugeValue, a.NumSta, labels}, - {u.UAP.UserNumSta, prometheus.GaugeValue, a.UserNumSta, labels}, - {u.UAP.GuestNumSta, prometheus.GaugeValue, a.GuestNumSta, labels}, - {u.UAP.Loadavg1, prometheus.GaugeValue, a.SysStats.Loadavg1, labels}, - {u.UAP.Loadavg5, prometheus.GaugeValue, a.SysStats.Loadavg5, labels}, - {u.UAP.Loadavg15, prometheus.GaugeValue, a.SysStats.Loadavg15, labels}, - {u.UAP.MemUsed, prometheus.GaugeValue, a.SysStats.MemUsed, labels}, - {u.UAP.MemTotal, prometheus.GaugeValue, a.SysStats.MemTotal, labels}, - {u.UAP.MemBuffer, prometheus.GaugeValue, a.SysStats.MemBuffer, labels}, - {u.UAP.CPU, prometheus.GaugeValue, a.SystemStats.CPU, labels}, - {u.UAP.Mem, prometheus.GaugeValue, a.SystemStats.Mem, labels}, - }, - u.exportUAPstat(labels[2:], a.Stat.Ap)...), - u.exportVAPtable(labels[2:], a.VapTable, a.RadioTable, a.RadioTableStats)...) +func (u *unifiCollector) exportUAPs(r *Report) { + if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.UAPs) < 1 { + return } + r.wg.Add(1) + go func() { + defer r.wg.Done() + for _, a := range r.Metrics.Devices.UAPs { + u.exportUAP(r, a) + } + }() } -func (u *unifiCollector) exportUAPstat(labels []string, a *unifi.Ap) []*metricExports { +func (u *unifiCollector) exportUAP(r *Report, a *unifi.UAP) { + labels := []string{a.IP, a.SiteName, a.Mac, a.Model, a.Name, a.Serial, a.Type, a.Version} + + // AP data. + r.send([]*metricExports{ + {u.UAP.Uptime, prometheus.GaugeValue, a.Uptime, labels}, + {u.UAP.TotalTxBytes, prometheus.CounterValue, a.TxBytes, labels}, + {u.UAP.TotalRxBytes, prometheus.CounterValue, a.RxBytes, labels}, + {u.UAP.TotalBytes, prometheus.CounterValue, a.Bytes, labels}, + {u.UAP.BytesD, prometheus.CounterValue, a.BytesD, labels}, // not sure if these 3 Ds are counters or gauges. + {u.UAP.TxBytesD, prometheus.CounterValue, a.TxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. + {u.UAP.RxBytesD, prometheus.CounterValue, a.RxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. + {u.UAP.BytesR, prometheus.GaugeValue, a.BytesR, labels}, + {u.UAP.NumSta, prometheus.GaugeValue, a.NumSta, labels}, + {u.UAP.UserNumSta, prometheus.GaugeValue, a.UserNumSta, labels}, + {u.UAP.GuestNumSta, prometheus.GaugeValue, a.GuestNumSta, labels}, + {u.UAP.Loadavg1, prometheus.GaugeValue, a.SysStats.Loadavg1, labels}, + {u.UAP.Loadavg5, prometheus.GaugeValue, a.SysStats.Loadavg5, labels}, + {u.UAP.Loadavg15, prometheus.GaugeValue, a.SysStats.Loadavg15, labels}, + {u.UAP.MemUsed, prometheus.GaugeValue, a.SysStats.MemUsed, labels}, + {u.UAP.MemTotal, prometheus.GaugeValue, a.SysStats.MemTotal, labels}, + {u.UAP.MemBuffer, prometheus.GaugeValue, a.SysStats.MemBuffer, labels}, + {u.UAP.CPU, prometheus.GaugeValue, a.SystemStats.CPU, labels}, + {u.UAP.Mem, prometheus.GaugeValue, a.SystemStats.Mem, labels}, + }) + u.exportUAPstat(r, labels[2:], a.Stat.Ap) + u.exportVAPtable(r, labels[2:], a.VapTable, a.RadioTable, a.RadioTableStats) +} + +func (u *unifiCollector) exportUAPstat(r *Report, labels []string, a *unifi.Ap) { labelA := append([]string{"all"}, labels...) labelU := append([]string{"user"}, labels...) labelG := append([]string{"guest"}, labels...) - return []*metricExports{ + r.send([]*metricExports{ // all {u.UAP.ApWifiTxDropped, prometheus.CounterValue, a.WifiTxDropped, labelA}, {u.UAP.ApRxErrors, prometheus.CounterValue, a.RxErrors, labelA}, @@ -295,22 +306,25 @@ func (u *unifiCollector) exportUAPstat(labels []string, a *unifi.Ap) []*metricEx {u.UAP.ApRxBytes, prometheus.CounterValue, a.GuestRxBytes, labelG}, {u.UAP.WifiTxAttempts, prometheus.CounterValue, a.GuestWifiTxAttempts, labelG}, {u.UAP.MacFilterRejections, prometheus.CounterValue, a.GuestMacFilterRejections, labelG}, - } + }) } -func (u *unifiCollector) exportVAPtable(labels []string, vt unifi.VapTable, rt unifi.RadioTable, rts unifi.RadioTableStats) []*metricExports { - metrics := []*metricExports{} +func (u *unifiCollector) exportVAPtable(r *Report, labels []string, vt unifi.VapTable, rt unifi.RadioTable, rts unifi.RadioTableStats) { // vap table stats for _, v := range vt { - labelV := append([]string{v.Name, v.Bssid, v.RadioName, v.Essid}, labels...) - metrics = append(metrics, []*metricExports{ + if !v.Up.Val { + continue + } + labelV := append([]string{v.Name, v.Bssid, v.RadioName, v.Essid, v.Usage}, labels...) + r.send([]*metricExports{ {u.UAP.VAPCcq, prometheus.GaugeValue, v.Ccq, labelV}, {u.UAP.VAPMacFilterRejections, prometheus.CounterValue, v.MacFilterRejections, labelV}, {u.UAP.VAPNumSatisfactionSta, prometheus.GaugeValue, v.NumSatisfactionSta, labelV}, {u.UAP.VAPAvgClientSignal, prometheus.GaugeValue, v.AvgClientSignal, labelV}, {u.UAP.VAPSatisfaction, prometheus.GaugeValue, v.Satisfaction, labelV}, {u.UAP.VAPSatisfactionNow, prometheus.GaugeValue, v.SatisfactionNow, labelV}, + {u.UAP.VAPDNSAvgLatency, prometheus.GaugeValue, v.DNSAvgLatency.Val / 1000, labelV}, {u.UAP.VAPRxBytes, prometheus.CounterValue, v.RxBytes, labelV}, {u.UAP.VAPRxCrypts, prometheus.CounterValue, v.RxCrypts, labelV}, {u.UAP.VAPRxDropped, prometheus.CounterValue, v.RxDropped, labelV}, @@ -329,39 +343,39 @@ func (u *unifiCollector) exportVAPtable(labels []string, vt unifi.VapTable, rt u {u.UAP.VAPTxRtsRetries, prometheus.CounterValue, v.TxRtsRetries, labelV}, {u.UAP.VAPTxTotal, prometheus.CounterValue, v.TxTotal, labelV}, {u.UAP.VAPTxGoodbytes, prometheus.CounterValue, v.TxTCPStats.Goodbytes, labelV}, - {u.UAP.VAPTxLatAvg, prometheus.GaugeValue, v.TxTCPStats.LatAvg, labelV}, - {u.UAP.VAPTxLatMax, prometheus.GaugeValue, v.TxTCPStats.LatMax, labelV}, - {u.UAP.VAPTxLatMin, prometheus.GaugeValue, v.TxTCPStats.LatMin, labelV}, + {u.UAP.VAPTxLatAvg, prometheus.GaugeValue, v.TxTCPStats.LatAvg.Val / 1000, labelV}, + {u.UAP.VAPTxLatMax, prometheus.GaugeValue, v.TxTCPStats.LatMax.Val / 1000, labelV}, + {u.UAP.VAPTxLatMin, prometheus.GaugeValue, v.TxTCPStats.LatMin.Val / 1000, labelV}, {u.UAP.VAPRxGoodbytes, prometheus.CounterValue, v.RxTCPStats.Goodbytes, labelV}, - {u.UAP.VAPRxLatAvg, prometheus.GaugeValue, v.RxTCPStats.LatAvg, labelV}, - {u.UAP.VAPRxLatMax, prometheus.GaugeValue, v.RxTCPStats.LatMax, labelV}, - {u.UAP.VAPRxLatMin, prometheus.GaugeValue, v.RxTCPStats.LatMin, labelV}, - {u.UAP.VAPWifiTxLatencyMovAvg, prometheus.GaugeValue, v.WifiTxLatencyMov.Avg, labelV}, - {u.UAP.VAPWifiTxLatencyMovMax, prometheus.GaugeValue, v.WifiTxLatencyMov.Max, labelV}, - {u.UAP.VAPWifiTxLatencyMovMin, prometheus.GaugeValue, v.WifiTxLatencyMov.Min, labelV}, + {u.UAP.VAPRxLatAvg, prometheus.GaugeValue, v.RxTCPStats.LatAvg.Val / 1000, labelV}, + {u.UAP.VAPRxLatMax, prometheus.GaugeValue, v.RxTCPStats.LatMax.Val / 1000, labelV}, + {u.UAP.VAPRxLatMin, prometheus.GaugeValue, v.RxTCPStats.LatMin.Val / 1000, labelV}, + {u.UAP.VAPWifiTxLatencyMovAvg, prometheus.GaugeValue, v.WifiTxLatencyMov.Avg.Val / 1000, labelV}, + {u.UAP.VAPWifiTxLatencyMovMax, prometheus.GaugeValue, v.WifiTxLatencyMov.Max.Val / 1000, labelV}, + {u.UAP.VAPWifiTxLatencyMovMin, prometheus.GaugeValue, v.WifiTxLatencyMov.Min.Val / 1000, labelV}, {u.UAP.VAPWifiTxLatencyMovTotal, prometheus.CounterValue, v.WifiTxLatencyMov.Total, labelV}, // not sure if gauge or counter. {u.UAP.VAPWifiTxLatencyMovCount, prometheus.CounterValue, v.WifiTxLatencyMov.TotalCount, labelV}, // not sure if gauge or counter. - }...) + }) } // radio table for _, p := range rt { - labelR := append([]string{p.Name, p.Radio, p.WlangroupID}, labels...) - metrics = append(metrics, []*metricExports{ + labelR := append([]string{p.Name, p.Radio}, labels...) + r.send([]*metricExports{ {u.UAP.RadioCurrentAntennaGain, prometheus.GaugeValue, p.CurrentAntennaGain, labelR}, {u.UAP.RadioHt, prometheus.GaugeValue, p.Ht, labelR}, {u.UAP.RadioMaxTxpower, prometheus.GaugeValue, p.MaxTxpower, labelR}, {u.UAP.RadioMinTxpower, prometheus.GaugeValue, p.MinTxpower, labelR}, {u.UAP.RadioNss, prometheus.GaugeValue, p.Nss, labelR}, {u.UAP.RadioRadioCaps, prometheus.GaugeValue, p.RadioCaps, labelR}, - }...) + }) // combine radio table with radio stats table. for _, t := range rts { if t.Name != p.Name { continue } - metrics = append(metrics, []*metricExports{ + r.send([]*metricExports{ {u.UAP.RadioTxPower, prometheus.GaugeValue, t.TxPower, labelR}, {u.UAP.RadioAstBeXmit, prometheus.GaugeValue, t.AstBeXmit, labelR}, {u.UAP.RadioChannel, prometheus.GaugeValue, t.Channel, labelR}, @@ -375,8 +389,7 @@ func (u *unifiCollector) exportVAPtable(labels []string, vt unifi.VapTable, rt u {u.UAP.RadioUserNumSta, prometheus.GaugeValue, t.UserNumSta, labelR}, {u.UAP.RadioTxPackets, prometheus.CounterValue, t.TxPackets, labelR}, {u.UAP.RadioTxRetries, prometheus.CounterValue, t.TxRetries, labelR}, - }...) + }) } } - return metrics } diff --git a/promunifi/udm.go b/promunifi/udm.go index 17c3ea965..1ebc5c274 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -1,8 +1,6 @@ package promunifi -import ( - "golift.io/unifi" -) +import "golift.io/unifi" type udm struct { } @@ -11,6 +9,19 @@ func descUDM(ns string) *udm { return &udm{} } -func (u *unifiCollector) exportUDMs(udms []*unifi.UDM, r *Report) { - // for _, d := range udms { +func (u *unifiCollector) exportUDMs(r *Report) { + if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.UDMs) < 1 { + return + } + r.wg.Add(1) + go func() { + defer r.wg.Done() + for _, d := range r.Metrics.Devices.UDMs { + u.exportUDM(r, d) + } + }() +} + +func (u *unifiCollector) exportUDM(r *Report, d *unifi.UDM) { + // for _, d := range r.Metrics.Devices.UDMs { } diff --git a/promunifi/usg.go b/promunifi/usg.go index 396f0f6a6..f758fa258 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -58,8 +58,7 @@ func descUSG(ns string) *usg { if ns += "_usg_"; ns == "_usg_" { ns = "usg_" } - labels := []string{"site_name", "mac", "model", "name", "serial", "site_id", - "type", "version", "ip"} + labels := []string{"site_name", "mac", "model", "name", "serial", "type", "version", "ip"} labelWan := append([]string{"port"}, labels...) return &usg{ @@ -67,12 +66,12 @@ func descUSG(ns string) *usg { TotalTxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Total Transmitted Bytes", labels, nil), TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Total Bytes Transferred", labels, nil), - NumSta: prometheus.NewDesc(ns+"num_stations_total", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"num_stations_user_total", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest_total", "Number of Guest Stations", labels, nil), - NumDesktop: prometheus.NewDesc(ns+"num_desktops_total", "Number of Desktops", labels, nil), - NumMobile: prometheus.NewDesc(ns+"num_mobile_total", "Number of Mobiles", labels, nil), - NumHandheld: prometheus.NewDesc(ns+"num_handheld_total", "Number of Handhelds", labels, nil), + NumSta: prometheus.NewDesc(ns+"num_stations", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"num_stations_user", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest", "Number of Guest Stations", labels, nil), + NumDesktop: prometheus.NewDesc(ns+"num_desktops", "Number of Desktops", labels, nil), + NumMobile: prometheus.NewDesc(ns+"num_mobile", "Number of Mobiles", labels, nil), + NumHandheld: prometheus.NewDesc(ns+"num_handheld", "Number of Handhelds", labels, nil), Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), @@ -90,7 +89,7 @@ func descUSG(ns string) *usg { WanRxBroadcast: prometheus.NewDesc(ns+"wan_receive_broadcast_total", "WAN Receive Broadcast Total", labelWan, nil), WanRxBytesR: prometheus.NewDesc(ns+"wan_receive_rate_bytes", "WAN Receive Bytes Rate", labelWan, nil), WanRxMulticast: prometheus.NewDesc(ns+"wan_receive_multicast_total", "WAN Receive Multicast Total", labelWan, nil), - WanSpeed: prometheus.NewDesc(ns+"wan_speed", "WAN Speed", labelWan, nil), + WanSpeed: prometheus.NewDesc(ns+"wan_speed_mbps", "WAN Speed", labelWan, nil), WanTxBroadcast: prometheus.NewDesc(ns+"wan_transmit_broadcast_total", "WAN Transmit Broadcast Total", labelWan, nil), WanTxBytesR: prometheus.NewDesc(ns+"wan_transmit_rate_bytes", "WAN Transmit Bytes Rate", labelWan, nil), WanTxDropped: prometheus.NewDesc(ns+"wan_transmit_dropped_total", "WAN Transmit Dropped Total", labelWan, nil), @@ -102,69 +101,78 @@ func descUSG(ns string) *usg { LanRxDropped: prometheus.NewDesc(ns+"lan_receive_dropped_total", "LAN Receive Dropped Total", labels, nil), LanTxPackets: prometheus.NewDesc(ns+"lan_transmit_packets_total", "LAN Transmit Packets Total", labels, nil), LanTxBytes: prometheus.NewDesc(ns+"lan_transmit_bytes_total", "LAN Transmit Bytes Total", labels, nil), - Latency: prometheus.NewDesc(ns+"speedtest_latency", "Speedtest Latency", labels, nil), + Latency: prometheus.NewDesc(ns+"speedtest_latency_seconds", "Speedtest Latency", labels, nil), Runtime: prometheus.NewDesc(ns+"speedtest_runtime", "Speedtest Run Time", labels, nil), - XputDownload: prometheus.NewDesc(ns+"speedtest_download_rate", "Speedtest Download Rate", labels, nil), - XputUpload: prometheus.NewDesc(ns+"speedtest_upload_rate", "Speedtest Upload Rate", labels, nil), + XputDownload: prometheus.NewDesc(ns+"speedtest_download", "Speedtest Download Rate", labels, nil), + XputUpload: prometheus.NewDesc(ns+"speedtest_upload", "Speedtest Upload Rate", labels, nil), } } -func (u *unifiCollector) exportUSGs(usgs []*unifi.USG, r *Report) { - for _, s := range usgs { - labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID, - s.Type, s.Version, s.IP} - labelWan := append([]string{"all"}, labels...) - - // Gateway System Data. - r.ch <- append([]*metricExports{ - {u.USG.Uptime, prometheus.GaugeValue, s.Uptime, labels}, - {u.USG.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, - {u.USG.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, - {u.USG.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, - {u.USG.NumSta, prometheus.GaugeValue, s.NumSta, labels}, - {u.USG.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, - {u.USG.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, - {u.USG.NumDesktop, prometheus.CounterValue, s.NumDesktop, labels}, - {u.USG.NumMobile, prometheus.CounterValue, s.NumMobile, labels}, - {u.USG.NumHandheld, prometheus.CounterValue, s.NumHandheld, labels}, - {u.USG.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, - {u.USG.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, - {u.USG.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, - {u.USG.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, - {u.USG.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, - {u.USG.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, - {u.USG.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, - {u.USG.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, - // Combined Port Stats - {u.USG.WanRxPackets, prometheus.CounterValue, s.Stat.Gw.WanRxPackets, labelWan}, - {u.USG.WanRxBytes, prometheus.CounterValue, s.Stat.Gw.WanRxBytes, labelWan}, - {u.USG.WanRxDropped, prometheus.CounterValue, s.Stat.Gw.WanRxDropped, labelWan}, - {u.USG.WanTxPackets, prometheus.CounterValue, s.Stat.Gw.WanTxPackets, labelWan}, - {u.USG.WanTxBytes, prometheus.CounterValue, s.Stat.Gw.WanTxBytes, labelWan}, - {u.USG.WanRxErrors, prometheus.CounterValue, s.Stat.Gw.WanRxErrors, labelWan}, - {u.USG.LanRxPackets, prometheus.CounterValue, s.Stat.Gw.LanRxPackets, labels}, - {u.USG.LanRxBytes, prometheus.CounterValue, s.Stat.Gw.LanRxBytes, labels}, - {u.USG.LanTxPackets, prometheus.CounterValue, s.Stat.Gw.LanTxPackets, labels}, - {u.USG.LanTxBytes, prometheus.CounterValue, s.Stat.Gw.LanTxBytes, labels}, - {u.USG.LanRxDropped, prometheus.CounterValue, s.Stat.Gw.LanRxDropped, labels}, - // Speed Test Stats - {u.USG.Latency, prometheus.GaugeValue, s.SpeedtestStatus.Latency, labels}, - {u.USG.Runtime, prometheus.GaugeValue, s.SpeedtestStatus.Runtime, labels}, - {u.USG.XputDownload, prometheus.GaugeValue, s.SpeedtestStatus.XputDownload, labels}, - {u.USG.XputUpload, prometheus.GaugeValue, s.SpeedtestStatus.XputUpload, labels}, - }, u.exportWANPorts(labels, s.Wan1, s.Wan2)...) +func (u *unifiCollector) exportUSGs(r *Report) { + if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.USGs) < 1 { + return } + r.wg.Add(1) + go func() { + defer r.wg.Done() + for _, s := range r.Metrics.Devices.USGs { + u.exportUSG(r, s) + } + }() +} + +func (u *unifiCollector) exportUSG(r *Report, s *unifi.USG) { + labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.Type, s.Version, s.IP} + labelWan := append([]string{"all"}, labels...) + + // Gateway System Data. + r.send([]*metricExports{ + {u.USG.Uptime, prometheus.GaugeValue, s.Uptime, labels}, + {u.USG.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, + {u.USG.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, + {u.USG.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, + {u.USG.NumSta, prometheus.GaugeValue, s.NumSta, labels}, + {u.USG.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, + {u.USG.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, + {u.USG.NumDesktop, prometheus.GaugeValue, s.NumDesktop, labels}, + {u.USG.NumMobile, prometheus.GaugeValue, s.NumMobile, labels}, + {u.USG.NumHandheld, prometheus.GaugeValue, s.NumHandheld, labels}, + {u.USG.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, + {u.USG.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, + {u.USG.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, + {u.USG.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, + {u.USG.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, + {u.USG.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, + {u.USG.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, + {u.USG.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + // Combined Port Stats + {u.USG.WanRxPackets, prometheus.CounterValue, s.Stat.Gw.WanRxPackets, labelWan}, + {u.USG.WanRxBytes, prometheus.CounterValue, s.Stat.Gw.WanRxBytes, labelWan}, + {u.USG.WanRxDropped, prometheus.CounterValue, s.Stat.Gw.WanRxDropped, labelWan}, + {u.USG.WanTxPackets, prometheus.CounterValue, s.Stat.Gw.WanTxPackets, labelWan}, + {u.USG.WanTxBytes, prometheus.CounterValue, s.Stat.Gw.WanTxBytes, labelWan}, + {u.USG.WanRxErrors, prometheus.CounterValue, s.Stat.Gw.WanRxErrors, labelWan}, + {u.USG.LanRxPackets, prometheus.CounterValue, s.Stat.Gw.LanRxPackets, labels}, + {u.USG.LanRxBytes, prometheus.CounterValue, s.Stat.Gw.LanRxBytes, labels}, + {u.USG.LanTxPackets, prometheus.CounterValue, s.Stat.Gw.LanTxPackets, labels}, + {u.USG.LanTxBytes, prometheus.CounterValue, s.Stat.Gw.LanTxBytes, labels}, + {u.USG.LanRxDropped, prometheus.CounterValue, s.Stat.Gw.LanRxDropped, labels}, + // Speed Test Stats + {u.USG.Latency, prometheus.GaugeValue, s.SpeedtestStatus.Latency.Val / 1000, labels}, + {u.USG.Runtime, prometheus.GaugeValue, s.SpeedtestStatus.Runtime, labels}, + {u.USG.XputDownload, prometheus.GaugeValue, s.SpeedtestStatus.XputDownload, labels}, + {u.USG.XputUpload, prometheus.GaugeValue, s.SpeedtestStatus.XputUpload, labels}, + }) + u.exportWANPorts(r, labels, s.Wan1, s.Wan2) } -func (u *unifiCollector) exportWANPorts(labels []string, wans ...unifi.Wan) []*metricExports { - metrics := []*metricExports{} +func (u *unifiCollector) exportWANPorts(r *Report, labels []string, wans ...unifi.Wan) { for _, wan := range wans { if !wan.Up.Val { continue // only record UP interfaces. } l := append([]string{wan.Name}, labels...) - - metrics = append(metrics, []*metricExports{ + r.send([]*metricExports{ {u.USG.WanRxPackets, prometheus.CounterValue, wan.RxPackets, l}, {u.USG.WanRxBytes, prometheus.CounterValue, wan.RxBytes, l}, {u.USG.WanRxDropped, prometheus.CounterValue, wan.RxDropped, l}, @@ -180,7 +188,6 @@ func (u *unifiCollector) exportWANPorts(labels []string, wans ...unifi.Wan) []*m {u.USG.WanTxErrors, prometheus.CounterValue, wan.TxErrors, l}, {u.USG.WanTxMulticast, prometheus.CounterValue, wan.TxMulticast, l}, {u.USG.WanBytesR, prometheus.GaugeValue, wan.BytesR, l}, - }...) + }) } - return metrics } diff --git a/promunifi/usw.go b/promunifi/usw.go index 27bed7447..92dc7ec96 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -70,8 +70,7 @@ func descUSW(ns string) *usw { } pns := ns + "port_" // The first five labels for switch are shared with (the same as) switch ports. - labels := []string{"type", "version", "ip", - "site_name", "mac", "model", "name", "serial", "site_id"} + labels := []string{"type", "version", "ip", "site_name", "mac", "model", "name", "serial"} // Copy labels, and replace first four with different names. labelP := append([]string{"port_num", "port_name", "port_mac", "port_ip"}, labels[5:]...) @@ -84,9 +83,9 @@ func descUSW(ns string) *usw { TotalTxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Total Transmitted Bytes", labels, nil), TotalRxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil), - NumSta: prometheus.NewDesc(ns+"num_stations_total", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"num_stations_user_total", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest_total", "Number of Guest Stations", labels, nil), + NumSta: prometheus.NewDesc(ns+"num_stations", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"num_stations_user", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest", "Number of Guest Stations", labels, nil), Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), @@ -124,8 +123,8 @@ func descUSW(ns string) *usw { RxErrors: prometheus.NewDesc(pns+"receive_errors_total", "Total Receive Errors", labelP, nil), RxMulticast: prometheus.NewDesc(pns+"receive_multicast_total", "Total Receive Multicast", labelP, nil), RxPackets: prometheus.NewDesc(pns+"receive_packets_total", "Total Receive Packets", labelP, nil), - Satisfaction: prometheus.NewDesc(pns+"satisfaction", "Satisfaction", labelP, nil), - Speed: prometheus.NewDesc(pns+"port_speed", "Speed", labelP, nil), + Satisfaction: prometheus.NewDesc(pns+"satisfaction_percent", "Satisfaction", labelP, nil), + Speed: prometheus.NewDesc(pns+"port_speed_mbps", "Speed", labelP, nil), TxBroadcast: prometheus.NewDesc(pns+"transmit_broadcast_total", "Total Transmit Broadcast", labelP, nil), TxBytes: prometheus.NewDesc(pns+"transmit_bytes_total", "Total Transmit Bytes", labelP, nil), TxBytesR: prometheus.NewDesc(pns+"transmit_rate_bytes", "Transmit Bytes Rate", labelP, nil), @@ -136,71 +135,83 @@ func descUSW(ns string) *usw { } } -func (u *unifiCollector) exportUSWs(usws []*unifi.USW, r *Report) { - for _, s := range usws { - labels := []string{s.Type, s.Version, s.IP, - s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.SiteID} - - metrics := []*metricExports{} - if s.HasTemperature.Val { - metrics = append(metrics, &metricExports{u.USW.Temperature, prometheus.GaugeValue, s.GeneralTemperature, labels}) - } - if s.HasFan.Val { - metrics = append(metrics, &metricExports{u.USW.FanLevel, prometheus.GaugeValue, s.FanLevel, labels}) +func (u *unifiCollector) exportUSWs(r *Report) { + if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.USWs) < 1 { + return + } + r.wg.Add(1) + go func() { + defer r.wg.Done() + for _, s := range r.Metrics.Devices.USWs { + u.exportUSW(r, s) } + }() +} - // Switch data. - r.ch <- append(metrics, append([]*metricExports{ - {u.USW.Uptime, prometheus.GaugeValue, s.Uptime, labels}, - {u.USW.TotalMaxPower, prometheus.GaugeValue, s.TotalMaxPower, labels}, - {u.USW.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, - {u.USW.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, - {u.USW.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, - {u.USW.NumSta, prometheus.GaugeValue, s.NumSta, labels}, - {u.USW.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, - {u.USW.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, - {u.USW.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, - {u.USW.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, - {u.USW.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, - {u.USW.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, - {u.USW.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, - {u.USW.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, - {u.USW.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, - {u.USW.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, - {u.USW.SwRxPackets, prometheus.CounterValue, s.Stat.Sw.RxPackets, labels}, - {u.USW.SwRxBytes, prometheus.CounterValue, s.Stat.Sw.RxBytes, labels}, - {u.USW.SwRxErrors, prometheus.CounterValue, s.Stat.Sw.RxErrors, labels}, - {u.USW.SwRxDropped, prometheus.CounterValue, s.Stat.Sw.RxDropped, labels}, - {u.USW.SwRxCrypts, prometheus.CounterValue, s.Stat.Sw.RxCrypts, labels}, - {u.USW.SwRxFrags, prometheus.CounterValue, s.Stat.Sw.RxFrags, labels}, - {u.USW.SwTxPackets, prometheus.CounterValue, s.Stat.Sw.TxPackets, labels}, - {u.USW.SwTxBytes, prometheus.CounterValue, s.Stat.Sw.TxBytes, labels}, - {u.USW.SwTxErrors, prometheus.CounterValue, s.Stat.Sw.TxErrors, labels}, - {u.USW.SwTxDropped, prometheus.CounterValue, s.Stat.Sw.TxDropped, labels}, - {u.USW.SwTxRetries, prometheus.CounterValue, s.Stat.Sw.TxRetries, labels}, - {u.USW.SwRxMulticast, prometheus.CounterValue, s.Stat.Sw.RxMulticast, labels}, - {u.USW.SwRxBroadcast, prometheus.CounterValue, s.Stat.Sw.RxBroadcast, labels}, - {u.USW.SwTxMulticast, prometheus.CounterValue, s.Stat.Sw.TxMulticast, labels}, - {u.USW.SwTxBroadcast, prometheus.CounterValue, s.Stat.Sw.TxBroadcast, labels}, - {u.USW.SwBytes, prometheus.CounterValue, s.Stat.Sw.Bytes, labels}, - }, u.exportPortTable(s.PortTable, labels[5:])...)...) +func (u *unifiCollector) exportUSW(r *Report, s *unifi.USW) { + labels := []string{s.Type, s.Version, s.IP, s.SiteName, s.Mac, s.Model, s.Name, s.Serial} + + if s.HasTemperature.Val { + r.send([]*metricExports{{u.USW.Temperature, prometheus.GaugeValue, s.GeneralTemperature, labels}}) + } + if s.HasFan.Val { + r.send([]*metricExports{{u.USW.FanLevel, prometheus.GaugeValue, s.FanLevel, labels}}) } + + // Switch data. + r.send([]*metricExports{ + {u.USW.Uptime, prometheus.GaugeValue, s.Uptime, labels}, + {u.USW.TotalMaxPower, prometheus.GaugeValue, s.TotalMaxPower, labels}, + {u.USW.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, + {u.USW.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, + {u.USW.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, + {u.USW.NumSta, prometheus.GaugeValue, s.NumSta, labels}, + {u.USW.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, + {u.USW.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, + {u.USW.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, + {u.USW.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, + {u.USW.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, + {u.USW.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, + {u.USW.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, + {u.USW.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, + {u.USW.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, + {u.USW.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + {u.USW.SwRxPackets, prometheus.CounterValue, s.Stat.Sw.RxPackets, labels}, + {u.USW.SwRxBytes, prometheus.CounterValue, s.Stat.Sw.RxBytes, labels}, + {u.USW.SwRxErrors, prometheus.CounterValue, s.Stat.Sw.RxErrors, labels}, + {u.USW.SwRxDropped, prometheus.CounterValue, s.Stat.Sw.RxDropped, labels}, + {u.USW.SwRxCrypts, prometheus.CounterValue, s.Stat.Sw.RxCrypts, labels}, + {u.USW.SwRxFrags, prometheus.CounterValue, s.Stat.Sw.RxFrags, labels}, + {u.USW.SwTxPackets, prometheus.CounterValue, s.Stat.Sw.TxPackets, labels}, + {u.USW.SwTxBytes, prometheus.CounterValue, s.Stat.Sw.TxBytes, labels}, + {u.USW.SwTxErrors, prometheus.CounterValue, s.Stat.Sw.TxErrors, labels}, + {u.USW.SwTxDropped, prometheus.CounterValue, s.Stat.Sw.TxDropped, labels}, + {u.USW.SwTxRetries, prometheus.CounterValue, s.Stat.Sw.TxRetries, labels}, + {u.USW.SwRxMulticast, prometheus.CounterValue, s.Stat.Sw.RxMulticast, labels}, + {u.USW.SwRxBroadcast, prometheus.CounterValue, s.Stat.Sw.RxBroadcast, labels}, + {u.USW.SwTxMulticast, prometheus.CounterValue, s.Stat.Sw.TxMulticast, labels}, + {u.USW.SwTxBroadcast, prometheus.CounterValue, s.Stat.Sw.TxBroadcast, labels}, + {u.USW.SwBytes, prometheus.CounterValue, s.Stat.Sw.Bytes, labels}, + }) + u.exportPortTable(r, s.PortTable, labels[5:]) } -func (u *unifiCollector) exportPortTable(pt []unifi.Port, labels []string) []*metricExports { - metrics := []*metricExports{} +func (u *unifiCollector) exportPortTable(r *Report, pt []unifi.Port, labels []string) { // Per-port data on a switch for _, p := range pt { + if !p.Up.Val { + continue + } // Copy labels, and add four new ones. l := append([]string{p.PortIdx.Txt, p.Name, p.Mac, p.IP}, labels...) if p.PoeEnable.Val && p.PortPoe.Val { - metrics = append(metrics, []*metricExports{ + r.send([]*metricExports{ {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}, {u.USW.PoePower, prometheus.GaugeValue, p.PoePower, l}, {u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, l}, - }...) + }) } - metrics = append(metrics, []*metricExports{ + r.send([]*metricExports{ {u.USW.RxBroadcast, prometheus.CounterValue, p.RxBroadcast, l}, {u.USW.RxBytes, prometheus.CounterValue, p.RxBytes, l}, {u.USW.RxBytesR, prometheus.GaugeValue, p.RxBytesR, l}, @@ -216,7 +227,6 @@ func (u *unifiCollector) exportPortTable(pt []unifi.Port, labels []string) []*me {u.USW.TxDropped, prometheus.CounterValue, p.TxDropped, l}, {u.USW.TxErrors, prometheus.CounterValue, p.TxErrors, l}, {u.USW.TxMulticast, prometheus.CounterValue, p.TxMulticast, l}, - }...) + }) } - return metrics } From 204a93fab1ba6c59dc35fae1f53dea8b2d8e37ba Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 02:30:39 -0800 Subject: [PATCH 54/85] more fixes! --- promunifi/site.go | 26 +++++++++++++------------- promunifi/uap.go | 14 +++++++------- promunifi/usg.go | 14 ++++++-------- promunifi/usw.go | 6 +++--- 4 files changed, 29 insertions(+), 31 deletions(-) diff --git a/promunifi/site.go b/promunifi/site.go index 731f844f0..202fc57e7 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -50,27 +50,27 @@ func descSite(ns string) *site { labels := []string{"subsystem", "status", "name", "desc", "site_name"} return &site{ - NumUser: prometheus.NewDesc(ns+"num_user", "Number of Users", labels, nil), - NumGuest: prometheus.NewDesc(ns+"num_guest", "Number of Guests", labels, nil), - NumIot: prometheus.NewDesc(ns+"num_iot", "Number of IoT Devices", labels, nil), + NumUser: prometheus.NewDesc(ns+"users", "Number of Users", labels, nil), + NumGuest: prometheus.NewDesc(ns+"guests", "Number of Guests", labels, nil), + NumIot: prometheus.NewDesc(ns+"iots", "Number of IoT Devices", labels, nil), TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Bytes Transmit Rate", labels, nil), RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Bytes Receive Rate", labels, nil), - NumAp: prometheus.NewDesc(ns+"num_ap", "Access Point Count", labels, nil), - NumAdopted: prometheus.NewDesc(ns+"num_adopted", "Adoption Count", labels, nil), - NumDisabled: prometheus.NewDesc(ns+"num_disabled", "Disabled Count", labels, nil), - NumDisconnected: prometheus.NewDesc(ns+"num_disconnected", "Disconnected Count", labels, nil), - NumPending: prometheus.NewDesc(ns+"num_pending", "Pending Count", labels, nil), - NumGw: prometheus.NewDesc(ns+"num_gateways", "Gateway Count", labels, nil), - NumSw: prometheus.NewDesc(ns+"num_switches", "Switch Count", labels, nil), - NumSta: prometheus.NewDesc(ns+"num_stations", "Station Count", labels, nil), + NumAp: prometheus.NewDesc(ns+"aps", "Access Point Count", labels, nil), + NumAdopted: prometheus.NewDesc(ns+"adopted", "Adoption Count", labels, nil), + NumDisabled: prometheus.NewDesc(ns+"disabled", "Disabled Count", labels, nil), + NumDisconnected: prometheus.NewDesc(ns+"disconnected", "Disconnected Count", labels, nil), + NumPending: prometheus.NewDesc(ns+"pending", "Pending Count", labels, nil), + NumGw: prometheus.NewDesc(ns+"gateways", "Gateway Count", labels, nil), + NumSw: prometheus.NewDesc(ns+"switches", "Switch Count", labels, nil), + NumSta: prometheus.NewDesc(ns+"stations", "Station Count", labels, nil), Latency: prometheus.NewDesc(ns+"latency_seconds", "Latency", labels, nil), Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Uptime", labels, nil), Drops: prometheus.NewDesc(ns+"intenet_drops_total", "Internet (WAN) Disconnections", labels, nil), XputUp: prometheus.NewDesc(ns+"xput_up_rate", "Speedtest Upload", labels, nil), XputDown: prometheus.NewDesc(ns+"xput_down_rate", "Speedtest Download", labels, nil), SpeedtestPing: prometheus.NewDesc(ns+"speedtest_ping", "Speedtest Ping", labels, nil), - RemoteUserNumActive: prometheus.NewDesc(ns+"num_remote_user_active", "Remote Users Active", labels, nil), - RemoteUserNumInactive: prometheus.NewDesc(ns+"num_remote_user_inactive", "Remote Users Inactive", labels, nil), + RemoteUserNumActive: prometheus.NewDesc(ns+"remote_user_active", "Remote Users Active", labels, nil), + RemoteUserNumInactive: prometheus.NewDesc(ns+"remote_user_inactive", "Remote Users Inactive", labels, nil), RemoteUserRxBytes: prometheus.NewDesc(ns+"remote_user_receive_bytes_total", "Remote Users Receive Bytes", labels, nil), RemoteUserTxBytes: prometheus.NewDesc(ns+"remote_user_transmit_bytes_total", "Remote Users Transmit Bytes", labels, nil), RemoteUserRxPackets: prometheus.NewDesc(ns+"remote_user_receive_packets_total", "Remote Users Receive Packets", labels, nil), diff --git a/promunifi/uap.go b/promunifi/uap.go index 5c3ea2f3a..a7815d3ef 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -121,9 +121,9 @@ func descUAP(ns string) *uap { TxBytesD: prometheus.NewDesc(ns+"d_tranmsit_bytes", "Transmit Bytes D???", labels, nil), RxBytesD: prometheus.NewDesc(ns+"d_receive_bytes", "Receive Bytes D???", labels, nil), BytesR: prometheus.NewDesc(ns+"rate_bytes", "Transfer Rate", labels, nil), - NumSta: prometheus.NewDesc(ns+"num_stations", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"num_stations_user", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest", "Number of Guest Stations", labels, nil), + NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"stations_user", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"stations_guest", "Number of Guest Stations", labels, nil), Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), @@ -153,7 +153,7 @@ func descUAP(ns string) *uap { // N each - 1 per Virtual AP (VAP) VAPCcq: prometheus.NewDesc(ns+"vap_ccq", "VAP Client Connection Quality", labelV, nil), VAPMacFilterRejections: prometheus.NewDesc(ns+"vap_mac_filter_rejects_total", "VAP MAC Filter Rejections", labelV, nil), - VAPNumSatisfactionSta: prometheus.NewDesc(ns+"vap_num_satisfaction_stations", "VAP Number Satisifaction Stations", labelV, nil), + VAPNumSatisfactionSta: prometheus.NewDesc(ns+"vap_satisfaction_stations", "VAP Number Satisifaction Stations", labelV, nil), VAPAvgClientSignal: prometheus.NewDesc(ns+"vap_average_client_signal", "VAP Average Client Signal", labelV, nil), VAPSatisfaction: prometheus.NewDesc(ns+"vap_satisfaction_percent", "VAP Satisfaction", labelV, nil), VAPSatisfactionNow: prometheus.NewDesc(ns+"vap_satisfaction_now_percent", "VAP Satisfaction Now", labelV, nil), @@ -205,9 +205,9 @@ func descUAP(ns string) *uap { RadioCuTotal: prometheus.NewDesc(ns+"radio_channel_utilization_total", "Radio Channel Utilization", labelR, nil), RadioExtchannel: prometheus.NewDesc(ns+"radio_ext_channel", "Radio Ext Channel", labelR, nil), RadioGain: prometheus.NewDesc(ns+"radio_gain", "Radio Gain", labelR, nil), - RadioGuestNumSta: prometheus.NewDesc(ns+"radio_num_guest_stations", "Radio Guest Station Count", labelR, nil), - RadioNumSta: prometheus.NewDesc(ns+"radio_num_stations", "Radio Total Station Count", labelR, nil), - RadioUserNumSta: prometheus.NewDesc(ns+"radio_num_user_stations", "Radio User Station Count", labelR, nil), + RadioGuestNumSta: prometheus.NewDesc(ns+"radio_guest_stations", "Radio Guest Station Count", labelR, nil), + RadioNumSta: prometheus.NewDesc(ns+"radio_stations", "Radio Total Station Count", labelR, nil), + RadioUserNumSta: prometheus.NewDesc(ns+"radio_user_stations", "Radio User Station Count", labelR, nil), RadioTxPackets: prometheus.NewDesc(ns+"radio_transmit_packets_total", "Radio Transmitted Packets", labelR, nil), RadioTxRetries: prometheus.NewDesc(ns+"radio_transmit_retries_total", "Radio Transmit Retries", labelR, nil), } diff --git a/promunifi/usg.go b/promunifi/usg.go index f758fa258..ea94aa8eb 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -7,7 +7,6 @@ import ( type usg struct { Uptime *prometheus.Desc - Temperature *prometheus.Desc TotalMaxPower *prometheus.Desc FanLevel *prometheus.Desc TotalTxBytes *prometheus.Desc @@ -66,12 +65,12 @@ func descUSG(ns string) *usg { TotalTxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Total Transmitted Bytes", labels, nil), TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Total Bytes Transferred", labels, nil), - NumSta: prometheus.NewDesc(ns+"num_stations", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"num_stations_user", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest", "Number of Guest Stations", labels, nil), - NumDesktop: prometheus.NewDesc(ns+"num_desktops", "Number of Desktops", labels, nil), - NumMobile: prometheus.NewDesc(ns+"num_mobile", "Number of Mobiles", labels, nil), - NumHandheld: prometheus.NewDesc(ns+"num_handheld", "Number of Handhelds", labels, nil), + NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"stations_user", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"stations_guest", "Number of Guest Stations", labels, nil), + NumDesktop: prometheus.NewDesc(ns+"desktops", "Number of Desktops", labels, nil), + NumMobile: prometheus.NewDesc(ns+"mobile", "Number of Mobiles", labels, nil), + NumHandheld: prometheus.NewDesc(ns+"handheld", "Number of Handhelds", labels, nil), Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), @@ -124,7 +123,6 @@ func (u *unifiCollector) exportUSGs(r *Report) { func (u *unifiCollector) exportUSG(r *Report, s *unifi.USG) { labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.Type, s.Version, s.IP} labelWan := append([]string{"all"}, labels...) - // Gateway System Data. r.send([]*metricExports{ {u.USG.Uptime, prometheus.GaugeValue, s.Uptime, labels}, diff --git a/promunifi/usw.go b/promunifi/usw.go index 92dc7ec96..7bd6a590c 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -83,9 +83,9 @@ func descUSW(ns string) *usw { TotalTxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Total Transmitted Bytes", labels, nil), TotalRxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil), - NumSta: prometheus.NewDesc(ns+"num_stations", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"num_stations_user", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"num_stations_guest", "Number of Guest Stations", labels, nil), + NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"stations_user", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"stations_guest", "Number of Guest Stations", labels, nil), Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), From 3db371fe6f5a4d13f4bf55f3c0ba68b17c81f7c1 Mon Sep 17 00:00:00 2001 From: David Newhall II Date: Thu, 28 Nov 2019 02:32:12 -0800 Subject: [PATCH 55/85] Update promunifi/usw.go Co-Authored-By: Ben Kochie --- promunifi/usw.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/promunifi/usw.go b/promunifi/usw.go index 7bd6a590c..03d287fca 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -77,7 +77,7 @@ func descUSW(ns string) *usw { return &usw{ // switch data Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), - Temperature: prometheus.NewDesc(ns+"temperature", "Temperature", labels, nil), + Temperature: prometheus.NewDesc(ns+"temperature_celsius", "Temperature", labels, nil), TotalMaxPower: prometheus.NewDesc(ns+"max_power_total", "Total Max Power", labels, nil), FanLevel: prometheus.NewDesc(ns+"fan_level", "Fan Level", labels, nil), TotalTxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Total Transmitted Bytes", labels, nil), From 6388d32b44acde8c6a7cfa75b2d20cde7961c1d4 Mon Sep 17 00:00:00 2001 From: David Newhall II Date: Thu, 28 Nov 2019 02:33:40 -0800 Subject: [PATCH 56/85] Update promunifi/clients.go Co-Authored-By: Ben Kochie --- promunifi/clients.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index b6cbb54e6..6991cf29b 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -55,7 +55,7 @@ func descClient(ns string) *uclient { CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labelWireless, wireless), Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labelWireless, wireless), RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labelWireless, wireless), - RSSI: prometheus.NewDesc(ns+"rssi", "Client RSSI", labelWireless, wireless), + RSSI: prometheus.NewDesc(ns+"rssi_db", "Client RSSI", labelWireless, wireless), RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labelWireless, wireless), RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labelWireless, wireless), RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labelWireless, wireless), From 13b188bccb163959c4d895e9f3069e6801724f80 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 02:40:29 -0800 Subject: [PATCH 57/85] convert speeds to bps --- promunifi/clients.go | 8 ++++---- promunifi/usg.go | 4 ++-- promunifi/usw.go | 4 ++-- 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 6991cf29b..cd78063ad 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -59,13 +59,13 @@ func descClient(ns string) *uclient { RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labelWireless, wireless), RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labelWireless, wireless), RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labelWireless, wireless), - RxRate: prometheus.NewDesc(ns+"radio_receive_rate_mbps", "Client Receive Rate", labelWireless, wireless), + RxRate: prometheus.NewDesc(ns+"radio_receive_rate_bps", "Client Receive Rate", labelWireless, wireless), Signal: prometheus.NewDesc(ns+"radio_signal_db", "Client Signal Strength", labelWireless, wireless), TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labelWireless, wireless), TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labelWireless, wireless), TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labelWireless, wireless), TxPower: prometheus.NewDesc(ns+"radio_transmit_power", "Client Transmit Power", labelWireless, wireless), - TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_mbps", "Client Transmit Rate", labelWireless, wireless), + TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_bps", "Client Transmit Rate", labelWireless, wireless), WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelWireless, wireless), WiredRxBytes: prometheus.NewDesc(ns+"wired_receive_bytes_total", "Client Wired Receive Bytes", labelWired, wired), @@ -123,9 +123,9 @@ func (u *unifiCollector) exportClient(r *Report, c *unifi.Client) { {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labelWireless}, {u.Client.Signal, prometheus.GaugeValue, c.Signal, labelWireless}, {u.Client.TxPower, prometheus.GaugeValue, c.TxPower, labelWireless}, - {u.Client.TxRate, prometheus.GaugeValue, c.TxRate / 1000, labelWireless}, + {u.Client.TxRate, prometheus.GaugeValue, c.TxRate * 1000, labelWireless}, {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labelWireless}, - {u.Client.RxRate, prometheus.GaugeValue, c.RxRate / 1000, labelWireless}, + {u.Client.RxRate, prometheus.GaugeValue, c.RxRate * 1000, labelWireless}, {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labelWireless}, {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labelWireless}, {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labelWireless}, diff --git a/promunifi/usg.go b/promunifi/usg.go index ea94aa8eb..c21def5c9 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -88,7 +88,7 @@ func descUSG(ns string) *usg { WanRxBroadcast: prometheus.NewDesc(ns+"wan_receive_broadcast_total", "WAN Receive Broadcast Total", labelWan, nil), WanRxBytesR: prometheus.NewDesc(ns+"wan_receive_rate_bytes", "WAN Receive Bytes Rate", labelWan, nil), WanRxMulticast: prometheus.NewDesc(ns+"wan_receive_multicast_total", "WAN Receive Multicast Total", labelWan, nil), - WanSpeed: prometheus.NewDesc(ns+"wan_speed_mbps", "WAN Speed", labelWan, nil), + WanSpeed: prometheus.NewDesc(ns+"wan_speed_bps", "WAN Speed", labelWan, nil), WanTxBroadcast: prometheus.NewDesc(ns+"wan_transmit_broadcast_total", "WAN Transmit Broadcast Total", labelWan, nil), WanTxBytesR: prometheus.NewDesc(ns+"wan_transmit_rate_bytes", "WAN Transmit Bytes Rate", labelWan, nil), WanTxDropped: prometheus.NewDesc(ns+"wan_transmit_dropped_total", "WAN Transmit Dropped Total", labelWan, nil), @@ -179,7 +179,7 @@ func (u *unifiCollector) exportWANPorts(r *Report, labels []string, wans ...unif {u.USG.WanTxBytes, prometheus.CounterValue, wan.TxBytes, l}, {u.USG.WanRxBroadcast, prometheus.CounterValue, wan.RxBroadcast, l}, {u.USG.WanRxMulticast, prometheus.CounterValue, wan.RxMulticast, l}, - {u.USG.WanSpeed, prometheus.CounterValue, wan.Speed, l}, + {u.USG.WanSpeed, prometheus.CounterValue, wan.Speed * 1000000, l}, {u.USG.WanTxBroadcast, prometheus.CounterValue, wan.TxBroadcast, l}, {u.USG.WanTxBytesR, prometheus.CounterValue, wan.TxBytesR, l}, {u.USG.WanTxDropped, prometheus.CounterValue, wan.TxDropped, l}, diff --git a/promunifi/usw.go b/promunifi/usw.go index 03d287fca..8981604a9 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -124,7 +124,7 @@ func descUSW(ns string) *usw { RxMulticast: prometheus.NewDesc(pns+"receive_multicast_total", "Total Receive Multicast", labelP, nil), RxPackets: prometheus.NewDesc(pns+"receive_packets_total", "Total Receive Packets", labelP, nil), Satisfaction: prometheus.NewDesc(pns+"satisfaction_percent", "Satisfaction", labelP, nil), - Speed: prometheus.NewDesc(pns+"port_speed_mbps", "Speed", labelP, nil), + Speed: prometheus.NewDesc(pns+"port_speed_bps", "Speed", labelP, nil), TxBroadcast: prometheus.NewDesc(pns+"transmit_broadcast_total", "Total Transmit Broadcast", labelP, nil), TxBytes: prometheus.NewDesc(pns+"transmit_bytes_total", "Total Transmit Bytes", labelP, nil), TxBytesR: prometheus.NewDesc(pns+"transmit_rate_bytes", "Transmit Bytes Rate", labelP, nil), @@ -220,7 +220,7 @@ func (u *unifiCollector) exportPortTable(r *Report, pt []unifi.Port, labels []st {u.USW.RxMulticast, prometheus.CounterValue, p.RxMulticast, l}, {u.USW.RxPackets, prometheus.CounterValue, p.RxPackets, l}, {u.USW.Satisfaction, prometheus.GaugeValue, p.Satisfaction, l}, - {u.USW.Speed, prometheus.GaugeValue, p.Speed, l}, + {u.USW.Speed, prometheus.GaugeValue, p.Speed * 1000000, l}, {u.USW.TxBroadcast, prometheus.CounterValue, p.TxBroadcast, l}, {u.USW.TxBytes, prometheus.CounterValue, p.TxBytes, l}, {u.USW.TxBytesR, prometheus.GaugeValue, p.TxBytesR, l}, From b99253d0929868ac9c98ff1f6b417519e9c43906 Mon Sep 17 00:00:00 2001 From: David Newhall II Date: Thu, 28 Nov 2019 02:41:27 -0800 Subject: [PATCH 58/85] Update promunifi/clients.go Co-Authored-By: Ben Kochie --- promunifi/clients.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index cd78063ad..7497fdc0d 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -64,7 +64,7 @@ func descClient(ns string) *uclient { TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labelWireless, wireless), TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labelWireless, wireless), TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labelWireless, wireless), - TxPower: prometheus.NewDesc(ns+"radio_transmit_power", "Client Transmit Power", labelWireless, wireless), + TxPower: prometheus.NewDesc(ns+"radio_transmit_power_dbm", "Client Transmit Power", labelWireless, wireless), TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_bps", "Client Transmit Rate", labelWireless, wireless), WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelWireless, wireless), From 63bf858deade7dc3a6e33dc44eb45ab1fb70af68 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 02:45:59 -0800 Subject: [PATCH 59/85] fixes --- promunifi/clients.go | 2 +- promunifi/collector.go | 10 ++++++++-- promunifi/site.go | 2 +- promunifi/uap.go | 3 +-- promunifi/udm.go | 2 +- promunifi/usg.go | 4 ++-- promunifi/usw.go | 4 ++-- 7 files changed, 16 insertions(+), 11 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 7497fdc0d..17229a2df 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -91,7 +91,7 @@ func (u *unifiCollector) exportClients(r *Report) { if r.Metrics == nil || len(r.Metrics.Clients) < 1 { return } - r.wg.Add(1) + r.wg.Add(one) go func() { defer r.wg.Done() for _, c := range r.Metrics.Clients { diff --git a/promunifi/collector.go b/promunifi/collector.go index 9bdbdd291..96da4aa8b 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -12,6 +12,12 @@ import ( "golift.io/unifi" ) +// satisfy gomnd +const one = 1 + +// channel buffer, fits at least one batch. +const buffer = 50 + // UnifiCollectorCnfg defines the data needed to collect and report UniFi Metrics. type UnifiCollectorCnfg struct { // If non-empty, each of the collected metrics is prefixed by the @@ -104,7 +110,7 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { // the current metrics (from another package) then exports them for prometheus. func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { var err error - r := &Report{Start: time.Now(), ch: make(chan []*metricExports, 50)} + r := &Report{Start: time.Now(), ch: make(chan []*metricExports, buffer)} defer func() { r.wg.Wait() close(r.ch) @@ -168,6 +174,6 @@ func (u *unifiCollector) exportMetrics(r *Report, ch chan<- prometheus.Metric) { } func (r *Report) send(m []*metricExports) { - r.wg.Add(1) + r.wg.Add(one) r.ch <- m } diff --git a/promunifi/site.go b/promunifi/site.go index 202fc57e7..d39994e87 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -82,7 +82,7 @@ func (u *unifiCollector) exportSites(r *Report) { if r.Metrics == nil || len(r.Metrics.Sites) < 1 { return } - r.wg.Add(1) + r.wg.Add(one) go func() { defer r.wg.Done() for _, s := range r.Metrics.Sites { diff --git a/promunifi/uap.go b/promunifi/uap.go index a7815d3ef..acb56e1f7 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -217,7 +217,7 @@ func (u *unifiCollector) exportUAPs(r *Report) { if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.UAPs) < 1 { return } - r.wg.Add(1) + r.wg.Add(one) go func() { defer r.wg.Done() for _, a := range r.Metrics.Devices.UAPs { @@ -310,7 +310,6 @@ func (u *unifiCollector) exportUAPstat(r *Report, labels []string, a *unifi.Ap) } func (u *unifiCollector) exportVAPtable(r *Report, labels []string, vt unifi.VapTable, rt unifi.RadioTable, rts unifi.RadioTableStats) { - // vap table stats for _, v := range vt { if !v.Up.Val { diff --git a/promunifi/udm.go b/promunifi/udm.go index 1ebc5c274..5cc4142a0 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -13,7 +13,7 @@ func (u *unifiCollector) exportUDMs(r *Report) { if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.UDMs) < 1 { return } - r.wg.Add(1) + r.wg.Add(one) go func() { defer r.wg.Done() for _, d := range r.Metrics.Devices.UDMs { diff --git a/promunifi/usg.go b/promunifi/usg.go index c21def5c9..2a05a178d 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -111,7 +111,7 @@ func (u *unifiCollector) exportUSGs(r *Report) { if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.USGs) < 1 { return } - r.wg.Add(1) + r.wg.Add(one) go func() { defer r.wg.Done() for _, s := range r.Metrics.Devices.USGs { @@ -179,7 +179,7 @@ func (u *unifiCollector) exportWANPorts(r *Report, labels []string, wans ...unif {u.USG.WanTxBytes, prometheus.CounterValue, wan.TxBytes, l}, {u.USG.WanRxBroadcast, prometheus.CounterValue, wan.RxBroadcast, l}, {u.USG.WanRxMulticast, prometheus.CounterValue, wan.RxMulticast, l}, - {u.USG.WanSpeed, prometheus.CounterValue, wan.Speed * 1000000, l}, + {u.USG.WanSpeed, prometheus.CounterValue, wan.Speed.Val * 1000000, l}, {u.USG.WanTxBroadcast, prometheus.CounterValue, wan.TxBroadcast, l}, {u.USG.WanTxBytesR, prometheus.CounterValue, wan.TxBytesR, l}, {u.USG.WanTxDropped, prometheus.CounterValue, wan.TxDropped, l}, diff --git a/promunifi/usw.go b/promunifi/usw.go index 8981604a9..587fcb5ac 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -139,7 +139,7 @@ func (u *unifiCollector) exportUSWs(r *Report) { if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.USWs) < 1 { return } - r.wg.Add(1) + r.wg.Add(one) go func() { defer r.wg.Done() for _, s := range r.Metrics.Devices.USWs { @@ -220,7 +220,7 @@ func (u *unifiCollector) exportPortTable(r *Report, pt []unifi.Port, labels []st {u.USW.RxMulticast, prometheus.CounterValue, p.RxMulticast, l}, {u.USW.RxPackets, prometheus.CounterValue, p.RxPackets, l}, {u.USW.Satisfaction, prometheus.GaugeValue, p.Satisfaction, l}, - {u.USW.Speed, prometheus.GaugeValue, p.Speed * 1000000, l}, + {u.USW.Speed, prometheus.GaugeValue, p.Speed.Val * 1000000, l}, {u.USW.TxBroadcast, prometheus.CounterValue, p.TxBroadcast, l}, {u.USW.TxBytes, prometheus.CounterValue, p.TxBytes, l}, {u.USW.TxBytesR, prometheus.GaugeValue, p.TxBytesR, l}, From 8fd947daf2be32b2cfa4a190cffd571f14ae328e Mon Sep 17 00:00:00 2001 From: David Newhall II Date: Thu, 28 Nov 2019 02:57:34 -0800 Subject: [PATCH 60/85] Apply suggestions from code review Co-Authored-By: Ben Kochie --- promunifi/clients.go | 2 +- promunifi/usg.go | 2 +- promunifi/usw.go | 12 ++++++------ 3 files changed, 8 insertions(+), 8 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 17229a2df..ce8843ffc 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -75,7 +75,7 @@ func descClient(ns string) *uclient { WiredTxBytesR: prometheus.NewDesc(ns+"wired_transmit_rate_bytes", "Client Wired Data Rate", labelWired, wired), WiredTxPackets: prometheus.NewDesc(ns+"wired_transmit_packets_total", "Client Wired Transmit Packets", labelWired, wired), - Uptime: prometheus.NewDesc(ns+"uptime", "Client Uptime", labels, nil), + Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Client Uptime", labels, nil), /* needs more "looking into" DpiStatsApp: prometheus.NewDesc(ns+"dpi_stats_app", "Client DPI Stats App", labels, nil), DpiStatsCat: prometheus.NewDesc(ns+"dpi_stats_cat", "Client DPI Stats Cat", labels, nil), diff --git a/promunifi/usg.go b/promunifi/usg.go index 2a05a178d..479e97904 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -61,7 +61,7 @@ func descUSG(ns string) *usg { labelWan := append([]string{"port"}, labels...) return &usg{ - Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), + Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Uptime", labels, nil), TotalTxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Total Transmitted Bytes", labels, nil), TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Total Bytes Transferred", labels, nil), diff --git a/promunifi/usw.go b/promunifi/usw.go index 587fcb5ac..29f77544d 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -76,7 +76,7 @@ func descUSW(ns string) *usw { return &usw{ // switch data - Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), + Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Uptime", labels, nil), Temperature: prometheus.NewDesc(ns+"temperature_celsius", "Temperature", labels, nil), TotalMaxPower: prometheus.NewDesc(ns+"max_power_total", "Total Max Power", labels, nil), FanLevel: prometheus.NewDesc(ns+"fan_level", "Fan Level", labels, nil), @@ -84,8 +84,8 @@ func descUSW(ns string) *usw { TotalRxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil), NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"stations_user", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"stations_guest", "Number of Guest Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"user_stations", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"guest_stations", "Number of Guest Stations", labels, nil), Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), @@ -113,9 +113,9 @@ func descUSW(ns string) *usw { SwBytes: prometheus.NewDesc(ns+"switch_bytes_total", "Switch Bytes Transferred Total", labels, nil), // per-port data - PoeCurrent: prometheus.NewDesc(pns+"poe_current", "POE Current", labelP, nil), - PoePower: prometheus.NewDesc(pns+"poe_power", "POE Power", labelP, nil), - PoeVoltage: prometheus.NewDesc(pns+"poe_voltage", "POE Voltage", labelP, nil), + PoeCurrent: prometheus.NewDesc(pns+"poe_amperes", "POE Current", labelP, nil), + PoePower: prometheus.NewDesc(pns+"poe_watts", "POE Power", labelP, nil), + PoeVoltage: prometheus.NewDesc(pns+"poe_volts", "POE Voltage", labelP, nil), RxBroadcast: prometheus.NewDesc(pns+"receive_broadcast_total", "Receive Broadcast", labelP, nil), RxBytes: prometheus.NewDesc(pns+"receive_bytes_total", "Total Receive Bytes", labelP, nil), RxBytesR: prometheus.NewDesc(pns+"receive_rate_bytes", "Receive Bytes Rate", labelP, nil), From 898b1452795f6c7385109ad1f43d44d40a897774 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 03:08:13 -0800 Subject: [PATCH 61/85] fix a few more unit locations --- promunifi/uap.go | 4 ++-- promunifi/usg.go | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/promunifi/uap.go b/promunifi/uap.go index acb56e1f7..2f52e1c35 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -122,8 +122,8 @@ func descUAP(ns string) *uap { RxBytesD: prometheus.NewDesc(ns+"d_receive_bytes", "Receive Bytes D???", labels, nil), BytesR: prometheus.NewDesc(ns+"rate_bytes", "Transfer Rate", labels, nil), NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"stations_user", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"stations_guest", "Number of Guest Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"user_stations", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"guest_stations", "Number of Guest Stations", labels, nil), Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), diff --git a/promunifi/usg.go b/promunifi/usg.go index 479e97904..094cc2fb8 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -66,8 +66,8 @@ func descUSG(ns string) *usg { TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil), TotalBytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Total Bytes Transferred", labels, nil), NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"stations_user", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"stations_guest", "Number of Guest Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"user_stations", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"guest_stations", "Number of Guest Stations", labels, nil), NumDesktop: prometheus.NewDesc(ns+"desktops", "Number of Desktops", labels, nil), NumMobile: prometheus.NewDesc(ns+"mobile", "Number of Mobiles", labels, nil), NumHandheld: prometheus.NewDesc(ns+"handheld", "Number of Handhelds", labels, nil), From 3444db73d4b622b8348d1ef5c432ed906d162694 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 03:34:29 -0800 Subject: [PATCH 62/85] small qol update --- init/docker/docker-compose.env.example | 2 +- init/docker/docker-compose.yml | 2 +- poller/config.go | 40 +++++++++++++------------- 3 files changed, 22 insertions(+), 22 deletions(-) diff --git a/init/docker/docker-compose.env.example b/init/docker/docker-compose.env.example index 6c48b3cfd..1222c0c86 100644 --- a/init/docker/docker-compose.env.example +++ b/init/docker/docker-compose.env.example @@ -9,4 +9,4 @@ UP_BRANCH=stable UP_UNIFI_USER=influx UP_UNIFI_PASS= UP_UNIFI_URL=https://127.0.0.1:8443 -UP_DEBUG_MODE=false +UP_DEBUG=false diff --git a/init/docker/docker-compose.yml b/init/docker/docker-compose.yml index f9f6a77e6..fcdbdddf7 100644 --- a/init/docker/docker-compose.yml +++ b/init/docker/docker-compose.yml @@ -48,7 +48,7 @@ services: - UP_UNIFI_USER=${UP_UNIFI_USER} - UP_UNIFI_PASS=${UP_UNIFI_PASS} - UP_UNIFI_URL=${UP_UNIFI_URL} - - UP_DEBUG_MODE=${UP_DEBUG_MODE} + - UP_DEBUG=${UP_DEBUG} volumes: influxdb-storage: chronograf-storage: diff --git a/poller/config.go b/poller/config.go index 0f12ff089..5a46469cb 100644 --- a/poller/config.go +++ b/poller/config.go @@ -61,24 +61,24 @@ type Flag struct { // This is all of the data stored in the config file. // Any with explicit defaults have omitempty on json and toml tags. type Config struct { - Interval Duration `json:"interval,omitempty" toml:"interval,omitempty" xml:"interval" yaml:"interval" env:"POLLING_INTERVAL"` - Debug bool `json:"debug" toml:"debug" xml:"debug" yaml:"debug" env:"DEBUG_MODE"` - Quiet bool `json:"quiet,omitempty" toml:"quiet,omitempty" xml:"quiet" yaml:"quiet" env:"QUIET_MODE"` - VerifySSL bool `json:"verify_ssl" toml:"verify_ssl" xml:"verify_ssl" yaml:"verify_ssl" env:"VERIFY_SSL"` - CollectIDS bool `json:"collect_ids" toml:"collect_ids" xml:"collect_ids" yaml:"collect_ids" env:"COLLECT_IDS"` - ReAuth bool `json:"reauthenticate" toml:"reauthenticate" xml:"reauthenticate" yaml:"reauthenticate" env:"REAUTHENTICATE"` - InfxBadSSL bool `json:"influx_insecure_ssl" toml:"influx_insecure_ssl" xml:"influx_insecure_ssl" yaml:"influx_insecure_ssl" env:"INFLUX_INSECURE_SSL"` - Mode string `json:"mode" toml:"mode" xml:"mode" yaml:"mode" env:"POLLING_MODE"` - HTTPListen string `json:"http_listen" toml:"http_listen" xml:"http_listen" yaml:"http_listen" env:"HTTP_LISTEN"` - Namespace string `json:"namespace" toml:"namespace" xml:"namespace" yaml:"namespace" env:"NAMESPACE"` - InfluxURL string `json:"influx_url,omitempty" toml:"influx_url,omitempty" xml:"influx_url" yaml:"influx_url" env:"INFLUX_URL"` - InfluxUser string `json:"influx_user,omitempty" toml:"influx_user,omitempty" xml:"influx_user" yaml:"influx_user" env:"INFLUX_USER"` - InfluxPass string `json:"influx_pass,omitempty" toml:"influx_pass,omitempty" xml:"influx_pass" yaml:"influx_pass" env:"INFLUX_PASS"` - InfluxDB string `json:"influx_db,omitempty" toml:"influx_db,omitempty" xml:"influx_db" yaml:"influx_db" env:"INFLUX_DB"` - UnifiUser string `json:"unifi_user,omitempty" toml:"unifi_user,omitempty" xml:"unifi_user" yaml:"unifi_user" env:"UNIFI_USER"` - UnifiPass string `json:"unifi_pass,omitempty" toml:"unifi_pass,omitempty" xml:"unifi_pass" yaml:"unifi_pass" env:"UNIFI_PASS"` - UnifiBase string `json:"unifi_url,omitempty" toml:"unifi_url,omitempty" xml:"unifi_url" yaml:"unifi_url" env:"UNIFI_URL"` - Sites []string `json:"sites,omitempty" toml:"sites,omitempty" xml:"sites" yaml:"sites" env:"POLL_SITES"` + Interval Duration `json:"interval,omitempty" toml:"interval,omitempty" xml:"interval" yaml:"interval"` + Debug bool `json:"debug" toml:"debug" xml:"debug" yaml:"debug"` + Quiet bool `json:"quiet,omitempty" toml:"quiet,omitempty" xml:"quiet" yaml:"quiet"` + VerifySSL bool `json:"verify_ssl" toml:"verify_ssl" xml:"verify_ssl" yaml:"verify_ssl"` + CollectIDS bool `json:"collect_ids" toml:"collect_ids" xml:"collect_ids" yaml:"collect_ids"` + ReAuth bool `json:"reauthenticate" toml:"reauthenticate" xml:"reauthenticate" yaml:"reauthenticate"` + InfxBadSSL bool `json:"influx_insecure_ssl" toml:"influx_insecure_ssl" xml:"influx_insecure_ssl" yaml:"influx_insecure_ssl"` + Mode string `json:"mode" toml:"mode" xml:"mode" yaml:"mode"` + HTTPListen string `json:"http_listen" toml:"http_listen" xml:"http_listen" yaml:"http_listen"` + Namespace string `json:"namespace" toml:"namespace" xml:"namespace" yaml:"namespace"` + InfluxURL string `json:"influx_url,omitempty" toml:"influx_url,omitempty" xml:"influx_url" yaml:"influx_url"` + InfluxUser string `json:"influx_user,omitempty" toml:"influx_user,omitempty" xml:"influx_user" yaml:"influx_user"` + InfluxPass string `json:"influx_pass,omitempty" toml:"influx_pass,omitempty" xml:"influx_pass" yaml:"influx_pass"` + InfluxDB string `json:"influx_db,omitempty" toml:"influx_db,omitempty" xml:"influx_db" yaml:"influx_db"` + UnifiUser string `json:"unifi_user,omitempty" toml:"unifi_user,omitempty" xml:"unifi_user" yaml:"unifi_user"` + UnifiPass string `json:"unifi_pass,omitempty" toml:"unifi_pass,omitempty" xml:"unifi_pass" yaml:"unifi_pass"` + UnifiBase string `json:"unifi_url,omitempty" toml:"unifi_url,omitempty" xml:"unifi_url" yaml:"unifi_url"` + Sites []string `json:"sites,omitempty" toml:"sites,omitempty" xml:"sites" yaml:"sites"` } // Duration is used to UnmarshalTOML into a time.Duration value. @@ -113,8 +113,8 @@ func (c *Config) ParseENV() error { t := reflect.TypeOf(Config{}) // Get tag names from the Config struct. // Loop each Config struct member; get reflect tag & env var value; update config. for i := 0; i < t.NumField(); i++ { - tag := t.Field(i).Tag.Get("env") // Get the ENV variable name from "env" struct tag - env := os.Getenv(ENVConfigPrefix + tag) // Then pull value from OS. + tag := strings.ToUpper(t.Field(i).Tag.Get("json")) // Get the ENV variable name from "env" struct tag + env := os.Getenv(ENVConfigPrefix + tag) // Then pull value from OS. if tag == "" || env == "" { continue // Skip if either are empty. } From 632936d772216cd9ceacf0de7783223f28352cd7 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 03:54:53 -0800 Subject: [PATCH 63/85] re-arrange a file pieces. --- poller/config.go | 2 +- poller/start.go | 69 +++++++++++++++++++++++++----------------------- 2 files changed, 37 insertions(+), 34 deletions(-) diff --git a/poller/config.go b/poller/config.go index 5a46469cb..743d39965 100644 --- a/poller/config.go +++ b/poller/config.go @@ -113,7 +113,7 @@ func (c *Config) ParseENV() error { t := reflect.TypeOf(Config{}) // Get tag names from the Config struct. // Loop each Config struct member; get reflect tag & env var value; update config. for i := 0; i < t.NumField(); i++ { - tag := strings.ToUpper(t.Field(i).Tag.Get("json")) // Get the ENV variable name from "env" struct tag + tag := strings.ToUpper(t.Field(i).Tag.Get("json")) // Get the ENV variable name from capitalized "json" struct tag env := os.Getenv(ENVConfigPrefix + tag) // Then pull value from OS. if tag == "" || env == "" { continue // Skip if either are empty. diff --git a/poller/start.go b/poller/start.go index 9e808d5c4..a4f1ec34e 100644 --- a/poller/start.go +++ b/poller/start.go @@ -39,37 +39,47 @@ func New() *UnifiPoller { } // Start begins the application from a CLI. -// Parses flags, parses config and executes Run(). +// Parses cli flags, parses config file, parses env vars, sets up logging, then: +// - dumps a json payload OR - authenticates unifi controller and executes Run(). func (u *UnifiPoller) Start() error { log.SetFlags(log.LstdFlags) - up := New() - up.Flag.Parse(os.Args[1:]) + u.Flag.Parse(os.Args[1:]) - if up.Flag.ShowVer { + if u.Flag.ShowVer { fmt.Printf("%s v%s\n", appName, Version) return nil // don't run anything else w/ version request. } - if up.Flag.DumpJSON == "" { // do not print this when dumping JSON. - up.Logf("Loading Configuration File: %s", up.Flag.ConfigFile) + if u.Flag.DumpJSON == "" { // do not print this when dumping JSON. + u.Logf("Loading Configuration File: %s", u.Flag.ConfigFile) } // Parse config file. - if err := up.Config.ParseFile(up.Flag.ConfigFile); err != nil { - up.Flag.Usage() + if err := u.Config.ParseFile(u.Flag.ConfigFile); err != nil { + u.Flag.Usage() return err } // Update Config with ENV variable overrides. - if err := up.Config.ParseENV(); err != nil { + if err := u.Config.ParseENV(); err != nil { return err } - if up.Flag.DumpJSON != "" { - return up.DumpJSONPayload() + if u.Flag.DumpJSON != "" { + return u.DumpJSONPayload() } - return up.Run() + if u.Config.Debug { + log.SetFlags(log.Lshortfile | log.Lmicroseconds | log.Ldate) + u.LogDebugf("Debug Logging Enabled") + } + + log.Printf("[INFO] UniFi Poller v%v Starting Up! PID: %d", Version, os.Getpid()) + if err := u.GetUnifi(); err != nil { + return err + } + + return u.Run() } // Parse turns CLI arguments into data structures. Called by Start() on startup. @@ -87,24 +97,25 @@ func (f *Flag) Parse(args []string) { _ = f.FlagSet.Parse(args) // pflag.ExitOnError means this will never return error. } -// Run invokes all the application logic and routines. -func (u *UnifiPoller) Run() (err error) { - if u.Config.Debug { - log.SetFlags(log.Lshortfile | log.Lmicroseconds | log.Ldate) - u.LogDebugf("Debug Logging Enabled") - } - - log.Printf("[INFO] UniFi Poller v%v Starting Up! PID: %d", Version, os.Getpid()) - if err = u.GetUnifi(); err != nil { - return err - } - +// Run picks a mode and executes the associated functions. This will do one of three things: +// 1. Start the collector routine that polls unifi and reports to influx on an interval. (default) +// 2. Run the collector one time and report the metrics to influxdb. (lambda) +// 3. Start a web server and wait for Prometheus to poll the application for metrics. +func (u *UnifiPoller) Run() error { u.Logf("Polling UniFi Controller at %s v%s as user %s. Sites: %v", u.Config.UnifiBase, u.Unifi.ServerVersion, u.Config.UnifiUser, u.Config.Sites) switch strings.ToLower(u.Config.Mode) { + default: + if err := u.GetInfluxDB(); err != nil { + return err + } + u.Logf("Logging Measurements to InfluxDB at %s as user %s", u.Config.InfluxURL, u.Config.InfluxUser) + u.Config.Mode = "influx poller" + return u.PollController() + case "influxlambda", "lambdainflux", "lambda_influx", "influx_lambda": - if err = u.GetInfluxDB(); err != nil { + if err := u.GetInfluxDB(); err != nil { return err } u.Logf("Logging Measurements to InfluxDB at %s as user %s one time (lambda mode)", @@ -122,14 +133,6 @@ func (u *UnifiPoller) Run() (err error) { ReportErrors: true, // XXX: Does this need to be configurable? })) return http.ListenAndServe(u.Config.HTTPListen, nil) - - default: - if err = u.GetInfluxDB(); err != nil { - return err - } - u.Logf("Logging Measurements to InfluxDB at %s as user %s", u.Config.InfluxURL, u.Config.InfluxUser) - u.Config.Mode = "influx poller" - return u.PollController() } } From 0a15850dc8f989706a9747cd8c79c9e7bf0d1552 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 04:14:05 -0800 Subject: [PATCH 64/85] cosolidate code --- poller/influx.go | 20 +++++++++-- poller/prometheus.go | 17 +++++++++ poller/start.go | 83 +++++++++++++++----------------------------- poller/unifi.go | 41 +++++++++------------- 4 files changed, 79 insertions(+), 82 deletions(-) diff --git a/poller/influx.go b/poller/influx.go index d3173c4cf..d428bdb8b 100644 --- a/poller/influx.go +++ b/poller/influx.go @@ -1,13 +1,29 @@ package poller import ( + "crypto/tls" "fmt" "github.com/davidnewhall/unifi-poller/influxunifi" "github.com/davidnewhall/unifi-poller/metrics" - client "github.com/influxdata/influxdb1-client/v2" + influx "github.com/influxdata/influxdb1-client/v2" ) +// GetInfluxDB returns an InfluxDB interface. +func (u *UnifiPoller) GetInfluxDB() (err error) { + u.Influx, err = influx.NewHTTPClient(influx.HTTPConfig{ + Addr: u.Config.InfluxURL, + Username: u.Config.InfluxUser, + Password: u.Config.InfluxPass, + TLSConfig: &tls.Config{InsecureSkipVerify: u.Config.InfxBadSSL}, + }) + if err != nil { + return fmt.Errorf("influxdb: %v", err) + } + u.Logf("Logging Measurements to InfluxDB at %s as user %s", u.Config.InfluxURL, u.Config.InfluxUser) + return nil +} + // CollectAndProcess collects measurements and then reports them to InfluxDB // Can be called once or in a ticker loop. This function and all the ones below // handle their own logging. An error is returned so the calling function may @@ -31,7 +47,7 @@ func (u *UnifiPoller) ReportMetrics(metrics *metrics.Metrics) error { m := &influxunifi.Metrics{Metrics: metrics} // Make a new Influx Points Batcher. var err error - m.BatchPoints, err = client.NewBatchPoints(client.BatchPointsConfig{Database: u.Config.InfluxDB}) + m.BatchPoints, err = influx.NewBatchPoints(influx.BatchPointsConfig{Database: u.Config.InfluxDB}) if err != nil { return fmt.Errorf("influx.NewBatchPoints: %v", err) } diff --git a/poller/prometheus.go b/poller/prometheus.go index b53f7c621..030a51b11 100644 --- a/poller/prometheus.go +++ b/poller/prometheus.go @@ -2,12 +2,29 @@ package poller import ( "fmt" + "net/http" + "strings" "time" "github.com/davidnewhall/unifi-poller/metrics" "github.com/davidnewhall/unifi-poller/promunifi" + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" ) +// RunPrometheus starts the web server and registers the collector. +func (u *UnifiPoller) RunPrometheus() error { + u.Logf("Exporting Measurements at https://%s/metrics for Prometheus", u.Config.HTTPListen) + http.Handle("/metrics", promhttp.Handler()) + prometheus.MustRegister(promunifi.NewUnifiCollector(promunifi.UnifiCollectorCnfg{ + Namespace: strings.Replace(u.Config.Namespace, "-", "", -1), + CollectFn: u.ExportMetrics, + LoggingFn: u.LogExportReport, + ReportErrors: true, // XXX: Does this need to be configurable? + })) + return http.ListenAndServe(u.Config.HTTPListen, nil) +} + // ExportMetrics updates the internal metrics provided via // HTTP at /metrics for prometheus collection. // This is run by Prometheus as CollectFn. diff --git a/poller/start.go b/poller/start.go index a4f1ec34e..11d702280 100644 --- a/poller/start.go +++ b/poller/start.go @@ -2,20 +2,13 @@ package poller import ( - "crypto/tls" "fmt" "log" - "net/http" "os" "strings" "time" - "github.com/davidnewhall/unifi-poller/promunifi" - influx "github.com/influxdata/influxdb1-client/v2" - "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promhttp" "github.com/spf13/pflag" - "golift.io/unifi" ) // New returns a new poller struct preloaded with default values. @@ -40,7 +33,7 @@ func New() *UnifiPoller { // Start begins the application from a CLI. // Parses cli flags, parses config file, parses env vars, sets up logging, then: -// - dumps a json payload OR - authenticates unifi controller and executes Run(). +// - dumps a json payload OR - executes Run(). func (u *UnifiPoller) Start() error { log.SetFlags(log.LstdFlags) u.Flag.Parse(os.Args[1:]) @@ -75,10 +68,6 @@ func (u *UnifiPoller) Start() error { } log.Printf("[INFO] UniFi Poller v%v Starting Up! PID: %d", Version, os.Getpid()) - if err := u.GetUnifi(); err != nil { - return err - } - return u.Run() } @@ -102,6 +91,9 @@ func (f *Flag) Parse(args []string) { // 2. Run the collector one time and report the metrics to influxdb. (lambda) // 3. Start a web server and wait for Prometheus to poll the application for metrics. func (u *UnifiPoller) Run() error { + if err := u.GetUnifi(); err != nil { + return err + } u.Logf("Polling UniFi Controller at %s v%s as user %s. Sites: %v", u.Config.UnifiBase, u.Unifi.ServerVersion, u.Config.UnifiUser, u.Config.Sites) @@ -110,62 +102,43 @@ func (u *UnifiPoller) Run() error { if err := u.GetInfluxDB(); err != nil { return err } - u.Logf("Logging Measurements to InfluxDB at %s as user %s", u.Config.InfluxURL, u.Config.InfluxUser) - u.Config.Mode = "influx poller" return u.PollController() case "influxlambda", "lambdainflux", "lambda_influx", "influx_lambda": if err := u.GetInfluxDB(); err != nil { return err } - u.Logf("Logging Measurements to InfluxDB at %s as user %s one time (lambda mode)", - u.Config.InfluxURL, u.Config.InfluxUser) u.LastCheck = time.Now() return u.CollectAndProcess() case "prometheus", "exporter": - u.Logf("Exporting Measurements at https://%s/metrics for Prometheus", u.Config.HTTPListen) - http.Handle("/metrics", promhttp.Handler()) - prometheus.MustRegister(promunifi.NewUnifiCollector(promunifi.UnifiCollectorCnfg{ - Namespace: strings.Replace(u.Config.Namespace, "-", "", -1), - CollectFn: u.ExportMetrics, - LoggingFn: u.LogExportReport, - ReportErrors: true, // XXX: Does this need to be configurable? - })) - return http.ListenAndServe(u.Config.HTTPListen, nil) + return u.RunPrometheus() } } -// GetInfluxDB returns an InfluxDB interface. -func (u *UnifiPoller) GetInfluxDB() (err error) { - u.Influx, err = influx.NewHTTPClient(influx.HTTPConfig{ - Addr: u.Config.InfluxURL, - Username: u.Config.InfluxUser, - Password: u.Config.InfluxPass, - TLSConfig: &tls.Config{InsecureSkipVerify: u.Config.InfxBadSSL}, - }) - if err != nil { - return fmt.Errorf("influxdb: %v", err) +// PollController runs forever, polling UniFi and pushing to InfluxDB +// This is started by Run() after everything checks out. +func (u *UnifiPoller) PollController() error { + interval := u.Config.Interval.Round(time.Second) + log.Printf("[INFO] Everything checks out! Poller started, interval: %v", interval) + ticker := time.NewTicker(interval) + defer ticker.Stop() + for u.LastCheck = range ticker.C { + var err error + if u.Config.ReAuth { + u.LogDebugf("Re-authenticating to UniFi Controller") + // Some users need to re-auth every interval because the cookie times out. + if err = u.Unifi.Login(); err != nil { + u.LogError(err, "re-authenticating") + } + } + if err == nil { + // Only run this if the authentication procedure didn't return error. + _ = u.CollectAndProcess() + } + if u.errorCount > 0 { + return fmt.Errorf("too many errors, stopping poller") + } } - return nil } - -// GetUnifi returns a UniFi controller interface. -func (u *UnifiPoller) GetUnifi() (err error) { - // Create an authenticated session to the Unifi Controller. - u.Unifi, err = unifi.NewUnifi(&unifi.Config{ - User: u.Config.UnifiUser, - Pass: u.Config.UnifiPass, - URL: u.Config.UnifiBase, - VerifySSL: u.Config.VerifySSL, - ErrorLog: u.LogErrorf, // Log all errors. - DebugLog: u.LogDebugf, // Log debug messages. - }) - if err != nil { - return fmt.Errorf("unifi controller: %v", err) - } - u.LogDebugf("Authenticated with controller successfully") - - return u.CheckSites() -} diff --git a/poller/unifi.go b/poller/unifi.go index f5bcd9ba0..54135923d 100644 --- a/poller/unifi.go +++ b/poller/unifi.go @@ -2,7 +2,6 @@ package poller import ( "fmt" - "log" "strings" "time" @@ -10,31 +9,23 @@ import ( "golift.io/unifi" ) -// PollController runs forever, polling UniFi -// and pushing to influx OR exporting for prometheus. -// This is started by Run() after everything checks out. -func (u *UnifiPoller) PollController() error { - interval := u.Config.Interval.Round(time.Second) - log.Printf("[INFO] Everything checks out! Poller started in %v mode, interval: %v", u.Config.Mode, interval) - ticker := time.NewTicker(interval) - for u.LastCheck = range ticker.C { - var err error - if u.Config.ReAuth { - u.LogDebugf("Re-authenticating to UniFi Controller") - // Some users need to re-auth every interval because the cookie times out. - if err = u.Unifi.Login(); err != nil { - u.LogError(err, "re-authenticating") - } - } - if err == nil { - // Only run this if the authentication procedure didn't return error. - _ = u.CollectAndProcess() - } - if u.errorCount > 0 { - return fmt.Errorf("too many errors, stopping poller") - } +// GetUnifi returns a UniFi controller interface. +func (u *UnifiPoller) GetUnifi() (err error) { + // Create an authenticated session to the Unifi Controller. + u.Unifi, err = unifi.NewUnifi(&unifi.Config{ + User: u.Config.UnifiUser, + Pass: u.Config.UnifiPass, + URL: u.Config.UnifiBase, + VerifySSL: u.Config.VerifySSL, + ErrorLog: u.LogErrorf, // Log all errors. + DebugLog: u.LogDebugf, // Log debug messages. + }) + if err != nil { + return fmt.Errorf("unifi controller: %v", err) } - return nil + u.LogDebugf("Authenticated with controller successfully") + + return u.CheckSites() } // CheckSites makes sure the list of provided sites exists on the controller. From 641942242439f67a7499ed8b8cb983f75150ca10 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 16:02:13 -0800 Subject: [PATCH 65/85] add UDM support --- promunifi/collector.go | 3 --- promunifi/uap.go | 6 +++--- promunifi/udm.go | 46 +++++++++++++++++++++++++++++++++--------- promunifi/usg.go | 44 +++++++++++++++++++++++----------------- promunifi/usw.go | 46 ++++++++++++++++++++++++------------------ 5 files changed, 90 insertions(+), 55 deletions(-) diff --git a/promunifi/collector.go b/promunifi/collector.go index 96da4aa8b..960779eb0 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -41,7 +41,6 @@ type unifiCollector struct { UAP *uap USG *usg USW *usw - UDM *udm Site *site } @@ -78,7 +77,6 @@ func NewUnifiCollector(opts UnifiCollectorCnfg) prometheus.Collector { UAP: descUAP(opts.Namespace), USG: descUSG(opts.Namespace), USW: descUSW(opts.Namespace), - UDM: descUDM(opts.Namespace), Site: descSite(opts.Namespace), } } @@ -102,7 +100,6 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { describe(u.UAP) describe(u.USG) describe(u.USW) - describe(u.UDM) describe(u.Site) } diff --git a/promunifi/uap.go b/promunifi/uap.go index 2f52e1c35..90cac9395 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -227,7 +227,7 @@ func (u *unifiCollector) exportUAPs(r *Report) { } func (u *unifiCollector) exportUAP(r *Report, a *unifi.UAP) { - labels := []string{a.IP, a.SiteName, a.Mac, a.Model, a.Name, a.Serial, a.Type, a.Version} + labels := []string{a.IP, a.Type, a.Version, a.SiteName, a.Mac, a.Model, a.Name, a.Serial} // AP data. r.send([]*metricExports{ @@ -251,11 +251,11 @@ func (u *unifiCollector) exportUAP(r *Report, a *unifi.UAP) { {u.UAP.CPU, prometheus.GaugeValue, a.SystemStats.CPU, labels}, {u.UAP.Mem, prometheus.GaugeValue, a.SystemStats.Mem, labels}, }) - u.exportUAPstat(r, labels[2:], a.Stat.Ap) + u.exportUAPstats(r, labels[2:], a.Stat.Ap) u.exportVAPtable(r, labels[2:], a.VapTable, a.RadioTable, a.RadioTableStats) } -func (u *unifiCollector) exportUAPstat(r *Report, labels []string, a *unifi.Ap) { +func (u *unifiCollector) exportUAPstats(r *Report, labels []string, a *unifi.Ap) { labelA := append([]string{"all"}, labels...) labelU := append([]string{"user"}, labels...) labelG := append([]string{"guest"}, labels...) diff --git a/promunifi/udm.go b/promunifi/udm.go index 5cc4142a0..bcfdcc73c 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -1,13 +1,9 @@ package promunifi -import "golift.io/unifi" - -type udm struct { -} - -func descUDM(ns string) *udm { - return &udm{} -} +import ( + "github.com/prometheus/client_golang/prometheus" + "golift.io/unifi" +) func (u *unifiCollector) exportUDMs(r *Report) { if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.UDMs) < 1 { @@ -22,6 +18,36 @@ func (u *unifiCollector) exportUDMs(r *Report) { }() } -func (u *unifiCollector) exportUDM(r *Report, d *unifi.UDM) { - // for _, d := range r.Metrics.Devices.UDMs { +// UDM is a collection of stats from USG, USW and UAP. It has no unique stats. +func (u *unifiCollector) exportUDM(r *Report, s *unifi.UDM) { + labels := []string{s.IP, s.Type, s.Version, s.SiteName, s.Mac, s.Model, s.Name, s.Serial} + // Gateway System Data. + r.send([]*metricExports{ + {u.USG.Uptime, prometheus.GaugeValue, s.Uptime, labels}, + {u.USG.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, + {u.USG.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, + {u.USG.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, + {u.USG.NumSta, prometheus.GaugeValue, s.NumSta, labels}, + {u.USG.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, + {u.USG.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, + {u.USG.NumDesktop, prometheus.GaugeValue, s.NumDesktop, labels}, + {u.USG.NumMobile, prometheus.GaugeValue, s.NumMobile, labels}, + {u.USG.NumHandheld, prometheus.GaugeValue, s.NumHandheld, labels}, + {u.USG.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, + {u.USG.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, + {u.USG.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, + {u.USG.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, + {u.USG.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, + {u.USG.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, + {u.USG.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, + {u.USG.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + }) + u.exportUSWstats(r, s.Stat.Sw, labels) + u.exportUSGstats(r, s.Stat.Gw, s.SpeedtestStatus, labels) + u.exportWANPorts(r, labels, s.Wan1, s.Wan2) + u.exportPortTable(r, s.PortTable, labels[4:]) + if s.Stat.Ap != nil && s.VapTable != nil { + u.exportUAPstats(r, labels[2:], s.Stat.Ap) + u.exportVAPtable(r, labels[2:], *s.VapTable, *s.RadioTable, *s.RadioTableStats) + } } diff --git a/promunifi/usg.go b/promunifi/usg.go index 094cc2fb8..6146b8190 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -57,7 +57,7 @@ func descUSG(ns string) *usg { if ns += "_usg_"; ns == "_usg_" { ns = "usg_" } - labels := []string{"site_name", "mac", "model", "name", "serial", "type", "version", "ip"} + labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"} labelWan := append([]string{"port"}, labels...) return &usg{ @@ -121,8 +121,7 @@ func (u *unifiCollector) exportUSGs(r *Report) { } func (u *unifiCollector) exportUSG(r *Report, s *unifi.USG) { - labels := []string{s.SiteName, s.Mac, s.Model, s.Name, s.Serial, s.Type, s.Version, s.IP} - labelWan := append([]string{"all"}, labels...) + labels := []string{s.IP, s.Type, s.Version, s.SiteName, s.Mac, s.Model, s.Name, s.Serial} // Gateway System Data. r.send([]*metricExports{ {u.USG.Uptime, prometheus.GaugeValue, s.Uptime, labels}, @@ -143,25 +142,32 @@ func (u *unifiCollector) exportUSG(r *Report, s *unifi.USG) { {u.USG.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, {u.USG.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, {u.USG.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + }) + u.exportWANPorts(r, labels, s.Wan1, s.Wan2) + u.exportUSGstats(r, s.Stat.Gw, s.SpeedtestStatus, labels) +} + +func (u *unifiCollector) exportUSGstats(r *Report, s *unifi.Gw, st unifi.SpeedtestStatus, labels []string) { + labelWan := append([]string{"all"}, labels...) + r.send([]*metricExports{ // Combined Port Stats - {u.USG.WanRxPackets, prometheus.CounterValue, s.Stat.Gw.WanRxPackets, labelWan}, - {u.USG.WanRxBytes, prometheus.CounterValue, s.Stat.Gw.WanRxBytes, labelWan}, - {u.USG.WanRxDropped, prometheus.CounterValue, s.Stat.Gw.WanRxDropped, labelWan}, - {u.USG.WanTxPackets, prometheus.CounterValue, s.Stat.Gw.WanTxPackets, labelWan}, - {u.USG.WanTxBytes, prometheus.CounterValue, s.Stat.Gw.WanTxBytes, labelWan}, - {u.USG.WanRxErrors, prometheus.CounterValue, s.Stat.Gw.WanRxErrors, labelWan}, - {u.USG.LanRxPackets, prometheus.CounterValue, s.Stat.Gw.LanRxPackets, labels}, - {u.USG.LanRxBytes, prometheus.CounterValue, s.Stat.Gw.LanRxBytes, labels}, - {u.USG.LanTxPackets, prometheus.CounterValue, s.Stat.Gw.LanTxPackets, labels}, - {u.USG.LanTxBytes, prometheus.CounterValue, s.Stat.Gw.LanTxBytes, labels}, - {u.USG.LanRxDropped, prometheus.CounterValue, s.Stat.Gw.LanRxDropped, labels}, + {u.USG.WanRxPackets, prometheus.CounterValue, s.WanRxPackets, labelWan}, + {u.USG.WanRxBytes, prometheus.CounterValue, s.WanRxBytes, labelWan}, + {u.USG.WanRxDropped, prometheus.CounterValue, s.WanRxDropped, labelWan}, + {u.USG.WanTxPackets, prometheus.CounterValue, s.WanTxPackets, labelWan}, + {u.USG.WanTxBytes, prometheus.CounterValue, s.WanTxBytes, labelWan}, + {u.USG.WanRxErrors, prometheus.CounterValue, s.WanRxErrors, labelWan}, + {u.USG.LanRxPackets, prometheus.CounterValue, s.LanRxPackets, labels}, + {u.USG.LanRxBytes, prometheus.CounterValue, s.LanRxBytes, labels}, + {u.USG.LanTxPackets, prometheus.CounterValue, s.LanTxPackets, labels}, + {u.USG.LanTxBytes, prometheus.CounterValue, s.LanTxBytes, labels}, + {u.USG.LanRxDropped, prometheus.CounterValue, s.LanRxDropped, labels}, // Speed Test Stats - {u.USG.Latency, prometheus.GaugeValue, s.SpeedtestStatus.Latency.Val / 1000, labels}, - {u.USG.Runtime, prometheus.GaugeValue, s.SpeedtestStatus.Runtime, labels}, - {u.USG.XputDownload, prometheus.GaugeValue, s.SpeedtestStatus.XputDownload, labels}, - {u.USG.XputUpload, prometheus.GaugeValue, s.SpeedtestStatus.XputUpload, labels}, + {u.USG.Latency, prometheus.GaugeValue, st.Latency.Val / 1000, labels}, + {u.USG.Runtime, prometheus.GaugeValue, st.Runtime, labels}, + {u.USG.XputDownload, prometheus.GaugeValue, st.XputDownload, labels}, + {u.USG.XputUpload, prometheus.GaugeValue, st.XputUpload, labels}, }) - u.exportWANPorts(r, labels, s.Wan1, s.Wan2) } func (u *unifiCollector) exportWANPorts(r *Report, labels []string, wans ...unifi.Wan) { diff --git a/promunifi/usw.go b/promunifi/usw.go index 29f77544d..dd7dd6607 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -70,9 +70,9 @@ func descUSW(ns string) *usw { } pns := ns + "port_" // The first five labels for switch are shared with (the same as) switch ports. - labels := []string{"type", "version", "ip", "site_name", "mac", "model", "name", "serial"} + labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"} // Copy labels, and replace first four with different names. - labelP := append([]string{"port_num", "port_name", "port_mac", "port_ip"}, labels[5:]...) + labelP := append([]string{"port_num", "port_name", "port_mac", "port_ip"}, labels[4:]...) return &usw{ // switch data @@ -149,7 +149,7 @@ func (u *unifiCollector) exportUSWs(r *Report) { } func (u *unifiCollector) exportUSW(r *Report, s *unifi.USW) { - labels := []string{s.Type, s.Version, s.IP, s.SiteName, s.Mac, s.Model, s.Name, s.Serial} + labels := []string{s.IP, s.Type, s.Version, s.SiteName, s.Mac, s.Model, s.Name, s.Serial} if s.HasTemperature.Val { r.send([]*metricExports{{u.USW.Temperature, prometheus.GaugeValue, s.GeneralTemperature, labels}}) @@ -176,24 +176,30 @@ func (u *unifiCollector) exportUSW(r *Report, s *unifi.USW) { {u.USW.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, {u.USW.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, {u.USW.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, - {u.USW.SwRxPackets, prometheus.CounterValue, s.Stat.Sw.RxPackets, labels}, - {u.USW.SwRxBytes, prometheus.CounterValue, s.Stat.Sw.RxBytes, labels}, - {u.USW.SwRxErrors, prometheus.CounterValue, s.Stat.Sw.RxErrors, labels}, - {u.USW.SwRxDropped, prometheus.CounterValue, s.Stat.Sw.RxDropped, labels}, - {u.USW.SwRxCrypts, prometheus.CounterValue, s.Stat.Sw.RxCrypts, labels}, - {u.USW.SwRxFrags, prometheus.CounterValue, s.Stat.Sw.RxFrags, labels}, - {u.USW.SwTxPackets, prometheus.CounterValue, s.Stat.Sw.TxPackets, labels}, - {u.USW.SwTxBytes, prometheus.CounterValue, s.Stat.Sw.TxBytes, labels}, - {u.USW.SwTxErrors, prometheus.CounterValue, s.Stat.Sw.TxErrors, labels}, - {u.USW.SwTxDropped, prometheus.CounterValue, s.Stat.Sw.TxDropped, labels}, - {u.USW.SwTxRetries, prometheus.CounterValue, s.Stat.Sw.TxRetries, labels}, - {u.USW.SwRxMulticast, prometheus.CounterValue, s.Stat.Sw.RxMulticast, labels}, - {u.USW.SwRxBroadcast, prometheus.CounterValue, s.Stat.Sw.RxBroadcast, labels}, - {u.USW.SwTxMulticast, prometheus.CounterValue, s.Stat.Sw.TxMulticast, labels}, - {u.USW.SwTxBroadcast, prometheus.CounterValue, s.Stat.Sw.TxBroadcast, labels}, - {u.USW.SwBytes, prometheus.CounterValue, s.Stat.Sw.Bytes, labels}, }) - u.exportPortTable(r, s.PortTable, labels[5:]) + u.exportPortTable(r, s.PortTable, labels[4:]) + u.exportUSWstats(r, s.Stat.Sw, labels) +} + +func (u *unifiCollector) exportUSWstats(r *Report, s *unifi.Sw, labels []string) { + r.send([]*metricExports{ + {u.USW.SwRxPackets, prometheus.CounterValue, s.RxPackets, labels}, + {u.USW.SwRxBytes, prometheus.CounterValue, s.RxBytes, labels}, + {u.USW.SwRxErrors, prometheus.CounterValue, s.RxErrors, labels}, + {u.USW.SwRxDropped, prometheus.CounterValue, s.RxDropped, labels}, + {u.USW.SwRxCrypts, prometheus.CounterValue, s.RxCrypts, labels}, + {u.USW.SwRxFrags, prometheus.CounterValue, s.RxFrags, labels}, + {u.USW.SwTxPackets, prometheus.CounterValue, s.TxPackets, labels}, + {u.USW.SwTxBytes, prometheus.CounterValue, s.TxBytes, labels}, + {u.USW.SwTxErrors, prometheus.CounterValue, s.TxErrors, labels}, + {u.USW.SwTxDropped, prometheus.CounterValue, s.TxDropped, labels}, + {u.USW.SwTxRetries, prometheus.CounterValue, s.TxRetries, labels}, + {u.USW.SwRxMulticast, prometheus.CounterValue, s.RxMulticast, labels}, + {u.USW.SwRxBroadcast, prometheus.CounterValue, s.RxBroadcast, labels}, + {u.USW.SwTxMulticast, prometheus.CounterValue, s.TxMulticast, labels}, + {u.USW.SwTxBroadcast, prometheus.CounterValue, s.TxBroadcast, labels}, + {u.USW.SwBytes, prometheus.CounterValue, s.Bytes, labels}, + }) } func (u *unifiCollector) exportPortTable(r *Report, pt []unifi.Port, labels []string) { From 61b43f2696281c396a26d97cef4408558a228a93 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 16:09:21 -0800 Subject: [PATCH 66/85] unify variable names --- promunifi/uap.go | 141 ++++++++++++++++++++++++----------------------- promunifi/udm.go | 55 +++++++++--------- promunifi/usg.go | 72 ++++++++++++------------ promunifi/usw.go | 86 ++++++++++++++--------------- 4 files changed, 179 insertions(+), 175 deletions(-) diff --git a/promunifi/uap.go b/promunifi/uap.go index 90cac9395..5a4a519f0 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -220,96 +220,97 @@ func (u *unifiCollector) exportUAPs(r *Report) { r.wg.Add(one) go func() { defer r.wg.Done() - for _, a := range r.Metrics.Devices.UAPs { - u.exportUAP(r, a) + for _, d := range r.Metrics.Devices.UAPs { + u.exportUAP(r, d) } }() } -func (u *unifiCollector) exportUAP(r *Report, a *unifi.UAP) { - labels := []string{a.IP, a.Type, a.Version, a.SiteName, a.Mac, a.Model, a.Name, a.Serial} +func (u *unifiCollector) exportUAP(r *Report, d *unifi.UAP) { + labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} // AP data. r.send([]*metricExports{ - {u.UAP.Uptime, prometheus.GaugeValue, a.Uptime, labels}, - {u.UAP.TotalTxBytes, prometheus.CounterValue, a.TxBytes, labels}, - {u.UAP.TotalRxBytes, prometheus.CounterValue, a.RxBytes, labels}, - {u.UAP.TotalBytes, prometheus.CounterValue, a.Bytes, labels}, - {u.UAP.BytesD, prometheus.CounterValue, a.BytesD, labels}, // not sure if these 3 Ds are counters or gauges. - {u.UAP.TxBytesD, prometheus.CounterValue, a.TxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. - {u.UAP.RxBytesD, prometheus.CounterValue, a.RxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. - {u.UAP.BytesR, prometheus.GaugeValue, a.BytesR, labels}, - {u.UAP.NumSta, prometheus.GaugeValue, a.NumSta, labels}, - {u.UAP.UserNumSta, prometheus.GaugeValue, a.UserNumSta, labels}, - {u.UAP.GuestNumSta, prometheus.GaugeValue, a.GuestNumSta, labels}, - {u.UAP.Loadavg1, prometheus.GaugeValue, a.SysStats.Loadavg1, labels}, - {u.UAP.Loadavg5, prometheus.GaugeValue, a.SysStats.Loadavg5, labels}, - {u.UAP.Loadavg15, prometheus.GaugeValue, a.SysStats.Loadavg15, labels}, - {u.UAP.MemUsed, prometheus.GaugeValue, a.SysStats.MemUsed, labels}, - {u.UAP.MemTotal, prometheus.GaugeValue, a.SysStats.MemTotal, labels}, - {u.UAP.MemBuffer, prometheus.GaugeValue, a.SysStats.MemBuffer, labels}, - {u.UAP.CPU, prometheus.GaugeValue, a.SystemStats.CPU, labels}, - {u.UAP.Mem, prometheus.GaugeValue, a.SystemStats.Mem, labels}, + {u.UAP.Uptime, prometheus.GaugeValue, d.Uptime, labels}, + {u.UAP.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, + {u.UAP.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, + {u.UAP.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, + {u.UAP.BytesD, prometheus.CounterValue, d.BytesD, labels}, // not sure if these 3 Ds are counters or gauges. + {u.UAP.TxBytesD, prometheus.CounterValue, d.TxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. + {u.UAP.RxBytesD, prometheus.CounterValue, d.RxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. + {u.UAP.BytesR, prometheus.GaugeValue, d.BytesR, labels}, + {u.UAP.NumSta, prometheus.GaugeValue, d.NumSta, labels}, + {u.UAP.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, + {u.UAP.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, + {u.UAP.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, + {u.UAP.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, + {u.UAP.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, + {u.UAP.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, + {u.UAP.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, + {u.UAP.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, + {u.UAP.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, + {u.UAP.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) - u.exportUAPstats(r, labels[2:], a.Stat.Ap) - u.exportVAPtable(r, labels[2:], a.VapTable, a.RadioTable, a.RadioTableStats) + u.exportUAPstats(r, labels[2:], d.Stat.Ap) + u.exportVAPtable(r, labels[2:], d.VapTable) + u.exportRadtable(r, labels[2:], d.RadioTable, d.RadioTableStats) } -func (u *unifiCollector) exportUAPstats(r *Report, labels []string, a *unifi.Ap) { +func (u *unifiCollector) exportUAPstats(r *Report, labels []string, ap *unifi.Ap) { labelA := append([]string{"all"}, labels...) labelU := append([]string{"user"}, labels...) labelG := append([]string{"guest"}, labels...) r.send([]*metricExports{ // all - {u.UAP.ApWifiTxDropped, prometheus.CounterValue, a.WifiTxDropped, labelA}, - {u.UAP.ApRxErrors, prometheus.CounterValue, a.RxErrors, labelA}, - {u.UAP.ApRxDropped, prometheus.CounterValue, a.RxDropped, labelA}, - {u.UAP.ApRxFrags, prometheus.CounterValue, a.RxFrags, labelA}, - {u.UAP.ApRxCrypts, prometheus.CounterValue, a.RxCrypts, labelA}, - {u.UAP.ApTxPackets, prometheus.CounterValue, a.TxPackets, labelA}, - {u.UAP.ApTxBytes, prometheus.CounterValue, a.TxBytes, labelA}, - {u.UAP.ApTxErrors, prometheus.CounterValue, a.TxErrors, labelA}, - {u.UAP.ApTxDropped, prometheus.CounterValue, a.TxDropped, labelA}, - {u.UAP.ApTxRetries, prometheus.CounterValue, a.TxRetries, labelA}, - {u.UAP.ApRxPackets, prometheus.CounterValue, a.RxPackets, labelA}, - {u.UAP.ApRxBytes, prometheus.CounterValue, a.RxBytes, labelA}, - {u.UAP.WifiTxAttempts, prometheus.CounterValue, a.WifiTxAttempts, labelA}, - {u.UAP.MacFilterRejections, prometheus.CounterValue, a.MacFilterRejections, labelA}, + {u.UAP.ApWifiTxDropped, prometheus.CounterValue, ap.WifiTxDropped, labelA}, + {u.UAP.ApRxErrors, prometheus.CounterValue, ap.RxErrors, labelA}, + {u.UAP.ApRxDropped, prometheus.CounterValue, ap.RxDropped, labelA}, + {u.UAP.ApRxFrags, prometheus.CounterValue, ap.RxFrags, labelA}, + {u.UAP.ApRxCrypts, prometheus.CounterValue, ap.RxCrypts, labelA}, + {u.UAP.ApTxPackets, prometheus.CounterValue, ap.TxPackets, labelA}, + {u.UAP.ApTxBytes, prometheus.CounterValue, ap.TxBytes, labelA}, + {u.UAP.ApTxErrors, prometheus.CounterValue, ap.TxErrors, labelA}, + {u.UAP.ApTxDropped, prometheus.CounterValue, ap.TxDropped, labelA}, + {u.UAP.ApTxRetries, prometheus.CounterValue, ap.TxRetries, labelA}, + {u.UAP.ApRxPackets, prometheus.CounterValue, ap.RxPackets, labelA}, + {u.UAP.ApRxBytes, prometheus.CounterValue, ap.RxBytes, labelA}, + {u.UAP.WifiTxAttempts, prometheus.CounterValue, ap.WifiTxAttempts, labelA}, + {u.UAP.MacFilterRejections, prometheus.CounterValue, ap.MacFilterRejections, labelA}, // user - {u.UAP.ApWifiTxDropped, prometheus.CounterValue, a.UserWifiTxDropped, labelU}, - {u.UAP.ApRxErrors, prometheus.CounterValue, a.UserRxErrors, labelU}, - {u.UAP.ApRxDropped, prometheus.CounterValue, a.UserRxDropped, labelU}, - {u.UAP.ApRxFrags, prometheus.CounterValue, a.UserRxFrags, labelU}, - {u.UAP.ApRxCrypts, prometheus.CounterValue, a.UserRxCrypts, labelU}, - {u.UAP.ApTxPackets, prometheus.CounterValue, a.UserTxPackets, labelU}, - {u.UAP.ApTxBytes, prometheus.CounterValue, a.UserTxBytes, labelU}, - {u.UAP.ApTxErrors, prometheus.CounterValue, a.UserTxErrors, labelU}, - {u.UAP.ApTxDropped, prometheus.CounterValue, a.UserTxDropped, labelU}, - {u.UAP.ApTxRetries, prometheus.CounterValue, a.UserTxRetries, labelU}, - {u.UAP.ApRxPackets, prometheus.CounterValue, a.UserRxPackets, labelU}, - {u.UAP.ApRxBytes, prometheus.CounterValue, a.UserRxBytes, labelU}, - {u.UAP.WifiTxAttempts, prometheus.CounterValue, a.UserWifiTxAttempts, labelU}, - {u.UAP.MacFilterRejections, prometheus.CounterValue, a.UserMacFilterRejections, labelU}, + {u.UAP.ApWifiTxDropped, prometheus.CounterValue, ap.UserWifiTxDropped, labelU}, + {u.UAP.ApRxErrors, prometheus.CounterValue, ap.UserRxErrors, labelU}, + {u.UAP.ApRxDropped, prometheus.CounterValue, ap.UserRxDropped, labelU}, + {u.UAP.ApRxFrags, prometheus.CounterValue, ap.UserRxFrags, labelU}, + {u.UAP.ApRxCrypts, prometheus.CounterValue, ap.UserRxCrypts, labelU}, + {u.UAP.ApTxPackets, prometheus.CounterValue, ap.UserTxPackets, labelU}, + {u.UAP.ApTxBytes, prometheus.CounterValue, ap.UserTxBytes, labelU}, + {u.UAP.ApTxErrors, prometheus.CounterValue, ap.UserTxErrors, labelU}, + {u.UAP.ApTxDropped, prometheus.CounterValue, ap.UserTxDropped, labelU}, + {u.UAP.ApTxRetries, prometheus.CounterValue, ap.UserTxRetries, labelU}, + {u.UAP.ApRxPackets, prometheus.CounterValue, ap.UserRxPackets, labelU}, + {u.UAP.ApRxBytes, prometheus.CounterValue, ap.UserRxBytes, labelU}, + {u.UAP.WifiTxAttempts, prometheus.CounterValue, ap.UserWifiTxAttempts, labelU}, + {u.UAP.MacFilterRejections, prometheus.CounterValue, ap.UserMacFilterRejections, labelU}, // guest - {u.UAP.ApWifiTxDropped, prometheus.CounterValue, a.GuestWifiTxDropped, labelG}, - {u.UAP.ApRxErrors, prometheus.CounterValue, a.GuestRxErrors, labelG}, - {u.UAP.ApRxDropped, prometheus.CounterValue, a.GuestRxDropped, labelG}, - {u.UAP.ApRxFrags, prometheus.CounterValue, a.GuestRxFrags, labelG}, - {u.UAP.ApRxCrypts, prometheus.CounterValue, a.GuestRxCrypts, labelG}, - {u.UAP.ApTxPackets, prometheus.CounterValue, a.GuestTxPackets, labelG}, - {u.UAP.ApTxBytes, prometheus.CounterValue, a.GuestTxBytes, labelG}, - {u.UAP.ApTxErrors, prometheus.CounterValue, a.GuestTxErrors, labelG}, - {u.UAP.ApTxDropped, prometheus.CounterValue, a.GuestTxDropped, labelG}, - {u.UAP.ApTxRetries, prometheus.CounterValue, a.GuestTxRetries, labelG}, - {u.UAP.ApRxPackets, prometheus.CounterValue, a.GuestRxPackets, labelG}, - {u.UAP.ApRxBytes, prometheus.CounterValue, a.GuestRxBytes, labelG}, - {u.UAP.WifiTxAttempts, prometheus.CounterValue, a.GuestWifiTxAttempts, labelG}, - {u.UAP.MacFilterRejections, prometheus.CounterValue, a.GuestMacFilterRejections, labelG}, + {u.UAP.ApWifiTxDropped, prometheus.CounterValue, ap.GuestWifiTxDropped, labelG}, + {u.UAP.ApRxErrors, prometheus.CounterValue, ap.GuestRxErrors, labelG}, + {u.UAP.ApRxDropped, prometheus.CounterValue, ap.GuestRxDropped, labelG}, + {u.UAP.ApRxFrags, prometheus.CounterValue, ap.GuestRxFrags, labelG}, + {u.UAP.ApRxCrypts, prometheus.CounterValue, ap.GuestRxCrypts, labelG}, + {u.UAP.ApTxPackets, prometheus.CounterValue, ap.GuestTxPackets, labelG}, + {u.UAP.ApTxBytes, prometheus.CounterValue, ap.GuestTxBytes, labelG}, + {u.UAP.ApTxErrors, prometheus.CounterValue, ap.GuestTxErrors, labelG}, + {u.UAP.ApTxDropped, prometheus.CounterValue, ap.GuestTxDropped, labelG}, + {u.UAP.ApTxRetries, prometheus.CounterValue, ap.GuestTxRetries, labelG}, + {u.UAP.ApRxPackets, prometheus.CounterValue, ap.GuestRxPackets, labelG}, + {u.UAP.ApRxBytes, prometheus.CounterValue, ap.GuestRxBytes, labelG}, + {u.UAP.WifiTxAttempts, prometheus.CounterValue, ap.GuestWifiTxAttempts, labelG}, + {u.UAP.MacFilterRejections, prometheus.CounterValue, ap.GuestMacFilterRejections, labelG}, }) } -func (u *unifiCollector) exportVAPtable(r *Report, labels []string, vt unifi.VapTable, rt unifi.RadioTable, rts unifi.RadioTableStats) { +func (u *unifiCollector) exportVAPtable(r *Report, labels []string, vt unifi.VapTable) { // vap table stats for _, v := range vt { if !v.Up.Val { @@ -356,7 +357,9 @@ func (u *unifiCollector) exportVAPtable(r *Report, labels []string, vt unifi.Vap {u.UAP.VAPWifiTxLatencyMovCount, prometheus.CounterValue, v.WifiTxLatencyMov.TotalCount, labelV}, // not sure if gauge or counter. }) } +} +func (u *unifiCollector) exportRadtable(r *Report, labels []string, rt unifi.RadioTable, rts unifi.RadioTableStats) { // radio table for _, p := range rt { labelR := append([]string{p.Name, p.Radio}, labels...) diff --git a/promunifi/udm.go b/promunifi/udm.go index bcfdcc73c..c8c0dc332 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -19,35 +19,36 @@ func (u *unifiCollector) exportUDMs(r *Report) { } // UDM is a collection of stats from USG, USW and UAP. It has no unique stats. -func (u *unifiCollector) exportUDM(r *Report, s *unifi.UDM) { - labels := []string{s.IP, s.Type, s.Version, s.SiteName, s.Mac, s.Model, s.Name, s.Serial} +func (u *unifiCollector) exportUDM(r *Report, d *unifi.UDM) { + labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} // Gateway System Data. r.send([]*metricExports{ - {u.USG.Uptime, prometheus.GaugeValue, s.Uptime, labels}, - {u.USG.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, - {u.USG.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, - {u.USG.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, - {u.USG.NumSta, prometheus.GaugeValue, s.NumSta, labels}, - {u.USG.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, - {u.USG.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, - {u.USG.NumDesktop, prometheus.GaugeValue, s.NumDesktop, labels}, - {u.USG.NumMobile, prometheus.GaugeValue, s.NumMobile, labels}, - {u.USG.NumHandheld, prometheus.GaugeValue, s.NumHandheld, labels}, - {u.USG.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, - {u.USG.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, - {u.USG.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, - {u.USG.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, - {u.USG.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, - {u.USG.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, - {u.USG.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, - {u.USG.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + {u.USG.Uptime, prometheus.GaugeValue, d.Uptime, labels}, + {u.USG.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, + {u.USG.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, + {u.USG.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, + {u.USG.NumSta, prometheus.GaugeValue, d.NumSta, labels}, + {u.USG.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, + {u.USG.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, + {u.USG.NumDesktop, prometheus.GaugeValue, d.NumDesktop, labels}, + {u.USG.NumMobile, prometheus.GaugeValue, d.NumMobile, labels}, + {u.USG.NumHandheld, prometheus.GaugeValue, d.NumHandheld, labels}, + {u.USG.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, + {u.USG.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, + {u.USG.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, + {u.USG.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, + {u.USG.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, + {u.USG.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, + {u.USG.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, + {u.USG.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) - u.exportUSWstats(r, s.Stat.Sw, labels) - u.exportUSGstats(r, s.Stat.Gw, s.SpeedtestStatus, labels) - u.exportWANPorts(r, labels, s.Wan1, s.Wan2) - u.exportPortTable(r, s.PortTable, labels[4:]) - if s.Stat.Ap != nil && s.VapTable != nil { - u.exportUAPstats(r, labels[2:], s.Stat.Ap) - u.exportVAPtable(r, labels[2:], *s.VapTable, *s.RadioTable, *s.RadioTableStats) + u.exportUSWstats(r, d.Stat.Sw, labels) + u.exportUSGstats(r, d.Stat.Gw, d.SpeedtestStatus, labels) + u.exportWANPorts(r, labels, d.Wan1, d.Wan2) + u.exportPortTable(r, d.PortTable, labels[4:]) + if d.Stat.Ap != nil && d.VapTable != nil { + u.exportUAPstats(r, labels[2:], d.Stat.Ap) + u.exportVAPtable(r, labels[2:], *d.VapTable) + u.exportRadtable(r, labels[2:], *d.RadioTable, *d.RadioTableStats) } } diff --git a/promunifi/usg.go b/promunifi/usg.go index 6146b8190..077550eda 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -114,54 +114,54 @@ func (u *unifiCollector) exportUSGs(r *Report) { r.wg.Add(one) go func() { defer r.wg.Done() - for _, s := range r.Metrics.Devices.USGs { - u.exportUSG(r, s) + for _, d := range r.Metrics.Devices.USGs { + u.exportUSG(r, d) } }() } -func (u *unifiCollector) exportUSG(r *Report, s *unifi.USG) { - labels := []string{s.IP, s.Type, s.Version, s.SiteName, s.Mac, s.Model, s.Name, s.Serial} +func (u *unifiCollector) exportUSG(r *Report, d *unifi.USG) { + labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} // Gateway System Data. r.send([]*metricExports{ - {u.USG.Uptime, prometheus.GaugeValue, s.Uptime, labels}, - {u.USG.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, - {u.USG.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, - {u.USG.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, - {u.USG.NumSta, prometheus.GaugeValue, s.NumSta, labels}, - {u.USG.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, - {u.USG.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, - {u.USG.NumDesktop, prometheus.GaugeValue, s.NumDesktop, labels}, - {u.USG.NumMobile, prometheus.GaugeValue, s.NumMobile, labels}, - {u.USG.NumHandheld, prometheus.GaugeValue, s.NumHandheld, labels}, - {u.USG.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, - {u.USG.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, - {u.USG.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, - {u.USG.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, - {u.USG.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, - {u.USG.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, - {u.USG.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, - {u.USG.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + {u.USG.Uptime, prometheus.GaugeValue, d.Uptime, labels}, + {u.USG.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, + {u.USG.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, + {u.USG.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, + {u.USG.NumSta, prometheus.GaugeValue, d.NumSta, labels}, + {u.USG.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, + {u.USG.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, + {u.USG.NumDesktop, prometheus.GaugeValue, d.NumDesktop, labels}, + {u.USG.NumMobile, prometheus.GaugeValue, d.NumMobile, labels}, + {u.USG.NumHandheld, prometheus.GaugeValue, d.NumHandheld, labels}, + {u.USG.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, + {u.USG.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, + {u.USG.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, + {u.USG.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, + {u.USG.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, + {u.USG.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, + {u.USG.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, + {u.USG.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) - u.exportWANPorts(r, labels, s.Wan1, s.Wan2) - u.exportUSGstats(r, s.Stat.Gw, s.SpeedtestStatus, labels) + u.exportWANPorts(r, labels, d.Wan1, d.Wan2) + u.exportUSGstats(r, d.Stat.Gw, d.SpeedtestStatus, labels) } -func (u *unifiCollector) exportUSGstats(r *Report, s *unifi.Gw, st unifi.SpeedtestStatus, labels []string) { +func (u *unifiCollector) exportUSGstats(r *Report, gw *unifi.Gw, st unifi.SpeedtestStatus, labels []string) { labelWan := append([]string{"all"}, labels...) r.send([]*metricExports{ // Combined Port Stats - {u.USG.WanRxPackets, prometheus.CounterValue, s.WanRxPackets, labelWan}, - {u.USG.WanRxBytes, prometheus.CounterValue, s.WanRxBytes, labelWan}, - {u.USG.WanRxDropped, prometheus.CounterValue, s.WanRxDropped, labelWan}, - {u.USG.WanTxPackets, prometheus.CounterValue, s.WanTxPackets, labelWan}, - {u.USG.WanTxBytes, prometheus.CounterValue, s.WanTxBytes, labelWan}, - {u.USG.WanRxErrors, prometheus.CounterValue, s.WanRxErrors, labelWan}, - {u.USG.LanRxPackets, prometheus.CounterValue, s.LanRxPackets, labels}, - {u.USG.LanRxBytes, prometheus.CounterValue, s.LanRxBytes, labels}, - {u.USG.LanTxPackets, prometheus.CounterValue, s.LanTxPackets, labels}, - {u.USG.LanTxBytes, prometheus.CounterValue, s.LanTxBytes, labels}, - {u.USG.LanRxDropped, prometheus.CounterValue, s.LanRxDropped, labels}, + {u.USG.WanRxPackets, prometheus.CounterValue, gw.WanRxPackets, labelWan}, + {u.USG.WanRxBytes, prometheus.CounterValue, gw.WanRxBytes, labelWan}, + {u.USG.WanRxDropped, prometheus.CounterValue, gw.WanRxDropped, labelWan}, + {u.USG.WanTxPackets, prometheus.CounterValue, gw.WanTxPackets, labelWan}, + {u.USG.WanTxBytes, prometheus.CounterValue, gw.WanTxBytes, labelWan}, + {u.USG.WanRxErrors, prometheus.CounterValue, gw.WanRxErrors, labelWan}, + {u.USG.LanRxPackets, prometheus.CounterValue, gw.LanRxPackets, labels}, + {u.USG.LanRxBytes, prometheus.CounterValue, gw.LanRxBytes, labels}, + {u.USG.LanTxPackets, prometheus.CounterValue, gw.LanTxPackets, labels}, + {u.USG.LanTxBytes, prometheus.CounterValue, gw.LanTxBytes, labels}, + {u.USG.LanRxDropped, prometheus.CounterValue, gw.LanRxDropped, labels}, // Speed Test Stats {u.USG.Latency, prometheus.GaugeValue, st.Latency.Val / 1000, labels}, {u.USG.Runtime, prometheus.GaugeValue, st.Runtime, labels}, diff --git a/promunifi/usw.go b/promunifi/usw.go index dd7dd6607..4dc793f87 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -142,63 +142,63 @@ func (u *unifiCollector) exportUSWs(r *Report) { r.wg.Add(one) go func() { defer r.wg.Done() - for _, s := range r.Metrics.Devices.USWs { - u.exportUSW(r, s) + for _, d := range r.Metrics.Devices.USWs { + u.exportUSW(r, d) } }() } -func (u *unifiCollector) exportUSW(r *Report, s *unifi.USW) { - labels := []string{s.IP, s.Type, s.Version, s.SiteName, s.Mac, s.Model, s.Name, s.Serial} +func (u *unifiCollector) exportUSW(r *Report, d *unifi.USW) { + labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} - if s.HasTemperature.Val { - r.send([]*metricExports{{u.USW.Temperature, prometheus.GaugeValue, s.GeneralTemperature, labels}}) + if d.HasTemperature.Val { + r.send([]*metricExports{{u.USW.Temperature, prometheus.GaugeValue, d.GeneralTemperature, labels}}) } - if s.HasFan.Val { - r.send([]*metricExports{{u.USW.FanLevel, prometheus.GaugeValue, s.FanLevel, labels}}) + if d.HasFan.Val { + r.send([]*metricExports{{u.USW.FanLevel, prometheus.GaugeValue, d.FanLevel, labels}}) } // Switch data. r.send([]*metricExports{ - {u.USW.Uptime, prometheus.GaugeValue, s.Uptime, labels}, - {u.USW.TotalMaxPower, prometheus.GaugeValue, s.TotalMaxPower, labels}, - {u.USW.TotalTxBytes, prometheus.CounterValue, s.TxBytes, labels}, - {u.USW.TotalRxBytes, prometheus.CounterValue, s.RxBytes, labels}, - {u.USW.TotalBytes, prometheus.CounterValue, s.Bytes, labels}, - {u.USW.NumSta, prometheus.GaugeValue, s.NumSta, labels}, - {u.USW.UserNumSta, prometheus.GaugeValue, s.UserNumSta, labels}, - {u.USW.GuestNumSta, prometheus.GaugeValue, s.GuestNumSta, labels}, - {u.USW.Loadavg1, prometheus.GaugeValue, s.SysStats.Loadavg1, labels}, - {u.USW.Loadavg5, prometheus.GaugeValue, s.SysStats.Loadavg5, labels}, - {u.USW.Loadavg15, prometheus.GaugeValue, s.SysStats.Loadavg15, labels}, - {u.USW.MemUsed, prometheus.GaugeValue, s.SysStats.MemUsed, labels}, - {u.USW.MemTotal, prometheus.GaugeValue, s.SysStats.MemTotal, labels}, - {u.USW.MemBuffer, prometheus.GaugeValue, s.SysStats.MemBuffer, labels}, - {u.USW.CPU, prometheus.GaugeValue, s.SystemStats.CPU, labels}, - {u.USW.Mem, prometheus.GaugeValue, s.SystemStats.Mem, labels}, + {u.USW.Uptime, prometheus.GaugeValue, d.Uptime, labels}, + {u.USW.TotalMaxPower, prometheus.GaugeValue, d.TotalMaxPower, labels}, + {u.USW.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, + {u.USW.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, + {u.USW.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, + {u.USW.NumSta, prometheus.GaugeValue, d.NumSta, labels}, + {u.USW.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, + {u.USW.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, + {u.USW.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, + {u.USW.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, + {u.USW.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, + {u.USW.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, + {u.USW.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, + {u.USW.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, + {u.USW.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, + {u.USW.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) - u.exportPortTable(r, s.PortTable, labels[4:]) - u.exportUSWstats(r, s.Stat.Sw, labels) + u.exportPortTable(r, d.PortTable, labels[4:]) + u.exportUSWstats(r, d.Stat.Sw, labels) } -func (u *unifiCollector) exportUSWstats(r *Report, s *unifi.Sw, labels []string) { +func (u *unifiCollector) exportUSWstats(r *Report, sw *unifi.Sw, labels []string) { r.send([]*metricExports{ - {u.USW.SwRxPackets, prometheus.CounterValue, s.RxPackets, labels}, - {u.USW.SwRxBytes, prometheus.CounterValue, s.RxBytes, labels}, - {u.USW.SwRxErrors, prometheus.CounterValue, s.RxErrors, labels}, - {u.USW.SwRxDropped, prometheus.CounterValue, s.RxDropped, labels}, - {u.USW.SwRxCrypts, prometheus.CounterValue, s.RxCrypts, labels}, - {u.USW.SwRxFrags, prometheus.CounterValue, s.RxFrags, labels}, - {u.USW.SwTxPackets, prometheus.CounterValue, s.TxPackets, labels}, - {u.USW.SwTxBytes, prometheus.CounterValue, s.TxBytes, labels}, - {u.USW.SwTxErrors, prometheus.CounterValue, s.TxErrors, labels}, - {u.USW.SwTxDropped, prometheus.CounterValue, s.TxDropped, labels}, - {u.USW.SwTxRetries, prometheus.CounterValue, s.TxRetries, labels}, - {u.USW.SwRxMulticast, prometheus.CounterValue, s.RxMulticast, labels}, - {u.USW.SwRxBroadcast, prometheus.CounterValue, s.RxBroadcast, labels}, - {u.USW.SwTxMulticast, prometheus.CounterValue, s.TxMulticast, labels}, - {u.USW.SwTxBroadcast, prometheus.CounterValue, s.TxBroadcast, labels}, - {u.USW.SwBytes, prometheus.CounterValue, s.Bytes, labels}, + {u.USW.SwRxPackets, prometheus.CounterValue, sw.RxPackets, labels}, + {u.USW.SwRxBytes, prometheus.CounterValue, sw.RxBytes, labels}, + {u.USW.SwRxErrors, prometheus.CounterValue, sw.RxErrors, labels}, + {u.USW.SwRxDropped, prometheus.CounterValue, sw.RxDropped, labels}, + {u.USW.SwRxCrypts, prometheus.CounterValue, sw.RxCrypts, labels}, + {u.USW.SwRxFrags, prometheus.CounterValue, sw.RxFrags, labels}, + {u.USW.SwTxPackets, prometheus.CounterValue, sw.TxPackets, labels}, + {u.USW.SwTxBytes, prometheus.CounterValue, sw.TxBytes, labels}, + {u.USW.SwTxErrors, prometheus.CounterValue, sw.TxErrors, labels}, + {u.USW.SwTxDropped, prometheus.CounterValue, sw.TxDropped, labels}, + {u.USW.SwTxRetries, prometheus.CounterValue, sw.TxRetries, labels}, + {u.USW.SwRxMulticast, prometheus.CounterValue, sw.RxMulticast, labels}, + {u.USW.SwRxBroadcast, prometheus.CounterValue, sw.RxBroadcast, labels}, + {u.USW.SwTxMulticast, prometheus.CounterValue, sw.TxMulticast, labels}, + {u.USW.SwTxBroadcast, prometheus.CounterValue, sw.TxBroadcast, labels}, + {u.USW.SwBytes, prometheus.CounterValue, sw.Bytes, labels}, }) } From 70aae2872394acb31d77a98bf572c5f59fb5808a Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 20:17:37 -0800 Subject: [PATCH 67/85] cleanup --- promunifi/collector.go | 17 +++++--- promunifi/site.go | 98 +++++++++++++++++------------------------ promunifi/uap.go | 88 ++++++++----------------------------- promunifi/udm.go | 99 ++++++++++++++++++++++++++++++++++-------- promunifi/usg.go | 78 ++++++++------------------------- promunifi/usw.go | 82 ++++++++-------------------------- 6 files changed, 189 insertions(+), 273 deletions(-) diff --git a/promunifi/collector.go b/promunifi/collector.go index 960779eb0..7b1842b51 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -38,6 +38,7 @@ type UnifiCollectorCnfg struct { type unifiCollector struct { Config UnifiCollectorCnfg Client *uclient + Device *unifiDevice UAP *uap USG *usg USW *usw @@ -70,14 +71,17 @@ func NewUnifiCollector(opts UnifiCollectorCnfg) prometheus.Collector { if opts.CollectFn == nil { panic("nil collector function") } - + if opts.Namespace += "_"; opts.Namespace == "_" { + opts.Namespace = "" + } return &unifiCollector{ Config: opts, - Client: descClient(opts.Namespace), - UAP: descUAP(opts.Namespace), - USG: descUSG(opts.Namespace), - USW: descUSW(opts.Namespace), - Site: descSite(opts.Namespace), + Client: descClient(opts.Namespace + "client_"), + Device: descDevice(opts.Namespace + "device_"), // stats for all device types. + UAP: descUAP(opts.Namespace + "device_"), + USG: descUSG(opts.Namespace + "device_"), + USW: descUSW(opts.Namespace + "device_"), + Site: descSite(opts.Namespace + "site_"), } } @@ -97,6 +101,7 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { } describe(u.Client) + describe(u.Device) describe(u.UAP) describe(u.USG) describe(u.USW) diff --git a/promunifi/site.go b/promunifi/site.go index d39994e87..e810c16e0 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -5,16 +5,6 @@ import ( "golift.io/unifi" ) -// Each site has five subsystems. -// Some of them share data, but generally each one has its own data set. -const ( - subsystemLAN = "lan" - subsystemVPN = "vpn" - subsystemWWW = "www" - subsystemWLAN = "wlan" - subsystemWAN = "wan" -) - type site struct { NumUser *prometheus.Desc NumGuest *prometheus.Desc @@ -44,11 +34,7 @@ type site struct { } func descSite(ns string) *site { - if ns += "_site_"; ns == "_site_" { - ns = "site_" - } labels := []string{"subsystem", "status", "name", "desc", "site_name"} - return &site{ NumUser: prometheus.NewDesc(ns+"users", "Number of Users", labels, nil), NumGuest: prometheus.NewDesc(ns+"guests", "Number of Guests", labels, nil), @@ -95,25 +81,11 @@ func (u *unifiCollector) exportSite(r *Report, s *unifi.Site) { labels := []string{s.Name, s.Desc, s.SiteName} for _, h := range s.Health { l := append([]string{h.Subsystem, h.Status}, labels...) - - if h.Subsystem != subsystemVPN { + switch h.Subsystem { + case "www": r.send([]*metricExports{ {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l}, {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l}, - }) - } else { - r.send([]*metricExports{ - {u.Site.RemoteUserNumActive, prometheus.GaugeValue, h.RemoteUserNumActive, l}, - {u.Site.RemoteUserNumInactive, prometheus.GaugeValue, h.RemoteUserNumInactive, l}, - {u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes, l}, - {u.Site.RemoteUserTxBytes, prometheus.CounterValue, h.RemoteUserTxBytes, l}, - {u.Site.RemoteUserRxPackets, prometheus.CounterValue, h.RemoteUserRxPackets, l}, - {u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets, l}, - }) - } - - if h.Subsystem == subsystemWWW { - r.send([]*metricExports{ {u.Site.Uptime, prometheus.GaugeValue, h.Latency, l}, {u.Site.Latency, prometheus.GaugeValue, h.Latency.Val / 1000, l}, {u.Site.XputUp, prometheus.GaugeValue, h.XputUp, l}, @@ -121,42 +93,54 @@ func (u *unifiCollector) exportSite(r *Report, s *unifi.Site) { {u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing, l}, {u.Site.Drops, prometheus.CounterValue, h.Drops, l}, }) - } - if h.Subsystem == subsystemLAN || h.Subsystem == subsystemWLAN || h.Subsystem == subsystemWAN { + case "wlan": r.send([]*metricExports{ + {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l}, + {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l}, {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, l}, {u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, l}, {u.Site.NumPending, prometheus.GaugeValue, h.NumPending, l}, + {u.Site.NumUser, prometheus.GaugeValue, h.NumUser, l}, + {u.Site.NumGuest, prometheus.GaugeValue, h.NumGuest, l}, + {u.Site.NumIot, prometheus.GaugeValue, h.NumIot, l}, + {u.Site.NumAp, prometheus.GaugeValue, h.NumAp, l}, + {u.Site.NumDisabled, prometheus.GaugeValue, h.NumDisabled, l}, }) - if h.Subsystem == subsystemLAN || h.Subsystem == subsystemWLAN { - r.send([]*metricExports{ - {u.Site.NumUser, prometheus.GaugeValue, h.NumUser, l}, - {u.Site.NumGuest, prometheus.GaugeValue, h.NumGuest, l}, - {u.Site.NumIot, prometheus.GaugeValue, h.NumIot, l}, - }) - } - - if h.Subsystem == subsystemWLAN { - r.send([]*metricExports{ - {u.Site.NumAp, prometheus.GaugeValue, h.NumAp, l}, - {u.Site.NumDisabled, prometheus.GaugeValue, h.NumDisabled, l}, - }) - } + case "wan": + r.send([]*metricExports{ + {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l}, + {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l}, + {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, l}, + {u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, l}, + {u.Site.NumPending, prometheus.GaugeValue, h.NumPending, l}, + {u.Site.NumGw, prometheus.GaugeValue, h.NumGw, l}, + {u.Site.NumSta, prometheus.GaugeValue, h.NumSta, l}, + }) - if h.Subsystem == subsystemWAN { - r.send([]*metricExports{ - {u.Site.NumGw, prometheus.GaugeValue, h.NumGw, l}, - {u.Site.NumSta, prometheus.GaugeValue, h.NumSta, l}, - }) - } + case "lan": + r.send([]*metricExports{ + {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l}, + {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l}, + {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, l}, + {u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, l}, + {u.Site.NumPending, prometheus.GaugeValue, h.NumPending, l}, + {u.Site.NumUser, prometheus.GaugeValue, h.NumUser, l}, + {u.Site.NumGuest, prometheus.GaugeValue, h.NumGuest, l}, + {u.Site.NumIot, prometheus.GaugeValue, h.NumIot, l}, + {u.Site.NumSw, prometheus.GaugeValue, h.NumSw, l}, + }) - if h.Subsystem == subsystemLAN { - r.send([]*metricExports{ - {u.Site.NumSw, prometheus.GaugeValue, h.NumSw, l}, - }) - } + case "vpn": + r.send([]*metricExports{ + {u.Site.RemoteUserNumActive, prometheus.GaugeValue, h.RemoteUserNumActive, l}, + {u.Site.RemoteUserNumInactive, prometheus.GaugeValue, h.RemoteUserNumInactive, l}, + {u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes, l}, + {u.Site.RemoteUserTxBytes, prometheus.CounterValue, h.RemoteUserTxBytes, l}, + {u.Site.RemoteUserRxPackets, prometheus.CounterValue, h.RemoteUserRxPackets, l}, + {u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets, l}, + }) } } } diff --git a/promunifi/uap.go b/promunifi/uap.go index 5a4a519f0..5219675a1 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -6,27 +6,6 @@ import ( ) type uap struct { - Uptime *prometheus.Desc - TotalTxBytes *prometheus.Desc - TotalRxBytes *prometheus.Desc - TotalBytes *prometheus.Desc - BytesD *prometheus.Desc - TxBytesD *prometheus.Desc - RxBytesD *prometheus.Desc - BytesR *prometheus.Desc - NumSta *prometheus.Desc - UserNumSta *prometheus.Desc - GuestNumSta *prometheus.Desc - // System Stats - Loadavg1 *prometheus.Desc - Loadavg5 *prometheus.Desc - Loadavg15 *prometheus.Desc - MemBuffer *prometheus.Desc - MemTotal *prometheus.Desc - MemUsed *prometheus.Desc - CPU *prometheus.Desc - Mem *prometheus.Desc - ApBytes *prometheus.Desc // Ap Traffic Stats ApWifiTxDropped *prometheus.Desc ApRxErrors *prometheus.Desc @@ -104,36 +83,11 @@ type uap struct { } func descUAP(ns string) *uap { - if ns += "_uap_"; ns == "_uap_" { - ns = "uap_" - } labels := []string{"ip", "site_name", "mac", "model", "name", "serial", "type", "version"} labelA := append([]string{"stat"}, labels[2:]...) labelV := append([]string{"vap_name", "bssid", "radio_name", "essid", "usage"}, labels[2:]...) labelR := append([]string{"radio_name", "radio"}, labels[2:]...) - return &uap{ - Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), - TotalTxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Total Transmitted Bytes", labels, nil), - TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil), - TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil), - BytesD: prometheus.NewDesc(ns+"d_bytes", "Total Bytes D???", labels, nil), - TxBytesD: prometheus.NewDesc(ns+"d_tranmsit_bytes", "Transmit Bytes D???", labels, nil), - RxBytesD: prometheus.NewDesc(ns+"d_receive_bytes", "Receive Bytes D???", labels, nil), - BytesR: prometheus.NewDesc(ns+"rate_bytes", "Transfer Rate", labels, nil), - NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"user_stations", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"guest_stations", "Number of Guest Stations", labels, nil), - Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), - Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), - Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), - MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil), - MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil), - MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil), - CPU: prometheus.NewDesc(ns+"cpu_utilization_percent", "System CPU % Utilized", labels, nil), - Mem: prometheus.NewDesc(ns+"memory_utilization_percent", "System Memory % Utilized", labels, nil), - ApBytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Total Bytes Moved", labels, nil), - // 3x each - stat table: total, guest, user ApWifiTxDropped: prometheus.NewDesc(ns+"stat_wifi_transmt_dropped_total", "Wifi Transmissions Dropped", labelA, nil), ApRxErrors: prometheus.NewDesc(ns+"stat_receive_errors_total", "Receive Errors", labelA, nil), @@ -149,7 +103,6 @@ func descUAP(ns string) *uap { ApRxBytes: prometheus.NewDesc(ns+"stat_receive_bytes_total", "Receive Bytes", labelA, nil), WifiTxAttempts: prometheus.NewDesc(ns+"stat_wifi_transmit_attempts_total", "Wifi Transmission Attempts", labelA, nil), MacFilterRejections: prometheus.NewDesc(ns+"stat_mac_filter_rejects_total", "MAC Filter Rejections", labelA, nil), - // N each - 1 per Virtual AP (VAP) VAPCcq: prometheus.NewDesc(ns+"vap_ccq", "VAP Client Connection Quality", labelV, nil), VAPMacFilterRejections: prometheus.NewDesc(ns+"vap_mac_filter_rejects_total", "VAP MAC Filter Rejections", labelV, nil), @@ -189,7 +142,6 @@ func descUAP(ns string) *uap { VAPWifiTxLatencyMovMin: prometheus.NewDesc(ns+"vap_transmit_latency_moving_min_seconds", "VAP Latency Moving Minimum Tramsit", labelV, nil), VAPWifiTxLatencyMovTotal: prometheus.NewDesc(ns+"vap_transmit_latency_moving_total", "VAP Latency Moving Total Tramsit", labelV, nil), VAPWifiTxLatencyMovCount: prometheus.NewDesc(ns+"vap_transmit_latency_moving_count", "VAP Latency Moving Count Tramsit", labelV, nil), - // N each - 1 per Radio. 1-4 radios per AP usually RadioCurrentAntennaGain: prometheus.NewDesc(ns+"radio_current_antenna_gain", "Radio Current Antenna Gain", labelR, nil), RadioHt: prometheus.NewDesc(ns+"radio_ht", "Radio HT", labelR, nil), @@ -228,28 +180,27 @@ func (u *unifiCollector) exportUAPs(r *Report) { func (u *unifiCollector) exportUAP(r *Report, d *unifi.UAP) { labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} - // AP data. r.send([]*metricExports{ - {u.UAP.Uptime, prometheus.GaugeValue, d.Uptime, labels}, - {u.UAP.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, - {u.UAP.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, - {u.UAP.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, - {u.UAP.BytesD, prometheus.CounterValue, d.BytesD, labels}, // not sure if these 3 Ds are counters or gauges. - {u.UAP.TxBytesD, prometheus.CounterValue, d.TxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. - {u.UAP.RxBytesD, prometheus.CounterValue, d.RxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. - {u.UAP.BytesR, prometheus.GaugeValue, d.BytesR, labels}, - {u.UAP.NumSta, prometheus.GaugeValue, d.NumSta, labels}, - {u.UAP.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, - {u.UAP.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, - {u.UAP.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, - {u.UAP.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, - {u.UAP.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, - {u.UAP.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, - {u.UAP.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, - {u.UAP.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, - {u.UAP.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, - {u.UAP.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, + {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, + {u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, + {u.Device.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, + {u.Device.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, + {u.Device.BytesD, prometheus.CounterValue, d.BytesD, labels}, // not sure if these 3 Ds are counters or gauges. + {u.Device.TxBytesD, prometheus.CounterValue, d.TxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. + {u.Device.RxBytesD, prometheus.CounterValue, d.RxBytesD, labels}, // not sure if these 3 Ds are counters or gauges. + {u.Device.BytesR, prometheus.GaugeValue, d.BytesR, labels}, + {u.Device.NumSta, prometheus.GaugeValue, d.NumSta, labels}, + {u.Device.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, + {u.Device.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, + {u.Device.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, + {u.Device.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, + {u.Device.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, + {u.Device.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, + {u.Device.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, + {u.Device.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, + {u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, + {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) u.exportUAPstats(r, labels[2:], d.Stat.Ap) u.exportVAPtable(r, labels[2:], d.VapTable) @@ -260,7 +211,6 @@ func (u *unifiCollector) exportUAPstats(r *Report, labels []string, ap *unifi.Ap labelA := append([]string{"all"}, labels...) labelU := append([]string{"user"}, labels...) labelG := append([]string{"guest"}, labels...) - r.send([]*metricExports{ // all {u.UAP.ApWifiTxDropped, prometheus.CounterValue, ap.WifiTxDropped, labelA}, diff --git a/promunifi/udm.go b/promunifi/udm.go index c8c0dc332..1586addd9 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -5,6 +5,68 @@ import ( "golift.io/unifi" ) +// These are shared by all four device types: UDM, UAP, USG, USW +type unifiDevice struct { + Uptime *prometheus.Desc + Temperature *prometheus.Desc // sw only + TotalMaxPower *prometheus.Desc // sw only + FanLevel *prometheus.Desc // sw only + TotalTxBytes *prometheus.Desc + TotalRxBytes *prometheus.Desc + TotalBytes *prometheus.Desc + BytesR *prometheus.Desc // ap only + BytesD *prometheus.Desc // ap only + Bytes *prometheus.Desc // ap only + TxBytesD *prometheus.Desc // ap only + RxBytesD *prometheus.Desc // ap only + NumSta *prometheus.Desc + UserNumSta *prometheus.Desc + GuestNumSta *prometheus.Desc + NumDesktop *prometheus.Desc // gw only + NumMobile *prometheus.Desc // gw only + NumHandheld *prometheus.Desc // gw only + Loadavg1 *prometheus.Desc + Loadavg5 *prometheus.Desc + Loadavg15 *prometheus.Desc + MemBuffer *prometheus.Desc + MemTotal *prometheus.Desc + MemUsed *prometheus.Desc + CPU *prometheus.Desc + Mem *prometheus.Desc +} + +func descDevice(ns string) *unifiDevice { + labels := []string{"ip", "site_name", "mac", "model", "name", "serial", "type", "version"} + return &unifiDevice{ + Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), + Temperature: prometheus.NewDesc(ns+"temperature_celsius", "Temperature", labels, nil), + TotalMaxPower: prometheus.NewDesc(ns+"max_power_total", "Total Max Power", labels, nil), + FanLevel: prometheus.NewDesc(ns+"fan_level", "Fan Level", labels, nil), + TotalTxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Total Transmitted Bytes", labels, nil), + TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil), + TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil), + BytesR: prometheus.NewDesc(ns+"rate_bytes", "Transfer Rate", labels, nil), + BytesD: prometheus.NewDesc(ns+"d_bytes", "Total Bytes D???", labels, nil), + Bytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Bytes Transferred", labels, nil), + TxBytesD: prometheus.NewDesc(ns+"d_tranmsit_bytes", "Transmit Bytes D???", labels, nil), + RxBytesD: prometheus.NewDesc(ns+"d_receive_bytes", "Receive Bytes D???", labels, nil), + NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil), + UserNumSta: prometheus.NewDesc(ns+"user_stations", "Number of User Stations", labels, nil), + GuestNumSta: prometheus.NewDesc(ns+"guest_stations", "Number of Guest Stations", labels, nil), + NumDesktop: prometheus.NewDesc(ns+"desktops", "Number of Desktops", labels, nil), + NumMobile: prometheus.NewDesc(ns+"mobile", "Number of Mobiles", labels, nil), + NumHandheld: prometheus.NewDesc(ns+"handheld", "Number of Handhelds", labels, nil), + Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), + Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), + Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), + MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil), + MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil), + MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil), + CPU: prometheus.NewDesc(ns+"cpu_utilization_percent", "System CPU % Utilized", labels, nil), + Mem: prometheus.NewDesc(ns+"memory_utilization_percent", "System Memory % Utilized", labels, nil), + } +} + func (u *unifiCollector) exportUDMs(r *Report) { if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.UDMs) < 1 { return @@ -23,30 +85,31 @@ func (u *unifiCollector) exportUDM(r *Report, d *unifi.UDM) { labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} // Gateway System Data. r.send([]*metricExports{ - {u.USG.Uptime, prometheus.GaugeValue, d.Uptime, labels}, - {u.USG.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, - {u.USG.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, - {u.USG.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, - {u.USG.NumSta, prometheus.GaugeValue, d.NumSta, labels}, - {u.USG.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, - {u.USG.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, - {u.USG.NumDesktop, prometheus.GaugeValue, d.NumDesktop, labels}, - {u.USG.NumMobile, prometheus.GaugeValue, d.NumMobile, labels}, - {u.USG.NumHandheld, prometheus.GaugeValue, d.NumHandheld, labels}, - {u.USG.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, - {u.USG.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, - {u.USG.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, - {u.USG.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, - {u.USG.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, - {u.USG.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, - {u.USG.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, - {u.USG.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, + {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, + {u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, + {u.Device.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, + {u.Device.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, + {u.Device.NumSta, prometheus.GaugeValue, d.NumSta, labels}, + {u.Device.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, + {u.Device.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, + {u.Device.NumDesktop, prometheus.GaugeValue, d.NumDesktop, labels}, + {u.Device.NumMobile, prometheus.GaugeValue, d.NumMobile, labels}, + {u.Device.NumHandheld, prometheus.GaugeValue, d.NumHandheld, labels}, + {u.Device.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, + {u.Device.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, + {u.Device.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, + {u.Device.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, + {u.Device.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, + {u.Device.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, + {u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, + {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) u.exportUSWstats(r, d.Stat.Sw, labels) u.exportUSGstats(r, d.Stat.Gw, d.SpeedtestStatus, labels) u.exportWANPorts(r, labels, d.Wan1, d.Wan2) u.exportPortTable(r, d.PortTable, labels[4:]) if d.Stat.Ap != nil && d.VapTable != nil { + // UDM Pro does not have these. UDM non-Pro does. u.exportUAPstats(r, labels[2:], d.Stat.Ap) u.exportVAPtable(r, labels[2:], *d.VapTable) u.exportRadtable(r, labels[2:], *d.RadioTable, *d.RadioTableStats) diff --git a/promunifi/usg.go b/promunifi/usg.go index 077550eda..b5d7211a2 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -6,26 +6,6 @@ import ( ) type usg struct { - Uptime *prometheus.Desc - TotalMaxPower *prometheus.Desc - FanLevel *prometheus.Desc - TotalTxBytes *prometheus.Desc - TotalRxBytes *prometheus.Desc - TotalBytes *prometheus.Desc - NumSta *prometheus.Desc - UserNumSta *prometheus.Desc - GuestNumSta *prometheus.Desc - NumDesktop *prometheus.Desc - NumMobile *prometheus.Desc - NumHandheld *prometheus.Desc - Loadavg1 *prometheus.Desc - Loadavg5 *prometheus.Desc - Loadavg15 *prometheus.Desc - MemBuffer *prometheus.Desc - MemTotal *prometheus.Desc - MemUsed *prometheus.Desc - CPU *prometheus.Desc - Mem *prometheus.Desc WanRxPackets *prometheus.Desc WanRxBytes *prometheus.Desc WanRxDropped *prometheus.Desc @@ -54,31 +34,9 @@ type usg struct { } func descUSG(ns string) *usg { - if ns += "_usg_"; ns == "_usg_" { - ns = "usg_" - } labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"} labelWan := append([]string{"port"}, labels...) - return &usg{ - Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Uptime", labels, nil), - TotalTxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Total Transmitted Bytes", labels, nil), - TotalRxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Total Received Bytes", labels, nil), - TotalBytes: prometheus.NewDesc(ns+"transferred_bytes_total", "Total Bytes Transferred", labels, nil), - NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"user_stations", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"guest_stations", "Number of Guest Stations", labels, nil), - NumDesktop: prometheus.NewDesc(ns+"desktops", "Number of Desktops", labels, nil), - NumMobile: prometheus.NewDesc(ns+"mobile", "Number of Mobiles", labels, nil), - NumHandheld: prometheus.NewDesc(ns+"handheld", "Number of Handhelds", labels, nil), - Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), - Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), - Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), - MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil), - MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil), - MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil), - CPU: prometheus.NewDesc(ns+"cpu_utilization_percent", "System CPU % Utilized", labels, nil), - Mem: prometheus.NewDesc(ns+"memory_utilization_percent", "System Memory % Utilized", labels, nil), WanRxPackets: prometheus.NewDesc(ns+"wan_receive_packets_total", "WAN Receive Packets Total", labelWan, nil), WanRxBytes: prometheus.NewDesc(ns+"wan_receive_bytes_total", "WAN Receive Bytes Total", labelWan, nil), WanRxDropped: prometheus.NewDesc(ns+"wan_receive_dropped_total", "WAN Receive Dropped Total", labelWan, nil), @@ -124,24 +82,24 @@ func (u *unifiCollector) exportUSG(r *Report, d *unifi.USG) { labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} // Gateway System Data. r.send([]*metricExports{ - {u.USG.Uptime, prometheus.GaugeValue, d.Uptime, labels}, - {u.USG.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, - {u.USG.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, - {u.USG.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, - {u.USG.NumSta, prometheus.GaugeValue, d.NumSta, labels}, - {u.USG.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, - {u.USG.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, - {u.USG.NumDesktop, prometheus.GaugeValue, d.NumDesktop, labels}, - {u.USG.NumMobile, prometheus.GaugeValue, d.NumMobile, labels}, - {u.USG.NumHandheld, prometheus.GaugeValue, d.NumHandheld, labels}, - {u.USG.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, - {u.USG.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, - {u.USG.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, - {u.USG.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, - {u.USG.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, - {u.USG.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, - {u.USG.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, - {u.USG.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, + {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, + {u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, + {u.Device.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, + {u.Device.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, + {u.Device.NumSta, prometheus.GaugeValue, d.NumSta, labels}, + {u.Device.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, + {u.Device.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, + {u.Device.NumDesktop, prometheus.GaugeValue, d.NumDesktop, labels}, + {u.Device.NumMobile, prometheus.GaugeValue, d.NumMobile, labels}, + {u.Device.NumHandheld, prometheus.GaugeValue, d.NumHandheld, labels}, + {u.Device.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, + {u.Device.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, + {u.Device.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, + {u.Device.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, + {u.Device.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, + {u.Device.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, + {u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, + {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) u.exportWANPorts(r, labels, d.Wan1, d.Wan2) u.exportUSGstats(r, d.Stat.Gw, d.SpeedtestStatus, labels) diff --git a/promunifi/usw.go b/promunifi/usw.go index 4dc793f87..f1e5fe132 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -6,25 +6,6 @@ import ( ) type usw struct { - Uptime *prometheus.Desc - Temperature *prometheus.Desc - TotalMaxPower *prometheus.Desc - FanLevel *prometheus.Desc - TotalTxBytes *prometheus.Desc - TotalRxBytes *prometheus.Desc - TotalBytes *prometheus.Desc - NumSta *prometheus.Desc - UserNumSta *prometheus.Desc - GuestNumSta *prometheus.Desc - // System Stats - Loadavg1 *prometheus.Desc - Loadavg5 *prometheus.Desc - Loadavg15 *prometheus.Desc - MemBuffer *prometheus.Desc - MemTotal *prometheus.Desc - MemUsed *prometheus.Desc - CPU *prometheus.Desc - Mem *prometheus.Desc // Switch "total" traffic stats SwRxPackets *prometheus.Desc SwRxBytes *prometheus.Desc @@ -65,36 +46,12 @@ type usw struct { } func descUSW(ns string) *usw { - if ns += "_usw_"; ns == "_usw_" { - ns = "usw_" - } pns := ns + "port_" // The first five labels for switch are shared with (the same as) switch ports. labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"} // Copy labels, and replace first four with different names. labelP := append([]string{"port_num", "port_name", "port_mac", "port_ip"}, labels[4:]...) - return &usw{ - // switch data - Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Uptime", labels, nil), - Temperature: prometheus.NewDesc(ns+"temperature_celsius", "Temperature", labels, nil), - TotalMaxPower: prometheus.NewDesc(ns+"max_power_total", "Total Max Power", labels, nil), - FanLevel: prometheus.NewDesc(ns+"fan_level", "Fan Level", labels, nil), - TotalTxBytes: prometheus.NewDesc(ns+"bytes_tx_total", "Total Transmitted Bytes", labels, nil), - TotalRxBytes: prometheus.NewDesc(ns+"bytes_rx_total", "Total Received Bytes", labels, nil), - TotalBytes: prometheus.NewDesc(ns+"bytes_total", "Total Bytes Transferred", labels, nil), - NumSta: prometheus.NewDesc(ns+"stations", "Number of Stations", labels, nil), - UserNumSta: prometheus.NewDesc(ns+"user_stations", "Number of User Stations", labels, nil), - GuestNumSta: prometheus.NewDesc(ns+"guest_stations", "Number of Guest Stations", labels, nil), - Loadavg1: prometheus.NewDesc(ns+"load_average_1", "System Load Average 1 Minute", labels, nil), - Loadavg5: prometheus.NewDesc(ns+"load_average_5", "System Load Average 5 Minutes", labels, nil), - Loadavg15: prometheus.NewDesc(ns+"load_average_15", "System Load Average 15 Minutes", labels, nil), - MemUsed: prometheus.NewDesc(ns+"memory_used_bytes", "System Memory Used", labels, nil), - MemTotal: prometheus.NewDesc(ns+"memory_installed_bytes", "System Installed Memory", labels, nil), - MemBuffer: prometheus.NewDesc(ns+"memory_buffer_bytes", "System Memory Buffer", labels, nil), - CPU: prometheus.NewDesc(ns+"cpu_utilization_percent", "System CPU % Utilized", labels, nil), - Mem: prometheus.NewDesc(ns+"memory_utilization_percent", "System Memory % Utilized", labels, nil), - SwRxPackets: prometheus.NewDesc(ns+"switch_receive_packets_total", "Switch Packets Received Total", labels, nil), SwRxBytes: prometheus.NewDesc(ns+"switch_receive_bytes_total", "Switch Bytes Received Total", labels, nil), SwRxErrors: prometheus.NewDesc(ns+"switch_receive_errors_total", "Switch Errors Received Total", labels, nil), @@ -111,7 +68,6 @@ func descUSW(ns string) *usw { SwTxMulticast: prometheus.NewDesc(ns+"switch_transmit_multicast_total", "Switch Multicast Transmit Total", labels, nil), SwTxBroadcast: prometheus.NewDesc(ns+"switch_transmit_broadcast_total", "Switch Broadcast Transmit Total", labels, nil), SwBytes: prometheus.NewDesc(ns+"switch_bytes_total", "Switch Bytes Transferred Total", labels, nil), - // per-port data PoeCurrent: prometheus.NewDesc(pns+"poe_amperes", "POE Current", labelP, nil), PoePower: prometheus.NewDesc(pns+"poe_watts", "POE Power", labelP, nil), @@ -150,32 +106,31 @@ func (u *unifiCollector) exportUSWs(r *Report) { func (u *unifiCollector) exportUSW(r *Report, d *unifi.USW) { labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} - if d.HasTemperature.Val { - r.send([]*metricExports{{u.USW.Temperature, prometheus.GaugeValue, d.GeneralTemperature, labels}}) + r.send([]*metricExports{{u.Device.Temperature, prometheus.GaugeValue, d.GeneralTemperature, labels}}) } if d.HasFan.Val { - r.send([]*metricExports{{u.USW.FanLevel, prometheus.GaugeValue, d.FanLevel, labels}}) + r.send([]*metricExports{{u.Device.FanLevel, prometheus.GaugeValue, d.FanLevel, labels}}) } // Switch data. r.send([]*metricExports{ - {u.USW.Uptime, prometheus.GaugeValue, d.Uptime, labels}, - {u.USW.TotalMaxPower, prometheus.GaugeValue, d.TotalMaxPower, labels}, - {u.USW.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, - {u.USW.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, - {u.USW.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, - {u.USW.NumSta, prometheus.GaugeValue, d.NumSta, labels}, - {u.USW.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, - {u.USW.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, - {u.USW.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, - {u.USW.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, - {u.USW.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, - {u.USW.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, - {u.USW.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, - {u.USW.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, - {u.USW.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, - {u.USW.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, + {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, + {u.Device.TotalMaxPower, prometheus.GaugeValue, d.TotalMaxPower, labels}, + {u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, + {u.Device.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, + {u.Device.TotalBytes, prometheus.CounterValue, d.Bytes, labels}, + {u.Device.NumSta, prometheus.GaugeValue, d.NumSta, labels}, + {u.Device.UserNumSta, prometheus.GaugeValue, d.UserNumSta, labels}, + {u.Device.GuestNumSta, prometheus.GaugeValue, d.GuestNumSta, labels}, + {u.Device.Loadavg1, prometheus.GaugeValue, d.SysStats.Loadavg1, labels}, + {u.Device.Loadavg5, prometheus.GaugeValue, d.SysStats.Loadavg5, labels}, + {u.Device.Loadavg15, prometheus.GaugeValue, d.SysStats.Loadavg15, labels}, + {u.Device.MemUsed, prometheus.GaugeValue, d.SysStats.MemUsed, labels}, + {u.Device.MemTotal, prometheus.GaugeValue, d.SysStats.MemTotal, labels}, + {u.Device.MemBuffer, prometheus.GaugeValue, d.SysStats.MemBuffer, labels}, + {u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, + {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) u.exportPortTable(r, d.PortTable, labels[4:]) u.exportUSWstats(r, d.Stat.Sw, labels) @@ -217,6 +172,7 @@ func (u *unifiCollector) exportPortTable(r *Report, pt []unifi.Port, labels []st {u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, l}, }) } + r.send([]*metricExports{ {u.USW.RxBroadcast, prometheus.CounterValue, p.RxBroadcast, l}, {u.USW.RxBytes, prometheus.CounterValue, p.RxBytes, l}, From f91ececd637f3f3ed5b2eae938c2259ab36ffc6e Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 20:43:06 -0800 Subject: [PATCH 68/85] add an interface for testing --- promunifi/clients.go | 12 ++++++------ promunifi/collector.go | 29 +++++++++++++++++++++++++---- promunifi/site.go | 12 ++++++------ promunifi/uap.go | 34 +++++++++++++++++----------------- promunifi/udm.go | 24 ++++++++++++------------ promunifi/usg.go | 18 +++++++++--------- promunifi/usw.go | 22 +++++++++++----------- 7 files changed, 86 insertions(+), 65 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index ce8843ffc..4cc1fbb17 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -87,20 +87,20 @@ func descClient(ns string) *uclient { } } -func (u *unifiCollector) exportClients(r *Report) { - if r.Metrics == nil || len(r.Metrics.Clients) < 1 { +func (u *unifiCollector) exportClients(r report) { + if r.metrics() == nil || len(r.metrics().Clients) < 1 { return } - r.wg.Add(one) + r.add() go func() { - defer r.wg.Done() - for _, c := range r.Metrics.Clients { + defer r.done() + for _, c := range r.metrics().Clients { u.exportClient(r, c) } }() } -func (u *unifiCollector) exportClient(r *Report, c *unifi.Client) { +func (u *unifiCollector) exportClient(r report, c *unifi.Client) { labels := []string{c.Name, c.Mac, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network} labelWired := append([]string{c.SwPort.Txt}, labels...) labelWireless := append([]string{c.ApMac, c.ApName, c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription}, labels...) diff --git a/promunifi/collector.go b/promunifi/collector.go index 7b1842b51..6ed313f2b 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -4,6 +4,7 @@ package promunifi import ( "fmt" "reflect" + "strings" "sync" "time" @@ -12,9 +13,6 @@ import ( "golift.io/unifi" ) -// satisfy gomnd -const one = 1 - // channel buffer, fits at least one batch. const buffer = 50 @@ -65,13 +63,21 @@ type Report struct { wg sync.WaitGroup } +// internal interface used to "process metrics" - can be mocked and overridden for tests. +type report interface { + send([]*metricExports) + add() + done() + metrics() *metrics.Metrics +} + // NewUnifiCollector returns a prometheus collector that will export any available // UniFi metrics. You must provide a collection function in the opts. func NewUnifiCollector(opts UnifiCollectorCnfg) prometheus.Collector { if opts.CollectFn == nil { panic("nil collector function") } - if opts.Namespace += "_"; opts.Namespace == "_" { + if opts.Namespace = strings.Trim(opts.Namespace, "_") + "_"; opts.Namespace == "_" { opts.Namespace = "" } return &unifiCollector{ @@ -175,6 +181,21 @@ func (u *unifiCollector) exportMetrics(r *Report, ch chan<- prometheus.Metric) { u.Config.LoggingFn(r) } +func (r *Report) metrics() *metrics.Metrics { + return r.Metrics +} + +// satisfy gomnd +const one = 1 + +func (r *Report) add() { + r.wg.Add(one) +} + +func (r *Report) done() { + r.wg.Done() +} + func (r *Report) send(m []*metricExports) { r.wg.Add(one) r.ch <- m diff --git a/promunifi/site.go b/promunifi/site.go index e810c16e0..5f9f81cc2 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -64,20 +64,20 @@ func descSite(ns string) *site { } } -func (u *unifiCollector) exportSites(r *Report) { - if r.Metrics == nil || len(r.Metrics.Sites) < 1 { +func (u *unifiCollector) exportSites(r report) { + if r.metrics() == nil || len(r.metrics().Sites) < 1 { return } - r.wg.Add(one) + r.add() go func() { - defer r.wg.Done() - for _, s := range r.Metrics.Sites { + defer r.done() + for _, s := range r.metrics().Sites { u.exportSite(r, s) } }() } -func (u *unifiCollector) exportSite(r *Report, s *unifi.Site) { +func (u *unifiCollector) exportSite(r report, s *unifi.Site) { labels := []string{s.Name, s.Desc, s.SiteName} for _, h := range s.Health { l := append([]string{h.Subsystem, h.Status}, labels...) diff --git a/promunifi/uap.go b/promunifi/uap.go index 5219675a1..262d1d141 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -165,20 +165,20 @@ func descUAP(ns string) *uap { } } -func (u *unifiCollector) exportUAPs(r *Report) { - if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.UAPs) < 1 { +func (u *unifiCollector) exportUAPs(r report) { + if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.UAPs) < 1 { return } - r.wg.Add(one) + r.add() go func() { - defer r.wg.Done() - for _, d := range r.Metrics.Devices.UAPs { + defer r.done() + for _, d := range r.metrics().Devices.UAPs { u.exportUAP(r, d) } }() } -func (u *unifiCollector) exportUAP(r *Report, d *unifi.UAP) { +func (u *unifiCollector) exportUAP(r report, d *unifi.UAP) { labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} // AP data. r.send([]*metricExports{ @@ -202,15 +202,15 @@ func (u *unifiCollector) exportUAP(r *Report, d *unifi.UAP) { {u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) - u.exportUAPstats(r, labels[2:], d.Stat.Ap) - u.exportVAPtable(r, labels[2:], d.VapTable) - u.exportRadtable(r, labels[2:], d.RadioTable, d.RadioTableStats) + u.exportUAPstats(r, labels, d.Stat.Ap) + u.exportVAPtable(r, labels, d.VapTable) + u.exportRadtable(r, labels, d.RadioTable, d.RadioTableStats) } -func (u *unifiCollector) exportUAPstats(r *Report, labels []string, ap *unifi.Ap) { - labelA := append([]string{"all"}, labels...) - labelU := append([]string{"user"}, labels...) - labelG := append([]string{"guest"}, labels...) +func (u *unifiCollector) exportUAPstats(r report, labels []string, ap *unifi.Ap) { + labelA := append([]string{"all"}, labels[2:]...) + labelU := append([]string{"user"}, labels[2:]...) + labelG := append([]string{"guest"}, labels[2:]...) r.send([]*metricExports{ // all {u.UAP.ApWifiTxDropped, prometheus.CounterValue, ap.WifiTxDropped, labelA}, @@ -260,13 +260,13 @@ func (u *unifiCollector) exportUAPstats(r *Report, labels []string, ap *unifi.Ap }) } -func (u *unifiCollector) exportVAPtable(r *Report, labels []string, vt unifi.VapTable) { +func (u *unifiCollector) exportVAPtable(r report, labels []string, vt unifi.VapTable) { // vap table stats for _, v := range vt { if !v.Up.Val { continue } - labelV := append([]string{v.Name, v.Bssid, v.RadioName, v.Essid, v.Usage}, labels...) + labelV := append([]string{v.Name, v.Bssid, v.RadioName, v.Essid, v.Usage}, labels[2:]...) r.send([]*metricExports{ {u.UAP.VAPCcq, prometheus.GaugeValue, v.Ccq, labelV}, {u.UAP.VAPMacFilterRejections, prometheus.CounterValue, v.MacFilterRejections, labelV}, @@ -309,10 +309,10 @@ func (u *unifiCollector) exportVAPtable(r *Report, labels []string, vt unifi.Vap } } -func (u *unifiCollector) exportRadtable(r *Report, labels []string, rt unifi.RadioTable, rts unifi.RadioTableStats) { +func (u *unifiCollector) exportRadtable(r report, labels []string, rt unifi.RadioTable, rts unifi.RadioTableStats) { // radio table for _, p := range rt { - labelR := append([]string{p.Name, p.Radio}, labels...) + labelR := append([]string{p.Name, p.Radio}, labels[2:]...) r.send([]*metricExports{ {u.UAP.RadioCurrentAntennaGain, prometheus.GaugeValue, p.CurrentAntennaGain, labelR}, {u.UAP.RadioHt, prometheus.GaugeValue, p.Ht, labelR}, diff --git a/promunifi/udm.go b/promunifi/udm.go index 1586addd9..c3f62b3b7 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -67,21 +67,21 @@ func descDevice(ns string) *unifiDevice { } } -func (u *unifiCollector) exportUDMs(r *Report) { - if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.UDMs) < 1 { +func (u *unifiCollector) exportUDMs(r report) { + if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.UDMs) < 1 { return } - r.wg.Add(one) + r.add() go func() { - defer r.wg.Done() - for _, d := range r.Metrics.Devices.UDMs { + defer r.done() + for _, d := range r.metrics().Devices.UDMs { u.exportUDM(r, d) } }() } // UDM is a collection of stats from USG, USW and UAP. It has no unique stats. -func (u *unifiCollector) exportUDM(r *Report, d *unifi.UDM) { +func (u *unifiCollector) exportUDM(r report, d *unifi.UDM) { labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} // Gateway System Data. r.send([]*metricExports{ @@ -104,14 +104,14 @@ func (u *unifiCollector) exportUDM(r *Report, d *unifi.UDM) { {u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) - u.exportUSWstats(r, d.Stat.Sw, labels) - u.exportUSGstats(r, d.Stat.Gw, d.SpeedtestStatus, labels) + u.exportUSWstats(r, labels, d.Stat.Sw) + u.exportUSGstats(r, labels, d.Stat.Gw, d.SpeedtestStatus) u.exportWANPorts(r, labels, d.Wan1, d.Wan2) - u.exportPortTable(r, d.PortTable, labels[4:]) + u.exportPortTable(r, labels, d.PortTable) if d.Stat.Ap != nil && d.VapTable != nil { // UDM Pro does not have these. UDM non-Pro does. - u.exportUAPstats(r, labels[2:], d.Stat.Ap) - u.exportVAPtable(r, labels[2:], *d.VapTable) - u.exportRadtable(r, labels[2:], *d.RadioTable, *d.RadioTableStats) + u.exportUAPstats(r, labels, d.Stat.Ap) + u.exportVAPtable(r, labels, *d.VapTable) + u.exportRadtable(r, labels, *d.RadioTable, *d.RadioTableStats) } } diff --git a/promunifi/usg.go b/promunifi/usg.go index b5d7211a2..99e7f4103 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -65,20 +65,20 @@ func descUSG(ns string) *usg { } } -func (u *unifiCollector) exportUSGs(r *Report) { - if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.USGs) < 1 { +func (u *unifiCollector) exportUSGs(r report) { + if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.USGs) < 1 { return } - r.wg.Add(one) + r.add() go func() { - defer r.wg.Done() - for _, d := range r.Metrics.Devices.USGs { + defer r.done() + for _, d := range r.metrics().Devices.USGs { u.exportUSG(r, d) } }() } -func (u *unifiCollector) exportUSG(r *Report, d *unifi.USG) { +func (u *unifiCollector) exportUSG(r report, d *unifi.USG) { labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} // Gateway System Data. r.send([]*metricExports{ @@ -102,10 +102,10 @@ func (u *unifiCollector) exportUSG(r *Report, d *unifi.USG) { {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) u.exportWANPorts(r, labels, d.Wan1, d.Wan2) - u.exportUSGstats(r, d.Stat.Gw, d.SpeedtestStatus, labels) + u.exportUSGstats(r, labels, d.Stat.Gw, d.SpeedtestStatus) } -func (u *unifiCollector) exportUSGstats(r *Report, gw *unifi.Gw, st unifi.SpeedtestStatus, labels []string) { +func (u *unifiCollector) exportUSGstats(r report, labels []string, gw *unifi.Gw, st unifi.SpeedtestStatus) { labelWan := append([]string{"all"}, labels...) r.send([]*metricExports{ // Combined Port Stats @@ -128,7 +128,7 @@ func (u *unifiCollector) exportUSGstats(r *Report, gw *unifi.Gw, st unifi.Speedt }) } -func (u *unifiCollector) exportWANPorts(r *Report, labels []string, wans ...unifi.Wan) { +func (u *unifiCollector) exportWANPorts(r report, labels []string, wans ...unifi.Wan) { for _, wan := range wans { if !wan.Up.Val { continue // only record UP interfaces. diff --git a/promunifi/usw.go b/promunifi/usw.go index f1e5fe132..a79f4092e 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -91,20 +91,20 @@ func descUSW(ns string) *usw { } } -func (u *unifiCollector) exportUSWs(r *Report) { - if r.Metrics == nil || r.Metrics.Devices == nil || len(r.Metrics.Devices.USWs) < 1 { +func (u *unifiCollector) exportUSWs(r report) { + if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.USWs) < 1 { return } - r.wg.Add(one) + r.add() go func() { - defer r.wg.Done() - for _, d := range r.Metrics.Devices.USWs { + defer r.done() + for _, d := range r.metrics().Devices.USWs { u.exportUSW(r, d) } }() } -func (u *unifiCollector) exportUSW(r *Report, d *unifi.USW) { +func (u *unifiCollector) exportUSW(r report, d *unifi.USW) { labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} if d.HasTemperature.Val { r.send([]*metricExports{{u.Device.Temperature, prometheus.GaugeValue, d.GeneralTemperature, labels}}) @@ -132,11 +132,11 @@ func (u *unifiCollector) exportUSW(r *Report, d *unifi.USW) { {u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) - u.exportPortTable(r, d.PortTable, labels[4:]) - u.exportUSWstats(r, d.Stat.Sw, labels) + u.exportPortTable(r, labels, d.PortTable) + u.exportUSWstats(r, labels, d.Stat.Sw) } -func (u *unifiCollector) exportUSWstats(r *Report, sw *unifi.Sw, labels []string) { +func (u *unifiCollector) exportUSWstats(r report, labels []string, sw *unifi.Sw) { r.send([]*metricExports{ {u.USW.SwRxPackets, prometheus.CounterValue, sw.RxPackets, labels}, {u.USW.SwRxBytes, prometheus.CounterValue, sw.RxBytes, labels}, @@ -157,14 +157,14 @@ func (u *unifiCollector) exportUSWstats(r *Report, sw *unifi.Sw, labels []string }) } -func (u *unifiCollector) exportPortTable(r *Report, pt []unifi.Port, labels []string) { +func (u *unifiCollector) exportPortTable(r report, labels []string, pt []unifi.Port) { // Per-port data on a switch for _, p := range pt { if !p.Up.Val { continue } // Copy labels, and add four new ones. - l := append([]string{p.PortIdx.Txt, p.Name, p.Mac, p.IP}, labels...) + l := append([]string{p.PortIdx.Txt, p.Name, p.Mac, p.IP}, labels[4:]...) if p.PoeEnable.Val && p.PortPoe.Val { r.send([]*metricExports{ {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}, From 2a479ddfcf66d2570217c4e88719f3145a99e4dc Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Thu, 28 Nov 2019 21:08:53 -0800 Subject: [PATCH 69/85] bug fix --- promunifi/clients.go | 8 +------- promunifi/udm.go | 2 +- 2 files changed, 2 insertions(+), 8 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 4cc1fbb17..579a1648c 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -39,10 +39,6 @@ type uclient struct { } func descClient(ns string) *uclient { - if ns += "_client_"; ns == "_client_" { - ns = "client_" - } - labels := []string{"name", "mac", "site_name", "gw_mac", "gw_name", "sw_mac", "sw_name", "vlan", "ip", "oui", "network"} labelWired := append([]string{"sw_port"}, labels...) labelWireless := append([]string{"ap_mac", "ap_name", "radio_name", "radio", "radio_proto", "channel", "essid", "bssid", "radio_desc"}, labels...) @@ -67,15 +63,13 @@ func descClient(ns string) *uclient { TxPower: prometheus.NewDesc(ns+"radio_transmit_power_dbm", "Client Transmit Power", labelWireless, wireless), TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_bps", "Client Transmit Rate", labelWireless, wireless), WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelWireless, wireless), - WiredRxBytes: prometheus.NewDesc(ns+"wired_receive_bytes_total", "Client Wired Receive Bytes", labelWired, wired), WiredRxBytesR: prometheus.NewDesc(ns+"wired_receive_rate_bytes", "Client Wired Receive Data Rate", labelWired, wired), WiredRxPackets: prometheus.NewDesc(ns+"wired_receive_packets_total", "Client Wired Receive Packets", labelWired, wired), WiredTxBytes: prometheus.NewDesc(ns+"wired_transmit_bytes_total", "Client Wired Transmit Bytes", labelWired, wired), WiredTxBytesR: prometheus.NewDesc(ns+"wired_transmit_rate_bytes", "Client Wired Data Rate", labelWired, wired), WiredTxPackets: prometheus.NewDesc(ns+"wired_transmit_packets_total", "Client Wired Transmit Packets", labelWired, wired), - - Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Client Uptime", labels, nil), + Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Client Uptime", labels, nil), /* needs more "looking into" DpiStatsApp: prometheus.NewDesc(ns+"dpi_stats_app", "Client DPI Stats App", labels, nil), DpiStatsCat: prometheus.NewDesc(ns+"dpi_stats_cat", "Client DPI Stats Cat", labels, nil), diff --git a/promunifi/udm.go b/promunifi/udm.go index c3f62b3b7..34b1adb3d 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -36,7 +36,7 @@ type unifiDevice struct { } func descDevice(ns string) *unifiDevice { - labels := []string{"ip", "site_name", "mac", "model", "name", "serial", "type", "version"} + labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"} return &unifiDevice{ Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), Temperature: prometheus.NewDesc(ns+"temperature_celsius", "Temperature", labels, nil), From c6c26e8641be74ac4651cc6db4eecd68b8ff3cd9 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 00:44:33 -0800 Subject: [PATCH 70/85] fix up client labels --- promunifi/clients.go | 81 ++++++++++++++++++++------------------------ 1 file changed, 37 insertions(+), 44 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 579a1648c..6611e64a8 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -39,37 +39,27 @@ type uclient struct { } func descClient(ns string) *uclient { - labels := []string{"name", "mac", "site_name", "gw_mac", "gw_name", "sw_mac", "sw_name", "vlan", "ip", "oui", "network"} - labelWired := append([]string{"sw_port"}, labels...) + labels := []string{"name", "mac", "site_name", "gw_mac", "gw_name", "sw_mac", "sw_name", "vlan", "ip", "oui", "network", "sw_port", "wired"} labelWireless := append([]string{"ap_mac", "ap_name", "radio_name", "radio", "radio_proto", "channel", "essid", "bssid", "radio_desc"}, labels...) - wireless := prometheus.Labels{"wired": "false"} - wired := prometheus.Labels{"wired": "true"} - return &uclient{ - Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labelWireless, wireless), - BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labelWireless, wireless), - CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labelWireless, wireless), - Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labelWireless, wireless), - RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labelWireless, wireless), - RSSI: prometheus.NewDesc(ns+"rssi_db", "Client RSSI", labelWireless, wireless), - RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labelWireless, wireless), - RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labelWireless, wireless), - RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labelWireless, wireless), - RxRate: prometheus.NewDesc(ns+"radio_receive_rate_bps", "Client Receive Rate", labelWireless, wireless), - Signal: prometheus.NewDesc(ns+"radio_signal_db", "Client Signal Strength", labelWireless, wireless), - TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labelWireless, wireless), - TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labelWireless, wireless), - TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labelWireless, wireless), - TxPower: prometheus.NewDesc(ns+"radio_transmit_power_dbm", "Client Transmit Power", labelWireless, wireless), - TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_bps", "Client Transmit Rate", labelWireless, wireless), - WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelWireless, wireless), - WiredRxBytes: prometheus.NewDesc(ns+"wired_receive_bytes_total", "Client Wired Receive Bytes", labelWired, wired), - WiredRxBytesR: prometheus.NewDesc(ns+"wired_receive_rate_bytes", "Client Wired Receive Data Rate", labelWired, wired), - WiredRxPackets: prometheus.NewDesc(ns+"wired_receive_packets_total", "Client Wired Receive Packets", labelWired, wired), - WiredTxBytes: prometheus.NewDesc(ns+"wired_transmit_bytes_total", "Client Wired Transmit Bytes", labelWired, wired), - WiredTxBytesR: prometheus.NewDesc(ns+"wired_transmit_rate_bytes", "Client Wired Data Rate", labelWired, wired), - WiredTxPackets: prometheus.NewDesc(ns+"wired_transmit_packets_total", "Client Wired Transmit Packets", labelWired, wired), - Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Client Uptime", labels, nil), + Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labelWireless, nil), + BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labelWireless, nil), + CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labelWireless, nil), + Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labelWireless, nil), + RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labelWireless, nil), + RSSI: prometheus.NewDesc(ns+"rssi_db", "Client RSSI", labelWireless, nil), + RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labels, nil), + RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labels, nil), + RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labels, nil), + RxRate: prometheus.NewDesc(ns+"radio_receive_rate_bps", "Client Receive Rate", labelWireless, nil), + Signal: prometheus.NewDesc(ns+"radio_signal_db", "Client Signal Strength", labelWireless, nil), + TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labels, nil), + TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labels, nil), + TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labels, nil), + TxPower: prometheus.NewDesc(ns+"radio_transmit_power_dbm", "Client Transmit Power", labelWireless, nil), + TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_bps", "Client Transmit Rate", labelWireless, nil), + WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelWireless, nil), + Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Client Uptime", labelWireless, nil), /* needs more "looking into" DpiStatsApp: prometheus.NewDesc(ns+"dpi_stats_app", "Client DPI Stats App", labels, nil), DpiStatsCat: prometheus.NewDesc(ns+"dpi_stats_cat", "Client DPI Stats Cat", labels, nil), @@ -95,20 +85,23 @@ func (u *unifiCollector) exportClients(r report) { } func (u *unifiCollector) exportClient(r report, c *unifi.Client) { - labels := []string{c.Name, c.Mac, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network} - labelWired := append([]string{c.SwPort.Txt}, labels...) + labels := []string{c.Name, c.Mac, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network, c.SwPort.Txt, "false"} labelWireless := append([]string{c.ApMac, c.ApName, c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription}, labels...) if c.IsWired.Val { + labels[len(labels)-1] = "true" + labelWireless[len(labelWireless)-1] = "true" r.send([]*metricExports{ - {u.Client.WiredRxBytes, prometheus.CounterValue, c.WiredRxBytes, labelWired}, - {u.Client.WiredRxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labelWired}, - {u.Client.WiredRxPackets, prometheus.CounterValue, c.WiredRxPackets, labelWired}, - {u.Client.WiredTxBytes, prometheus.CounterValue, c.WiredTxBytes, labelWired}, - {u.Client.WiredTxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labelWired}, - {u.Client.WiredTxPackets, prometheus.CounterValue, c.WiredTxPackets, labelWired}, + {u.Client.RxBytes, prometheus.CounterValue, c.WiredRxBytes, labels}, + {u.Client.RxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labels}, + {u.Client.RxPackets, prometheus.CounterValue, c.WiredRxPackets, labels}, + {u.Client.TxBytes, prometheus.CounterValue, c.WiredTxBytes, labels}, + {u.Client.TxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labels}, + {u.Client.TxPackets, prometheus.CounterValue, c.WiredTxPackets, labels}, }) } else { + labels[len(labels)-1] = "false" + labelWireless[len(labelWireless)-1] = "false" r.send([]*metricExports{ {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labelWireless}, {u.Client.CCQ, prometheus.GaugeValue, c.Ccq, labelWireless}, @@ -120,17 +113,17 @@ func (u *unifiCollector) exportClient(r report, c *unifi.Client) { {u.Client.TxRate, prometheus.GaugeValue, c.TxRate * 1000, labelWireless}, {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labelWireless}, {u.Client.RxRate, prometheus.GaugeValue, c.RxRate * 1000, labelWireless}, - {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labelWireless}, - {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labelWireless}, - {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labelWireless}, - {u.Client.RxBytes, prometheus.CounterValue, c.RxBytes, labelWireless}, - {u.Client.RxBytesR, prometheus.GaugeValue, c.RxBytesR, labelWireless}, - {u.Client.RxPackets, prometheus.CounterValue, c.RxPackets, labelWireless}, + {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labels}, + {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labels}, + {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labels}, + {u.Client.RxBytes, prometheus.CounterValue, c.RxBytes, labels}, + {u.Client.RxBytesR, prometheus.GaugeValue, c.RxBytesR, labels}, + {u.Client.RxPackets, prometheus.CounterValue, c.RxPackets, labels}, {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labelWireless}, }) } r.send([]*metricExports{ - {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, + {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labelWireless}, /* needs more "looking into" {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat, labels}, From ea66248c7b2e8fa9fa5ee3dfa3cccbe36a0e0f1d Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 02:47:20 -0800 Subject: [PATCH 71/85] fix labels on UAP --- promunifi/uap.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/promunifi/uap.go b/promunifi/uap.go index 262d1d141..002231fa1 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -83,7 +83,7 @@ type uap struct { } func descUAP(ns string) *uap { - labels := []string{"ip", "site_name", "mac", "model", "name", "serial", "type", "version"} + labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"} labelA := append([]string{"stat"}, labels[2:]...) labelV := append([]string{"vap_name", "bssid", "radio_name", "essid", "usage"}, labels[2:]...) labelR := append([]string{"radio_name", "radio"}, labels[2:]...) From 93d6aac27e77b2c156573e256963c87e49ff4bba Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 03:30:19 -0800 Subject: [PATCH 72/85] use the same labels on all client metrics --- promunifi/clients.go | 91 +++++++++++++++++++------------------------- 1 file changed, 40 insertions(+), 51 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 6611e64a8..4b065e7cf 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -39,27 +39,27 @@ type uclient struct { } func descClient(ns string) *uclient { - labels := []string{"name", "mac", "site_name", "gw_mac", "gw_name", "sw_mac", "sw_name", "vlan", "ip", "oui", "network", "sw_port", "wired"} - labelWireless := append([]string{"ap_mac", "ap_name", "radio_name", "radio", "radio_proto", "channel", "essid", "bssid", "radio_desc"}, labels...) + labels := []string{"name", "mac", "site_name", "gw_mac", "gw_name", "sw_mac", "sw_name", "vlan", "ip", "oui", "network", "sw_port", + "ap_mac", "ap_name", "radio_name", "radio", "radio_proto", "channel", "essid", "bssid", "radio_desc", "wired"} return &uclient{ - Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labelWireless, nil), - BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labelWireless, nil), - CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labelWireless, nil), - Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labelWireless, nil), - RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labelWireless, nil), - RSSI: prometheus.NewDesc(ns+"rssi_db", "Client RSSI", labelWireless, nil), + Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labels, nil), + BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labels, nil), + CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labels, nil), + Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labels, nil), + RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labels, nil), + RSSI: prometheus.NewDesc(ns+"rssi_db", "Client RSSI", labels, nil), RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labels, nil), RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labels, nil), RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labels, nil), - RxRate: prometheus.NewDesc(ns+"radio_receive_rate_bps", "Client Receive Rate", labelWireless, nil), - Signal: prometheus.NewDesc(ns+"radio_signal_db", "Client Signal Strength", labelWireless, nil), + RxRate: prometheus.NewDesc(ns+"radio_receive_rate_bps", "Client Receive Rate", labels, nil), + Signal: prometheus.NewDesc(ns+"radio_signal_db", "Client Signal Strength", labels, nil), TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labels, nil), TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labels, nil), TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labels, nil), - TxPower: prometheus.NewDesc(ns+"radio_transmit_power_dbm", "Client Transmit Power", labelWireless, nil), - TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_bps", "Client Transmit Rate", labelWireless, nil), - WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelWireless, nil), - Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Client Uptime", labelWireless, nil), + TxPower: prometheus.NewDesc(ns+"radio_transmit_power_dbm", "Client Transmit Power", labels, nil), + TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_bps", "Client Transmit Rate", labels, nil), + WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labels, nil), + Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Client Uptime", labels, nil), /* needs more "looking into" DpiStatsApp: prometheus.NewDesc(ns+"dpi_stats_app", "Client DPI Stats App", labels, nil), DpiStatsCat: prometheus.NewDesc(ns+"dpi_stats_cat", "Client DPI Stats Cat", labels, nil), @@ -85,45 +85,17 @@ func (u *unifiCollector) exportClients(r report) { } func (u *unifiCollector) exportClient(r report, c *unifi.Client) { - labels := []string{c.Name, c.Mac, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network, c.SwPort.Txt, "false"} - labelWireless := append([]string{c.ApMac, c.ApName, c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription}, labels...) + labels := []string{c.Name, c.Mac, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network, c.SwPort.Txt, + c.ApMac, c.ApName, c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription, "false"} - if c.IsWired.Val { - labels[len(labels)-1] = "true" - labelWireless[len(labelWireless)-1] = "true" - r.send([]*metricExports{ - {u.Client.RxBytes, prometheus.CounterValue, c.WiredRxBytes, labels}, - {u.Client.RxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labels}, - {u.Client.RxPackets, prometheus.CounterValue, c.WiredRxPackets, labels}, - {u.Client.TxBytes, prometheus.CounterValue, c.WiredTxBytes, labels}, - {u.Client.TxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labels}, - {u.Client.TxPackets, prometheus.CounterValue, c.WiredTxPackets, labels}, - }) - } else { - labels[len(labels)-1] = "false" - labelWireless[len(labelWireless)-1] = "false" - r.send([]*metricExports{ - {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labelWireless}, - {u.Client.CCQ, prometheus.GaugeValue, c.Ccq, labelWireless}, - {u.Client.Noise, prometheus.GaugeValue, c.Noise, labelWireless}, - {u.Client.RoamCount, prometheus.CounterValue, c.RoamCount, labelWireless}, - {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labelWireless}, - {u.Client.Signal, prometheus.GaugeValue, c.Signal, labelWireless}, - {u.Client.TxPower, prometheus.GaugeValue, c.TxPower, labelWireless}, - {u.Client.TxRate, prometheus.GaugeValue, c.TxRate * 1000, labelWireless}, - {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labelWireless}, - {u.Client.RxRate, prometheus.GaugeValue, c.RxRate * 1000, labelWireless}, - {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labels}, - {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labels}, - {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labels}, - {u.Client.RxBytes, prometheus.CounterValue, c.RxBytes, labels}, - {u.Client.RxBytesR, prometheus.GaugeValue, c.RxBytesR, labels}, - {u.Client.RxPackets, prometheus.CounterValue, c.RxPackets, labels}, - {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labelWireless}, - }) - } r.send([]*metricExports{ - {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labelWireless}, + {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, + {u.Client.RxBytes, prometheus.CounterValue, c.WiredRxBytes, labels}, + {u.Client.RxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labels}, + {u.Client.RxPackets, prometheus.CounterValue, c.WiredRxPackets, labels}, + {u.Client.TxBytes, prometheus.CounterValue, c.WiredTxBytes, labels}, + {u.Client.TxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labels}, + {u.Client.TxPackets, prometheus.CounterValue, c.WiredTxPackets, labels}, /* needs more "looking into" {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat, labels}, @@ -133,4 +105,21 @@ func (u *unifiCollector) exportClient(r report, c *unifi.Client) { {u.Client.DpiStatsTxPackets, prometheus.CounterValue, c.DpiStats.TxPackets, labels}, */ }) + if !c.IsWired.Val { + labels[len(labels)-1] = "false" + r.send([]*metricExports{ + {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labels}, + {u.Client.CCQ, prometheus.GaugeValue, c.Ccq, labels}, + {u.Client.Noise, prometheus.GaugeValue, c.Noise, labels}, + {u.Client.RoamCount, prometheus.CounterValue, c.RoamCount, labels}, + {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labels}, + {u.Client.Signal, prometheus.GaugeValue, c.Signal, labels}, + {u.Client.TxPower, prometheus.GaugeValue, c.TxPower, labels}, + {u.Client.TxRate, prometheus.GaugeValue, c.TxRate * 1000, labels}, + {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labels}, + {u.Client.RxRate, prometheus.GaugeValue, c.RxRate * 1000, labels}, + {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labels}, + }) + } + } From 01926aa058c1cfb1264b260efa243f074dade463 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 03:33:24 -0800 Subject: [PATCH 73/85] use the same labels on all client metrics - derp --- promunifi/clients.go | 47 ++++++++++++++++++++++++++------------------ 1 file changed, 28 insertions(+), 19 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 4b065e7cf..32e8629d3 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -88,24 +88,17 @@ func (u *unifiCollector) exportClient(r report, c *unifi.Client) { labels := []string{c.Name, c.Mac, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network, c.SwPort.Txt, c.ApMac, c.ApName, c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription, "false"} - r.send([]*metricExports{ - {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, - {u.Client.RxBytes, prometheus.CounterValue, c.WiredRxBytes, labels}, - {u.Client.RxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labels}, - {u.Client.RxPackets, prometheus.CounterValue, c.WiredRxPackets, labels}, - {u.Client.TxBytes, prometheus.CounterValue, c.WiredTxBytes, labels}, - {u.Client.TxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labels}, - {u.Client.TxPackets, prometheus.CounterValue, c.WiredTxPackets, labels}, - /* needs more "looking into" - {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, - {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat, labels}, - {u.Client.DpiStatsRxBytes, prometheus.CounterValue, c.DpiStats.RxBytes, labels}, - {u.Client.DpiStatsRxPackets, prometheus.CounterValue, c.DpiStats.RxPackets, labels}, - {u.Client.DpiStatsTxBytes, prometheus.CounterValue, c.DpiStats.TxBytes, labels}, - {u.Client.DpiStatsTxPackets, prometheus.CounterValue, c.DpiStats.TxPackets, labels}, - */ - }) - if !c.IsWired.Val { + if c.IsWired.Val { + labels[len(labels)-1] = "true" + r.send([]*metricExports{ + {u.Client.RxBytes, prometheus.CounterValue, c.WiredRxBytes, labels}, + {u.Client.RxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labels}, + {u.Client.RxPackets, prometheus.CounterValue, c.WiredRxPackets, labels}, + {u.Client.TxBytes, prometheus.CounterValue, c.WiredTxBytes, labels}, + {u.Client.TxBytesR, prometheus.GaugeValue, c.WiredTxBytesR, labels}, + {u.Client.TxPackets, prometheus.CounterValue, c.WiredTxPackets, labels}, + }) + } else { labels[len(labels)-1] = "false" r.send([]*metricExports{ {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labels}, @@ -118,8 +111,24 @@ func (u *unifiCollector) exportClient(r report, c *unifi.Client) { {u.Client.TxRate, prometheus.GaugeValue, c.TxRate * 1000, labels}, {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labels}, {u.Client.RxRate, prometheus.GaugeValue, c.RxRate * 1000, labels}, + {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labels}, + {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labels}, + {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labels}, + {u.Client.RxBytes, prometheus.CounterValue, c.RxBytes, labels}, + {u.Client.RxBytesR, prometheus.GaugeValue, c.RxBytesR, labels}, + {u.Client.RxPackets, prometheus.CounterValue, c.RxPackets, labels}, {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labels}, }) } - + r.send([]*metricExports{ + {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, + /* needs more "looking into" + {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, + {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat, labels}, + {u.Client.DpiStatsRxBytes, prometheus.CounterValue, c.DpiStats.RxBytes, labels}, + {u.Client.DpiStatsRxPackets, prometheus.CounterValue, c.DpiStats.RxPackets, labels}, + {u.Client.DpiStatsTxBytes, prometheus.CounterValue, c.DpiStats.TxBytes, labels}, + {u.Client.DpiStatsTxPackets, prometheus.CounterValue, c.DpiStats.TxPackets, labels}, + */ + }) } From ad3e0851c363476ec43ae68910b9e3617bfbcec8 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 04:14:46 -0800 Subject: [PATCH 74/85] add radio label to vaps --- promunifi/uap.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/promunifi/uap.go b/promunifi/uap.go index 002231fa1..6cd3ee60a 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -85,7 +85,7 @@ type uap struct { func descUAP(ns string) *uap { labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"} labelA := append([]string{"stat"}, labels[2:]...) - labelV := append([]string{"vap_name", "bssid", "radio_name", "essid", "usage"}, labels[2:]...) + labelV := append([]string{"vap_name", "bssid", "radio", "radio_name", "essid", "usage"}, labels[2:]...) labelR := append([]string{"radio_name", "radio"}, labels[2:]...) return &uap{ // 3x each - stat table: total, guest, user @@ -266,7 +266,8 @@ func (u *unifiCollector) exportVAPtable(r report, labels []string, vt unifi.VapT if !v.Up.Val { continue } - labelV := append([]string{v.Name, v.Bssid, v.RadioName, v.Essid, v.Usage}, labels[2:]...) + labelV := append([]string{v.Name, v.Bssid, v.Radio, v.RadioName, v.Essid, v.Usage}, labels[2:]...) + r.send([]*metricExports{ {u.UAP.VAPCcq, prometheus.GaugeValue, v.Ccq, labelV}, {u.UAP.VAPMacFilterRejections, prometheus.CounterValue, v.MacFilterRejections, labelV}, From f176db5a011792f042bf7c600d4ea070dbb21e49 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 13:37:10 -0800 Subject: [PATCH 75/85] remove all --- promunifi/uap.go | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/promunifi/uap.go b/promunifi/uap.go index 6cd3ee60a..49f300ada 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -208,11 +208,11 @@ func (u *unifiCollector) exportUAP(r report, d *unifi.UAP) { } func (u *unifiCollector) exportUAPstats(r report, labels []string, ap *unifi.Ap) { - labelA := append([]string{"all"}, labels[2:]...) + // labelA := append([]string{"all"}, labels[2:]...) labelU := append([]string{"user"}, labels[2:]...) labelG := append([]string{"guest"}, labels[2:]...) r.send([]*metricExports{ - // all + /* // all {u.UAP.ApWifiTxDropped, prometheus.CounterValue, ap.WifiTxDropped, labelA}, {u.UAP.ApRxErrors, prometheus.CounterValue, ap.RxErrors, labelA}, {u.UAP.ApRxDropped, prometheus.CounterValue, ap.RxDropped, labelA}, @@ -227,6 +227,7 @@ func (u *unifiCollector) exportUAPstats(r report, labels []string, ap *unifi.Ap) {u.UAP.ApRxBytes, prometheus.CounterValue, ap.RxBytes, labelA}, {u.UAP.WifiTxAttempts, prometheus.CounterValue, ap.WifiTxAttempts, labelA}, {u.UAP.MacFilterRejections, prometheus.CounterValue, ap.MacFilterRejections, labelA}, + */ // user {u.UAP.ApWifiTxDropped, prometheus.CounterValue, ap.UserWifiTxDropped, labelU}, {u.UAP.ApRxErrors, prometheus.CounterValue, ap.UserRxErrors, labelU}, From 9743a83aff6ce8b8610d091c2e6edb377ff69653 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 13:55:59 -0800 Subject: [PATCH 76/85] fix comments --- examples/MANUAL.md | 5 +++-- examples/up.conf.example | 9 +++++---- examples/up.xml.example | 10 ++++++---- examples/up.yaml.example | 11 +++++++---- 4 files changed, 21 insertions(+), 14 deletions(-) diff --git a/examples/MANUAL.md b/examples/MANUAL.md index ea45d1322..4648bc4c9 100644 --- a/examples/MANUAL.md +++ b/examples/MANUAL.md @@ -75,7 +75,8 @@ is provided so the application can be easily adapted to any environment. interval default: 30s How often to poll the controller for updated client and device data. - The UniFi Controller only updates traffic stats about every 30 seconds. + The UniFi Controller only updates traffic stats about every 30-60 seconds. + Only works if "mode" (below) is "influx" - other modes do not use interval. debug default: false This turns on time stamps and line numbers in logs, outputs a few extra @@ -104,7 +105,7 @@ is provided so the application can be easily adapted to any environment. * Value: prometheus In this mode the application opens an http interface and exports the measurements at /metrics for collection by prometheus. Enabling this - mode disables InfluxDB usage entirely. This is BETA. + mode disables InfluxDB usage entirely. http_listen default: 0.0.0.0:9130 This option controls the IP and port the http listener uses when the diff --git a/examples/up.conf.example b/examples/up.conf.example index 39f987759..0f1b30416 100644 --- a/examples/up.conf.example +++ b/examples/up.conf.example @@ -8,7 +8,8 @@ sites = ["all"] # The UniFi Controller only updates traffic stats about every 30 seconds. -# Setting this to something lower may lead to "zeros" in your data. You've been warned. +# Setting this to something lower may lead to "zeros" in your data. +# If you're getting zeros now, set this to "1m" interval = "30s" # Turns on line numbers, microsecond logging, and a per-device log. @@ -26,13 +27,13 @@ quiet = false # # There are two other options at this time: "influxlambda" and "prometheus" # -# Lambda mode makes the application exit after collecting and reporting metrics +# Mode "influxlambda" makes the application exit after collecting and reporting metrics # to InfluxDB one time. This mode requires an external process like an AWS Lambda # or a simple crontab to keep the timings accurate on UniFi Poller run intervals. # -# Prometheus mode opens an HTTP server on port 9130 and exports the metrics at +# Mode "prometheus" opens an HTTP server on port 9130 and exports the metrics at # /metrics for polling collection by a prometheus server. This disables influxdb. -# IMPORTANT: The prometheus mode is still beta and isn't tested very well. +# IMPORTANT: The prometheus mode is still beta. # Please help us test and provide your feedback on the github repo! mode = "influx" diff --git a/examples/up.xml.example b/examples/up.xml.example index 856e292f3..3022948bf 100644 --- a/examples/up.xml.example +++ b/examples/up.xml.example @@ -18,7 +18,8 @@ 30s @@ -42,13 +43,14 @@ # # There are two other options at this time: "influxlambda" and "prometheus" # - # Lambda mode makes the application exit after collecting and reporting metrics + # Mode "influxlambda" makes the application exit after collecting and reporting metrics # to InfluxDB one time. This mode requires an external process like an AWS Lambda # or a simple crontab to keep the timings accurate on UniFi Poller run intervals. # - # Prometheus mode opens an HTTP server on port 9130 and exports the metrics at + # Mode "prometheus" opens an HTTP server on port 9130 and exports the metrics at # /metrics for polling collection by a prometheus server. This disables influxdb. - # IMPORTANT: The prometheus mode is still beta and isn't tested very well. + # IMPORTANT: The prometheus mode is still beta. + # Please help us test and provide your feedback on the github repo! --> influx diff --git a/examples/up.yaml.example b/examples/up.yaml.example index adf3f019a..4dfe2e673 100644 --- a/examples/up.yaml.example +++ b/examples/up.yaml.example @@ -9,7 +9,9 @@ sites: - all # The UniFi Controller only updates traffic stats about every 30 seconds. -# Setting this to something lower may lead to "zeros" in your data. You've been warned. +# Setting this to something lower may lead to "zeros" in your data. +# If you're getting zeros now, set this to "1m" +# Only has effect if "mode" (below) is "influx" - other modes do not use interval. interval: "30s" # Turns on line numbers, microsecond logging, and a per-device log. @@ -27,13 +29,14 @@ quiet: false # # There are two other options at this time: "influxlambda" and "prometheus" # -# Lambda mode makes the application exit after collecting and reporting metrics +# Mode "influxlambda" makes the application exit after collecting and reporting metrics # to InfluxDB one time. This mode requires an external process like an AWS Lambda # or a simple crontab to keep the timings accurate on UniFi Poller run intervals. # -# Prometheus mode opens an HTTP server on port 9130 and exports the metrics at +# Mode "prometheus" opens an HTTP server on port 9130 and exports the metrics at # /metrics for polling collection by a prometheus server. This disables influxdb. -# IMPORTANT: The prometheus mode is still beta and isn't tested very well. +# IMPORTANT: The prometheus mode is still beta. +# Please help us test and provide your feedback on the github repo! mode: "influx" # This controls on which ip and port /metrics is exported when mode is "prometheus". From 23f4c9bdc49b9db907a3349ff00d8292d1d602ca Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 14:43:23 -0800 Subject: [PATCH 77/85] use fewer tags --- promunifi/clients.go | 2 +- promunifi/uap.go | 20 ++++++------ promunifi/udm.go | 6 ++-- promunifi/usg.go | 33 ++++++++++---------- promunifi/usw.go | 74 +++++++++++++++++++++++--------------------- 5 files changed, 69 insertions(+), 66 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 32e8629d3..10b9a4c46 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -102,7 +102,7 @@ func (u *unifiCollector) exportClient(r report, c *unifi.Client) { labels[len(labels)-1] = "false" r.send([]*metricExports{ {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labels}, - {u.Client.CCQ, prometheus.GaugeValue, c.Ccq, labels}, + {u.Client.CCQ, prometheus.GaugeValue, c.Ccq / 10, labels}, {u.Client.Noise, prometheus.GaugeValue, c.Noise, labels}, {u.Client.RoamCount, prometheus.CounterValue, c.RoamCount, labels}, {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labels}, diff --git a/promunifi/uap.go b/promunifi/uap.go index 49f300ada..98d084af1 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -83,10 +83,10 @@ type uap struct { } func descUAP(ns string) *uap { - labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"} - labelA := append([]string{"stat"}, labels[2:]...) - labelV := append([]string{"vap_name", "bssid", "radio", "radio_name", "essid", "usage"}, labels[2:]...) - labelR := append([]string{"radio_name", "radio"}, labels[2:]...) + labels := []string{"ip", "version", "model", "serial", "type", "mac", "site_name", "name"} + labelA := append([]string{"stat"}, labels[6:]...) + labelV := append([]string{"vap_name", "bssid", "radio", "radio_name", "essid", "usage"}, labels[6:]...) + labelR := append([]string{"radio_name", "radio"}, labels[6:]...) return &uap{ // 3x each - stat table: total, guest, user ApWifiTxDropped: prometheus.NewDesc(ns+"stat_wifi_transmt_dropped_total", "Wifi Transmissions Dropped", labelA, nil), @@ -179,7 +179,7 @@ func (u *unifiCollector) exportUAPs(r report) { } func (u *unifiCollector) exportUAP(r report, d *unifi.UAP) { - labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} + labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} // AP data. r.send([]*metricExports{ {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, @@ -209,8 +209,8 @@ func (u *unifiCollector) exportUAP(r report, d *unifi.UAP) { func (u *unifiCollector) exportUAPstats(r report, labels []string, ap *unifi.Ap) { // labelA := append([]string{"all"}, labels[2:]...) - labelU := append([]string{"user"}, labels[2:]...) - labelG := append([]string{"guest"}, labels[2:]...) + labelU := append([]string{"user"}, labels[6:]...) + labelG := append([]string{"guest"}, labels[6:]...) r.send([]*metricExports{ /* // all {u.UAP.ApWifiTxDropped, prometheus.CounterValue, ap.WifiTxDropped, labelA}, @@ -267,10 +267,10 @@ func (u *unifiCollector) exportVAPtable(r report, labels []string, vt unifi.VapT if !v.Up.Val { continue } - labelV := append([]string{v.Name, v.Bssid, v.Radio, v.RadioName, v.Essid, v.Usage}, labels[2:]...) + labelV := append([]string{v.Name, v.Bssid, v.Radio, v.RadioName, v.Essid, v.Usage}, labels[6:]...) r.send([]*metricExports{ - {u.UAP.VAPCcq, prometheus.GaugeValue, v.Ccq, labelV}, + {u.UAP.VAPCcq, prometheus.GaugeValue, v.Ccq / 10, labelV}, {u.UAP.VAPMacFilterRejections, prometheus.CounterValue, v.MacFilterRejections, labelV}, {u.UAP.VAPNumSatisfactionSta, prometheus.GaugeValue, v.NumSatisfactionSta, labelV}, {u.UAP.VAPAvgClientSignal, prometheus.GaugeValue, v.AvgClientSignal, labelV}, @@ -314,7 +314,7 @@ func (u *unifiCollector) exportVAPtable(r report, labels []string, vt unifi.VapT func (u *unifiCollector) exportRadtable(r report, labels []string, rt unifi.RadioTable, rts unifi.RadioTableStats) { // radio table for _, p := range rt { - labelR := append([]string{p.Name, p.Radio}, labels[2:]...) + labelR := append([]string{p.Name, p.Radio}, labels[6:]...) r.send([]*metricExports{ {u.UAP.RadioCurrentAntennaGain, prometheus.GaugeValue, p.CurrentAntennaGain, labelR}, {u.UAP.RadioHt, prometheus.GaugeValue, p.Ht, labelR}, diff --git a/promunifi/udm.go b/promunifi/udm.go index 34b1adb3d..ccb8cb837 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -36,7 +36,7 @@ type unifiDevice struct { } func descDevice(ns string) *unifiDevice { - labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"} + labels := []string{"ip", "version", "model", "serial", "type", "mac", "site_name", "name"} return &unifiDevice{ Uptime: prometheus.NewDesc(ns+"uptime", "Uptime", labels, nil), Temperature: prometheus.NewDesc(ns+"temperature_celsius", "Temperature", labels, nil), @@ -82,7 +82,7 @@ func (u *unifiCollector) exportUDMs(r report) { // UDM is a collection of stats from USG, USW and UAP. It has no unique stats. func (u *unifiCollector) exportUDM(r report, d *unifi.UDM) { - labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} + labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} // Gateway System Data. r.send([]*metricExports{ {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, @@ -105,7 +105,7 @@ func (u *unifiCollector) exportUDM(r report, d *unifi.UDM) { {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) u.exportUSWstats(r, labels, d.Stat.Sw) - u.exportUSGstats(r, labels, d.Stat.Gw, d.SpeedtestStatus) + u.exportUSGstats(r, labels, d.SpeedtestStatus) u.exportWANPorts(r, labels, d.Wan1, d.Wan2) u.exportPortTable(r, labels, d.PortTable) if d.Stat.Ap != nil && d.VapTable != nil { diff --git a/promunifi/usg.go b/promunifi/usg.go index 99e7f4103..e12bc1295 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -34,8 +34,8 @@ type usg struct { } func descUSG(ns string) *usg { - labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"} - labelWan := append([]string{"port"}, labels...) + labels := []string{"ip", "version", "model", "serial", "type", "mac", "site_name", "name"} + labelWan := append([]string{"port"}, labels[6:]...) return &usg{ WanRxPackets: prometheus.NewDesc(ns+"wan_receive_packets_total", "WAN Receive Packets Total", labelWan, nil), WanRxBytes: prometheus.NewDesc(ns+"wan_receive_bytes_total", "WAN Receive Bytes Total", labelWan, nil), @@ -58,10 +58,10 @@ func descUSG(ns string) *usg { LanRxDropped: prometheus.NewDesc(ns+"lan_receive_dropped_total", "LAN Receive Dropped Total", labels, nil), LanTxPackets: prometheus.NewDesc(ns+"lan_transmit_packets_total", "LAN Transmit Packets Total", labels, nil), LanTxBytes: prometheus.NewDesc(ns+"lan_transmit_bytes_total", "LAN Transmit Bytes Total", labels, nil), - Latency: prometheus.NewDesc(ns+"speedtest_latency_seconds", "Speedtest Latency", labels, nil), - Runtime: prometheus.NewDesc(ns+"speedtest_runtime", "Speedtest Run Time", labels, nil), - XputDownload: prometheus.NewDesc(ns+"speedtest_download", "Speedtest Download Rate", labels, nil), - XputUpload: prometheus.NewDesc(ns+"speedtest_upload", "Speedtest Upload Rate", labels, nil), + Latency: prometheus.NewDesc(ns+"speedtest_latency_seconds", "Speedtest Latency", labelWan, nil), + Runtime: prometheus.NewDesc(ns+"speedtest_runtime", "Speedtest Run Time", labelWan, nil), + XputDownload: prometheus.NewDesc(ns+"speedtest_download", "Speedtest Download Rate", labelWan, nil), + XputUpload: prometheus.NewDesc(ns+"speedtest_upload", "Speedtest Upload Rate", labelWan, nil), } } @@ -79,7 +79,7 @@ func (u *unifiCollector) exportUSGs(r report) { } func (u *unifiCollector) exportUSG(r report, d *unifi.USG) { - labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} + labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} // Gateway System Data. r.send([]*metricExports{ {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, @@ -102,13 +102,13 @@ func (u *unifiCollector) exportUSG(r report, d *unifi.USG) { {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) u.exportWANPorts(r, labels, d.Wan1, d.Wan2) - u.exportUSGstats(r, labels, d.Stat.Gw, d.SpeedtestStatus) + u.exportUSGstats(r, labels, d.SpeedtestStatus) } -func (u *unifiCollector) exportUSGstats(r report, labels []string, gw *unifi.Gw, st unifi.SpeedtestStatus) { - labelWan := append([]string{"all"}, labels...) +func (u *unifiCollector) exportUSGstats(r report, labels []string, st unifi.SpeedtestStatus) { + labelWan := append([]string{"all"}, labels[6:]...) r.send([]*metricExports{ - // Combined Port Stats + /* // Combined Port Stats {u.USG.WanRxPackets, prometheus.CounterValue, gw.WanRxPackets, labelWan}, {u.USG.WanRxBytes, prometheus.CounterValue, gw.WanRxBytes, labelWan}, {u.USG.WanRxDropped, prometheus.CounterValue, gw.WanRxDropped, labelWan}, @@ -120,11 +120,12 @@ func (u *unifiCollector) exportUSGstats(r report, labels []string, gw *unifi.Gw, {u.USG.LanTxPackets, prometheus.CounterValue, gw.LanTxPackets, labels}, {u.USG.LanTxBytes, prometheus.CounterValue, gw.LanTxBytes, labels}, {u.USG.LanRxDropped, prometheus.CounterValue, gw.LanRxDropped, labels}, + */ // Speed Test Stats - {u.USG.Latency, prometheus.GaugeValue, st.Latency.Val / 1000, labels}, - {u.USG.Runtime, prometheus.GaugeValue, st.Runtime, labels}, - {u.USG.XputDownload, prometheus.GaugeValue, st.XputDownload, labels}, - {u.USG.XputUpload, prometheus.GaugeValue, st.XputUpload, labels}, + {u.USG.Latency, prometheus.GaugeValue, st.Latency.Val / 1000, labelWan}, + {u.USG.Runtime, prometheus.GaugeValue, st.Runtime, labelWan}, + {u.USG.XputDownload, prometheus.GaugeValue, st.XputDownload, labelWan}, + {u.USG.XputUpload, prometheus.GaugeValue, st.XputUpload, labelWan}, }) } @@ -133,7 +134,7 @@ func (u *unifiCollector) exportWANPorts(r report, labels []string, wans ...unifi if !wan.Up.Val { continue // only record UP interfaces. } - l := append([]string{wan.Name}, labels...) + l := append([]string{wan.Name}, labels[6:]...) r.send([]*metricExports{ {u.USG.WanRxPackets, prometheus.CounterValue, wan.RxPackets, l}, {u.USG.WanRxBytes, prometheus.CounterValue, wan.RxBytes, l}, diff --git a/promunifi/usw.go b/promunifi/usw.go index a79f4092e..66d81ebc8 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -48,26 +48,27 @@ type usw struct { func descUSW(ns string) *usw { pns := ns + "port_" // The first five labels for switch are shared with (the same as) switch ports. - labels := []string{"ip", "type", "version", "site_name", "mac", "model", "name", "serial"} + // labels := []string{"ip", "version", "model", "serial", "type", "mac", "site_name", "name"} + labelS := []string{"site_name", "name"} // labels[6:] // Copy labels, and replace first four with different names. - labelP := append([]string{"port_num", "port_name", "port_mac", "port_ip"}, labels[4:]...) + labelP := append([]string{"port_num", "port_name", "port_mac", "port_ip"}, labelS...) return &usw{ - SwRxPackets: prometheus.NewDesc(ns+"switch_receive_packets_total", "Switch Packets Received Total", labels, nil), - SwRxBytes: prometheus.NewDesc(ns+"switch_receive_bytes_total", "Switch Bytes Received Total", labels, nil), - SwRxErrors: prometheus.NewDesc(ns+"switch_receive_errors_total", "Switch Errors Received Total", labels, nil), - SwRxDropped: prometheus.NewDesc(ns+"switch_receive_dropped_total", "Switch Dropped Received Total", labels, nil), - SwRxCrypts: prometheus.NewDesc(ns+"switch_receive_crypts_total", "Switch Crypts Received Total", labels, nil), - SwRxFrags: prometheus.NewDesc(ns+"switch_receive_frags_total", "Switch Frags Received Total", labels, nil), - SwTxPackets: prometheus.NewDesc(ns+"switch_transmit_packets_total", "Switch Packets Transmit Total", labels, nil), - SwTxBytes: prometheus.NewDesc(ns+"switch_transmit_bytes_total", "Switch Bytes Transmit Total", labels, nil), - SwTxErrors: prometheus.NewDesc(ns+"switch_transmit_errors_total", "Switch Errors Transmit Total", labels, nil), - SwTxDropped: prometheus.NewDesc(ns+"switch_transmit_dropped_total", "Switch Dropped Transmit Total", labels, nil), - SwTxRetries: prometheus.NewDesc(ns+"switch_transmit_retries_total", "Switch Retries Transmit Total", labels, nil), - SwRxMulticast: prometheus.NewDesc(ns+"switch_receive_multicast_total", "Switch Multicast Receive Total", labels, nil), - SwRxBroadcast: prometheus.NewDesc(ns+"switch_receive_broadcast_total", "Switch Broadcast Receive Total", labels, nil), - SwTxMulticast: prometheus.NewDesc(ns+"switch_transmit_multicast_total", "Switch Multicast Transmit Total", labels, nil), - SwTxBroadcast: prometheus.NewDesc(ns+"switch_transmit_broadcast_total", "Switch Broadcast Transmit Total", labels, nil), - SwBytes: prometheus.NewDesc(ns+"switch_bytes_total", "Switch Bytes Transferred Total", labels, nil), + SwRxPackets: prometheus.NewDesc(ns+"switch_receive_packets_total", "Switch Packets Received Total", labelS, nil), + SwRxBytes: prometheus.NewDesc(ns+"switch_receive_bytes_total", "Switch Bytes Received Total", labelS, nil), + SwRxErrors: prometheus.NewDesc(ns+"switch_receive_errors_total", "Switch Errors Received Total", labelS, nil), + SwRxDropped: prometheus.NewDesc(ns+"switch_receive_dropped_total", "Switch Dropped Received Total", labelS, nil), + SwRxCrypts: prometheus.NewDesc(ns+"switch_receive_crypts_total", "Switch Crypts Received Total", labelS, nil), + SwRxFrags: prometheus.NewDesc(ns+"switch_receive_frags_total", "Switch Frags Received Total", labelS, nil), + SwTxPackets: prometheus.NewDesc(ns+"switch_transmit_packets_total", "Switch Packets Transmit Total", labelS, nil), + SwTxBytes: prometheus.NewDesc(ns+"switch_transmit_bytes_total", "Switch Bytes Transmit Total", labelS, nil), + SwTxErrors: prometheus.NewDesc(ns+"switch_transmit_errors_total", "Switch Errors Transmit Total", labelS, nil), + SwTxDropped: prometheus.NewDesc(ns+"switch_transmit_dropped_total", "Switch Dropped Transmit Total", labelS, nil), + SwTxRetries: prometheus.NewDesc(ns+"switch_transmit_retries_total", "Switch Retries Transmit Total", labelS, nil), + SwRxMulticast: prometheus.NewDesc(ns+"switch_receive_multicast_total", "Switch Multicast Receive Total", labelS, nil), + SwRxBroadcast: prometheus.NewDesc(ns+"switch_receive_broadcast_total", "Switch Broadcast Receive Total", labelS, nil), + SwTxMulticast: prometheus.NewDesc(ns+"switch_transmit_multicast_total", "Switch Multicast Transmit Total", labelS, nil), + SwTxBroadcast: prometheus.NewDesc(ns+"switch_transmit_broadcast_total", "Switch Broadcast Transmit Total", labelS, nil), + SwBytes: prometheus.NewDesc(ns+"switch_bytes_total", "Switch Bytes Transferred Total", labelS, nil), // per-port data PoeCurrent: prometheus.NewDesc(pns+"poe_amperes", "POE Current", labelP, nil), PoePower: prometheus.NewDesc(pns+"poe_watts", "POE Power", labelP, nil), @@ -105,7 +106,7 @@ func (u *unifiCollector) exportUSWs(r report) { } func (u *unifiCollector) exportUSW(r report, d *unifi.USW) { - labels := []string{d.IP, d.Type, d.Version, d.SiteName, d.Mac, d.Model, d.Name, d.Serial} + labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} if d.HasTemperature.Val { r.send([]*metricExports{{u.Device.Temperature, prometheus.GaugeValue, d.GeneralTemperature, labels}}) } @@ -137,23 +138,24 @@ func (u *unifiCollector) exportUSW(r report, d *unifi.USW) { } func (u *unifiCollector) exportUSWstats(r report, labels []string, sw *unifi.Sw) { + labelS := labels[6:] r.send([]*metricExports{ - {u.USW.SwRxPackets, prometheus.CounterValue, sw.RxPackets, labels}, - {u.USW.SwRxBytes, prometheus.CounterValue, sw.RxBytes, labels}, - {u.USW.SwRxErrors, prometheus.CounterValue, sw.RxErrors, labels}, - {u.USW.SwRxDropped, prometheus.CounterValue, sw.RxDropped, labels}, - {u.USW.SwRxCrypts, prometheus.CounterValue, sw.RxCrypts, labels}, - {u.USW.SwRxFrags, prometheus.CounterValue, sw.RxFrags, labels}, - {u.USW.SwTxPackets, prometheus.CounterValue, sw.TxPackets, labels}, - {u.USW.SwTxBytes, prometheus.CounterValue, sw.TxBytes, labels}, - {u.USW.SwTxErrors, prometheus.CounterValue, sw.TxErrors, labels}, - {u.USW.SwTxDropped, prometheus.CounterValue, sw.TxDropped, labels}, - {u.USW.SwTxRetries, prometheus.CounterValue, sw.TxRetries, labels}, - {u.USW.SwRxMulticast, prometheus.CounterValue, sw.RxMulticast, labels}, - {u.USW.SwRxBroadcast, prometheus.CounterValue, sw.RxBroadcast, labels}, - {u.USW.SwTxMulticast, prometheus.CounterValue, sw.TxMulticast, labels}, - {u.USW.SwTxBroadcast, prometheus.CounterValue, sw.TxBroadcast, labels}, - {u.USW.SwBytes, prometheus.CounterValue, sw.Bytes, labels}, + {u.USW.SwRxPackets, prometheus.CounterValue, sw.RxPackets, labelS}, + {u.USW.SwRxBytes, prometheus.CounterValue, sw.RxBytes, labelS}, + {u.USW.SwRxErrors, prometheus.CounterValue, sw.RxErrors, labelS}, + {u.USW.SwRxDropped, prometheus.CounterValue, sw.RxDropped, labelS}, + {u.USW.SwRxCrypts, prometheus.CounterValue, sw.RxCrypts, labelS}, + {u.USW.SwRxFrags, prometheus.CounterValue, sw.RxFrags, labelS}, + {u.USW.SwTxPackets, prometheus.CounterValue, sw.TxPackets, labelS}, + {u.USW.SwTxBytes, prometheus.CounterValue, sw.TxBytes, labelS}, + {u.USW.SwTxErrors, prometheus.CounterValue, sw.TxErrors, labelS}, + {u.USW.SwTxDropped, prometheus.CounterValue, sw.TxDropped, labelS}, + {u.USW.SwTxRetries, prometheus.CounterValue, sw.TxRetries, labelS}, + {u.USW.SwRxMulticast, prometheus.CounterValue, sw.RxMulticast, labelS}, + {u.USW.SwRxBroadcast, prometheus.CounterValue, sw.RxBroadcast, labelS}, + {u.USW.SwTxMulticast, prometheus.CounterValue, sw.TxMulticast, labelS}, + {u.USW.SwTxBroadcast, prometheus.CounterValue, sw.TxBroadcast, labelS}, + {u.USW.SwBytes, prometheus.CounterValue, sw.Bytes, labelS}, }) } @@ -164,7 +166,7 @@ func (u *unifiCollector) exportPortTable(r report, labels []string, pt []unifi.P continue } // Copy labels, and add four new ones. - l := append([]string{p.PortIdx.Txt, p.Name, p.Mac, p.IP}, labels[4:]...) + l := append([]string{p.PortIdx.Txt, p.Name, p.Mac, p.IP}, labels[6:]...) if p.PoeEnable.Val && p.PortPoe.Val { r.send([]*metricExports{ {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}, From a9a7862438c5ed828d55980e6dcbdde34198e195 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 20:30:51 -0800 Subject: [PATCH 78/85] Add more to the interface --- promunifi/clients.go | 69 +++++++++++--------------- promunifi/collector.go | 85 +++++++++----------------------- promunifi/loops.go | 83 ++++++++++++++++++++++++++++++++ promunifi/report.go | 71 +++++++++++++++++++++++++++ promunifi/site.go | 98 ++++++++++++++++--------------------- promunifi/uap.go | 21 ++------ promunifi/udm.go | 15 +----- promunifi/usg.go | 107 ++++++++++++++++++----------------------- promunifi/usw.go | 51 ++++++++------------ 9 files changed, 319 insertions(+), 281 deletions(-) create mode 100644 promunifi/loops.go create mode 100644 promunifi/report.go diff --git a/promunifi/clients.go b/promunifi/clients.go index 10b9a4c46..d1014a60f 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -39,27 +39,27 @@ type uclient struct { } func descClient(ns string) *uclient { - labels := []string{"name", "mac", "site_name", "gw_mac", "gw_name", "sw_mac", "sw_name", "vlan", "ip", "oui", "network", "sw_port", - "ap_mac", "ap_name", "radio_name", "radio", "radio_proto", "channel", "essid", "bssid", "radio_desc", "wired"} + labels := []string{"name", "mac", "site_name", "gw_name", "sw_name", "vlan", "ip", "oui", "network", "sw_port", "ap_name", "wired"} + labelW := append([]string{"radio_name", "radio", "radio_proto", "channel", "essid", "bssid", "radio_desc"}, labels...) return &uclient{ - Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labels, nil), - BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labels, nil), - CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labels, nil), - Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labels, nil), - RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labels, nil), - RSSI: prometheus.NewDesc(ns+"rssi_db", "Client RSSI", labels, nil), + Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labelW, nil), + BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labelW, nil), + CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labelW, nil), + Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labelW, nil), + RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labelW, nil), + RSSI: prometheus.NewDesc(ns+"rssi_db", "Client RSSI", labelW, nil), RxBytes: prometheus.NewDesc(ns+"receive_bytes_total", "Client Receive Bytes", labels, nil), RxBytesR: prometheus.NewDesc(ns+"receive_rate_bytes", "Client Receive Data Rate", labels, nil), RxPackets: prometheus.NewDesc(ns+"receive_packets_total", "Client Receive Packets", labels, nil), - RxRate: prometheus.NewDesc(ns+"radio_receive_rate_bps", "Client Receive Rate", labels, nil), - Signal: prometheus.NewDesc(ns+"radio_signal_db", "Client Signal Strength", labels, nil), + RxRate: prometheus.NewDesc(ns+"radio_receive_rate_bps", "Client Receive Rate", labelW, nil), + Signal: prometheus.NewDesc(ns+"radio_signal_db", "Client Signal Strength", labelW, nil), TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labels, nil), TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labels, nil), TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labels, nil), - TxPower: prometheus.NewDesc(ns+"radio_transmit_power_dbm", "Client Transmit Power", labels, nil), - TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_bps", "Client Transmit Rate", labels, nil), - WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labels, nil), - Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Client Uptime", labels, nil), + TxPower: prometheus.NewDesc(ns+"radio_transmit_power_dbm", "Client Transmit Power", labelW, nil), + TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_bps", "Client Transmit Rate", labelW, nil), + WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelW, nil), + Uptime: prometheus.NewDesc(ns+"uptime_seconds", "Client Uptime", labelW, nil), /* needs more "looking into" DpiStatsApp: prometheus.NewDesc(ns+"dpi_stats_app", "Client DPI Stats App", labels, nil), DpiStatsCat: prometheus.NewDesc(ns+"dpi_stats_cat", "Client DPI Stats Cat", labels, nil), @@ -71,22 +71,9 @@ func descClient(ns string) *uclient { } } -func (u *unifiCollector) exportClients(r report) { - if r.metrics() == nil || len(r.metrics().Clients) < 1 { - return - } - r.add() - go func() { - defer r.done() - for _, c := range r.metrics().Clients { - u.exportClient(r, c) - } - }() -} - func (u *unifiCollector) exportClient(r report, c *unifi.Client) { - labels := []string{c.Name, c.Mac, c.SiteName, c.GwMac, c.GwName, c.SwMac, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network, c.SwPort.Txt, - c.ApMac, c.ApName, c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription, "false"} + labels := []string{c.Name, c.Mac, c.SiteName, c.GwName, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network, c.SwPort.Txt, c.ApName, "false"} + labelW := append([]string{c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription}, labels...) if c.IsWired.Val { labels[len(labels)-1] = "true" @@ -101,27 +88,27 @@ func (u *unifiCollector) exportClient(r report, c *unifi.Client) { } else { labels[len(labels)-1] = "false" r.send([]*metricExports{ - {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labels}, - {u.Client.CCQ, prometheus.GaugeValue, c.Ccq / 10, labels}, - {u.Client.Noise, prometheus.GaugeValue, c.Noise, labels}, - {u.Client.RoamCount, prometheus.CounterValue, c.RoamCount, labels}, - {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labels}, - {u.Client.Signal, prometheus.GaugeValue, c.Signal, labels}, - {u.Client.TxPower, prometheus.GaugeValue, c.TxPower, labels}, - {u.Client.TxRate, prometheus.GaugeValue, c.TxRate * 1000, labels}, - {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labels}, - {u.Client.RxRate, prometheus.GaugeValue, c.RxRate * 1000, labels}, + {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labelW}, + {u.Client.CCQ, prometheus.GaugeValue, c.Ccq / 10, labelW}, + {u.Client.Noise, prometheus.GaugeValue, c.Noise, labelW}, + {u.Client.RoamCount, prometheus.CounterValue, c.RoamCount, labelW}, + {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labelW}, + {u.Client.Signal, prometheus.GaugeValue, c.Signal, labelW}, + {u.Client.TxPower, prometheus.GaugeValue, c.TxPower, labelW}, + {u.Client.TxRate, prometheus.GaugeValue, c.TxRate * 1000, labelW}, + {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labelW}, + {u.Client.RxRate, prometheus.GaugeValue, c.RxRate * 1000, labelW}, {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labels}, {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labels}, {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labels}, {u.Client.RxBytes, prometheus.CounterValue, c.RxBytes, labels}, {u.Client.RxBytesR, prometheus.GaugeValue, c.RxBytesR, labels}, {u.Client.RxPackets, prometheus.CounterValue, c.RxPackets, labels}, - {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labels}, + {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labelW}, }) } r.send([]*metricExports{ - {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labels}, + {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labelW}, /* needs more "looking into" {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, {u.Client.DpiStatsCat, prometheus.GaugeValue, c.DpiStats.Cat, labels}, diff --git a/promunifi/collector.go b/promunifi/collector.go index 6ed313f2b..285ac72a9 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -61,14 +61,7 @@ type Report struct { Start time.Time ch chan []*metricExports wg sync.WaitGroup -} - -// internal interface used to "process metrics" - can be mocked and overridden for tests. -type report interface { - send([]*metricExports) - add() - done() - metrics() *metrics.Metrics + cf UnifiCollectorCnfg } // NewUnifiCollector returns a prometheus collector that will export any available @@ -117,13 +110,17 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { // Collect satisfies the prometheus Collector. This runs the input method to get // the current metrics (from another package) then exports them for prometheus. func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { - var err error - r := &Report{Start: time.Now(), ch: make(chan []*metricExports, buffer)} + r := &Report{ + cf: u.Config, + Start: time.Now(), + ch: make(chan []*metricExports, buffer), + } defer func() { r.wg.Wait() close(r.ch) }() + var err error if r.Metrics, err = u.Config.CollectFn(); err != nil { ch <- prometheus.NewInvalidMetric( prometheus.NewInvalidDesc(fmt.Errorf("metric fetch failed")), err) @@ -131,72 +128,36 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { } go u.exportMetrics(r, ch) - u.exportClients(r) - u.exportSites(r) - u.exportUAPs(r) - u.exportUSWs(r) - u.exportUSGs(r) - u.exportUDMs(r) + // in loops.go. + u.loopClients(r) + u.loopSites(r) + u.loopUAPs(r) + u.loopUSWs(r) + u.loopUSGs(r) + u.loopUDMs(r) } // This is closely tied to the method above with a sync.WaitGroup. // This method runs in a go routine and exits when the channel closes. -func (u *unifiCollector) exportMetrics(r *Report, ch chan<- prometheus.Metric) { +func (u *unifiCollector) exportMetrics(r report, ch chan<- prometheus.Metric) { descs := make(map[*prometheus.Desc]bool) // used as a counter - for newMetrics := range r.ch { + defer r.report(descs) + for newMetrics := range r.channel() { for _, m := range newMetrics { - r.Total++ descs[m.Desc] = true - var value float64 switch v := m.Value.(type) { case unifi.FlexInt: - value = v.Val + ch <- r.export(m, v.Val) case float64: - value = v + ch <- r.export(m, v) case int64: - value = float64(v) + ch <- r.export(m, float64(v)) case int: - value = float64(v) - + ch <- r.export(m, float64(v)) default: - r.Errors++ - if u.Config.ReportErrors { - ch <- prometheus.NewInvalidMetric(m.Desc, fmt.Errorf("not a number: %v", m.Value)) - } - continue - } - - if value == 0 { - r.Zeros++ + r.error(ch, m.Desc, m.Value) } - ch <- prometheus.MustNewConstMetric(m.Desc, m.ValueType, value, m.Labels...) } - r.wg.Done() - } - - if u.Config.LoggingFn == nil { - return + r.done() } - r.Descs, r.Elapsed = len(descs), time.Since(r.Start) - u.Config.LoggingFn(r) -} - -func (r *Report) metrics() *metrics.Metrics { - return r.Metrics -} - -// satisfy gomnd -const one = 1 - -func (r *Report) add() { - r.wg.Add(one) -} - -func (r *Report) done() { - r.wg.Done() -} - -func (r *Report) send(m []*metricExports) { - r.wg.Add(one) - r.ch <- m } diff --git a/promunifi/loops.go b/promunifi/loops.go new file mode 100644 index 000000000..e1a4dcdb4 --- /dev/null +++ b/promunifi/loops.go @@ -0,0 +1,83 @@ +package promunifi + +// This file contains all the loop methods for each device type, clients and sites. +// Moved them here to consolate clutter from the other files. Also, if these change, +// they usually all change at once since they're pretty much the same code. + +func (u *unifiCollector) loopSites(r report) { + if r.metrics() == nil || len(r.metrics().Sites) < 1 { + return + } + r.add() + go func() { + defer r.done() + for _, s := range r.metrics().Sites { + u.exportSite(r, s) + } + }() +} + +func (u *unifiCollector) loopUAPs(r report) { + if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.UAPs) < 1 { + return + } + r.add() + go func() { + defer r.done() + for _, d := range r.metrics().Devices.UAPs { + u.exportUAP(r, d) + } + }() +} + +func (u *unifiCollector) loopUDMs(r report) { + if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.UDMs) < 1 { + return + } + r.add() + go func() { + defer r.done() + for _, d := range r.metrics().Devices.UDMs { + u.exportUDM(r, d) + } + }() +} + +func (u *unifiCollector) loopUSGs(r report) { + if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.USGs) < 1 { + return + } + r.add() + go func() { + defer r.done() + for _, d := range r.metrics().Devices.USGs { + u.exportUSG(r, d) + } + }() +} + +func (u *unifiCollector) loopUSWs(r report) { + if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.USWs) < 1 { + return + } + r.add() + go func() { + defer r.done() + for _, d := range r.metrics().Devices.USWs { + u.exportUSW(r, d) + } + }() +} + +func (u *unifiCollector) loopClients(r report) { + if r.metrics() == nil || len(r.metrics().Clients) < 1 { + return + } + r.add() + go func() { + defer r.done() + for _, c := range r.metrics().Clients { + u.exportClient(r, c) + } + }() +} diff --git a/promunifi/report.go b/promunifi/report.go new file mode 100644 index 000000000..cc3f70b52 --- /dev/null +++ b/promunifi/report.go @@ -0,0 +1,71 @@ +package promunifi + +import ( + "fmt" + "time" + + "github.com/davidnewhall/unifi-poller/metrics" + "github.com/prometheus/client_golang/prometheus" +) + +// This file contains the report interface. +// This interface can be mocked and overrridden for tests. + +// report is an internal interface used to "process metrics" +type report interface { + send([]*metricExports) + add() + done() + metrics() *metrics.Metrics + report(descs map[*prometheus.Desc]bool) + export(m *metricExports, v float64) prometheus.Metric + channel() chan []*metricExports + error(ch chan<- prometheus.Metric, d *prometheus.Desc, v interface{}) +} + +// satisfy gomnd +const one = 1 + +func (r *Report) report(descs map[*prometheus.Desc]bool) { + if r.cf.LoggingFn == nil { + return + } + r.Descs, r.Elapsed = len(descs), time.Since(r.Start) + r.cf.LoggingFn(r) +} + +func (r *Report) export(m *metricExports, v float64) prometheus.Metric { + r.Total++ + if v == 0 { + r.Zeros++ + } + return prometheus.MustNewConstMetric(m.Desc, m.ValueType, v, m.Labels...) +} + +func (r *Report) metrics() *metrics.Metrics { + return r.Metrics +} + +func (r *Report) channel() chan []*metricExports { + return r.ch +} + +func (r *Report) error(ch chan<- prometheus.Metric, d *prometheus.Desc, v interface{}) { + r.Errors++ + if r.cf.ReportErrors { + ch <- prometheus.NewInvalidMetric(d, fmt.Errorf("not a number: %v", v)) + } +} + +func (r *Report) add() { + r.wg.Add(one) +} + +func (r *Report) done() { + r.wg.Add(-one) +} + +func (r *Report) send(m []*metricExports) { + r.wg.Add(one) + r.ch <- m +} diff --git a/promunifi/site.go b/promunifi/site.go index 5f9f81cc2..40cf5237a 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -34,7 +34,7 @@ type site struct { } func descSite(ns string) *site { - labels := []string{"subsystem", "status", "name", "desc", "site_name"} + labels := []string{"subsystem", "status", "site_name"} return &site{ NumUser: prometheus.NewDesc(ns+"users", "Number of Users", labels, nil), NumGuest: prometheus.NewDesc(ns+"guests", "Number of Guests", labels, nil), @@ -64,82 +64,68 @@ func descSite(ns string) *site { } } -func (u *unifiCollector) exportSites(r report) { - if r.metrics() == nil || len(r.metrics().Sites) < 1 { - return - } - r.add() - go func() { - defer r.done() - for _, s := range r.metrics().Sites { - u.exportSite(r, s) - } - }() -} - func (u *unifiCollector) exportSite(r report, s *unifi.Site) { - labels := []string{s.Name, s.Desc, s.SiteName} for _, h := range s.Health { - l := append([]string{h.Subsystem, h.Status}, labels...) + labels := []string{h.Subsystem, h.Status, s.SiteName} switch h.Subsystem { case "www": r.send([]*metricExports{ - {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l}, - {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l}, - {u.Site.Uptime, prometheus.GaugeValue, h.Latency, l}, - {u.Site.Latency, prometheus.GaugeValue, h.Latency.Val / 1000, l}, - {u.Site.XputUp, prometheus.GaugeValue, h.XputUp, l}, - {u.Site.XputDown, prometheus.GaugeValue, h.XputDown, l}, - {u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing, l}, - {u.Site.Drops, prometheus.CounterValue, h.Drops, l}, + {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, labels}, + {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, labels}, + {u.Site.Uptime, prometheus.GaugeValue, h.Latency, labels}, + {u.Site.Latency, prometheus.GaugeValue, h.Latency.Val / 1000, labels}, + {u.Site.XputUp, prometheus.GaugeValue, h.XputUp, labels}, + {u.Site.XputDown, prometheus.GaugeValue, h.XputDown, labels}, + {u.Site.SpeedtestPing, prometheus.GaugeValue, h.SpeedtestPing, labels}, + {u.Site.Drops, prometheus.CounterValue, h.Drops, labels}, }) case "wlan": r.send([]*metricExports{ - {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l}, - {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l}, - {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, l}, - {u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, l}, - {u.Site.NumPending, prometheus.GaugeValue, h.NumPending, l}, - {u.Site.NumUser, prometheus.GaugeValue, h.NumUser, l}, - {u.Site.NumGuest, prometheus.GaugeValue, h.NumGuest, l}, - {u.Site.NumIot, prometheus.GaugeValue, h.NumIot, l}, - {u.Site.NumAp, prometheus.GaugeValue, h.NumAp, l}, - {u.Site.NumDisabled, prometheus.GaugeValue, h.NumDisabled, l}, + {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, labels}, + {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, labels}, + {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, labels}, + {u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, labels}, + {u.Site.NumPending, prometheus.GaugeValue, h.NumPending, labels}, + {u.Site.NumUser, prometheus.GaugeValue, h.NumUser, labels}, + {u.Site.NumGuest, prometheus.GaugeValue, h.NumGuest, labels}, + {u.Site.NumIot, prometheus.GaugeValue, h.NumIot, labels}, + {u.Site.NumAp, prometheus.GaugeValue, h.NumAp, labels}, + {u.Site.NumDisabled, prometheus.GaugeValue, h.NumDisabled, labels}, }) case "wan": r.send([]*metricExports{ - {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l}, - {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l}, - {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, l}, - {u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, l}, - {u.Site.NumPending, prometheus.GaugeValue, h.NumPending, l}, - {u.Site.NumGw, prometheus.GaugeValue, h.NumGw, l}, - {u.Site.NumSta, prometheus.GaugeValue, h.NumSta, l}, + {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, labels}, + {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, labels}, + {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, labels}, + {u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, labels}, + {u.Site.NumPending, prometheus.GaugeValue, h.NumPending, labels}, + {u.Site.NumGw, prometheus.GaugeValue, h.NumGw, labels}, + {u.Site.NumSta, prometheus.GaugeValue, h.NumSta, labels}, }) case "lan": r.send([]*metricExports{ - {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, l}, - {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, l}, - {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, l}, - {u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, l}, - {u.Site.NumPending, prometheus.GaugeValue, h.NumPending, l}, - {u.Site.NumUser, prometheus.GaugeValue, h.NumUser, l}, - {u.Site.NumGuest, prometheus.GaugeValue, h.NumGuest, l}, - {u.Site.NumIot, prometheus.GaugeValue, h.NumIot, l}, - {u.Site.NumSw, prometheus.GaugeValue, h.NumSw, l}, + {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, labels}, + {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, labels}, + {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, labels}, + {u.Site.NumDisconnected, prometheus.GaugeValue, h.NumDisconnected, labels}, + {u.Site.NumPending, prometheus.GaugeValue, h.NumPending, labels}, + {u.Site.NumUser, prometheus.GaugeValue, h.NumUser, labels}, + {u.Site.NumGuest, prometheus.GaugeValue, h.NumGuest, labels}, + {u.Site.NumIot, prometheus.GaugeValue, h.NumIot, labels}, + {u.Site.NumSw, prometheus.GaugeValue, h.NumSw, labels}, }) case "vpn": r.send([]*metricExports{ - {u.Site.RemoteUserNumActive, prometheus.GaugeValue, h.RemoteUserNumActive, l}, - {u.Site.RemoteUserNumInactive, prometheus.GaugeValue, h.RemoteUserNumInactive, l}, - {u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes, l}, - {u.Site.RemoteUserTxBytes, prometheus.CounterValue, h.RemoteUserTxBytes, l}, - {u.Site.RemoteUserRxPackets, prometheus.CounterValue, h.RemoteUserRxPackets, l}, - {u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets, l}, + {u.Site.RemoteUserNumActive, prometheus.GaugeValue, h.RemoteUserNumActive, labels}, + {u.Site.RemoteUserNumInactive, prometheus.GaugeValue, h.RemoteUserNumInactive, labels}, + {u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes, labels}, + {u.Site.RemoteUserTxBytes, prometheus.CounterValue, h.RemoteUserTxBytes, labels}, + {u.Site.RemoteUserRxPackets, prometheus.CounterValue, h.RemoteUserRxPackets, labels}, + {u.Site.RemoteUserTxPackets, prometheus.CounterValue, h.RemoteUserTxPackets, labels}, }) } } diff --git a/promunifi/uap.go b/promunifi/uap.go index 98d084af1..0ff7a3a22 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -83,10 +83,10 @@ type uap struct { } func descUAP(ns string) *uap { - labels := []string{"ip", "version", "model", "serial", "type", "mac", "site_name", "name"} - labelA := append([]string{"stat"}, labels[6:]...) - labelV := append([]string{"vap_name", "bssid", "radio", "radio_name", "essid", "usage"}, labels[6:]...) - labelR := append([]string{"radio_name", "radio"}, labels[6:]...) + // labels := []string{"ip", "version", "model", "serial", "type", "mac", "site_name", "name"} + labelA := []string{"stat", "site_name", "name"} // stat + labels[6:] + labelV := []string{"vap_name", "bssid", "radio", "radio_name", "essid", "usage", "site_name", "name"} + labelR := []string{"radio_name", "radio", "site_name", "name"} return &uap{ // 3x each - stat table: total, guest, user ApWifiTxDropped: prometheus.NewDesc(ns+"stat_wifi_transmt_dropped_total", "Wifi Transmissions Dropped", labelA, nil), @@ -165,19 +165,6 @@ func descUAP(ns string) *uap { } } -func (u *unifiCollector) exportUAPs(r report) { - if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.UAPs) < 1 { - return - } - r.add() - go func() { - defer r.done() - for _, d := range r.metrics().Devices.UAPs { - u.exportUAP(r, d) - } - }() -} - func (u *unifiCollector) exportUAP(r report, d *unifi.UAP) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} // AP data. diff --git a/promunifi/udm.go b/promunifi/udm.go index ccb8cb837..e4e720919 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -67,19 +67,6 @@ func descDevice(ns string) *unifiDevice { } } -func (u *unifiCollector) exportUDMs(r report) { - if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.UDMs) < 1 { - return - } - r.add() - go func() { - defer r.done() - for _, d := range r.metrics().Devices.UDMs { - u.exportUDM(r, d) - } - }() -} - // UDM is a collection of stats from USG, USW and UAP. It has no unique stats. func (u *unifiCollector) exportUDM(r report, d *unifi.UDM) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} @@ -105,7 +92,7 @@ func (u *unifiCollector) exportUDM(r report, d *unifi.UDM) { {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) u.exportUSWstats(r, labels, d.Stat.Sw) - u.exportUSGstats(r, labels, d.SpeedtestStatus) + u.exportUSGstats(r, labels, d.Stat.Gw, d.SpeedtestStatus) u.exportWANPorts(r, labels, d.Wan1, d.Wan2) u.exportPortTable(r, labels, d.PortTable) if d.Stat.Ap != nil && d.VapTable != nil { diff --git a/promunifi/usg.go b/promunifi/usg.go index e12bc1295..8eafef7d6 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -34,50 +34,38 @@ type usg struct { } func descUSG(ns string) *usg { - labels := []string{"ip", "version", "model", "serial", "type", "mac", "site_name", "name"} - labelWan := append([]string{"port"}, labels[6:]...) + // labels := []string{"ip", "version", "model", "serial", "type", "mac", "site_name", "name"} + // labelWan := append([]string{"port"}, labels[6:]...) + labels := []string{"port", "site_name", "name"} return &usg{ - WanRxPackets: prometheus.NewDesc(ns+"wan_receive_packets_total", "WAN Receive Packets Total", labelWan, nil), - WanRxBytes: prometheus.NewDesc(ns+"wan_receive_bytes_total", "WAN Receive Bytes Total", labelWan, nil), - WanRxDropped: prometheus.NewDesc(ns+"wan_receive_dropped_total", "WAN Receive Dropped Total", labelWan, nil), - WanRxErrors: prometheus.NewDesc(ns+"wan_receive_errors_total", "WAN Receive Errors Total", labelWan, nil), - WanTxPackets: prometheus.NewDesc(ns+"wan_transmit_packets_total", "WAN Transmit Packets Total", labelWan, nil), - WanTxBytes: prometheus.NewDesc(ns+"wan_transmit_bytes_total", "WAN Transmit Bytes Total", labelWan, nil), - WanRxBroadcast: prometheus.NewDesc(ns+"wan_receive_broadcast_total", "WAN Receive Broadcast Total", labelWan, nil), - WanRxBytesR: prometheus.NewDesc(ns+"wan_receive_rate_bytes", "WAN Receive Bytes Rate", labelWan, nil), - WanRxMulticast: prometheus.NewDesc(ns+"wan_receive_multicast_total", "WAN Receive Multicast Total", labelWan, nil), - WanSpeed: prometheus.NewDesc(ns+"wan_speed_bps", "WAN Speed", labelWan, nil), - WanTxBroadcast: prometheus.NewDesc(ns+"wan_transmit_broadcast_total", "WAN Transmit Broadcast Total", labelWan, nil), - WanTxBytesR: prometheus.NewDesc(ns+"wan_transmit_rate_bytes", "WAN Transmit Bytes Rate", labelWan, nil), - WanTxDropped: prometheus.NewDesc(ns+"wan_transmit_dropped_total", "WAN Transmit Dropped Total", labelWan, nil), - WanTxErrors: prometheus.NewDesc(ns+"wan_transmit_errors_total", "WAN Transmit Errors Total", labelWan, nil), - WanTxMulticast: prometheus.NewDesc(ns+"wan_transmit_multicast_total", "WAN Transmit Multicast Total", labelWan, nil), - WanBytesR: prometheus.NewDesc(ns+"wan_rate_bytes", "WAN Transfer Rate", labelWan, nil), + WanRxPackets: prometheus.NewDesc(ns+"wan_receive_packets_total", "WAN Receive Packets Total", labels, nil), + WanRxBytes: prometheus.NewDesc(ns+"wan_receive_bytes_total", "WAN Receive Bytes Total", labels, nil), + WanRxDropped: prometheus.NewDesc(ns+"wan_receive_dropped_total", "WAN Receive Dropped Total", labels, nil), + WanRxErrors: prometheus.NewDesc(ns+"wan_receive_errors_total", "WAN Receive Errors Total", labels, nil), + WanTxPackets: prometheus.NewDesc(ns+"wan_transmit_packets_total", "WAN Transmit Packets Total", labels, nil), + WanTxBytes: prometheus.NewDesc(ns+"wan_transmit_bytes_total", "WAN Transmit Bytes Total", labels, nil), + WanRxBroadcast: prometheus.NewDesc(ns+"wan_receive_broadcast_total", "WAN Receive Broadcast Total", labels, nil), + WanRxBytesR: prometheus.NewDesc(ns+"wan_receive_rate_bytes", "WAN Receive Bytes Rate", labels, nil), + WanRxMulticast: prometheus.NewDesc(ns+"wan_receive_multicast_total", "WAN Receive Multicast Total", labels, nil), + WanSpeed: prometheus.NewDesc(ns+"wan_speed_bps", "WAN Speed", labels, nil), + WanTxBroadcast: prometheus.NewDesc(ns+"wan_transmit_broadcast_total", "WAN Transmit Broadcast Total", labels, nil), + WanTxBytesR: prometheus.NewDesc(ns+"wan_transmit_rate_bytes", "WAN Transmit Bytes Rate", labels, nil), + WanTxDropped: prometheus.NewDesc(ns+"wan_transmit_dropped_total", "WAN Transmit Dropped Total", labels, nil), + WanTxErrors: prometheus.NewDesc(ns+"wan_transmit_errors_total", "WAN Transmit Errors Total", labels, nil), + WanTxMulticast: prometheus.NewDesc(ns+"wan_transmit_multicast_total", "WAN Transmit Multicast Total", labels, nil), + WanBytesR: prometheus.NewDesc(ns+"wan_rate_bytes", "WAN Transfer Rate", labels, nil), LanRxPackets: prometheus.NewDesc(ns+"lan_receive_packets_total", "LAN Receive Packets Total", labels, nil), LanRxBytes: prometheus.NewDesc(ns+"lan_receive_bytes_total", "LAN Receive Bytes Total", labels, nil), LanRxDropped: prometheus.NewDesc(ns+"lan_receive_dropped_total", "LAN Receive Dropped Total", labels, nil), LanTxPackets: prometheus.NewDesc(ns+"lan_transmit_packets_total", "LAN Transmit Packets Total", labels, nil), LanTxBytes: prometheus.NewDesc(ns+"lan_transmit_bytes_total", "LAN Transmit Bytes Total", labels, nil), - Latency: prometheus.NewDesc(ns+"speedtest_latency_seconds", "Speedtest Latency", labelWan, nil), - Runtime: prometheus.NewDesc(ns+"speedtest_runtime", "Speedtest Run Time", labelWan, nil), - XputDownload: prometheus.NewDesc(ns+"speedtest_download", "Speedtest Download Rate", labelWan, nil), - XputUpload: prometheus.NewDesc(ns+"speedtest_upload", "Speedtest Upload Rate", labelWan, nil), + Latency: prometheus.NewDesc(ns+"speedtest_latency_seconds", "Speedtest Latency", labels, nil), + Runtime: prometheus.NewDesc(ns+"speedtest_runtime", "Speedtest Run Time", labels, nil), + XputDownload: prometheus.NewDesc(ns+"speedtest_download", "Speedtest Download Rate", labels, nil), + XputUpload: prometheus.NewDesc(ns+"speedtest_upload", "Speedtest Upload Rate", labels, nil), } } -func (u *unifiCollector) exportUSGs(r report) { - if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.USGs) < 1 { - return - } - r.add() - go func() { - defer r.done() - for _, d := range r.metrics().Devices.USGs { - u.exportUSG(r, d) - } - }() -} - func (u *unifiCollector) exportUSG(r report, d *unifi.USG) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} // Gateway System Data. @@ -102,11 +90,12 @@ func (u *unifiCollector) exportUSG(r report, d *unifi.USG) { {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) u.exportWANPorts(r, labels, d.Wan1, d.Wan2) - u.exportUSGstats(r, labels, d.SpeedtestStatus) + u.exportUSGstats(r, labels, d.Stat.Gw, d.SpeedtestStatus) } -func (u *unifiCollector) exportUSGstats(r report, labels []string, st unifi.SpeedtestStatus) { - labelWan := append([]string{"all"}, labels[6:]...) +func (u *unifiCollector) exportUSGstats(r report, labels []string, gw *unifi.Gw, st unifi.SpeedtestStatus) { + labelLan := []string{"lan", labels[6], labels[7]} + labelWan := []string{"all", labels[6], labels[7]} r.send([]*metricExports{ /* // Combined Port Stats {u.USG.WanRxPackets, prometheus.CounterValue, gw.WanRxPackets, labelWan}, @@ -115,12 +104,12 @@ func (u *unifiCollector) exportUSGstats(r report, labels []string, st unifi.Spee {u.USG.WanTxPackets, prometheus.CounterValue, gw.WanTxPackets, labelWan}, {u.USG.WanTxBytes, prometheus.CounterValue, gw.WanTxBytes, labelWan}, {u.USG.WanRxErrors, prometheus.CounterValue, gw.WanRxErrors, labelWan}, - {u.USG.LanRxPackets, prometheus.CounterValue, gw.LanRxPackets, labels}, - {u.USG.LanRxBytes, prometheus.CounterValue, gw.LanRxBytes, labels}, - {u.USG.LanTxPackets, prometheus.CounterValue, gw.LanTxPackets, labels}, - {u.USG.LanTxBytes, prometheus.CounterValue, gw.LanTxBytes, labels}, - {u.USG.LanRxDropped, prometheus.CounterValue, gw.LanRxDropped, labels}, */ + {u.USG.LanRxPackets, prometheus.CounterValue, gw.LanRxPackets, labelLan}, + {u.USG.LanRxBytes, prometheus.CounterValue, gw.LanRxBytes, labelLan}, + {u.USG.LanTxPackets, prometheus.CounterValue, gw.LanTxPackets, labelLan}, + {u.USG.LanTxBytes, prometheus.CounterValue, gw.LanTxBytes, labelLan}, + {u.USG.LanRxDropped, prometheus.CounterValue, gw.LanRxDropped, labelLan}, // Speed Test Stats {u.USG.Latency, prometheus.GaugeValue, st.Latency.Val / 1000, labelWan}, {u.USG.Runtime, prometheus.GaugeValue, st.Runtime, labelWan}, @@ -134,23 +123,23 @@ func (u *unifiCollector) exportWANPorts(r report, labels []string, wans ...unifi if !wan.Up.Val { continue // only record UP interfaces. } - l := append([]string{wan.Name}, labels[6:]...) + labelWan := []string{wan.Name, labels[6], labels[7]} r.send([]*metricExports{ - {u.USG.WanRxPackets, prometheus.CounterValue, wan.RxPackets, l}, - {u.USG.WanRxBytes, prometheus.CounterValue, wan.RxBytes, l}, - {u.USG.WanRxDropped, prometheus.CounterValue, wan.RxDropped, l}, - {u.USG.WanRxErrors, prometheus.CounterValue, wan.RxErrors, l}, - {u.USG.WanTxPackets, prometheus.CounterValue, wan.TxPackets, l}, - {u.USG.WanTxBytes, prometheus.CounterValue, wan.TxBytes, l}, - {u.USG.WanRxBroadcast, prometheus.CounterValue, wan.RxBroadcast, l}, - {u.USG.WanRxMulticast, prometheus.CounterValue, wan.RxMulticast, l}, - {u.USG.WanSpeed, prometheus.CounterValue, wan.Speed.Val * 1000000, l}, - {u.USG.WanTxBroadcast, prometheus.CounterValue, wan.TxBroadcast, l}, - {u.USG.WanTxBytesR, prometheus.CounterValue, wan.TxBytesR, l}, - {u.USG.WanTxDropped, prometheus.CounterValue, wan.TxDropped, l}, - {u.USG.WanTxErrors, prometheus.CounterValue, wan.TxErrors, l}, - {u.USG.WanTxMulticast, prometheus.CounterValue, wan.TxMulticast, l}, - {u.USG.WanBytesR, prometheus.GaugeValue, wan.BytesR, l}, + {u.USG.WanRxPackets, prometheus.CounterValue, wan.RxPackets, labelWan}, + {u.USG.WanRxBytes, prometheus.CounterValue, wan.RxBytes, labelWan}, + {u.USG.WanRxDropped, prometheus.CounterValue, wan.RxDropped, labelWan}, + {u.USG.WanRxErrors, prometheus.CounterValue, wan.RxErrors, labelWan}, + {u.USG.WanTxPackets, prometheus.CounterValue, wan.TxPackets, labelWan}, + {u.USG.WanTxBytes, prometheus.CounterValue, wan.TxBytes, labelWan}, + {u.USG.WanRxBroadcast, prometheus.CounterValue, wan.RxBroadcast, labelWan}, + {u.USG.WanRxMulticast, prometheus.CounterValue, wan.RxMulticast, labelWan}, + {u.USG.WanSpeed, prometheus.CounterValue, wan.Speed.Val * 1000000, labelWan}, + {u.USG.WanTxBroadcast, prometheus.CounterValue, wan.TxBroadcast, labelWan}, + {u.USG.WanTxBytesR, prometheus.CounterValue, wan.TxBytesR, labelWan}, + {u.USG.WanTxDropped, prometheus.CounterValue, wan.TxDropped, labelWan}, + {u.USG.WanTxErrors, prometheus.CounterValue, wan.TxErrors, labelWan}, + {u.USG.WanTxMulticast, prometheus.CounterValue, wan.TxMulticast, labelWan}, + {u.USG.WanBytesR, prometheus.GaugeValue, wan.BytesR, labelWan}, }) } } diff --git a/promunifi/usw.go b/promunifi/usw.go index 66d81ebc8..b345323c1 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -92,19 +92,6 @@ func descUSW(ns string) *usw { } } -func (u *unifiCollector) exportUSWs(r report) { - if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.USWs) < 1 { - return - } - r.add() - go func() { - defer r.done() - for _, d := range r.metrics().Devices.USWs { - u.exportUSW(r, d) - } - }() -} - func (u *unifiCollector) exportUSW(r report, d *unifi.USW) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} if d.HasTemperature.Val { @@ -166,31 +153,31 @@ func (u *unifiCollector) exportPortTable(r report, labels []string, pt []unifi.P continue } // Copy labels, and add four new ones. - l := append([]string{p.PortIdx.Txt, p.Name, p.Mac, p.IP}, labels[6:]...) + labelP := []string{p.PortIdx.Txt, p.Name, p.Mac, p.IP, labels[6], labels[7]} if p.PoeEnable.Val && p.PortPoe.Val { r.send([]*metricExports{ - {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, l}, - {u.USW.PoePower, prometheus.GaugeValue, p.PoePower, l}, - {u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, l}, + {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, labelP}, + {u.USW.PoePower, prometheus.GaugeValue, p.PoePower, labelP}, + {u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, labelP}, }) } r.send([]*metricExports{ - {u.USW.RxBroadcast, prometheus.CounterValue, p.RxBroadcast, l}, - {u.USW.RxBytes, prometheus.CounterValue, p.RxBytes, l}, - {u.USW.RxBytesR, prometheus.GaugeValue, p.RxBytesR, l}, - {u.USW.RxDropped, prometheus.CounterValue, p.RxDropped, l}, - {u.USW.RxErrors, prometheus.CounterValue, p.RxErrors, l}, - {u.USW.RxMulticast, prometheus.CounterValue, p.RxMulticast, l}, - {u.USW.RxPackets, prometheus.CounterValue, p.RxPackets, l}, - {u.USW.Satisfaction, prometheus.GaugeValue, p.Satisfaction, l}, - {u.USW.Speed, prometheus.GaugeValue, p.Speed.Val * 1000000, l}, - {u.USW.TxBroadcast, prometheus.CounterValue, p.TxBroadcast, l}, - {u.USW.TxBytes, prometheus.CounterValue, p.TxBytes, l}, - {u.USW.TxBytesR, prometheus.GaugeValue, p.TxBytesR, l}, - {u.USW.TxDropped, prometheus.CounterValue, p.TxDropped, l}, - {u.USW.TxErrors, prometheus.CounterValue, p.TxErrors, l}, - {u.USW.TxMulticast, prometheus.CounterValue, p.TxMulticast, l}, + {u.USW.RxBroadcast, prometheus.CounterValue, p.RxBroadcast, labelP}, + {u.USW.RxBytes, prometheus.CounterValue, p.RxBytes, labelP}, + {u.USW.RxBytesR, prometheus.GaugeValue, p.RxBytesR, labelP}, + {u.USW.RxDropped, prometheus.CounterValue, p.RxDropped, labelP}, + {u.USW.RxErrors, prometheus.CounterValue, p.RxErrors, labelP}, + {u.USW.RxMulticast, prometheus.CounterValue, p.RxMulticast, labelP}, + {u.USW.RxPackets, prometheus.CounterValue, p.RxPackets, labelP}, + {u.USW.Satisfaction, prometheus.GaugeValue, p.Satisfaction, labelP}, + {u.USW.Speed, prometheus.GaugeValue, p.Speed.Val * 1000000, labelP}, + {u.USW.TxBroadcast, prometheus.CounterValue, p.TxBroadcast, labelP}, + {u.USW.TxBytes, prometheus.CounterValue, p.TxBytes, labelP}, + {u.USW.TxBytesR, prometheus.GaugeValue, p.TxBytesR, labelP}, + {u.USW.TxDropped, prometheus.CounterValue, p.TxDropped, labelP}, + {u.USW.TxErrors, prometheus.CounterValue, p.TxErrors, labelP}, + {u.USW.TxMulticast, prometheus.CounterValue, p.TxMulticast, labelP}, }) } } From a58c1210d02c17e2c4cc57a953cac1284ebe0691 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 21:16:49 -0800 Subject: [PATCH 79/85] more cleanup --- poller/prometheus.go | 15 ++++++++----- promunifi/clients.go | 4 +++- promunifi/collector.go | 10 +++++---- promunifi/loops.go | 30 +++++++++++++++---------- promunifi/report.go | 50 +++++++++++++++++++++--------------------- promunifi/uap.go | 3 ++- promunifi/udm.go | 9 +++++--- promunifi/usw.go | 4 +--- 8 files changed, 70 insertions(+), 55 deletions(-) diff --git a/poller/prometheus.go b/poller/prometheus.go index 030a51b11..58e3d6fb6 100644 --- a/poller/prometheus.go +++ b/poller/prometheus.go @@ -12,6 +12,8 @@ import ( "github.com/prometheus/client_golang/prometheus/promhttp" ) +const oneDecimalPoint = 10 + // RunPrometheus starts the web server and registers the collector. func (u *UnifiPoller) RunPrometheus() error { u.Logf("Exporting Measurements at https://%s/metrics for Prometheus", u.Config.HTTPListen) @@ -57,10 +59,11 @@ func (u *UnifiPoller) LogExportReport(report *promunifi.Report) { idsMsg = fmt.Sprintf(", IDS Events: %d, ", len(m.IDSList)) } - u.Logf("UniFi Measurements Exported. Sites: %d, Clients: %d, "+ - "Wireless APs: %d, Gateways: %d, Switches: %d%s, Descs: %d, "+ - "Metrics: %d, Errors: %d, Zeros: %d, Elapsed: %v", - len(m.Sites), len(m.Clients), len(m.UAPs), len(m.UDMs)+len(m.USGs), - len(m.USWs), idsMsg, report.Descs, report.Total, report.Errors, - report.Zeros, report.Elapsed.Round(time.Millisecond)) + u.Logf("UniFi Measurements Exported. Site: %d, Client: %d, "+ + "UAP: %d, USG/UDM: %d, USW: %d%s, Descs: %d, "+ + "Metrics: %d, Errs: %d, 0s: %d, Reqs/Total: %v/%v", + len(m.Sites), len(m.Clients), len(m.UAPs), len(m.UDMs)+len(m.USGs), len(m.USWs), + idsMsg, report.Descs, report.Total, report.Errors, report.Zeros, + report.Fetch.Round(time.Millisecond/oneDecimalPoint), + report.Elapsed.Round(time.Millisecond/oneDecimalPoint)) } diff --git a/promunifi/clients.go b/promunifi/clients.go index d1014a60f..174ce35f4 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -72,11 +72,12 @@ func descClient(ns string) *uclient { } func (u *unifiCollector) exportClient(r report, c *unifi.Client) { - labels := []string{c.Name, c.Mac, c.SiteName, c.GwName, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network, c.SwPort.Txt, c.ApName, "false"} + labels := []string{c.Name, c.Mac, c.SiteName, c.GwName, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network, c.SwPort.Txt, c.ApName, ""} labelW := append([]string{c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription}, labels...) if c.IsWired.Val { labels[len(labels)-1] = "true" + labelW[len(labelW)-1] = "true" r.send([]*metricExports{ {u.Client.RxBytes, prometheus.CounterValue, c.WiredRxBytes, labels}, {u.Client.RxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labels}, @@ -87,6 +88,7 @@ func (u *unifiCollector) exportClient(r report, c *unifi.Client) { }) } else { labels[len(labels)-1] = "false" + labelW[len(labelW)-1] = "false" r.send([]*metricExports{ {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labelW}, {u.Client.CCQ, prometheus.GaugeValue, c.Ccq / 10, labelW}, diff --git a/promunifi/collector.go b/promunifi/collector.go index 285ac72a9..85d8d2ba2 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -58,6 +58,7 @@ type Report struct { Descs int Metrics *metrics.Metrics Elapsed time.Duration + Fetch time.Duration Start time.Time ch chan []*metricExports wg sync.WaitGroup @@ -121,12 +122,13 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { }() var err error - if r.Metrics, err = u.Config.CollectFn(); err != nil { - ch <- prometheus.NewInvalidMetric( - prometheus.NewInvalidDesc(fmt.Errorf("metric fetch failed")), err) + if r.Metrics, err = r.cf.CollectFn(); err != nil { + r.error(ch, prometheus.NewInvalidDesc(fmt.Errorf("metric fetch failed")), err) return } + r.Fetch = time.Since(r.Start) + // Pass Report interface into our collecting and reporting methods. go u.exportMetrics(r, ch) // in loops.go. u.loopClients(r) @@ -155,7 +157,7 @@ func (u *unifiCollector) exportMetrics(r report, ch chan<- prometheus.Metric) { case int: ch <- r.export(m, float64(v)) default: - r.error(ch, m.Desc, m.Value) + r.error(ch, m.Desc, fmt.Sprintf("not a number: %v", m.Value)) } } r.done() diff --git a/promunifi/loops.go b/promunifi/loops.go index e1a4dcdb4..1ddcebd59 100644 --- a/promunifi/loops.go +++ b/promunifi/loops.go @@ -5,78 +5,84 @@ package promunifi // they usually all change at once since they're pretty much the same code. func (u *unifiCollector) loopSites(r report) { - if r.metrics() == nil || len(r.metrics().Sites) < 1 { + m := r.metrics() + if m == nil || len(m.Sites) < 1 { return } r.add() go func() { defer r.done() - for _, s := range r.metrics().Sites { + for _, s := range m.Sites { u.exportSite(r, s) } }() } func (u *unifiCollector) loopUAPs(r report) { - if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.UAPs) < 1 { + m := r.metrics() + if m == nil || m.Devices == nil || len(m.Devices.UAPs) < 1 { return } r.add() go func() { defer r.done() - for _, d := range r.metrics().Devices.UAPs { + for _, d := range m.Devices.UAPs { u.exportUAP(r, d) } }() } func (u *unifiCollector) loopUDMs(r report) { - if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.UDMs) < 1 { + m := r.metrics() + if m == nil || m.Devices == nil || len(m.Devices.UDMs) < 1 { return } r.add() go func() { defer r.done() - for _, d := range r.metrics().Devices.UDMs { + for _, d := range m.Devices.UDMs { u.exportUDM(r, d) } }() } func (u *unifiCollector) loopUSGs(r report) { - if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.USGs) < 1 { + m := r.metrics() + if m == nil || m.Devices == nil || len(m.Devices.USGs) < 1 { return } r.add() go func() { defer r.done() - for _, d := range r.metrics().Devices.USGs { + for _, d := range m.Devices.USGs { u.exportUSG(r, d) } }() } func (u *unifiCollector) loopUSWs(r report) { - if r.metrics() == nil || r.metrics().Devices == nil || len(r.metrics().Devices.USWs) < 1 { + m := r.metrics() + if m == nil || m.Devices == nil || len(m.Devices.USWs) < 1 { return } r.add() go func() { defer r.done() - for _, d := range r.metrics().Devices.USWs { + for _, d := range m.Devices.USWs { u.exportUSW(r, d) } }() } func (u *unifiCollector) loopClients(r report) { - if r.metrics() == nil || len(r.metrics().Clients) < 1 { + m := r.metrics() + if m == nil || len(m.Clients) < 1 { return } r.add() go func() { defer r.done() - for _, c := range r.metrics().Clients { + for _, c := range m.Clients { u.exportClient(r, c) } }() diff --git a/promunifi/report.go b/promunifi/report.go index cc3f70b52..d59c222c2 100644 --- a/promunifi/report.go +++ b/promunifi/report.go @@ -9,23 +9,44 @@ import ( ) // This file contains the report interface. -// This interface can be mocked and overrridden for tests. +// This interface can be mocked and overridden for tests. // report is an internal interface used to "process metrics" type report interface { - send([]*metricExports) add() done() + send([]*metricExports) metrics() *metrics.Metrics + channel() chan []*metricExports report(descs map[*prometheus.Desc]bool) export(m *metricExports, v float64) prometheus.Metric - channel() chan []*metricExports error(ch chan<- prometheus.Metric, d *prometheus.Desc, v interface{}) } // satisfy gomnd const one = 1 +func (r *Report) add() { + r.wg.Add(one) +} + +func (r *Report) done() { + r.wg.Add(-one) +} + +func (r *Report) send(m []*metricExports) { + r.wg.Add(one) + r.ch <- m +} + +func (r *Report) metrics() *metrics.Metrics { + return r.Metrics +} + +func (r *Report) channel() chan []*metricExports { + return r.ch +} + func (r *Report) report(descs map[*prometheus.Desc]bool) { if r.cf.LoggingFn == nil { return @@ -42,30 +63,9 @@ func (r *Report) export(m *metricExports, v float64) prometheus.Metric { return prometheus.MustNewConstMetric(m.Desc, m.ValueType, v, m.Labels...) } -func (r *Report) metrics() *metrics.Metrics { - return r.Metrics -} - -func (r *Report) channel() chan []*metricExports { - return r.ch -} - func (r *Report) error(ch chan<- prometheus.Metric, d *prometheus.Desc, v interface{}) { r.Errors++ if r.cf.ReportErrors { - ch <- prometheus.NewInvalidMetric(d, fmt.Errorf("not a number: %v", v)) + ch <- prometheus.NewInvalidMetric(d, fmt.Errorf("error: %v", v)) } } - -func (r *Report) add() { - r.wg.Add(one) -} - -func (r *Report) done() { - r.wg.Add(-one) -} - -func (r *Report) send(m []*metricExports) { - r.wg.Add(one) - r.ch <- m -} diff --git a/promunifi/uap.go b/promunifi/uap.go index 0ff7a3a22..0b14a840a 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -167,7 +167,7 @@ func descUAP(ns string) *uap { func (u *unifiCollector) exportUAP(r report, d *unifi.UAP) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} - // AP data. + // Wireless System Data. r.send([]*metricExports{ {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, {u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, @@ -189,6 +189,7 @@ func (u *unifiCollector) exportUAP(r report, d *unifi.UAP) { {u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) + u.exportUAPstats(r, labels, d.Stat.Ap) u.exportVAPtable(r, labels, d.VapTable) u.exportRadtable(r, labels, d.RadioTable, d.RadioTableStats) diff --git a/promunifi/udm.go b/promunifi/udm.go index e4e720919..9779cfad4 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -70,7 +70,7 @@ func descDevice(ns string) *unifiDevice { // UDM is a collection of stats from USG, USW and UAP. It has no unique stats. func (u *unifiCollector) exportUDM(r report, d *unifi.UDM) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} - // Gateway System Data. + // Dream Machine System Data. r.send([]*metricExports{ {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, {u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, @@ -91,12 +91,15 @@ func (u *unifiCollector) exportUDM(r report, d *unifi.UDM) { {u.Device.CPU, prometheus.GaugeValue, d.SystemStats.CPU, labels}, {u.Device.Mem, prometheus.GaugeValue, d.SystemStats.Mem, labels}, }) + + // Switch Data u.exportUSWstats(r, labels, d.Stat.Sw) + u.exportPortTable(r, labels, d.PortTable) + // Gateway Data u.exportUSGstats(r, labels, d.Stat.Gw, d.SpeedtestStatus) u.exportWANPorts(r, labels, d.Wan1, d.Wan2) - u.exportPortTable(r, labels, d.PortTable) + // Wireless Data - UDM (non-pro) only if d.Stat.Ap != nil && d.VapTable != nil { - // UDM Pro does not have these. UDM non-Pro does. u.exportUAPstats(r, labels, d.Stat.Ap) u.exportVAPtable(r, labels, *d.VapTable) u.exportRadtable(r, labels, *d.RadioTable, *d.RadioTableStats) diff --git a/promunifi/usw.go b/promunifi/usw.go index b345323c1..6ce9a4631 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -47,11 +47,9 @@ type usw struct { func descUSW(ns string) *usw { pns := ns + "port_" - // The first five labels for switch are shared with (the same as) switch ports. // labels := []string{"ip", "version", "model", "serial", "type", "mac", "site_name", "name"} labelS := []string{"site_name", "name"} // labels[6:] - // Copy labels, and replace first four with different names. - labelP := append([]string{"port_num", "port_name", "port_mac", "port_ip"}, labelS...) + labelP := []string{"port_num", "port_name", "port_mac", "port_ip", "site_name", "name"} return &usw{ SwRxPackets: prometheus.NewDesc(ns+"switch_receive_packets_total", "Switch Packets Received Total", labelS, nil), SwRxBytes: prometheus.NewDesc(ns+"switch_receive_bytes_total", "Switch Bytes Received Total", labelS, nil), From 1d93777a0dca25686ee5a52b22b131bc2928435f Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 22:35:42 -0800 Subject: [PATCH 80/85] tighter for loops --- poller/prometheus.go | 2 +- promunifi/collector.go | 39 +++++++-------------- promunifi/loops.go | 78 ++++++++++-------------------------------- promunifi/report.go | 13 ++++++- promunifi/usg.go | 2 +- promunifi/usw.go | 2 +- 6 files changed, 46 insertions(+), 90 deletions(-) diff --git a/poller/prometheus.go b/poller/prometheus.go index 58e3d6fb6..ae2daa634 100644 --- a/poller/prometheus.go +++ b/poller/prometheus.go @@ -61,7 +61,7 @@ func (u *UnifiPoller) LogExportReport(report *promunifi.Report) { u.Logf("UniFi Measurements Exported. Site: %d, Client: %d, "+ "UAP: %d, USG/UDM: %d, USW: %d%s, Descs: %d, "+ - "Metrics: %d, Errs: %d, 0s: %d, Reqs/Total: %v/%v", + "Metrics: %d, Errs: %d, 0s: %d, Reqs/Total: %v / %v", len(m.Sites), len(m.Clients), len(m.UAPs), len(m.UDMs)+len(m.USGs), len(m.USWs), idsMsg, report.Descs, report.Total, report.Errors, report.Zeros, report.Fetch.Round(time.Millisecond/oneDecimalPoint), diff --git a/promunifi/collector.go b/promunifi/collector.go index 85d8d2ba2..6ea0964df 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -88,9 +88,8 @@ func NewUnifiCollector(opts UnifiCollectorCnfg) prometheus.Collector { // Describe satisfies the prometheus Collector. This returns all of the // metric descriptions that this packages produces. func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { - describe := func(from interface{}) { - v := reflect.Indirect(reflect.ValueOf(from)) - + for _, f := range []interface{}{u.Client, u.Device, u.UAP, u.USG, u.USW, u.Site} { + v := reflect.Indirect(reflect.ValueOf(f)) // Loop each struct member and send it to the provided channel. for i := 0; i < v.NumField(); i++ { desc, ok := v.Field(i).Interface().(*prometheus.Desc) @@ -99,44 +98,32 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { } } } - - describe(u.Client) - describe(u.Device) - describe(u.UAP) - describe(u.USG) - describe(u.USW) - describe(u.Site) } // Collect satisfies the prometheus Collector. This runs the input method to get // the current metrics (from another package) then exports them for prometheus. func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { - r := &Report{ - cf: u.Config, - Start: time.Now(), - ch: make(chan []*metricExports, buffer), - } - defer func() { - r.wg.Wait() - close(r.ch) - }() - var err error + r := &Report{cf: u.Config, ch: make(chan []*metricExports, buffer)} + defer r.finish() + + r.Start = time.Now() if r.Metrics, err = r.cf.CollectFn(); err != nil { r.error(ch, prometheus.NewInvalidDesc(fmt.Errorf("metric fetch failed")), err) return } r.Fetch = time.Since(r.Start) + if r.Metrics.Devices == nil { + r.Metrics.Devices = &unifi.Devices{} + } // Pass Report interface into our collecting and reporting methods. go u.exportMetrics(r, ch) // in loops.go. - u.loopClients(r) - u.loopSites(r) - u.loopUAPs(r) - u.loopUSWs(r) - u.loopUSGs(r) - u.loopUDMs(r) + for _, f := range []func(report){u.loopClients, u.loopSites, u.loopUAPs, u.loopUSWs, u.loopUSGs, u.loopUDMs} { + r.add() + go f(r) + } } // This is closely tied to the method above with a sync.WaitGroup. diff --git a/promunifi/loops.go b/promunifi/loops.go index 1ddcebd59..1e7cd5227 100644 --- a/promunifi/loops.go +++ b/promunifi/loops.go @@ -5,85 +5,43 @@ package promunifi // they usually all change at once since they're pretty much the same code. func (u *unifiCollector) loopSites(r report) { - m := r.metrics() - if m == nil || len(m.Sites) < 1 { - return + defer r.done() + for _, s := range r.metrics().Sites { + u.exportSite(r, s) } - r.add() - go func() { - defer r.done() - for _, s := range m.Sites { - u.exportSite(r, s) - } - }() } func (u *unifiCollector) loopUAPs(r report) { - m := r.metrics() - if m == nil || m.Devices == nil || len(m.Devices.UAPs) < 1 { - return + defer r.done() + for _, d := range r.metrics().UAPs { + u.exportUAP(r, d) } - r.add() - go func() { - defer r.done() - for _, d := range m.Devices.UAPs { - u.exportUAP(r, d) - } - }() } func (u *unifiCollector) loopUDMs(r report) { - m := r.metrics() - if m == nil || m.Devices == nil || len(m.Devices.UDMs) < 1 { - return + defer r.done() + for _, d := range r.metrics().UDMs { + u.exportUDM(r, d) } - r.add() - go func() { - defer r.done() - for _, d := range m.Devices.UDMs { - u.exportUDM(r, d) - } - }() } func (u *unifiCollector) loopUSGs(r report) { - m := r.metrics() - if m == nil || m.Devices == nil || len(m.Devices.USGs) < 1 { - return + defer r.done() + for _, d := range r.metrics().USGs { + u.exportUSG(r, d) } - r.add() - go func() { - defer r.done() - for _, d := range m.Devices.USGs { - u.exportUSG(r, d) - } - }() } func (u *unifiCollector) loopUSWs(r report) { - m := r.metrics() - if m == nil || m.Devices == nil || len(m.Devices.USWs) < 1 { - return + defer r.done() + for _, d := range r.metrics().USWs { + u.exportUSW(r, d) } - r.add() - go func() { - defer r.done() - for _, d := range m.Devices.USWs { - u.exportUSW(r, d) - } - }() } func (u *unifiCollector) loopClients(r report) { - m := r.metrics() - if m == nil || len(m.Clients) < 1 { - return + defer r.done() + for _, c := range r.metrics().Clients { + u.exportClient(r, c) } - r.add() - go func() { - defer r.done() - for _, c := range m.Clients { - u.exportClient(r, c) - } - }() } diff --git a/promunifi/report.go b/promunifi/report.go index d59c222c2..925509848 100644 --- a/promunifi/report.go +++ b/promunifi/report.go @@ -6,6 +6,7 @@ import ( "github.com/davidnewhall/unifi-poller/metrics" "github.com/prometheus/client_golang/prometheus" + "golift.io/unifi" ) // This file contains the report interface. @@ -40,6 +41,9 @@ func (r *Report) send(m []*metricExports) { } func (r *Report) metrics() *metrics.Metrics { + if r.Metrics == nil { + return &metrics.Metrics{Devices: &unifi.Devices{}} + } return r.Metrics } @@ -51,7 +55,7 @@ func (r *Report) report(descs map[*prometheus.Desc]bool) { if r.cf.LoggingFn == nil { return } - r.Descs, r.Elapsed = len(descs), time.Since(r.Start) + r.Descs = len(descs) r.cf.LoggingFn(r) } @@ -69,3 +73,10 @@ func (r *Report) error(ch chan<- prometheus.Metric, d *prometheus.Desc, v interf ch <- prometheus.NewInvalidMetric(d, fmt.Errorf("error: %v", v)) } } + +// finish is not part of the interface. +func (r *Report) finish() { + r.wg.Wait() + r.Elapsed = time.Since(r.Start) + close(r.ch) +} diff --git a/promunifi/usg.go b/promunifi/usg.go index 8eafef7d6..5cfef6c1e 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -97,7 +97,7 @@ func (u *unifiCollector) exportUSGstats(r report, labels []string, gw *unifi.Gw, labelLan := []string{"lan", labels[6], labels[7]} labelWan := []string{"all", labels[6], labels[7]} r.send([]*metricExports{ - /* // Combined Port Stats + /* // Combined Port Stats - not really needed. sum() the others instead. {u.USG.WanRxPackets, prometheus.CounterValue, gw.WanRxPackets, labelWan}, {u.USG.WanRxBytes, prometheus.CounterValue, gw.WanRxBytes, labelWan}, {u.USG.WanRxDropped, prometheus.CounterValue, gw.WanRxDropped, labelWan}, diff --git a/promunifi/usw.go b/promunifi/usw.go index 6ce9a4631..fccb65bf5 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -99,7 +99,7 @@ func (u *unifiCollector) exportUSW(r report, d *unifi.USW) { r.send([]*metricExports{{u.Device.FanLevel, prometheus.GaugeValue, d.FanLevel, labels}}) } - // Switch data. + // Switch System Data. r.send([]*metricExports{ {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, {u.Device.TotalMaxPower, prometheus.GaugeValue, d.TotalMaxPower, labels}, From 29c59e71b98d1d5b9a8bbace4a932ef9f6441482 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 22:56:56 -0800 Subject: [PATCH 81/85] still cleaning --- promunifi/clients.go | 6 +++--- promunifi/collector.go | 28 +++++++++++++--------------- promunifi/report.go | 20 ++++++++------------ promunifi/site.go | 10 +++++----- promunifi/uap.go | 10 +++++----- promunifi/udm.go | 2 +- promunifi/usg.go | 6 +++--- promunifi/usw.go | 12 ++++++------ 8 files changed, 44 insertions(+), 50 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 174ce35f4..10c328593 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -78,7 +78,7 @@ func (u *unifiCollector) exportClient(r report, c *unifi.Client) { if c.IsWired.Val { labels[len(labels)-1] = "true" labelW[len(labelW)-1] = "true" - r.send([]*metricExports{ + r.send([]*metric{ {u.Client.RxBytes, prometheus.CounterValue, c.WiredRxBytes, labels}, {u.Client.RxBytesR, prometheus.GaugeValue, c.WiredRxBytesR, labels}, {u.Client.RxPackets, prometheus.CounterValue, c.WiredRxPackets, labels}, @@ -89,7 +89,7 @@ func (u *unifiCollector) exportClient(r report, c *unifi.Client) { } else { labels[len(labels)-1] = "false" labelW[len(labelW)-1] = "false" - r.send([]*metricExports{ + r.send([]*metric{ {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labelW}, {u.Client.CCQ, prometheus.GaugeValue, c.Ccq / 10, labelW}, {u.Client.Noise, prometheus.GaugeValue, c.Noise, labelW}, @@ -109,7 +109,7 @@ func (u *unifiCollector) exportClient(r report, c *unifi.Client) { {u.Client.BytesR, prometheus.GaugeValue, c.BytesR, labelW}, }) } - r.send([]*metricExports{ + r.send([]*metric{ {u.Client.Uptime, prometheus.GaugeValue, c.Uptime, labelW}, /* needs more "looking into" {u.Client.DpiStatsApp, prometheus.GaugeValue, c.DpiStats.App, labels}, diff --git a/promunifi/collector.go b/promunifi/collector.go index 6ea0964df..6433ce13e 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -43,7 +43,7 @@ type unifiCollector struct { Site *site } -type metricExports struct { +type metric struct { Desc *prometheus.Desc ValueType prometheus.ValueType Value interface{} @@ -52,15 +52,15 @@ type metricExports struct { // Report is passed into LoggingFn to log the export metrics to stdout (outside this package). type Report struct { - Total int - Errors int - Zeros int - Descs int - Metrics *metrics.Metrics - Elapsed time.Duration - Fetch time.Duration - Start time.Time - ch chan []*metricExports + Total int // Total count of metrics recorded. + Errors int // Total count of errors recording metrics. + Zeros int // Total count of metrics equal to zero. + Descs int // Total count of unique metrics descriptions. + Metrics *metrics.Metrics // Metrics collected and recorded. + Elapsed time.Duration // Duration elapsed collecting and exporting. + Fetch time.Duration // Duration elapsed making controller requests. + Start time.Time // Time collection began. + ch chan []*metric wg sync.WaitGroup cf UnifiCollectorCnfg } @@ -104,10 +104,9 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { // the current metrics (from another package) then exports them for prometheus. func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { var err error - r := &Report{cf: u.Config, ch: make(chan []*metricExports, buffer)} - defer r.finish() + r := &Report{cf: u.Config, ch: make(chan []*metric, buffer), Start: time.Now()} + defer r.close() - r.Start = time.Now() if r.Metrics, err = r.cf.CollectFn(); err != nil { r.error(ch, prometheus.NewInvalidDesc(fmt.Errorf("metric fetch failed")), err) return @@ -119,10 +118,9 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { // Pass Report interface into our collecting and reporting methods. go u.exportMetrics(r, ch) - // in loops.go. for _, f := range []func(report){u.loopClients, u.loopSites, u.loopUAPs, u.loopUSWs, u.loopUSGs, u.loopUDMs} { r.add() - go f(r) + go f(r) // in loops.go. } } diff --git a/promunifi/report.go b/promunifi/report.go index 925509848..016d3db85 100644 --- a/promunifi/report.go +++ b/promunifi/report.go @@ -6,7 +6,6 @@ import ( "github.com/davidnewhall/unifi-poller/metrics" "github.com/prometheus/client_golang/prometheus" - "golift.io/unifi" ) // This file contains the report interface. @@ -16,11 +15,11 @@ import ( type report interface { add() done() - send([]*metricExports) + send([]*metric) metrics() *metrics.Metrics - channel() chan []*metricExports + channel() chan []*metric report(descs map[*prometheus.Desc]bool) - export(m *metricExports, v float64) prometheus.Metric + export(m *metric, v float64) prometheus.Metric error(ch chan<- prometheus.Metric, d *prometheus.Desc, v interface{}) } @@ -35,19 +34,16 @@ func (r *Report) done() { r.wg.Add(-one) } -func (r *Report) send(m []*metricExports) { +func (r *Report) send(m []*metric) { r.wg.Add(one) r.ch <- m } func (r *Report) metrics() *metrics.Metrics { - if r.Metrics == nil { - return &metrics.Metrics{Devices: &unifi.Devices{}} - } return r.Metrics } -func (r *Report) channel() chan []*metricExports { +func (r *Report) channel() chan []*metric { return r.ch } @@ -59,7 +55,7 @@ func (r *Report) report(descs map[*prometheus.Desc]bool) { r.cf.LoggingFn(r) } -func (r *Report) export(m *metricExports, v float64) prometheus.Metric { +func (r *Report) export(m *metric, v float64) prometheus.Metric { r.Total++ if v == 0 { r.Zeros++ @@ -74,8 +70,8 @@ func (r *Report) error(ch chan<- prometheus.Metric, d *prometheus.Desc, v interf } } -// finish is not part of the interface. -func (r *Report) finish() { +// close is not part of the interface. +func (r *Report) close() { r.wg.Wait() r.Elapsed = time.Since(r.Start) close(r.ch) diff --git a/promunifi/site.go b/promunifi/site.go index 40cf5237a..732485531 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -69,7 +69,7 @@ func (u *unifiCollector) exportSite(r report, s *unifi.Site) { labels := []string{h.Subsystem, h.Status, s.SiteName} switch h.Subsystem { case "www": - r.send([]*metricExports{ + r.send([]*metric{ {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, labels}, {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, labels}, {u.Site.Uptime, prometheus.GaugeValue, h.Latency, labels}, @@ -81,7 +81,7 @@ func (u *unifiCollector) exportSite(r report, s *unifi.Site) { }) case "wlan": - r.send([]*metricExports{ + r.send([]*metric{ {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, labels}, {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, labels}, {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, labels}, @@ -95,7 +95,7 @@ func (u *unifiCollector) exportSite(r report, s *unifi.Site) { }) case "wan": - r.send([]*metricExports{ + r.send([]*metric{ {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, labels}, {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, labels}, {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, labels}, @@ -106,7 +106,7 @@ func (u *unifiCollector) exportSite(r report, s *unifi.Site) { }) case "lan": - r.send([]*metricExports{ + r.send([]*metric{ {u.Site.TxBytesR, prometheus.GaugeValue, h.TxBytesR, labels}, {u.Site.RxBytesR, prometheus.GaugeValue, h.RxBytesR, labels}, {u.Site.NumAdopted, prometheus.GaugeValue, h.NumAdopted, labels}, @@ -119,7 +119,7 @@ func (u *unifiCollector) exportSite(r report, s *unifi.Site) { }) case "vpn": - r.send([]*metricExports{ + r.send([]*metric{ {u.Site.RemoteUserNumActive, prometheus.GaugeValue, h.RemoteUserNumActive, labels}, {u.Site.RemoteUserNumInactive, prometheus.GaugeValue, h.RemoteUserNumInactive, labels}, {u.Site.RemoteUserRxBytes, prometheus.CounterValue, h.RemoteUserRxBytes, labels}, diff --git a/promunifi/uap.go b/promunifi/uap.go index 0b14a840a..8a1f0eac8 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -168,7 +168,7 @@ func descUAP(ns string) *uap { func (u *unifiCollector) exportUAP(r report, d *unifi.UAP) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} // Wireless System Data. - r.send([]*metricExports{ + r.send([]*metric{ {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, {u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, {u.Device.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, @@ -199,7 +199,7 @@ func (u *unifiCollector) exportUAPstats(r report, labels []string, ap *unifi.Ap) // labelA := append([]string{"all"}, labels[2:]...) labelU := append([]string{"user"}, labels[6:]...) labelG := append([]string{"guest"}, labels[6:]...) - r.send([]*metricExports{ + r.send([]*metric{ /* // all {u.UAP.ApWifiTxDropped, prometheus.CounterValue, ap.WifiTxDropped, labelA}, {u.UAP.ApRxErrors, prometheus.CounterValue, ap.RxErrors, labelA}, @@ -257,7 +257,7 @@ func (u *unifiCollector) exportVAPtable(r report, labels []string, vt unifi.VapT } labelV := append([]string{v.Name, v.Bssid, v.Radio, v.RadioName, v.Essid, v.Usage}, labels[6:]...) - r.send([]*metricExports{ + r.send([]*metric{ {u.UAP.VAPCcq, prometheus.GaugeValue, v.Ccq / 10, labelV}, {u.UAP.VAPMacFilterRejections, prometheus.CounterValue, v.MacFilterRejections, labelV}, {u.UAP.VAPNumSatisfactionSta, prometheus.GaugeValue, v.NumSatisfactionSta, labelV}, @@ -303,7 +303,7 @@ func (u *unifiCollector) exportRadtable(r report, labels []string, rt unifi.Radi // radio table for _, p := range rt { labelR := append([]string{p.Name, p.Radio}, labels[6:]...) - r.send([]*metricExports{ + r.send([]*metric{ {u.UAP.RadioCurrentAntennaGain, prometheus.GaugeValue, p.CurrentAntennaGain, labelR}, {u.UAP.RadioHt, prometheus.GaugeValue, p.Ht, labelR}, {u.UAP.RadioMaxTxpower, prometheus.GaugeValue, p.MaxTxpower, labelR}, @@ -317,7 +317,7 @@ func (u *unifiCollector) exportRadtable(r report, labels []string, rt unifi.Radi if t.Name != p.Name { continue } - r.send([]*metricExports{ + r.send([]*metric{ {u.UAP.RadioTxPower, prometheus.GaugeValue, t.TxPower, labelR}, {u.UAP.RadioAstBeXmit, prometheus.GaugeValue, t.AstBeXmit, labelR}, {u.UAP.RadioChannel, prometheus.GaugeValue, t.Channel, labelR}, diff --git a/promunifi/udm.go b/promunifi/udm.go index 9779cfad4..092065407 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -71,7 +71,7 @@ func descDevice(ns string) *unifiDevice { func (u *unifiCollector) exportUDM(r report, d *unifi.UDM) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} // Dream Machine System Data. - r.send([]*metricExports{ + r.send([]*metric{ {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, {u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, {u.Device.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, diff --git a/promunifi/usg.go b/promunifi/usg.go index 5cfef6c1e..8392d4a3f 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -69,7 +69,7 @@ func descUSG(ns string) *usg { func (u *unifiCollector) exportUSG(r report, d *unifi.USG) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} // Gateway System Data. - r.send([]*metricExports{ + r.send([]*metric{ {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, {u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, {u.Device.TotalRxBytes, prometheus.CounterValue, d.RxBytes, labels}, @@ -96,7 +96,7 @@ func (u *unifiCollector) exportUSG(r report, d *unifi.USG) { func (u *unifiCollector) exportUSGstats(r report, labels []string, gw *unifi.Gw, st unifi.SpeedtestStatus) { labelLan := []string{"lan", labels[6], labels[7]} labelWan := []string{"all", labels[6], labels[7]} - r.send([]*metricExports{ + r.send([]*metric{ /* // Combined Port Stats - not really needed. sum() the others instead. {u.USG.WanRxPackets, prometheus.CounterValue, gw.WanRxPackets, labelWan}, {u.USG.WanRxBytes, prometheus.CounterValue, gw.WanRxBytes, labelWan}, @@ -124,7 +124,7 @@ func (u *unifiCollector) exportWANPorts(r report, labels []string, wans ...unifi continue // only record UP interfaces. } labelWan := []string{wan.Name, labels[6], labels[7]} - r.send([]*metricExports{ + r.send([]*metric{ {u.USG.WanRxPackets, prometheus.CounterValue, wan.RxPackets, labelWan}, {u.USG.WanRxBytes, prometheus.CounterValue, wan.RxBytes, labelWan}, {u.USG.WanRxDropped, prometheus.CounterValue, wan.RxDropped, labelWan}, diff --git a/promunifi/usw.go b/promunifi/usw.go index fccb65bf5..2c25271e0 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -93,14 +93,14 @@ func descUSW(ns string) *usw { func (u *unifiCollector) exportUSW(r report, d *unifi.USW) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} if d.HasTemperature.Val { - r.send([]*metricExports{{u.Device.Temperature, prometheus.GaugeValue, d.GeneralTemperature, labels}}) + r.send([]*metric{{u.Device.Temperature, prometheus.GaugeValue, d.GeneralTemperature, labels}}) } if d.HasFan.Val { - r.send([]*metricExports{{u.Device.FanLevel, prometheus.GaugeValue, d.FanLevel, labels}}) + r.send([]*metric{{u.Device.FanLevel, prometheus.GaugeValue, d.FanLevel, labels}}) } // Switch System Data. - r.send([]*metricExports{ + r.send([]*metric{ {u.Device.Uptime, prometheus.GaugeValue, d.Uptime, labels}, {u.Device.TotalMaxPower, prometheus.GaugeValue, d.TotalMaxPower, labels}, {u.Device.TotalTxBytes, prometheus.CounterValue, d.TxBytes, labels}, @@ -124,7 +124,7 @@ func (u *unifiCollector) exportUSW(r report, d *unifi.USW) { func (u *unifiCollector) exportUSWstats(r report, labels []string, sw *unifi.Sw) { labelS := labels[6:] - r.send([]*metricExports{ + r.send([]*metric{ {u.USW.SwRxPackets, prometheus.CounterValue, sw.RxPackets, labelS}, {u.USW.SwRxBytes, prometheus.CounterValue, sw.RxBytes, labelS}, {u.USW.SwRxErrors, prometheus.CounterValue, sw.RxErrors, labelS}, @@ -153,14 +153,14 @@ func (u *unifiCollector) exportPortTable(r report, labels []string, pt []unifi.P // Copy labels, and add four new ones. labelP := []string{p.PortIdx.Txt, p.Name, p.Mac, p.IP, labels[6], labels[7]} if p.PoeEnable.Val && p.PortPoe.Val { - r.send([]*metricExports{ + r.send([]*metric{ {u.USW.PoeCurrent, prometheus.GaugeValue, p.PoeCurrent, labelP}, {u.USW.PoePower, prometheus.GaugeValue, p.PoePower, labelP}, {u.USW.PoeVoltage, prometheus.GaugeValue, p.PoeVoltage, labelP}, }) } - r.send([]*metricExports{ + r.send([]*metric{ {u.USW.RxBroadcast, prometheus.CounterValue, p.RxBroadcast, labelP}, {u.USW.RxBytes, prometheus.CounterValue, p.RxBytes, labelP}, {u.USW.RxBytesR, prometheus.GaugeValue, p.RxBytesR, labelP}, From 883a5a7beb49195acfef11b1a30ed7bf1b5add5c Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 22:58:48 -0800 Subject: [PATCH 82/85] still cleaning --- promunifi/clients.go | 2 +- promunifi/collector.go | 10 +++++----- promunifi/loops.go | 12 ++++++------ promunifi/site.go | 2 +- promunifi/uap.go | 8 ++++---- promunifi/udm.go | 2 +- promunifi/usg.go | 6 +++--- promunifi/usw.go | 6 +++--- 8 files changed, 24 insertions(+), 24 deletions(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 10c328593..c6d0186f5 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -71,7 +71,7 @@ func descClient(ns string) *uclient { } } -func (u *unifiCollector) exportClient(r report, c *unifi.Client) { +func (u *promUnifi) exportClient(r report, c *unifi.Client) { labels := []string{c.Name, c.Mac, c.SiteName, c.GwName, c.SwName, c.Vlan.Txt, c.IP, c.Oui, c.Network, c.SwPort.Txt, c.ApName, ""} labelW := append([]string{c.RadioName, c.Radio, c.RadioProto, c.Channel.Txt, c.Essid, c.Bssid, c.RadioDescription}, labels...) diff --git a/promunifi/collector.go b/promunifi/collector.go index 6433ce13e..25cfd3705 100644 --- a/promunifi/collector.go +++ b/promunifi/collector.go @@ -33,7 +33,7 @@ type UnifiCollectorCnfg struct { LoggingFn func(*Report) } -type unifiCollector struct { +type promUnifi struct { Config UnifiCollectorCnfg Client *uclient Device *unifiDevice @@ -74,7 +74,7 @@ func NewUnifiCollector(opts UnifiCollectorCnfg) prometheus.Collector { if opts.Namespace = strings.Trim(opts.Namespace, "_") + "_"; opts.Namespace == "_" { opts.Namespace = "" } - return &unifiCollector{ + return &promUnifi{ Config: opts, Client: descClient(opts.Namespace + "client_"), Device: descDevice(opts.Namespace + "device_"), // stats for all device types. @@ -87,7 +87,7 @@ func NewUnifiCollector(opts UnifiCollectorCnfg) prometheus.Collector { // Describe satisfies the prometheus Collector. This returns all of the // metric descriptions that this packages produces. -func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { +func (u *promUnifi) Describe(ch chan<- *prometheus.Desc) { for _, f := range []interface{}{u.Client, u.Device, u.UAP, u.USG, u.USW, u.Site} { v := reflect.Indirect(reflect.ValueOf(f)) // Loop each struct member and send it to the provided channel. @@ -102,7 +102,7 @@ func (u *unifiCollector) Describe(ch chan<- *prometheus.Desc) { // Collect satisfies the prometheus Collector. This runs the input method to get // the current metrics (from another package) then exports them for prometheus. -func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { +func (u *promUnifi) Collect(ch chan<- prometheus.Metric) { var err error r := &Report{cf: u.Config, ch: make(chan []*metric, buffer), Start: time.Now()} defer r.close() @@ -126,7 +126,7 @@ func (u *unifiCollector) Collect(ch chan<- prometheus.Metric) { // This is closely tied to the method above with a sync.WaitGroup. // This method runs in a go routine and exits when the channel closes. -func (u *unifiCollector) exportMetrics(r report, ch chan<- prometheus.Metric) { +func (u *promUnifi) exportMetrics(r report, ch chan<- prometheus.Metric) { descs := make(map[*prometheus.Desc]bool) // used as a counter defer r.report(descs) for newMetrics := range r.channel() { diff --git a/promunifi/loops.go b/promunifi/loops.go index 1e7cd5227..9e086ec31 100644 --- a/promunifi/loops.go +++ b/promunifi/loops.go @@ -4,42 +4,42 @@ package promunifi // Moved them here to consolate clutter from the other files. Also, if these change, // they usually all change at once since they're pretty much the same code. -func (u *unifiCollector) loopSites(r report) { +func (u *promUnifi) loopSites(r report) { defer r.done() for _, s := range r.metrics().Sites { u.exportSite(r, s) } } -func (u *unifiCollector) loopUAPs(r report) { +func (u *promUnifi) loopUAPs(r report) { defer r.done() for _, d := range r.metrics().UAPs { u.exportUAP(r, d) } } -func (u *unifiCollector) loopUDMs(r report) { +func (u *promUnifi) loopUDMs(r report) { defer r.done() for _, d := range r.metrics().UDMs { u.exportUDM(r, d) } } -func (u *unifiCollector) loopUSGs(r report) { +func (u *promUnifi) loopUSGs(r report) { defer r.done() for _, d := range r.metrics().USGs { u.exportUSG(r, d) } } -func (u *unifiCollector) loopUSWs(r report) { +func (u *promUnifi) loopUSWs(r report) { defer r.done() for _, d := range r.metrics().USWs { u.exportUSW(r, d) } } -func (u *unifiCollector) loopClients(r report) { +func (u *promUnifi) loopClients(r report) { defer r.done() for _, c := range r.metrics().Clients { u.exportClient(r, c) diff --git a/promunifi/site.go b/promunifi/site.go index 732485531..0acc3cec8 100644 --- a/promunifi/site.go +++ b/promunifi/site.go @@ -64,7 +64,7 @@ func descSite(ns string) *site { } } -func (u *unifiCollector) exportSite(r report, s *unifi.Site) { +func (u *promUnifi) exportSite(r report, s *unifi.Site) { for _, h := range s.Health { labels := []string{h.Subsystem, h.Status, s.SiteName} switch h.Subsystem { diff --git a/promunifi/uap.go b/promunifi/uap.go index 8a1f0eac8..ed8507df6 100644 --- a/promunifi/uap.go +++ b/promunifi/uap.go @@ -165,7 +165,7 @@ func descUAP(ns string) *uap { } } -func (u *unifiCollector) exportUAP(r report, d *unifi.UAP) { +func (u *promUnifi) exportUAP(r report, d *unifi.UAP) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} // Wireless System Data. r.send([]*metric{ @@ -195,7 +195,7 @@ func (u *unifiCollector) exportUAP(r report, d *unifi.UAP) { u.exportRadtable(r, labels, d.RadioTable, d.RadioTableStats) } -func (u *unifiCollector) exportUAPstats(r report, labels []string, ap *unifi.Ap) { +func (u *promUnifi) exportUAPstats(r report, labels []string, ap *unifi.Ap) { // labelA := append([]string{"all"}, labels[2:]...) labelU := append([]string{"user"}, labels[6:]...) labelG := append([]string{"guest"}, labels[6:]...) @@ -249,7 +249,7 @@ func (u *unifiCollector) exportUAPstats(r report, labels []string, ap *unifi.Ap) }) } -func (u *unifiCollector) exportVAPtable(r report, labels []string, vt unifi.VapTable) { +func (u *promUnifi) exportVAPtable(r report, labels []string, vt unifi.VapTable) { // vap table stats for _, v := range vt { if !v.Up.Val { @@ -299,7 +299,7 @@ func (u *unifiCollector) exportVAPtable(r report, labels []string, vt unifi.VapT } } -func (u *unifiCollector) exportRadtable(r report, labels []string, rt unifi.RadioTable, rts unifi.RadioTableStats) { +func (u *promUnifi) exportRadtable(r report, labels []string, rt unifi.RadioTable, rts unifi.RadioTableStats) { // radio table for _, p := range rt { labelR := append([]string{p.Name, p.Radio}, labels[6:]...) diff --git a/promunifi/udm.go b/promunifi/udm.go index 092065407..9a17b41b3 100644 --- a/promunifi/udm.go +++ b/promunifi/udm.go @@ -68,7 +68,7 @@ func descDevice(ns string) *unifiDevice { } // UDM is a collection of stats from USG, USW and UAP. It has no unique stats. -func (u *unifiCollector) exportUDM(r report, d *unifi.UDM) { +func (u *promUnifi) exportUDM(r report, d *unifi.UDM) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} // Dream Machine System Data. r.send([]*metric{ diff --git a/promunifi/usg.go b/promunifi/usg.go index 8392d4a3f..b87645229 100644 --- a/promunifi/usg.go +++ b/promunifi/usg.go @@ -66,7 +66,7 @@ func descUSG(ns string) *usg { } } -func (u *unifiCollector) exportUSG(r report, d *unifi.USG) { +func (u *promUnifi) exportUSG(r report, d *unifi.USG) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} // Gateway System Data. r.send([]*metric{ @@ -93,7 +93,7 @@ func (u *unifiCollector) exportUSG(r report, d *unifi.USG) { u.exportUSGstats(r, labels, d.Stat.Gw, d.SpeedtestStatus) } -func (u *unifiCollector) exportUSGstats(r report, labels []string, gw *unifi.Gw, st unifi.SpeedtestStatus) { +func (u *promUnifi) exportUSGstats(r report, labels []string, gw *unifi.Gw, st unifi.SpeedtestStatus) { labelLan := []string{"lan", labels[6], labels[7]} labelWan := []string{"all", labels[6], labels[7]} r.send([]*metric{ @@ -118,7 +118,7 @@ func (u *unifiCollector) exportUSGstats(r report, labels []string, gw *unifi.Gw, }) } -func (u *unifiCollector) exportWANPorts(r report, labels []string, wans ...unifi.Wan) { +func (u *promUnifi) exportWANPorts(r report, labels []string, wans ...unifi.Wan) { for _, wan := range wans { if !wan.Up.Val { continue // only record UP interfaces. diff --git a/promunifi/usw.go b/promunifi/usw.go index 2c25271e0..88f7e190e 100644 --- a/promunifi/usw.go +++ b/promunifi/usw.go @@ -90,7 +90,7 @@ func descUSW(ns string) *usw { } } -func (u *unifiCollector) exportUSW(r report, d *unifi.USW) { +func (u *promUnifi) exportUSW(r report, d *unifi.USW) { labels := []string{d.IP, d.Version, d.Model, d.Serial, d.Type, d.Mac, d.SiteName, d.Name} if d.HasTemperature.Val { r.send([]*metric{{u.Device.Temperature, prometheus.GaugeValue, d.GeneralTemperature, labels}}) @@ -122,7 +122,7 @@ func (u *unifiCollector) exportUSW(r report, d *unifi.USW) { u.exportUSWstats(r, labels, d.Stat.Sw) } -func (u *unifiCollector) exportUSWstats(r report, labels []string, sw *unifi.Sw) { +func (u *promUnifi) exportUSWstats(r report, labels []string, sw *unifi.Sw) { labelS := labels[6:] r.send([]*metric{ {u.USW.SwRxPackets, prometheus.CounterValue, sw.RxPackets, labelS}, @@ -144,7 +144,7 @@ func (u *unifiCollector) exportUSWstats(r report, labels []string, sw *unifi.Sw) }) } -func (u *unifiCollector) exportPortTable(r report, labels []string, pt []unifi.Port) { +func (u *promUnifi) exportPortTable(r report, labels []string, pt []unifi.Port) { // Per-port data on a switch for _, p := range pt { if !p.Up.Val { From adb136351a3c30689941f5f41286343ac48ef33d Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 23:03:17 -0800 Subject: [PATCH 83/85] update deps --- Gopkg.lock | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/Gopkg.lock b/Gopkg.lock index 16c41fd80..9bc268e64 100644 --- a/Gopkg.lock +++ b/Gopkg.lock @@ -99,19 +99,19 @@ [[projects]] branch = "master" - digest = "1:19e1afd323e654bc3ca747ce0cb0613353f74273154bc5a4d27e7e6910f7b49b" + digest = "1:68fe4216878f16dd6ef33413365fbbe8d2eb781177c7adab874cfc752ce96a7e" name = "golang.org/x/sys" packages = ["windows"] pruneopts = "UT" - revision = "bd437916bb0eb726b873ee8e9b2dcf212d32e2fd" + revision = "6d18c012aee9febd81bbf9806760c8c4480e870d" [[projects]] - digest = "1:e74d5f03545d51228b9539aaffc5eb8a692fcb22f38fa60253437b1fc063a73b" + digest = "1:0d815236933294be05901215b375de3a7c990abcb769069eccca32a825a15862" name = "golift.io/unifi" packages = ["."] pruneopts = "UT" - revision = "2bdbccee871d4f36a4e1efa3463386ae70095033" - version = "v4.1.3" + revision = "68fa5c1f82da4567d8c192c52397984551cb08b9" + version = "v4.1.4" [[projects]] digest = "1:b75b3deb2bce8bc079e16bb2aecfe01eb80098f5650f9e93e5643ca8b7b73737" From 616365fa8eeb0cbf09eea24b9a2f7415ac2793d5 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 23:17:26 -0800 Subject: [PATCH 84/85] add two more metrics to clients --- promunifi/clients.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/promunifi/clients.go b/promunifi/clients.go index c6d0186f5..2915c4604 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -9,6 +9,7 @@ type uclient struct { Anomalies *prometheus.Desc BytesR *prometheus.Desc CCQ *prometheus.Desc + Satisfaction *prometheus.Desc Noise *prometheus.Desc RoamCount *prometheus.Desc RSSI *prometheus.Desc @@ -20,6 +21,7 @@ type uclient struct { TxBytes *prometheus.Desc TxBytesR *prometheus.Desc TxPackets *prometheus.Desc + TxRetries *prometheus.Desc TxPower *prometheus.Desc TxRate *prometheus.Desc Uptime *prometheus.Desc @@ -45,6 +47,7 @@ func descClient(ns string) *uclient { Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labelW, nil), BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labelW, nil), CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labelW, nil), + Satisfaction: prometheus.NewDesc(ns+"satisfaction_percent", "Client Satisfaction", labelW, nil), Noise: prometheus.NewDesc(ns+"noise_db", "Client AP Noise", labelW, nil), RoamCount: prometheus.NewDesc(ns+"roam_count_total", "Client Roam Counter", labelW, nil), RSSI: prometheus.NewDesc(ns+"rssi_db", "Client RSSI", labelW, nil), @@ -56,6 +59,7 @@ func descClient(ns string) *uclient { TxBytes: prometheus.NewDesc(ns+"transmit_bytes_total", "Client Transmit Bytes", labels, nil), TxBytesR: prometheus.NewDesc(ns+"transmit_rate_bytes", "Client Transmit Data Rate", labels, nil), TxPackets: prometheus.NewDesc(ns+"transmit_packets_total", "Client Transmit Packets", labels, nil), + TxRetries: prometheus.NewDesc(ns+"transmit_retries_total", "Client Transmit Retries", labels, nil), TxPower: prometheus.NewDesc(ns+"radio_transmit_power_dbm", "Client Transmit Power", labelW, nil), TxRate: prometheus.NewDesc(ns+"radio_transmit_rate_bps", "Client Transmit Rate", labelW, nil), WifiTxAttempts: prometheus.NewDesc(ns+"wifi_attempts_transmit_total", "Client Wifi Transmit Attempts", labelW, nil), @@ -92,6 +96,7 @@ func (u *promUnifi) exportClient(r report, c *unifi.Client) { r.send([]*metric{ {u.Client.Anomalies, prometheus.CounterValue, c.Anomalies, labelW}, {u.Client.CCQ, prometheus.GaugeValue, c.Ccq / 10, labelW}, + {u.Client.Satisfaction, prometheus.GaugeValue, c.Satisfaction, labelW}, {u.Client.Noise, prometheus.GaugeValue, c.Noise, labelW}, {u.Client.RoamCount, prometheus.CounterValue, c.RoamCount, labelW}, {u.Client.RSSI, prometheus.GaugeValue, c.Rssi, labelW}, @@ -100,6 +105,7 @@ func (u *promUnifi) exportClient(r report, c *unifi.Client) { {u.Client.TxRate, prometheus.GaugeValue, c.TxRate * 1000, labelW}, {u.Client.WifiTxAttempts, prometheus.CounterValue, c.WifiTxAttempts, labelW}, {u.Client.RxRate, prometheus.GaugeValue, c.RxRate * 1000, labelW}, + {u.Client.TxRetries, prometheus.CounterValue, c.TxRetries, labels}, {u.Client.TxBytes, prometheus.CounterValue, c.TxBytes, labels}, {u.Client.TxBytesR, prometheus.GaugeValue, c.TxBytesR, labels}, {u.Client.TxPackets, prometheus.CounterValue, c.TxPackets, labels}, From 666ecb0f7d2b9e372e7e67b37b10366cd6e9e0e6 Mon Sep 17 00:00:00 2001 From: davidnewhall2 Date: Fri, 29 Nov 2019 23:36:26 -0800 Subject: [PATCH 85/85] one more.. --- promunifi/clients.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/promunifi/clients.go b/promunifi/clients.go index 2915c4604..ac12bdf8c 100644 --- a/promunifi/clients.go +++ b/promunifi/clients.go @@ -44,7 +44,7 @@ func descClient(ns string) *uclient { labels := []string{"name", "mac", "site_name", "gw_name", "sw_name", "vlan", "ip", "oui", "network", "sw_port", "ap_name", "wired"} labelW := append([]string{"radio_name", "radio", "radio_proto", "channel", "essid", "bssid", "radio_desc"}, labels...) return &uclient{ - Anomalies: prometheus.NewDesc(ns+"anomalies_total", "Client Anomalies", labelW, nil), + Anomalies: prometheus.NewDesc(ns+"anomalies", "Client Anomalies", labelW, nil), BytesR: prometheus.NewDesc(ns+"transfer_rate_bytes", "Client Data Rate", labelW, nil), CCQ: prometheus.NewDesc(ns+"ccq_percent", "Client Connection Quality", labelW, nil), Satisfaction: prometheus.NewDesc(ns+"satisfaction_percent", "Client Satisfaction", labelW, nil),