1
1
#!/usr/bin/python3
2
+ """ Main trawler application """
2
3
3
4
import os
4
5
import time
5
- import alog
6
6
import threading
7
- import yaml
7
+ import ssl
8
+ import alog
8
9
import click
10
+ from prometheus_client import start_http_server , Gauge , Counter , make_wsgi_app
11
+ import yaml
9
12
from certs_net import CertsNet
10
13
from apiconnect_net import APIConnectNet
11
14
from datapower_net import DataPowerNet
12
15
from manager_net import ManagerNet
13
16
from analytics_net import AnalyticsNet
14
- from watch_pods import Watcher
15
- from prometheus_client import start_http_server
16
17
import metrics_graphite
17
- from prometheus_client import Gauge , Counter
18
18
19
19
20
20
logger = alog .use_channel ("trawler" )
@@ -67,24 +67,24 @@ def __init__(self, config_file=None):
67
67
# Check for KUBERNETES_SERVICE_HOST to determine if running within kubernetes
68
68
if os .getenv ('KUBERNETES_SERVICE_HOST' ):
69
69
self .use_kubeconfig = False
70
- self .watcher = Watcher ()
71
70
72
71
def read_secret (self , key ):
73
72
""" Helper function read secrets from mounted k8s secrets """
74
73
try :
75
- with open ("{}/{}" .format (self .secrets_path , key ), 'r' ) as secret :
74
+ with open ("{}/{}" .format (self .secrets_path , key ), 'r' , encoding = 'utf-8' ) as secret :
76
75
value = secret .read ().rstrip ()
77
76
return value
78
- except FileNotFoundError as e :
79
- logger .exception (e )
77
+ except FileNotFoundError as not_found_exception :
78
+ logger .exception (not_found_exception )
80
79
return None
81
80
82
81
def load_config (self , config_file ):
82
+ """ Load trawler config """
83
83
try :
84
- with open (config_file , 'r' ) as config_yaml :
84
+ with open (config_file , 'r' , encoding = 'utf-8' ) as config_yaml :
85
85
self .config = yaml .safe_load (config_yaml )
86
- except FileNotFoundError as e :
87
- logger .exception (e )
86
+ except FileNotFoundError as not_found_exception :
87
+ logger .exception (not_found_exception )
88
88
exit (2 )
89
89
90
90
def set_gauge (self , component , target_name , value , pod_name = None , labels = None ):
@@ -95,14 +95,15 @@ def set_gauge(self, component, target_name, value, pod_name=None, labels=None):
95
95
labels ['pod' ] = pod_name
96
96
if 'labels' in self .config ['prometheus' ]:
97
97
labels = {** self .config ['prometheus' ]['labels' ], ** labels }
98
- logger .debug ("Entering set_gauge - params: ({}, {}, {}, {})" .format (component , target_name , value , pod_name ))
98
+ logger .debug ("Entering set_gauge - params: (%s, %s, %s, %s)" ,
99
+ component , target_name , value , pod_name )
99
100
logger .debug (labels )
100
- if type (value ) is float or type ( value ) is int :
101
+ if isinstance (value , ( float , int )) :
101
102
target_name = target_name .replace ('-' , '_' )
102
103
if self .config ['prometheus' ]['enabled' ]:
103
104
prometheus_target = "{}_{}" .format (component , target_name .replace ('.' , '_' ))
104
105
if prometheus_target not in self .gauges :
105
- logger .info ("Creating gauge {}" . format ( prometheus_target ) )
106
+ logger .info ("Creating gauge %s" , prometheus_target )
106
107
if labels :
107
108
self .gauges [prometheus_target ] = Gauge (
108
109
prometheus_target ,
@@ -136,14 +137,15 @@ def inc_counter(self, component, target_name, value, pod_name=None, labels=None)
136
137
labels ['pod' ] = pod_name
137
138
if 'labels' in self .config ['prometheus' ]:
138
139
labels = {** self .config ['prometheus' ]['labels' ], ** labels }
139
- logger .debug ("Entering inc_counter - params: ({}, {}, {}, {})" .format (component , target_name , value , pod_name ))
140
+ logger .debug ("Entering inc_counter - params: (%s, %s, %s, %s)" ,
141
+ component , target_name , value , pod_name )
140
142
logger .debug (labels )
141
- if type (value ) is float or type ( value ) is int :
143
+ if isinstance (value , ( float , int )) :
142
144
target_name = target_name .replace ('-' , '_' )
143
145
if self .config ['prometheus' ]['enabled' ]:
144
146
prometheus_target = "{}_{}" .format (component , target_name .replace ('.' , '_' ))
145
147
if prometheus_target not in self .gauges :
146
- logger .info ("Creating counter {}" . format ( prometheus_target ) )
148
+ logger .info ("Creating counter %s" , prometheus_target )
147
149
if labels :
148
150
self .gauges [prometheus_target ] = Counter (
149
151
prometheus_target ,
@@ -166,28 +168,30 @@ def inc_counter(self, component, target_name, value, pod_name=None, labels=None)
166
168
metric_name = "{}.{}" .format (component , target_name )
167
169
self .graphite .stage (metric_name , value )
168
170
171
+ def is_enabled (self , net_name ):
172
+ """ is net in config and enabled """
173
+ if net_name in self .config ['nets' ]:
174
+ if self .config ['nets' ]['certs' ].get ('enabled' , True ):
175
+ return True
176
+ return False
177
+
169
178
@alog .timed_function (logger .trace )
170
179
def trawl_metrics (self ):
171
180
""" Main loop to trawl for metrics """
172
181
# Initialise
173
182
logger .info ("Laying nets..." )
174
183
nets = []
175
- if 'certs' in self .config [ 'nets' ] and self . config [ 'nets' ][ ' certs']. get ( 'enabled' , True ):
184
+ if self .is_enabled ( ' certs' ):
176
185
nets .append (CertsNet (self .config ['nets' ]['certs' ], self ))
177
- if 'apiconnect' in self .config [ 'nets' ] and self . config [ 'nets' ][ ' apiconnect']. get ( 'enabled' , True ):
186
+ if self .is_enabled ( ' apiconnect' ):
178
187
nets .append (APIConnectNet (self .config ['nets' ]['apiconnect' ], self ))
179
- if 'datapower' in self .config [ 'nets' ] and self . config [ 'nets' ][ ' datapower']. get ( 'enabled' , True ):
188
+ if self .is_enabled ( ' datapower' ):
180
189
nets .append (DataPowerNet (self .config ['nets' ]['datapower' ], self ))
181
- if 'manager' in self .config [ 'nets' ] and self . config [ 'nets' ][ ' manager']. get ( 'enabled' , True ):
190
+ if self .is_enabled ( ' manager' ):
182
191
nets .append (ManagerNet (self .config ['nets' ]['manager' ], self ))
183
- if 'analytics' in self .config [ 'nets' ] and self . config [ 'nets' ][ ' analytics']. get ( 'enabled' , True ):
192
+ if self .is_enabled ( ' analytics' ):
184
193
nets .append (AnalyticsNet (self .config ['nets' ]['analytics' ], self ))
185
194
186
- # Start thread to watch if needed (nets need to call watcher.register)
187
- if self .watcher .enabled :
188
- watchThread = threading .Thread (target = self .watcher .watch_pods , daemon = True )
189
- watchThread .start ()
190
-
191
195
while True :
192
196
logger .info ("Trawling for metrics..." )
193
197
for net in nets :
0 commit comments