Add Opensearch dashboards backup script; add dashboards objects

The OpenSearch dashboards objects like index-pattern, visualizations
and dashboards should be versioned.
This commit just provide a tool to make a backup of OpenSearch
dashboards objects and verify in simple deployment, if the objects
have been restored correctly.
The whole mechanism to replace visualizations and dashboards that
currently are available in OpenSearch Dashboards will be done in
next patch set.

Change-Id: I4f14d9309ae0a943dbaafd220c88c76dba793f91
This commit is contained in:
Daniel Pawlik 2022-10-10 10:00:36 +02:00
parent a369aa0159
commit 368e56c00a
10 changed files with 1343 additions and 0 deletions

View File

@ -22,6 +22,11 @@ Elasticsearch service.
NOTE: build directories that does not provide files `buildinfo`
and `inventory.yaml` file are skipped.
Opensearch Dashboards Backup
----------------------------
The OpenSearch Dashboards Backup script helps to create OpenSearch
Dashboards objects versioning.
Available workflows
-------------------

View File

@ -25,3 +25,8 @@
include_role:
name: check-services
tasks_from: download.yml
- name: Run backup and restore test
include_role:
name: backup-dashboards-objects
tasks_from: main.yml

View File

@ -31,3 +31,4 @@
state: latest
roles:
- check-services
- backup-dashboards-objects

View File

@ -0,0 +1,2 @@
---
backup_dir: /mnt/dashboards-objects

View File

@ -0,0 +1,160 @@
---
# Opensearch Dashboards
- name: Setup Opensearch Dashboards
shell: >
podman run -d --name opensearch-dashboards
--network host
-e "OPENSEARCH_HOST=https://127.0.0.1:9200"
quay.io/software-factory/opensearch-dashboards:1.1.0
- name: Wait for Opensearch Dashboards to be up
wait_for:
host: 127.0.0.1
port: 5601
delay: 10
timeout: 300
- name: Ensure Opensearch Dashboards to be up
uri:
url: "http://0.0.0.0:5601/app/login"
user: "admin"
password: "admin"
force_basic_auth: true
method: GET
status_code: "200"
register: result
until: result.status == 200
retries: 30
delay: 10
# Restore Openstack Opensearch Dashboards Objects
- name: Set Dashboards backup directory
set_fact:
original_backup_dir: "{{ ansible_user_dir + '/' + zuul.project.src_dir | default('~/ci-log-processing') }}/opensearch-dashboards-objects"
- name: Get backup files to restore
shell: |
ls {{ original_backup_dir }}
register: _backup_files
- name: Run restore backup files as privileged user
shell: >
podman run --rm -v {{ original_backup_dir }}:{{ original_backup_dir }}:z
--network host
{{ container_images.logscraper | default('quay.io/logscraper:dev') }}
opensearch_dashboards_backup
restore
--dashboard-api-url http://127.0.0.1:5601
--tenant global
--user 'admin' --password 'admin'
--file {{ original_backup_dir }}/{{ item }}
--host 127.0.0.1 --port 9200
--insecure
loop: "{{ _backup_files.stdout_lines }}"
- name: Run restore backup files as non privileged user
shell: >
podman run --rm -v {{ original_backup_dir }}:{{ original_backup_dir }}:z
--network host
{{ container_images.logscraper | default('quay.io/logscraper:dev') }}
opensearch_dashboards_backup
restore
--dashboard-api-url http://127.0.0.1:5601
--tenant global
--user 'kibanaro' --password 'kibanaro'
--file {{ original_backup_dir }}/{{ item }}
--host 127.0.0.1 --port 9200
--insecure
loop: "{{ _backup_files.stdout_lines }}"
register: _ro_user_restore
failed_when: _ro_user_restore.rc == 0
# Backup
# NOTE: Set owner and group like it is set in the container image.
- name: Create backup directory
become: true
file:
path: "{{ backup_dir }}"
state: directory
owner: "1000"
group: "1000"
- name: Create backup as readonly user
shell: >
podman run --rm -v {{ backup_dir }}:{{ backup_dir }}:z
--network host
{{ container_images.logscraper | default('quay.io/logscraper:dev') }}
opensearch_dashboards_backup
backup
--dashboard-api-url http://127.0.0.1:5601
--tenant global
--user 'kibanaro' --password 'kibanaro'
--backup-dir {{ backup_dir }}
--insecure
# Check new backup files
- name: Get content of new backup - index pattern
command: |
cat {{ backup_dir }}/index-pattern-global.yaml
register: index_pattern_new
- name: Get content of new backup - dashboard
command: |
cat {{ backup_dir }}/dashboard-global.yaml
register: dashboard_new
- name: Get content of new backup - visualization
command: |
cat {{ backup_dir }}/visualization-global.yaml
register: visualization_new
- name: Fail if there are not required words in new backup
fail:
msg: "New backup file can be broken!"
when:
- "'dashboard' not in dashboard_new.stdout"
- "'visualization' not in visualization_new.stdout"
- "'index' not in index_pattern_new.stdout"
# Ensure that new backup files can be restored
# TODO: remove old objects before restore
- name: Set Dashboards backup directory
set_fact:
original_backup_dir: "{{ backup_dir }}"
- name: Get backup files to restore
shell: |
ls {{ original_backup_dir }}
register: _backup_files
- name: Run restore backup files as privileged user
shell: >
podman run --rm -v {{ original_backup_dir }}:{{ original_backup_dir }}:z
--network host
{{ container_images.logscraper | default('quay.io/logscraper:dev') }}
opensearch_dashboards_backup
restore
--dashboard-api-url http://127.0.0.1:5601
--tenant global
--user 'admin' --password 'admin'
--file {{ original_backup_dir }}/{{ item }}
--host 127.0.0.1 --port 9200
--insecure
loop: "{{ _backup_files.stdout_lines }}"
- name: Run restore backup files as non privileged user
shell: >
podman run --rm -v {{ original_backup_dir }}:{{ original_backup_dir }}:z
--network host
{{ container_images.logscraper | default('quay.io/logscraper:dev') }}
opensearch_dashboards_backup
restore
--dashboard-api-url http://127.0.0.1:5601
--tenant global
--user 'kibanaro' --password 'kibanaro'
--file {{ original_backup_dir }}/{{ item }}
--host 127.0.0.1 --port 9200
--insecure
loop: "{{ _backup_files.stdout_lines }}"
register: _ro_user_restore
failed_when: _ro_user_restore.rc == 0

View File

