91 lines
2.1 KiB
Go
91 lines
2.1 KiB
Go
package prometheus
|
|
|
|
import (
|
|
"sort"
|
|
|
|
dto "github.com/prometheus/client_model/go"
|
|
)
|
|
|
|
// Transformer modifies prometheus metrics families.
|
|
type Transformer interface {
|
|
// Transform updates the metrics family
|
|
Transform(mfs []*dto.MetricFamily) []*dto.MetricFamily
|
|
}
|
|
|
|
var _ Transformer = (*AddLabels)(nil)
|
|
|
|
// AddLabels adds labels to all metrics. It will overwrite
|
|
// the label if it already exists.
|
|
type AddLabels struct {
|
|
Labels map[string]string
|
|
}
|
|
|
|
// Transform adds labels to the metrics.
|
|
func (a *AddLabels) Transform(mfs []*dto.MetricFamily) []*dto.MetricFamily {
|
|
for i := range mfs {
|
|
for j, m := range mfs[i].Metric {
|
|
// Filter out labels to add
|
|
labels := m.Label[:0]
|
|
for _, l := range m.Label {
|
|
if _, ok := a.Labels[l.GetName()]; !ok {
|
|
labels = append(labels, l)
|
|
}
|
|
}
|
|
|
|
// Add all new labels to the metric
|
|
for k, v := range a.Labels {
|
|
labels = append(labels, L(k, v))
|
|
}
|
|
sort.Sort(labelPairSorter(labels))
|
|
mfs[i].Metric[j].Label = labels
|
|
}
|
|
}
|
|
return mfs
|
|
}
|
|
|
|
var _ Transformer = (*RemoveLabels)(nil)
|
|
|
|
// RemoveLabels adds labels to all metrics. It will overwrite
|
|
// the label if it already exists.
|
|
type RemoveLabels struct {
|
|
Labels map[string]struct{}
|
|
}
|
|
|
|
// Transform removes labels from the metrics.
|
|
func (r *RemoveLabels) Transform(mfs []*dto.MetricFamily) []*dto.MetricFamily {
|
|
for i := range mfs {
|
|
for j, m := range mfs[i].Metric {
|
|
// Filter out labels
|
|
labels := m.Label[:0]
|
|
for _, l := range m.Label {
|
|
if _, ok := r.Labels[l.GetName()]; !ok {
|
|
labels = append(labels, l)
|
|
}
|
|
}
|
|
mfs[i].Metric[j].Label = labels
|
|
}
|
|
}
|
|
return mfs
|
|
}
|
|
|
|
var _ Transformer = (*RenameFamilies)(nil)
|
|
|
|
// RenameFamilies changes the name of families to another name
|
|
type RenameFamilies struct {
|
|
FromTo map[string]string
|
|
}
|
|
|
|
// Transform renames metric families names.
|
|
func (r *RenameFamilies) Transform(mfs []*dto.MetricFamily) []*dto.MetricFamily {
|
|
renamed := mfs[:0]
|
|
for _, mf := range mfs {
|
|
if to, ok := r.FromTo[mf.GetName()]; ok {
|
|
mf.Name = &to
|
|
}
|
|
renamed = append(renamed, mf)
|
|
|
|
}
|
|
sort.Sort(familySorter(renamed))
|
|
return renamed
|
|
}
|