github.com/muhammadn/cortex@v1.9.1-0.20220510110439-46bb7000d03d/pkg/util/push/push.go (about) 1 package push 2 3 import ( 4 "context" 5 "net/http" 6 7 "github.com/go-kit/log/level" 8 "github.com/weaveworks/common/httpgrpc" 9 "github.com/weaveworks/common/middleware" 10 11 "github.com/cortexproject/cortex/pkg/cortexpb" 12 "github.com/cortexproject/cortex/pkg/util" 13 "github.com/cortexproject/cortex/pkg/util/log" 14 ) 15 16 // Func defines the type of the push. It is similar to http.HandlerFunc. 17 type Func func(context.Context, *cortexpb.WriteRequest) (*cortexpb.WriteResponse, error) 18 19 // Handler is a http.Handler which accepts WriteRequests. 20 func Handler(maxRecvMsgSize int, sourceIPs *middleware.SourceIPExtractor, push Func) http.Handler { 21 return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { 22 ctx := r.Context() 23 logger := log.WithContext(ctx, log.Logger) 24 if sourceIPs != nil { 25 source := sourceIPs.Get(r) 26 if source != "" { 27 ctx = util.AddSourceIPsToOutgoingContext(ctx, source) 28 logger = log.WithSourceIPs(source, logger) 29 } 30 } 31 var req cortexpb.PreallocWriteRequest 32 err := util.ParseProtoReader(ctx, r.Body, int(r.ContentLength), maxRecvMsgSize, &req, util.RawSnappy) 33 if err != nil { 34 level.Error(logger).Log("err", err.Error()) 35 http.Error(w, err.Error(), http.StatusBadRequest) 36 return 37 } 38 39 req.SkipLabelNameValidation = false 40 if req.Source == 0 { 41 req.Source = cortexpb.API 42 } 43 44 if _, err := push(ctx, &req.WriteRequest); err != nil { 45 resp, ok := httpgrpc.HTTPResponseFromError(err) 46 if !ok { 47 http.Error(w, err.Error(), http.StatusInternalServerError) 48 return 49 } 50 if resp.GetCode() != 202 { 51 level.Error(logger).Log("msg", "push error", "err", err) 52 } 53 http.Error(w, string(resp.Body), int(resp.Code)) 54 } 55 }) 56 }