@ -0,0 +1,485 @@
#!/usr/bin/env python3
#
# 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 argparse
import datetime
import json
import logging
import os
import requests
import sys
import time
import yaml
try:
from logsender import get_es_client
except ImportError:
from logscraper.logsender import get_es_client
from urllib.parse import urlparse
saved_objects_types = ('index-pattern', 'visualization', 'dashboard')
to_remove_keys = ['updated_at', 'version', 'migrationVersion']
def get_arguments():
args_parser = argparse.ArgumentParser(
description='Backup, restore or convert OpenSearch Dashboards '
'saved objects.')
args_parser.add_argument('action',
choices=['backup', 'restore', 'convert'],
metavar='N')
args_parser.add_argument('--dashboard-api-url',
default='http://127.0.0.1:5601',
help='URL to access Opensearch Dashboards API. '
'NOTE: if the instance is AWS Opensearch service,'
' url should end with /_dashboards.')
args_parser.add_argument('--file', help='File to restore or convert from '
'ndjson to yaml')
args_parser.add_argument('--username', default='',
help='Opensearch dashboards username')
args_parser.add_argument('--password', default='', help='Opensearch '
'dasboards password')
args_parser.add_argument('--backup-dir',
help='Dir where backups will be stored',
default=os.path.dirname(
os.path.realpath(__file__)))
args_parser.add_argument('--no-resolve-conflicts',
default=False,
help='Resolve conflicts by removing index '
'id reference in backup file')
args_parser.add_argument('--overwrite-index-pattern',
action='store_true',
help='WARNING: Use that option if you want'
'to restart also index pattern')
args_parser.add_argument('--insecure',
action='store_false',
help='Use that option to ignore if SSL cert '
'has been verified by root CA')
args_parser.add_argument('--tenant',
help='Specify tenant for getting data.'
'NOTE: if none is set, it will take Global')
args_parser.add_argument('--all-tenants',
action='store_true',
help='Bakup all objects in all '
'tenants. Works only with backup.'
'NOTE: requires param: --opensearch-api-url')
args_parser.add_argument('--skip-verify-index',
action='store_true',
help='Skip checking that if object reference to '
'index pattern exists in the Opensearch '
'Dashboards.')
args_parser.add_argument('--host',
help='Opensearch host. Need to ensure that '
'index pattern exists before restore')
args_parser.add_argument('--port',
help='Opensearch port. Need to ensure that '
'index pattern exists before restore')
args_parser.add_argument('--ca-file',
help='Custom CA certificate file')
args_parser.add_argument("--debug", help="Print more information",
type=bool,
default=False)
return args_parser.parse_args()
def convert_to_yaml(text, remove_references):
# reparse text
text_lines = []
try:
for line in text:
if isinstance(line, dict):
text_lines.append(line)
else:
text_lines.append(json.loads(line))
except Exception as e:
logging.critical(e)
if remove_references:
text_lines = remove_reference(text_lines)
# Disable aliases/anchors
yaml.Dumper.ignore_aliases = lambda *args: True
return yaml.dump(text_lines)
def save_content_to_file(text, backup_file, remove_references=True):
if isinstance(text, dict):
text = str(text)
text = convert_to_yaml(text, remove_references)
with open(backup_file, 'a') as f:
f.write(text)
def parse_dashboards_output(text):
new_text = []
try:
text = [json.loads(text)]
except json.decoder.JSONDecodeError:
for text_obj in text.rsplit('\n'):
n_text = json.loads(text_obj)
new_text.append(n_text)
return new_text if new_text else text
def check_if_empty(text):
text = json.loads(text)
if 'exportedCount' in text and text['exportedCount'] == 0:
return True
def remove_obj_keys(ref):
for k in to_remove_keys:
ref.pop(k, None)
return ref
def check_kibana_api(dashboard_api_url):
"""Check if OpenSearch Dashboards API is available"""
r = requests.get(dashboard_api_url)
if r.status_code != 404:
return True
def remove_reference(text):
new_text = []
new_references = []
for text_obj in text:
if 'references' not in text_obj:
new_text.append(text_obj)
continue
for ref in text_obj['references']:
if (not ref.get('id').startswith('AX')
and len(ref.get('id')) != 20 and
remove_obj_keys(ref) not in new_references):
new_references.append(remove_obj_keys(ref))
text_obj['references'] = new_references
new_text.append(text_obj)
return new_text if new_text else text
def _ensure_index_exists(index_id, es_client):
'''Ensure that index_id exists in the Opensearch dashboards'''
body = {
"_source": ["index-pattern.title"],
"query": {
"term": {
"type": "index-pattern"
}
}
}
index_patterns = es_client.search(body=body)
if 'hits' not in index_patterns:
logging.critical("Can not get any index pattern list. "
"Check permissions!")
return
if not index_patterns['hits']['total']['value']:
logging.info("Index pattern with id %s does not exists" % index_id)
return
for index in index_patterns['hits']['hits']:
if index['_id'] == "index-pattern:%s" % index_id:
index_name = index['_source']['index-pattern']['title']
logging.info("Found index pattern. It belongs to %s" % index_name)
# Ensure once again that the index pattern exists
return es_client.indices.exists(index=index_name)
def filter_dashboards_object(dash_obj, overwrite_index, es_client,
skip_verify_index):
"""Filter OpenSearch Dasjboards object
Filter objects that got index-pattern or have reference to unexisting
index pattern
"""
if not isinstance(dash_obj, dict):
dash_obj = json.loads(dash_obj)
# Restore index pattern when it does not exists. Otherwise restore it.
if dash_obj.get('type') == 'index-pattern' and not skip_verify_index:
is_index = _ensure_index_exists(dash_obj.get('id'), es_client)
if is_index and not overwrite_index:
return
if 'references' in dash_obj and dash_obj.get('references', []):
for ref in dash_obj['references']:
if skip_verify_index:
continue
if ref.get('type') == 'index-pattern' and not skip_verify_index:
is_index = _ensure_index_exists(ref.get('id'), es_client)
if not is_index:
logging.critical("Can not restore that object due index "
"pattern %s does not exists!" %
ref.get('id'))
return
return dash_obj
def make_request(url, username, password, text, tenant, cookies,
insecure=False, retry=True):
r = None
headers = {'osd-xsrf': 'true'}
if tenant:
headers['securitytenant'] = tenant
try:
r = requests.post(url,
auth=(username, password),
headers=headers,
files={'file': ('backup.ndjson', text)},
timeout=10,
verify=insecure)
except requests.exceptions.ReadTimeout:
if not retry:
logging.warning("Importing failed. Retrying...")
time.sleep(10)
make_request(url, username, password, text, tenant, cookies,
insecure)
if r is None:
logging.critical("Can not reach Opensearch Dashboards service.")
sys.exit(1)
if r and "Please enter your credentials" in r.text:
logging.warning("Please provide correct username and password")
sys.exit(1)
if r.status_code == 401:
logging.warning("Unauthorized. Please provide username and password")
return r
def _get_file_content(backup_file):
if (backup_file.endswith('yml') or backup_file.endswith('yaml')):
with open(backup_file) as f:
text = yaml.safe_load(f)
else:
with open(backup_file) as f:
text = f.readlines()
return text
def _get_cookies(base_url, tenant, user, password):
# NOTE: Helpful link:
# https://github.com/Petes77/AWS-Native-SIEM/blob/main/source/lambda/deploy_es/index.py
headers = {'Content-Type': 'application/json', 'osd-xsrf': 'true'}
url = '%s/auth/login?security_tenant=%s' % (base_url, tenant)
auth = {'username': user, 'password': password}
response = requests.post(url, headers=headers, json=json.dumps(auth))
return response.cookies
def setup_logging(debug):
if debug:
logging.basicConfig(format="%(asctime)s %(message)s",
level=logging.DEBUG)
else:
logging.basicConfig(level=logging.INFO)
def backup(dashboard_api_url, username, password, backup_dir, insecure,
tenant):
"""Return string with newline-delimitered json """
saved_objects = {}
if not backup_dir:
backup_dir = os.path.dirname(os.path.realpath(__file__))
# Set the same time for all backups if previous exists
b_time = datetime.datetime.now().strftime("%Y-%m-%d-%H:%M")
cookies = _get_cookies(dashboard_api_url, tenant, username, password)
url = dashboard_api_url + '/api/saved_objects/_export'
for obj_type in saved_objects_types:
logging.debug("Working on %s" % obj_type)
headers = {'Content-Type': 'application/json',
'osd-xsrf': 'true'}
if tenant:
headers['securitytenant'] = tenant
payload = {'type': [obj_type], 'excludeExportDetails': True}
r = requests.post(url,
auth=(username, password),
cookies=cookies,
headers=headers,
json=json.dumps(payload),
verify=insecure)
if r.status_code == 400:
# Print warning on missing object, but continue
logging.warning("Can not backup object %s" % obj_type)
continue
else:
r.raise_for_status()
if not r.text:
continue
if tenant:
backup_file = "%s/%s-%s.yaml" % (backup_dir, obj_type, tenant)
else:
backup_file = "%s/%s.yaml" % (backup_dir, obj_type)
if os.path.exists(backup_file):
backup_file = "%s-%s" % (backup_file, b_time)
text = parse_dashboards_output(r.text)
saved_objects[obj_type] = text
save_content_to_file(text, backup_file)
def restore(dashboard_api_url, username, password, text, resolve_conflicts,
insecure, tenant, overwrite_index, es_client, skip_verify_index):
"""Restore object to OpenSearch Dashboards."""
cookies = _get_cookies(dashboard_api_url, tenant, username, password)
url = dashboard_api_url + '/api/saved_objects/_import?overwrite=true'
if not isinstance(text, list):
text = [text]
for dash_obj in text:
logging.debug("Working on %s" % dash_obj)
dash_obj = filter_dashboards_object(dash_obj, overwrite_index,
es_client, skip_verify_index)
if not dash_obj:
continue
if not isinstance(dash_obj, dict):
# Ensure that the dash_obj is one-time converted json object
dash_obj = json.dumps(json.loads(dash_obj))
else:
dash_obj = json.dumps(dash_obj)
if check_if_empty(dash_obj):
logging.info("Spotted empty object. Continue...")
continue
r = make_request(url, username, password, dash_obj, tenant, cookies,
insecure)
try:
response_error = json.loads(r.text)
if response_error.get('errors'):
logging.warning("\n\nSome problem on restoring %s: %s\n\n" %
(dash_obj, response_error['errors']))
except Exception as e:
logging.critical("The object to restore does not "
"look correct: %s" % e)
if not r:
logging.warning("Can not import %s into OpenSearch "
"Dashboards. Skipping..." % dash_obj)
continue
response_text = json.loads(r.text)
if not response_text['success'] and resolve_conflicts:
text = remove_reference(dash_obj)
r = make_request(url, username, password, text, tenant, cookies,
insecure)
logging.info("Restore status: %s with details %s" % (r.reason, r.text))
r.raise_for_status()
def convert(text, convert_file):
convert_file = "%s-converted.yaml" % convert_file
save_content_to_file(text, convert_file, False)
logging.info("File converted. You can check %s" % convert_file)
def get_all_tenants(opensearch_api_url, username, password, insecure):
url = "%s/_opendistro/_security/api/tenants/" % opensearch_api_url
r = requests.get(url, auth=(username, password), verify=insecure)
if r.status_code != 200:
r.raise_for_status()
sys.exit(1)
return list(json.loads(r.text))
def main():
args = get_arguments()
dashboard_api_url = args.dashboard_api_url
setup_logging(args.debug)
if (not args.dashboard_api_url.startswith('http')
and not args.dashboard_api_url.startswith('https')):
dashboard_api_url = "https://%s" % args.dashboard_api_url
if (not dashboard_api_url.endswith('_dashboards') and
not urlparse(dashboard_api_url).port == 5601 and
not check_kibana_api(dashboard_api_url)):
# NOTE: The url should look like:
# https://opensearch.logs.openstack.org/_dashboards
# Old OpenSearch might not contain the _dashboards in the url.
dashboard_api_url = "%s/_dashboards" % dashboard_api_url
if args.action == 'backup':
if args.all_tenants and args.tenant:
logging.critical("Can not use --all-tenants with --tenant option")
sys.exit(1)
if args.all_tenants:
if not args.opensearch_api_url:
logging.critical('Please provide --opensearch-api-url to list '
'all tenants available in Elasticsearch.')
sys.exit(1)
all_tenants = get_all_tenants(args.opensearch_api_url,
args.username, args.password,
args.insecure)
for tenant in all_tenants:
backup(dashboard_api_url, args.username, args.password,
args.backup_dir, args.insecure, tenant)
else:
backup(dashboard_api_url, args.username, args.password,
args.backup_dir, args.insecure, args.tenant)
elif args.action == 'restore':
if not args.file:
logging.critical("Please provide --file to restore!")
sys.exit(1)
es_client = None
if not args.skip_verify_index and (not args.host and not args.port):
logging.critical("Can not continue. Please provide --host and "
"--port params")
sys.exit(1)
if args.host and args.port:
es_client = get_es_client(args)
text = _get_file_content(args.file)
restore(dashboard_api_url, args.username, args.password,
text, args.no_resolve_conflicts, args.insecure, args.tenant,
args.overwrite_index_pattern, es_client,
args.skip_verify_index)
elif args.action == 'convert':
if not args.file:
logging.critical("Please provide --file to convert!")
sys.exit(1)
text = _get_file_content(args.file)
convert(text, args.file)
if __name__ == "__main__":
main()

