-
Notifications
You must be signed in to change notification settings - Fork 0
/
consistency_check_compute.py
124 lines (102 loc) · 4.22 KB
/
consistency_check_compute.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
import paginator
import mongor
from datetime import datetime, timedelta
import argparse
import credentials
import config
import pprint
import collections
def compare_samples(samples_api, samples_db, verbose=False):
# First compare sizes of lists with samples
len_api = len(samples_api)
len_db = len(samples_db)
if verbose:
print( "INFO: Number of samples from API: {}".format(len_api) )
print( "INFO: Number of samples from the database: {}".format(len_db) )
if len_api == len_db:
print( "INFO: [SUCCESS] Numbers of samples ({}) match!".format(len_db) )
else:
print( "WARNING: [FAILURE] Number of samples from API ({}) and from the database ({}) don't match.".format(len_api, len_db) )
# Prepare a dictionary for samples from API
dict_samples_api = {}
for i in xrange( 0, len_api ):
message_id = samples_api[i].get('message_id')
if message_id:
dict_samples_api[message_id] = i
else:
print("WARNING: Dropping a sample without a message ID!")
if verbose:
pprint.pprint(samples_api[i])
"""
Go through the list of samples from the database and check which ones
are not in the dict from API.
(also stores the dict of samples from db for reference)
"""
dict_samples_db = {}
# a list of samples that are in the database but not in the results from API
missing_from_api = []
for i in xrange( 0, len_db ):
message_id = samples_db[i].get('message_id')
if message_id:
dict_samples_db[message_id] = i
# if a sample with current message ID is not in the dict from the API, it's missing
if dict_samples_api.get(message_id) is None:
missing_from_api.append(samples_db[i])
else:
print("WARNING: Dropping a sample without a message ID!")
if verbose:
pprint.pprint(samples_db[i])
len_missing_api = len(missing_from_api)
print( "INFO: {} Number of samples missing in the api: {}".format("[SUCCESS]" if len_missing_api == 0 else "[FAILURE]", len_missing_api) )
if verbose:
print("INFO: Here are the missing items:")
print(missing_from_api)
def extract_events_from_samples(samples):
"""Extracts event-based samples from a list of samples.
"""
# a list of event-based samples
event_samples = []
# a histogram of events
events_hist = collections.defaultdict(int)
for sample in samples:
if sample.get('resource_metadata') and sample['resource_metadata'].get('event_type'):
event_samples.append(sample)
events_hist[sample['resource_metadata']['event_type']] += 1
print("INFO: Event types tallied up:")
print(15*"*")
for key,value in events_hist.iteritems():
print( "{}: \t {}".format(key,value) )
print(15*"*")
return event_samples
def main():
parser = argparse.ArgumentParser()
parser.add_argument("instance_id", help="Instance ID to compare samples for.")
parser.add_argument("--verbose", help="increase output verbosity", action="store_true")
args = parser.parse_args()
instance_id = args.instance_id
verbose = False
if args.verbose:
print("INFO: Verbosity turned on.")
verbose = True
print("INFO: This will compare 2 weeks worth of samples for specified instance.")
# get a token
creds = credentials.Credentials()
token = creds.get_token()
# get config
conf = config.Config()
pag = paginator.Paginator(endpoint = conf.ceilometer_endpoint, token = token)
mon = mongor.Mongor()
time_end = datetime.utcnow()
time_begin = time_end - timedelta(days=14)
samples_api = pag.get_samples_for_instance(instance_id, time_begin, time_end)
samples_db = mon.get_samples_for_instance(instance_id, time_begin, time_end)
compare_samples(samples_api, samples_db, verbose)
event_samples = extract_events_from_samples(samples_db)
if verbose:
print("INFO: All the event-based samples:")
for event in event_samples:
pprint.pprint(event)
print("----------------")
print( "INFO: There are {} event-based samples.".format(len(event_samples)) )
if __name__ == "__main__":
main()