72
72
HOST_TYPE_INSTANCE = "host-meta-data"
73
73
TOP_TYPE_INSTANCE = "top-info"
74
74
TYPE = "objects"
75
- NEXT_METADATA_SEND = 0
76
- NEXT_METADATA_SEND_INTERVAL = [random .randint (0 , 60 ), 60 ,
77
- 3600 + random .randint (0 , 60 ),
78
- 86400 + random .randint (0 , 600 )]
75
+
76
+
77
+ def DEFAULT_NEXT_METADATA_SEND ():
78
+ """returns the default next metadata send"""
79
+ return 0
80
+
81
+
82
+ NEXT_METADATA_SEND = DEFAULT_NEXT_METADATA_SEND ()
83
+ NEXT_METADATA_SEND_KEY = "NEXT_METADATA_SEND"
84
+
85
+
86
+ def DEFAULT_NEXT_METADATA_SEND_INTERVAL ():
87
+ """returns the default next metadata send intervals"""
88
+ return [random .randint (0 , 60 ), 60 ,
89
+ 3600 + random .randint (0 , 60 ),
90
+ 86400 + random .randint (0 , 600 )]
91
+
92
+
93
+ NEXT_METADATA_SEND_INTERVAL = DEFAULT_NEXT_METADATA_SEND_INTERVAL ()
94
+ NEXT_METADATA_SEND_INTERVAL_KEY = "NEXT_METADATA_SEND_INTERVAL"
79
95
LAST = 0
80
96
AWS = False
81
97
AWS_SET = False
97
113
PERCORECPUUTIL = False
98
114
OVERALLCPUUTIL = True
99
115
ETC_PATH = "{0}etc" .format (os .sep )
116
+ SAVED_HOST = None
117
+ SAVED_HOST_KEY = "SAVED_HOST"
118
+ PERSISTENCE_PATH = None
119
+ PERSISTENCE_FILE = "sfx_metadata_state.json"
100
120
101
121
102
122
class mdict (dict ):
@@ -848,9 +868,14 @@ def plugin_config(conf):
848
868
psutil .PROCFS_PATH = kv .values [0 ]
849
869
debug ("Setting proc path to %s for psutil" % psutil .PROCFS_PATH )
850
870
elif kv .key == 'EtcPath' :
871
+ global ETC_PATH
851
872
ETC_PATH = kv .values [0 ].rstrip (os .pathsep ).rstrip (os .sep )
852
873
debug ("Setting etc path to %s for os release detection"
853
874
% ETC_PATH )
875
+ elif kv .key == 'PersistencePath' :
876
+ global PERSISTENCE_PATH
877
+ PERSISTENCE_PATH = kv .values [0 ]
878
+ load_persistent_data ()
854
879
855
880
if not POST_URLS :
856
881
POST_URLS = [DEFAULT_POST_URL ]
@@ -883,6 +908,44 @@ def plugin_config(conf):
883
908
get_aws_info ()
884
909
885
910
911
+ def load_persistent_data ():
912
+ """Load persistent data from a specified path"""
913
+ try :
914
+ with open (os .path .join (PERSISTENCE_PATH , PERSISTENCE_FILE ), 'r' ) as js :
915
+ persist = json .load (js )
916
+ debug ("Loaded the following persistent data %s" % persist )
917
+ if SAVED_HOST_KEY in persist :
918
+ global SAVED_HOST
919
+ SAVED_HOST = persist [SAVED_HOST_KEY ]
920
+ if NEXT_METADATA_SEND_KEY in persist :
921
+ global NEXT_METADATA_SEND
922
+ NEXT_METADATA_SEND = persist [NEXT_METADATA_SEND_KEY ]
923
+ if NEXT_METADATA_SEND_INTERVAL_KEY in persist :
924
+ global NEXT_METADATA_SEND_INTERVAL
925
+ NEXT_METADATA_SEND_INTERVAL = \
926
+ persist [NEXT_METADATA_SEND_INTERVAL_KEY ]
927
+
928
+ except Exception as e :
929
+ debug ("Unable to load persistence data %s" % e )
930
+
931
+
932
+ def save_persistent_data ():
933
+ """Persist data about the metadata plugin to a file"""
934
+ if PERSISTENCE_PATH :
935
+ try :
936
+ with open (os .path .join (PERSISTENCE_PATH ,
937
+ PERSISTENCE_FILE ), 'w' ) as f :
938
+ persist = {
939
+ SAVED_HOST_KEY : HOST ,
940
+ NEXT_METADATA_SEND_KEY : NEXT_METADATA_SEND ,
941
+ NEXT_METADATA_SEND_INTERVAL_KEY :
942
+ NEXT_METADATA_SEND_INTERVAL
943
+ }
944
+ json .dump (persist , f )
945
+ except Exception as e :
946
+ debug ("Unable to save persistent data: %s" % e )
947
+
948
+
886
949
def compact (thing ):
887
950
return json .dumps (thing , separators = (',' , ':' ))
888
951
@@ -923,9 +986,9 @@ def send():
923
986
if NEXT_METADATA_SEND == 0 :
924
987
dither = NEXT_METADATA_SEND_INTERVAL .pop (0 )
925
988
NEXT_METADATA_SEND = time .time () + dither
926
- log (
927
- "adding small dither of %s seconds before sending notifications"
989
+ log ("adding small dither of %s seconds before sending notifications"
928
990
% dither )
991
+ save_persistent_data ()
929
992
if NEXT_METADATA_SEND < time .time ():
930
993
send_notifications ()
931
994
if len (NEXT_METADATA_SEND_INTERVAL ) > 1 :
@@ -936,11 +999,21 @@ def send():
936
999
937
1000
log ("till next metadata %s seconds"
938
1001
% str (NEXT_METADATA_SEND - time .time ()))
1002
+ save_persistent_data ()
939
1003
940
1004
global LAST
941
1005
LAST = time .time ()
942
1006
943
1007
1008
+ def reset_metadata_send ():
1009
+ """Reset the next metadata send and the metadata send intervals"""
1010
+ debug ("Resetting the next metadata send time and metadata send intervals." )
1011
+ global NEXT_METADATA_SEND
1012
+ NEXT_METADATA_SEND = DEFAULT_NEXT_METADATA_SEND ()
1013
+ global NEXT_METADATA_SEND_INTERVAL
1014
+ NEXT_METADATA_SEND_INTERVAL = DEFAULT_NEXT_METADATA_SEND_INTERVAL ()
1015
+
1016
+
944
1017
def all_interfaces ():
945
1018
946
1019
"""
@@ -1522,8 +1595,16 @@ def steal_host_from_notifications(notif):
1522
1595
# "host" from collectd.conf steal it from notifications we've put on the
1523
1596
# bus so we can use it for our own
1524
1597
global HOST
1598
+ global SAVED_HOST
1525
1599
if not HOST and notif .host :
1526
1600
HOST = notif .host
1601
+ # if host is identified and it's different from the saved_host,
1602
+ # reset the metadata send interval and next metadata send time
1603
+ if SAVED_HOST and SAVED_HOST != HOST :
1604
+ debug (("The saved hostname '{0}' does not match the current "
1605
+ "hostname '{1}'." ).format (SAVED_HOST , HOST ))
1606
+ reset_metadata_send ()
1607
+ SAVED_HOST = HOST
1527
1608
DOGSTATSD_INSTANCE .set_host (notif .host )
1528
1609
log ("found host " + HOST )
1529
1610
0 commit comments