View File

@ -0,0 +1,266 @@
- attributes:
description: ''
hits: 0
kibanaSavedObjectMeta:
searchSourceJSON: '{"query":{"query":"","language":"kuery"},"filter":[]}'
optionsJSON: '{"hidePanelTitles":false,"useMargins":true}'
panelsJSON: '[{"version":"2.3.0","gridData":{"h":20,"i":"ba34ecbe-c58f-4ffd-ab15-09bc9b1c7bb8","w":24,"x":0,"y":0},"panelIndex":"ba34ecbe-c58f-4ffd-ab15-09bc9b1c7bb8","embeddableConfig":{"vis":{"params":{"sort":{"columnIndex":1,"direction":"desc"}}},"table":null},"panelRefName":"panel_0"},{"version":"2.3.0","gridData":{"h":20,"i":"d3ec09db-1f70-4b7a-8176-04be98599f1f","w":24,"x":24,"y":0},"panelIndex":"d3ec09db-1f70-4b7a-8176-04be98599f1f","embeddableConfig":{},"panelRefName":"panel_1"},{"version":"2.3.0","gridData":{"h":20,"i":"97de7c5f-f99a-4c26-92a3-006a540341ec","w":24,"x":0,"y":20},"panelIndex":"97de7c5f-f99a-4c26-92a3-006a540341ec","embeddableConfig":{},"panelRefName":"panel_2"},{"version":"2.3.0","gridData":{"h":20,"i":"75227adc-78b1-46ac-8ad6-c8c3631feb48","w":24,"x":24,"y":20},"panelIndex":"75227adc-78b1-46ac-8ad6-c8c3631feb48","embeddableConfig":{"vis":{"params":{"sort":{"columnIndex":0,"direction":null}}},"table":null},"panelRefName":"panel_3"}]'
timeRestore: false
title: Subunit - Test Results
version: 1
id: a2282980-4327-11ed-8b28-cdde0c7cf02f
migrationVersion:
dashboard: 7.9.3
references:
- id: 0622de00-4326-11ed-8b28-cdde0c7cf02f
name: panel_0
type: visualization
- id: 0faeb700-4326-11ed-8b28-cdde0c7cf02f
name: panel_1
type: visualization
- id: 3aef4150-4326-11ed-8b28-cdde0c7cf02f
name: panel_2
type: visualization
- id: 60963b70-4326-11ed-8b28-cdde0c7cf02f
name: panel_3
type: visualization
- id: f265f480-ab89-11ec-91e6-db9fe3b6eb30
name: panel_0
type: visualization
- id: 82acec10-ab8a-11ec-8d45-61a12b5378d4
name: panel_1
type: visualization
- id: c913a8d0-ab8d-11ec-bc63-0df653d5ab54
name: panel_2
type: visualization
type: dashboard
updated_at: '2022-10-03T15:09:04.276Z'
version: WzQ0MDAsMV0=
- attributes:
description: ''
hits: 0
kibanaSavedObjectMeta:
searchSourceJSON: '{"query":{"query":"","language":"kuery"},"filter":[]}'
optionsJSON: '{"hidePanelTitles":false,"useMargins":true}'
panelsJSON: '[{"version":"2.3.0","gridData":{"h":20,"i":"ba34ecbe-c58f-4ffd-ab15-09bc9b1c7bb8","w":24,"x":0,"y":0},"panelIndex":"ba34ecbe-c58f-4ffd-ab15-09bc9b1c7bb8","embeddableConfig":{"vis":{"params":{"sort":{"columnIndex":1,"direction":"desc"}}},"table":null},"panelRefName":"panel_0"},{"version":"2.3.0","gridData":{"h":20,"i":"d3ec09db-1f70-4b7a-8176-04be98599f1f","w":24,"x":24,"y":0},"panelIndex":"d3ec09db-1f70-4b7a-8176-04be98599f1f","embeddableConfig":{},"panelRefName":"panel_1"},{"version":"2.3.0","gridData":{"h":20,"i":"97de7c5f-f99a-4c26-92a3-006a540341ec","w":24,"x":0,"y":20},"panelIndex":"97de7c5f-f99a-4c26-92a3-006a540341ec","embeddableConfig":{},"panelRefName":"panel_2"},{"version":"2.3.0","gridData":{"h":20,"i":"75227adc-78b1-46ac-8ad6-c8c3631feb48","w":24,"x":24,"y":20},"panelIndex":"75227adc-78b1-46ac-8ad6-c8c3631feb48","embeddableConfig":{"vis":{"params":{"sort":{"columnIndex":0,"direction":null}}},"table":null},"panelRefName":"panel_3"}]'
timeRestore: false
title: Subunit - Test Results
version: 1
id: a2282980-4327-11ed-8b28-cdde0c7cf02f
migrationVersion:
dashboard: 7.9.3
references:
- id: 0622de00-4326-11ed-8b28-cdde0c7cf02f
name: panel_0
type: visualization
- id: 0faeb700-4326-11ed-8b28-cdde0c7cf02f
name: panel_1
type: visualization
- id: 3aef4150-4326-11ed-8b28-cdde0c7cf02f
name: panel_2
type: visualization
- id: 60963b70-4326-11ed-8b28-cdde0c7cf02f
name: panel_3
type: visualization
- id: f265f480-ab89-11ec-91e6-db9fe3b6eb30
name: panel_0
type: visualization
- id: 82acec10-ab8a-11ec-8d45-61a12b5378d4
name: panel_1
type: visualization
- id: c913a8d0-ab8d-11ec-bc63-0df653d5ab54
name: panel_2
type: visualization
type: dashboard
updated_at: '2022-10-03T15:09:04.276Z'
version: WzQ0MDAsMV0=
- attributes:
description: ''
hits: 0
kibanaSavedObjectMeta:
searchSourceJSON: '{"query":{"query":"","language":"kuery"},"filter":[]}'
optionsJSON: '{"hidePanelTitles":false,"useMargins":true}'
panelsJSON: '[{"version":"2.3.0","gridData":{"h":20,"i":"ba34ecbe-c58f-4ffd-ab15-09bc9b1c7bb8","w":24,"x":0,"y":0},"panelIndex":"ba34ecbe-c58f-4ffd-ab15-09bc9b1c7bb8","embeddableConfig":{"vis":{"params":{"sort":{"columnIndex":1,"direction":"desc"}}},"table":null},"panelRefName":"panel_0"},{"version":"2.3.0","gridData":{"h":20,"i":"d3ec09db-1f70-4b7a-8176-04be98599f1f","w":24,"x":24,"y":0},"panelIndex":"d3ec09db-1f70-4b7a-8176-04be98599f1f","embeddableConfig":{},"panelRefName":"panel_1"},{"version":"2.3.0","gridData":{"h":20,"i":"97de7c5f-f99a-4c26-92a3-006a540341ec","w":24,"x":0,"y":20},"panelIndex":"97de7c5f-f99a-4c26-92a3-006a540341ec","embeddableConfig":{},"panelRefName":"panel_2"},{"version":"2.3.0","gridData":{"h":20,"i":"75227adc-78b1-46ac-8ad6-c8c3631feb48","w":24,"x":24,"y":20},"panelIndex":"75227adc-78b1-46ac-8ad6-c8c3631feb48","embeddableConfig":{"vis":{"params":{"sort":{"columnIndex":0,"direction":null}}},"table":null},"panelRefName":"panel_3"}]'
timeRestore: false
title: Subunit - Test Results
version: 1
id: a2282980-4327-11ed-8b28-cdde0c7cf02f
migrationVersion:
dashboard: 7.9.3
references:
- id: 0622de00-4326-11ed-8b28-cdde0c7cf02f
name: panel_0
type: visualization
- id: 0faeb700-4326-11ed-8b28-cdde0c7cf02f
name: panel_1
type: visualization
- id: 3aef4150-4326-11ed-8b28-cdde0c7cf02f
name: panel_2
type: visualization
- id: 60963b70-4326-11ed-8b28-cdde0c7cf02f
name: panel_3
type: visualization
- id: f265f480-ab89-11ec-91e6-db9fe3b6eb30
name: panel_0
type: visualization
- id: 82acec10-ab8a-11ec-8d45-61a12b5378d4
name: panel_1
type: visualization
- id: c913a8d0-ab8d-11ec-bc63-0df653d5ab54
name: panel_2
type: visualization
type: dashboard
updated_at: '2022-10-03T15:09:04.276Z'
version: WzQ0MDAsMV0=
- attributes:
description: ''
hits: 0
kibanaSavedObjectMeta:
searchSourceJSON: '{"query":{"query":"","language":"kuery"},"filter":[]}'
optionsJSON: '{"hidePanelTitles":false,"useMargins":true}'
panelsJSON: '[{"version":"2.3.0","gridData":{"h":20,"i":"ba34ecbe-c58f-4ffd-ab15-09bc9b1c7bb8","w":24,"x":0,"y":0},"panelIndex":"ba34ecbe-c58f-4ffd-ab15-09bc9b1c7bb8","embeddableConfig":{"vis":{"params":{"sort":{"columnIndex":1,"direction":"desc"}}},"table":null},"panelRefName":"panel_0"},{"version":"2.3.0","gridData":{"h":20,"i":"d3ec09db-1f70-4b7a-8176-04be98599f1f","w":24,"x":24,"y":0},"panelIndex":"d3ec09db-1f70-4b7a-8176-04be98599f1f","embeddableConfig":{},"panelRefName":"panel_1"},{"version":"2.3.0","gridData":{"h":20,"i":"97de7c5f-f99a-4c26-92a3-006a540341ec","w":24,"x":0,"y":20},"panelIndex":"97de7c5f-f99a-4c26-92a3-006a540341ec","embeddableConfig":{},"panelRefName":"panel_2"},{"version":"2.3.0","gridData":{"h":20,"i":"75227adc-78b1-46ac-8ad6-c8c3631feb48","w":24,"x":24,"y":20},"panelIndex":"75227adc-78b1-46ac-8ad6-c8c3631feb48","embeddableConfig":{"vis":{"params":{"sort":{"columnIndex":0,"direction":null}}},"table":null},"panelRefName":"panel_3"}]'
timeRestore: false
title: Subunit - Test Results
version: 1
id: a2282980-4327-11ed-8b28-cdde0c7cf02f
migrationVersion:
dashboard: 7.9.3
references:
- id: 0622de00-4326-11ed-8b28-cdde0c7cf02f
name: panel_0
type: visualization
- id: 0faeb700-4326-11ed-8b28-cdde0c7cf02f
name: panel_1
type: visualization
- id: 3aef4150-4326-11ed-8b28-cdde0c7cf02f
name: panel_2
type: visualization
- id: 60963b70-4326-11ed-8b28-cdde0c7cf02f
name: panel_3
type: visualization
- id: f265f480-ab89-11ec-91e6-db9fe3b6eb30
name: panel_0
type: visualization
- id: 82acec10-ab8a-11ec-8d45-61a12b5378d4
name: panel_1
type: visualization
- id: c913a8d0-ab8d-11ec-bc63-0df653d5ab54
name: panel_2
type: visualization
type: dashboard
updated_at: '2022-10-03T15:09:04.276Z'
version: WzQ0MDAsMV0=
- attributes:
description: ''
hits: 0
kibanaSavedObjectMeta:
searchSourceJSON: '{"query":{"language":"kuery","query":""},"filter":[]}'
optionsJSON: '{"hidePanelTitles":false,"useMargins":true}'
panelsJSON: '[{"version":"1.1.0","gridData":{"x":0,"y":0,"w":24,"h":19,"i":"e0d6a1ea-fbcd-4363-9486-f05394bc6187"},"panelIndex":"e0d6a1ea-fbcd-4363-9486-f05394bc6187","embeddableConfig":{},"panelRefName":"panel_0"},{"version":"1.1.0","gridData":{"x":24,"y":0,"w":24,"h":19,"i":"b10b9ed7-b68b-45c6-8d2c-d47494fbe4d6"},"panelIndex":"b10b9ed7-b68b-45c6-8d2c-d47494fbe4d6","embeddableConfig":{},"panelRefName":"panel_1"},{"version":"1.1.0","gridData":{"x":0,"y":19,"w":48,"h":17,"i":"14e572d9-3b20-42e9-8a97-296f00d37494"},"panelIndex":"14e572d9-3b20-42e9-8a97-296f00d37494","embeddableConfig":{},"panelRefName":"panel_2"}]'
timeRestore: false
title: Openstack build status
version: 1
id: c00d5ae0-ab8a-11ec-a871-17bd3b1fcb34
migrationVersion:
dashboard: 7.9.3
references:
- id: 0622de00-4326-11ed-8b28-cdde0c7cf02f
name: panel_0
type: visualization
- id: 0faeb700-4326-11ed-8b28-cdde0c7cf02f
name: panel_1
type: visualization
- id: 3aef4150-4326-11ed-8b28-cdde0c7cf02f
name: panel_2
type: visualization
- id: 60963b70-4326-11ed-8b28-cdde0c7cf02f
name: panel_3
type: visualization
- id: f265f480-ab89-11ec-91e6-db9fe3b6eb30
name: panel_0
type: visualization
- id: 82acec10-ab8a-11ec-8d45-61a12b5378d4
name: panel_1
type: visualization
- id: c913a8d0-ab8d-11ec-bc63-0df653d5ab54
name: panel_2
type: visualization
type: dashboard
updated_at: '2022-03-24T16:17:42.713Z'
version: WzU4NCwxXQ==
- attributes:
description: ''
hits: 0
kibanaSavedObjectMeta:
searchSourceJSON: '{"query":{"language":"kuery","query":""},"filter":[]}'
optionsJSON: '{"hidePanelTitles":false,"useMargins":true}'
panelsJSON: '[{"version":"1.1.0","gridData":{"x":0,"y":0,"w":24,"h":19,"i":"e0d6a1ea-fbcd-4363-9486-f05394bc6187"},"panelIndex":"e0d6a1ea-fbcd-4363-9486-f05394bc6187","embeddableConfig":{},"panelRefName":"panel_0"},{"version":"1.1.0","gridData":{"x":24,"y":0,"w":24,"h":19,"i":"b10b9ed7-b68b-45c6-8d2c-d47494fbe4d6"},"panelIndex":"b10b9ed7-b68b-45c6-8d2c-d47494fbe4d6","embeddableConfig":{},"panelRefName":"panel_1"},{"version":"1.1.0","gridData":{"x":0,"y":19,"w":48,"h":17,"i":"14e572d9-3b20-42e9-8a97-296f00d37494"},"panelIndex":"14e572d9-3b20-42e9-8a97-296f00d37494","embeddableConfig":{},"panelRefName":"panel_2"}]'
timeRestore: false
title: Openstack build status
version: 1
id: c00d5ae0-ab8a-11ec-a871-17bd3b1fcb34
migrationVersion:
dashboard: 7.9.3
references:
- id: 0622de00-4326-11ed-8b28-cdde0c7cf02f
name: panel_0
type: visualization
- id: 0faeb700-4326-11ed-8b28-cdde0c7cf02f
name: panel_1
type: visualization
- id: 3aef4150-4326-11ed-8b28-cdde0c7cf02f
name: panel_2
type: visualization
- id: 60963b70-4326-11ed-8b28-cdde0c7cf02f
name: panel_3
type: visualization
- id: f265f480-ab89-11ec-91e6-db9fe3b6eb30
name: panel_0
type: visualization
- id: 82acec10-ab8a-11ec-8d45-61a12b5378d4
name: panel_1
type: visualization
- id: c913a8d0-ab8d-11ec-bc63-0df653d5ab54
name: panel_2
type: visualization
type: dashboard
updated_at: '2022-03-24T16:17:42.713Z'
version: WzU4NCwxXQ==
- attributes:
description: ''
hits: 0
kibanaSavedObjectMeta:
searchSourceJSON: '{"query":{"language":"kuery","query":""},"filter":[]}'
optionsJSON: '{"hidePanelTitles":false,"useMargins":true}'
panelsJSON: '[{"version":"1.1.0","gridData":{"x":0,"y":0,"w":24,"h":19,"i":"e0d6a1ea-fbcd-4363-9486-f05394bc6187"},"panelIndex":"e0d6a1ea-fbcd-4363-9486-f05394bc6187","embeddableConfig":{},"panelRefName":"panel_0"},{"version":"1.1.0","gridData":{"x":24,"y":0,"w":24,"h":19,"i":"b10b9ed7-b68b-45c6-8d2c-d47494fbe4d6"},"panelIndex":"b10b9ed7-b68b-45c6-8d2c-d47494fbe4d6","embeddableConfig":{},"panelRefName":"panel_1"},{"version":"1.1.0","gridData":{"x":0,"y":19,"w":48,"h":17,"i":"14e572d9-3b20-42e9-8a97-296f00d37494"},"panelIndex":"14e572d9-3b20-42e9-8a97-296f00d37494","embeddableConfig":{},"panelRefName":"panel_2"}]'
timeRestore: false
title: Openstack build status
version: 1
id: c00d5ae0-ab8a-11ec-a871-17bd3b1fcb34
migrationVersion:
dashboard: 7.9.3
references:
- id: 0622de00-4326-11ed-8b28-cdde0c7cf02f
name: panel_0
type: visualization
- id: 0faeb700-4326-11ed-8b28-cdde0c7cf02f
name: panel_1
type: visualization
- id: 3aef4150-4326-11ed-8b28-cdde0c7cf02f
name: panel_2
type: visualization
- id: 60963b70-4326-11ed-8b28-cdde0c7cf02f
name: panel_3
type: visualization
- id: f265f480-ab89-11ec-91e6-db9fe3b6eb30
name: panel_0
type: visualization
- id: 82acec10-ab8a-11ec-8d45-61a12b5378d4
name: panel_1
type: visualization
- id: c913a8d0-ab8d-11ec-bc63-0df653d5ab54
name: panel_2
type: visualization
type: dashboard
updated_at: '2022-03-24T16:17:42.713Z'
version: WzU4NCwxXQ==

