Introduce LogJuicer roles

This change adds new roles to run logjuicer in zuul jobs:
  https://github.com/logjuicer/logjuicer

Change-Id: I02824a18285a16c8f0be6bb96b5404aa0d601c16
This commit is contained in:
Tristan Cacqueray 2023-10-24 20:22:09 +00:00
parent 3b3495e255
commit 26db5b3b24
11 changed files with 177 additions and 0 deletions

View File

@ -0,0 +1,18 @@
LogJuicer Roles
===============
`LogJuicer <https://github.com/logjuicer/logjuicer>`_ extracts anomalies from log files.
You have two options to integrate LogJuicer in your Zuul job post-run phase:
#. Deploy the `web-service <https://github.com/logjuicer/logjuicer/tree/main/crates/web-service>`_ and use the :zuul:role:`report-logjuicer`.
#. Use the :zuul:role:`run-logjuicer` to create the report locally:
* For single-node job, the role can be used in untrusted playbooks.
* For multi-node job, the role must be used on localhost (the executor) between the :zuul:role:`fetch-output` and the log upload. Note that a future version may support merging reports produced on multi nodes through an untrusted playbooks.
In both case, a new artifact named "LogJuicer Report" will be provided to access the build report.
.. zuul:autorole:: report-logjuicer
.. zuul:autorole:: run-logjuicer

View File

@ -29,3 +29,4 @@ Roles
rust-roles rust-roles
system-roles system-roles
translation-roles translation-roles
logjuicer-roles

View File

@ -0,0 +1,25 @@
Create a LogJuicer report link
This role emits an artifact to create a report through a LogJuicer web service.
Add the following task to your job post-run phase:
.. code-block:: yaml
- when: not zuul_success | bool
include_role:
name: report-logjuicer
vars:
logjuicer_web_url: https://softwarefactory-project.io/logjuicer
zuul_web_url: https://zuul.opendev.org/t/{{ zuul.tenant }}
**Role Variables**
.. zuul:rolevar:: logjuicer_web_url
The http url of the LogJuicer web service.
.. zuul:rolevar:: zuul_web_url
The http url of zuul-web.
For multi-tenant deployment, add ``/t/{{ zuul.tenant }}``.

View File

@ -0,0 +1,8 @@
---
- name: Return LogJuicer report url
zuul_return:
data:
zuul:
artifacts:
- name: "LogJuicer Report"
url: "{{ logjuicer_web_url }}/report/new?target={{ zuul_web_url }}/build/{{ zuul.build }}"

View File

@ -0,0 +1,28 @@
Create a LogJuicer report
This role runs the `LogJuicer <https://github.com/logjuicer/logjuicer>`_ tool
to create a report of the current build.
For single-node jobs, the role can be used on the test instance in the job post-run phase.
.. code-block:: yaml
- when: not zuul_success | bool
include_role:
name: run-logjuicer
vars:
zuul_web_url: https://zuul.opendev.org/
For multi-node jobs, the role must be used on localhost (the executor)
between the :zuul:role:`fetch-output` and the log upload.
**Role Variables**
.. zuul:rolevar:: zuul_web_url
The zuul-web URL, to lookup baselines.
.. zuul:rolevar:: logjuicer_max_run_time
:default: 900
Maximum runtime in seconds.

View File

@ -0,0 +1,9 @@
---
# Update from https://github.com/logjuicer/logjuicer/releases
logjuicer_version: 0.9.6
# Enable logjuicer debug logs
logjuicer_debug: false
# Maximum runtime in seconds
logjuicer_max_run_time: 900

View File

@ -0,0 +1,15 @@
---
- name: Install LogJuicer
shell: |
set -o pipefail
mkdir -p ~/.local/bin
curl -L https://github.com/logjuicer/logjuicer/releases/download/{{ logjuicer_version }}/logjuicer-x86_64-linux.tar.bz2 | tar -C ~/.local/ -xjvf -
tags:
# skip using file module to create the directory to keep this role short
- skip_ansible_lint
args:
executable: '/bin/bash'
- name: Set logjuicer_cmd fact
set_fact:
logjuicer_cmd: "{% if logjuicer_debug %}env LOGJUICER_LOG=debug {% endif %}{{ ansible_env.HOME }}/.local/bin/logjuicer"

View File

@ -0,0 +1,7 @@
---
- name: Detect anomalies with logjuicer
block:
- name: Install logjuicer
include_tasks: install.yaml
- name: Run logjuicer
include_tasks: run.yaml

View File

@ -0,0 +1,44 @@
---
- name: Check for multi-node usages
when: ansible_play_hosts_all | length > 1
fail:
msg: "Run logjuicer from the executor after the fetch-output for multi-node jobs"
- name: Setup multi-node fact
when: inventory_hostname == "localhost"
set_fact:
_logs_path: "{{ zuul.executor.log_root }}"
- name: Setup single-node
when: inventory_hostname != "localhost"
block:
- name: Setup fact
set_fact:
_logs_path: "{{ ansible_user_dir }}/zuul-output/logs"
- name: Copy the console log and inventory for analysis on the test instance
copy:
src: "{{ zuul.executor.log_root }}/{{ zj_item }}"
dest: "{{ _logs_path }}/"
loop_control:
loop_var: zj_item
loop:
- "job-output.txt"
- "zuul-info"
- name: Analyse the logs
command: >
timeout {{ logjuicer_max_run_time }}s {{ logjuicer_cmd }}
--report {{ _logs_path }}/logjuicer.{% if zuul_log_compress|default(false) %}gz{% else %}bin{% endif %}
zuul-build --api-url {{ zuul_web_url }} {{ _logs_path }}/
ignore_errors: true
register: _logjuicer_run
- name: Register the output
when: _logjuicer_run.rc == 0
zuul_return:
data:
zuul:
artifacts:
- name: "LogJuicer Report"
url: "logjuicer.html"

View File

@ -0,0 +1,13 @@
---
- hosts: all
tasks:
- name: Generate random data
command: "echo {{ log_line }}"
vars:
log_line: "{{ ['eventa occured today', 'eventb happened previously', 'eventc presently failed'] | random }}"
- name: Run logjuicer
include_role:
name: run-logjuicer
vars:
zuul_web_url: https://zuul.opendev.org/

View File

@ -15,6 +15,14 @@
- test-playbooks/upload-logs-s3.yaml - test-playbooks/upload-logs-s3.yaml
run: test-playbooks/upload-logs-s3.yaml run: test-playbooks/upload-logs-s3.yaml
- job:
name: zuul-jobs-test-run-logjuicer
description: Test the run-logjuicer role
files:
- roles/run-logjuicer/.*
- test-playbooks/run-loreduce.yaml
run: test-playbooks/run-logjuicer.yaml
# -* AUTOGENERATED *- # -* AUTOGENERATED *-
# The following project section is autogenerated by # The following project section is autogenerated by
# tox -e update-test-platforms # tox -e update-test-platforms
@ -25,6 +33,7 @@
jobs: &id001 jobs: &id001
- zuul-jobs-test-local-log-download - zuul-jobs-test-local-log-download
- zuul-jobs-test-upload-logs-s3 - zuul-jobs-test-upload-logs-s3
- zuul-jobs-test-run-logjuicer
gate: gate:
jobs: *id001 jobs: *id001
periodic-weekly: periodic-weekly: