Description
The `Metrics` registry is often used by concurrent threads, however it's get/create APIs are not well suited for it. A common pattern from the user today is:
metric = metrics.metric(metricName); if (metric == null) { try { metrics.createMetric(..) } catch (IllegalArgumentException e){ // another thread may create the metric at the mean time } }
Otherwise the caller would need to synchronize the whole block trying to get the metric. However, the `createMetric` function call itself indeed synchronize internally on updating the metric map.
So we could consider adding a metricOrElseCreate function which is similar to createMetric, but instead of throwing an illegal argument exception within the internal synchronization block, it would just return the already existing metric.