@@ -29,6 +29,7 @@ func main() {
29
29
sockAddr = fs .String ("socket" , "tcp://127.0.0.1:8191" , "address for direct socket metric writes" )
30
30
promAddr = fs .String ("prometheus" , "tcp://127.0.0.1:8192/metrics" , "address for Prometheus scrapes" )
31
31
declfile = fs .String ("declfile" , "" , "file containing JSON metric declarations" )
32
+ declpath = fs .String ("declpath" , "" , "sibling path to /metrics serving initial metric declarations" )
32
33
example = fs .Bool ("example" , false , "print example declfile to stdout and return" )
33
34
debug = fs .Bool ("debug" , false , "log debug information" )
34
35
strict = fs .Bool ("strict" , false , "disconnect clients when they send bad data" )
@@ -77,6 +78,7 @@ func main() {
77
78
}
78
79
}
79
80
81
+ var socketLn net.Listener
80
82
var forwardFunc func () error
81
83
var forwardClose func () error
82
84
{
@@ -118,46 +120,75 @@ func main() {
118
120
level .Error (logger ).Log ("socket" , * sockAddr , "err" , err )
119
121
os .Exit (1 )
120
122
}
123
+ socketLn = ln
121
124
forwardFunc = func () error { return forwardListener (ln , u , * strict , logger ) }
122
125
forwardClose = ln .Close
123
126
}
124
127
}
125
128
126
- var promLn net.Listener
127
- var promPath string
129
+ var metricsLn net.Listener
130
+ var metricsPath string
128
131
{
129
132
u , err := url .Parse (* promAddr )
130
133
if err != nil {
131
134
level .Error (logger ).Log ("prometheus" , * promAddr , "err" , err )
132
135
os .Exit (1 )
133
136
}
134
- promLn , err = net .Listen (u .Scheme , u .Host )
137
+ metricsLn , err = net .Listen (u .Scheme , u .Host )
135
138
if err != nil {
136
139
level .Error (logger ).Log ("prometheus" , * promAddr , "err" , err )
137
140
os .Exit (1 )
138
141
}
139
- promPath = u .Path
140
- if promPath == "" {
141
- promPath = "/"
142
+ metricsPath = u .Path
143
+ if metricsPath == "" {
144
+ metricsPath = "/"
145
+ }
146
+ }
147
+
148
+ var declPath string
149
+ var declHandler http.Handler
150
+ {
151
+ if * declpath != "" {
152
+ * declpath = "/" + strings .Trim (* declpath , "/ " )
153
+ scheme := metricsLn .Addr ().Network ()
154
+ hostport := metricsLn .Addr ().String ()
155
+ u , err := url .Parse (scheme + "://" + hostport + * declpath )
156
+ if err != nil {
157
+ level .Error (logger ).Log ("declpath" , * declpath , "err" , err )
158
+ os .Exit (1 )
159
+ }
160
+ declPath = u .Path
161
+ declHandler = http .HandlerFunc (func (w http.ResponseWriter , _ * http.Request ) {
162
+ w .Header ().Set ("content-type" , "application/json; charset=utf-8" )
163
+ p , _ := json .MarshalIndent (initial , "" , " " )
164
+ w .Write (p )
165
+ })
142
166
}
143
167
}
144
168
145
169
var g run.Group
146
170
{
147
171
g .Add (func () error {
148
- level .Info (logger ).Log ("listener" , "socket_writes" , "addr " , * sockAddr )
172
+ level .Info (logger ).Log ("listener" , "socket_writes" , "network " , socketLn . Addr (). Network (), "address" , socketLn . Addr (). String () )
149
173
return forwardFunc ()
150
174
}, func (error ) {
151
175
forwardClose ()
152
176
})
153
177
}
154
178
{
155
179
mux := http .NewServeMux ()
156
- mux .Handle (promPath , u )
180
+ mux .Handle (metricsPath , u )
181
+ if declPath != "" {
182
+ mux .Handle (declPath , declHandler )
183
+ }
157
184
server := http.Server {Handler : mux }
158
185
g .Add (func () error {
159
- level .Info (logger ).Log ("listener" , "prometheus_scrapes" , "addr" , promLn .Addr ().String (), "path" , promPath )
160
- return server .Serve (promLn )
186
+ keyvals := []interface {}{"listener" , "prometheus_scrapes" , "network" , metricsLn .Addr ().Network (), "address" , metricsLn .Addr ().String (), "path" , metricsPath }
187
+ if declPath != "" {
188
+ keyvals = append (keyvals , "declarations" , declPath )
189
+ }
190
+ level .Info (logger ).Log (keyvals ... )
191
+ return server .Serve (metricsLn )
161
192
}, func (error ) {
162
193
ctx , cancel := context .WithTimeout (context .Background (), time .Second )
163
194
defer cancel ()
0 commit comments