prometheus/rules/ast/persistence_bridge.go
Matt T. Proud efe61c18fa Refactor target scheduling to separate facility.
``Target`` will be refactored down the road to support various
nuanced endpoint types.  Thusly incorporating the scheduling
behavior within it will be problematic.  To that end, the scheduling
behavior has been moved into a separate assistance type to improve
conciseness and testability.

``make format`` was also run.
2013-01-13 10:43:37 +01:00

116 lines
3 KiB
Go

package ast
//////////
// TEMPORARY CRAP FILE IN LIEU OF MISSING FUNCTIONALITY IN STORAGE LAYER
//
// REMOVE!
import (
"github.com/matttproud/prometheus/model"
"github.com/matttproud/prometheus/storage/metric"
"time"
)
// TODO ask matt about using pointers in nested metric structs
// TODO move this somewhere proper
var stalenessPolicy = metric.StalenessPolicy{
DeltaAllowance: time.Duration(300) * time.Second,
}
// TODO remove PersistenceBridge temporary helper.
type PersistenceBridge struct {
persistence metric.MetricPersistence
}
// AST-global persistence to use.
var persistence *PersistenceBridge = nil
func (p *PersistenceBridge) getMetricsWithLabels(labels model.LabelSet) ([]*model.Metric, error) {
fingerprints, err := p.persistence.GetFingerprintsForLabelSet(&labels)
if err != nil {
return nil, err
}
metrics := []*model.Metric{}
for _, fingerprint := range fingerprints {
metric, err := p.persistence.GetMetricForFingerprint(fingerprint)
if err != nil {
return nil, err
}
metrics = append(metrics, metric)
}
return metrics, nil
}
func (p *PersistenceBridge) GetValueAtTime(labels model.LabelSet, timestamp *time.Time, stalenessPolicy *metric.StalenessPolicy) ([]*model.Sample, error) {
metrics, err := p.getMetricsWithLabels(labels)
if err != nil {
return nil, err
}
samples := []*model.Sample{}
for _, metric := range metrics {
sample, err := p.persistence.GetValueAtTime(metric, timestamp, stalenessPolicy)
if err != nil {
return nil, err
}
if sample == nil {
continue
}
samples = append(samples, sample)
}
return samples, nil
}
func (p *PersistenceBridge) GetBoundaryValues(labels model.LabelSet, interval *model.Interval, stalenessPolicy *metric.StalenessPolicy) ([]*model.SampleSet, error) {
metrics, err := p.getMetricsWithLabels(labels)
if err != nil {
return nil, err
}
sampleSets := []*model.SampleSet{}
for _, metric := range metrics {
// TODO: change to GetBoundaryValues() once it has the right return type.
sampleSet, err := p.persistence.GetRangeValues(metric, interval, stalenessPolicy)
if err != nil {
return nil, err
}
if sampleSet == nil {
continue
}
// TODO remove when persistence return value is fixed.
sampleSet.Metric = *metric
sampleSets = append(sampleSets, sampleSet)
}
return sampleSets, nil
}
func (p *PersistenceBridge) GetRangeValues(labels model.LabelSet, interval *model.Interval, stalenessPolicy *metric.StalenessPolicy) ([]*model.SampleSet, error) {
metrics, err := p.getMetricsWithLabels(labels)
if err != nil {
return nil, err
}
sampleSets := []*model.SampleSet{}
for _, metric := range metrics {
sampleSet, err := p.persistence.GetRangeValues(metric, interval, stalenessPolicy)
if err != nil {
return nil, err
}
if sampleSet == nil {
continue
}
// TODO remove when persistence return value is fixed.
sampleSet.Metric = *metric
sampleSets = append(sampleSets, sampleSet)
}
return sampleSets, nil
}
func SetPersistence(p metric.MetricPersistence) {
persistence = &PersistenceBridge{
persistence: p,
}
}