File diff suppressed because one or more lines are too long

View File

@ -0,0 +1,383 @@
- attributes:
description: ''
kibanaSavedObjectMeta:
searchSourceJSON: '{"query":{"query":"","language":"kuery"},"filter":[],"indexRefName":"kibanaSavedObjectMeta.searchSourceJSON.index"}'
title: Subunit - Test Results - Success
uiStateJSON: '{"vis":{"params":{"sort":{"columnIndex":null,"direction":null}}}}'
version: 1
visState: '{"title":"Subunit - Test Results - Success","type":"table","aggs":[{"id":"1","enabled":true,"type":"count","params":{},"schema":"metric"},{"id":"2","enabled":true,"type":"terms","params":{"field":"test_name.keyword","orderBy":"1","order":"desc","size":1000,"otherBucket":false,"otherBucketLabel":"Other","missingBucket":false,"missingBucketLabel":"Missing"},"schema":"bucket"},{"id":"3","enabled":true,"type":"filters","params":{"filters":[{"input":{"query":"test_status.keyword
: \"success\"","language":"kuery"},"label":""}]},"schema":"split"}],"params":{"perPage":10,"showPartialRows":false,"showMetricsAtAllLevels":false,"sort":{"columnIndex":null,"direction":null},"showTotal":false,"totalFunc":"sum","percentageCol":"","row":true}}'
id: 0622de00-4326-11ed-8b28-cdde0c7cf02f
migrationVersion:
visualization: 7.10.0
references:
- id: cd744dd0-3d9b-11ed-b73f-c5b7928a4140
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
- id: 94869730-aea8-11ec-9e6a-83741af3fdcd
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
type: visualization
updated_at: '2022-10-03T15:09:04.276Z'
version: WzQzOTYsMV0=
- attributes:
description: ''
kibanaSavedObjectMeta:
searchSourceJSON: "{\n \"query\": {\n \"query\": \"\",\n \"language\"\
: \"kuery\"\n },\n \"filter\": [],\n \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"\
\n}"
title: Build status
uiStateJSON: '{}'
version: 1
visState: "{\n \"title\": \"Build status\",\n \"type\": \"pie\",\n \"aggs\"\
: [\n {\n \"id\": \"1\",\n \"enabled\": true,\n \"type\":\
\ \"cardinality\",\n \"params\": {\n \"field\": \"build_uuid.keyword\"\
\n },\n \"schema\": \"metric\"\n },\n {\n \"id\": \"2\"\
,\n \"enabled\": true,\n \"type\": \"terms\",\n \"params\": {\n\
\ \"field\": \"build_status.keyword\",\n \"orderBy\": \"1\",\n\
\ \"order\": \"desc\",\n \"size\": 5,\n \"otherBucket\"\
: false,\n \"otherBucketLabel\": \"Other\",\n \"missingBucket\"\
: false,\n \"missingBucketLabel\": \"Missing\",\n \"customLabel\"\
: \"Build status\"\n },\n \"schema\": \"segment\"\n }\n ],\n \
\ \"params\": {\n \"type\": \"pie\",\n \"addTooltip\": true,\n \"addLegend\"\
: true,\n \"legendPosition\": \"right\",\n \"isDonut\": true,\n \"\
labels\": {\n \"show\": false,\n \"values\": true,\n \"last_level\"\
: true,\n \"truncate\": 100\n }\n }\n}"
id: 0a602da0-ab88-11ec-a51d-47e50a820c7c
migrationVersion:
visualization: 7.10.0
references:
- id: cd744dd0-3d9b-11ed-b73f-c5b7928a4140
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
- id: 94869730-aea8-11ec-9e6a-83741af3fdcd
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
type: visualization
updated_at: '2022-03-28T15:09:59.819Z'
version: WzkzNSwxXQ==
- attributes:
description: ''
kibanaSavedObjectMeta:
searchSourceJSON: "{\n \"query\": {\n \"query\": \"\",\n \"language\"\
: \"kuery\"\n },\n \"filter\": [],\n \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"\
\n}"
title: Subunit - Test Results - Skip
uiStateJSON: "{\n \"vis\": {\n \"params\": {\n \"sort\": {\n \"\
columnIndex\": null,\n \"direction\": null\n }\n }\n }\n}"
version: 1
visState: "{\n \"title\": \"Subunit - Test Results - Success (copy)\",\n \"\
type\": \"table\",\n \"aggs\": [\n {\n \"id\": \"1\",\n \"enabled\"\
: true,\n \"type\": \"count\",\n \"params\": {},\n \"schema\"\
: \"metric\"\n },\n {\n \"id\": \"2\",\n \"enabled\": true,\n\
\ \"type\": \"terms\",\n \"params\": {\n \"field\": \"test_name.keyword\"\
,\n \"orderBy\": \"1\",\n \"order\": \"desc\",\n \"size\"\
: 1000,\n \"otherBucket\": false,\n \"otherBucketLabel\": \"Other\"\
,\n \"missingBucket\": false,\n \"missingBucketLabel\": \"Missing\"\
\n },\n \"schema\": \"bucket\"\n },\n {\n \"id\": \"3\"\
,\n \"enabled\": true,\n \"type\": \"filters\",\n \"params\"\
: {\n \"filters\": [\n {\n \"input\": {\n \
\ \"query\": \"test_status.keyword : \\\"skip\\\"\",\n \"\
language\": \"kuery\"\n },\n \"label\": \"\"\n \
\ }\n ]\n },\n \"schema\": \"split\"\n }\n ],\n \"params\"\
: {\n \"perPage\": 10,\n \"showPartialRows\": false,\n \"showMetricsAtAllLevels\"\
: false,\n \"sort\": {\n \"columnIndex\": null,\n \"direction\"\
: null\n },\n \"showTotal\": false,\n \"totalFunc\": \"sum\",\n \
\ \"percentageCol\": \"\",\n \"row\": true\n }\n}"
id: 0faeb700-4326-11ed-8b28-cdde0c7cf02f
migrationVersion:
visualization: 7.10.0
references:
- id: cd744dd0-3d9b-11ed-b73f-c5b7928a4140
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
- id: 94869730-aea8-11ec-9e6a-83741af3fdcd
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
type: visualization
updated_at: '2022-10-03T15:09:04.276Z'
version: WzQzOTcsMV0=
- attributes:
description: ''
kibanaSavedObjectMeta:
searchSourceJSON: "{\n \"query\": {\n \"query\": \"\",\n \"language\"\
: \"kuery\"\n },\n \"filter\": [],\n \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"\
\n}"
title: Subunit - Test Results - Fail
uiStateJSON: "{\n \"vis\": {\n \"params\": {\n \"sort\": {\n \"\
columnIndex\": null,\n \"direction\": null\n }\n }\n }\n}"
version: 1
visState: "{\n \"title\": \"Subunit - Test Results - Success (copy)\",\n \"\
type\": \"table\",\n \"aggs\": [\n {\n \"id\": \"1\",\n \"enabled\"\
: true,\n \"type\": \"count\",\n \"params\": {},\n \"schema\"\
: \"metric\"\n },\n {\n \"id\": \"2\",\n \"enabled\": true,\n\
\ \"type\": \"terms\",\n \"params\": {\n \"field\": \"test_name.keyword\"\
,\n \"orderBy\": \"1\",\n \"order\": \"desc\",\n \"size\"\
: 1000,\n \"otherBucket\": false,\n \"otherBucketLabel\": \"Other\"\
,\n \"missingBucket\": false,\n \"missingBucketLabel\": \"Missing\"\
\n },\n \"schema\": \"bucket\"\n },\n {\n \"id\": \"3\"\
,\n \"enabled\": true,\n \"type\": \"filters\",\n \"params\"\
: {\n \"filters\": [\n {\n \"input\": {\n \
\ \"query\": \"test_status.keyword : \\\"fail\\\"\",\n \"\
language\": \"kuery\"\n },\n \"label\": \"\"\n \
\ }\n ]\n },\n \"schema\": \"split\"\n }\n ],\n \"params\"\
: {\n \"perPage\": 10,\n \"showPartialRows\": false,\n \"showMetricsAtAllLevels\"\
: false,\n \"sort\": {\n \"columnIndex\": null,\n \"direction\"\
: null\n },\n \"showTotal\": false,\n \"totalFunc\": \"sum\",\n \
\ \"percentageCol\": \"\",\n \"row\": true\n }\n}"
id: 3aef4150-4326-11ed-8b28-cdde0c7cf02f
migrationVersion:
visualization: 7.10.0
references:
- id: cd744dd0-3d9b-11ed-b73f-c5b7928a4140
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
- id: 94869730-aea8-11ec-9e6a-83741af3fdcd
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
type: visualization
updated_at: '2022-10-03T15:09:04.276Z'
version: WzQzOTgsMV0=
- attributes:
description: ''
kibanaSavedObjectMeta:
searchSourceJSON: '{"query":{"query":"","language":"kuery"},"filter":[],"indexRefName":"kibanaSavedObjectMeta.searchSourceJSON.index"}'
title: Subunit - Test Results - Build Name
uiStateJSON: '{"vis":{"params":{"sort":{"columnIndex":null,"direction":null}}}}'
version: 1
visState: '{"title":"Subunit - Test Results - Build Name","type":"table","aggs":[{"id":"1","enabled":true,"type":"count","params":{},"schema":"metric"},{"id":"2","enabled":true,"type":"terms","params":{"field":"test_name.keyword","orderBy":"1","order":"desc","size":100,"otherBucket":false,"otherBucketLabel":"Other","missingBucket":false,"missingBucketLabel":"Missing"},"schema":"bucket"},{"id":"3","enabled":true,"type":"terms","params":{"field":"build_name.keyword","orderBy":"1","order":"desc","size":100,"otherBucket":false,"otherBucketLabel":"Other","missingBucket":false,"missingBucketLabel":"Missing"},"schema":"bucket"}],"params":{"perPage":10,"showPartialRows":false,"showMetricsAtAllLevels":false,"sort":{"columnIndex":null,"direction":null},"showTotal":false,"totalFunc":"sum","percentageCol":"","row":false}}'
id: 60963b70-4326-11ed-8b28-cdde0c7cf02f
migrationVersion:
visualization: 7.10.0
references:
- id: cd744dd0-3d9b-11ed-b73f-c5b7928a4140
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
- id: 94869730-aea8-11ec-9e6a-83741af3fdcd
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
type: visualization
updated_at: '2022-10-10T15:06:48.497Z'
version: WzQ3NjMsMV0=
- attributes:
description: ''
kibanaSavedObjectMeta:
searchSourceJSON: '{"query":{"query":"","language":"kuery"},"filter":[],"indexRefName":"kibanaSavedObjectMeta.searchSourceJSON.index"}'
title: Build status in time
uiStateJSON: '{}'
version: 1
visState: '{"title":"Build status in time","type":"histogram","aggs":[{"id":"1","enabled":true,"type":"cardinality","params":{"field":"build_uuid.keyword","customLabel":"Counted
builds"},"schema":"metric"},{"id":"3","enabled":true,"type":"date_histogram","params":{"field":"@timestamp","timeRange":{"from":"now-30m","to":"now"},"useNormalizedOpenSearchInterval":true,"scaleMetricValues":false,"interval":"auto","drop_partials":false,"min_doc_count":1,"extended_bounds":{},"customLabel":"Time"},"schema":"segment"},{"id":"4","enabled":true,"type":"terms","params":{"field":"build_status.keyword","orderBy":"1","order":"asc","size":5,"otherBucket":false,"otherBucketLabel":"Other","missingBucket":false,"missingBucketLabel":"Missing"},"schema":"group"}],"params":{"type":"histogram","grid":{"categoryLines":false},"categoryAxes":[{"id":"CategoryAxis-1","type":"category","position":"bottom","show":true,"style":{},"scale":{"type":"linear"},"labels":{"show":true,"filter":true,"truncate":100},"title":{}}],"valueAxes":[{"id":"ValueAxis-1","name":"LeftAxis-1","type":"value","position":"left","show":true,"style":{},"scale":{"type":"linear","mode":"normal"},"labels":{"show":true,"rotate":0,"filter":false,"truncate":100},"title":{"text":"Counted
builds"}}],"seriesParams":[{"show":true,"type":"histogram","mode":"stacked","data":{"label":"Counted
builds","id":"1"},"valueAxis":"ValueAxis-1","drawLinesBetweenPoints":true,"lineWidth":2,"showCircles":true}],"addTooltip":true,"addLegend":true,"legendPosition":"right","times":[],"addTimeMarker":false,"labels":{"show":false},"thresholdLine":{"show":false,"value":10,"width":1,"style":"full","color":"#E7664C"},"row":true}}'
id: 82acec10-ab8a-11ec-8d45-61a12b5378d4
migrationVersion:
visualization: 7.10.0
references:
- id: cd744dd0-3d9b-11ed-b73f-c5b7928a4140
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
- id: 94869730-aea8-11ec-9e6a-83741af3fdcd
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
type: visualization
updated_at: '2022-09-22T15:25:41.420Z'
version: WzM1ODIsMV0=
- attributes:
description: ''
kibanaSavedObjectMeta:
searchSourceJSON: "{\n \"query\": {\n \"query\": \"\",\n \"language\"\
: \"kuery\"\n },\n \"filter\": [],\n \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"\
\n}"
title: Host ID and build status
uiStateJSON: '{}'
version: 1
visState: "{\n \"title\": \"Host ID and build status\",\n \"type\": \"histogram\"\
,\n \"aggs\": [\n {\n \"id\": \"1\",\n \"enabled\": true,\n \
\ \"type\": \"cardinality\",\n \"params\": {\n \"field\": \"\
build_uuid.keyword\"\n },\n \"schema\": \"metric\"\n },\n {\n\
\ \"id\": \"2\",\n \"enabled\": true,\n \"type\": \"terms\",\n\
\ \"params\": {\n \"field\": \"build_status.keyword\",\n \
\ \"orderBy\": \"1\",\n \"order\": \"desc\",\n \"size\": 5,\n\
\ \"otherBucket\": false,\n \"otherBucketLabel\": \"Other\",\n\
\ \"missingBucket\": false,\n \"missingBucketLabel\": \"Missing\"\
\n },\n \"schema\": \"segment\"\n },\n {\n \"id\": \"3\"\
,\n \"enabled\": true,\n \"type\": \"terms\",\n \"params\": {\n\
\ \"field\": \"hosts_id.keyword\",\n \"orderBy\": \"1\",\n \
\ \"order\": \"desc\",\n \"size\": 5,\n \"otherBucket\": false,\n\
\ \"otherBucketLabel\": \"Other\",\n \"missingBucket\": false,\n\
\ \"missingBucketLabel\": \"Missing\"\n },\n \"schema\": \"\
group\"\n }\n ],\n \"params\": {\n \"type\": \"histogram\",\n \"\
grid\": {\n \"categoryLines\": false\n },\n \"categoryAxes\": [\n\
\ {\n \"id\": \"CategoryAxis-1\",\n \"type\": \"category\"\
,\n \"position\": \"bottom\",\n \"show\": true,\n \"style\"\
: {},\n \"scale\": {\n \"type\": \"linear\"\n },\n \
\ \"labels\": {\n \"show\": true,\n \"filter\": true,\n\
\ \"truncate\": 100\n },\n \"title\": {}\n }\n \
\ ],\n \"valueAxes\": [\n {\n \"id\": \"ValueAxis-1\",\n \
\ \"name\": \"LeftAxis-1\",\n \"type\": \"value\",\n \"position\"\
: \"left\",\n \"show\": true,\n \"style\": {},\n \"scale\"\
: {\n \"type\": \"linear\",\n \"mode\": \"normal\"\n \
\ },\n \"labels\": {\n \"show\": true,\n \"rotate\"\
: 0,\n \"filter\": false,\n \"truncate\": 100\n },\n\
\ \"title\": {\n \"text\": \"Unique count of build_uuid.keyword\"\
\n }\n }\n ],\n \"seriesParams\": [\n {\n \"show\"\
: true,\n \"type\": \"histogram\",\n \"mode\": \"normal\",\n \
\ \"data\": {\n \"label\": \"Unique count of build_uuid.keyword\"\
,\n \"id\": \"1\"\n },\n \"valueAxis\": \"ValueAxis-1\"\
,\n \"drawLinesBetweenPoints\": true,\n \"lineWidth\": 2,\n \
\ \"showCircles\": true\n }\n ],\n \"addTooltip\": true,\n \
\ \"addLegend\": true,\n \"legendPosition\": \"right\",\n \"times\"\
: [],\n \"addTimeMarker\": false,\n \"labels\": {\n \"show\": false\n\
\ },\n \"thresholdLine\": {\n \"show\": false,\n \"value\":\
\ 10,\n \"width\": 1,\n \"style\": \"full\",\n \"color\": \"\
#E7664C\"\n },\n \"row\": true\n }\n}"
id: b774b750-ab91-11ec-89c0-4182c1328935
migrationVersion:
visualization: 7.10.0
references:
- id: cd744dd0-3d9b-11ed-b73f-c5b7928a4140
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
- id: 94869730-aea8-11ec-9e6a-83741af3fdcd
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
type: visualization
updated_at: '2022-03-28T15:10:31.671Z'
version: Wzk0MiwxXQ==
- attributes:
description: ''
kibanaSavedObjectMeta:
searchSourceJSON: "{\n \"query\": {\n \"query\": \"\",\n \"language\"\
: \"kuery\"\n },\n \"filter\": [],\n \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"\
\n}"
title: Common errors per build status
uiStateJSON: '{}'
version: 1
visState: "{\n \"title\": \"Common errors per build status\",\n \"type\": \"\
histogram\",\n \"aggs\": [\n {\n \"id\": \"1\",\n \"enabled\"\
: true,\n \"type\": \"cardinality\",\n \"params\": {\n \"field\"\
: \"build_uuid.keyword\",\n \"customLabel\": \"Counted builds\"\n \
\ },\n \"schema\": \"metric\"\n },\n {\n \"id\": \"2\",\n\
\ \"enabled\": true,\n \"type\": \"date_histogram\",\n \"params\"\
: {\n \"field\": \"@timestamp\",\n \"timeRange\": {\n \
\ \"from\": \"now-12h\",\n \"to\": \"now\"\n },\n \"\
useNormalizedOpenSearchInterval\": true,\n \"scaleMetricValues\": false,\n\
\ \"interval\": \"auto\",\n \"drop_partials\": true,\n \
\ \"min_doc_count\": 1,\n \"extended_bounds\": {}\n },\n \"\
schema\": \"segment\"\n },\n {\n \"id\": \"3\",\n \"enabled\"\
: true,\n \"type\": \"filters\",\n \"params\": {\n \"filters\"\
: [\n {\n \"input\": {\n \"query\": \"message:\\\
\"could not install deps\\\"\",\n \"language\": \"kuery\"\n \
\ },\n \"label\": \"\"\n },\n {\n \
\ \"input\": {\n \"query\": \"message: \\\"error\\\"\",\n\
\ \"language\": \"kuery\"\n },\n \"label\"\
: \"\"\n },\n {\n \"input\": {\n \"\
query\": \"message:\\\"... FAILED\\\" AND NOT message:\\\"ignoring\\\"\",\n\
\ \"language\": \"kuery\"\n },\n \"label\"\
: \"\"\n },\n {\n \"input\": {\n \"\
query\": \"message:\\\"MessagingTimeout\\\"\",\n \"language\":\
\ \"kuery\"\n },\n \"label\": \"\"\n },\n \
\ {\n \"input\": {\n \"query\": \"message:\\\"\
Timed out waiting\\\"\",\n \"language\": \"kuery\"\n \
\ },\n \"label\": \"\"\n },\n {\n \"\
input\": {\n \"query\": \"message:\\\"Ansible failed\\\"\",\n \
\ \"language\": \"kuery\"\n },\n \"label\"\
: \"\"\n },\n {\n \"input\": {\n \"\
query\": \"message:\\\"Failed to download packages: Cannot download\\\" OR message:\\\
\"Cannot download repodata/repomd.xml: All mirrors were tried\\\"\",\n \
\ \"language\": \"kuery\"\n },\n \"label\": \"\
\"\n },\n {\n \"input\": {\n \"query\"\
: \"message:\\\"conflicts with file from package\\\"\",\n \"language\"\
: \"kuery\"\n },\n \"label\": \"\"\n },\n \
\ {\n \"input\": {\n \"query\": \"message:\\\"\
UNAUTHORIZED\\\" OR message: \\\"authentication required\\\"\",\n \
\ \"language\": \"kuery\"\n },\n \"label\": \"\"\n\
\ }\n ]\n },\n \"schema\": \"group\"\n },\n \
\ {\n \"id\": \"4\",\n \"enabled\": true,\n \"type\": \"terms\"\
,\n \"params\": {\n \"field\": \"build_status.keyword\",\n \
\ \"orderBy\": \"1\",\n \"order\": \"desc\",\n \"size\": 5,\n\
\ \"otherBucket\": false,\n \"otherBucketLabel\": \"Other\",\n\
\ \"missingBucket\": false,\n \"missingBucketLabel\": \"Missing\"\
\n },\n \"schema\": \"split\"\n }\n ],\n \"params\": {\n \"\
type\": \"histogram\",\n \"grid\": {\n \"categoryLines\": false\n \
\ },\n \"categoryAxes\": [\n {\n \"id\": \"CategoryAxis-1\"\
,\n \"type\": \"category\",\n \"position\": \"bottom\",\n \
\ \"show\": true,\n \"style\": {},\n \"scale\": {\n \
\ \"type\": \"linear\"\n },\n \"labels\": {\n \"show\"\
: true,\n \"filter\": true,\n \"truncate\": 100\n },\n\
\ \"title\": {}\n }\n ],\n \"valueAxes\": [\n {\n \
\ \"id\": \"ValueAxis-1\",\n \"name\": \"LeftAxis-1\",\n \"\
type\": \"value\",\n \"position\": \"left\",\n \"show\": true,\n\
\ \"style\": {},\n \"scale\": {\n \"type\": \"linear\"\
,\n \"mode\": \"normal\"\n },\n \"labels\": {\n \
\ \"show\": true,\n \"rotate\": 0,\n \"filter\": false,\n\
\ \"truncate\": 100\n },\n \"title\": {\n \"\
text\": \"Counted builds\"\n }\n }\n ],\n \"seriesParams\"\
: [\n {\n \"show\": true,\n \"type\": \"histogram\",\n \
\ \"mode\": \"stacked\",\n \"data\": {\n \"label\": \"\
Counted builds\",\n \"id\": \"1\"\n },\n \"valueAxis\"\
: \"ValueAxis-1\",\n \"drawLinesBetweenPoints\": true,\n \"lineWidth\"\
: 2,\n \"showCircles\": true\n }\n ],\n \"addTooltip\": true,\n\
\ \"addLegend\": true,\n \"legendPosition\": \"right\",\n \"times\"\
: [],\n \"addTimeMarker\": false,\n \"labels\": {\n \"show\": false\n\
\ },\n \"thresholdLine\": {\n \"show\": false,\n \"value\":\
\ 10,\n \"width\": 1,\n \"style\": \"full\",\n \"color\": \"\
#E7664C\"\n },\n \"row\": true\n }\n}"
id: c913a8d0-ab8d-11ec-bc63-0df653d5ab54
migrationVersion:
visualization: 7.10.0
references:
- id: cd744dd0-3d9b-11ed-b73f-c5b7928a4140
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
- id: 94869730-aea8-11ec-9e6a-83741af3fdcd
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
type: visualization
updated_at: '2022-03-28T15:10:15.208Z'
version: WzkzNywxXQ==
- attributes:
description: ''
kibanaSavedObjectMeta:
searchSourceJSON: "{\n \"query\": {\n \"query\": \"\",\n \"language\"\
: \"kuery\"\n },\n \"filter\": [],\n \"indexRefName\": \"kibanaSavedObjectMeta.searchSourceJSON.index\"\
\n}"
title: Build name status
uiStateJSON: "{\n \"vis\": {\n \"params\": {\n \"sort\": {\n \"\
columnIndex\": null,\n \"direction\": null\n }\n }\n }\n}"
version: 1
visState: "{\n \"title\": \"Build name status\",\n \"type\": \"table\",\n \"\
aggs\": [\n {\n \"id\": \"1\",\n \"enabled\": true,\n \"type\"\
: \"cardinality\",\n \"params\": {\n \"field\": \"build_uuid.keyword\"\
\n },\n \"schema\": \"metric\"\n },\n {\n \"id\": \"2\"\
,\n \"enabled\": true,\n \"type\": \"terms\",\n \"params\": {\n\
\ \"field\": \"build_name.keyword\",\n \"orderBy\": \"1\",\n \
\ \"order\": \"desc\",\n \"size\": 10,\n \"otherBucket\"\
: false,\n \"otherBucketLabel\": \"Other\",\n \"missingBucket\"\
: false,\n \"missingBucketLabel\": \"Missing\",\n \"customLabel\"\
: \"Build name\"\n },\n \"schema\": \"bucket\"\n },\n {\n \
\ \"id\": \"3\",\n \"enabled\": true,\n \"type\": \"terms\",\n\
\ \"params\": {\n \"field\": \"build_status.keyword\",\n \
\ \"orderBy\": \"1\",\n \"order\": \"desc\",\n \"size\": 5,\n\
\ \"otherBucket\": false,\n \"otherBucketLabel\": \"Other\",\n\
\ \"missingBucket\": false,\n \"missingBucketLabel\": \"Missing\"\
,\n \"customLabel\": \"Build status\"\n },\n \"schema\": \"\
split\"\n }\n ],\n \"params\": {\n \"perPage\": 10,\n \"showPartialRows\"\
: false,\n \"showMetricsAtAllLevels\": false,\n \"sort\": {\n \"\
columnIndex\": null,\n \"direction\": null\n },\n \"showTotal\":\
\ false,\n \"totalFunc\": \"sum\",\n \"percentageCol\": \"\",\n \"\
row\": false\n }\n}"
id: f265f480-ab89-11ec-91e6-db9fe3b6eb30
migrationVersion:
visualization: 7.10.0
references:
- id: cd744dd0-3d9b-11ed-b73f-c5b7928a4140
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
- id: 94869730-aea8-11ec-9e6a-83741af3fdcd
name: kibanaSavedObjectMeta.searchSourceJSON.index
type: index-pattern
type: visualization
updated_at: '2022-03-28T15:09:46.652Z'
version: WzkzNCwxXQ==

View File

@ -26,3 +26,4 @@ packages =
console_scripts =
logscraper = logscraper.logscraper:main
logsender = logscraper.logsender:main
opensearch_dashboards_backup = logscraper.opensearch_dashboards_backup:main