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 }