Wait till all log files are in ElasticSearch

We push each log file into ElasticSearch search separately, so knowing one
file is there doesn't guarantee a different file from the same job is ready.
So instead of checking for just console.html use facets to make sure all
the relevant log files are ready.
This commit is contained in:
Joe Gordon 2013-09-18 13:55:37 -07:00
parent bb00befa8d
commit b0b024e080
2 changed files with 56 additions and 13 deletions

View File

@ -63,6 +63,24 @@ class Classifier():
}
}
}
files_ready_template = {
"sort": {
"@timestamp": {"order": "desc"}
},
"query": {
"query_string": {
"query": '@fields.build_status:"FAILURE" AND @fields.build_change:"%s" AND @fields.build_patchset:"%s"'
}
},
"facets": {
"tag": {
"terms": {
"field": "@fields.filename",
"size": 80
}
}
}
}
ready_template = {
"sort": {
"@timestamp": {"order": "desc"}
@ -70,7 +88,6 @@ class Classifier():
"query": {
"query_string": {
"query": '@tags:"console.html" AND (@message:"Finished: FAILURE") AND @fields.build_change:"%s" AND @fields.build_patchset:"%s"'
#"query": '@fields.filename:"console.html" AND @fields.build_status:"FAILURE" AND @message:"skipped" AND @message:"FAILED (failures" AND @fields.build_change:"%s" AND @fields.build_patchset:"%s"'
}
}
}
@ -124,17 +141,7 @@ class Classifier():
#Reload each time
self.queries = json.loads(open('queries.json').read())
#Wait till Elastic search is ready
query = self._apply_template(self.ready_template, (change_number, patch_number))
while True:
results = self.es.search(query, size='10')
if results['hits']['total'] > 0:
if self._urls_match(comment, results['hits']['hits']):
break
else:
time.sleep(40)
# Just because one file is parsed doesn't mean all are, so wait a
# bit
time.sleep(20)
self._wait_till_ready(change_number, patch_number, comment)
for x in self.queries:
print "Looking for bug: https://bugs.launchpad.net/bugs/%s" % x['bug']
query = self._apply_template(self.targeted_template, (x['query'],
@ -143,6 +150,40 @@ class Classifier():
if self._urls_match(comment, results['hits']['hits']):
return x['bug']
def _wait_till_ready(self, change_number, patch_number, comment):
query = self._apply_template(self.ready_template, (change_number,
patch_number))
while True:
results = self.es.search(query, size='10')
if (results['hits']['total'] > 0 and
self._urls_match(comment, results['hits']['hits'])):
break
else:
time.sleep(40)
query = self._apply_template(self.files_ready_template, (change_number,
patch_number))
while True:
results = self.es.search(query, size='80')
files = results['facets']['tag']['terms']
files = [x['term'] for x in files]
required_files = [
'console.html',
'logs/screen-key.txt',
'logs/screen-n-api.txt',
'logs/screen-n-cpu.txt',
'logs/screen-n-sch.txt',
'logs/screen-c-api.txt',
'logs/screen-c-vol.txt'
]
missing_files = [x for x in required_files if x not in files]
if len(missing_files) is 0:
break
else:
time.sleep(40)
# Just because one file is parsed doesn't mean all are, so wait a
# bit
time.sleep(20)
def _urls_match(self, comment, results):
for result in results:
url = result["_source"]['@fields']['log_url']

View File

@ -14,7 +14,9 @@ class TestClassifier(testtools.TestCase):
def test_elasticSearch(self):
self.classifier.test()
self.classifier.last_failures()
#self.assertFalse(True)
def test_ready(self):
self.classifier._wait_till_ready('30043', '34','BLAH http://logs.openstack.org/43/30043/34/check/gate-tempest-devstack-vm-full/b852a33')
def test_classify(self):
bug_number = self.classifier.classify('43258', '13',