Files
zuul/zuul/driver/elasticsearch/reporter.py
T
Thomas Cardonne 8c6b87cfff Elasticsearch: filter zuul data from job returned vars
Remove data under the `zuul` key from the job returned vars.
These returned values are meant to be used only by Zuul and
shouldn't be included in documents as it may include large amount
of data such as file comments.

Change-Id: Ie6de7e3373b21b7c234ffedd5db7d3ca5a0645b6
2022-09-17 23:38:23 +02:00

128 lines
4.6 KiB
Python

# Copyright 2019 Red Hat, Inc.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
import time
import logging
import voluptuous as v
from zuul.reporter import BaseReporter
class ElasticsearchReporter(BaseReporter):
name = 'elasticsearch'
log = logging.getLogger("zuul.ElasticsearchReporter")
def __init__(self, driver, connection, config):
super(ElasticsearchReporter, self).__init__(driver, connection, config)
self.index = self.config.get('index', 'zuul')
self.index_vars = self.config.get('index-vars')
self.index_returned_vars = self.config.get('index-returned-vars')
def report(self, item, phase1=True, phase2=True):
"""Create an entry into a database."""
if not phase1:
return
docs = []
index = '%s.%s-%s' % (self.index, item.pipeline.tenant.name,
time.strftime("%Y.%m.%d"))
buildset_doc = {
"uuid": item.current_build_set.uuid,
"build_type": "buildset",
"tenant": item.pipeline.tenant.name,
"pipeline": item.pipeline.name,
"project": item.change.project.name,
"change": getattr(item.change, 'number', None),
"patchset": getattr(item.change, 'patchset', None),
"ref": getattr(item.change, 'ref', ''),
"oldrev": getattr(item.change, 'oldrev', ''),
"newrev": getattr(item.change, 'newrev', ''),
"branch": getattr(item.change, 'branch', ''),
"zuul_ref": item.current_build_set.ref,
"ref_url": item.change.url,
"result": item.current_build_set.result,
"message": self._formatItemReport(item, with_jobs=False)
}
for job in item.getJobs():
build = item.current_build_set.getBuild(job.name)
if not build:
continue
# Ensure end_time is defined
if not build.end_time:
build.end_time = time.time()
# Ensure start_time is defined
if not build.start_time:
build.start_time = build.end_time
(result, url) = item.formatJobResult(job)
# Manage to set time attributes in buildset
start_time = int(build.start_time)
end_time = int(build.end_time)
if ('start_time' not in buildset_doc or
buildset_doc['start_time'] > start_time):
buildset_doc['start_time'] = start_time
if ('end_time' not in buildset_doc or
buildset_doc['end_time'] < end_time):
buildset_doc['end_time'] = end_time
buildset_doc['duration'] = (
buildset_doc['end_time'] - buildset_doc['start_time'])
build_doc = {
"uuid": build.uuid,
"build_type": "build",
"buildset_uuid": buildset_doc['uuid'],
"job_name": build.job.name,
"result": result,
"start_time": str(start_time),
"end_time": str(end_time),
"duration": end_time - start_time,
"voting": build.job.voting,
"log_url": url,
}
# Extends the build doc with some buildset info
for attr in (
'tenant', 'pipeline', 'project', 'change', 'patchset',
'ref', 'oldrev', 'newrev', 'branch'):
build_doc[attr] = buildset_doc[attr]
if self.index_vars:
build_doc['job_vars'] = job.variables
if self.index_returned_vars:
rdata = build.result_data.copy()
rdata.pop('zuul', None)
build_doc['job_returned_vars'] = rdata
docs.append(build_doc)
docs.append(buildset_doc)
self.connection.add_docs(docs, index)
def getSchema():
el_reporter = v.Schema(
v.Any(
None,
{
'index': str,
'index-vars': bool,
'index-returned-vars': bool
}
)
)
return el_reporter