github.com/go-graphite/carbonapi@v0.17.0/cmd/carbonapi/zipper.go (about)

     1  package main
     2  
     3  import (
     4  	"context"
     5  	"sort"
     6  
     7  	"github.com/ansel1/merry"
     8  	"github.com/go-graphite/carbonapi/expr/helper"
     9  	tags2 "github.com/go-graphite/carbonapi/expr/tags"
    10  	"github.com/go-graphite/carbonapi/expr/types"
    11  	util "github.com/go-graphite/carbonapi/util/ctx"
    12  	realZipper "github.com/go-graphite/carbonapi/zipper"
    13  	zipperCfg "github.com/go-graphite/carbonapi/zipper/config"
    14  	zipperTypes "github.com/go-graphite/carbonapi/zipper/types"
    15  	pb "github.com/go-graphite/protocol/carbonapi_v3_pb"
    16  	"go.uber.org/zap"
    17  )
    18  
    19  type zipper struct {
    20  	z *realZipper.Zipper
    21  
    22  	logger              *zap.Logger
    23  	statsSender         func(*zipperTypes.Stats)
    24  	ignoreClientTimeout bool
    25  }
    26  
    27  func newZipper(sender func(*zipperTypes.Stats), config *zipperCfg.Config, ignoreClientTimeout bool, logger *zap.Logger) *zipper {
    28  	logger.Debug("initializing zipper")
    29  	zz, err := realZipper.NewZipper(sender, config, logger)
    30  	if err != nil {
    31  		logger.Fatal("failed to initialize zipper",
    32  			zap.Error(err),
    33  		)
    34  		return nil
    35  	}
    36  	z := &zipper{
    37  		z:                   zz,
    38  		logger:              logger,
    39  		statsSender:         sender,
    40  		ignoreClientTimeout: ignoreClientTimeout,
    41  	}
    42  
    43  	return z
    44  }
    45  
    46  func (z zipper) Find(ctx context.Context, req pb.MultiGlobRequest) (*pb.MultiGlobResponse, *zipperTypes.Stats, merry.Error) {
    47  	newCtx := ctx
    48  	if z.ignoreClientTimeout {
    49  		uuid := util.GetUUID(ctx)
    50  		hdrs := util.GetPassHeaders(ctx)
    51  		newCtx = util.SetUUID(context.Background(), uuid)
    52  		newCtx = util.SetPassHeaders(newCtx, hdrs)
    53  	}
    54  
    55  	res, stats, err := z.z.FindProtoV3(newCtx, &req)
    56  	z.statsSender(stats)
    57  
    58  	return res, stats, err
    59  }
    60  
    61  func (z zipper) Info(ctx context.Context, metrics []string) (*pb.ZipperInfoResponse, *zipperTypes.Stats, merry.Error) {
    62  	newCtx := ctx
    63  	if z.ignoreClientTimeout {
    64  		uuid := util.GetUUID(ctx)
    65  		hdrs := util.GetPassHeaders(ctx)
    66  		newCtx = util.SetUUID(context.Background(), uuid)
    67  		newCtx = util.SetPassHeaders(newCtx, hdrs)
    68  	}
    69  
    70  	req := pb.MultiGlobRequest{
    71  		Metrics: metrics,
    72  	}
    73  
    74  	resp, stats, err := z.z.InfoProtoV3(newCtx, &req)
    75  	z.statsSender(stats)
    76  
    77  	return resp, stats, err
    78  }
    79  
    80  func (z zipper) Render(ctx context.Context, request pb.MultiFetchRequest) ([]*types.MetricData, *zipperTypes.Stats, merry.Error) {
    81  	var result []*types.MetricData
    82  	newCtx := ctx
    83  	if z.ignoreClientTimeout {
    84  		uuid := util.GetUUID(ctx)
    85  		hdrs := util.GetPassHeaders(ctx)
    86  		newCtx = util.SetUUID(context.Background(), uuid)
    87  		newCtx = util.SetPassHeaders(newCtx, hdrs)
    88  	}
    89  
    90  	pbresp, stats, err := z.z.FetchProtoV3(newCtx, &request)
    91  	z.statsSender(stats)
    92  
    93  	if pbresp != nil {
    94  		for i := range pbresp.Metrics {
    95  			tags := tags2.ExtractTags(pbresp.Metrics[i].Name)
    96  			result = append(result, &types.MetricData{
    97  				FetchResponse: pbresp.Metrics[i],
    98  				Tags:          tags,
    99  			})
   100  		}
   101  	}
   102  
   103  	sort.Sort(helper.ByNameNatural(result))
   104  
   105  	return result, stats, err
   106  }
   107  
   108  func (z zipper) RenderCompat(ctx context.Context, metrics []string, from, until int64) ([]*types.MetricData, *zipperTypes.Stats, merry.Error) {
   109  	req := pb.MultiFetchRequest{}
   110  	for _, metric := range metrics {
   111  		req.Metrics = append(req.Metrics, pb.FetchRequest{
   112  			Name:      metric,
   113  			StartTime: from,
   114  			StopTime:  until,
   115  		})
   116  	}
   117  
   118  	return z.Render(ctx, req)
   119  }
   120  
   121  func (z zipper) TagNames(ctx context.Context, query string, limit int64) ([]string, merry.Error) {
   122  	return z.z.TagNames(ctx, query, limit)
   123  }
   124  
   125  func (z zipper) TagValues(ctx context.Context, query string, limit int64) ([]string, merry.Error) {
   126  	return z.z.TagValues(ctx, query, limit)
   127  }
   128  
   129  func (z zipper) ScaleToCommonStep() bool {
   130  	return z.z.ScaleToCommonStep
   131  }