From 592beede143420b3cd8c227dee0ad6dfa72d7e3f Mon Sep 17 00:00:00 2001 From: DN2 Date: Fri, 27 Apr 2018 23:44:18 -0700 Subject: [PATCH 1/7] Allow multiple points per device. --- integrations/influxunifi/.gitignore | 2 ++ integrations/influxunifi/cmd/unifi-poller/main.go | 6 +++--- integrations/influxunifi/unidev/clients.go | 8 ++++---- integrations/influxunifi/unidev/uap.go | 7 ++++--- integrations/influxunifi/unidev/unidev.go | 2 +- integrations/influxunifi/unidev/usg.go | 7 ++++--- integrations/influxunifi/unidev/usw.go | 7 ++++--- 7 files changed, 22 insertions(+), 17 deletions(-) diff --git a/integrations/influxunifi/.gitignore b/integrations/influxunifi/.gitignore index 913e8eb4..2c836bd0 100644 --- a/integrations/influxunifi/.gitignore +++ b/integrations/influxunifi/.gitignore @@ -3,3 +3,5 @@ /*.1.gz /*.1 /vendor +.DS_Store +*~ diff --git a/integrations/influxunifi/cmd/unifi-poller/main.go b/integrations/influxunifi/cmd/unifi-poller/main.go index cdfa86af..d5c92f40 100644 --- a/integrations/influxunifi/cmd/unifi-poller/main.go +++ b/integrations/influxunifi/cmd/unifi-poller/main.go @@ -102,10 +102,10 @@ func (c *Config) PollUnifiController(infdb influx.Client, unifi *unidev.AuthedRe } for _, asset := range append(clients, devices...) { - if pt, errr := asset.Point(); errr != nil { - log.Println("asset.Point():", errr) + if pt, errr := asset.Points(); errr != nil { + log.Println("asset.Points():", errr) } else { - bp.AddPoint(pt) + bp.AddPoints(pt) } } diff --git a/integrations/influxunifi/unidev/clients.go b/integrations/influxunifi/unidev/clients.go index 3e58af58..d156d0c8 100644 --- a/integrations/influxunifi/unidev/clients.go +++ b/integrations/influxunifi/unidev/clients.go @@ -7,8 +7,8 @@ import ( influx "github.com/influxdata/influxdb/client/v2" ) -// Point generates a client's datapoint for InfluxDB. -func (u UCL) Point() (*influx.Point, error) { +// Points generates a client's datapoints for InfluxDB. +func (u UCL) Points() (points []*influx.Point, err error) { if u.Name == "" && u.Hostname != "" { u.Name = u.Hostname } else if u.Hostname == "" && u.Name != "" { @@ -95,6 +95,6 @@ func (u UCL) Point() (*influx.Point, error) { "wired-tx_bytes-r": u.WiredTxBytesR, "wired-tx_packets": u.WiredTxPackets, } - - return influx.NewPoint("clients", tags, fields, time.Now()) + points[0], err = influx.NewPoint("clients", tags, fields, time.Now()) + return } diff --git a/integrations/influxunifi/unidev/uap.go b/integrations/influxunifi/unidev/uap.go index 9e2847c1..2e800c55 100644 --- a/integrations/influxunifi/unidev/uap.go +++ b/integrations/influxunifi/unidev/uap.go @@ -7,8 +7,8 @@ import ( influx "github.com/influxdata/influxdb/client/v2" ) -// Point generates a device's datapoint for InfluxDB. -func (u UAP) Point() (*influx.Point, error) { +// Points generates a device's datapoints for InfluxDB. +func (u UAP) Points() (points []*influx.Point, err error) { tags := map[string]string{ "id": u.ID, "mac": u.Mac, @@ -165,5 +165,6 @@ func (u UAP) Point() (*influx.Point, error) { "stat_wifi1-tx_packets": u.Stat.Wifi1TxPackets, "stat_wifi1-tx_retries": u.Stat.Wifi1TxRetries, } - return influx.NewPoint("uap", tags, fields, time.Now()) + points[0], err = influx.NewPoint("uap", tags, fields, time.Now()) + return } diff --git a/integrations/influxunifi/unidev/unidev.go b/integrations/influxunifi/unidev/unidev.go index 324ab329..5f532fe2 100644 --- a/integrations/influxunifi/unidev/unidev.go +++ b/integrations/influxunifi/unidev/unidev.go @@ -15,7 +15,7 @@ const LoginPath = "/api/login" // Asset provides a common interface to retreive metrics from a device or client. type Asset interface { // Point() means this is useful to influxdb.. - Point() (*influx.Point, error) + Points() ([]*influx.Point, error) // Add more methods to achieve more usefulness from this library. } diff --git a/integrations/influxunifi/unidev/usg.go b/integrations/influxunifi/unidev/usg.go index dbad1a6c..548635ed 100644 --- a/integrations/influxunifi/unidev/usg.go +++ b/integrations/influxunifi/unidev/usg.go @@ -7,8 +7,8 @@ import ( influx "github.com/influxdata/influxdb/client/v2" ) -// Point generates a device's datapoint for InfluxDB. -func (u USG) Point() (*influx.Point, error) { +// Points generates a device's datapoints for InfluxDB. +func (u USG) Points() (points []*influx.Point, err error) { tags := map[string]string{ "id": u.ID, "mac": u.Mac, @@ -117,5 +117,6 @@ func (u USG) Point() (*influx.Point, error) { "wan-tx_bytes": u.Stat.WanTxBytes, "wan-tx_packets": u.Stat.WanTxPackets, } - return influx.NewPoint("usg", tags, fields, time.Now()) + points[0], err = influx.NewPoint("usg", tags, fields, time.Now()) + return } diff --git a/integrations/influxunifi/unidev/usw.go b/integrations/influxunifi/unidev/usw.go index 215bbc43..c6ef9f2a 100644 --- a/integrations/influxunifi/unidev/usw.go +++ b/integrations/influxunifi/unidev/usw.go @@ -7,8 +7,8 @@ import ( influx "github.com/influxdata/influxdb/client/v2" ) -// Point generates a device's datapoint for InfluxDB. -func (u USW) Point() (*influx.Point, error) { +// Points generates a device's datapoints for InfluxDB. +func (u USW) Points() (points []*influx.Point, err error) { tags := map[string]string{ "id": u.ID, "mac": u.Mac, @@ -109,5 +109,6 @@ func (u USW) Point() (*influx.Point, error) { "stat_tx_retries": u.Stat.TxRetries, // Add the port stats too. } - return influx.NewPoint("usw", tags, fields, time.Now()) + points[0], err = influx.NewPoint("usw", tags, fields, time.Now()) + return } From b2923aaf30f1873e9336dc21f1e0234a1ae4dfb7 Mon Sep 17 00:00:00 2001 From: DN2 Date: Sat, 28 Apr 2018 00:21:44 -0700 Subject: [PATCH 2/7] Add two new functions to make the library more useful. --- .../influxunifi/cmd/unifi-poller/main.go | 8 +- integrations/influxunifi/unidev/unidev.go | 3 + integrations/influxunifi/unidev/unifi.go | 87 +++++++++++++------ 3 files changed, 68 insertions(+), 30 deletions(-) diff --git a/integrations/influxunifi/cmd/unifi-poller/main.go b/integrations/influxunifi/cmd/unifi-poller/main.go index d5c92f40..e8adb3b6 100644 --- a/integrations/influxunifi/cmd/unifi-poller/main.go +++ b/integrations/influxunifi/cmd/unifi-poller/main.go @@ -83,14 +83,14 @@ func GetConfig(configFile string) (Config, error) { func (c *Config) PollUnifiController(infdb influx.Client, unifi *unidev.AuthedReq) { ticker := time.NewTicker(c.Interval.value) for range ticker.C { - clients, err := unifi.GetUnifiClients() + clients, err := unifi.GetUnifiClientAssets() if err != nil { - log.Println("unifi.GetUnifiClients():", err) + log.Println("unifi.GetUnifiClientsAssets():", err) continue } - devices, err := unifi.GetUnifiDevices() + devices, err := unifi.GetUnifiDeviceAssets() if err != nil { - log.Println("unifi.GetUnifiDevices():", err) + log.Println("unifi.GetUnifiDeviceAssets():", err) continue } bp, err := influx.NewBatchPoints(influx.BatchPointsConfig{ diff --git a/integrations/influxunifi/unidev/unidev.go b/integrations/influxunifi/unidev/unidev.go index 5f532fe2..7cba8d98 100644 --- a/integrations/influxunifi/unidev/unidev.go +++ b/integrations/influxunifi/unidev/unidev.go @@ -13,6 +13,9 @@ import ( const LoginPath = "/api/login" // Asset provides a common interface to retreive metrics from a device or client. +// It currently only supports InfluxDB, but could be amended to support other +// libraries that have a similar interface. +// This app only uses the .AddPoint/s() methods with the Asset type. type Asset interface { // Point() means this is useful to influxdb.. Points() ([]*influx.Point, error) diff --git a/integrations/influxunifi/unidev/unifi.go b/integrations/influxunifi/unidev/unifi.go index 1cdad897..c7eddaba 100644 --- a/integrations/influxunifi/unidev/unifi.go +++ b/integrations/influxunifi/unidev/unifi.go @@ -21,7 +21,7 @@ const ( ) // GetUnifiClients returns a response full of clients' data from the Unifi Controller. -func (c *AuthedReq) GetUnifiClients() ([]Asset, error) { +func (c *AuthedReq) GetUnifiClients() ([]UCL, error) { var response struct { Clients []UCL `json:"data"` Meta struct { @@ -39,63 +39,98 @@ func (c *AuthedReq) GetUnifiClients() ([]Asset, error) { } else if err = resp.Body.Close(); err != nil { log.Println("resp.Body.Close():", err) // Not fatal? Just log it. } - clients := []Asset{} - for _, r := range response.Clients { - clients = append(clients, r) + return response.Clients, nil +} + +// GetUnifiClientAssets provides an interface to return common asset types. +func (c *AuthedReq) GetUnifiClientAssets() ([]Asset, error) { + clients, err := c.GetUnifiClients() + assets := []Asset{} + if err == nil { + for _, r := range clients { + assets = append(assets, r) + } } - return clients, nil + return assets, err } // GetUnifiDevices returns a response full of devices' data from the Unifi Controller. -func (c *AuthedReq) GetUnifiDevices() ([]Asset, error) { +func (c *AuthedReq) GetUnifiDevices() ([]USG, []USW, []UAP, error) { var parsed struct { Data []json.RawMessage `json:"data"` Meta struct { Rc string `json:"rc"` } `json:"meta"` } - assets := []Asset{} if req, err := c.UniReq(DevicePath, ""); err != nil { - return nil, err + return nil, nil, nil, err } else if resp, err := c.Do(req); err != nil { - return nil, err + return nil, nil, nil, err } else if body, err := ioutil.ReadAll(resp.Body); err != nil { - return nil, err + return nil, nil, nil, err } else if err = json.Unmarshal(body, &parsed); err != nil { - return nil, err + return nil, nil, nil, err } else if err = resp.Body.Close(); err != nil { log.Println("resp.Body.Close():", err) // Not fatal? Just log it. } + var usgs []USG + var usws []USW + var uaps []UAP for _, r := range parsed.Data { + var usg USG + var usw USW + var uap UAP // Unamrshal into a map and check "type" var obj map[string]interface{} if err := json.Unmarshal(r, &obj); err != nil { - return nil, err + return nil, nil, nil, err } - assetType := "" + assetType := "- missing -" if t, ok := obj["type"].(string); ok { assetType = t } + if Debug { + log.Println("Unmarshalling Device Type:", assetType) + } // Unmarshal again into the correct type.. - var asset Asset switch assetType { case "uap": - asset = &UAP{} - case "ugw": - asset = &USG{} + if err := json.Unmarshal(r, uap); err != nil { + return nil, nil, nil, err + } + uaps = append(uaps, uap) + case "ugw", "usg": // in case they ever fix the name in the api. + if err := json.Unmarshal(r, usg); err != nil { + return nil, nil, nil, err + } + usgs = append(usgs, usg) case "usw": - asset = &USW{} + if err := json.Unmarshal(r, usw); err != nil { + return nil, nil, nil, err + } + usws = append(usws, usw) default: log.Println("unknown asset type -", assetType, "- skipping") continue } - if Debug { - log.Println("Unmarshalling", assetType) - } - if err := json.Unmarshal(r, asset); err != nil { - return nil, err - } - assets = append(assets, asset) } - return assets, nil + return usgs, usws, uaps, nil +} + +// GetUnifiDeviceAssets provides an interface to return common asset types. +func (c *AuthedReq) GetUnifiDeviceAssets() ([]Asset, error) { + usgs, usws, uaps, err := c.GetUnifiDevices() + assets := []Asset{} + if err == nil { + for _, r := range usgs { + assets = append(assets, r) + } + for _, r := range usws { + assets = append(assets, r) + } + for _, r := range uaps { + assets = append(assets, r) + } + } + return assets, err } From 5be3e98235bb58e659bec4d54621db68302afcc8 Mon Sep 17 00:00:00 2001 From: DN2 Date: Sat, 28 Apr 2018 01:42:44 -0700 Subject: [PATCH 3/7] Fix pointer mismatch. --- integrations/influxunifi/unidev/clients.go | 10 +++++++--- integrations/influxunifi/unidev/unifi.go | 8 ++++---- integrations/influxunifi/unidev/usg.go | 10 +++++++--- integrations/influxunifi/unidev/usw.go | 10 +++++++--- 4 files changed, 25 insertions(+), 13 deletions(-) diff --git a/integrations/influxunifi/unidev/clients.go b/integrations/influxunifi/unidev/clients.go index d156d0c8..f4694537 100644 --- a/integrations/influxunifi/unidev/clients.go +++ b/integrations/influxunifi/unidev/clients.go @@ -8,7 +8,8 @@ import ( ) // Points generates a client's datapoints for InfluxDB. -func (u UCL) Points() (points []*influx.Point, err error) { +func (u UCL) Points() ([]*influx.Point, error) { + var points []*influx.Point if u.Name == "" && u.Hostname != "" { u.Name = u.Hostname } else if u.Hostname == "" && u.Name != "" { @@ -95,6 +96,9 @@ func (u UCL) Points() (points []*influx.Point, err error) { "wired-tx_bytes-r": u.WiredTxBytesR, "wired-tx_packets": u.WiredTxPackets, } - points[0], err = influx.NewPoint("clients", tags, fields, time.Now()) - return + pt, err := influx.NewPoint("clients", tags, fields, time.Now()) + if err == nil { + points = append(points, pt) + } + return points, err } diff --git a/integrations/influxunifi/unidev/unifi.go b/integrations/influxunifi/unidev/unifi.go index c7eddaba..8239e620 100644 --- a/integrations/influxunifi/unidev/unifi.go +++ b/integrations/influxunifi/unidev/unifi.go @@ -34,7 +34,7 @@ func (c *AuthedReq) GetUnifiClients() ([]UCL, error) { return nil, err } else if body, err := ioutil.ReadAll(resp.Body); err != nil { return nil, err - } else if err = json.Unmarshal(body, response); err != nil { + } else if err = json.Unmarshal(body, &response); err != nil { return nil, err } else if err = resp.Body.Close(); err != nil { log.Println("resp.Body.Close():", err) // Not fatal? Just log it. @@ -95,17 +95,17 @@ func (c *AuthedReq) GetUnifiDevices() ([]USG, []USW, []UAP, error) { // Unmarshal again into the correct type.. switch assetType { case "uap": - if err := json.Unmarshal(r, uap); err != nil { + if err := json.Unmarshal(r, &uap); err != nil { return nil, nil, nil, err } uaps = append(uaps, uap) case "ugw", "usg": // in case they ever fix the name in the api. - if err := json.Unmarshal(r, usg); err != nil { + if err := json.Unmarshal(r, &usg); err != nil { return nil, nil, nil, err } usgs = append(usgs, usg) case "usw": - if err := json.Unmarshal(r, usw); err != nil { + if err := json.Unmarshal(r, &usw); err != nil { return nil, nil, nil, err } usws = append(usws, usw) diff --git a/integrations/influxunifi/unidev/usg.go b/integrations/influxunifi/unidev/usg.go index 548635ed..f904f37c 100644 --- a/integrations/influxunifi/unidev/usg.go +++ b/integrations/influxunifi/unidev/usg.go @@ -8,7 +8,8 @@ import ( ) // Points generates a device's datapoints for InfluxDB. -func (u USG) Points() (points []*influx.Point, err error) { +func (u USG) Points() ([]*influx.Point, error) { + var points []*influx.Point tags := map[string]string{ "id": u.ID, "mac": u.Mac, @@ -117,6 +118,9 @@ func (u USG) Points() (points []*influx.Point, err error) { "wan-tx_bytes": u.Stat.WanTxBytes, "wan-tx_packets": u.Stat.WanTxPackets, } - points[0], err = influx.NewPoint("usg", tags, fields, time.Now()) - return + pt, err := influx.NewPoint("usg", tags, fields, time.Now()) + if err == nil { + points = append(points, pt) + } + return points, err } diff --git a/integrations/influxunifi/unidev/usw.go b/integrations/influxunifi/unidev/usw.go index c6ef9f2a..bbcb1dc1 100644 --- a/integrations/influxunifi/unidev/usw.go +++ b/integrations/influxunifi/unidev/usw.go @@ -8,7 +8,8 @@ import ( ) // Points generates a device's datapoints for InfluxDB. -func (u USW) Points() (points []*influx.Point, err error) { +func (u USW) Points() ([]*influx.Point, error) { + var points []*influx.Point tags := map[string]string{ "id": u.ID, "mac": u.Mac, @@ -109,6 +110,9 @@ func (u USW) Points() (points []*influx.Point, err error) { "stat_tx_retries": u.Stat.TxRetries, // Add the port stats too. } - points[0], err = influx.NewPoint("usw", tags, fields, time.Now()) - return + pt, err := influx.NewPoint("usw", tags, fields, time.Now()) + if err == nil { + points = append(points, pt) + } + return points, err } From 07fc28736a039f52df7117532cb9479ea6ad8573 Mon Sep 17 00:00:00 2001 From: DN2 Date: Sat, 28 Apr 2018 01:59:43 -0700 Subject: [PATCH 4/7] Suck more data out of UAPs. --- integrations/influxunifi/unidev/uap.go | 101 +++++++++++- integrations/influxunifi/unidev/uap_type.go | 172 ++++++++++---------- 2 files changed, 183 insertions(+), 90 deletions(-) diff --git a/integrations/influxunifi/unidev/uap.go b/integrations/influxunifi/unidev/uap.go index 2e800c55..b6c85b57 100644 --- a/integrations/influxunifi/unidev/uap.go +++ b/integrations/influxunifi/unidev/uap.go @@ -8,7 +8,8 @@ import ( ) // Points generates a device's datapoints for InfluxDB. -func (u UAP) Points() (points []*influx.Point, err error) { +func (u UAP) Points() ([]*influx.Point, error) { + var points []*influx.Point tags := map[string]string{ "id": u.ID, "mac": u.Mac, @@ -35,7 +36,7 @@ func (u UAP) Points() (points []*influx.Point, err error) { "has_speaker": strconv.FormatBool(u.HasSpeaker), "inform_ip": u.InformIP, "isolated": strconv.FormatBool(u.Isolated), - "last_seen": strconv.Itoa(u.LastSeen), + "last_seen": strconv.FormatFloat(u.LastSeen, 'f', 6, 64), "last_uplink_mac": u.LastUplink.UplinkMac, "last_uplink_remote_port": strconv.Itoa(u.LastUplink.UplinkRemotePort), "known_cfgversion": u.KnownCfgversion, @@ -165,6 +166,98 @@ func (u UAP) Points() (points []*influx.Point, err error) { "stat_wifi1-tx_packets": u.Stat.Wifi1TxPackets, "stat_wifi1-tx_retries": u.Stat.Wifi1TxRetries, } - points[0], err = influx.NewPoint("uap", tags, fields, time.Now()) - return + pt, err := influx.NewPoint("uap", tags, fields, time.Now()) + if err != nil { + return nil, err + } + points = append(points, pt) + for _, p := range u.RadioTable { + tags := map[string]string{ + "device_name": u.Name, + "device_id": u.ID, + "device_mac": u.Mac, + "name": p.Name, + "wlangroup_id": p.WlangroupID, + "channel": p.Channel, // not the channel # + "radio": p.Radio, + } + fields := map[string]interface{}{ + "builtin_ant_gain": p.BuiltinAntGain, + "current_antenna_gain": p.CurrentAntennaGain, + "has_dfs": p.HasDfs, + "has_fccdfs": p.HasFccdfs, + "ht": p.Ht, + "is_11ac": p.Is11Ac, + "max_txpower": p.MaxTxpower, + "min_rssi_enabled": p.MinRssiEnabled, + "min_txpower": p.MinTxpower, + "nss": p.Nss, + "radio_caps": p.RadioCaps, + "tx_power": p.TxPower, + "tx_power_mode": p.TxPowerMode, + } + + for _, s := range u.RadioTableStats { + // This may be a tad slower but it allows putting + // all the radio stats into one table. + if p.Name == s.Name { + fields["ast_be_xmit"] = s.AstBeXmit + fields["ast_cst"] = s.AstCst + fields["channel"] = s.Channel + fields["ast_txto"] = s.AstTxto + fields["cu_self_rx"] = s.CuSelfRx + fields["cu_self_tx"] = s.CuSelfTx + fields["cu_total"] = s.CuTotal + fields["extchannel"] = s.Extchannel + fields["gain"] = s.Gain + fields["guest-num_sta"] = s.GuestNumSta + fields["num_sta"] = s.NumSta + fields["radio"] = s.Radio + fields["state"] = s.State + fields["radio_tx_packets"] = s.TxPackets + fields["radio_tx_power"] = s.TxPower + fields["radio_tx_retries"] = s.TxRetries + fields["user-num_sta"] = s.UserNumSta + } + } + for _, s := range u.VapTable { + if p.Name == s.RadioName { + tags["ap_mac"] = s.ApMac + tags["bssid"] = s.Bssid + fields["ccq"] = s.Ccq + fields["essid"] = s.Essid + fields["extchannel"] = s.Extchannel + tags["vap_id"] = s.ID + fields["is_guest"] = s.IsGuest + fields["is_wep"] = s.IsWep + fields["mac_filter_rejections"] = s.MacFilterRejections + fields["map_id"] = s.MapID + tags["vap_name"] = s.Name + fields["rx_bytes"] = s.RxBytes + fields["rx_crypts"] = s.RxCrypts + fields["rx_dropped"] = s.RxDropped + fields["rx_errors"] = s.RxErrors + fields["rx_frags"] = s.RxFrags + fields["rx_nwids"] = s.RxNwids + fields["rx_packets"] = s.RxPackets + fields["tx_bytes"] = s.TxBytes + fields["tx_dropped"] = s.TxDropped + fields["tx_errors"] = s.TxErrors + fields["tx_latency_avg"] = s.TxLatencyAvg + fields["tx_latency_max"] = s.TxLatencyMax + fields["tx_latency_min"] = s.TxLatencyMin + fields["tx_packets"] = s.TxPackets + fields["tx_power"] = s.TxPower + fields["tx_retries"] = s.TxRetries + fields["usage"] = s.Usage + tags["wlanconf_id"] = s.WlanconfID + } + } + pt, err := influx.NewPoint("uap_radios", tags, fields, time.Now()) + if err != nil { + return points, err + } + points = append(points, pt) + } + return points, nil } diff --git a/integrations/influxunifi/unidev/uap_type.go b/integrations/influxunifi/unidev/uap_type.go index d2f6a55a..4f3b0771 100644 --- a/integrations/influxunifi/unidev/uap_type.go +++ b/integrations/influxunifi/unidev/uap_type.go @@ -36,17 +36,17 @@ type UAP struct { Name string `json:"name"` NumPort float64 `json:"num_port"` } `json:"ethernet_table"` - FwCaps int `json:"fw_caps"` - GuestNumSta int `json:"guest-num_sta"` - GuestToken string `json:"guest_token"` - HasEth1 bool `json:"has_eth1"` - HasSpeaker bool `json:"has_speaker"` - InformIP string `json:"inform_ip"` - InformURL string `json:"inform_url"` - IP string `json:"ip"` - Isolated bool `json:"isolated"` - KnownCfgversion string `json:"known_cfgversion"` - LastSeen int `json:"last_seen"` + FwCaps int `json:"fw_caps"` + GuestNumSta int `json:"guest-num_sta"` + GuestToken string `json:"guest_token"` + HasEth1 bool `json:"has_eth1"` + HasSpeaker bool `json:"has_speaker"` + InformIP string `json:"inform_ip"` + InformURL string `json:"inform_url"` + IP string `json:"ip"` + Isolated bool `json:"isolated"` + KnownCfgversion string `json:"known_cfgversion"` + LastSeen float64 `json:"last_seen"` LastUplink struct { UplinkMac string `json:"uplink_mac"` UplinkRemotePort int `json:"uplink_remote_port"` @@ -132,28 +132,28 @@ type UAP struct { Is11Ac bool `json:"is_11ac,omitempty"` } `json:"radio_table"` RadioTableStats []struct { - AstBeXmit interface{} `json:"ast_be_xmit"` - AstCst interface{} `json:"ast_cst"` - AstTxto interface{} `json:"ast_txto"` - Channel float64 `json:"channel"` - CuSelfRx float64 `json:"cu_self_rx"` - CuSelfTx float64 `json:"cu_self_tx"` - CuTotal float64 `json:"cu_total"` - Extchannel float64 `json:"extchannel"` - Gain float64 `json:"gain"` - GuestNumSta float64 `json:"guest-num_sta"` - Name string `json:"name"` - NumSta float64 `json:"num_sta"` - Radio string `json:"radio"` - State string `json:"state"` - TxPackets float64 `json:"tx_packets"` - TxPower float64 `json:"tx_power"` - TxRetries float64 `json:"tx_retries"` - UserNumSta float64 `json:"user-num_sta"` + AstBeXmit float64 `json:"ast_be_xmit"` + AstCst float64 `json:"ast_cst"` + AstTxto float64 `json:"ast_txto"` + Channel float64 `json:"channel"` + CuSelfRx float64 `json:"cu_self_rx"` + CuSelfTx float64 `json:"cu_self_tx"` + CuTotal float64 `json:"cu_total"` + Extchannel float64 `json:"extchannel"` + Gain float64 `json:"gain"` + GuestNumSta float64 `json:"guest-num_sta"` + Name string `json:"name"` + NumSta float64 `json:"num_sta"` + Radio string `json:"radio"` + State string `json:"state"` + TxPackets float64 `json:"tx_packets"` + TxPower float64 `json:"tx_power"` + TxRetries float64 `json:"tx_retries"` + UserNumSta float64 `json:"user-num_sta"` } `json:"radio_table_stats"` Rollupgrade bool `json:"rollupgrade"` - RxBytes int `json:"rx_bytes"` - RxBytesD int `json:"rx_bytes-d"` + RxBytes float64 `json:"rx_bytes"` + RxBytesD float64 `json:"rx_bytes-d"` ScanRadioTable []interface{} `json:"scan_radio_table"` Scanning bool `json:"scanning"` Serial string `json:"serial"` @@ -257,12 +257,12 @@ type UAP struct { } `json:"stat"` State int `json:"state"` SysStats struct { - Loadavg1 string `json:"loadavg_1"` - Loadavg15 string `json:"loadavg_15"` - Loadavg5 string `json:"loadavg_5"` - MemBuffer int `json:"mem_buffer"` - MemTotal int `json:"mem_total"` - MemUsed int `json:"mem_used"` + Loadavg1 string `json:"loadavg_1"` + Loadavg15 string `json:"loadavg_15"` + Loadavg5 string `json:"loadavg_5"` + MemBuffer float64 `json:"mem_buffer"` + MemTotal float64 `json:"mem_total"` + MemUsed float64 `json:"mem_used"` } `json:"sys_stats"` SystemStats struct { CPU string `json:"cpu"` @@ -270,7 +270,7 @@ type UAP struct { Uptime string `json:"uptime"` } `json:"system-stats"` TxBytes float64 `json:"tx_bytes"` - TxBytesD int `json:"tx_bytes-d"` + TxBytesD float64 `json:"tx_bytes-d"` Type string `json:"type"` Upgradable bool `json:"upgradable"` Uplink struct { @@ -284,63 +284,63 @@ type UAP struct { Netmask string `json:"netmask"` NumPort int `json:"num_port"` RxBytes float64 `json:"rx_bytes"` - RxBytesR int `json:"rx_bytes-r"` - RxDropped int `json:"rx_dropped"` - RxErrors int `json:"rx_errors"` - RxMulticast int `json:"rx_multicast"` - RxPackets int `json:"rx_packets"` - Speed int `json:"speed"` + RxBytesR float64 `json:"rx_bytes-r"` + RxDropped float64 `json:"rx_dropped"` + RxErrors float64 `json:"rx_errors"` + RxMulticast float64 `json:"rx_multicast"` + RxPackets float64 `json:"rx_packets"` + Speed float64 `json:"speed"` TxBytes float64 `json:"tx_bytes"` - TxBytesR int `json:"tx_bytes-r"` - TxDropped int `json:"tx_dropped"` - TxErrors int `json:"tx_errors"` - TxPackets int `json:"tx_packets"` + TxBytesR float64 `json:"tx_bytes-r"` + TxDropped float64 `json:"tx_dropped"` + TxErrors float64 `json:"tx_errors"` + TxPackets float64 `json:"tx_packets"` Type string `json:"type"` Up bool `json:"up"` UplinkMac string `json:"uplink_mac"` UplinkRemotePort int `json:"uplink_remote_port"` } `json:"uplink"` UplinkTable []interface{} `json:"uplink_table"` - Uptime int `json:"uptime"` + Uptime float64 `json:"uptime"` UserNumSta int `json:"user-num_sta"` VapTable []struct { - ApMac string `json:"ap_mac"` - Bssid string `json:"bssid"` - Ccq int `json:"ccq"` - Channel int `json:"channel"` - Essid string `json:"essid"` - Extchannel int `json:"extchannel"` - ID string `json:"id"` - IsGuest bool `json:"is_guest"` - IsWep bool `json:"is_wep"` - MacFilterRejections int `json:"mac_filter_rejections"` - MapID interface{} `json:"map_id"` - Name string `json:"name"` - NumSta int `json:"num_sta"` - Radio string `json:"radio"` - RadioName string `json:"radio_name"` - RxBytes int `json:"rx_bytes"` - RxCrypts int `json:"rx_crypts"` - RxDropped int `json:"rx_dropped"` - RxErrors int `json:"rx_errors"` - RxFrags int `json:"rx_frags"` - RxNwids int `json:"rx_nwids"` - RxPackets int `json:"rx_packets"` - SiteID string `json:"site_id"` - State string `json:"state"` - T string `json:"t"` - TxBytes int `json:"tx_bytes"` - TxDropped int `json:"tx_dropped"` - TxErrors int `json:"tx_errors"` - TxLatencyAvg float64 `json:"tx_latency_avg"` - TxLatencyMax float64 `json:"tx_latency_max"` - TxLatencyMin float64 `json:"tx_latency_min"` - TxPackets int `json:"tx_packets"` - TxPower int `json:"tx_power"` - TxRetries int `json:"tx_retries"` - Up bool `json:"up"` - Usage string `json:"usage"` - WlanconfID string `json:"wlanconf_id"` + ApMac string `json:"ap_mac"` + Bssid string `json:"bssid"` + Ccq int `json:"ccq"` + Channel int `json:"channel"` + Essid string `json:"essid"` + Extchannel int `json:"extchannel"` + ID string `json:"id"` + IsGuest bool `json:"is_guest"` + IsWep bool `json:"is_wep"` + MacFilterRejections int `json:"mac_filter_rejections"` + MapID string `json:"map_id"` + Name string `json:"name"` + NumSta int `json:"num_sta"` + Radio string `json:"radio"` + RadioName string `json:"radio_name"` + RxBytes float64 `json:"rx_bytes"` + RxCrypts float64 `json:"rx_crypts"` + RxDropped float64 `json:"rx_dropped"` + RxErrors float64 `json:"rx_errors"` + RxFrags float64 `json:"rx_frags"` + RxNwids float64 `json:"rx_nwids"` + RxPackets float64 `json:"rx_packets"` + SiteID string `json:"site_id"` + State string `json:"state"` + T string `json:"t"` + TxBytes float64 `json:"tx_bytes"` + TxDropped float64 `json:"tx_dropped"` + TxErrors float64 `json:"tx_errors"` + TxLatencyAvg float64 `json:"tx_latency_avg"` + TxLatencyMax float64 `json:"tx_latency_max"` + TxLatencyMin float64 `json:"tx_latency_min"` + TxPackets float64 `json:"tx_packets"` + TxPower int `json:"tx_power"` + TxRetries int `json:"tx_retries"` + Up bool `json:"up"` + Usage string `json:"usage"` + WlanconfID string `json:"wlanconf_id"` } `json:"vap_table"` Version string `json:"version"` VersionIncompatible bool `json:"version_incompatible"` From 39b9d7d0bef8afdce36ba3d84e0f94ee5cc609f5 Mon Sep 17 00:00:00 2001 From: DN2 Date: Sat, 28 Apr 2018 03:43:44 -0700 Subject: [PATCH 5/7] Missed used memory. --- integrations/influxunifi/unidev/uap.go | 1 + 1 file changed, 1 insertion(+) diff --git a/integrations/influxunifi/unidev/uap.go b/integrations/influxunifi/unidev/uap.go index b6c85b57..64a8d123 100644 --- a/integrations/influxunifi/unidev/uap.go +++ b/integrations/influxunifi/unidev/uap.go @@ -75,6 +75,7 @@ func (u UAP) Points() ([]*influx.Point, error) { "loadavg_15": u.SysStats.Loadavg15, "mem_buffer": u.SysStats.MemBuffer, "mem_total": u.SysStats.MemTotal, + "mem_used": u.SysStats.MemUsed, "cpu": u.SystemStats.CPU, "mem": u.SystemStats.Mem, "system_uptime": u.SystemStats.Uptime, From d7c736f2abab49e4d091e2eff3a4d438c63c55d9 Mon Sep 17 00:00:00 2001 From: DN2 Date: Sat, 28 Apr 2018 17:23:53 -0700 Subject: [PATCH 6/7] Fix a couple more odd string->float types and add docs/dashboard --- integrations/influxunifi/README.md | 100 +- .../influxunifi/grafana-dashboards/README.md | 5 + .../unifi-clients-grafana-dash.json} | 0 .../unifi-uap-grafana-dash.json | 3577 +++++++++++++++++ .../unifi-clients-dashboard.png} | Bin .../images/unifi-uap-dashboard.png | Bin 0 -> 143996 bytes integrations/influxunifi/unidev/uap.go | 3 + integrations/influxunifi/unidev/uap_type.go | 19 +- 8 files changed, 3693 insertions(+), 11 deletions(-) create mode 100644 integrations/influxunifi/grafana-dashboards/README.md rename integrations/influxunifi/{unifi-poller-grafana-dashboard.json => grafana-dashboards/unifi-clients-grafana-dash.json} (100%) create mode 100644 integrations/influxunifi/grafana-dashboards/unifi-uap-grafana-dash.json rename integrations/influxunifi/{grafana-unifi-dashboard.png => images/unifi-clients-dashboard.png} (100%) create mode 100644 integrations/influxunifi/images/unifi-uap-dashboard.png diff --git a/integrations/influxunifi/README.md b/integrations/influxunifi/README.md index 8e850026..7981c6e9 100644 --- a/integrations/influxunifi/README.md +++ b/integrations/influxunifi/README.md @@ -1,12 +1,104 @@ # Unifi -Collect your Unifi Controller Client data and send it to an InfluxDB instance. Grafana dashboard included. - -![image](https://raw.githubusercontent.com/davidnewhall/unifi/master/grafana-unifi-dashboard.png) +Collect your Unifi Controller Data and send it to an InfluxDB instance. +Grafana dashboards included. ## Installation [See the Wiki!](https://github.com/davidnewhall/unifi-poller/wiki/Installation) +# Backstory + +Okay, so here's the deal. I found a simple piece of code on github that +sorta did what I needed; we all know that story. I wanted more data, so +I added more data collection. I believe I've completely rewritten every +piece of original code, except the copyright/license file and that's fine +by me. I probably wouldn't have made it this far if +[Garrett](https://github.com/dewski/unifi) hadn't written the original +code I started with. Many props my man. + +The original code pulled only the client data. This app now pulls data +for clients, access points, security gateways and switches. I currently +own two UAP-AC-PROs, one USG-3 and one US-24-250W. If your devices differ +this app may miss some data. I'm willing to help and make it better. +Open an [Issue](https://github.com/davidnewhall/unifi-poller/issues) and +we'll figure out how to get things working for you. + +# What's this data good for? + +I've been trying to get my UAP data into Grafana. Sure, google search that. +You'll find [this](https://community.ubnt.com/t5/UniFi-Wireless/Grafana-dashboard-for-UniFi-APs-now-available/td-p/1833532). +And that's all you'll find. What if you don't want to deal with SNMP? +Well, here you go. I've replicated 90% of what you see on those SNMP-powered +dashboards with this Go app running on the same mac as my Unifi controller. +All without enabling SNMP nor trying to understand those OIDs. Mad props +to [waterside](https://community.ubnt.com/t5/user/viewprofilepage/user-id/303058) +for making this dashboard; it gave me a fantastic start to making my own. + +# What now... + +- I probably suck at InfluxDB. + +I don't know what should be a tag and what should be a field. I think +I did my best, but there's certainly room for improvements in both +the data input and the Grafana graphs (output). + + +- The USW and USG code needs love. + +Up to this point, my focus has been on UAP. I have only included dashboards +that focus on UAP. I am still working on the other two, but it may be a while +before I get around to publishing them. Help is appreciated. + + +- Are there other devices that need to be included? + +I have: switch, router, access point. Three total, and the type structs are +likely missing data for variants of these devices. e.g. Some UAPs have more +radios, I probably didn't properly account for that. Some gateways have more +ports, some switches have 10Gb, etc. These are things I do not have data on +to write code for. If you have these devices, and want them graphed, open an +Issue and lets discuss. + + +- Better Installation instructions. + +If you're a nerd you can probably figure it out. I'd still like some pretty +pictures and maybe even a Twitch VOD. + + +- Sanity Checking + +Did I actually graph the right data in the right way? Some validation would +be nice. + + +- Radios, Frequencies, Interfaces, vAPs + +My access points only seem to have two radios, one interface and vAP per radio. +I'm not sure if the graphs, as-is, provide enough insight into APs with other +configurations. Help me figure that out? + +# What's it look like? + +Here's a picture of the Client dashboard. + +![image](images/unifi-clients-dashboard.png?raw=true) + +Here's a picture of the UAP dashboard. This only shows one device, but you can +select multiple to put specific stats side-by-side. + +![image](images/unifi-uap-dashboard.png?raw=true) + +# Woah, there's a library in here. + +Sure is. If you want to write your own code around unifi data, you can import +the `unidev` library and easily poll your controller. If you have interest in +how to use the library, or need more features, open an Issue. I'm not committed +to documenting it unless it seems useful. + + ## Copyright & License -Copyright © 2016 Garrett Bjerkhoel. See [MIT-LICENSE](MIT-LICENSE) for details. +- Copyright © 2016 Garrett Bjerkhoel. +- Copyright © 2018 David Newhall II. +- See [MIT-LICENSE](MIT-LICENSE) for license information. diff --git a/integrations/influxunifi/grafana-dashboards/README.md b/integrations/influxunifi/grafana-dashboards/README.md new file mode 100644 index 00000000..565178b7 --- /dev/null +++ b/integrations/influxunifi/grafana-dashboards/README.md @@ -0,0 +1,5 @@ +# Grafana Dashboards + +Import these into Grafana to quickly visualize data from your devices. + +They may/do use a few plugins: Clock, Discrete, Singlestat, Table diff --git a/integrations/influxunifi/unifi-poller-grafana-dashboard.json b/integrations/influxunifi/grafana-dashboards/unifi-clients-grafana-dash.json similarity index 100% rename from integrations/influxunifi/unifi-poller-grafana-dashboard.json rename to integrations/influxunifi/grafana-dashboards/unifi-clients-grafana-dash.json diff --git a/integrations/influxunifi/grafana-dashboards/unifi-uap-grafana-dash.json b/integrations/influxunifi/grafana-dashboards/unifi-uap-grafana-dash.json new file mode 100644 index 00000000..3fdf2626 --- /dev/null +++ b/integrations/influxunifi/grafana-dashboards/unifi-uap-grafana-dash.json @@ -0,0 +1,3577 @@ +{ + "__inputs": [ + { + "name": "DS_UNIFI", + "label": "Unifi", + "description": "", + "type": "datasource", + "pluginId": "influxdb", + "pluginName": "InfluxDB" + } + ], + "__requires": [ + { + "type": "grafana", + "id": "grafana", + "name": "Grafana", + "version": "5.0.4" + }, + { + "type": "panel", + "id": "grafana-clock-panel", + "name": "Clock", + "version": "0.0.9" + }, + { + "type": "panel", + "id": "graph", + "name": "Graph", + "version": "5.0.0" + }, + { + "type": "datasource", + "id": "influxdb", + "name": "InfluxDB", + "version": "5.0.0" + }, + { + "type": "panel", + "id": "singlestat", + "name": "Singlestat", + "version": "5.0.0" + }, + { + "type": "panel", + "id": "table", + "name": "Table", + "version": "5.0.0" + }, + { + "type": "panel", + "id": "text", + "name": "Text", + "version": "5.0.0" + } + ], + "annotations": { + "list": [ + { + "builtIn": 1, + "datasource": "-- Grafana --", + "enable": true, + "hide": true, + "iconColor": "rgba(0, 211, 255, 1)", + "name": "Annotations & Alerts", + "type": "dashboard" + } + ] + }, + "description": "", + "editable": true, + "gnetId": 1486, + "graphTooltip": 1, + "id": null, + "iteration": 1524957396402, + "links": [], + "panels": [ + { + "columns": [], + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "fontSize": "100%", + "gridPos": { + "h": 6, + "w": 21, + "x": 0, + "y": 0 + }, + "id": 1, + "isNew": true, + "links": [], + "pageSize": null, + "scroll": false, + "showHeader": true, + "sort": { + "col": 11, + "desc": true + }, + "styles": [ + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "Time", + "thresholds": [], + "type": "hidden", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "Uptime", + "thresholds": [], + "type": "number", + "unit": "dtdurations" + }, + { + "alias": "Name", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "link": false, + "linkTargetBlank": true, + "linkUrl": "http:", + "pattern": "name", + "preserveFormat": false, + "sanitize": false, + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Config Version", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "cfgversion", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Board Rev", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "board_rev", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Model", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "model", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Device MAC", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "device_ap", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Unifi Serial #", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "serial", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "Site ID", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "site_id", + "thresholds": [], + "type": "hidden", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "Version", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 1, + "pattern": "Last Seen", + "sanitize": true, + "thresholds": [], + "type": "number", + "unit": "dateTimeAsUS" + }, + { + "alias": "Bandsteering Mode", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 2, + "pattern": "bandsteering_mode", + "thresholds": [], + "type": "string", + "unit": "short" + }, + { + "alias": "", + "colorMode": null, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "dateFormat": "YYYY-MM-DD HH:mm:ss", + "decimals": 1, + "pattern": "CPU", + "thresholds": [], + "type": "number", + "unit": "percent" + } + ], + "targets": [ + { + "alias": "$col", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "name" + ], + "type": "tag" + }, + { + "params": [ + "model" + ], + "type": "tag" + }, + { + "params": [ + "cfgversion" + ], + "type": "tag" + }, + { + "params": [ + "board_rev" + ], + "type": "tag" + }, + { + "params": [ + "serial" + ], + "type": "tag" + }, + { + "params": [ + "site_id" + ], + "type": "tag" + }, + { + "params": [ + "bandsteering_mode" + ], + "type": "tag" + }, + { + "params": [ + "device_ap" + ], + "type": "tag" + } + ], + "measurement": "uap", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "table", + "select": [ + [ + { + "params": [ + "version" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "Version" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "ip" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "IP" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "uptime" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "Uptime" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "last_seen" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "*1000" + ], + "type": "math" + }, + { + "params": [ + "Last Seen" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "cpu" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "CPU" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "name", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "timeFrom": null, + "title": "AP Details", + "transform": "table", + "transparent": false, + "type": "table" + }, + { + "content": "
\n
Unifi UAP
\n", + "gridPos": { + "h": 3, + "w": 3, + "x": 21, + "y": 0 + }, + "id": 34, + "links": [], + "mode": "html", + "title": "", + "transparent": true, + "type": "text" + }, + { + "bgColor": "#3f2b5b", + "clockType": "12 hour", + "countdownSettings": { + "endCountdownTime": "2018-04-29T21:47:00.000Z", + "endText": "00:00:00" + }, + "dateSettings": { + "dateFormat": "YYYY-MM-DD", + "fontSize": "12px", + "fontWeight": "bold", + "showDate": true + }, + "gridPos": { + "h": 3, + "w": 3, + "x": 21, + "y": 3 + }, + "id": 32, + "links": [], + "mode": "time", + "offsetFromUtc": null, + "offsetFromUtcMinutes": null, + "timeSettings": { + "customFormat": "HH:mm:ss", + "fontSize": "30px", + "fontWeight": "normal" + }, + "title": "Now", + "type": "grafana-clock-panel" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 0, + "y": 6 + }, + "height": "", + "id": 9, + "interval": null, + "isNew": true, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "device_name", + "targets": [ + { + "alias": "", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "device_name" + ], + "type": "tag" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "query": "SELECT \"channel\" FROM \"uap_radios\" WHERE (\"device_name\" =~ /^$host$/ AND \"radio\" = 'na') AND $timeFilter GROUP BY \"device_name\"", + "rawQuery": false, + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "channel" + ], + "type": "field" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "na" + } + ] + } + ], + "thresholds": "", + "title": "5GHz Radio Channel", + "transparent": false, + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 25, + "minValue": 6, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": false + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 4, + "y": 6 + }, + "id": 11, + "interval": null, + "isNew": true, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": " dBm", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 120, 193, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "device_name" + ], + "type": "tag" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tx_power" + ], + "type": "field" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "na" + } + ] + } + ], + "thresholds": "10,18", + "title": "5Ghz Radio Tx Power", + "transparent": false, + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": true, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "${DS_UNIFI}", + "decimals": 1, + "format": "percent", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": true, + "thresholdLabels": true, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 8, + "y": 6 + }, + "hideTimeOverride": true, + "id": 30, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "system_uptime", + "targets": [ + { + "groupBy": [ + { + "params": [ + "name" + ], + "type": "tag" + } + ], + "measurement": "uap", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "cpu" + ], + "type": "field" + } + ] + ], + "tags": [ + { + "key": "name", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": "40,70", + "timeFrom": "1h", + "title": "CPU Usage", + "type": "singlestat", + "valueFontSize": "70%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "#299c46", + "rgba(237, 129, 40, 0.89)", + "#d44a3a" + ], + "datasource": "${DS_UNIFI}", + "decimals": 3, + "format": "dtdurations", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 12, + "y": 6 + }, + "id": 29, + "interval": null, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "system_uptime", + "targets": [ + { + "groupBy": [ + { + "params": [ + "name" + ], + "type": "tag" + } + ], + "measurement": "uap", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "uptime" + ], + "type": "field" + } + ] + ], + "tags": [ + { + "key": "name", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": "", + "title": "System Uptime", + "type": "singlestat", + "valueFontSize": "70%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 25, + "minValue": 6, + "show": true, + "thresholdLabels": false, + "thresholdMarkers": false + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 16, + "y": 6 + }, + "id": 12, + "interval": null, + "isNew": true, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": " dBm", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "device_name" + ], + "type": "tag" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "tx_power" + ], + "type": "field" + } + ] + ], + "tags": [ + { + "key": "radio", + "operator": "=", + "value": "ng" + }, + { + "condition": "AND", + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": "10,18", + "title": "2.4GHz Radio Tx Power", + "transparent": false, + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [ + { + "op": "=", + "text": "N/A", + "value": "null" + } + ], + "valueName": "current" + }, + { + "cacheTimeout": null, + "colorBackground": false, + "colorValue": false, + "colors": [ + "rgba(245, 54, 54, 0.9)", + "rgba(237, 129, 40, 0.89)", + "rgba(50, 172, 45, 0.97)" + ], + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "format": "none", + "gauge": { + "maxValue": 100, + "minValue": 0, + "show": false, + "thresholdLabels": false, + "thresholdMarkers": true + }, + "gridPos": { + "h": 4, + "w": 4, + "x": 20, + "y": 6 + }, + "id": 10, + "interval": null, + "isNew": true, + "links": [], + "mappingType": 1, + "mappingTypes": [ + { + "name": "value to text", + "value": 1 + }, + { + "name": "range to text", + "value": 2 + } + ], + "maxDataPoints": 100, + "nullPointMode": "connected", + "nullText": null, + "postfix": "", + "postfixFontSize": "50%", + "prefix": "", + "prefixFontSize": "50%", + "rangeMaps": [ + { + "from": "null", + "text": "N/A", + "to": "null" + } + ], + "sparkline": { + "fillColor": "rgba(31, 118, 189, 0.18)", + "full": false, + "lineColor": "rgb(31, 120, 193)", + "show": false + }, + "tableColumn": "", + "targets": [ + { + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "device_name" + ], + "type": "tag" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "channel" + ], + "type": "field" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "ng" + } + ] + } + ], + "thresholds": "", + "title": "2.4GHz Radio Channel", + "transparent": false, + "type": "singlestat", + "valueFontSize": "80%", + "valueMaps": [], + "valueName": "current" + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "fill": 0, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 10 + }, + "id": 3, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": true, + "show": true, + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_name $col", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "name" + ], + "type": "tag" + } + ], + "measurement": "uap", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "loadavg_1" + ], + "type": "field" + }, + { + "params": [ + "load 1" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "loadavg_5" + ], + "type": "field" + }, + { + "params": [ + "laid 5" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "loadavg_15" + ], + "type": "field" + }, + { + "params": [ + "load15" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "name", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Load Average", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 10 + }, + "id": 7, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 2, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_name $col", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "name" + ], + "type": "tag" + } + ], + "measurement": "uap", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "mem_buffer" + ], + "type": "field" + }, + { + "params": [ + "Buffer" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "mem_used" + ], + "type": "field" + }, + { + "params": [ + "Used" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "mem_total" + ], + "type": "field" + }, + { + "params": [ + "Total" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "name", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Memory", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "decbytes", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 8, + "w": 12, + "x": 0, + "y": 18 + }, + "id": 18, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device_name", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "device_name" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "ccq" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + " / 10" + ], + "type": "math" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Client Connection Quality", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "decimals": 0, + "editable": true, + "error": false, + "fill": 2, + "gridPos": { + "h": 8, + "w": 12, + "x": 12, + "y": 18 + }, + "id": 19, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "hideEmpty": true, + "hideZero": true, + "max": true, + "min": true, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": true, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device_name 5GHz", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "device_name" + ], + "type": "tag" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "num_sta" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "na" + } + ] + }, + { + "alias": "$tag_device_name 2.4GHz", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$__interval" + ], + "type": "time" + }, + { + "params": [ + "device_name" + ], + "type": "tag" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "B", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "num_sta" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "ng" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "Clients", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 2, + "value_type": "individual" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "none", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "fill": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 26 + }, + "id": 8, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 3, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device_name:$col", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "device_name" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "cu_self_rx" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "Rx" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "cu_self_tx" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "Tx" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "cu_total" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "Total" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "na" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "5 GHz Channel Utilization", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 1, + "format": "percent", + "label": null, + "logBase": 1, + "max": null, + "min": "0", + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "fill": 0, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 26 + }, + "id": 27, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 3, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device_name:$col", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "$interval" + ], + "type": "time" + }, + { + "params": [ + "device_name" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "cu_self_rx" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "Rx" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "cu_self_tx" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "Tx" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "cu_total" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "Total" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "ng" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "2.4GHz Channel Utilization", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "percent", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 33 + }, + "id": 20, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/:Rx$/", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device_name:$col", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "30s" + ], + "type": "time" + }, + { + "params": [ + "device_name" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "rx_bytes" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "*8" + ], + "type": "math" + }, + { + "params": [ + "Rx" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "tx_bytes" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "*8" + ], + "type": "math" + }, + { + "params": [ + "Tx" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "na" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "5 GHz Traffic", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "pps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 33 + }, + "id": 24, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "current", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/:Rx$/", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device_name:$col", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "30s" + ], + "type": "time" + }, + { + "params": [ + "device_name" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "rx_bytes" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "*8" + ], + "type": "math" + }, + { + "params": [ + "Rx" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "tx_bytes" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "*8" + ], + "type": "math" + }, + { + "params": [ + "Tx" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "ng" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "2.4GHz Traffic", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "format": "bps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "pps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "decimals": 0, + "description": "PPS on the na band calculated in 30 second buckets.", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 40 + }, + "id": 22, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/:In$/", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device_name:$col", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "30s" + ], + "type": "time" + }, + { + "params": [ + "device_name" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "rx_packets" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "In" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "tx_packets" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "Out" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "na" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "5 GHz Packets", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 1, + "format": "pps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "pps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "decimals": 0, + "description": "PPS on the ng band calculated in 30 second buckets.", + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 40 + }, + "id": 25, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "max", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/:In$/", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device_name:$col", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "30s" + ], + "type": "time" + }, + { + "params": [ + "device_name" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "rx_packets" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "In" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "tx_packets" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "Out" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "ng" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "2.4GHz Packets", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 2, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 1, + "format": "pps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "pps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "decimals": 0, + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 0, + "y": 47 + }, + "id": 21, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": "max", + "sortDesc": true, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/:In$/", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device_name:$col", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "30s" + ], + "type": "time" + }, + { + "params": [ + "radio" + ], + "type": "tag" + }, + { + "params": [ + "device_name" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "rx_dropped" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "Drop:In" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "tx_dropped" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "Drop:Out" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "rx_errors" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "Error:In" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "tx_errors" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "Error:Out" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "rx_crypts" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "BadCrypt:In" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "rx_frags" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "BadFrag:In" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "tx_retries" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "ExsRetry:Out" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "na" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "5GHz Drops/Errors", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 1, + "format": "pps", + "label": "", + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + }, + { + "aliasColors": {}, + "bars": false, + "dashLength": 10, + "dashes": false, + "datasource": "${DS_UNIFI}", + "decimals": 0, + "editable": true, + "error": false, + "fill": 1, + "gridPos": { + "h": 7, + "w": 12, + "x": 12, + "y": 47 + }, + "id": 26, + "isNew": true, + "legend": { + "alignAsTable": true, + "avg": false, + "current": true, + "max": true, + "min": false, + "rightSide": true, + "show": true, + "sort": null, + "sortDesc": null, + "total": false, + "values": true + }, + "lines": true, + "linewidth": 1, + "links": [], + "nullPointMode": "connected", + "percentage": false, + "pointradius": 5, + "points": false, + "renderer": "flot", + "seriesOverrides": [ + { + "alias": "/:In$/", + "transform": "negative-Y" + } + ], + "spaceLength": 10, + "stack": false, + "steppedLine": false, + "targets": [ + { + "alias": "$tag_device_name:$col", + "dsType": "influxdb", + "groupBy": [ + { + "params": [ + "30s" + ], + "type": "time" + }, + { + "params": [ + "device_name" + ], + "type": "tag" + }, + { + "params": [ + "null" + ], + "type": "fill" + } + ], + "measurement": "uap_radios", + "orderByTime": "ASC", + "policy": "default", + "refId": "A", + "resultFormat": "time_series", + "select": [ + [ + { + "params": [ + "rx_dropped" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "Drop:In" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "tx_dropped" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "Drop:Out" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "rx_errors" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "Error:In" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "tx_errors" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "Error:Out" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "rx_crypts" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "BadCrypt:In" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "rx_frags" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "BadFrag:In" + ], + "type": "alias" + } + ], + [ + { + "params": [ + "tx_retries" + ], + "type": "field" + }, + { + "params": [], + "type": "last" + }, + { + "params": [ + "1s" + ], + "type": "derivative" + }, + { + "params": [ + "ExsRetry:Out" + ], + "type": "alias" + } + ] + ], + "tags": [ + { + "key": "device_name", + "operator": "=~", + "value": "/^$host$/" + }, + { + "condition": "AND", + "key": "radio", + "operator": "=", + "value": "ng" + } + ] + } + ], + "thresholds": [], + "timeFrom": null, + "timeShift": null, + "title": "2.4GHz Drops/Errors", + "tooltip": { + "msResolution": false, + "shared": true, + "sort": 0, + "value_type": "cumulative" + }, + "type": "graph", + "xaxis": { + "buckets": null, + "mode": "time", + "name": null, + "show": true, + "values": [] + }, + "yaxes": [ + { + "decimals": 1, + "format": "pps", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": true + }, + { + "format": "short", + "label": null, + "logBase": 1, + "max": null, + "min": null, + "show": false + } + ] + } + ], + "refresh": "30s", + "schemaVersion": 16, + "style": "dark", + "tags": [], + "templating": { + "list": [ + { + "current": { + "selected": true, + "text": "Glances", + "value": "Glances" + }, + "hide": 2, + "label": null, + "name": "dataSource", + "options": [], + "query": "influxdb", + "refresh": 1, + "regex": "", + "type": "datasource" + }, + { + "allValue": null, + "current": {}, + "datasource": "${DS_UNIFI}", + "hide": 0, + "includeAll": true, + "label": "UniFi AP:", + "multi": true, + "name": "host", + "options": [], + "query": "show tag values from \"uap\" with key=\"name\"", + "refresh": 1, + "regex": "", + "sort": 0, + "tagValuesQuery": null, + "tags": [], + "tagsQuery": null, + "type": "query", + "useTags": false + } + ] + }, + "time": { + "from": "now-2h", + "to": "now" + }, + "timepicker": { + "nowDelay": "5s", + "refresh_intervals": [ + "30s", + "1m", + "5m", + "15m", + "30m", + "1h", + "2h" + ], + "time_options": [ + "5m", + "15m", + "1h", + "6h", + "12h", + "24h", + "2d", + "7d", + "30d" + ] + }, + "timezone": "browser", + "title": "UniFi UAP Insights", + "uid": "8nQ_RPZiz", + "version": 28 +} diff --git a/integrations/influxunifi/grafana-unifi-dashboard.png b/integrations/influxunifi/images/unifi-clients-dashboard.png similarity index 100% rename from integrations/influxunifi/grafana-unifi-dashboard.png rename to integrations/influxunifi/images/unifi-clients-dashboard.png diff --git a/integrations/influxunifi/images/unifi-uap-dashboard.png b/integrations/influxunifi/images/unifi-uap-dashboard.png new file mode 100644 index 0000000000000000000000000000000000000000..8c63867b4d2e918cbb2bde8edb69b9405e3b934a GIT binary patch literal 143996 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

4XH7y|IJ>Vi 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 z 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 literal 0 HcmV?d00001 diff --git a/integrations/influxunifi/unidev/uap.go b/integrations/influxunifi/unidev/uap.go index 64a8d123..af7c2986 100644 --- a/integrations/influxunifi/unidev/uap.go +++ b/integrations/influxunifi/unidev/uap.go @@ -9,6 +9,9 @@ import ( // Points generates a device's datapoints for InfluxDB. func (u UAP) Points() ([]*influx.Point, error) { + /* I generally suck at InfluxDB, so if I got the tags/fields wrong, + please send me a PR or open an Issue to address my faults. Thanks! + */ var points []*influx.Point tags := map[string]string{ "id": u.ID, diff --git a/integrations/influxunifi/unidev/uap_type.go b/integrations/influxunifi/unidev/uap_type.go index 4f3b0771..30d1d3f2 100644 --- a/integrations/influxunifi/unidev/uap_type.go +++ b/integrations/influxunifi/unidev/uap_type.go @@ -1,7 +1,12 @@ package unidev -// UAP is a Unifi Access Point +// UAP is a Unifi Access Point. type UAP struct { + /* This was auto generated and then slowly edited by hand + to get all the data types right and graphable. + No ones feelings will be hurt if you want to break this + up into multiple structs, and/or make it better in general. + */ ID string `json:"_id"` UUptime float64 `json:"_uptime"` AdoptIP string `json:"adopt_ip,omitempty"` @@ -257,17 +262,17 @@ type UAP struct { } `json:"stat"` State int `json:"state"` SysStats struct { - Loadavg1 string `json:"loadavg_1"` - Loadavg15 string `json:"loadavg_15"` - Loadavg5 string `json:"loadavg_5"` + Loadavg1 float64 `json:"loadavg_1,string"` + Loadavg15 float64 `json:"loadavg_15,string"` + Loadavg5 float64 `json:"loadavg_5,string"` MemBuffer float64 `json:"mem_buffer"` MemTotal float64 `json:"mem_total"` MemUsed float64 `json:"mem_used"` } `json:"sys_stats"` SystemStats struct { - CPU string `json:"cpu"` - Mem string `json:"mem"` - Uptime string `json:"uptime"` + CPU float64 `json:"cpu,string"` + Mem float64 `json:"mem,string"` + Uptime float64 `json:"uptime,string"` } `json:"system-stats"` TxBytes float64 `json:"tx_bytes"` TxBytesD float64 `json:"tx_bytes-d"` From 4e4072b7433d9aa74bd0d23ee01b56b98163a0f3 Mon Sep 17 00:00:00 2001 From: DN2 Date: Sat, 28 Apr 2018 18:40:04 -0700 Subject: [PATCH 7/7] Bump version. --- integrations/influxunifi/cmd/unifi-poller/config.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/integrations/influxunifi/cmd/unifi-poller/config.go b/integrations/influxunifi/cmd/unifi-poller/config.go index a04de1d4..56fbbdde 100644 --- a/integrations/influxunifi/cmd/unifi-poller/config.go +++ b/integrations/influxunifi/cmd/unifi-poller/config.go @@ -4,7 +4,7 @@ import "time" // Version will be injected at build time. var ( - Version = "v0.1" + Version = "v0.2" Debug = false )