91 lines
1.9 KiB
Go
91 lines
1.9 KiB
Go
package metrics
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/czerwonk/bird_exporter/protocol"
|
|
)
|
|
|
|
// DefaultLabelStrategy defines the labels to add to an metric and its data retrieval method
|
|
type DefaultLabelStrategy struct {
|
|
descriptionLabels bool
|
|
}
|
|
|
|
func NewDefaultLabelStrategy(descriptionLabels bool) *DefaultLabelStrategy {
|
|
return &DefaultLabelStrategy{
|
|
descriptionLabels: descriptionLabels,
|
|
}
|
|
}
|
|
|
|
// LabelNames returns the list of label names
|
|
func (d *DefaultLabelStrategy) LabelNames(p *protocol.Protocol) []string {
|
|
res := []string{"name", "proto", "ip_version", "import_filter", "export_filter"}
|
|
if d.descriptionLabels && p.Description != "" {
|
|
res = append(res, labelKeysFromDescription(p.Description)...)
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
// LabelValues returns the values for a protocol
|
|
func (d *DefaultLabelStrategy) LabelValues(p *protocol.Protocol) []string {
|
|
res := []string{p.Name, protoString(p), p.IPVersion, p.ImportFilter, p.ExportFilter}
|
|
if d.descriptionLabels && p.Description != "" {
|
|
res = append(res, labelValuesFromDescription(p.Description)...)
|
|
}
|
|
|
|
return res
|
|
}
|
|
|
|
func labelKeysFromDescription(desc string) (res []string) {
|
|
for _, x := range strings.Split(desc, ",") {
|
|
tmp := strings.Split(x, "=")
|
|
if len(tmp) != 2 {
|
|
continue
|
|
}
|
|
|
|
res = append(res, strings.TrimSpace(tmp[0]))
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func labelValuesFromDescription(desc string) (res []string) {
|
|
for _, x := range strings.Split(desc, ",") {
|
|
tmp := strings.Split(x, "=")
|
|
if len(tmp) != 2 {
|
|
continue
|
|
}
|
|
|
|
res = append(res, strings.TrimSpace(tmp[1]))
|
|
}
|
|
|
|
return
|
|
}
|
|
|
|
func protoString(p *protocol.Protocol) string {
|
|
switch p.Proto {
|
|
case protocol.BGP:
|
|
return "BGP"
|
|
case protocol.OSPF:
|
|
if p.IPVersion == "4" {
|
|
return "OSPF"
|
|
}
|
|
return "OSPFv3"
|
|
case protocol.Static:
|
|
return "Static"
|
|
case protocol.Kernel:
|
|
return "Kernel"
|
|
case protocol.Direct:
|
|
return "Direct"
|
|
case protocol.Babel:
|
|
return "Babel"
|
|
case protocol.RPKI:
|
|
return "RPKI"
|
|
case protocol.BFD:
|
|
return "BFD"
|
|
}
|
|
|
|
return ""
|
|
}
|