github.com/sequix/cortex@v1.1.6/pkg/ruler/compat.go (about) 1 package ruler 2 3 import ( 4 "context" 5 6 "github.com/prometheus/common/model" 7 "github.com/prometheus/prometheus/pkg/labels" 8 "github.com/prometheus/prometheus/storage" 9 10 "github.com/sequix/cortex/pkg/ingester/client" 11 ) 12 13 // Pusher is an ingester server that accepts pushes. 14 type Pusher interface { 15 Push(context.Context, *client.WriteRequest) (*client.WriteResponse, error) 16 } 17 18 // appendableAppender adapts a distributor.Distributor to both a ruler.Appendable 19 // and a storage.Appender. 20 // 21 // Distributors need a context and storage.Appender doesn't allow for 22 // one. See 23 // https://github.com/prometheus/prometheus/pull/2000#discussion_r79108319 for 24 // reasons why. 25 type appendableAppender struct { 26 pusher Pusher 27 ctx context.Context 28 samples []model.Sample 29 } 30 31 func (a *appendableAppender) Appender() (storage.Appender, error) { 32 return a, nil 33 } 34 35 func (a *appendableAppender) Add(l labels.Labels, t int64, v float64) (uint64, error) { 36 m := make(model.Metric, len(l)) 37 for _, lbl := range l { 38 m[model.LabelName(lbl.Name)] = model.LabelValue(lbl.Value) 39 } 40 a.samples = append(a.samples, model.Sample{ 41 Metric: m, 42 Timestamp: model.Time(t), 43 Value: model.SampleValue(v), 44 }) 45 return 0, nil 46 } 47 48 func (a *appendableAppender) AddFast(l labels.Labels, ref uint64, t int64, v float64) error { 49 _, err := a.Add(l, t, v) 50 return err 51 } 52 53 func (a *appendableAppender) Commit() error { 54 _, err := a.pusher.Push(a.ctx, client.ToWriteRequest(a.samples, client.RULE)) 55 a.samples = nil 56 return err 57 } 58 59 func (a *appendableAppender) Rollback() error { 60 a.samples = nil 61 return nil 62 }