code: func InstrumentHandlerTimeToWriteHeader(obs prometheus.ObserverVec, next http.Handler) http.HandlerFunc {
  	code, method := checkLabels(obs)
  
  	return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
  		now := time.Now()
  		d := newDelegator(w, func(status int) {
  			obs.With(labels(code, method, r.Method, status)).Observe(time.Since(now).Seconds())
  		})
  		next.ServeHTTP(d, r)
  	})
  }
docs: // InstrumentHandlerTimeToWriteHeader is a middleware that wraps the provided
  // http.Handler to observe with the provided ObserverVec the request duration
  // until the response headers are written. 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 duration in
  // seconds. 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 panics before calling WriteHeader, no value is
  // reported.
  //
  // Note that this method is only guaranteed to never observe negative durations
  // if used with Go1.9+.
  //
  // See the example for InstrumentHandlerDuration for example usage.