2022-12-30 12:04:35 -06:00
|
|
|
package exemplar
|
|
|
|
|
2023-03-22 04:59:39 -05:00
|
|
|
import (
|
|
|
|
"sort"
|
|
|
|
|
|
|
|
"github.com/grafana/grafana-plugin-sdk-go/data"
|
|
|
|
)
|
2022-12-30 12:04:35 -06:00
|
|
|
|
|
|
|
var _ LabelTracker = (*labelTracker)(nil)
|
|
|
|
|
|
|
|
type LabelTracker interface {
|
|
|
|
Add(labels map[string]string)
|
2023-03-22 04:59:39 -05:00
|
|
|
AddFields(fields []*data.Field)
|
2022-12-30 12:04:35 -06:00
|
|
|
GetNames() []string
|
|
|
|
}
|
|
|
|
|
|
|
|
type labelTracker struct {
|
|
|
|
labelSet map[string]struct{}
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewLabelTracker() LabelTracker {
|
|
|
|
return &labelTracker{
|
|
|
|
labelSet: map[string]struct{}{},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// Add saves label names that haven't been seen before
|
|
|
|
// so that they can be used to build the label fields in the exemplar frame
|
|
|
|
func (l *labelTracker) Add(labels map[string]string) {
|
|
|
|
for k := range labels {
|
2023-03-22 04:59:39 -05:00
|
|
|
l.labelSet[k] = struct{}{}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// AddFields saves field names so that they can be used to build the label fields in the exemplar frame.
|
|
|
|
func (l *labelTracker) AddFields(fields []*data.Field) {
|
|
|
|
for _, f := range fields {
|
|
|
|
l.labelSet[f.Name] = struct{}{}
|
2022-12-30 12:04:35 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetNames returns sorted unique label names
|
|
|
|
func (l *labelTracker) GetNames() []string {
|
|
|
|
labelNames := make([]string, 0, len(l.labelSet))
|
|
|
|
for k := range l.labelSet {
|
|
|
|
labelNames = append(labelNames, k)
|
|
|
|
}
|
|
|
|
sort.SliceStable(labelNames, func(i, j int) bool {
|
|
|
|
return labelNames[i] < labelNames[j]
|
|
|
|
})
|
|
|
|
return labelNames
|
|
|
|
}
|