github.com/thanos-io/thanos@v0.32.5/pkg/exemplars/multitsdb.go (about) 1 // Copyright (c) The Thanos Authors. 2 // Licensed under the Apache License 2.0. 3 4 package exemplars 5 6 import ( 7 "github.com/pkg/errors" 8 "github.com/prometheus/prometheus/promql/parser" 9 "google.golang.org/grpc/codes" 10 "google.golang.org/grpc/status" 11 12 "github.com/thanos-io/thanos/pkg/exemplars/exemplarspb" 13 ) 14 15 // MultiTSDB implements exemplarspb.ExemplarsServer that allows to fetch exemplars a MultiTSDB instance. 16 type MultiTSDB struct { 17 tsdbExemplarsServers func() map[string]*TSDB 18 } 19 20 // NewMultiTSDB creates new exemplars.MultiTSDB. 21 func NewMultiTSDB(tsdbExemplarsServers func() map[string]*TSDB) *MultiTSDB { 22 return &MultiTSDB{ 23 tsdbExemplarsServers: tsdbExemplarsServers, 24 } 25 } 26 27 // Exemplars returns all specified exemplars from a MultiTSDB instance. 28 func (m *MultiTSDB) Exemplars(r *exemplarspb.ExemplarsRequest, s exemplarspb.Exemplars_ExemplarsServer) error { 29 expr, err := parser.ParseExpr(r.Query) 30 if err != nil { 31 return status.Error(codes.Internal, err.Error()) 32 } 33 matchers := parser.ExtractSelectors(expr) 34 35 for tenant, es := range m.tsdbExemplarsServers() { 36 if err := es.Exemplars(matchers, r.Start, r.End, s); err != nil { 37 return status.Error(codes.Aborted, errors.Wrapf(err, "get exemplars for tenant %s", tenant).Error()) 38 } 39 } 40 return nil 41 }