yanic/webserver/prometheus.go

686 lines
21 KiB
Go

package webserver
import (
"fmt"
"strconv"
"github.com/FreifunkBremen/yanic/data"
"github.com/FreifunkBremen/yanic/runtime"
"github.com/prometheus/client_golang/prometheus"
)
var (
promDescNodeInfo = prometheus.NewDesc("yanic_node_info", "node info on labels", []string{
"node_id",
"hostname",
"owner",
"latitude",
"longitude",
"site_code",
"domain_code",
"model",
"nproc",
"firmware_base",
"firmware_release",
"autoupdater",
}, prometheus.Labels{})
nodeLabels = []string{"node_id"}
promDescNodeUP = prometheus.NewDesc("yanic_node_up", "node is up", nodeLabels, prometheus.Labels{})
promDescNodeFirstseen = prometheus.NewDesc("yanic_node_firstseen", "node firstseen as timestemp", nodeLabels, prometheus.Labels{})
promDescNodeLastseen = prometheus.NewDesc("yanic_node_lastseen", "node lastseen as timestemp", nodeLabels, prometheus.Labels{})
promDescNodeLoad = prometheus.NewDesc("yanic_node_load", "load of node", nodeLabels, prometheus.Labels{})
promDescNodeTimeUP = prometheus.NewDesc("yanic_node_time_up", "", nodeLabels, prometheus.Labels{})
promDescNodeTimeIdle = prometheus.NewDesc("yanic_node_time_idle", "", nodeLabels, prometheus.Labels{})
promDescNodeProcRunning = prometheus.NewDesc("yanic_node_proc_running", "", nodeLabels, prometheus.Labels{})
// Clients - complete
promDescNodeClientsWifi = prometheus.NewDesc("yanic_node_clients_wifi", "", nodeLabels, prometheus.Labels{})
promDescNodeClientsWifi24 = prometheus.NewDesc("yanic_node_clients_wifi24", "", nodeLabels, prometheus.Labels{})
promDescNodeClientsWifi5 = prometheus.NewDesc("yanic_node_clients_wifi5", "", nodeLabels, prometheus.Labels{})
promDescNodeClientsOwe = prometheus.NewDesc("yanic_node_clients_owe", "", nodeLabels, prometheus.Labels{})
promDescNodeClientsOwe24 = prometheus.NewDesc("yanic_node_clients_owe24", "", nodeLabels, prometheus.Labels{})
promDescNodeClientsOwe5 = prometheus.NewDesc("yanic_node_clients_owe5", "", nodeLabels, prometheus.Labels{})
promDescNodeClientsTotal = prometheus.NewDesc("yanic_node_clients_total", "", nodeLabels, prometheus.Labels{})
// Memory - compelte
promDescNodeMemBuffers = prometheus.NewDesc("yanic_node_memmory_buffers", "", nodeLabels, prometheus.Labels{})
promDescNodeMemCached = prometheus.NewDesc("yanic_node_memmory_cached", "", nodeLabels, prometheus.Labels{})
promDescNodeMemFree = prometheus.NewDesc("yanic_node_memmory_free", "", nodeLabels, prometheus.Labels{})
promDescNodeMemTotal = prometheus.NewDesc("yanic_node_memmory_total", "", nodeLabels, prometheus.Labels{})
promDescNodeMemAvailable = prometheus.NewDesc("yanic_node_memmory_available", "", nodeLabels, prometheus.Labels{})
// ProcStats - complete
promDescNodeStatCPUUser = prometheus.NewDesc("yanic_node_stat_cpu_user", "", nodeLabels, prometheus.Labels{})
promDescNodeStatCPUNice = prometheus.NewDesc("yanic_node_stat_cpu_nice", "", nodeLabels, prometheus.Labels{})
promDescNodeStatCPUSystem = prometheus.NewDesc("yanic_node_stat_cpu_system", "", nodeLabels, prometheus.Labels{})
promDescNodeStatCPUIdle = prometheus.NewDesc("yanic_node_stat_cpu_idle", "", nodeLabels, prometheus.Labels{})
promDescNodeStatCPUIOWait = prometheus.NewDesc("yanic_node_stat_cpu_iowait", "", nodeLabels, prometheus.Labels{})
promDescNodeStatCPUIRQ = prometheus.NewDesc("yanic_node_stat_cpu_irq", "", nodeLabels, prometheus.Labels{})
promDescNodeStatCPUSoftIRQ = prometheus.NewDesc("yanic_node_stat_cpu_softirq", "", nodeLabels, prometheus.Labels{})
promDescNodeStatIntr = prometheus.NewDesc("yanic_node_stat_intr", "", nodeLabels, prometheus.Labels{})
promDescNodeStatContextSwitches = prometheus.NewDesc("yanic_node_stat_ctxt", "", nodeLabels, prometheus.Labels{})
promDescNodeStatSoftIRQ = prometheus.NewDesc("yanic_node_stat_softirq", "", nodeLabels, prometheus.Labels{})
promDescNodeStatProcesses = prometheus.NewDesc("yanic_node_stat_processes", "", nodeLabels, prometheus.Labels{})
// Traffic - complete
promDescNodeTrafficRxBytes = prometheus.NewDesc("yanic_node_traffic_rx_bytes", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficRxPackets = prometheus.NewDesc("yanic_node_traffic_rx_packets", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficRxDropped = prometheus.NewDesc("yanic_node_traffic_rx_dropped", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficTxBytes = prometheus.NewDesc("yanic_node_traffic_tx_bytes", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficTxPackets = prometheus.NewDesc("yanic_node_traffic_tx_packets", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficTxDropped = prometheus.NewDesc("yanic_node_traffic_tx_dropped", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficForwardBytes = prometheus.NewDesc("yanic_node_traffic_forward_bytes", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficForwardPackets = prometheus.NewDesc("yanic_node_traffic_forward_packets", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficForwardDropped = prometheus.NewDesc("yanic_node_traffic_forward_dropped", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficMgmtRxBytes = prometheus.NewDesc("yanic_node_traffic_mgmt_rx_bytes", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficMgmtRxPackets = prometheus.NewDesc("yanic_node_traffic_mgmt_rx_packets", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficMgmtRxDropped = prometheus.NewDesc("yanic_node_traffic_mgmt_rx_dropped", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficMgmtTxBytes = prometheus.NewDesc("yanic_node_traffic_mgmt_tx_bytes", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficMgmtTxPackets = prometheus.NewDesc("yanic_node_traffic_mgmt_tx_packets", "", nodeLabels, prometheus.Labels{})
promDescNodeTrafficMgmtTxDropped = prometheus.NewDesc("yanic_node_traffic_mgmt_tx_dropped", "", nodeLabels, prometheus.Labels{})
// Wireless - just necessary
allLabelsWithFrequency = append(nodeLabels, "frequency", "frequency_name")
promDescNodeFrequency = prometheus.NewDesc("yanic_node_frequency", "", allLabelsWithFrequency, prometheus.Labels{})
promDescNodeAirtimeChanUtil = prometheus.NewDesc("yanic_node_airtime_chan_util", "", allLabelsWithFrequency, prometheus.Labels{})
promDescNodeAirtimeTxUtil = prometheus.NewDesc("yanic_node_airtime_tx_util", "", allLabelsWithFrequency, prometheus.Labels{})
promDescNodeAirtimeRxUtil = prometheus.NewDesc("yanic_node_airtime_rx_util", "", allLabelsWithFrequency, prometheus.Labels{})
promDescNodeAirtimeNoise = prometheus.NewDesc("yanic_node_airtime_noise", "", allLabelsWithFrequency, prometheus.Labels{})
promDescNodeWirelessTxPower = prometheus.NewDesc("yanic_node_wireless_txpower", "", allLabelsWithFrequency, prometheus.Labels{})
// Links - just necessary
labelLinks = []string{"source_id", "target_id", "source_address", "target_address", "type"}
promDescLinkTQ = prometheus.NewDesc("yanic_link_tq", "", labelLinks, prometheus.Labels{})
)
type Prometheus struct {
Enable bool `toml:"enable"`
DisableLabels []string `toml:"disable_labels"`
nodes *runtime.Nodes
disLabels map[string]bool
}
func (prom *Prometheus) Init(nodes *runtime.Nodes) {
prom.nodes = nodes
prom.disLabels = make(map[string]bool)
for _, label := range prom.DisableLabels {
prom.disLabels[label] = false
}
}
func (prom *Prometheus) Describe(d chan<- *prometheus.Desc) {
d <- promDescNodeInfo
d <- promDescNodeUP
d <- promDescNodeFirstseen
d <- promDescNodeLastseen
d <- promDescNodeLoad
d <- promDescNodeTimeUP
d <- promDescNodeTimeIdle
d <- promDescNodeProcRunning
d <- promDescNodeClientsWifi
d <- promDescNodeClientsWifi24
d <- promDescNodeClientsWifi5
d <- promDescNodeClientsOwe
d <- promDescNodeClientsOwe24
d <- promDescNodeClientsOwe5
d <- promDescNodeClientsTotal
d <- promDescNodeMemBuffers
d <- promDescNodeMemCached
d <- promDescNodeMemFree
d <- promDescNodeMemTotal
d <- promDescNodeMemAvailable
d <- promDescNodeStatCPUUser
d <- promDescNodeStatCPUNice
d <- promDescNodeStatCPUSystem
d <- promDescNodeStatCPUIdle
d <- promDescNodeStatCPUIOWait
d <- promDescNodeStatCPUIRQ
d <- promDescNodeStatCPUSoftIRQ
d <- promDescNodeStatIntr
d <- promDescNodeStatContextSwitches
d <- promDescNodeStatSoftIRQ
d <- promDescNodeStatProcesses
d <- promDescNodeTrafficRxBytes
d <- promDescNodeTrafficRxPackets
d <- promDescNodeTrafficRxDropped
d <- promDescNodeTrafficTxBytes
d <- promDescNodeTrafficTxPackets
d <- promDescNodeTrafficTxDropped
d <- promDescNodeTrafficForwardBytes
d <- promDescNodeTrafficForwardPackets
d <- promDescNodeTrafficForwardDropped
d <- promDescNodeTrafficMgmtRxBytes
d <- promDescNodeTrafficMgmtRxPackets
d <- promDescNodeTrafficMgmtRxDropped
d <- promDescNodeTrafficMgmtTxBytes
d <- promDescNodeTrafficMgmtTxPackets
d <- promDescNodeTrafficMgmtTxDropped
d <- promDescNodeFrequency
d <- promDescNodeAirtimeChanUtil
d <- promDescNodeAirtimeRxUtil
d <- promDescNodeAirtimeTxUtil
d <- promDescNodeAirtimeNoise
d <- promDescNodeWirelessTxPower
d <- promDescLinkTQ
}
func (prom *Prometheus) getNodeLabels(ni *data.Nodeinfo) []string {
labels := make([]string, 12)
labels[0] = ni.NodeID
if _, nok := prom.disLabels["hostname"]; !nok {
labels[1] = ni.Hostname
} else {
labels[1] = "DISABLED"
}
if _, nok := prom.disLabels["owner"]; !nok {
if owner := ni.Owner; owner != nil {
labels[2] = owner.Contact
}
} else {
labels[2] = "DISABLED"
}
if _, nok := prom.disLabels["location"]; !nok {
if location := ni.Location; location != nil {
labels[3] = fmt.Sprintf("%v", location.Latitude)
labels[4] = fmt.Sprintf("%v", location.Longitude)
}
} else {
labels[3] = "DISABLED"
labels[4] = "DISABLED"
}
labels[5] = ni.System.SiteCode
labels[6] = ni.System.DomainCode
labels[7] = ni.Hardware.Model
labels[8] = strconv.Itoa(ni.Hardware.Nproc)
if firmware := ni.Software.Firmware; firmware != nil {
labels[9] = firmware.Base
labels[10] = firmware.Release
}
if ni.Software.Autoupdater != nil && ni.Software.Autoupdater.Enabled {
labels[11] = ni.Software.Autoupdater.Branch
} else {
labels[11] = runtime.DISABLED_AUTOUPDATER
}
return labels
}
func (prom *Prometheus) Collect(metrics chan<- prometheus.Metric) {
prom.nodes.Lock()
defer prom.nodes.Unlock()
for _, node := range prom.nodes.List {
nodeinfo := node.Nodeinfo
if nodeinfo == nil {
continue
}
nodeLabelValues := prom.getNodeLabels(nodeinfo)
if m, err := prometheus.NewConstMetric(
promDescNodeInfo,
prometheus.CounterValue,
1,
nodeLabelValues...); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeFirstseen,
prometheus.CounterValue,
float64(node.Firstseen.Unix()),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeLastseen,
prometheus.CounterValue,
float64(node.Lastseen.Unix()),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if !node.Online {
if m, err := prometheus.NewConstMetric(
promDescNodeUP,
prometheus.GaugeValue,
0,
nodeinfo.NodeID); err == nil {
metrics <- m
}
continue
}
stats := node.Statistics
if stats == nil {
continue
}
if m, err := prometheus.NewConstMetric(
promDescNodeUP,
prometheus.GaugeValue,
1,
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeLoad,
prometheus.GaugeValue,
stats.LoadAverage,
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTimeUP,
prometheus.GaugeValue,
float64(stats.Uptime),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTimeIdle,
prometheus.GaugeValue,
stats.Idletime,
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeProcRunning,
prometheus.GaugeValue,
float64(stats.Processes.Running),
nodeinfo.NodeID); err == nil {
metrics <- m
}
// Clients
if m, err := prometheus.NewConstMetric(
promDescNodeClientsWifi,
prometheus.GaugeValue,
float64(stats.Clients.Wifi),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeClientsWifi24,
prometheus.GaugeValue,
float64(stats.Clients.Wifi24),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeClientsWifi5,
prometheus.GaugeValue,
float64(stats.Clients.Wifi5),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeClientsOwe,
prometheus.GaugeValue,
float64(stats.Clients.OWE),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeClientsOwe24,
prometheus.GaugeValue,
float64(stats.Clients.OWE24),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeClientsOwe5,
prometheus.GaugeValue,
float64(stats.Clients.OWE5),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeClientsTotal,
prometheus.GaugeValue,
float64(stats.Clients.Total),
nodeinfo.NodeID); err == nil {
metrics <- m
}
// Memory
if m, err := prometheus.NewConstMetric(
promDescNodeMemBuffers,
prometheus.GaugeValue,
float64(stats.Memory.Buffers),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeMemCached,
prometheus.GaugeValue,
float64(stats.Memory.Cached),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeMemFree,
prometheus.GaugeValue,
float64(stats.Memory.Free),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeMemTotal,
prometheus.GaugeValue,
float64(stats.Memory.Total),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeMemAvailable,
prometheus.GaugeValue,
float64(stats.Memory.Available),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if procstat := stats.ProcStats; procstat != nil {
if m, err := prometheus.NewConstMetric(
promDescNodeStatCPUUser,
prometheus.GaugeValue,
float64(procstat.CPU.User),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeStatCPUNice,
prometheus.GaugeValue,
float64(procstat.CPU.Nice),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeStatCPUSystem,
prometheus.GaugeValue,
float64(procstat.CPU.System),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeStatCPUIdle,
prometheus.GaugeValue,
float64(procstat.CPU.Idle),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeStatCPUIOWait,
prometheus.GaugeValue,
float64(procstat.CPU.IOWait),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeStatCPUIRQ,
prometheus.GaugeValue,
float64(procstat.CPU.IRQ),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeStatCPUSoftIRQ,
prometheus.GaugeValue,
float64(procstat.CPU.SoftIRQ),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeStatIntr,
prometheus.GaugeValue,
float64(procstat.Intr),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeStatContextSwitches,
prometheus.GaugeValue,
float64(procstat.ContextSwitches),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeStatSoftIRQ,
prometheus.GaugeValue,
float64(procstat.SoftIRQ),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeStatProcesses,
prometheus.GaugeValue,
float64(procstat.Processes),
nodeinfo.NodeID); err == nil {
metrics <- m
}
}
if t := stats.Traffic.Rx; t != nil {
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficRxBytes,
prometheus.GaugeValue,
float64(t.Bytes),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficRxPackets,
prometheus.GaugeValue,
float64(t.Packets),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficRxDropped,
prometheus.GaugeValue,
float64(t.Dropped),
nodeinfo.NodeID); err == nil {
metrics <- m
}
}
if t := stats.Traffic.Tx; t != nil {
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficTxBytes,
prometheus.GaugeValue,
float64(t.Bytes),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficTxPackets,
prometheus.GaugeValue,
float64(t.Packets),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficTxDropped,
prometheus.GaugeValue,
float64(t.Dropped),
nodeinfo.NodeID); err == nil {
metrics <- m
}
}
if t := stats.Traffic.Forward; t != nil {
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficForwardBytes,
prometheus.GaugeValue,
float64(t.Bytes),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficForwardPackets,
prometheus.GaugeValue,
float64(t.Packets),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficForwardDropped,
prometheus.GaugeValue,
float64(t.Dropped),
nodeinfo.NodeID); err == nil {
metrics <- m
}
}
if t := stats.Traffic.MgmtTx; t != nil {
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficMgmtTxBytes,
prometheus.GaugeValue,
float64(t.Bytes),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficMgmtTxPackets,
prometheus.GaugeValue,
float64(t.Packets),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficMgmtTxDropped,
prometheus.GaugeValue,
float64(t.Dropped),
nodeinfo.NodeID); err == nil {
metrics <- m
}
}
if t := stats.Traffic.MgmtRx; t != nil {
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficMgmtRxBytes,
prometheus.GaugeValue,
float64(t.Bytes),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficMgmtRxPackets,
prometheus.GaugeValue,
float64(t.Packets),
nodeinfo.NodeID); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeTrafficMgmtRxDropped,
prometheus.GaugeValue,
float64(t.Dropped),
nodeinfo.NodeID); err == nil {
metrics <- m
}
}
// add a label for frequency_name
labelIndex := len(nodeLabels)
labels := []string{nodeinfo.NodeID, "", ""}
for _, airtime := range stats.Wireless {
labels[labelIndex] = strconv.Itoa(int(airtime.Frequency))
labels[labelIndex+1] = airtime.FrequencyName()
if m, err := prometheus.NewConstMetric(
promDescNodeFrequency,
prometheus.GaugeValue,
float64(airtime.Frequency),
labels...); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeAirtimeChanUtil,
prometheus.GaugeValue,
float64(airtime.ChanUtil),
labels...); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeAirtimeTxUtil,
prometheus.GaugeValue,
float64(airtime.TxUtil),
labels...); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeAirtimeRxUtil,
prometheus.GaugeValue,
float64(airtime.RxUtil),
labels...); err == nil {
metrics <- m
}
if m, err := prometheus.NewConstMetric(
promDescNodeAirtimeNoise,
prometheus.GaugeValue,
float64(airtime.Noise),
labels...); err == nil {
metrics <- m
}
if wireless := nodeinfo.Wireless; wireless != nil {
if airtime.Frequency < 5000 {
if m, err := prometheus.NewConstMetric(
promDescNodeWirelessTxPower,
prometheus.GaugeValue,
float64(wireless.TxPower24),
labels...); err == nil {
metrics <- m
}
} else {
if m, err := prometheus.NewConstMetric(
promDescNodeWirelessTxPower,
prometheus.GaugeValue,
float64(wireless.TxPower5),
labels...); err == nil {
metrics <- m
}
}
}
}
for _, link := range prom.nodes.NodeLinks(node) {
if m, err := prometheus.NewConstMetric(
promDescLinkTQ,
prometheus.GaugeValue,
float64(link.TQ),
// labels:
link.SourceID,
link.TargetID,
link.SourceAddress,
link.TargetAddress,
link.Type.String(),
); err == nil {
metrics <- m
}
}
}
}