print() {
		let list = this.registry.list({
			includes: this.opts.includes,
			excludes: this.opts.excludes
		});

		if (this.opts.onlyChanges) list = list.filter(metric => this.lastChanges.has(metric.name));

		if (list.length == 0) return;

		this.log(
			kleur.gray(`------------------- [ METRICS START (${list.length}) ] -------------------`)
		);

		list.forEach(metric => {
			this.log(
				kleur.cyan().bold(this.formatMetricName(metric.name)) +
					" " +
					kleur.gray("(" + metric.type + ")")
			);
			if (metric.values.size == 0) {
				this.log(kleur.gray("  <no values>"));
			} else {
				const unit = metric.unit
					? kleur.gray(this.registry.pluralizeUnit(metric.unit))
					: "";
				metric.values.forEach(item => {
					let val;
					const labelStr = this.labelsToStr(item.labels);
					switch (metric.type) {
						case METRIC.TYPE_COUNTER:
						case METRIC.TYPE_GAUGE:
						case METRIC.TYPE_INFO:
							val =
								item.value === ""
									? kleur.grey("<empty string>")
									: kleur.green().bold(item.value);
							if (item.rate != null) {
								/*const s = [];
								Object.keys(item.rates).forEach(b => {
									s.push(`Rate${b}: ${item.rates[b] != null ? item.rates[b].toFixed(2) : "-"}`);
								});

								val = kleur.green().bold(`Value: ${val} | ` + s.join(" | "));
								*/

								val =
									val +
									kleur.grey(" | Rate: ") +
									(item.rate != null
										? kleur.green().bold(item.rate.toFixed(2))
										: "-");
							}

							break;
						case METRIC.TYPE_HISTOGRAM: {
							const s = [];
							s.push(`Count: ${item.count}`);

							if (item.buckets) {
								Object.keys(item.buckets).forEach(b => {
									s.push(
										`${b}: ${item.buckets[b] != null ? item.buckets[b] : "-"}`
									);
								});
							}

							if (item.quantiles) {
								s.push(`Min: ${item.min != null ? item.min.toFixed(2) : "-"}`);
								s.push(`Mean: ${item.mean != null ? item.mean.toFixed(2) : "-"}`);
								s.push(
									`Var: ${item.variance != null ? item.variance.toFixed(2) : "-"}`
								);
								s.push(
									`StdDev: ${item.stdDev != null ? item.stdDev.toFixed(2) : "-"}`
								);
								s.push(`Max: ${item.max != null ? item.max.toFixed(2) : "-"}`);

								Object.keys(item.quantiles).forEach(key => {
									s.push(
										`${key}: ${
											item.quantiles[key] != null
												? item.quantiles[key].toFixed(2)
												: "-"
										}`
									);
								});
							}

							if (item.rate != null)
								s.push(`Rate: ${item.rate != null ? item.rate.toFixed(2) : "-"}`);

							val = kleur.green().bold(s.join(" | "));
							break;
						}
					}
					this.log(`  ${labelStr}: ${val} ${unit}`);
				});
			}
			this.log("");
		});

		this.log(
			kleur.gray(`-------------------- [ METRICS END (${list.length}) ] --------------------`)
		);

		this.lastChanges.clear();
	}
Print metrics to the console.

@memberof ConsoleReporter