aboutsummaryrefslogtreecommitdiff
path: root/plugin/metrics/addr.go
diff options
context:
space:
mode:
Diffstat (limited to 'plugin/metrics/addr.go')
-rw-r--r--plugin/metrics/addr.go52
1 files changed, 52 insertions, 0 deletions
diff --git a/plugin/metrics/addr.go b/plugin/metrics/addr.go
new file mode 100644
index 000000000..fe8e5e5fe
--- /dev/null
+++ b/plugin/metrics/addr.go
@@ -0,0 +1,52 @@
+package metrics
+
+// addrs keeps track on which addrs we listen, so we only start one listener, is
+// prometheus is used in multiple Server Blocks.
+type addrs struct {
+ a map[string]value
+}
+
+type value struct {
+ state int
+ f func() error
+}
+
+var uniqAddr addrs
+
+func newAddress() addrs {
+ return addrs{a: make(map[string]value)}
+}
+
+func (a addrs) setAddress(addr string, f func() error) {
+ if a.a[addr].state == done {
+ return
+ }
+ a.a[addr] = value{todo, f}
+}
+
+// setAddressTodo sets addr to 'todo' again.
+func (a addrs) setAddressTodo(addr string) {
+ v, ok := a.a[addr]
+ if !ok {
+ return
+ }
+ v.state = todo
+ a.a[addr] = v
+}
+
+// forEachTodo iterates for a and executes f for each element that is 'todo' and sets it to 'done'.
+func (a addrs) forEachTodo() error {
+ for k, v := range a.a {
+ if v.state == todo {
+ v.f()
+ }
+ v.state = done
+ a.a[k] = v
+ }
+ return nil
+}
+
+const (
+ todo = 1
+ done = 2
+)