code: func NewObjectPool(opts ObjectPoolOptions) ObjectPool {
  	if opts == nil {
  		opts = NewObjectPoolOptions()
  	}
  
  	m := opts.InstrumentOptions().MetricsScope()
  
  	p := &objectPool{
  		opts:   opts,
  		values: make(chan interface{}, opts.Size()),
  		size:   opts.Size(),
  		refillLowWatermark: int(math.Ceil(
  			opts.RefillLowWatermark() * float64(opts.Size()))),
  		refillHighWatermark: int(math.Ceil(
  			opts.RefillHighWatermark() * float64(opts.Size()))),
  		metrics: objectPoolMetrics{
  			free:       m.Gauge("free"),
  			total:      m.Gauge("total"),
  			getOnEmpty: m.Counter("get-on-empty"),
  			putOnFull:  m.Counter("put-on-full"),
  		},
  	}
  
  	p.setGauges()
  
  	return p
  }
docs: // NewObjectPool creates a new pool