From 5efd8ee5c8647321c1bee82e35d8737954bb887b Mon Sep 17 00:00:00 2001 From: Archit Sharma Date: Tue, 3 May 2016 00:06:28 +0530 Subject: [PATCH] fixes #227 - add *working* sar indexing support Add unit tests for sar ingress under 'test-9'; Also: - fix existing unit tests for this branch; - update line no.s for gold test 7.{3..5}. Refer #303 - update .gitignore: __pycache__ in any dir - cleanup sar-index code addition --- .gitignore | 11 + server/pbench/bin/detect_nodename | 3 + server/pbench/bin/extractsa | 27 + server/pbench/bin/gold/test-11.txt | 1016 +++++++++++ server/pbench/bin/gold/test-7.3.txt | 14 +- server/pbench/bin/gold/test-7.4.txt | 14 +- server/pbench/bin/gold/test-7.5.txt | 14 +- server/pbench/bin/gold/test-7.6.txt | 1 + server/pbench/bin/gold/test-7.7.txt | 1 + server/pbench/bin/index-pbench | 216 ++- server/pbench/bin/satools/oscode | 33 + server/pbench/bin/satools/sysstat.py | 1582 +++++++++++++++++ server/pbench/bin/state/test-11.tar.xz | Bin 0 -> 3556 bytes server/pbench/bin/unittests | 6 +- server/pbench/bin/vos/analysis/bin/sadf-5x-64 | Bin 0 -> 60584 bytes server/pbench/bin/vos/analysis/bin/sadf-62-64 | Bin 0 -> 111184 bytes server/pbench/bin/vos/analysis/bin/sadf-64-64 | Bin 0 -> 111496 bytes server/pbench/bin/vos/analysis/bin/sadf-65-64 | Bin 0 -> 114776 bytes .../pbench/bin/vos/analysis/bin/sadf-f19-64 | Bin 0 -> 165400 bytes .../pbench/bin/vos/analysis/bin/sadf-f23-64 | Bin 0 -> 178568 bytes server/pbench/lib/mappings/sar.json | 300 ++++ .../pbench/lib/vos/analysis/lib/index_sar.py | 917 ++++++++++ 22 files changed, 4067 insertions(+), 88 deletions(-) create mode 100755 server/pbench/bin/detect_nodename create mode 100755 server/pbench/bin/extractsa create mode 100644 server/pbench/bin/gold/test-11.txt create mode 100755 server/pbench/bin/satools/oscode create mode 100755 server/pbench/bin/satools/sysstat.py create mode 100644 server/pbench/bin/state/test-11.tar.xz create mode 100755 server/pbench/bin/vos/analysis/bin/sadf-5x-64 create mode 100755 server/pbench/bin/vos/analysis/bin/sadf-62-64 create mode 100755 server/pbench/bin/vos/analysis/bin/sadf-64-64 create mode 100755 server/pbench/bin/vos/analysis/bin/sadf-65-64 create mode 100755 server/pbench/bin/vos/analysis/bin/sadf-f19-64 create mode 100755 server/pbench/bin/vos/analysis/bin/sadf-f23-64 create mode 100644 server/pbench/lib/mappings/sar.json create mode 100755 server/pbench/lib/vos/analysis/lib/index_sar.py diff --git a/.gitignore b/.gitignore index 1285286312..821a627d82 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,14 @@ doc/*.html + __pycache__ +configtools/bin/getconf.3.py +configtools/bin/getconf.py +configtools/bin/gethosts.3.py +configtools/bin/gethosts.py +configtools/build +.build +.rpm-copy +.spec-copy +mock-build.log +rpm.conf *.swp diff --git a/server/pbench/bin/detect_nodename b/server/pbench/bin/detect_nodename new file mode 100755 index 0000000000..e821a3d4e7 --- /dev/null +++ b/server/pbench/bin/detect_nodename @@ -0,0 +1,3 @@ +#!/bin/bash + +head $1 | grep nodename | awk -F'=' '{print$2}' | sed 's#[">]##g' \ No newline at end of file diff --git a/server/pbench/bin/extractsa b/server/pbench/bin/extractsa new file mode 100755 index 0000000000..9d0b0a85c8 --- /dev/null +++ b/server/pbench/bin/extractsa @@ -0,0 +1,27 @@ +#!/bin/bash + +sa_data_file=$1 +file_path=$(dirname "${sa_data_file}") +xml_file_path="$2" + +sadf_type=$( { ${BASH_SOURCE%/*}/satools/oscode "$sa_data_file"; } 2>&1) + +if [[ "$sadf_type" == *Invalid* ]]; then + sadf_type="f23" + echo "attempting to convert sa binary to compatible format.." + conversion_output=$( { LC_ALL=C ${BASH_SOURCE%/*}/vos/analysis/bin/sadf-f23-64 -c "$sa_data_file" > "${sa_data_file%/}".conv ; } 2>&1) + if [[ "$conversion_output" == *Invalid* ]]; then + echo "invalid input file! check if its a SA *binary* file.." + exit 1 + fi + sa_data_file="${sa_data_file%/}".conv +fi + +LC_ALL=C ${BASH_SOURCE%/*}/vos/analysis/bin/sadf-$sadf_type-64 -x "$sa_data_file" -- -A > "$xml_file_path" + +client_nodename=$(${BASH_SOURCE%/*}/detect_nodename $xml_file_path) +echo "nodename: $client_nodename" + +if [[ "$(basename $sa_data_file)" =~ ^.*\.conv$ ]]; then + rm "$sa_data_file" +fi diff --git a/server/pbench/bin/gold/test-11.txt b/server/pbench/bin/gold/test-11.txt new file mode 100644 index 0000000000..830cb82f70 --- /dev/null +++ b/server/pbench/bin/gold/test-11.txt @@ -0,0 +1,1016 @@ ++++ Running indexing on /var/tmp/pbench-test-server/test-11 +>>>>>>> /var/tmp/pbench-test-server/pbench + + + + 2.19 + + Linux + 4.6.3-300.fc24.x86_64 + x86_64 + 4 + 2016-08-03 + 22:47:40 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 6.67 + + + + + 1514280 + 6345684 + 80.73 + 372440 + 2902960 + 10290592 + 44.88 + 3932160 + 1838516 + 580 + 15069180 + 0 + 0.00 + 0 + 0.00 + 0.67 + 2.00 + 36.33 + + + 0 + 0 + 0.00 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +[{'_id': '25685d21315d1b5fdd9593be5f1ab773', + '_index': 'pbench.2016-08', + '_op_type': 'create', + '_source': {'_metadata': {'file-date': '2016-08-05', + 'file-name': '/var/tmp/pbench-test-server/test-11.tar.xz', + 'generated-by': 'index-pbench', + 'generated-by-version': '0.0.0.3', + 'md5': '25685d21315d1b5fdd9593be5f1ab773', + 'pbench-agent-version': ''}, + 'host_tools_info': [{'hostname': 'localhost', + 'hostname-f': 'localhost.localdomain\n', + 'tools': {'iostat': '--interval=3', + 'mpstat': '--interval=3', + 'perf': '--record-opts=record -a --freq=100', + 'pidstat': '--interval=3', + 'proc-interrupts': '--interval=3', + 'proc-vmstat': '--interval=3', + 'sar': '--interval=3', + 'turbostat': '--interval=3'}}, + {'hostname': '192.168.122.83', + 'hostname-f': None, + 'label': 'sysbenchguest', + 'tools': {}}], + 'run': {'config': '', + 'controller': 'localhost.localdomain', + 'date': '2016-08-02T22:47:17', + 'end_run': '2016-08-02T22:47:58.249377123', + 'name': 'pbench-user-benchmark__2016-08-02_22:47:17', + 'script': 'pbench-user-benchmark', + 'start_run': '2016-08-02T22:47:17.596797999', + 'tarball-dirname': 'test-11', + 'tarball-toc-prefix': 'test-11'}, + 'sosreports': [{'hostname-f': 'localhost.localdomain\n', + 'hostname-s': 'localhost', + 'md5': '72d90c40c542f21b76116189f5b24177 sosreport.tar.xz', + 'name': 'test-11/sysinfo/localhost/end/sosreport.tar.xz'}]}, + '_timestamp': datetime.datetime(1900, 1, 1, 0, 0), + '_type': 'pbench-run'}, + {'_index': 'pbench.2016-08', + '_op_type': 'create', + '_parent': '25685d21315d1b5fdd9593be5f1ab773', + '_source': {'dirname': '/', 'files': [{'mode': 436, 'name': 'metadata.log', 'size': 583}]}, + '_timestamp': datetime.datetime(1900, 1, 1, 0, 0), + '_type': 'pbench-run-toc-entry'}, + {'_index': 'pbench.2016-08', + '_op_type': 'create', + '_parent': '25685d21315d1b5fdd9593be5f1ab773', + '_source': {'dirname': '/1/'}, + '_timestamp': datetime.datetime(1900, 1, 1, 0, 0), + '_type': 'pbench-run-toc-entry'}, + {'_index': 'pbench.2016-08', + '_op_type': 'create', + '_parent': '25685d21315d1b5fdd9593be5f1ab773', + '_source': {'dirname': '/1/reference-result/'}, + '_timestamp': datetime.datetime(1900, 1, 1, 0, 0), + '_type': 'pbench-run-toc-entry'}, + {'_index': 'pbench.2016-08', + '_op_type': 'create', + '_parent': '25685d21315d1b5fdd9593be5f1ab773', + '_source': {'dirname': '/1/reference-result/tools-default/'}, + '_timestamp': datetime.datetime(1900, 1, 1, 0, 0), + '_type': 'pbench-run-toc-entry'}, + {'_index': 'pbench.2016-08', + '_op_type': 'create', + '_parent': '25685d21315d1b5fdd9593be5f1ab773', + '_source': {'dirname': '/1/reference-result/tools-default/localhost/'}, + '_timestamp': datetime.datetime(1900, 1, 1, 0, 0), + '_type': 'pbench-run-toc-entry'}, + {'_index': 'pbench.2016-08', + '_op_type': 'create', + '_parent': '25685d21315d1b5fdd9593be5f1ab773', + '_source': {'dirname': '/1/reference-result/tools-default/localhost/sar/', + 'files': [{'mode': 420, 'name': 'sar.data', 'size': 43236}, + {'mode': 509, 'name': 'sar.cmd', 'size': 146}]}, + '_timestamp': datetime.datetime(1900, 1, 1, 0, 0), + '_type': 'pbench-run-toc-entry'}, + {'_index': 'pbench.2016-08', + '_op_type': 'create', + '_parent': '25685d21315d1b5fdd9593be5f1ab773', + '_source': {'dirname': '/sysinfo/'}, + '_timestamp': datetime.datetime(1900, 1, 1, 0, 0), + '_type': 'pbench-run-toc-entry'}, + {'_index': 'pbench.2016-08', + '_op_type': 'create', + '_parent': '25685d21315d1b5fdd9593be5f1ab773', + '_source': {'dirname': '/sysinfo/localhost/'}, + '_timestamp': datetime.datetime(1900, 1, 1, 0, 0), + '_type': 'pbench-run-toc-entry'}, + {'_index': 'pbench.2016-08', + '_op_type': 'create', + '_parent': '25685d21315d1b5fdd9593be5f1ab773', + '_source': {'dirname': '/sysinfo/localhost/end/', + 'files': [{'mode': 436, 'name': 'sosreport.tar.xz.md5', 'size': 51}, + {'mode': 436, 'name': 'sosreport.tar.xz', 'size': 888}]}, + '_timestamp': datetime.datetime(1900, 1, 1, 0, 0), + '_type': 'pbench-run-toc-entry'}] +--- Finished indexing on /var/tmp/pbench-test-server/test-11 (status=0) ++++ pbench tree state +/var/tmp/pbench-test-server/pbench +/var/tmp/pbench-test-server/pbench/opt +/var/tmp/pbench-test-server/pbench/opt/pbench-server +/var/tmp/pbench-test-server/pbench/opt/pbench-server/lib +/var/tmp/pbench-test-server/pbench/opt/pbench-server/lib/config +/var/tmp/pbench-test-server/pbench/opt/pbench-server/lib/config/pbench-index.cfg +/var/tmp/pbench-test-server/pbench/opt/pbench-server/lib/config/pbench-server.cfg +/var/tmp/pbench-test-server/pbench/opt/pbench-server/lib/crontab +/var/tmp/pbench-test-server/pbench/opt/pbench-server/lib/crontab/crontab +/var/tmp/pbench-test-server/pbench/opt/pbench-server/lib/locks +/var/tmp/pbench-test-server/pbench/pbench +/var/tmp/pbench-test-server/pbench/pbench/archive +/var/tmp/pbench-test-server/pbench/pbench/archive/fs-version-001 +/var/tmp/pbench-test-server/pbench/pbench/public_html +/var/tmp/pbench-test-server/pbench/pbench/public_html/incoming +/var/tmp/pbench-test-server/pbench/pbench/public_html/results +/var/tmp/pbench-test-server/pbench/var +/var/tmp/pbench-test-server/pbench/var/www +/var/tmp/pbench-test-server/pbench/var/www/html +/var/tmp/pbench-test-server/pbench/var/www/html/pbench-results-host-info.versioned +/var/tmp/pbench-test-server/pbench/var/www/html/pbench-results-host-info.versioned/pbench-results-host-info.URL001 +/var/tmp/pbench-test-server/pbench/var/www/html/pbench-results-host-info.versioned/pbench-results-host-info.URL001.active +/var/tmp/pbench-test-server/pbench/var/www/html/pbench-results-host-info.versioned/pbench-results-host-info.URL001.maint +--- pbench tree state ++++ pbench log file contents +--- pbench log file contents diff --git a/server/pbench/bin/gold/test-7.3.txt b/server/pbench/bin/gold/test-7.3.txt index f9405354fa..64beeb6073 100644 --- a/server/pbench/bin/gold/test-7.3.txt +++ b/server/pbench/bin/gold/test-7.3.txt @@ -1,22 +1,22 @@ +++ Running indexing on /var/tmp/pbench-test-server/test-7.3 Other error 'end_run' Traceback (most recent call last): - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 281, in mk_run_metadata + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 293, in mk_run_metadata d['end_run'] = d['end_run'].replace('_', 'T') KeyError: 'end_run' During handling of the above exception, another exception occurred: Traceback (most recent call last): - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 884, in main - actions = mk_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, options) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 735, in mk_actions + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 899, in main + actions, toc_extra = mk_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, options) + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 748, in mk_actions actions.append(mk_results_action(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, md5sum, ts, options)) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 682, in mk_results_action + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 695, in mk_results_action source = mk_source(hostname, tbname, dirname, dirprefix, tb, mdconf, md5sum, options) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 621, in mk_source + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 633, in mk_source rec['run'] = mk_run_metadata(mdconf,dirname, dirprefix) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 292, in mk_run_metadata + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 304, in mk_run_metadata raise Exception(e) Exception: 'end_run' diff --git a/server/pbench/bin/gold/test-7.4.txt b/server/pbench/bin/gold/test-7.4.txt index f724fd2b3c..813b5fd1d4 100644 --- a/server/pbench/bin/gold/test-7.4.txt +++ b/server/pbench/bin/gold/test-7.4.txt @@ -1,17 +1,17 @@ +++ Running indexing on /var/tmp/pbench-test-server/test-7.4 Other error The sosreport did not collect a hostname other than 'localhost' Traceback (most recent call last): - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 884, in main - actions = mk_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, options) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 735, in mk_actions + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 899, in main + actions, toc_extra = mk_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, options) + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 748, in mk_actions actions.append(mk_results_action(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, md5sum, ts, options)) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 682, in mk_results_action + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 695, in mk_results_action source = mk_source(hostname, tbname, dirname, dirprefix, tb, mdconf, md5sum, options) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 623, in mk_source + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 635, in mk_source rec['sosreports'] = sos_d = mk_sosreports(tb) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 581, in mk_sosreports + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 593, in mk_sosreports d.update(hostnames_if_ip_from_sosreport(tb.extractfile(sos))) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 547, in hostnames_if_ip_from_sosreport + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 559, in hostnames_if_ip_from_sosreport raise Exception("The sosreport did not collect a hostname other than 'localhost'") Exception: The sosreport did not collect a hostname other than 'localhost' diff --git a/server/pbench/bin/gold/test-7.5.txt b/server/pbench/bin/gold/test-7.5.txt index 7cbff09c77..28580756b4 100644 --- a/server/pbench/bin/gold/test-7.5.txt +++ b/server/pbench/bin/gold/test-7.5.txt @@ -1,17 +1,17 @@ +++ Running indexing on /var/tmp/pbench-test-server/test-7.5 Other error The sosreport did not collect a hostname other than 'localhost' Traceback (most recent call last): - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 884, in main - actions = mk_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, options) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 735, in mk_actions + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 899, in main + actions, toc_extra = mk_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, options) + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 748, in mk_actions actions.append(mk_results_action(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, md5sum, ts, options)) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 682, in mk_results_action + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 695, in mk_results_action source = mk_source(hostname, tbname, dirname, dirprefix, tb, mdconf, md5sum, options) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 623, in mk_source + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 635, in mk_source rec['sosreports'] = sos_d = mk_sosreports(tb) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 581, in mk_sosreports + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 593, in mk_sosreports d.update(hostnames_if_ip_from_sosreport(tb.extractfile(sos))) - File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 547, in hostnames_if_ip_from_sosreport + File "/home/user/repo/pbench/server/pbench/bin/index-pbench", line 559, in hostnames_if_ip_from_sosreport raise Exception("The sosreport did not collect a hostname other than 'localhost'") Exception: The sosreport did not collect a hostname other than 'localhost' diff --git a/server/pbench/bin/gold/test-7.6.txt b/server/pbench/bin/gold/test-7.6.txt index 23f848cf14..dc998346d5 100644 --- a/server/pbench/bin/gold/test-7.6.txt +++ b/server/pbench/bin/gold/test-7.6.txt @@ -1,4 +1,5 @@ +++ Running indexing on /var/tmp/pbench-test-server/test-7.6 +no special paths found (to be indexed separately). indexing pbench-run and pbench-run-toc-entry [{'_id': 'c71b2c9c961ebd55f61273a6a020bdc6', '_index': 'pbench.2015-09', '_op_type': 'create', diff --git a/server/pbench/bin/gold/test-7.7.txt b/server/pbench/bin/gold/test-7.7.txt index 7cc1e6ecae..0f92d4ca95 100644 --- a/server/pbench/bin/gold/test-7.7.txt +++ b/server/pbench/bin/gold/test-7.7.txt @@ -1,4 +1,5 @@ +++ Running indexing on /var/tmp/pbench-test-server/test-7.7 +no special paths found (to be indexed separately). indexing pbench-run and pbench-run-toc-entry [{'_id': '3a58d0784827289ecf52b40dbd2d8b05', '_index': 'pbench.2015-09', '_op_type': 'create', diff --git a/server/pbench/bin/index-pbench b/server/pbench/bin/index-pbench index 62694c0196..f3e04c6ee1 100755 --- a/server/pbench/bin/index-pbench +++ b/server/pbench/bin/index-pbench @@ -2,32 +2,44 @@ # prereqs: # config file: specified in ES_CONFIG_PATH -# mapping file: +# mapping file: # vos.analysis.lib.tstos: from __future__ import print_function -import sys, os, time, re, stat -import hashlib, json, glob - -try: - from configparser import SafeConfigParser, NoSectionError, NoOptionError -except: - from ConfigParser import SafeConfigParser, NoSectionError, NoOptionError - +import tarfile +import sys +import os +import time +import re +import stat +import hashlib +import json +import glob +import pathlib +import subprocess +from shutil import rmtree +from pprint import pprint +from datetime import datetime +from collections import defaultdict from optparse import OptionParser, make_option from elasticsearch import VERSION, Elasticsearch, helpers, exceptions as es_excs from urllib3 import exceptions as ul_excs, Timeout -from datetime import datetime -import tarfile -from vos.analysis.lib import tstos +from vos.analysis.lib import tstos, index_sar -from pprint import pprint +try: + from configparser import SafeConfigParser, NoSectionError, NoOptionError +except: + from ConfigParser import SafeConfigParser, NoSectionError, NoOptionError _VERSION_ = "0.0.0.3" _NAME_ = "index-pbench" _DEBUG = 0 +# list of file names present in the pbench tar ball, +# that use a special indexing method. Currently, sar is supported. +SPECIAL_PARAMS_LIST = ['sar.data'] + class MappingFileError(Exception): pass @@ -226,7 +238,7 @@ def get_start_end_time_utc(pbf): end = utc_ts(str(pbf.readlines()[-1], 'ascii')) return (start, end) -# +# def get_pb(dirname): member_name = "%s/pbench.log" % (dirname) pblog = tb.getmember(member_name) @@ -270,7 +282,7 @@ def _to_utc(l, u): res = round(float(offset.seconds) / 60 / 60 + offset.days * 24, 1) return (lts - timedelta(0, int(res*60*60), 0)).isoformat() - + def mk_run_metadata(mdconf, dirname, dirprefix): try: d = {} @@ -292,11 +304,11 @@ def mk_run_metadata(mdconf, dirname, dirprefix): raise Exception(e) print("Tarball: %s - %s is missing in metadata.log\n" % (dirname, e), file=sys.stdout) return {} - + def mk_metadata(fname, tb, mdconf, md5sum): """Return a dict with metadata about a tarball""" mtime = datetime.fromtimestamp(os.stat(fname)[stat.ST_MTIME]) - + mddict = {'generated-by': _NAME_, 'generated-by-version': _VERSION_, 'pbench-agent-version': mdconf.get("pbench", "rpm-version"), @@ -311,7 +323,7 @@ def mk_metadata(fname, tb, mdconf, md5sum): # routines for handling sosreports, hostnames, and tools def valid_ip(address): import socket - try: + try: socket.inet_aton(address) return True except: @@ -344,7 +356,7 @@ def get_hostname_f_from_sos_d(sos_d, host=None, ip=None): return search_by_host(sos_d, host) else: return search_by_ip(sos_d, ip) - + def mk_tool_info(sos_d, mdconf): """Return a dict containing tool info (local and remote)""" try: @@ -374,7 +386,7 @@ def mk_tool_info(sos_d, mdconf): for (k,v) in remoteitems: host = k.replace('remote@', '', 1) labels[host] = v - + # now, forget about any label or remote entries - they have been dealt with. items = [x for x in items if x[0] != 'label' and not x[0].startswith('remote')] @@ -388,9 +400,9 @@ def mk_tool_info(sos_d, mdconf): host = item['hostname'] if host in labels: item['label'] = labels[host] - + return tools_array - + except Exception as err: print("get_tool_info" , err) return [] @@ -403,7 +415,7 @@ def ip_address_to_ip_o_addr(s): # If not, grovel through the ip_address file, collect the juicy pieces # and fake a string that is similar in format to the preferred case - # at least similar enough to satisfy the caller of this function. - + import re as_is = True pat = re.compile(r'^[0-9]+:') @@ -426,8 +438,8 @@ def ip_address_to_ip_o_addr(s): # EOF: 3 # if we see anything else, we stay put in the current state # transitions: 2 --> 1 action: output a line - # 2 --> 2 action: output a line - # + # 2 --> 2 action: output a line + # state = 0 ret = "" # import pdb; pdb.set_trace() @@ -451,7 +463,7 @@ def ip_address_to_ip_o_addr(s): ret += "%s: %s %s %s\n" % (serial, ifname, proto, addr) state = 3 return ret - + def if_ip_from_sosreport(ip_addr_f): """Parse the ip_-o_addr file or ip_address file from the sosreport and get a dict associating the if name with the ip - separate entries @@ -474,11 +486,11 @@ def if_ip_from_sosreport(ip_addr_f): d[ifproto].append({"ifname": ifname, "ipaddr" : ifip}) return d - + def hostnames_if_ip_from_sosreport(sos): """Return a dict with hostname info (both short and fqdn) and ip addresses of all the network interfaces we find at sosreport time.""" - + tb = tarfile.open(fileobj=sos) hostname_files = [x for x in tb.getnames() if x.find('sos_commands/general/hostname') >= 0] @@ -524,7 +536,7 @@ def hostnames_if_ip_from_sosreport(sos): hostname_f = hostname_s else: assert(1 == 0) - + elif not hostname_f and hostname_s: # The sosreport did not include, or failed to properly collect, the # output from "hostname -f", so we'll just keep them the same @@ -537,7 +549,7 @@ def hostnames_if_ip_from_sosreport(sos): else: # both undefined raise Exception("Hostname undefined (both short and long)") - + if hostname_f == "localhost" and hostname_s != "localhost": hostname_f = hostname_s hostname_s = hostname_f.split('.')[0] @@ -547,7 +559,7 @@ def hostnames_if_ip_from_sosreport(sos): raise Exception("The sosreport did not collect a hostname other than 'localhost'") else: pass - + d = { 'hostname-f': hostname_f, 'hostname-s': hostname_s @@ -580,7 +592,7 @@ def mk_sosreports(tb): # get hostname (short and FQDN) from sosreport d.update(hostnames_if_ip_from_sosreport(tb.extractfile(sos))) sosreportlist.append(d) - + return sosreportlist ########################################################################### @@ -591,7 +603,7 @@ ts_start = None def ts(msg, newline=False): from datetime import datetime global ts_start - + now = datetime.now() if ts_start: print(now - ts_start, file=sys.stderr) @@ -602,7 +614,7 @@ def ts(msg, newline=False): else: print(msg, end=' ', file=sys.stderr) sys.stderr.flush() - + def mk_source(hostname, tbname, dirname, dirprefix, tb, mdconf, md5sum, options): # a dict containing: # metadata about the tarball, @@ -610,7 +622,7 @@ def mk_source(hostname, tbname, dirname, dirprefix, tb, mdconf, md5sum, options) # run metadata # tool info # tarball toc - + rec = {} if options.timeit: ts("mk_metadata") @@ -629,10 +641,8 @@ def mk_source(hostname, tbname, dirname, dirprefix, tb, mdconf, md5sum, options) ########################################################################### # mk-toc-source -def mk_toc(tb, md5sum): - +def mk_toc(tb, md5sum, special_paths=defaultdict(list)): members = tb.getmembers() - prefix = members[0].name.split(os.path.sep)[0] # create a list of dicts where each directory that contains files is represented # by a dictionary with a "name" key, whose value is the pathname of the dictionary @@ -663,10 +673,13 @@ def mk_toc(tb, md5sum): # the directory entry always preceded the file entry # in the tarball. d[dname] = { "dirname": dname, "files": [fentry] } + + if m.path.split('/')[-1] in SPECIAL_PARAMS_LIST: + special_paths[m.path.split('/')[-1]].append(m) else: continue - - return (prefix, d) + + return (prefix, d, special_paths) def mk_results_action(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, md5sum, ts, options): @@ -692,18 +705,17 @@ def mk_results_action(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, def get_md5sum_toc(tb): """Calculate the md5 sum of all the names in the toc""" - import hashlib - + h = hashlib.md5() for x in tb.getnames(): h.update(x.encode('utf-8')) return h.hexdigest() def mk_toc_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, md5sum, ts, options): - - prefix, dirs = mk_toc(tb, md5sum) + prefix, dirs, special_paths = mk_toc(tb, md5sum) assert(prefix == dirprefix) actions = [] + for d in dirs: action = { "_op_type": "create", @@ -718,8 +730,8 @@ def mk_toc_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, md if options.unittest: # sort the list to produce a predictable result for comparison to gold output actions.sort(key=lambda x: x["_source"]["dirname"]) - - return actions + + return actions, special_paths def get_md5sum(name): """Open the MD5 file of the tarball and read the MD5 sum from it.""" @@ -730,19 +742,20 @@ def mk_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, option ts = datetime.strptime("1900-01-01T00:00:00", "%Y-%m-%dT%H:%M:%S") else: ts = datetime.now() + md5sum = get_md5sum(tbname) actions = [] actions.append(mk_results_action(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, md5sum, ts, options)) - actions.extend(mk_toc_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, md5sum, ts, options)) - return actions - + tmp_actions, special_paths = mk_toc_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, md5sum, ts, options) + actions.extend(tmp_actions) + return actions, special_paths + ########################################################################### # We get the start date out of the metadata log. class BadDate(Exception): pass def run_start_date(mdconf, tbname): - # import pdb; pdb.set_trace() try: # N.B. the start_run timestamp is in UTC. tstamp = mdconf.get('run', 'start_run').split('_') @@ -794,17 +807,16 @@ def main(options, args): if not cfg_name: raise ConfigFileNotSpecified("No config file specified: set ES_CONFIG_PATH env variable or use --config on the command line") - + try: config.read(cfg_name) INDEX_PREFIX = config.get('Settings', 'index_prefix') INDEX_VERSION = config.get('Settings', 'index_version') NUMBER_OF_SHARDS = config.get('Settings', 'number_of_shards') NUMBER_OF_REPLICAS = config.get('Settings', 'number_of_replicas') - except Exception as e: raise ConfigFileError(e) - + settings = dict( number_of_shards=NUMBER_OF_SHARDS, number_of_replicas=NUMBER_OF_REPLICAS, @@ -835,7 +847,7 @@ def main(options, args): # The API body for the create() contains a dictionary with the settings and # the mappings. pbench_body = dict( - template='%s.20*-*' % (INDEX_PREFIX,), + template='%s.*20*-*' % (INDEX_PREFIX,), settings=pbench_settings, mappings=pbench_mappings) @@ -846,8 +858,12 @@ def main(options, args): es = Elasticsearch(hosts, max_retries=0) # prepare the actions - the tarball name is the only argument. - hostname = os.path.basename(os.path.dirname(args[0])) - tbname = args[0] + if options.tbpath: + hostname = os.path.basename(os.path.dirname(options.tbpath)) + tbname = options.tbpath + else: + hostname = os.path.basename(os.path.dirname(args[-1])) + tbname = args[-1] tb = tarfile.open(tbname) # this is the top-level name of the run - it should be the common @@ -862,7 +878,7 @@ def main(options, args): mdlog = tb.getmember(member_name) except: raise UnsupportedTarballFormat(tbname) - + try: mdconf = get_mdconfig(tb.extractfile(member_name)) except: @@ -880,14 +896,82 @@ def main(options, args): except Exception as e: raise TemplateError(e) - - actions = mk_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, options) + actions, toc_extra = mk_actions(hostname, tbname, dirname, dirprefix, tb, mdconf, idxname, options) + # for i in range(len(actions[1:])): print(i+1, actions[i+1]['_source']['dirname']) + + # convert sar.data files into xml files (to reside inside TMP_WORK_DIR) + # and then use index_sar.call_indexer() to index them using this + if not toc_extra: + print("no special paths found (to be indexed separately). " + \ + "indexing pbench-run and pbench-run-toc-entry", + file=sys.stderr) + else: + # define a temporary dir to be used for temporary sar data extraction + #import pdb; pdb.set_trace() + if options.tempdir: + TMP_WORK_DIR = options.tempdir + try: + if not os.path.exists(TMP_WORK_DIR): + os.makedirs(TMP_WORK_DIR) + except FileExistsError: + pass + except Exception as E: + print("Exception occured while using %s as temp dir" \ + % TMP_WORK_DIR, file=sys.stderr) + print("Falling back to /tmp as default..", file=sys.stderr) + TMP_WORK_DIR = '/tmp' + else: + print("Falling back to /tmp as default..", file=sys.stderr) + TMP_WORK_DIR = '/tmp' + + print(">>>>>>> %s" % TMP_WORK_DIR) + # process contents of toc_extra + for special_case in toc_extra: + if special_case == 'sar.data': + for m in toc_extra[special_case]: + uid = m.name.split('/sar/sar.data')[0] + #m.name = os.path.basename(m.name) + os.makedirs(os.path.join(TMP_WORK_DIR, os.path.dirname(m.path))) + tb.extract(member=m, path=TMP_WORK_DIR) + # now run os_detect and sadf binaries on this path + # and extract xml on same paths + sa_data_file = os.path.join(TMP_WORK_DIR, m.path) + + # call ./extractsa + p = subprocess.Popen([os.path.join(os.path.dirname(__file__), + 'extractsa'), sa_data_file, sa_data_file+'.xml'], + stdout=subprocess.PIPE) + odata, edata = p.communicate() + + # TODO: add conversion for files which belong to an older sysstat version + if edata: + print("could not convert binary: %s"%(sa_data_file), + file=sys.stderr) + continue + + client_nodename = odata.decode().split()[-1] + + if not client_nodename: + print("could not detect client", file=sys.stderr) + + if not options.unittest: + index_sar.call_indexer(file_path=sa_data_file+'.xml', + _nodename=client_nodename, + cfg_name=cfg_name, + run_unique_id=uid, + run_md5=get_md5sum(tbname)) + else: + print(open(sa_data_file+'.xml', 'r').read()) + + # TODO: generate grafana dashboard using create_dashboard + # finally, cleanup TMP_WORK_DIR tmp files (xmls, binaries) + rmtree(os.path.join(TMP_WORK_DIR, pathlib.Path(m.name).parts[0])) if options.unittest: pprint(actions, width=100) return 0 + # returns 0 or 1 - # returns 0 0r 1 return es_index(es, actions) except ConfigFileNotSpecified as e: @@ -917,7 +1001,7 @@ def main(options, args): except MappingFileError as e: print(e, file=sys.stderr) return 8 - + except TemplateError as e: print(repr(err), file=sys.stderr) return 9 @@ -928,21 +1012,23 @@ def main(options, args): import traceback print(traceback.format_exc()) return 11 - + ########################################################################### # Options handling prog_options = [ make_option("-C", "--config", dest="cfg_name", help="Specify config file"), + make_option("-D", "--tempdir", dest="tempdir", help="Path to temp dir for data extraction"), + make_option("-P", "--path", dest="tbpath", help="Path to tarball (.tar.xz)"), + make_option("-T", "--timeit", action="store_true", dest="timeit", help="Time action making routines"), make_option("-U", "--unittest", action="store_true", dest="unittest", help="Run in unittest mode"), - make_option("-T", "--timeit", action="store_true", dest="timeit", help="Time action making routines") ] if __name__ == '__main__': - parser = OptionParser("Usage: index-pbench [--config ] ") + parser = OptionParser("Usage: index-pbench [--tempdir ] [--config ] [--path ]") for o in prog_options: parser.add_option(o) - + (options, args) = parser.parse_args() # if options.unittest: diff --git a/server/pbench/bin/satools/oscode b/server/pbench/bin/satools/oscode new file mode 100755 index 0000000000..e652428b3e --- /dev/null +++ b/server/pbench/bin/satools/oscode @@ -0,0 +1,33 @@ +#!/usr/bin/env python3 + +# From DSA/satools/satools/ +# https://github.com/distributed-system-analysis/satools + +from __future__ import print_function + +import sys, os +from sysstat import fetch_fileheader, fetch_os_code, Invalid + +if os.path.getsize(sys.argv[1]) == 0: + print("Invalid - %s: empty data file" % sys.argv[1], file=sys.stderr) + sys.exit(1) + +try: + fm, fh, fa, magic = fetch_fileheader(sys.argv[1]) +except Invalid as e: + print("Invalid - %s: %s" % (sys.argv[1], e), file=sys.stderr) + sys.exit(1) +except Exception as e: + print("Error - %s: %s" % (sys.argv[1], e), file=sys.stderr) + sys.exit(1) + +try: + val = fetch_os_code(magic) +except Invalid as e: + print("Invalid - %s: %s" % (sys.argv[1], e), file=sys.stderr) + sys.exit(1) +except Exception as e: + print("Error - %s: %s" % (sys.argv[1], e), file=sys.stderr) + sys.exit(1) +else: + print(val) diff --git a/server/pbench/bin/satools/sysstat.py b/server/pbench/bin/satools/sysstat.py new file mode 100755 index 0000000000..269f671934 --- /dev/null +++ b/server/pbench/bin/satools/sysstat.py @@ -0,0 +1,1582 @@ +#!/usr/bin/env python3 + +# From DSA/satools/satools/ +# https://github.com/distributed-system-analysis/satools + +""" +A simple module to facilitate reading sa binary data files, providing classes +appropriate to different versions of the various binary data file formats, and +simple methods for dumping the data. + +Test in this tree via: + + for i in samples/sa.* ; do echo $i; python sysstat.py $i ; done + +/* + *************************************************************************** + * Definitions of header structures. + * + * Format of system activity data files (from at least FORMAT_MAGIC 0x2170 and later): + * __ + * | + * | file_magic structure + * | + * |-- + * | + * | file_header structure + * | + * |-- --| + * | | + * | file_activity structure | * sa_nr_act + * | | + * |-- --| + * | | + * | record_header structure | + * | | + * |-- | * + * | | + * | Statistics structures...(*) | + * | | + * |-- --| + * + * (*)Note: If it's a special record, we may find a comment instead of + * statistics (R_COMMENT record type) or the number of CPU items (R_RESTART + * record type). + *************************************************************************** + */ +""" + +import sys, time, os.path, os, lzma +from datetime import datetime +from ctypes import Structure, c_int, c_uint, c_ushort, c_uint8, c_ulong, c_char, c_ulonglong +from abc import ABCMeta, abstractmethod +from contextlib import closing + + +class Corruption(Exception): + """ + sa binary data file is corrupted somehow. + """ + pass + + +class Invalid(Exception): + """ + sa binary data file is corrupted somehow. + """ + pass + + +class Truncated(Exception): + """ + sa binary data file is corrupted somehow. + """ + pass + + +DEBUG = False + +TWO_DAYS_SECONDS = (2 * 24 * 60 * 60) + +#/* Maximum length of a comment */ +MAX_COMMENT_LEN = 64 + +#define UTSNAME_LEN 65 +UTSNAME_LEN = 65 + +#/* Get IFNAMSIZ */ +#include +#ifndef IFNAMSIZ +#define IFNAMSIZ 16 +#endif +#define MAX_IFACE_LEN IFNAMSIZ +MAX_IFACE_LEN = 16 + +#/* +# * Sysstat magic number. Should never be modified. +# * Indicate that the file was created by sysstat. +# */ +##define SYSSTAT_MAGIC 0xd596 +SYSSTAT_MAGIC = 0xd596 + +#/* Record type */ +#/* +# * R_STATS means that this is a record of statistics. +# */ +#define R_STATS 1 +R_STATS = 1 +#/* +# * R_RESTART means that this is a special record containing +# * a LINUX RESTART message. +# */ +#define R_RESTART 2 +R_RESTART = 2 +R_DUMMY = 2 # Under 2169 formats +#/* +# * R_LAST_STATS warns sar that this is the last record to be written +# * to file before a file rotation, and that the next data to come will +# * be a header file. +# * Such a record is tagged R_STATS anyway before being written to file. +# */ +#define R_LAST_STATS 3 +R_LAST_STATS = 3 +#/* +# * R_COMMENT means that this is a special record containing +# * a comment. +# */ +#define R_COMMENT 4 +R_COMMENT = 4 + +# 0x2169 based formats, add "_B" to differentiate. +#/* Define activities */ +A_PROC_B = 0x000001 +A_CTXSW_B = 0x000002 +A_CPU_B = 0x000004 +A_IRQ_B = 0x000008 +A_ONE_IRQ_B = 0x000010 +A_SWAP_B = 0x000020 +A_IO_B = 0x000040 +A_MEMORY_B = 0x000080 +A_SERIAL_B = 0x000100 +A_NET_DEV_B = 0x000200 +A_NET_EDEV_B = 0x000400 +A_DISK_B = 0x000800 +A_PID_B = 0x001000 +A_CPID_B = 0x002000 +A_NET_NFS_B = 0x004000 +A_NET_NFSD_B = 0x008000 +A_PAGE_B = 0x010000 +A_MEM_AMT_B = 0x020000 +A_KTABLES_B = 0x040000 +A_NET_SOCK_B = 0x080000 +A_QUEUE_B = 0x100000 +#define A_LAST 0x100000 + +#/* Activities */ +A_CPU = 1 +A_PCSW = 2 +A_IRQ = 3 +A_SWAP = 4 +A_PAGE = 5 +A_IO = 6 +A_MEMORY = 7 +A_KTABLES = 8 +A_QUEUE = 9 +A_SERIAL = 10 +A_DISK = 11 +A_NET_DEV = 12 +A_NET_EDEV = 13 +A_NET_NFS = 14 +A_NET_NFSD = 15 +A_NET_SOCK = 16 +A_NET_IP = 17 +A_NET_EIP = 18 +A_NET_ICMP = 19 +A_NET_EICMP = 20 +A_NET_TCP = 21 +A_NET_ETCP = 22 +A_NET_UDP = 23 +A_NET_SOCK6 = 24 +A_NET_IP6 = 25 +A_NET_EIP6 = 26 +A_NET_ICMP6 = 27 +A_NET_EICMP6 = 28 +A_NET_UDP6 = 29 +A_PWR_CPUFREQ = 30 + + +class FileMagic(Structure): + """ +As of the final git v10.2.1: + +This structure should only be extended in the future, so can serve as the +generic base structure from which we can interrupt the initial bytes of a file +to determine what the actual format version is for the rest of the file. If it +changes in size, which is likely for 10.3.x and later, we can define another +version for that specific number and insert it in the table below. + +/* + * Datafile format magic number. + * Modified to indicate that the format of the file is + * no longer compatible with that of previous sysstat versions. + */ +#define FORMAT_MAGIC 0x2171 + +/* Structure for file magic header data */ +struct file_magic { + /* + * This field identifies the file as a file created by sysstat. + */ + unsigned short sysstat_magic; + /* + * The value of this field varies whenever datafile format changes. + */ + unsigned short format_magic; + /* + * Sysstat version used to create the file. + */ + unsigned char sysstat_version; + unsigned char sysstat_patchlevel; + unsigned char sysstat_sublevel; + unsigned char sysstat_extraversion; +}; + +#define FILE_MAGIC_SIZE (sizeof(struct file_magic)) + """ + _fields_ = [ ('sysstat_magic', c_ushort), + ('format_magic', c_ushort), + ('sysstat_version', c_uint8), + ('sysstat_patchlevel', c_uint8), + ('sysstat_sublevel', c_uint8), + ('sysstat_extraversion', c_uint8) + ] + #FORMAT_MAGIC = 0x2171 + SIZE = ((2 * 2) + + (4 * 1)) + + def dump(self, *args, **kwargs): + print("file_magic:") + print("\tsysstat_magic = 0x%04x" % self.sysstat_magic) + print("\tformat_magic = 0x%04x" % self.format_magic) + print("\tsysstat_version", repr(self.sysstat_version)) + print("\tsysstat_patchlevel", repr(self.sysstat_patchlevel)) + print("\tsysstat_sublevel", repr(self.sysstat_sublevel)) + print("\tsysstat_extraversion", repr(self.sysstat_extraversion)) + + +class FileHeader(Structure): + """ + File Header structure shared by format versions under a 0xd596 + SYSSTAT_MAGIC value: + + 0x2170 (9.0.0, RHEL 6.x), + 0x1170 (RHEL 6.5+), + 0x2171 (10.1.5, RHEL 7-Beta1, Fedora 19+) + +/* Header structure for system activity data file */ +struct file_header { + /* + * Timestamp in seconds since the epoch. + */ + unsigned long sa_ust_time __attribute__ ((aligned (8))); + /* + * Number of activities saved in the file + */ + unsigned int sa_nr_act __attribute__ ((aligned (8))); + /* + * Current day, month and year. + * No need to save DST (Daylight Saving Time) flag, since it is not taken + * into account by the strftime() function used to print the timestamp. + */ + unsigned char sa_day; + unsigned char sa_month; + unsigned char sa_year; + /* + * Size of a long integer. Useful to know the architecture on which + * the datafile was created. + */ + char sa_sizeof_long; + /* + * Operating system name. + */ + char sa_sysname[UTSNAME_LEN]; + /* + * Machine hostname. + */ + char sa_nodename[UTSNAME_LEN]; + /* + * Operating system release number. + */ + char sa_release[UTSNAME_LEN]; + /* + * Machine architecture. + */ + char sa_machine[UTSNAME_LEN]; +}; + +#define FILE_HEADER_SIZE (sizeof(struct file_header)) + """ + _fields_ = [ ('sa_ust_time', c_ulong), + ('sa_nr_act', c_uint), + ('sa_day', c_uint8), + ('sa_month', c_uint8), + ('sa_year', c_uint8), + ('sa_sizeof_long', c_char), + ('sa_sysname', c_char * UTSNAME_LEN), + ('sa_nodename', c_char * UTSNAME_LEN), + ('sa_release', c_char * UTSNAME_LEN), + ('sa_machine', c_char * UTSNAME_LEN), + ('_alignment_padding', c_uint), # Padding due to alignment of first element? + ] + SIZE = ((1 * 8) + + (1 * 4) + + (4 * 1) + + (4 * UTSNAME_LEN) + + 4) + + def dump(self, format_magic, *args, **kwargs): + print("file_header (0x%04x):" % format_magic) + print("\tsa_ust_time", repr(self.sa_ust_time), datetime.utcfromtimestamp(self.sa_ust_time)) + print("\tsa_nr_act", repr(self.sa_nr_act)) + print("\tsa_day", repr(self.sa_day)) + print("\tsa_month", repr(self.sa_month)) + print("\tsa_year", repr(self.sa_year)) + print("\tsa_sizeof_long", repr(self.sa_sizeof_long)) + print("\tsa_sysname", repr(self.sa_sysname)) + print("\tsa_nodename", repr(self.sa_nodename)) + print("\tsa_release", repr(self.sa_release)) + print("\tsa_machine", repr(self.sa_machine)) + + +class FileStats2169(Structure): + """ + File Header layout for sysstat 7.x.x versions (RHEL 5.x, bascially), that + is, those with a file magic number of 0x2169. + +struct file_stats { + /* --- LONG LONG --- */ + /* Machine uptime (multiplied by the # of proc) */ + unsigned long long uptime __attribute__ ((aligned (16))); + /* Uptime reduced to one processor. Set *only* on SMP machines */ + unsigned long long uptime0 __attribute__ ((aligned (16))); + unsigned long long context_swtch __attribute__ ((aligned (16))); + unsigned long long cpu_user __attribute__ ((aligned (16))); + unsigned long long cpu_nice __attribute__ ((aligned (16))); + unsigned long long cpu_system __attribute__ ((aligned (16))); + unsigned long long cpu_idle __attribute__ ((aligned (16))); + unsigned long long cpu_iowait __attribute__ ((aligned (16))); + unsigned long long cpu_steal __attribute__ ((aligned (16))); + unsigned long long irq_sum __attribute__ ((aligned (16))); + /* --- LONG --- */ + /* Time stamp (number of seconds since the epoch) */ + unsigned long ust_time __attribute__ ((aligned (16))); + unsigned long processes __attribute__ ((aligned (8))); + unsigned long pgpgin __attribute__ ((aligned (8))); + unsigned long pgpgout __attribute__ ((aligned (8))); + unsigned long pswpin __attribute__ ((aligned (8))); + unsigned long pswpout __attribute__ ((aligned (8))); + /* Memory stats in kB */ + unsigned long frmkb __attribute__ ((aligned (8))); + unsigned long bufkb __attribute__ ((aligned (8))); + unsigned long camkb __attribute__ ((aligned (8))); + unsigned long tlmkb __attribute__ ((aligned (8))); + unsigned long frskb __attribute__ ((aligned (8))); + unsigned long tlskb __attribute__ ((aligned (8))); + unsigned long caskb __attribute__ ((aligned (8))); + unsigned long nr_running __attribute__ ((aligned (8))); + unsigned long pgfault __attribute__ ((aligned (8))); + unsigned long pgmajfault __attribute__ ((aligned (8))); + /* --- INT --- */ + unsigned int dk_drive __attribute__ ((aligned (8))); + unsigned int dk_drive_rio __attribute__ ((packed)); + unsigned int dk_drive_wio __attribute__ ((packed)); + unsigned int dk_drive_rblk __attribute__ ((packed)); + unsigned int dk_drive_wblk __attribute__ ((packed)); + unsigned int file_used __attribute__ ((packed)); + unsigned int inode_used __attribute__ ((packed)); + unsigned int super_used __attribute__ ((packed)); + unsigned int super_max __attribute__ ((packed)); + unsigned int dquot_used __attribute__ ((packed)); + unsigned int dquot_max __attribute__ ((packed)); + unsigned int rtsig_queued __attribute__ ((packed)); + unsigned int rtsig_max __attribute__ ((packed)); + unsigned int sock_inuse __attribute__ ((packed)); + unsigned int tcp_inuse __attribute__ ((packed)); + unsigned int udp_inuse __attribute__ ((packed)); + unsigned int raw_inuse __attribute__ ((packed)); + unsigned int frag_inuse __attribute__ ((packed)); + unsigned int dentry_stat __attribute__ ((packed)); + unsigned int load_avg_1 __attribute__ ((packed)); + unsigned int load_avg_5 __attribute__ ((packed)); + unsigned int load_avg_15 __attribute__ ((packed)); + unsigned int nr_threads __attribute__ ((packed)); + unsigned int nfs_rpccnt __attribute__ ((packed)); + unsigned int nfs_rpcretrans __attribute__ ((packed)); + unsigned int nfs_readcnt __attribute__ ((packed)); + unsigned int nfs_writecnt __attribute__ ((packed)); + unsigned int nfs_accesscnt __attribute__ ((packed)); + unsigned int nfs_getattcnt __attribute__ ((packed)); + unsigned int nfsd_rpccnt __attribute__ ((packed)); + unsigned int nfsd_rpcbad __attribute__ ((packed)); + unsigned int nfsd_netcnt __attribute__ ((packed)); + unsigned int nfsd_netudpcnt __attribute__ ((packed)); + unsigned int nfsd_nettcpcnt __attribute__ ((packed)); + unsigned int nfsd_rchits __attribute__ ((packed)); + unsigned int nfsd_rcmisses __attribute__ ((packed)); + unsigned int nfsd_readcnt __attribute__ ((packed)); + unsigned int nfsd_writecnt __attribute__ ((packed)); + unsigned int nfsd_accesscnt __attribute__ ((packed)); + unsigned int nfsd_getattcnt __attribute__ ((packed)); + /* --- CHAR --- */ + /* Record type: R_STATS or R_DUMMY */ + unsigned char record_type __attribute__ ((packed)); + /* + * Time stamp: hour, minute and second. + * Used to determine TRUE time (immutable, non locale dependent time). + */ + unsigned char hour /* (0-23) */ __attribute__ ((packed)); + unsigned char minute /* (0-59) */ __attribute__ ((packed)); + unsigned char second /* (0-59) */ __attribute__ ((packed)); +}; + """ + _fields_ = [ + # --- LONG LONG --- + ('uptime', c_ulonglong), # 8 bytes, 16 byte aligned + ('uptime_padding', c_ulong), # ... 8 bytes of padding + # Uptime reduced to one processor. Set *only* on SMP machines + ('uptime0', c_ulonglong), + ('uptime0_padding', c_ulong), # ... 8 bytes of padding + ('context_swtch', c_ulonglong), + ('context_swtch_padding', c_ulong), # ... 8 bytes of padding + ('cpu_user', c_ulonglong), + ('cpu_user_padding', c_ulong), # ... 8 bytes of padding + + ('cpu_nice', c_ulonglong), + ('cpu_nice_padding', c_ulong), # ... 8 bytes of padding + ('cpu_system', c_ulonglong), + ('cpu_system_padding', c_ulong), # ... 8 bytes of padding + ('cpu_idle', c_ulonglong), + ('cpu_idle_padding', c_ulong), # ... 8 bytes of padding + + ('cpu_iowait', c_ulonglong), + ('cpu_iowait_padding', c_ulong), # ... 8 bytes of padding + ('cpu_steal', c_ulonglong), + ('cpu_steal_padding', c_ulong), # ... 8 bytes of padding + ('irq_sum', c_ulonglong), + ('irq_sum_padding', c_ulong), # ... 8 bytes of padding + # --- LONG --- + # Time stamp (number of seconds since the epoch) + ('ust_time', c_ulong), # 8 bytes, 8 byte aligned + ('processes', c_ulong), + ('pgpgin', c_ulong), + + ('pgpgout', c_ulong), + ('pswpin', c_ulong), + ('pswpout', c_ulong), + # Memory stats in kB + ('frmkb', c_ulong), + ('bufkb', c_ulong), + ('camkb', c_ulong), + ('tlmkb', c_ulong), + ('frskb', c_ulong), + + ('tlskb', c_ulong), + ('caskb', c_ulong), + ('nr_running', c_ulong), + ('pgfault', c_ulong), + ('pgmajfault', c_ulong), + # --- INT --- + ('dk_drive', c_uint), # 4 bytes, packed + ('dk_drive_rio', c_uint), + ('dk_drive_wio', c_uint), + ('dk_drive_rblk', c_uint), + ('dk_drive_wblk', c_uint), + + ('file_used', c_uint), + ('inode_used', c_uint), + ('super_used', c_uint), + ('super_max', c_uint), + ('dquot_used', c_uint), + + ('dquot_max', c_uint), + ('rtsig_queued', c_uint), + ('rtsig_max', c_uint), + ('sock_inuse', c_uint), + ('tcp_inuse', c_uint), + + ('udp_inuse', c_uint), + ('raw_inuse', c_uint), + ('frag_inuse', c_uint), + ('dentry_stat', c_uint), + ('load_avg_1', c_uint), + + ('load_avg_5', c_uint), + ('load_avg_15', c_uint), + ('nr_threads', c_uint), + ('nfs_rpccnt', c_uint), + ('nfs_rpcretrans', c_uint), + + ('nfs_readcnt', c_uint), + ('nfs_writecnt', c_uint), + ('nfs_accesscnt', c_uint), + ('nfs_getattcnt', c_uint), + ('nfsd_rpccnt', c_uint), + + ('nfsd_rpcbad', c_uint), + ('nfsd_netcnt', c_uint), + ('nfsd_netudpcnt', c_uint), + ('nfsd_nettcpcnt', c_uint), + ('nfsd_rchits', c_uint), + + ('nfsd_rcmisses', c_uint), + ('nfsd_readcnt', c_uint), + ('nfsd_writecnt', c_uint), + ('nfsd_accesscnt', c_uint), + ('nfsd_getattcnt', c_uint), + # --- CHAR (uint8) --- + # Record type: R_STATS or R_DUMMY + ('record_type', c_uint8), # 1 byte, packed + # + # Time stamp: hour, minute and second. + # Used to determine TRUE time (immutable, non locale dependent time). + # + ('hour', c_uint8), + ('minute', c_uint8), + ('second', c_uint8), + # + # 12 bytes of padding follow because of initial "__attribute__ ((aligned (16)))" + # + ('_alignment_padding0', c_uint), + ('_alignment_padding1', c_uint), + ] + SIZE = ((10 * 16) # 10 unsigned long longs + + (16 * 8) # 16 unsigned longs + + (40 * 4) # 40 unsigned ints + + (4 * 1) # 4 unsigned chars + + 12) # 12 bytes of padding + + def integrity(self, offset=-1, *args, **kwargs): + for f in self._fields_: + if not f[0].endswith('_padding'): + continue + val = getattr(self, f[0]) + if val == 0: + continue + if DEBUG: + print(repr(f)) + self.dump(verbose=True) + import pdb; pdb.set_trace() + raise Corruption("non-zero filled padding: fs.%s = 0x%0x, offset: %d" % (f[0], val, offset)) + + def dump(self, verbose=False, *args, **kwargs): + print("file_stats: type %d, ts %r" % (self.record_type, time.gmtime(self.ust_time))) + if not verbose: + return + for f in self._fields_: + print("\t%s: %r" % (f[0], repr(getattr(self, f[0])))) + + +class StatsOneCpu2169(Structure): + """ + CPU stats layout for a single CPU for sysstat 7.x.x versions (RHEL 5.x, + bascially). + +struct stats_one_cpu { + unsigned long long per_cpu_idle __attribute__ ((aligned (16))); + unsigned long long per_cpu_iowait __attribute__ ((aligned (16))); + unsigned long long per_cpu_user __attribute__ ((aligned (16))); + unsigned long long per_cpu_nice __attribute__ ((aligned (16))); + unsigned long long per_cpu_system __attribute__ ((aligned (16))); + unsigned long long per_cpu_steal __attribute__ ((aligned (16))); + unsigned long long pad __attribute__ ((aligned (16))); +}; + """ + _fields_ = [ ('per_cpu_idle', c_ulonglong), + ('per_cpu_idle_padding', c_ulong), + ('per_cpu_iowait', c_ulonglong), + ('per_cpu_iowait_padding', c_ulong), + ('per_cpu_user', c_ulonglong), + ('per_cpu_user_padding', c_ulong), + ('per_cpu_nice', c_ulonglong), + ('per_cpu_nice_padding', c_ulong), + ('per_cpu_system', c_ulonglong), + ('per_cpu_system_padding', c_ulong), + ('per_cpu_steal', c_ulonglong), + ('per_cpu_steal_padding', c_ulong), + ('pad', c_ulonglong), + ('pad_padding', c_ulong), + ] + SIZE = (7 * 16) + + def dump(self): + pass + + +class StatsSerial2169(Structure): + """ + Serial stats layout for sysstat 7.x.x versions (RHEL 5.x, bascially). + +struct stats_serial { + unsigned int rx __attribute__ ((aligned (8))); + unsigned int tx __attribute__ ((packed)); + unsigned int frame __attribute__ ((packed)); + unsigned int parity __attribute__ ((packed)); + unsigned int brk __attribute__ ((packed)); + unsigned int overrun __attribute__ ((packed)); + unsigned int line __attribute__ ((packed)); + unsigned char pad[4] __attribute__ ((packed)); +}; + """ + _fields_ = [ ('rx', c_uint), + ('tx', c_uint), + ('frame', c_uint), + ('parity', c_uint), + ('brk', c_uint), + ('overrun', c_uint), + ('line', c_uint), + ('pad', c_uint8 * 4), + ] + SIZE = (7 * 4) + 4 + + def dump(self): + pass + + +NR_IRQS = 256 + +class StatInterrupt2169(Structure): + """ + """ + _fields_ = [ ('interrupt', c_uint * NR_IRQS) ] + + SIZE = 4 * NR_IRQS + + def dump(self): + pass + + +class StatsIrqCpu2169(Structure): + """ + IRQ CPU stats layout for sysstat 7.x.x versions (RHEL 5.x, bascially). + +struct stats_irq_cpu { + unsigned int interrupt __attribute__ ((aligned (8))); + unsigned int irq __attribute__ ((packed)); +}; + """ + _fields_ = [ ('interrupt', c_uint), + ('irq', c_uint), + ] + SIZE = (2 * 4) + + def dump(self): + pass + + +class StatsNetDev2169(Structure): + """ + Net Dev stats layout for sysstat 7.x.x versions (RHEL 5.x, bascially). + +struct stats_net_dev { + unsigned long rx_packets __attribute__ ((aligned (8))); + unsigned long tx_packets __attribute__ ((aligned (8))); + unsigned long rx_bytes __attribute__ ((aligned (8))); + unsigned long tx_bytes __attribute__ ((aligned (8))); + unsigned long rx_compressed __attribute__ ((aligned (8))); + unsigned long tx_compressed __attribute__ ((aligned (8))); + unsigned long multicast __attribute__ ((aligned (8))); + unsigned long collisions __attribute__ ((aligned (8))); + unsigned long rx_errors __attribute__ ((aligned (8))); + unsigned long tx_errors __attribute__ ((aligned (8))); + unsigned long rx_dropped __attribute__ ((aligned (8))); + unsigned long tx_dropped __attribute__ ((aligned (8))); + unsigned long rx_fifo_errors __attribute__ ((aligned (8))); + unsigned long tx_fifo_errors __attribute__ ((aligned (8))); + unsigned long rx_frame_errors __attribute__ ((aligned (8))); + unsigned long tx_carrier_errors __attribute__ ((aligned (8))); + char interface[MAX_IFACE_LEN] __attribute__ ((aligned (8))); +}; + """ + _fields_ = [ ('rx_packets', c_ulong), + ('tx_packets', c_ulong), + ('rx_bytes', c_ulong), + ('tx_bytes', c_ulong), + ('rx_compressed', c_ulong), + ('tx_compressed', c_ulong), + ('multicast', c_ulong), + ('collisions', c_ulong), + ('rx_errors', c_ulong), + ('tx_errors', c_ulong), + ('rx_dropped', c_ulong), + ('tx_dropped', c_ulong), + ('rx_fifo_errors', c_ulong), + ('tx_fifo_errors', c_ulong), + ('rx_frame_errors', c_ulong), + ('tx_carrier_errors', c_ulong), + ('interface', c_char * MAX_IFACE_LEN), + ] + SIZE = ((16 * 8) + + MAX_IFACE_LEN) + + def dump(self): + pass + + +class DiskStats2169(Structure): + """ + Disk stats layout for sysstat 7.x.x versions (RHEL 5.x, bascially). + +struct disk_stats { + unsigned long long rd_sect __attribute__ ((aligned (16))); + unsigned long long wr_sect __attribute__ ((aligned (16))); + unsigned long rd_ticks __attribute__ ((aligned (16))); + unsigned long wr_ticks __attribute__ ((aligned (8))); + unsigned long tot_ticks __attribute__ ((aligned (8))); + unsigned long rq_ticks __attribute__ ((aligned (8))); + unsigned long nr_ios __attribute__ ((aligned (8))); + unsigned int major __attribute__ ((aligned (8))); + unsigned int minor __attribute__ ((packed)); +}; + """ + _fields_ = [ ('rd_sect', c_ulonglong), + ('rd_sect_padding', c_ulong), + ('wr_sect', c_ulonglong), + ('wr_sect_padding', c_ulong), + ('rd_ticks', c_ulong), + ('wr_ticks', c_ulong), + ('tot_ticks', c_ulong), + ('rq_ticks', c_ulong), + ('nr_ios', c_ulong), + ('major', c_uint), + ('minor', c_uint), + ] + SIZE = ((2 * 16) + + (5 * 8) + + (2 * 4)) + + def dump(self): + pass + + +class FileHeader2169(Structure): + """ + File Header layout for sysstat 7.x.x versions (RHEL 5.x, bascially). + +/* System activity data file header */ +struct file_hdr { + /* --- LONG --- */ + /* Time stamp in seconds since the epoch */ + unsigned long sa_ust_time __attribute__ ((aligned (8))); + /* --- INT --- */ + /* Activity flag */ + unsigned int sa_actflag __attribute__ ((aligned (8))); + /* Number of processes to monitor ( {-x | -X } ALL) */ + unsigned int sa_nr_pid __attribute__ ((packed)); + /* Number of interrupts per processor: 2 means two interrupts */ + unsigned int sa_irqcpu __attribute__ ((packed)); + /* Number of disks */ + unsigned int sa_nr_disk __attribute__ ((packed)); + /* Number of processors: + * 0 means 1 proc and non SMP machine + * 1 means 1 proc and SMP machine + * 2 means two proc, etc. + */ + unsigned int sa_proc __attribute__ ((packed)); + /* Number of serial lines: 2 means two lines (ttyS00 and ttyS01) */ + unsigned int sa_serial __attribute__ ((packed)); + /* Number of network devices (interfaces): 2 means two lines */ + unsigned int sa_iface __attribute__ ((packed)); + /* --- SHORT --- */ + /* System activity data file magic number */ + unsigned short sa_magic __attribute__ ((packed)); + /* file_stats structure size */ + unsigned short sa_st_size __attribute__ ((packed)); + /* --- CHAR --- */ + /* + * Current day, month and year. + * No need to save DST (daylight saving time) flag, since it is not taken + * into account by the strftime() function used to print the timestamp. + */ + unsigned char sa_day __attribute__ ((packed)); + unsigned char sa_month __attribute__ ((packed)); + unsigned char sa_year __attribute__ ((packed)); + /* + * Size of a long integer. Useful to know the architecture on which + * the datafile was created. + */ + char sa_sizeof_long __attribute__ ((packed)); + /* Operating system name */ + char sa_sysname[UTSNAME_LEN] __attribute__ ((packed)); + /* Machine hostname */ + char sa_nodename[UTSNAME_LEN] __attribute__ ((packed)); + /* Operating system release number */ + char sa_release[UTSNAME_LEN] __attribute__ ((packed)); +}; + +#define FILE_HDR_SIZE (sizeof(struct file_hdr)) + """ + _fields_ = [ ('sa_ust_time', c_ulong), + ('sa_actflag', c_uint), + ('sa_nr_pid', c_uint), + ('sa_irqcpu', c_uint), + ('sa_nr_disk', c_uint), + ('sa_proc', c_uint), + ('sa_serial', c_uint), + ('sa_iface', c_uint), + ('sa_magic', c_ushort), + ('sa_st_size', c_ushort), + ('sa_day', c_uint8), + ('sa_month', c_uint8), + ('sa_year', c_uint8), + ('sa_sizeof_long', c_char), + ('sa_sysname', c_char * UTSNAME_LEN), + ('sa_nodename', c_char * UTSNAME_LEN), + ('sa_release', c_char * UTSNAME_LEN), + ('padding', c_char), + ] + SIZE = (8 + + (7 * 4) + + (2 * 2) + + (4 * 1) + + (3 * UTSNAME_LEN) + + 1) + + def dump(self, *args, **kwargs): + print("file_header (0x%04x):" % (self.sa_magic,)) + print("\tsa_ust_time", repr(self.sa_ust_time), datetime.utcfromtimestamp(self.sa_ust_time)) + print("\tsa_actflag", repr(self.sa_actflag)) + print("\tsa_nr_pid", repr(self.sa_nr_pid)) + print("\tsa_irqcpu", repr(self.sa_irqcpu)) + print("\tsa_nr_disk", repr(self.sa_nr_disk)) + print("\tsa_proc", repr(self.sa_proc)) + print("\tsa_serial", repr(self.sa_serial)) + print("\tsa_iface", repr(self.sa_iface)) + print("\tsa_magic 0x%04x" % self.sa_magic) + print("\tsa_st_size", repr(self.sa_st_size)) + print("\tsa_day", repr(self.sa_day)) + print("\tsa_month", repr(self.sa_month)) + print("\tsa_year", repr(self.sa_year)) + print("\tsa_sizeof_long", repr(self.sa_sizeof_long)) + print("\tsa_sysname", repr(self.sa_sysname)) + print("\tsa_nodename", repr(self.sa_nodename)) + print("\tsa_release", repr(self.sa_release)) + + +class FileHeaderOldGeneric(Structure): + """ + Old style sa datafiles has the magic value at offset 36 (both for 32 and + 64 bits). + """ + _fields_ = [ ('padding', c_char * 36), + ('sa_magic', c_ushort), + ] + SIZE = 36 + 2 + + +def check_readinto(obj, ret): + if ret != obj.SIZE: + if DEBUG: + import pdb; pdb.set_trace() + raise Truncated("Read %d, expected to read %d" % (ret, obj.SIZE)) + + +def check_timestamp(fh, rh, prev_rh): + if rh.ust_time == 0: + raise Corruption("Record timestamp is zero") + if (rh.ust_time - fh.sa_ust_time) < -60: + # We have seen cases where the file header is one second later than + # the first record, which is odd, but okay. So we only consider this + # to be invalid if the header is more than a minute later than a + # record. + raise Invalid("Binary data file record, %s, earlier than header, %s" % ( + time.strftime("%c", time.gmtime(rh.ust_time)), time.strftime("%c", time.gmtime(fh.sa_ust_time)))) + if prev_rh: + if rh.ust_time < prev_rh.ust_time: + raise Invalid("Binary data file record, %s, earlier than previous, %s" % ( + time.strftime("%c", time.gmtime(rh.ust_time)), time.strftime("%c", time.gmtime(prev_rh.ust_time)))) + if (rh.ust_time - prev_rh.ust_time) > TWO_DAYS_SECONDS: + raise Invalid("Binary data file record, %s, greater than two days from previous, %s" % ( + time.strftime("%c", time.gmtime(rh.ust_time)), time.strftime("%c", time.gmtime(prev_rh.ust_time)))) + else: + if (rh.ust_time - fh.sa_ust_time) > TWO_DAYS_SECONDS: + raise Invalid("Binary data file record, %s, greater than two days from header, %s" % ( + time.strftime("%c", time.gmtime(rh.ust_time)), time.strftime("%c", time.gmtime(fh.sa_ust_time)))) + + +def read_extra_stats2169(fp, fh, wl=None): + """ + These structures appear optionally, but always in this order. + """ + total_read = 0 + if fh.sa_proc: + c_read = 0 + for i in range(fh.sa_proc): + cpu_stats = StatsOneCpu2169() + ret = fp.readinto(cpu_stats) + check_readinto(cpu_stats, ret) + total_read += ret + c_read += ret + cpu_stats.dump() + if wl is not None: + wl.append(cpu_stats) + if DEBUG: + print("c_read = ", c_read) + if (fh.sa_actflag & A_ONE_IRQ_B) == A_ONE_IRQ_B: + interrupt_stats = StatInterrupt2169() + ret = fp.readinto(interrupt_stats) + check_readinto(interrupt_stats, ret) + if DEBUG: + print("int_read = ", ret) + total_read += ret + interrupt_stats.dump() + if wl is not None: + wl.append(interrupt_stats) + if fh.sa_serial: + s_read = 0 + for i in range(fh.sa_serial): + serial_stats = StatsSerial2169() + ret = fp.readinto(serial_stats) + check_readinto(serial_stats, ret) + s_read += ret + total_read += ret + serial_stats.dump() + if wl is not None: + wl.append(serial_stats) + if DEBUG: + print("s_read = ", s_read) + if fh.sa_irqcpu: + i_read = 0 + for i in range(fh.sa_proc * fh.sa_irqcpu): + irq_cpu_stats = StatsIrqCpu2169() + ret = fp.readinto(irq_cpu_stats) + check_readinto(irq_cpu_stats, ret) + i_read += ret + total_read += ret + irq_cpu_stats.dump() + if wl is not None: + wl.append(irq_cpu_stats) + if DEBUG: + print("i_read = ", i_read) + if fh.sa_iface: + if_read = 0 + for i in range(fh.sa_iface): + net_dev_stats = StatsNetDev2169() + ret = fp.readinto(net_dev_stats) + check_readinto(net_dev_stats, ret) + if_read += ret + total_read += ret + net_dev_stats.dump() + if wl is not None: + wl.append(net_dev_stats) + if DEBUG: + print("if_read = ", if_read) + if fh.sa_nr_disk: + d_read = 0 + for i in range(fh.sa_nr_disk): + disk_stats = DiskStats2169() + ret = fp.readinto(disk_stats) + check_readinto(disk_stats, ret) + d_read += ret + total_read += ret + disk_stats.dump() + if wl is not None: + wl.append(disk_stats) + if DEBUG: + print("d_read = ", d_read) + return total_read + + +def process_file_2169(fp, fm, fh, fa, magic, callback=None): + assert hasattr(fp, 'readinto') + assert fm is None + assert isinstance(fh, Structure) + assert fa is None + assert magic == 0x2169 + + assert FileHeader2169.SIZE == 240, "FileHeader2169.SIZE (%d) != 240" % FileHeader2169.SIZE + assert FileStats2169.SIZE == 464, "FileStats2169.SIZE (%d) != 464" % FileStats2169.SIZE + assert StatsOneCpu2169.SIZE == 112, "StatsOneCpu2169.SIZE (%d) != 112" % StatsOneCpu2169.SIZE + assert StatsSerial2169.SIZE == 32, "StatsSerial2169.SIZE (%d) != 32" % StatsSerial2169.SIZE + assert StatsIrqCpu2169.SIZE == 8, "StatsIrqCpu2169.SIZE (%d) != 8" % StatsIrqCpu2169.SIZE + assert StatsNetDev2169.SIZE == 144, "StatsNetDev2169.SIZE (%d) != 144" % StatsNetDev2169.SIZE + assert DiskStats2169.SIZE == 80, "DiskStats2169.SIZE (%d) != 80" % DiskStats2169.SIZE + + if FileStats2169.SIZE != fh.sa_st_size: + # If the file header is not valid, we're done + if DEBUG: + import pdb; pdb.set_trace() + raise Invalid( + "Invalid file header structure encountered," + " expected sizeof(struct file_stats) == %d" + " for magic 0x2169, but found .sa_st_size = %d" % ( + FileStats2169.SIZE, fh.sa_st_size)) + + if callback is not None: + callback.start(file_header=fh) + + try: + prev_fs = None + fs = None + while True: + prev_fs = fs + fs = FileStats2169() + try: + ret = fp.readinto(fs) + except Exception: + if DEBUG: + import pdb; pdb.set_trace() + raise + else: + if ret == 0: + # Indicates EOF + break + else: + check_readinto(fs, ret) + fs.integrity(fp.tell() - fs.SIZE) + check_timestamp(fh, fs, prev_fs) + if fs.record_type == R_DUMMY: + if callback is not None: + callback.handle_record(fs, record_payload=None) + continue + if callback is not None: + write_list = [] + else: + write_list = None + ret = read_extra_stats2169(fp, fh, write_list) + if callback is not None: + callback.handle_record(fs, record_payload=write_list) + finally: + if callback is not None: + callback.end() + + +class RecordHeader2170(Structure): + """ +/* Header structure for every record */ +struct record_header { + /* + * Machine uptime (multiplied by the # of proc). + */ + unsigned long long uptime __attribute__ ((aligned (16))); + /* + * Uptime reduced to one processor. Always set, even on UP machines. + */ + unsigned long long uptime0 __attribute__ ((aligned (16))); + /* + * Timestamp (number of seconds since the epoch). + */ + unsigned long ust_time __attribute__ ((aligned (16))); + /* + * Record type: R_STATS, R_RESTART,... + */ + unsigned char record_type __attribute__ ((aligned (8))); + /* + * Timestamp: Hour (0-23), minute (0-59) and second (0-59). + * Used to determine TRUE time (immutable, non locale dependent time). + */ + unsigned char hour; + unsigned char minute; + unsigned char second; +}; + +#define RECORD_HEADER_SIZE (sizeof(struct record_header)) + """ + _fields_ = [ ('uptime', c_ulonglong), # 8 bytes, __attribute__ ((aligned (16))) + ('uptime_padding', c_ulong), # ... 8 bytes of padding for next alignment + ('uptime0', c_ulonglong), # 8 bytes, __attribute__ ((aligned (16))) + ('uptime0_padding', c_ulong), # ... 8 bytes of padding for next alignment + ('ust_time', c_ulong), # 8 bytes, __attribute__ ((aligned (16))) + ('record_type', c_uint8), # 1 byte, __attribute__ ((aligned (8))); + ('hour', c_uint8), # 1 byte + ('minute', c_uint8), # 1 byte + ('second', c_uint8), # 1 byte + ('_alignment_padding', c_uint), # 4 bytes of padding due to alignment? + ] + SIZE = ((2 * 16) + + (1 * 8) + + (4 * 1) + + (1 * 4)) + + def integrity(self, offset=-1, *args, **kwargs): + for f in self._fields_: + if not f[0].endswith('_padding'): + continue + val = getattr(self, f[0]) + if val == 0: + continue + if DEBUG: + print(repr(f)) + self.dump(verbose=True) + import pdb; pdb.set_trace() + raise Corruption("non-zero filled padding: rh.%s = 0x%0x, offset: %d" % (f[0], val, offset)) + + def dump(self, verbose=False, *args, **kwargs): + print("record_header: type %d, ts %r" % (self.record_type, time.gmtime(self.ust_time))) + if not verbose: + return + for f in self._fields_: + print("\t%s: %r" % (f[0], repr(getattr(self, f[0])))) + + +class FileActivitySummary(object): + def __init__(self, fa, total_len): + self.fa = fa + self.total_len = total_len + + def dump(self, *args, **kwargs): + print("file activity summary, total length: %d" % (self.total_len,)) + + + +class FileActivity2170(Structure): + """ +/* List of activities saved in file */ +struct file_activity { + /* + * Identification value of activity. + */ + unsigned int id __attribute__ ((aligned (4))); + /* + * Number of items for this activity. + */ + __nr_t nr __attribute__ ((packed)); + /* + * Size of an item structure. + */ + int size __attribute__ ((packed)); +}; + """ + _fields_ = [ ('id', c_uint), + ('nr', c_int), + ('size', c_int), + ] + SIZE = 3 * 4 + + +def get_file_activity_2170(fp, fh): + # Read file activities + a_cpu = False + file_activities = [] + total_len = 0 + for i in range(fh.sa_nr_act): + act = FileActivity2170() + ret = fp.readinto(act) + check_readinto(act, ret) + if act.nr <= 0: + if DEBUG: + import pdb; pdb.set_trace() + print(repr(act)) + raise Invalid("activity count %d <= 0" % act.nr) + file_activities.append(act) + if act.id == A_CPU: + a_cpu = True + total_len += (act.nr * act.size) + + if not a_cpu: + if DEBUG: + import pdb; pdb.set_trace() + raise Invalid("expected CPU activity") + + return FileActivitySummary(file_activities, total_len) + + +def get_file_activity_1170(fp, fh): + return get_file_activity_2170(fp, fh) + + +def process_file_2170(fp, fm, fh, fa, magic, callback=None): + assert hasattr(fp, 'readinto') + assert isinstance(fm, Structure) + assert isinstance(fh, Structure) + assert isinstance(fa, FileActivitySummary) + assert magic == 0x1170 or magic > 0x2169 + + if callback is not None: + callback.start(file_magic=fm, file_header=fh, file_activities=fa) + + try: + prev_rh = None + rh = None + while True: + prev_rh = rh + rh = RecordHeader2170() + try: + ret = fp.readinto(rh) + except Exception: + if DEBUG: + import pdb; pdb.set_trace() + raise + else: + if ret == 0: + # Indicates EOF + break + else: + check_readinto(rh, ret) + rh.integrity(fp.tell() - rh.SIZE) + try: + check_timestamp(fh, rh, prev_rh) + except Invalid: + if callback is not None: + do_raise = callback.handle_invalid(rh, prev_rh) + else: + do_raise = True + if do_raise: + raise + + if rh.record_type == R_COMMENT: + fc = bytearray(MAX_COMMENT_LEN) + ret = fp.readinto(fc) + if ret != MAX_COMMENT_LEN: + if DEBUG: + import pdb; pdb.set_trace() + raise Truncated("Could not read entire comment," + " read %d, expected %d" % (ret, MAX_COMMENT_LEN)) + if callback is not None: + callback.handle_record(rh, record_payload=fc) + continue + elif rh.record_type == R_RESTART: + if callback is not None: + callback.handle_record(rh, record_payload=None) + continue + act_buf = bytearray(fa.total_len) + ret = fp.readinto(act_buf) + if ret != fa.total_len: + if DEBUG: + import pdb; pdb.set_trace() + raise Truncated("Could not read all activities," + " read %d, expected records of size %d" % (ret, fa.total_len)) + if callback is not None: + callback.handle_record(rh, record_payload=act_buf) + finally: + if callback is not None: + callback.end() + + +def process_file_1170(fp, fm, fh, fa, magic, callback=None): + """ + For some reason, RHEL 6.5 patch sysstat to mark a changed file format + using 0x1170. It is not clear where the format change came from, or what + the difference is, but it did not affect sizing or layouts, as far as we + can tell. + """ + process_file_2170(fp, fm, fh, fa, magic, callback=callback) + + +ACTIVITY_MAGIC_BASE = 0x8a +ACTIVITY_MAGIC_UNKNOWN = 0x89 + +class FileActivity2171(Structure): + """ +/* + * Base magical number for activities. + */ +#define ACTIVITY_MAGIC_BASE 0x8a +/* + * Magical value used for activities with + * unknown format (used for sadf -H only). + */ +#define ACTIVITY_MAGIC_UNKNOWN 0x89 + +/* List of activities saved in file */ +struct file_activity { + /* + * Identification value of activity. + */ + unsigned int id __attribute__ ((aligned (4))); + /* + * Activity magical number. + */ + unsigned int magic __attribute__ ((packed)); + /* + * Number of items for this activity. + */ + __nr_t nr __attribute__ ((packed)); + /* + * Number of sub-items for this activity. + */ + __nr_t nr2 __attribute__ ((packed)); + /* + * Size of an item structure. + */ + int size __attribute__ ((packed)); +}; + +#define FILE_ACTIVITY_SIZE (sizeof(struct file_activity)) + """ + _fields_ = [ ('id', c_uint), + ('magic', c_int), + ('nr', c_int), + ('nr2', c_int), + ('size', c_int), + ] + SIZE = 5 * 4 + + +def get_file_activity_2171(fp, fh): + # Read file activities + a_cpu = False + file_activities = [] + total_len = 0 + for i in range(fh.sa_nr_act): + act = FileActivity2171() + ret = fp.readinto(act) + check_readinto(act, ret) + if act.nr <= 0 or act.nr2 <= 0: + if DEBUG: + import pdb; pdb.set_trace() + print(repr(act)) + raise Invalid("activity counts: (nr %d or nr2 %d) <= 0" % (act.nr, act.nr2)) + file_activities.append(act) + if act.id == A_CPU: + a_cpu = True + total_len += (act.nr * act.nr2 * act.size) + + if not a_cpu: + if DEBUG: + import pdb; pdb.set_trace() + raise Invalid("expected CPU activity") + + return FileActivitySummary(file_activities, total_len) + + +def process_file_2171(fp, fm, fh, fa, magic, callback=None): + """ + While the format magic has changed, the actual on-disk format is not so + different since the activities have already been processed. Since all the + record reads are performed using the values stored in the activity set, + the processing remains the same. + """ + process_file_2170(fp, fm, fh, fa, magic, callback=callback) + + +class_map = { + 0x2169: { + "file_magic": None, + "file_header": FileHeader2169, + "process_file": process_file_2169, + "file_activity": None, + "os-code": "5x", + "rpm-versions": ("sysstat-7.0.0-3.el5", + "sysstat-7.0.2-1.el5", + "sysstat-7.0.2-3.el5", + "sysstat-7.0.2-3.el5_5.1", + "sysstat-7.0.2-11.el5", + "sysstat-7.0.2-12.el5",), + }, + 0x2170: { + "file_magic": FileMagic, + "file_header": FileHeader, + "process_file": process_file_2170, + "file_activity": get_file_activity_2170, + "os-code": "64", + "rpm-versions": ("sysstat-9.0.4-11.el6", + "sysstat-9.0.4-18.el6", + "sysstat-9.0.4-20.el6",), + }, + 0x1170: { + "file_magic": FileMagic, + "file_header": FileHeader, + "process_file": process_file_1170, + "file_activity": get_file_activity_1170, + "os-code": "65", + "rpm-versions": ("sysstat-9.0.4-22.el6",), + }, + 0x2171: { + "file_magic": FileMagic, + "file_header": FileHeader, + "process_file": process_file_2171, + "file_activity": get_file_activity_2171, + "os-code": "f19", + "rpm-versions": ("sysstat-10.1.5-1.el7",), + }, + } + + +def fetch_fileheader_with_fp(fp): + fm = FileMagic() + ret = fp.readinto(fm) + check_readinto(fm, ret) + + fp.seek(0) # Reset to the beginning to read into the proper structure below. + if fm.sysstat_magic == SYSSTAT_MAGIC: + # We have a 9.0.0 and later version + try: + the_class_map = class_map[fm.format_magic] + except KeyError: + raise Invalid("Unrecognized new format magic: 0x%04d" % fm.format_magic) + else: + magic = fm.format_magic + else: + # Now we have an old style sa binary data file, where the file + # header comes first, and the sa_magic field is at a defined + # offset inside that header. + fh = FileHeaderOldGeneric() + ret = fp.readinto(fh) + check_readinto(fh, ret) + try: + the_class_map = class_map[fh.sa_magic] + except KeyError: + raise Invalid("Unrecognized old sa magic: 0x%04d" % fh.sa_magic) + else: + magic = fh.sa_magic + # Will need to re-read from the beginning of the file to get the right + # mappings. + fp.seek(0) + + try: + fm = the_class_map['file_magic']() + except TypeError: + fm = None + else: + try: + ret = fp.readinto(fm) + check_readinto(fm, ret) + except Exception as err: + raise Invalid("Error reading file header: %s" % err) + + try: + fh = the_class_map['file_header']() + ret = fp.readinto(fh) + check_readinto(fh, ret) + except Exception as err: + raise Invalid("Error reading file header: %s" % err) + + try: + fa = the_class_map['file_activity'](fp, fh) + except TypeError: + fa = None + except Exception as err: + raise Invalid("Error reading file activities: %s" % err) + + return fm, fh, fa, magic + + +class ContentAction(object): + """ + The callback object argument of the module method, verify_contents(), + expects with these four methods. + """ + __metaclass__ = ABCMeta + + @abstractmethod + def start(self, file_magic=None, file_header=None, file_activities=None): + """ + Start the handling of a binary data file. The caller optionally + provides the file_magic record, always provides the required + file_header record, and optionally provides the file activities. + """ + pass + + @abstractmethod + def handle_record(self, record_header, record_payload=None): + """ + Handle a record header, along with its optional payload. + """ + pass + + @abstractmethod + def handle_invalid(self, record_header, prev_record_header): + """ + An invalid record header was encountered, the previous one is also + provided for the callee to inspect. If this method returns True, the + processing will continue the exception, if False, the exception will + be swallowed. + """ + pass + + @abstractmethod + def end(self): + """ + By hook, or by crook, we have reached the end of the binary data + file. No other methods will be invoked on the given object instance + after this invocation. + """ + pass + + +def verify_contents_fp(fp, tgt_hostname, callback): + fm, fh, fa, magic = fetch_fileheader_with_fp(fp) + try: + the_class_map = class_map[magic] + except KeyError: + raise Invalid("Unrecognized old sa magic: 0x%04d" % magic) + else: + if tgt_hostname and (tgt_hostname != fh.sa_nodename.decode('utf-8')): + raise Invalid("Target host name, %s, does not match file header node name, %s" % (tgt_hostname, fh.sa_nodename)) + process_file = the_class_map['process_file'] + process_file(fp, fm, fh, fa, magic, callback=callback) + + +def verify_contents(thefile, tgt_hostname=None, callback=None): + """ + Given a sysstat binary data file verify that it contains a set of well + formed data values. + + The optional 'tgt_hostname' argument is checked against the file header's + stored hostname value. + + The optional 'callback' argument, if provided, should be an instance of + the ContentAction class, where for each magic structure, file header, file + activity set, record header and record payload read the appropriate method + will be invoked, with the 'eof' method invoked at the end. + + One of the following exceptions will be raised if a problem is found with + the file: + + Invalid: The file header or record header metadata values do not make + sense in relation to each other + + Corruption: The file appears to be corrupted in some way + + Truncated: The file does not appear to contain all the data as + described by the file header or a given record header + """ + try: + with lzma.open(thefile, "rb") as fp: + verify_contents_fp(fp, tgt_hostname, callback) + except lzma.LZMAError: + with open(thefile, "rb") as fp: + verify_contents_fp(fp, tgt_hostname, callback) + + +def fetch_os_code(magic): + """ + Given a sysstat magic number value, return the "OS code" that maps to + version of Fedora or RHEL. + """ + try: + the_class_map = class_map[magic] + except KeyError: + raise Invalid("Unrecognized old sa magic: 0x%04d" % magic) + else: + return the_class_map['os-code'] + + +def fetch_fileheader(thefile): + """ + Fetch the sysstat FileHeader object for the given file path. + """ + try: + with lzma.open(thefile, "rb") as fp: + res = fetch_fileheader_with_fp(fp) + except lzma.LZMAError: + with open(thefile, "rb") as fp: + res = fetch_fileheader_with_fp(fp) + return res + + +if __name__ == "__main__": + # When invoked as a progrem, we'll just check the first argument to see + # that is has data in it, and if so, we'll process the header, fetch the + # OS code, and verify its contents. + + if os.path.getsize(sys.argv[1]) == 0: + print("Invalid - %s: empty data file" % (sys.argv[1],), file=sys.stderr) + sys.exit(1) + + try: + fm, fh, fa, magic = fetch_fileheader(sys.argv[1]) + except Invalid as e: + print("Invalid - %s: %s" % (sys.argv[1], e), file=sys.stderr) + sys.exit(1) + except Exception as e: + print("Error - %s: %s" % (sys.argv[1], e), file=sys.stderr) + sys.exit(1) + else: + if DEBUG or 1: + fm.dump() + fh.dump(fm.format_magic) + fa.dump() + val = fetch_os_code(magic) + print("os_code = ", val) + + try: + verify_contents(sys.argv[1]) + except Invalid as e: + print("Invalid - %s: %s" % (sys.argv[1], e), file=sys.stderr) + sys.exit(1) + except Corruption as e: + print("Corrupted - %s: %s" % (sys.argv[1], e), file=sys.stderr) + sys.exit(1) + except Truncated as e: + sys.exit(1) diff --git a/server/pbench/bin/state/test-11.tar.xz b/server/pbench/bin/state/test-11.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..076360b306f52ccbf6f096a9737e58c166b57904 GIT binary patch literal 3556 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 literal 0 HcmV?d00001 diff --git a/server/pbench/bin/unittests b/server/pbench/bin/unittests index c273b0b64b..ac094ec3fd 100755 --- a/server/pbench/bin/unittests +++ b/server/pbench/bin/unittests @@ -50,7 +50,7 @@ function _run_index { shift mkdir -p $_testdir echo "+++ Running indexing on $dname" >> $_testout - PYTHONPATH=${_tlib}:$PYTHONPATH $_tdir/index-pbench -U -C ${_tlib}/config/pbench-index.cfg.example $dname.tar.xz >> $_testout 2>&1 + PYTHONPATH=${_tlib}:$PYTHONPATH $_tdir/index-pbench -U -C ${_tlib}/config/pbench-index.cfg.example -D $_testdir -P $dname.tar.xz >> $_testout 2>&1 echo "--- Finished indexing on $dname (status=$?)" >> $_testout _gitdir=$(dirname $(dirname $(dirname $_tdir))) sed -i '/File "'$(echo ${_gitdir} | sed 's;/;\\/;g')'/s;'${_gitdir}'/server/;/home/user/repo/pbench/server/;' $_testout @@ -180,6 +180,9 @@ declare -A cmds=( # pbench-rsync-satellite [test-10]="_run pbench-rsync-satellite TEST foo.bar.com $_testroot/pbench/archive" + + # 9. verify special 'toc' paths (like sar data) are processed + [test-11]="_run_activate $_testroot/test-11" ) # indexing unit tests - why is this necessary? @@ -205,4 +208,3 @@ for test in $tests ;do _reset_state done exit $failures - diff --git a/server/pbench/bin/vos/analysis/bin/sadf-5x-64 b/server/pbench/bin/vos/analysis/bin/sadf-5x-64 new file mode 100755 index 0000000000000000000000000000000000000000..7f8d30e25554df8f695d2f727a461a2024d52a27 GIT binary patch literal 60584 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 DY5g@HZYndUW9&08kJ!+l{rwn>CelCot~Bpjp; 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 literal 0 HcmV?d00001 diff --git a/server/pbench/bin/vos/analysis/bin/sadf-62-64 b/server/pbench/bin/vos/analysis/bin/sadf-62-64 new file mode 100755 index 0000000000000000000000000000000000000000..d8be411397d272b77e56a9b56ce8d0955c951835 GIT binary patch literal 111184 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 literal 0 HcmV?d00001 diff --git a/server/pbench/bin/vos/analysis/bin/sadf-64-64 b/server/pbench/bin/vos/analysis/bin/sadf-64-64 new file mode 100755 index 0000000000000000000000000000000000000000..6fb41ed3f6500bb8cf0134e7170b41ea78c20105 GIT binary patch literal 111496 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

