Hello community, here is the log from the commit of package hanadb_exporter for openSUSE:Factory checked in at 2019-12-14 12:19:01 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Comparing /work/SRC/openSUSE:Factory/hanadb_exporter (Old) and /work/SRC/openSUSE:Factory/.hanadb_exporter.new.4691 (New) ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Package is "hanadb_exporter" Sat Dec 14 12:19:01 2019 rev:7 rq:756852 version:0.6.0 Changes: -------- --- /work/SRC/openSUSE:Factory/hanadb_exporter/hanadb_exporter.changes 2019-12-11 12:13:57.964531091 +0100 +++ /work/SRC/openSUSE:Factory/.hanadb_exporter.new.4691/hanadb_exporter.changes 2019-12-14 12:23:36.763197206 +0100 @@ -1,0 +2,6 @@ +Tue Dec 10 11:18:30 UTC 2019 - Xabier Arbulu <xarb...@suse.com> + +- Version 0.6.0 Change configuration files location from /etc +to /usr/etc + +------------------------------------------------------------------- Old: ---- hanadb_exporter-0.5.3.tar.gz New: ---- hanadb_exporter-0.6.0.tar.gz ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ hanadb_exporter.spec ++++++ --- /var/tmp/diff_new_pack.uuuLrk/_old 2019-12-14 12:23:37.143197149 +0100 +++ /var/tmp/diff_new_pack.uuuLrk/_new 2019-12-14 12:23:37.143197149 +0100 @@ -20,13 +20,12 @@ %bcond_without test %endif -# Compat macro for new _fillupdir macro introduced in Nov 2017 -%if ! %{defined _fillupdir} - %define _fillupdir /var/adm/fillup-templates -%endif +%define _prefix /usr +%define oldsyscondir /etc +%define _sysconfdir %{_prefix}/etc Name: hanadb_exporter -Version: 0.5.3 +Version: 0.6.0 Release: 0 Summary: SAP HANA database metrics exporter License: Apache-2.0 @@ -61,21 +60,16 @@ rm -r %{buildroot}%{python3_sitelib}/tests # Add daemon files +mkdir -p %{buildroot}%{oldsyscondir}/hanadb_exporter mkdir -p %{buildroot}%{_sysconfdir}/hanadb_exporter install -D -m 644 daemon/hanadb_exporter@.service %{buildroot}%{_unitdir}/hanadb_exporter@.service -mkdir -p %{buildroot}%{_fillupdir} -mkdir -p %{buildroot}%{_sysconfdir}/sysconfig -install -D -m 0644 daemon/hanadb_exporter.sysconfig %{buildroot}%{_fillupdir}/sysconfig.hanadb_exporter install -D -m 0644 config.json.example %{buildroot}%{_docdir}/hanadb_exporter/config.json.example install -D -m 0644 metrics.json %{buildroot}%{_docdir}/hanadb_exporter/metrics.json install -D -m 0644 logging_config.ini %{buildroot}%{_docdir}/hanadb_exporter/logging_config.ini %post %service_add_post hanadb_exporter@.service -if [ ! -e %{_sysconfdir}/sysconfig/hanadb_exporter ]; then - %fillup_only hanadb_exporter -fi rm -rf %{_sysconfdir}/hanadb_exporter/* ln -s %{_docdir}/hanadb_exporter/config.json.example %{_sysconfdir}/hanadb_exporter/config.json.example ln -s %{_docdir}/hanadb_exporter/metrics.json %{_sysconfdir}/hanadb_exporter/metrics.json @@ -96,6 +90,7 @@ %endif %files +%defattr(-,root,root,-) %if 0%{?sle_version:1} && 0%{?sle_version} < 120300 %doc README.md docs/METRICS.md LICENSE %else @@ -105,11 +100,12 @@ %{python3_sitelib}/* %{_bindir}/hanadb_exporter +%dir %{_sysconfdir} +%dir %{oldsyscondir}/hanadb_exporter %dir %{_sysconfdir}/hanadb_exporter %{_docdir}/hanadb_exporter/config.json.example %{_docdir}/hanadb_exporter/metrics.json %{_docdir}/hanadb_exporter/logging_config.ini -%{_fillupdir}/sysconfig.hanadb_exporter %{_unitdir}/hanadb_exporter@.service %changelog ++++++ hanadb_exporter-0.5.3.tar.gz -> hanadb_exporter-0.6.0.tar.gz ++++++ diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hanadb_exporter-0.5.3/README.md new/hanadb_exporter-0.6.0/README.md --- old/hanadb_exporter-0.5.3/README.md 2019-12-10 12:20:40.946509434 +0100 +++ new/hanadb_exporter-0.6.0/README.md 2019-12-13 10:04:45.859565696 +0100 @@ -108,6 +108,11 @@ python3 hanadb_exporter/main.py -c config.json -m metrics.json ``` +If a `config.json` configuration file is stored in `/etc/hanadb_exporter` the exporter can be started with the next command too: +``` +hanadb_exporter --identifier config # Notice that the identifier matches with the config file without extension +``` + ### Running as a daemon The hanadb_exporter can be executed using `systemd`. For that, the best option is to install the project using a rpm package. This can be done following the next steps (this example is for tumbleweed): @@ -124,12 +129,11 @@ Even using this way, the SAP HANA database connector package must be installed independently (see [Installation](#installation)). After that we need to create the configuration file as `/etc/hanadb_exporter/my-exporter.json` (the name is relevant as we will use it to start the daemon). -The [config.json.example](./config.json.example) can be used as example (the example file is -stored in `/etc/hanadb_exporter` folder too). +The [config.json.example](./config.json.example) can be used as example (the example file is stored in `/usr/etc/hanadb_exporter` folder too). -The default [metrics file](./metrics.json) is stored in `/etc/hanadb_exporter/metrics.json`. +The default [metrics file](./metrics.json) is stored in `/usr/etc/hanadb_exporter/metrics.json`. If a new `metrics.json` is stored in `/etc/hanadb_exporter` this will be used. -The logging configuration file can be updated as well to customize it (stored in `/etc/hanadb_exporter/logging_config.ini`) +The logging configuration file can be updated as well to customize changing the new configuration file `logging.config_file` entry (default one available in `/usr/etc/hanadb_exporter/logging_config.ini`). Now, the exporter can be started as a daemon. As we can have multiple `hanadb_exporter` instances running in one machine, the service is created using a template file, so an extra information must be given to `systemd` (this is done adding the `@` keyword after the service name together with the name of the configuration file created previously in `/etc/hanadb_exporter/{name}.json`): ``` diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hanadb_exporter-0.5.3/daemon/hanadb_exporter.sysconfig new/hanadb_exporter-0.6.0/daemon/hanadb_exporter.sysconfig --- old/hanadb_exporter-0.5.3/daemon/hanadb_exporter.sysconfig 2019-12-10 12:20:40.946509434 +0100 +++ new/hanadb_exporter-0.6.0/daemon/hanadb_exporter.sysconfig 1970-01-01 01:00:00.000000000 +0100 @@ -1,3 +0,0 @@ -# hanadb_exporter daemon configuration file -# Exported metrics configuration file path -METRICS_FILE=/etc/hanadb_exporter/metrics.json diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hanadb_exporter-0.5.3/daemon/hanadb_exporter@.service new/hanadb_exporter-0.6.0/daemon/hanadb_exporter@.service --- old/hanadb_exporter-0.5.3/daemon/hanadb_exporter@.service 2019-12-10 12:20:40.946509434 +0100 +++ new/hanadb_exporter-0.6.0/daemon/hanadb_exporter@.service 2019-12-13 10:04:45.859565696 +0100 @@ -4,8 +4,7 @@ [Service] Type=simple -EnvironmentFile=/etc/sysconfig/hanadb_exporter -ExecStart=/usr/bin/hanadb_exporter -c /etc/hanadb_exporter/%i.json -m $METRICS_FILE +ExecStart=/usr/bin/hanadb_exporter --identifier %i [Install] WantedBy=multi-user.target diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hanadb_exporter-0.5.3/docs/README.md new/hanadb_exporter-0.6.0/docs/README.md --- old/hanadb_exporter-0.5.3/docs/README.md 2019-12-10 12:20:40.946509434 +0100 +++ new/hanadb_exporter-0.6.0/docs/README.md 1970-01-01 01:00:00.000000000 +0100 @@ -1,2 +0,0 @@ -# docs -Use this folder to store all the documentation files diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hanadb_exporter-0.5.3/hanadb_exporter/__init__.py new/hanadb_exporter-0.6.0/hanadb_exporter/__init__.py --- old/hanadb_exporter-0.5.3/hanadb_exporter/__init__.py 2019-12-10 12:20:40.946509434 +0100 +++ new/hanadb_exporter-0.6.0/hanadb_exporter/__init__.py 2019-12-13 10:04:45.859565696 +0100 @@ -8,4 +8,4 @@ :since: 2019-05-09 """ -__version__ = "0.5.3" +__version__ = "0.6.0" diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hanadb_exporter-0.5.3/hanadb_exporter/main.py new/hanadb_exporter-0.6.0/hanadb_exporter/main.py --- old/hanadb_exporter-0.5.3/hanadb_exporter/main.py 2019-12-10 12:20:40.946509434 +0100 +++ new/hanadb_exporter-0.6.0/hanadb_exporter/main.py 2019-12-13 10:04:45.859565696 +0100 @@ -9,6 +9,7 @@ """ import sys +import os import traceback import logging from logging.config import fileConfig @@ -23,7 +24,11 @@ from hanadb_exporter import db_manager LOGGER = logging.getLogger(__name__) - +CONFIG_FOLDER = '/etc/hanadb_exporter' +METRICS_FILES = [ + '/etc/hanadb_exporter/metrics.json', + '/usr/etc/hanadb_exporter/metrics.json' +] def parse_config(config_file): """ @@ -40,9 +45,11 @@ """ parser = argparse.ArgumentParser() parser.add_argument( - "-c", "--config", help="Path to hanadb_exporter configuration file", required=True) + "-c", "--config", help="Path to hanadb_exporter configuration file") + parser.add_argument( + "-m", "--metrics", help="Path to hanadb_exporter metrics file") parser.add_argument( - "-m", "--metrics", help="Path to hanadb_exporter metrics file", required=True) + "--identifier", help="Identifier of the configuration file from /etc/hanadb_exporter") parser.add_argument( "-v", "--verbosity", help="Python logging level. Options: DEBUG, INFO, WARN, ERROR (INFO by default)") @@ -72,20 +79,39 @@ sys.excepthook = handle_exception +def find_metrics_file(): + """ + Find metrics predefined files in default locations + """ + for metric_file in METRICS_FILES: + if os.path.isfile(metric_file): + return metric_file + raise ValueError( + 'metrics file does not exist in {}'.format(",".join(METRICS_FILES))) + + # Start up the server to expose the metrics. def run(): """ Main execution """ args = parse_arguments() - config = parse_config(args.config) + if args.config is not None: + config = parse_config(args.config) + elif args.identifier is not None: + config = parse_config('{}/{}.json'.format(CONFIG_FOLDER, args.identifier)) + else: + raise ValueError('configuration file or identifier must be used') if config.get('logging', None): setup_logging(config) else: logging.basicConfig(level=args.verbosity or logging.INFO) - metrics = args.metrics + if args.metrics: + metrics = args.metrics + else: + metrics = find_metrics_file() try: hana_config = config['hana'] diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hanadb_exporter-0.5.3/hanadb_exporter.changes new/hanadb_exporter-0.6.0/hanadb_exporter.changes --- old/hanadb_exporter-0.5.3/hanadb_exporter.changes 2019-12-10 12:20:40.950507434 +0100 +++ new/hanadb_exporter-0.6.0/hanadb_exporter.changes 2019-12-13 10:04:45.859565696 +0100 @@ -1,4 +1,10 @@ ------------------------------------------------------------------- +Tue Dec 10 11:18:30 UTC 2019 - Xabier Arbulu <xarb...@suse.com> + +- Version 0.6.0 Change configuration files location from /etc +to /usr/etc + +------------------------------------------------------------------- Tue Dec 10 09:17:42 UTC 2019 - Xabier Arbulu <xarb...@suse.com> - Version 0.5.3 Improve metrics collection if some of the rows diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hanadb_exporter-0.5.3/hanadb_exporter.spec new/hanadb_exporter-0.6.0/hanadb_exporter.spec --- old/hanadb_exporter-0.5.3/hanadb_exporter.spec 2019-12-10 12:20:40.950507434 +0100 +++ new/hanadb_exporter-0.6.0/hanadb_exporter.spec 2019-12-13 10:04:45.859565696 +0100 @@ -20,13 +20,12 @@ %bcond_without test %endif -# Compat macro for new _fillupdir macro introduced in Nov 2017 -%if ! %{defined _fillupdir} - %define _fillupdir /var/adm/fillup-templates -%endif +%define _prefix /usr +%define oldsyscondir /etc +%define _sysconfdir %{_prefix}/etc Name: hanadb_exporter -Version: 0.5.3 +Version: 0.6.0 Release: 0 Summary: SAP HANA database metrics exporter License: Apache-2.0 @@ -61,21 +60,16 @@ rm -r %{buildroot}%{python3_sitelib}/tests # Add daemon files +mkdir -p %{buildroot}%{oldsyscondir}/hanadb_exporter mkdir -p %{buildroot}%{_sysconfdir}/hanadb_exporter install -D -m 644 daemon/hanadb_exporter@.service %{buildroot}%{_unitdir}/hanadb_exporter@.service -mkdir -p %{buildroot}%{_fillupdir} -mkdir -p %{buildroot}%{_sysconfdir}/sysconfig -install -D -m 0644 daemon/hanadb_exporter.sysconfig %{buildroot}%{_fillupdir}/sysconfig.hanadb_exporter install -D -m 0644 config.json.example %{buildroot}%{_docdir}/hanadb_exporter/config.json.example install -D -m 0644 metrics.json %{buildroot}%{_docdir}/hanadb_exporter/metrics.json install -D -m 0644 logging_config.ini %{buildroot}%{_docdir}/hanadb_exporter/logging_config.ini %post %service_add_post hanadb_exporter@.service -if [ ! -e %{_sysconfdir}/sysconfig/hanadb_exporter ]; then - %fillup_only hanadb_exporter -fi rm -rf %{_sysconfdir}/hanadb_exporter/* ln -s %{_docdir}/hanadb_exporter/config.json.example %{_sysconfdir}/hanadb_exporter/config.json.example ln -s %{_docdir}/hanadb_exporter/metrics.json %{_sysconfdir}/hanadb_exporter/metrics.json @@ -96,6 +90,7 @@ %endif %files +%defattr(-,root,root,-) %if 0%{?sle_version:1} && 0%{?sle_version} < 120300 %doc README.md docs/METRICS.md LICENSE %else @@ -105,11 +100,12 @@ %{python3_sitelib}/* %{_bindir}/hanadb_exporter +%dir %{_sysconfdir} +%dir %{oldsyscondir}/hanadb_exporter %dir %{_sysconfdir}/hanadb_exporter %{_docdir}/hanadb_exporter/config.json.example %{_docdir}/hanadb_exporter/metrics.json %{_docdir}/hanadb_exporter/logging_config.ini -%{_fillupdir}/sysconfig.hanadb_exporter %{_unitdir}/hanadb_exporter@.service %changelog diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' '--exclude=.svnignore' old/hanadb_exporter-0.5.3/tests/main_test.py new/hanadb_exporter-0.6.0/tests/main_test.py --- old/hanadb_exporter-0.5.3/tests/main_test.py 2019-12-10 12:20:40.950507434 +0100 +++ new/hanadb_exporter-0.6.0/tests/main_test.py 2019-12-13 10:04:45.859565696 +0100 @@ -53,9 +53,12 @@ mock_parser.assert_called_once_with() mocked_parser.add_argument.assert_has_calls([ mock.call( - "-c", "--config", help="Path to hanadb_exporter configuration file", required=True), + "-c", "--config", help="Path to hanadb_exporter configuration file"), mock.call( - "-m", "--metrics", help="Path to hanadb_exporter metrics file", required=True), + "-m", "--metrics", help="Path to hanadb_exporter metrics file"), + mock.call( + "--identifier", + help="Identifier of the configuration file from /etc/hanadb_exporter"), mock.call( "-v", "--verbosity", help="Python logging level. Options: DEBUG, INFO, WARN, ERROR (INFO by default)") @@ -88,6 +91,19 @@ mock.call('my_config_file', defaults={'logfilename': '/var/log/hanadb_exporter_123.123.123.123_1234'}) ]) + @mock.patch('os.path.isfile') + def test_find_metrics_file(self, mock_isfile): + mock_isfile.return_value = True + metric_file = main.find_metrics_file() + assert metric_file == main.METRICS_FILES[0] + + @mock.patch('os.path.isfile') + def test_find_metrics_file_error(self, mock_isfile): + mock_isfile.side_effect = [False, False] + with pytest.raises(ValueError) as err: + main.find_metrics_file() + assert 'metrics file does not exist in {}'.format(",".join(main.METRICS_FILES)) in str(err.value) + @mock.patch('hanadb_exporter.main.LOGGER') @mock.patch('hanadb_exporter.main.parse_arguments') @mock.patch('hanadb_exporter.main.parse_config') @@ -152,6 +168,84 @@ mock_sleep.assert_called_once_with(1) @mock.patch('hanadb_exporter.main.LOGGER') + @mock.patch('hanadb_exporter.main.find_metrics_file') + @mock.patch('hanadb_exporter.main.parse_arguments') + @mock.patch('hanadb_exporter.main.parse_config') + @mock.patch('hanadb_exporter.main.setup_logging') + @mock.patch('hanadb_exporter.main.db_manager.DatabaseManager') + @mock.patch('hanadb_exporter.main.prometheus_exporter.SapHanaCollectors') + @mock.patch('hanadb_exporter.main.REGISTRY.register') + @mock.patch('hanadb_exporter.main.start_http_server') + @mock.patch('logging.getLogger') + @mock.patch('time.sleep') + def test_run_defaults( + self, mock_sleep, mock_get_logger, mock_start_server, mock_registry, + mock_exporters, mock_db_manager, mock_setup_logging, + mock_parse_config, mock_parse_arguments, mock_find_metrics, mock_logger): + + mock_arguments = mock.Mock(config=None, metrics=None, identifier='config') + mock_parse_arguments.return_value = mock_arguments + + mock_find_metrics.return_value = 'new_metrics' + + config = { + 'hana': { + 'host': '10.10.10.10', + 'port': 1234, + 'user': 'user', + 'password': 'pass' + }, + 'logging': { + 'log_file': 'my_file', + 'config_file': 'my_config_file' + } + } + mock_parse_config.return_value = config + + db_instance = mock.Mock() + db_instance.get_connectors.return_value = 'connectors' + mock_db_manager.return_value = db_instance + + mock_collector = mock.Mock() + mock_exporters.return_value = mock_collector + + mock_sleep.side_effect = Exception + + with pytest.raises(Exception): + main.run() + + mock_parse_arguments.assert_called_once_with() + mock_parse_config.assert_called_once_with("{}/{}.json".format(main.CONFIG_FOLDER, 'config')) + mock_setup_logging.assert_called_once_with(config) + mock_find_metrics.assert_called_once_with() + mock_db_manager.assert_called_once_with() + db_instance.start.assert_called_once_with( + '10.10.10.10', 1234, user='user', password='pass', + userkey=None, multi_tenant=True, timeout=600) + db_instance.get_connectors.assert_called_once_with() + mock_exporters.assert_called_once_with( + connectors='connectors', metrics_file='new_metrics') + + mock_registry.assert_called_once_with(mock_collector) + mock_logger.info.assert_has_calls([ + mock.call('exporter sucessfully registered'), + mock.call('starting to serve metrics') + ]) + mock_start_server.assert_called_once_with(8001, '0.0.0.0') + mock_sleep.assert_called_once_with(1) + + @mock.patch('hanadb_exporter.main.parse_arguments') + def test_run_invalid_args(self, mock_parse_arguments): + + mock_arguments = mock.Mock(config=None, identifier=None) + mock_parse_arguments.return_value = mock_arguments + + with pytest.raises(ValueError) as err: + main.run() + + assert 'configuration file or identifier must be used' in str(err.value) + + @mock.patch('hanadb_exporter.main.LOGGER') @mock.patch('hanadb_exporter.main.parse_arguments') @mock.patch('hanadb_exporter.main.parse_config') @mock.patch('hanadb_exporter.main.db_manager.DatabaseManager')