-
Notifications
You must be signed in to change notification settings - Fork 83
/
meter.go
108 lines (91 loc) · 3.59 KB
/
meter.go
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
// Licensed to Apache Software Foundation (ASF) under one or more contributor
// license agreements. See the NOTICE file distributed with
// this work for additional information regarding copyright
// ownership. Apache Software Foundation (ASF) licenses this file to you under
// the Apache License, Version 2.0 (the "License"); you may
// not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing,
// software distributed under the License is distributed on an
// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
// KIND, either express or implied. See the License for the
// specific language governing permissions and limitations
// under the License.
// Package meter provides a simple meter system for metrics. The metrics are aggregated by the meter provider.
package meter
type (
// Buckets is a slice of bucket boundaries.
Buckets []float64
// LabelPairs is a map of label names to label values, which is used to identify a metric.
LabelPairs map[string]string
)
// DefBuckets is the default buckets for histograms.
var DefBuckets = Buckets{.005, .01, .025, .05, .1, .25, .5, 1, 2.5, 5, 10}
// Merge merges the given label pairs with the current label pairs.
func (p LabelPairs) Merge(other LabelPairs) LabelPairs {
result := make(LabelPairs, len(p)+len(other))
for k, v := range p {
result[k] = v
}
for k, v := range other {
result[k] = v
}
return result
}
// Provider is the interface for a metrics provider, which is responsible for creating metrics.
type Provider interface {
Counter(name string, labelNames ...string) Counter
Gauge(name string, labelNames ...string) Gauge
Histogram(name string, buckets Buckets, labelNames ...string) Histogram
}
// Scope is a namespace wrapper for metrics.
type Scope interface {
ConstLabels(labels LabelPairs) Scope
SubScope(name string) Scope
GetNamespace() string
GetLabels() LabelPairs
}
// Instrument is the interface for a metric.
type Instrument interface {
// Delete the metric with the given label values.
Delete(labelValues ...string) bool
}
// Counter is a metric that represents a single numerical value that only ever goes up.
type Counter interface {
Instrument
Inc(delta float64, labelValues ...string)
}
// Gauge is a metric that represents a single numerical value that can arbitrarily go up and down.
type Gauge interface {
Instrument
Set(value float64, labelValues ...string)
Add(delta float64, labelValues ...string)
}
// Histogram is a metric that represents the statistical distribution of a set of values.
type Histogram interface {
Instrument
Observe(value float64, labelValues ...string)
}
type noopInstrument struct{}
func (noopInstrument) Inc(_ float64, _ ...string) {}
func (noopInstrument) Set(_ float64, _ ...string) {}
func (noopInstrument) Add(_ float64, _ ...string) {}
func (noopInstrument) Observe(_ float64, _ ...string) {}
func (noopInstrument) Delete(_ ...string) bool { return false }
// NoopProvider is a no-op implementation of the Provider interface.
type NoopProvider struct{}
// Counter returns a no-op implementation of the Counter interface.
func (NoopProvider) Counter(_ string, _ ...string) Counter {
return noopInstrument{}
}
// Gauge returns a no-op implementation of the Gauge interface.
func (NoopProvider) Gauge(_ string, _ ...string) Gauge {
return noopInstrument{}
}
// Histogram returns a no-op implementation of the Histogram interface.
func (NoopProvider) Histogram(_ string, _ Buckets, _ ...string) Histogram {
return noopInstrument{}
}