code: func InstrumentHandlerRequestSize(obs prometheus.ObserverVec, next http.Handler) http.HandlerFunc {
  	code, method := checkLabels(obs)
  
  	if code {
  		return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  			d := newDelegator(w, nil)
  			next.ServeHTTP(d, r)
  			size := computeApproximateRequestSize(r)
  			obs.With(labels(code, method, r.Method, d.Status())).Observe(float64(size))
  		})
  	}
  
  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  		next.ServeHTTP(w, r)
  		size := computeApproximateRequestSize(r)
  		obs.With(labels(code, method, r.Method, 0)).Observe(float64(size))
  	})
  }
docs: // InstrumentHandlerRequestSize is a middleware that wraps the provided
  // http.Handler to observe the request size with the provided ObserverVec.  The
  // ObserverVec must have zero, one, or two non-const non-curried labels. For
  // those, the only allowed label names are "code" and "method". The function
  // panics otherwise. The Observe method of the Observer in the ObserverVec is
  // called with the request size in bytes. Partitioning happens by HTTP status
  // code and/or HTTP method if the respective instance label names are present in
  // the ObserverVec. For unpartitioned observations, use an ObserverVec with zero
  // labels. Note that partitioning of Histograms is expensive and should be used
  // judiciously.
  //
  // If the wrapped Handler does not set a status code, a status code of 200 is assumed.
  //
  // If the wrapped Handler panics, no values are reported.
  //
  // See the example for InstrumentHandlerDuration for example usage.