5
5
package server
6
6
7
7
import (
8
+ "log"
9
+ "net/http"
10
+ "os"
11
+ "strconv"
12
+
8
13
"github.com/prometheus/client_golang/prometheus"
9
14
)
10
15
@@ -21,7 +26,7 @@ func (nopCounter) Inc(_ int64) {}
21
26
// used by graphite.
22
27
var (
23
28
// Pondering deletion in favor of the better and more
24
- // maintained (by me) Prometheus reporting.
29
+ // maintained (by me) prometheus reporting.
25
30
26
31
StatsForwardCount Counter = nopCounter {}
27
32
StatsStubForwardCount Counter = nopCounter {}
@@ -34,21 +39,139 @@ var (
34
39
StatsDnssecCacheMiss Counter = nopCounter {}
35
40
)
36
41
37
- // Prometheus counters and gauges
38
42
var (
39
- PromForwardCount prometheus.Counter
40
- PromStubForwardCount prometheus.Counter
41
- PromLookupCount prometheus.Counter
42
-
43
- PromRequestCountTotal prometheus.Counter
44
- PromRequestCountTCP prometheus.Counter
45
- PromRequestCountUDP prometheus.Counter
46
-
47
- PromDnssecOkCount prometheus.Counter
48
- PromNameErrorCount prometheus.Counter
49
- PromNoDataCount prometheus.Counter
50
- PromRCacheSize prometheus.Gauge
51
- PromSCacheSize prometheus.Gauge
52
- PromRCacheMiss prometheus.Counter
53
- PromSCacheMiss prometheus.Counter
43
+ prometheusPort = os .Getenv ("PROMETHEUS_PORT" )
44
+ prometheusPath = os .Getenv ("PROMETHEUS_PATH" )
45
+ prometheusNamespace = os .Getenv ("PROMETHEUS_NAMESPACE" )
46
+ prometheusSubsystem = os .Getenv ("PROMETHEUS_SUBSYSTEM" )
47
+ )
48
+
49
+ var (
50
+ promForwardCount prometheus.Counter
51
+ promStubForwardCount prometheus.Counter
52
+ promLookupCount prometheus.Counter
53
+ promRequestCount * prometheus.CounterVec
54
+ promDnssecOkCount prometheus.Counter
55
+ promNameErrorCount prometheus.Counter
56
+ promNoDataCount prometheus.Counter
57
+ promRCacheSize prometheus.Gauge
58
+ promSCacheSize prometheus.Gauge
59
+ promRCacheMiss prometheus.Counter
60
+ promSCacheMiss prometheus.Counter
54
61
)
62
+
63
+ func Metrics () {
64
+ if prometheusPort == "" {
65
+ return
66
+ }
67
+
68
+ if prometheusPath == "" {
69
+ prometheusPath = "/metrics"
70
+ }
71
+ if prometheusNamespace == "" {
72
+ prometheusNamespace = "skydns"
73
+ }
74
+
75
+ promForwardCount = prometheus .NewCounter (prometheus.CounterOpts {
76
+ Namespace : prometheusNamespace ,
77
+ Subsystem : prometheusSubsystem ,
78
+ Name : "dns_forward_count" ,
79
+ Help : "Counter of DNS requests forwarded." ,
80
+ })
81
+
82
+ promStubForwardCount = prometheus .NewCounter (prometheus.CounterOpts {
83
+ Namespace : prometheusNamespace ,
84
+ Subsystem : prometheusSubsystem ,
85
+ Name : "dns_stub_forward_count" ,
86
+ Help : "Counter of DNS requests forwarded to stubs." ,
87
+ })
88
+
89
+ // convert to VEC and use labels
90
+ promLookupCount = prometheus .NewCounter (prometheus.CounterOpts {
91
+ Namespace : prometheusNamespace ,
92
+ Subsystem : prometheusSubsystem ,
93
+ Name : "dns_lookup_count" ,
94
+ Help : "Counter of DNS lookups performed." ,
95
+ })
96
+
97
+ promRequestCount = prometheus .NewCounterVec (prometheus.CounterOpts {
98
+ Namespace : prometheusNamespace ,
99
+ Subsystem : prometheusSubsystem ,
100
+ Name : "dns_request_count" ,
101
+ Help : "Counter of total DNS requests made." ,
102
+ }, []string {"type" }, // total, udp, tcp
103
+ )
104
+ prometheus .MustRegister (promRequestCount )
105
+
106
+ promDnssecOkCount = prometheus .NewCounter (prometheus.CounterOpts {
107
+ Namespace : prometheusNamespace ,
108
+ Subsystem : prometheusSubsystem ,
109
+ Name : "dns_dnssec_ok_count" ,
110
+ Help : "Counter of DNSSEC requests." ,
111
+ })
112
+
113
+ promNameErrorCount = prometheus .NewCounter (prometheus.CounterOpts {
114
+ Namespace : prometheusNamespace ,
115
+ Subsystem : prometheusSubsystem ,
116
+ Name : "dns_name_error_count" ,
117
+ Help : "Counter of DNS requests resulting in a name error." ,
118
+ })
119
+
120
+ promNoDataCount = prometheus .NewCounter (prometheus.CounterOpts {
121
+ Namespace : prometheusNamespace ,
122
+ Subsystem : prometheusSubsystem ,
123
+ Name : "dns_no_data_count" ,
124
+ Help : "Counter of DNS requests that contained no data." ,
125
+ })
126
+
127
+ // Caches
128
+ promRCacheSize = prometheus .NewGauge (prometheus.GaugeOpts {
129
+ Namespace : prometheusNamespace ,
130
+ Subsystem : prometheusSubsystem ,
131
+ Name : "rcache_total_size" ,
132
+ Help : "The total size of all DNS messages in the rcache." ,
133
+ })
134
+
135
+ promSCacheSize = prometheus .NewGauge (prometheus.GaugeOpts {
136
+ Namespace : prometheusNamespace ,
137
+ Subsystem : prometheusSubsystem ,
138
+ Name : "scache_total_size" ,
139
+ Help : "The total size of all RRSIGs in the scache." ,
140
+ })
141
+
142
+ promRCacheMiss = prometheus .NewCounter (prometheus.CounterOpts {
143
+ Namespace : prometheusNamespace ,
144
+ Subsystem : prometheusSubsystem ,
145
+ Name : "dns_rcache_miss_count" ,
146
+ Help : "Counter of DNS requests that result in cache miss." ,
147
+ })
148
+
149
+ promSCacheMiss = prometheus .NewCounter (prometheus.CounterOpts {
150
+ Namespace : prometheusNamespace ,
151
+ Subsystem : prometheusSubsystem ,
152
+ Name : "dns_scache_miss_count" ,
153
+ Help : "Counter of signature requests that result in cache miss." ,
154
+ })
155
+
156
+ prometheus .MustRegister (promForwardCount )
157
+ prometheus .MustRegister (promStubForwardCount )
158
+ prometheus .MustRegister (promLookupCount )
159
+
160
+ prometheus .MustRegister (promDnssecOkCount )
161
+ prometheus .MustRegister (promNameErrorCount )
162
+ prometheus .MustRegister (promNoDataCount )
163
+ prometheus .MustRegister (promRCacheSize )
164
+ prometheus .MustRegister (promSCacheSize )
165
+ prometheus .MustRegister (promRCacheMiss )
166
+ prometheus .MustRegister (promSCacheMiss )
167
+
168
+ _ , err := strconv .Atoi (prometheusPort )
169
+ if err != nil {
170
+ return
171
+ }
172
+
173
+ http .Handle (prometheusPath , prometheus .Handler ())
174
+ go func () {
175
+ log .Fatalf ("skydns: %s" , http .ListenAndServe (":" + prometheusPort , nil ))
176
+ }()
177
+ }
0 commit comments