func PrometheusMetrics(namespace string, labelsAndValues ...string) *Metrics {
	labels := []string{}
	for i := 0; i < len(labelsAndValues); i += 2 {
		labels = append(labels, labelsAndValues[i])
	}
	return &Metrics{
		EventsIn: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: MetricsSubsystem,
			Name:      "events_in",
			Help:      "Events read from the channel.",
		}, labels).With(labelsAndValues...),
		EventsHandled: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: MetricsSubsystem,
			Name:      "events_handled",
			Help:      "Events handled",
		}, labels).With(labelsAndValues...),
		EventsOut: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: MetricsSubsystem,
			Name:      "events_out",
			Help:      "Events output from routine.",
		}, labels).With(labelsAndValues...),
		ErrorsIn: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: MetricsSubsystem,
			Name:      "errors_in",
			Help:      "Errors read from the channel.",
		}, labels).With(labelsAndValues...),
		ErrorsHandled: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: MetricsSubsystem,
			Name:      "errors_handled",
			Help:      "Errors handled.",
		}, labels).With(labelsAndValues...),
		ErrorsOut: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: MetricsSubsystem,
			Name:      "errors_out",
			Help:      "Errors output from routine.",
		}, labels).With(labelsAndValues...),
		ErrorsSent: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: MetricsSubsystem,
			Name:      "errors_sent",
			Help:      "Errors sent to routine.",
		}, labels).With(labelsAndValues...),
		ErrorsShed: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: MetricsSubsystem,
			Name:      "errors_shed",
			Help:      "Errors dropped from sending.",
		}, labels).With(labelsAndValues...),
		EventsSent: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: MetricsSubsystem,
			Name:      "events_sent",
			Help:      "Events sent to routine.",
		}, labels).With(labelsAndValues...),
		EventsShed: prometheus.NewCounterFrom(stdprometheus.CounterOpts{
			Namespace: namespace,
			Subsystem: MetricsSubsystem,
			Name:      "events_shed",
			Help:      "Events dropped from sending.",
		}, labels).With(labelsAndValues...),
	}
}
PrometheusMetrics returns metrics for in and out events, errors, etc. handled by routines.
Can we burn in the routine name here?
package v2
import (
	"github.com/go-kit/kit/metrics"
	"github.com/go-kit/kit/metrics/discard"
	"github.com/go-kit/kit/metrics/prometheus"
	stdprometheus "github.com/prometheus/client_golang/prometheus"
)
const (
	MetricsSubsystem = "blockchain"
)
type Metrics struct {
	EventsIn metrics.Counter
	EventsHandled metrics.Counter
	EventsOut metrics.Counter
	ErrorsIn metrics.Counter
	ErrorsHandled metrics.Counter
	ErrorsOut metrics.Counter
	EventsShed metrics.Counter
	EventsSent metrics.Counter
	ErrorsSent metrics.Counter
	ErrorsShed metrics.Counter
}