code: func NewHistogram(name string, minValue, maxValue int64, sigfigs int) *Histogram {
  	hm.Lock()
  	defer hm.Unlock()
  
  	if _, ok := histograms[name]; ok {
  		panic(name + " already exists")
  	}
  
  	hist := &Histogram{
  		name: name,
  		hist: hdrhistogram.NewWindowed(5, minValue, maxValue, sigfigs),
  	}
  	histograms[name] = hist
  
  	Gauge(name+".P50").SetBatchFunc(hname(name), hist.merge, hist.valueAt(50))
  	Gauge(name+".P75").SetBatchFunc(hname(name), hist.merge, hist.valueAt(75))
  	Gauge(name+".P90").SetBatchFunc(hname(name), hist.merge, hist.valueAt(90))
  	Gauge(name+".P95").SetBatchFunc(hname(name), hist.merge, hist.valueAt(95))
  	Gauge(name+".P99").SetBatchFunc(hname(name), hist.merge, hist.valueAt(99))
  	Gauge(name+".P999").SetBatchFunc(hname(name), hist.merge, hist.valueAt(99.9))
  
  	return hist
  }
docs: // NewHistogram returns a windowed HDR histogram which drops data older than
  // five minutes. The returned histogram is safe to use from multiple goroutines.
  //
  // Use a histogram to track the distribution of a stream of values (e.g., the
  // latency associated with HTTP requests).