Skip to content

Commit cb3923d

Browse files
optionally persist metadata sends from metadata plugin (#57)
* optionally persist metadata sends from metadata plugin
1 parent 6194d1b commit cb3923d

File tree

1 file changed

+87
-6
lines changed

1 file changed

+87
-6
lines changed

src/signalfx_metadata.py

Lines changed: 87 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,10 +72,26 @@
7272
HOST_TYPE_INSTANCE = "host-meta-data"
7373
TOP_TYPE_INSTANCE = "top-info"
7474
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"
7995
LAST = 0
8096
AWS = False
8197
AWS_SET = False
@@ -97,6 +113,10 @@
97113
PERCORECPUUTIL = False
98114
OVERALLCPUUTIL = True
99115
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"
100120

101121

102122
class mdict(dict):
@@ -848,9 +868,14 @@ def plugin_config(conf):
848868
psutil.PROCFS_PATH = kv.values[0]
849869
debug("Setting proc path to %s for psutil" % psutil.PROCFS_PATH)
850870
elif kv.key == 'EtcPath':
871+
global ETC_PATH
851872
ETC_PATH = kv.values[0].rstrip(os.pathsep).rstrip(os.sep)
852873
debug("Setting etc path to %s for os release detection"
853874
% ETC_PATH)
875+
elif kv.key == 'PersistencePath':
876+
global PERSISTENCE_PATH
877+
PERSISTENCE_PATH = kv.values[0]
878+
load_persistent_data()
854879

855880
if not POST_URLS:
856881
POST_URLS = [DEFAULT_POST_URL]
@@ -883,6 +908,44 @@ def plugin_config(conf):
883908
get_aws_info()
884909

885910

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+
886949
def compact(thing):
887950
return json.dumps(thing, separators=(',', ':'))
888951

@@ -923,9 +986,9 @@ def send():
923986
if NEXT_METADATA_SEND == 0:
924987
dither = NEXT_METADATA_SEND_INTERVAL.pop(0)
925988
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"
928990
% dither)
991+
save_persistent_data()
929992
if NEXT_METADATA_SEND < time.time():
930993
send_notifications()
931994
if len(NEXT_METADATA_SEND_INTERVAL) > 1:
@@ -936,11 +999,21 @@ def send():
936999

9371000
log("till next metadata %s seconds"
9381001
% str(NEXT_METADATA_SEND - time.time()))
1002+
save_persistent_data()
9391003

9401004
global LAST
9411005
LAST = time.time()
9421006

9431007

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+
9441017
def all_interfaces():
9451018

9461019
"""
@@ -1522,8 +1595,16 @@ def steal_host_from_notifications(notif):
15221595
# "host" from collectd.conf steal it from notifications we've put on the
15231596
# bus so we can use it for our own
15241597
global HOST
1598+
global SAVED_HOST
15251599
if not HOST and notif.host:
15261600
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
15271608
DOGSTATSD_INSTANCE.set_host(notif.host)
15281609
log("found host " + HOST)
15291610

0 commit comments

Comments
 (0)