A$PM`?IX9HtO9Yq~28x_NVix-b+}m(X!Ua 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 literal 0 HcmV?d00001 diff --git a/server/pbench/bin/vos/analysis/bin/sadf-f23-64 b/server/pbench/bin/vos/analysis/bin/sadf-f23-64 new file mode 100755 index 0000000000000000000000000000000000000000..6017040fb2b58a1785a759fb0e9f0922ddc10811 GIT binary patch literal 178568 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 literal 0 HcmV?d00001 diff --git a/server/pbench/lib/mappings/sar.json b/server/pbench/lib/mappings/sar.json new file mode 100644 index 0000000000..84b7f5d7b4 --- /dev/null +++ b/server/pbench/lib/mappings/sar.json @@ -0,0 +1,300 @@ +{ + "sar": { + "_timestamp": { + "enabled": true, + "store": true, + "fielddata": { + "format": "doc_values" + } + }, + "properties": { + "_metadata": { + "properties": { + "file-date": { + "type": "date", + "format": "yyyy-MM-dd", + "fielddata": { + "format": "doc_values" + } + }, + "pbench_run_unique_id": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + }, + "pbench_run_md5": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + }, + "machine": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + }, + "nodename": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + }, + "number-of-cpus": { + "type": "integer", + "fielddata": { + "format": "doc_values" + } + }, + "release": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + }, + "sysdata-version": { + "type": "float", + "fielddata": { + "format": "doc_values" + } + }, + "sysname": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "timestamp": { + "properties": { + "date": { + "type": "date", + "format": "yyyy-MM-dd", + "fielddata": { + "format": "doc_values" + } + }, + "time": { + "type": "date", + "format": "HH:mm:ss", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "cpu-load": { + "type": "nested", + "properties": { + "cpu": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "cpu-load-all": { + "type": "nested", + "properties": { + "cpu": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "disk": { + "type": "nested", + "properties": { + "disk-device": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "interrupts": { + "type": "nested", + "properties": { + "intr": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "interrupts-processor": { + "type": "nested", + "properties": { + "intr": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + }, + "cpu": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "filesystems": { + "type": "nested", + "properties": { + "filesystem": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "network": { + "properties": { + "net-dev": { + "type": "nested", + "properties": { + "iface": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "net-edev": { + "type": "nested", + "properties": { + "iface": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + } + } + }, + "power-management": { + "properties": { + "cpu-frequency": { + "type": "nested", + "properties": { + "number": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "fan-speed": { + "type": "nested", + "properties": { + "device": { + "type": "string" + }, + "number": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "temperature": { + "type": "nested", + "properties": { + "device": { + "type": "string" + }, + "number": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "voltage-input": { + "type": "nested", + "properties": { + "device": { + "type": "string" + }, + "number": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + }, + "usb-devices": { + "type": "nested", + "properties": { + "bus_number": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + }, + "idvendor": { + "type": "string" + }, + "idprod": { + "type": "string" + }, + "manufact": { + "type": "string" + }, + "product": { + "type": "string" + } + } + } + } + }, + "serial": { + "type": "nested", + "properties": { + "line": { + "type": "string", + "index": "not_analyzed", + "fielddata": { + "format": "doc_values" + } + } + } + } + } + } +} diff --git a/server/pbench/lib/vos/analysis/lib/index_sar.py b/server/pbench/lib/vos/analysis/lib/index_sar.py new file mode 100755 index 0000000000..af7699f043 --- /dev/null +++ b/server/pbench/lib/vos/analysis/lib/index_sar.py @@ -0,0 +1,917 @@ +#!/usr/bin/env python3 + +from __future__ import print_function + +_DEBUG = 1 +_PROFILE = False + +# Version of this tool, ..-, where: +# +# major: systemic layout change to _metadata or other field structures, +# not backward compatible +# minor: backward compatible layout changes to names, etc. +# rev: completely compatible changes or additions made +# build: identifying build number, should not represent any changes +# +# Started at 1.0.0-0 since we initiated this after a trial period. +# +import os +import sys +import hashlib +import logging +import configparser +import json, collections +import lzma, contextlib +import time +import xml.parsers.expat +import mmap +from urllib3 import exceptions as ul_excs, Timeout +from elasticsearch import VERSION, Elasticsearch, helpers, exceptions as es_excs + +if _PROFILE: + import cProfile, cStringIO as StringIO, pstats + +try: + from logging import NullHandler +except ImportError: + class NullHandler(logging.Handler): + def handle(self, record): + pass + def emit(self, record): + pass + def createLock(self): + self.lock = None + +_VERSION_ = "1.1.2-0" +if VERSION < (1, 0, 0): + print("At least v1.0.0 of the ElasticSearch Python client is required," + " found %r" % (VERSION,), file=sys.stderr) + sys.exit(1) + +_read_timeout = 120 +timeoutobj = Timeout(total=1200, connect=10, read=_read_timeout) +# Silence logging messages from the elasticsearch client library +logging.getLogger('elasticsearch').addHandler(NullHandler()) +# to keep track of timestamp +DOCTYPE = 'sar' +_NAME_ = "index-sar" +TS_ALL = [] +_op_type = 'create' + + +def gen_action(index, rec, nodename, ts): + md5 = hashlib.md5((nodename + ts).encode('utf-8')) + TS_ALL.append(ts) + # ix_all.append(index) + action = { + "_op_type": _op_type, + "_index": index, + "_type": DOCTYPE, + "_id": md5.hexdigest(), + "_timestamp": ts, + "_source": rec + } + return action + + +def cvtnum(v): + """ + Convert a string value to an integer or a float. If the given value is + neither, return it quoted. + """ + try: + # Attempt to consider it an int first. + new_v = int(v) + except ValueError: + try: + # Then see if it could be considered a float. + new_v = float(v) + except ValueError: + # Otherwise, just return it as a quoted string. + new_v = v + else: + # ElasticSearch / Lucene have a max range for long types of + # [-9223372036854775808, 9223372036854775807], assumes 64-bit + # platforms! + if new_v > sys.maxsize: + new_v = sys.maxsize + elif new_v < -sys.maxsize: + new_v = -sys.maxsize + return new_v + +def tstos(ts=None): + return time.strftime("%Y-%m-%dT%H:%M:%S-%Z", time.localtime(ts)) + + +class SysStatParse(object): + """ + Parse sysstat XML generated data into discrete JSON documents, with + appropriate meta data applied for indexing in ElasticSearch. + + The operation of this code relies on the order in which elements are + written to the XML from the sadf utility, where the first few elements can + data that applies to all statistics, comments and restarts (machine name, + linux version, etc.). + + For the most part, all the element names and attributes translate over + one-to-one. There are a few exceptions: + + 1. int-proc data has no mapping in the more recent sysstat versions, + so a new key is used, "interrupts-processor" instead (note that + int-global already maps to "interrupts") + 2. the file-sz and inode-sz elements are renamed to file-nr and inode-nr + to match later output + 3. the net-device element is not carried over + 4. the rxbyt and txbyt net-dev values are renamed to rxkB and txkB, and + their values devided by 1,024 to match + + No attempt is made to map older element or attribute names into their more + recent forms, e.g. + + * "processes" and "context-switch" combined into the newer + "process-and-context-switch" element + + @pbench_run_md5: This md5 corresponds to the pbench-run._metadata.md5 + @pbench_run_unique_id: This is a path that represents the unique location + of that SAR data being indexed. + """ + _valid_states = set(( + 'START', 'sysstat', 'host', 'statistics', 'timestamp', 'cpu-load', + 'cpu-load-all', 'io', 'memory', 'hugepages', 'kernel', 'serial', + 'power-management', 'disk', 'network', 'interrupts', 'int-global', + 'int-proc', 'filesystems','cpu-frequency', 'fan-speed', 'comments', + 'voltage-input', 'temperature', 'usb-devices', 'restarts')) + + _int_name_map = { 'int-global': 'interrupts', + 'int-proc': 'interrupts-processor' } + + def __init__(self, fname, target_nodename, es, unique_id, md5, + idx_prefix, blk_action_count): + if _DEBUG > 9: + import pdb; pdb.set_trace() + + # Input filename being considered + self.fname = fname + # set references to a pbench run + self.target_nodename = target_nodename + self.pbench_run_md5 = md5 + self.pbench_run_unique_id = unique_id + self.es = es + self.INDEX_PREFIX = idx_prefix + self.BULK_ACTION_COUNT = blk_action_count + # XML element parsing state and the stack that helps us transitions + # between states; see _valid_states above + self.state = 'START' + self.stack = [] + + # Saved key/value pairs being assembled into a new dictionary, + # currently used to merge "processes" and "context-switch" element + # dictionaries into the one "process-and-context-switch" dictionary. + self.saved = {} + + # Used when in the context of an element who's character data values + # are destined for normal statistics data. + self.curr_element = None + # Used when in the context of an element who's character data values + # are destined for metadata. + self.curr_meta_element = None + + # Metadata dictionary to accumulate top level element values and + # attributes that should be applied as metadata to all statistics, + # comments, and restarts. + self.metadata = {} + + # Dictionary or list representing the current element's context as its + # being processed. + self.curr_element_dict = None + self.curr_element_dict_stack = [] + + # Buffer for accumulating data between elements (all accumulated data + # is stripped of whitespace when the end element is encountered). The + # data stack allows us to accumulate data between elements, pushing a + # new buffer when we encounter a new element start before the previous + # one ends. + self.data_buf = '' + self.data_stack = [] + + # State for handling net-dev and net-edev elements + self.net_devs = [] + self.net_edevs = [] + self.net_device_iface = None + + # For each "host" element encountered, this is the nodename attribute + # value from that element. + self.nodename = '' + + # Accumulated list of ElasticSearch "actions" for bulk indexing + self.actions = [] + + # ElasticSerach indexing counts + self.totals = collections.defaultdict(int) + self.successes = 0 + self.duplicates = 0 + self.errors = 0 + self.exceptions = 0 + + def _error(self, msg, *args): + print(msg % args, file=sys.stderr) + if _DEBUG > 8: + import pdb; pdb.set_trace() + print(repr(self.stack)) + + def _warn(self, msg, *args): + print(msg % args, file=sys.stderr) + if _DEBUG > 9: + import pdb; pdb.set_trace() + print(repr(self.stack)) + + def _dump_actions(self): + for act in self.actions: + print(json.dumps(act, indent=4, sort_keys=True)) + # If we are dumping the actions out, we are consuming them + del self.actions[0:len(self.actions)] + + def _push(self, state=None, noindent=False): + self.stack.append((self.state, self.saved)) + self.state = state if state is not None else self.state + self.saved = {} + + def _pop(self): + self.state, self.saved = self.stack.pop() + + def _push_dict(self, obj, name=None): + self.curr_element_dict_stack.append(self.curr_element_dict) + self.curr_element_dict = obj + if _DEBUG > 8: + print(name, "pushed", self.curr_element_dict, self.curr_element_dict_stack) + + def _pop_dict(self, name=None): + if _DEBUG > 8: + if len(self.curr_element_dict_stack) == 0: + import pdb; pdb.set_trace() + print(name, "popping", self.curr_element_dict, self.curr_element_dict_stack) + else: + assert len(self.curr_element_dict_stack) > 0 + + ced = self.curr_element_dict + assert ced is not None + + self.curr_element_dict = self.curr_element_dict_stack.pop() + if isinstance(self.curr_element_dict, list): + self.curr_element_dict.append(ced) + else: + if _DEBUG > 8: + if name is None or self.curr_element_dict is None: + import pdb; pdb.set_trace() + else: + assert name is not None + self.curr_element_dict[name] = ced + + def _normalize_attrs(self, attrs): + new_attrs = {} + for k, v in attrs.items(): + if k == "per" and v == "second": + continue + new_attrs[k] = cvtnum(v) + return new_attrs + + def _create_record(self, name, attrs): + assert name in ('comment', 'boot', 'timestamp') + timestamp_d = {} + name_val = None + for k, v in attrs.items(): + if k in ('date', 'time', 'utc', 'interval'): + timestamp_d[k] = cvtnum(v) + else: + assert k != 'com' or name_val is None + name_val = cvtnum(v) + if not name_val: + if name == 'boot': + name_val = "recorded" + assert timestamp_d + record = { 'timestamp': timestamp_d } + if name != 'timestamp': + record[name] = name_val + return record + + def _metadata_element(self, name, attrs): + if not attrs: + assert name, "Expected an element name, not: %r" % name + # Remember this element name, and wait for possible + # character data + self.curr_meta_element = name + else: + for k, v in attrs.items(): + if k == "per" and v == "second": + continue + self.metadata[k] = cvtnum(v) + + def _register_action(self, name): + #assert self.curr_element_dict is not None + if self.curr_element_dict is None: + if _DEBUG > 8: + import pdb; pdb.set_trace() + print("bad state: _register_action() called with no action", + file=sys.stderr) + self.exceptions += 1 + return + #assert len(self.curr_element_dict_stack) == 0 + if len(self.curr_element_dict_stack) > 0: + if _DEBUG > 8: + import pdb; pdb.set_trace() + print("bad state: _register_action() called with a non-empty stack", + file=sys.stderr) + self.exceptions += 1 + return + + record = self.curr_element_dict + self.curr_element_dict = None + self.metadata["generated-by"] = _NAME_ + self.metadata["generated-by-version"] = _VERSION_ + self.metadata["pbench_run_md5"] = self.pbench_run_md5 + self.metadata["pbench_run_unique_id"] = self.pbench_run_unique_id + record['_metadata'] = self.metadata + try: + timestamp = record['timestamp'] + ts = timestamp['date'] + 'T' + timestamp['time'] + except KeyError: + print("Seems to be an invalid sar XML file, where a" + " '%s' element does not have date and time" + " attributes" % name, file=sys.stderr) + if _DEBUG > 8: + import pdb; pdb.set_trace() + self.exceptons += 1 + return + else: + index = "%s.sar-%s" % (self.INDEX_PREFIX, timestamp['date']) + self.actions.append(gen_action(index, record, self.nodename, ts)) + + self.totals['records'] += 1 + self.totals[self.state] += 1 + + if len(self.actions) >= self.BULK_ACTION_COUNT: + self._bulk_upload() + + def _bulk_upload(self): + if _DEBUG > 1: + self._dump_actions() + if len(self.actions) == 0: + return + + beg, end = time.time(), None + start = beg + if _DEBUG > 0: + print("\tbulk index (beg ts: %s) ..." % tstos(beg)) + sys.stdout.flush() + delay = _read_timeout + tries = 20 + try: + while True: + try: + res = helpers.bulk(self.es, self.actions) + except es_excs.ConnectionError as err: + end = time.time() + if isinstance(err.info, ul_excs.ReadTimeoutError): + tries -= 1 + if tries > 0: + print("\t\tWARNING (end ts: %s, duration: %.2fs):" + " read timeout, delaying %d seconds before" + " retrying (%d attempts remaining)..." % ( + tstos(end), end - beg, delay, tries), + file=sys.stderr) + time.sleep(delay) + delay *= 2 + beg, end = time.time(), None + print("\t\tWARNING (beg ts: %s): retrying..." % ( + tstos(beg)), file=sys.stderr) + continue + if _DEBUG > 8: + import pdb; pdb.set_trace() + print("\tERROR (end ts: %s, duration: %.2fs): %s" % ( + tstos(end), end - start, err), file=sys.stderr) + self.exceptions += 1 + except Exception as err: + end = time.time() + if _DEBUG > 8: + import pdb; pdb.set_trace() + # print("\tERROR (end ts: %s, duration: %.2fs): %s" % ( + # tstos(end), end - start, err), file=sys.stderr) + self.exceptions += 1 + else: + end = time.time() + lcl_successes = res[0] + self.successes += lcl_successes + lcl_duplicates = 0 + lcl_errors = 0 + len_res1 = len(res[1]) + for idx, ires in enumerate(res[1]): + sts = ires[_op_type]['status'] + if sts not in (200, 201): + if _op_type == 'create' and sts == 409: + self.duplicates += 1 + lcl_duplicates += 1 + else: + print("\t\tERRORS (%d of %d): %r" % ( + idx, len_res1, ires[_op_type]['error']), + file=sys.stderr) + self.errors += 1 + lcl_errors += 1 + else: + self.successes += 1 + lcl_successes += 1 + if _DEBUG > 0 or lcl_errors > 0: + print("\tdone (end ts: %s, duration: %.2fs," + " success: %d, duplicates: %d, errors: %d)" % ( + tstos(end), end - start, lcl_successes, + lcl_duplicates, lcl_errors)) + sys.stdout.flush() + break + finally: + del self.actions[0:len(self.actions)] + + def start_element(self, name, attrs): + assert self.state in self._valid_states + assert not (self.curr_element is not None and self.curr_meta_element is not None) + self.data_stack.append(self.data_buf.strip()) + self.data_buf = '' + + if self.state == 'int-global': + if name == 'irq': + if attrs['value'] != "0.00": + self.curr_element_dict.append(self._normalize_attrs(attrs)) + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state == 'int-proc': + if name == 'irqcpu': + if attrs['value'] != "0.00": + self.curr_element_dict.append(self._normalize_attrs(attrs)) + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state == 'interrupts': + if name == 'int-global': + self._push(state=name) + self._push_dict([]) + elif name == 'int-proc': + self._push(state=name) + self._push_dict([]) + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state in ('cpu-load', 'cpu-load-all'): + if name == 'cpu': + try: + attrs['cpu'] = attrs['number'] + except KeyError: + pass + else: + del attrs['number'] + self.curr_element_dict.append(self._normalize_attrs(attrs)) + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state == 'disk': + if name == 'disk-device': + try: + attrs['disk-device'] = attrs['dev'] + except KeyError: + pass + else: + del attrs['dev'] + self.curr_element_dict.append(self._normalize_attrs(attrs)) + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state in ('cpu-frequency', 'fan-speed', 'temperature', + 'voltage-input', 'usb-devices', 'filesystems'): + if self.state == 'filesystems': + try: + attrs['filesystem'] = attrs['fsname'] + except KeyError: + pass + else: + del attrs['fsname'] + self.curr_element_dict.append(self._normalize_attrs(attrs)) + elif self.state == 'network': + if name == 'net-dev': + if self.net_device_iface is not None: + attrs['iface'] = self.net_device_iface + self.net_devs.append(self._normalize_attrs(attrs)) + elif name == 'net-edev': + if self.net_device_iface is not None: + attrs['iface'] = self.net_device_iface + self.net_edevs.append(self._normalize_attrs(attrs)) + elif name == 'net-device': + self.net_device_iface = attrs['iface'] + else: + self.curr_element_dict[name] = self._normalize_attrs(attrs) + elif self.state in ('io', 'memory', 'kernel', 'hugepages'): + if not attrs: + assert name, "Expected an element name, not: %r" % name + # Remember this element name, and wait for possible + # character data + self.curr_element = name + else: + self.curr_element_dict[name] = self._normalize_attrs(attrs) + elif self.state == 'serial': + if name == 'tty': + self.curr_element_dict.append(self._normalize_attrs(attrs)) + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state == 'power-management': + if name in ('cpu-frequency', 'fan-speed', 'temperature', + 'voltage-input', 'usb-devices'): + self._push(state=name) + self._push_dict([]) + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state == 'timestamp': + if name in ('cpu-load-all', 'cpu-load', 'disk', 'serial', 'filesystems'): + self._push(state=name) + self._push_dict([]) + elif name == 'interrupts': + self._push(state=name, noindent=True) + elif name in ('io', 'memory', 'network', 'hugepages', 'power-management'): + self._push(state=name) + self._push_dict({}) + if self.state == 'network': + self.net_devs = [] + self.net_edevs = [] + elif name == 'kernel': + try: + del attrs['per'] + except KeyError: + pass + if attrs: + # Starting with sysstat 10.1.x (maybe earlier) kernel has + # attributes on element + self._push_dict(self._normalize_attrs(attrs)) + else: + # Pre sysstat 10.1.x kernel has sub elements with attributes + self._push(state=name) + self._push_dict({}) + elif name in ('process-and-context-switch', 'swap-pages', 'paging', 'queue'): + self._push_dict(self._normalize_attrs(attrs)) + elif name in ('processes', 'context-switch'): + self.saved[name] = attrs + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state == 'statistics': + if name == 'timestamp': + self._push(state='timestamp') + assert self.curr_element_dict == None + assert len(self.curr_element_dict_stack) == 0 + self.curr_element_dict = self._create_record(name, attrs) + else: + self._error("Ignoring element: %s, attrs: %r", name, attrs) + elif self.state == 'restarts': + if name == 'boot': + assert self.curr_element_dict == None + assert len(self.curr_element_dict_stack) == 0 + self.curr_element_dict = self._create_record(name, attrs) + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state == 'comments': + if name == 'comment': + assert self.curr_element_dict == None + assert len(self.curr_element_dict_stack) == 0 + self.curr_element_dict = self._create_record(name, attrs) + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state == 'host': + if name in ('statistics', 'restarts', 'comments'): + self._push(state=name, noindent=True) + elif name in ('sysname', 'release', 'machine', 'number-of-cpus', 'file-date', 'file-utc-time'): + self._metadata_element(name, attrs) + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state == 'sysstat': + if name == 'host': + self._push(state='host', noindent=True) + self._metadata_element(name, attrs) + try: + self.nodename = self.metadata['nodename'] + except KeyError: + print("Seems to be an invalid sar XML file," + " where the host element does not" + " have a nodename attribute", file=sys.stderr) + raise + else: + if self.nodename != self.target_nodename: + raise Exception("Unexpected nodename, %s, expected: %s" % (self.nodename, self.target_nodename)) + elif name in ('sysdata-version'): + self._metadata_element(name, attrs) + else: + self._error("Ignoring start for element: %s, attrs: %r", name, attrs) + elif self.state == 'START': + if name == 'sysstat': + self._push(state='sysstat', noindent=True) + else: + self._warn("Ignoring element: %s, attrs: %r", name, attrs) + else: + self._error("Unexpected state: %s", self.state) + + def end_element(self, name): + assert self.state in self._valid_states + assert not (self.curr_element is not None and self.curr_meta_element is not None) + + data_buf = self.data_buf.strip() + self.data_buf = self.data_stack.pop() + + if self.curr_element is not None: + if self.curr_element != name: + if data_buf != '': + # Encountered the end of another element, when expecting something else + if _DEBUG > 8: + import pdb; pdb.set_trace() + pass + else: + # Quietly swallow other empty elements that don't match this one + pass + return + if data_buf: + if self.curr_element_dict is None: + import pdb; pdb.set_trace() + self.curr_element_dict[name] = cvtnum(data_buf) + else: + if _DEBUG > 8: + import pdb; pdb.set_trace() + pass + else: + # Not debugging, ignore whitespace only element values + pass + self.curr_element = None + elif self.curr_meta_element is not None: + if self.curr_meta_element != name: + if data_buf != '': + # Encountered the end of another element, when expecting something else + if _DEBUG > 8: + import pdb; pdb.set_trace() + pass + else: + # Quietly swallow other empty elements that don't match this one + pass + return + if data_buf: + self.metadata[name] = cvtnum(data_buf) + else: + if _DEBUG > 8: + import pdb; pdb.set_trace() + pass + else: + # Not debugging, ignore whitespace only values elements + pass + self.curr_meta_element = None + else: + # Nothing to do for this ending element. + assert data_buf == '' + + if self.state in ('int-global', 'int-proc'): + if name == self.state: + self._pop_dict(self._int_name_map[name]) + self._pop() + elif self.state in ('cpu-load', 'cpu-load-all'): + if name == self.state: + self._pop_dict(name) + if name == 'cpu-load-all': + # Synthesize a cpu-load entry from a cpu-load-all: + cpu_load = [] + for clad in self.curr_element_dict[name]: + cld = { + 'cpu': clad['cpu'], + 'idle': clad['idle'], + 'iowait': clad['iowait'], + 'nice': clad['nice'], + 'steal': clad['steal'], + 'system': clad['sys'] + clad['irq'] + clad['soft'], + 'user': clad['usr'] + clad['guest'] + } + try: + # with sysstat 10.1.6 and later we might have + # gnice values, which roll up into + # cpu-load.cpu.nice. + cld['nice'] += clad['gnice'] + except KeyError: + pass + cpu_load.append(cld) + self.curr_element_dict['cpu-load'] = cpu_load + self._pop() + elif self.state in ('serial', 'disk', 'cpu-frequency', 'fan-speed', + 'temperature', 'voltage-input', 'usb-devices', + 'filesystems'): + if name == self.state: + self._pop_dict(name) + self._pop() + elif self.state == 'interrupts': + if name == self.state: + self._pop() + elif self.state == 'network': + if name == self.state: + if self.net_devs: + assert self.curr_element_dict is not None + if 'rxbyt' in self.net_devs[0]: + for nd in self.net_devs: + try: + nd['rxkB'] = nd['rxbyt'] / 1024 + nd['txkB'] = nd['txbyt'] / 1024 + except KeyError: + pass + else: + del nd['rxbyt'] + del nd['txbyt'] + self.curr_element_dict['net-dev'] = self.net_devs + self.net_devs = [] + if self.net_edevs: + assert self.curr_element_dict is not None + self.curr_element_dict['net-edev'] = self.net_edevs + self.net_edevs = [] + if self.net_device_iface is not None: + self.net_device_iface = None + self._pop_dict(name) + self._pop() + elif self.state in ('io', 'memory', 'kernel', 'hugepages', 'power-management'): + if name == self.state: + if name == 'kernel': + # Make sysstat-7.x like sysstat-9.x and later + try: + self.curr_element_dict['file-nr'] = self.curr_element_dict['file-sz'] + except KeyError: + pass + else: + del self.curr_element_dict['file-sz'] + try: + self.curr_element_dict['inode-nr'] = self.curr_element_dict['inode-sz'] + except KeyError: + pass + else: + del self.curr_element_dict['inode-sz'] + self._pop_dict(name) + self._pop() + elif self.state == 'timestamp': + if name == self.state: + try: + pattrs = self.saved['processes'] + except KeyError: + combined_attrs = {} + else: + combined_attrs = pattrs + try: + cattrs = self.saved['context-switch'] + except KeyError: + pass + else: + combined_attrs.update(cattrs) + if combined_attrs: + self.curr_element_dict['process-and-context-switch'] = self._normalize_attrs(combined_attrs) + self._pop() + self._register_action(name) + elif name not in ('processes', 'context-switch'): + self._pop_dict(name) + elif self.state == 'statistics': + if name == self.state: + self._pop() + elif self.state in ('restarts', 'comments'): + if name == self.state: + self._pop() + else: + self._register_action(name) + elif self.state == 'host': + # Add any other elements we find, just add + if name == 'host': + self._pop() + elif self.state == 'sysstat': + if name == 'sysstat': + self._pop() + else: + self._error("Unexpected state: %s", self.state) + + def char_data(self, data): + # Simply accumulate all the data given. This method may be called more + # than once between start_element and end_element invocations. + self.data_buf += data + + +def process_fp(fp, p, sparse): + + if _PROFILE: + pr = cProfile.Profile() + pr.enable() + beg = time.time() + try: + p.ParseFile(fp) + except xml.parsers.expat.ExpatError as err: + print("Bad XML: %r" % err, file=sys.stderr) + sparse.exceptions += 1 + # Bulk upload the remainder + sparse._bulk_upload() + end = time.time() + if _PROFILE: + pr.disable() + s = StringIO.StringIO() + sortby = 'cumulative' + ps = pstats.Stats(pr, stream=s).sort_stats(sortby) + ps.print_stats() + print(s.getvalue()) + sys.stdout.flush() + return beg, end + +def call_indexer(file_path=None, _nodename=None, TS_ALL=TS_ALL, + _index_name='', cfg_name=None, run_unique_id=None, + run_md5=None): + if file_path == '-': + fname = '-' + else: + try: + fname = os.path.abspath(file_path) + except IndexError: + print("We need a XML file to process", file=sys.stderr) + sys.exit(1) + else: + # FIXME: This is a bit simplistic + bname = os.path.basename(fname) + if not bname.endswith(('.xml', '.xml.xz')): + print("Are you sure this is an XML file? (%s)" % fname, + file=sys.stderr) + sys.exit(1) + + try: + target_nodename = _nodename.strip() + except IndexError: + print("We need a target nodename to use verifying the XML", file=sys.stderr) + sys.exit(1) + + try: + indexname = _index_name.strip() + except IndexError: + indexname = '' + + # cfg_name = "/etc/pbench-index.cfg" + if cfg_name is None: + print("cfg_name was not supplied. Reading path from VOS_CONFIG_PATH") + cfg_name = os.environ.get('VOS_CONFIG_PATH') + if cfg_name is None: + print("Need VOS_CONFIG_PATH environment variable defined", + file=sys.stderr) + sys.exit(1) + + config = configparser.ConfigParser() + config.read(cfg_name) + + try: + URL = config.get('Server', 'server') + except configparser.NoSectionError: + print("Need a [Server] section with host and port defined in %s" + " configuration file" % cfg_name, file=sys.stderr) + sys.exit(1) + except configparser.NoOptionError: + host = config.get('Server', 'host') + port = config.get('Server', 'port') + else: + host, port = URL.rsplit(':', 1) + hosts = [dict(host=host, port=port, timeout=timeoutobj),] + es = Elasticsearch(hosts, max_retries=0) + + INDEX_PREFIX = config.get('Settings', 'index_prefix') + if indexname: + INDEX_PREFIX += '.%s' % indexname + BULK_ACTION_COUNT = int(config.get('Settings', 'bulk_action_count')) + + # Setup XML element parser + sparse = SysStatParse(fname, target_nodename, es, run_unique_id, + run_md5, INDEX_PREFIX, BULK_ACTION_COUNT) + # Setup XML parser to use our element callback parser + p = xml.parsers.expat.ParserCreate() + p.StartElementHandler = sparse.start_element + p.EndElementHandler = sparse.end_element + p.CharacterDataHandler = sparse.char_data + + if _DEBUG > 0: + print("parsing %s..." % (fname if fname != '-' else '',)) + sys.stdout.flush() + + if fname == '-': + beg, end = process_fp(sys.stdin.buffer, p, sparse) + else: + try: + inf = lzma.LZMAFile(fname, "rb") + with contextlib.closing(inf): + beg, end = process_fp(inf, p, sparse) + except (IOError, lzma.LZMAError): + with open(fname, "r+b") as inf: + mm = mmap.mmap(inf.fileno(), 0) + beg, end = process_fp(mm, p, sparse) + + TS_ALL = sorted(TS_ALL) + + + if _DEBUG > 0: + print("grafana_range_begin %s" % (TS_ALL[0])) + print("grafana_range_end %s" % (TS_ALL[-1])) + print("...parsed %s (%.03f secs)" % + (fname if fname != '-' else '', + end - beg)) + sys.stdout.flush() + + if sparse.exceptions + sparse.errors > 0: + print("ERROR(%s) errors encountered during indexing" % ( + _NAME_,), file=sys.stderr) + if sparse.successes + sparse.duplicates == 0: + # Only return a total failure if no records were actually indexed + # successfully + sys.exit(1)