summaryrefslogtreecommitdiff
path: root/plugins/metrics/config.go
blob: 933b7eb82cdb462acd3d99021578ae33f4defcbc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
package metrics

import (
	"fmt"

	"github.com/prometheus/client_golang/prometheus"
)

// Config configures metrics service.
type Config struct {
	// Address to listen
	Address string

	// Collect define application specific metrics.
	Collect map[string]Collector
}

type NamedCollector struct {
	// Name of the collector
	Name string `json:"name"`

	// Collector structure
	Collector `json:"collector"`
}

// CollectorType represents prometheus collector types
type CollectorType string

const (
	// Histogram type
	Histogram CollectorType = "histogram"

	// Gauge type
	Gauge CollectorType = "gauge"

	// Counter type
	Counter CollectorType = "counter"

	// Summary type
	Summary CollectorType = "summary"
)

// Collector describes single application specific metric.
type Collector struct {
	// Namespace of the metric.
	Namespace string `json:"namespace"`
	// Subsystem of the metric.
	Subsystem string `json:"subsystem"`
	// Collector type (histogram, gauge, counter, summary).
	Type CollectorType `json:"type"`
	// Help of collector.
	Help string `json:"help"`
	// Labels for vectorized metrics.
	Labels []string `json:"labels"`
	// Buckets for histogram metric.
	Buckets []float64 `json:"buckets"`
}

// register application specific metrics.
func (c *Config) getCollectors() (map[string]prometheus.Collector, error) {
	if c.Collect == nil {
		return nil, nil
	}

	collectors := make(map[string]prometheus.Collector)

	for name, m := range c.Collect {
		var collector prometheus.Collector
		switch m.Type {
		case Histogram:
			opts := prometheus.HistogramOpts{
				Name:      name,
				Namespace: m.Namespace,
				Subsystem: m.Subsystem,
				Help:      m.Help,
				Buckets:   m.Buckets,
			}

			if len(m.Labels) != 0 {
				collector = prometheus.NewHistogramVec(opts, m.Labels)
			} else {
				collector = prometheus.NewHistogram(opts)
			}
		case Gauge:
			opts := prometheus.GaugeOpts{
				Name:      name,
				Namespace: m.Namespace,
				Subsystem: m.Subsystem,
				Help:      m.Help,
			}

			if len(m.Labels) != 0 {
				collector = prometheus.NewGaugeVec(opts, m.Labels)
			} else {
				collector = prometheus.NewGauge(opts)
			}
		case Counter:
			opts := prometheus.CounterOpts{
				Name:      name,
				Namespace: m.Namespace,
				Subsystem: m.Subsystem,
				Help:      m.Help,
			}

			if len(m.Labels) != 0 {
				collector = prometheus.NewCounterVec(opts, m.Labels)
			} else {
				collector = prometheus.NewCounter(opts)
			}
		case Summary:
			opts := prometheus.SummaryOpts{
				Name:      name,
				Namespace: m.Namespace,
				Subsystem: m.Subsystem,
				Help:      m.Help,
			}

			if len(m.Labels) != 0 {
				collector = prometheus.NewSummaryVec(opts, m.Labels)
			} else {
				collector = prometheus.NewSummary(opts)
			}
		default:
			return nil, fmt.Errorf("invalid metric type `%s` for `%s`", m.Type, name)
		}

		collectors[name] = collector
	}

	return collectors, nil
}

func (c *Config) InitDefaults() {

}