func (p *PrometheusReporter) Histogram(metric string, val float64) {
	parts := strings.Split(metric, ";")
	name := parts[0]
	if len(parts) == 1 {
		p.histograms[name].Observe(val)
	} else {
		c, ok := p.histogramsVec[name]
		if ok {
			c.With(getLabels(parts[1])).Observe(val)
		}
	}
}
Histogram observer value of metric histogram
metric schema: metric_name;label:value,label1:value2
package monitoring
import (
	"github.com/prometheus/client_golang/prometheus"
	"strings"
	"time"
)
type PrometheusReporter struct {
	countersVec   map[string]*prometheus.CounterVec
	counters      map[string]prometheus.Counter
	gaugesVec     map[string]*prometheus.GaugeVec
	gauges        map[string]prometheus.Gauge
	histograms    map[string]prometheus.Histogram
	histogramsVec map[string]*prometheus.HistogramVec
}
func NewPrometheusReporter() *PrometheusReporter {
	p := PrometheusReporter{}
	p.countersVec = make(map[string]*prometheus.CounterVec)
	p.counters = make(map[string]prometheus.Counter)
	p.gaugesVec = make(map[string]*prometheus.GaugeVec)
	p.gauges = make(map[string]prometheus.Gauge)
	p.histograms = make(map[string]prometheus.Histogram)
	p.histogramsVec = make(map[string]*prometheus.HistogramVec)
	return &p
}
func (p *PrometheusReporter) Inc(metric string) {
	parts := strings.Split(metric, ";")
	name := parts[0]
	if len(parts) == 1 {
		p.counters[name].Inc()
	} else {
		c, ok := p.countersVec[name]
		if ok {
			c.With(getLabels(parts[1])).Inc()
		}
	}
}
func (p *PrometheusReporter) Counter(metric string, val float64) {
	parts := strings.Split(metric, ";")
	name := parts[0]
	if len(parts) == 1 {
		p.counters[name].Add(val)
	} else {
		c, ok := p.countersVec[name]
		if ok {
			c.With(getLabels(parts[1])).Add(val)
		}
	}
}
func (p *PrometheusReporter) Gauge(metric string, val float64) {
	parts := strings.Split(metric, ";")
	name := parts[0]
	if len(parts) == 1 {
		p.gauges[name].Add(val)
	} else {
		c, ok := p.gaugesVec[name]
		if ok {
			c.With(getLabels(parts[1])).Add(val)
		}
	}
}