code: func (m *metricMap) getOrCreateMetricWithLabels(
  	hash uint64, labels Labels, curry []curriedLabelValue,
  ) Metric {
  	m.mtx.RLock()
  	metric, ok := m.getMetricWithHashAndLabels(hash, labels, curry)
  	m.mtx.RUnlock()
  	if ok {
  		return metric
  	}
  
  	m.mtx.Lock()
  	defer m.mtx.Unlock()
  	metric, ok = m.getMetricWithHashAndLabels(hash, labels, curry)
  	if !ok {
  		lvs := extractLabelValues(m.desc, labels, curry)
  		metric = m.newMetric(lvs...)
  		m.metrics[hash] = append(m.metrics[hash], metricWithLabelValues{values: lvs, metric: metric})
  	}
  	return metric
  }
docs: // getOrCreateMetricWithLabelValues retrieves the metric by hash and label value
  // or creates it and returns the new one.
  //
  // This function holds the mutex.