12
12
from manager_net import ManagerNet
13
13
from analytics_net import AnalyticsNet
14
14
from watch_pods import Watcher
15
- from prometheus_client import start_http_server
15
+ from prometheus_client import start_http_server , Gauge , Counter , make_wsgi_app
16
16
import metrics_graphite
17
- from prometheus_client import Gauge , Counter
17
+ from flask import Flask
18
+ from werkzeug .middleware .dispatcher import DispatcherMiddleware
19
+ import ssl
18
20
19
21
20
22
logger = alog .use_channel ("trawler" )
23
+ app = Flask (__name__ )
24
+ app .wsgi_app = DispatcherMiddleware (app .wsgi_app , {
25
+ '/metrics' : make_wsgi_app ()
26
+ })
21
27
22
28
23
29
class Trawler (object ):
@@ -31,12 +37,15 @@ class Trawler(object):
31
37
# Default to True, but detected unless overridden in config
32
38
use_kubeconfig = True
33
39
# Default path for secrets in container build - override with envvar SECRETS
40
+ mtls = False
41
+ # mtls defaults to false. can be set via the ENABLE_MTLS environment variable
34
42
secrets_path = '/app/secrets'
35
43
graphite = None
36
44
gauges = {}
37
45
38
- def __init__ (self , config_file = None ):
46
+ def __init__ (self , config_file = None , ):
39
47
self .secrets_path = os .getenv ('SECRETS' , self .secrets_path )
48
+ self .mtls = os .getenv ("ENABLE_MTLS" , 'False' ).lower () in ('true' , '1' , 't' )
40
49
if config_file :
41
50
self .load_config (config_file )
42
51
if 'logging' in self .config :
@@ -49,9 +58,19 @@ def __init__(self, config_file=None):
49
58
alog .configure (default_level = 'info' , formatter = 'json' )
50
59
self .logger = alog .use_channel ("trawler" )
51
60
if self .config ['prometheus' ]['enabled' ]:
52
- port = self .config ['prometheus' ].get ('port' )
53
- logger .info ('Starting prometheus http port at http://0.0.0.0:{}' .format (port ))
54
- start_http_server (port )
61
+ if self .mtls :
62
+ cert_path = os .getenv ('CERT_PATH' )
63
+ port = self .config ['prometheus' ].get ('port' )
64
+ context = ssl .SSLContext (ssl .PROTOCOL_TLSv1_2 )
65
+ context .verify_mode = ssl .CERT_REQUIRED
66
+ context .load_verify_locations (cert_path + 'ca.crt' )
67
+ context .load_cert_chain (cert_path + 'tls.crt' , cert_path + 'tls.key' )
68
+ logger .info ('Starting flask https port at http://0.0.0.0:{}' .format (port ))
69
+ app .run ('0.0.0.0' , port , ssl_context = context )
70
+ else :
71
+ port = self .config ['prometheus' ].get ('port' )
72
+ logger .info ('Starting prometheus http port at http://0.0.0.0:{}' .format (port ))
73
+ start_http_server (port )
55
74
if self .config ['graphite' ]['enabled' ]:
56
75
self .graphite = metrics_graphite .instance (self .config ['graphite' ])
57
76
@@ -203,7 +222,7 @@ def trawl_metrics(self):
203
222
help = "Specifies an alternative config file" ,
204
223
default = None ,
205
224
type = click .Path ())
206
- def cli (config = None ):
225
+ def cli (config = None , ):
207
226
""" run main trawler application """
208
227
trawler = Trawler (config )
209
228
trawler .trawl_metrics ()
0 commit comments