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  }