Commit 7ab8a95c authored by Jérome Perrin's avatar Jérome Perrin

stack/erp5: generate weekly apachedex reports

parent f4e0a4c7
import ipaddress
import json
import logging
import lzma
import os
import re
import socket
......@@ -264,7 +265,7 @@ class TestLog(BalancerTestCase, CrontabMixin):
# make a request so that we have something in the logs
requests.get(self.default_balancer_zope_url, verify=False)
# crontab for apachedex is executed
# crontab for daily apachedex is executed
self._executeCrontabAtDate('generate-apachedex-report', '23:59')
# it creates a report for the day
apachedex_report, = (
......@@ -278,6 +279,39 @@ class TestLog(BalancerTestCase, CrontabMixin):
# having this table means that apachedex could parse some lines.
self.assertIn('<h2>Hits per status code</h2>', report_text)
# weekly apachedex uses the logs after rotation, we'll run log rotation
# until we have a xz file for two days ago and a non compressed file for
# yesterday
# run logrotate a first time so that it create state files
self._executeCrontabAtDate('logrotate', '2000-01-01')
requests.get(urllib.parse.urljoin(self.default_balancer_zope_url, 'error-two-days-ago'), verify=False)
self._executeCrontabAtDate('logrotate', 'yesterday 00:00')
requests.get(urllib.parse.urljoin(self.default_balancer_zope_url, 'error-yesterday'), verify=False)
self._executeCrontabAtDate('logrotate', '00:00')
# this apachedex command uses compressed files, verify that our test setup
# is correct and that the error from two days ago is in the compressed file.
two_days_ago_log, = (
self.computer_partition_root_path / 'srv' / 'backup'/ 'logrotate'
).glob("apache-access.log-*.xz")
with lzma.open(two_days_ago_log) as f:
self.assertIn(b'GET /error-two-days-ago', f.read())
self._executeCrontabAtDate('generate-weekly-apachedex-report', '23:59')
# this creates a report for the week
apachedex_weekly_report, = (
self.computer_partition_root_path
/ 'srv'
/ 'monitor'
/ 'private'
/ 'apachedex'
/ 'weekly').glob('*.html')
weekly_report_text = apachedex_weekly_report.read_text()
self.assertIn('APacheDEX', weekly_report_text)
# because we run apachedex with error details, we can see our error requests
self.assertIn('error-two-days-ago', weekly_report_text)
self.assertIn('error-yesterday', weekly_report_text)
def test_access_log_rotation(self) -> None:
# run logrotate a first time so that it create state files
self._executeCrontabAtDate('logrotate', '2000-01-01')
......
......@@ -94,7 +94,7 @@ md5sum = 9c580be982d8c63ec06fc273ef3cb971
[template-balancer]
filename = instance-balancer.cfg.in
md5sum = f7a9b3450f9682ef11195fe2a7c3dad6
md5sum = f12ec495cb166d2bac5f50c65dc70b98
[template-haproxy-cfg]
filename = haproxy.cfg.in
......
......@@ -400,7 +400,8 @@ command-line = "{{ parameter_dict['socat'] }}/bin/socat" unix-connect:${haproxy-
[rsyslogd-cfg-parameter-dict]
log-socket = ${directory:run}/log.sock
access-log-file = ${directory:log}/apache-access.log
access-log-file-basename = apache-access.log
access-log-file = ${directory:log}/${:access-log-file-basename}
error-log-file = ${directory:log}/apache-error.log
pid-file = ${directory:run}/rsyslogd.pid
spool-directory = ${directory:rsyslogd-spool}
......@@ -483,6 +484,7 @@ backup-caucased-haproxy-certificate = ${:srv}/backup/caucased{{ caucase_haproxy_
caucase-updater-haproxy-certificate = ${:srv}/caucase-updater-haproxy-certificate
tmp = ${buildout:directory}/tmp
apachedex = ${monitor-directory:private}/apachedex
apachedex-weekly = ${:apachedex}/weekly
rsyslogd-spool = ${:run}/rsyslogd-spool
{% if frontend_caucase_url_list -%}
ca-cert = ${:etc}/ssl.crt
......@@ -511,6 +513,32 @@ wrapper-path = ${directory:bin}/${:command}
command-line = "{{ parameter_dict['run-apachedex-location'] }}" "{{ parameter_dict['apachedex-location'] }}" "${directory:apachedex}" ${monitor-publish-parameters:monitor-base-url}/private/apachedex --apache-log-list "${apachedex-parameters:apache-log-list}" --configuration ${apachedex-parameters:configuration}
command = generate-apachedex-report
[{{ section('monitor-generate-weekly-apachedex-report') }}]
recipe = slapos.cookbook:cron.d
cron-entries = ${cron:cron-entries}
name = generate-weekly-apachedex-report
frequency = 1 * * * 1
command = ${monitor-generate-weekly-apachedex-report-wrapper:output}
[monitor-generate-weekly-apachedex-report-wrapper]
recipe = slapos.recipe.template
output = ${buildout:bin-directory}/${:_buildout_section_name_}
inline =
#!/bin/sh
# Yesterday's log file is not compressed
LOG_FILES=${logrotate-rsyslogd:backup}/${rsyslogd-cfg-parameter-dict:access-log-file-basename}-$(date +"%Y%m%d")
# Days before are compressed
{% for i in range(1, 6) -%}
LOG_FILE=${logrotate-rsyslogd:backup}/${rsyslogd-cfg-parameter-dict:access-log-file-basename}-$(date -d "{{i}} days ago" +"%Y%m%d").xz
if [ -f "$${LOG_FILE}" ]; then
LOG_FILES="$${LOG_FILES} $${LOG_FILE}"
fi
{% endfor %}
exec {{ parameter_dict['apachedex-location'] }} \
-o ${directory:apachedex-weekly}/$(date -d "1 days ago" +"%Y-%m-%d").html \
@${apachedex-parameters:configuration} \
$${LOG_FILES}
[monitor-apachedex-report-config]
recipe = slapos.recipe.template
output = ${directory:etc}/${:_buildout_section_name_}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment