@@ -2,9 +2,11 @@ package command
2
2
3
3
import (
4
4
"github.com/patrickjahns/openvpn_exporter/pkg/collector"
5
+ "github.com/patrickjahns/openvpn_exporter/pkg/config"
5
6
"github.com/patrickjahns/openvpn_exporter/pkg/version"
6
7
"net/http"
7
8
"os"
9
+ "strings"
8
10
9
11
"github.com/go-kit/kit/log"
10
12
"github.com/go-kit/kit/log/level"
@@ -27,7 +29,7 @@ func Run() error {
27
29
},
28
30
},
29
31
}
30
-
32
+ cfg := config . Load ()
31
33
cli .HelpFlag = & cli.BoolFlag {
32
34
Name : "help" ,
33
35
Aliases : []string {"h" },
@@ -40,20 +42,49 @@ func Run() error {
40
42
Usage : "Prints the current version" ,
41
43
}
42
44
45
+ app .Flags = []cli.Flag {
46
+ & cli.StringFlag {
47
+ Name : "web.address" ,
48
+ Aliases : []string {"web.listen-address" },
49
+ Value : "0.0.0.0:9176" ,
50
+ Usage : "Address to bind the metrics server" ,
51
+ Destination : & cfg .Server .Addr ,
52
+ },
53
+ & cli.StringFlag {
54
+ Name : "web.path" ,
55
+ Aliases : []string {"web.telemetry-path" },
56
+ Value : "/metrics" ,
57
+ Usage : "Path to bind the metrics server" ,
58
+ Destination : & cfg .Server .Path ,
59
+ },
60
+ & cli.StringFlag {
61
+ Name : "web.root" ,
62
+ Value : "/" ,
63
+ Usage : "Root path to exporter endpoints" ,
64
+ Destination : & cfg .Server .Root ,
65
+ },
66
+ & cli.StringSliceFlag {
67
+ Name : "status-file" ,
68
+ Usage : "The OpenVPN status file(s) to export (example test:./example/version1.status )" ,
69
+ Required : true ,
70
+ },
71
+ }
72
+
73
+ app .Before = func (c * cli.Context ) error {
74
+ cfg .StatusFile = c .StringSlice ("status-file" )
75
+ return nil
76
+ }
77
+
43
78
app .Action = func (c * cli.Context ) error {
44
- return run (c )
79
+ return run (c , cfg )
45
80
}
46
81
47
82
return app .Run (os .Args )
48
83
}
49
84
50
- func run (c * cli.Context ) error {
51
- // hardcoded vars for development, will be replaced with cli/config
52
- addr := ":9000"
53
- statusFile := "./example/version1.status"
54
-
85
+ func run (c * cli.Context , cfg * config.Config ) error {
55
86
// setup logging
56
- logger := setupLogging ()
87
+ logger := setupLogging (cfg )
57
88
level .Info (logger ).Log (
58
89
"msg" , "Starting openvpn_exporter" ,
59
90
"version" , version .Version ,
@@ -74,15 +105,25 @@ func run(c *cli.Context) error {
74
105
version .GoVersion ,
75
106
version .Started ,
76
107
))
77
- r .MustRegister (collector .NewOpenVPNCollector (
78
- logger ,
79
- "udp" ,
80
- statusFile ,
81
- ))
82
- http .Handle ("/metrics" ,
108
+ for _ , statusFile := range cfg .StatusFile {
109
+ serverName , statusFile := parseStatusFileSlice (statusFile )
110
+
111
+ level .Info (logger ).Log (
112
+ "msg" , "registering collector for" ,
113
+ "serverName" , serverName ,
114
+ "statusFile" , statusFile ,
115
+ )
116
+ r .MustRegister (collector .NewOpenVPNCollector (
117
+ logger ,
118
+ serverName ,
119
+ statusFile ,
120
+ ))
121
+ }
122
+
123
+ http .Handle (cfg .Server .Path ,
83
124
promhttp .HandlerFor (r , promhttp.HandlerOpts {}),
84
125
)
85
- http .HandleFunc ("/" , func (w http.ResponseWriter , r * http.Request ) {
126
+ http .HandleFunc (cfg . Server . Root , func (w http.ResponseWriter , r * http.Request ) {
86
127
_ , _ = w .Write ([]byte (`<html>
87
128
<head><title>OpenVPN Exporter</title></head>
88
129
<body>
@@ -92,18 +133,37 @@ func run(c *cli.Context) error {
92
133
</html>` ))
93
134
})
94
135
95
- level .Info (logger ).Log ("msg" , "Listening on" , "addr" , addr )
96
- if err := http .ListenAndServe (addr , nil ); err != nil {
136
+ level .Info (logger ).Log ("msg" , "Listening on" , "addr" , cfg . Server . Addr )
137
+ if err := http .ListenAndServe (cfg . Server . Addr , nil ); err != nil {
97
138
level .Error (logger ).Log ("msg" , "http listenandserve error" , "err" , err )
98
139
return err
99
140
}
100
141
return nil
101
142
}
102
143
103
- func setupLogging () log.Logger {
104
- filterOption := level .AllowDebug ()
144
+ func parseStatusFileSlice (statusFile string ) (string , string ) {
145
+ parts := strings .Split (statusFile , ":" )
146
+ if len (parts ) > 1 {
147
+ return parts [0 ], parts [1 ]
148
+ }
149
+ return "server" , parts [0 ]
150
+ }
151
+
152
+ func setupLogging (cfg * config.Config ) log.Logger {
105
153
logger := log .NewLogfmtLogger (log .NewSyncWriter (os .Stderr ))
106
- logger = level .NewFilter (logger , filterOption )
154
+
155
+ switch strings .ToLower (cfg .Logs .Level ) {
156
+ case "error" :
157
+ logger = level .NewFilter (logger , level .AllowError ())
158
+ case "warn" :
159
+ logger = level .NewFilter (logger , level .AllowWarn ())
160
+ case "info" :
161
+ logger = level .NewFilter (logger , level .AllowInfo ())
162
+ case "debug" :
163
+ logger = level .NewFilter (logger , level .AllowDebug ())
164
+ default :
165
+ logger = level .NewFilter (logger , level .AllowInfo ())
166
+ }
107
167
logger = log .With (logger ,
108
168
"ts" , log .DefaultTimestampUTC ,
109
169
"caller" , log .DefaultCaller ,
0 commit comments