register(opts) {
		if (!isPlainObject(opts)) throw new Error("Wrong argument. Must be an Object.");

		if (!opts.type) throw new Error("The metric 'type' property is mandatory.");

		if (!opts.name) throw new Error("The metric 'name' property is mandatory.");

		if (!METRIC_NAME_REGEXP.test(opts.name))
			throw new Error("The metric 'name' is not valid: " + opts.name);

		if (Array.isArray(opts.labelNames)) {
			opts.labelNames.forEach(name => {
				if (!METRIC_LABEL_REGEXP.test(name))
					throw new Error(`The '${opts.name}' metric label name is not valid: ${name}`);
			});
		}

		const MetricClass = Types.resolve(opts.type);

		if (!this.opts.enabled) return null;

		const item = new MetricClass(opts, this);
		this.store.set(opts.name, item);
		return item;
	}
Register a new metric.

@param {Object} opts
@returns {BaseMetric}
@memberof MetricRegistry