From 73fb172b8fd4a9df15d9aea546d24f760ae5c916 Mon Sep 17 00:00:00 2001 From: Emir Muhammad Date: Mon, 16 Feb 2026 19:04:34 +0100 Subject: [PATCH 01/10] use ability to use session name in ers --- src/drunc/controller/controller.py | 2 +- src/drunc/process_manager/process_manager.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/drunc/controller/controller.py b/src/drunc/controller/controller.py index c579fa01c..940923239 100644 --- a/src/drunc/controller/controller.py +++ b/src/drunc/controller/controller.py @@ -86,7 +86,7 @@ def __init__(self, configuration, name: str, session: str, token: Token): self.broadcast_service = None self.monitoring_metrics = ControllerMonitoringMetrics() self.handlerconf = LogHandlerConf(init_ers=True) - self.log = get_logger(f"controller.core.{name}_ctrl", ers_kafka_handler=False) + self.log = get_logger(f"controller.core.{name}_ctrl", ers_kafka_handler=session) log_init = get_logger("controller.core.__init__") log_init.info(f"Initialising controller '{name}' with session '{session}'") diff --git a/src/drunc/process_manager/process_manager.py b/src/drunc/process_manager/process_manager.py index f15bd20ab..c30f27a09 100644 --- a/src/drunc/process_manager/process_manager.py +++ b/src/drunc/process_manager/process_manager.py @@ -64,7 +64,7 @@ def __init__( self.handlerconf = LogHandlerConf(init_ers=True) self.log = get_logger( f"process_manager.{configuration.get_data_type_name()}_process_manager", - ers_kafka_handler=False, + ers_kafka_handler=session, ) self.log.debug(pid_info_str()) self.log.debug("Initialized ProcessManager") From 92f689735cc47174b568ef18c43cdd66dfd0b3b8 Mon Sep 17 00:00:00 2001 From: Emir Muhammad Date: Thu, 19 Feb 2026 11:24:23 +0100 Subject: [PATCH 02/10] Add new setup_daq_ers_logger to drunc --- src/drunc/controller/controller.py | 4 +++- src/drunc/process_manager/process_manager.py | 3 ++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/src/drunc/controller/controller.py b/src/drunc/controller/controller.py index 940923239..a244e4b7d 100644 --- a/src/drunc/controller/controller.py +++ b/src/drunc/controller/controller.py @@ -5,6 +5,7 @@ from typing import Callable, List, TypeVar from daqpytools.logging.handlers import LogHandlerConf +from daqpytools.logging.logger import setup_daq_ers_logger from druncschema.authoriser_pb2 import ActionType, SystemType from druncschema.broadcast_pb2 import BroadcastType from druncschema.controller_pb2 import ( @@ -86,7 +87,8 @@ def __init__(self, configuration, name: str, session: str, token: Token): self.broadcast_service = None self.monitoring_metrics = ControllerMonitoringMetrics() self.handlerconf = LogHandlerConf(init_ers=True) - self.log = get_logger(f"controller.core.{name}_ctrl", ers_kafka_handler=session) + self.log = get_logger(f"controller.core.{name}_ctrl") + setup_daq_ers_logger(self.log, session) log_init = get_logger("controller.core.__init__") log_init.info(f"Initialising controller '{name}' with session '{session}'") diff --git a/src/drunc/process_manager/process_manager.py b/src/drunc/process_manager/process_manager.py index c30f27a09..82433f2ed 100644 --- a/src/drunc/process_manager/process_manager.py +++ b/src/drunc/process_manager/process_manager.py @@ -4,6 +4,7 @@ import time from daqpytools.logging.handlers import HandlerType, LogHandlerConf +from daqpytools.logging.logger import setup_daq_ers_logger from druncschema.authoriser_pb2 import ActionType, SystemType from druncschema.broadcast_pb2 import BroadcastType from druncschema.description_pb2 import CommandDescription, Description @@ -64,8 +65,8 @@ def __init__( self.handlerconf = LogHandlerConf(init_ers=True) self.log = get_logger( f"process_manager.{configuration.get_data_type_name()}_process_manager", - ers_kafka_handler=session, ) + setup_daq_ers_logger(self.log, session) self.log.debug(pid_info_str()) self.log.debug("Initialized ProcessManager") From fc881eca4dd3cc5accd5d3d2c7117c193b73a6d4 Mon Sep 17 00:00:00 2001 From: Emir Muhammad Date: Thu, 19 Feb 2026 12:23:35 +0100 Subject: [PATCH 03/10] Remove duplicating ers log msg --- src/drunc/process_manager/process_manager.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/drunc/process_manager/process_manager.py b/src/drunc/process_manager/process_manager.py index 82433f2ed..af5c7d075 100644 --- a/src/drunc/process_manager/process_manager.py +++ b/src/drunc/process_manager/process_manager.py @@ -3,7 +3,7 @@ import threading import time -from daqpytools.logging.handlers import HandlerType, LogHandlerConf +from daqpytools.logging.handlers import LogHandlerConf from daqpytools.logging.logger import setup_daq_ers_logger from druncschema.authoriser_pb2 import ActionType, SystemType from druncschema.broadcast_pb2 import BroadcastType @@ -228,8 +228,6 @@ def find_by_uuid(pi_list, target_uuid: str): continue pi = find_by_uuid(results, diff) err_msg = f"Process {pi.process_description.metadata.name} with UUID {pi.uuid.uuid} has died with a return code {pi.return_code}" - # easiest way to send one to Rich and ERS - self.log.critical(err_msg, extra={"handlers": [HandlerType.Rich]}) self.log.critical(err_msg, extra=self.handlerconf.ERS) time.sleep(interval_s) From 3991a7921b98fe7cb64403bbb92235eea984c724 Mon Sep 17 00:00:00 2001 From: Emir Muhammad Date: Fri, 20 Feb 2026 09:51:02 +0100 Subject: [PATCH 04/10] Change custom app name --- src/drunc/controller/controller.py | 2 +- src/drunc/process_manager/process_manager.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/drunc/controller/controller.py b/src/drunc/controller/controller.py index a244e4b7d..9094286c4 100644 --- a/src/drunc/controller/controller.py +++ b/src/drunc/controller/controller.py @@ -88,7 +88,7 @@ def __init__(self, configuration, name: str, session: str, token: Token): self.monitoring_metrics = ControllerMonitoringMetrics() self.handlerconf = LogHandlerConf(init_ers=True) self.log = get_logger(f"controller.core.{name}_ctrl") - setup_daq_ers_logger(self.log, session) + setup_daq_ers_logger(self.log, session, f"drunc.{name}_ctrl") log_init = get_logger("controller.core.__init__") log_init.info(f"Initialising controller '{name}' with session '{session}'") diff --git a/src/drunc/process_manager/process_manager.py b/src/drunc/process_manager/process_manager.py index af5c7d075..b4a68194b 100644 --- a/src/drunc/process_manager/process_manager.py +++ b/src/drunc/process_manager/process_manager.py @@ -66,7 +66,7 @@ def __init__( self.log = get_logger( f"process_manager.{configuration.get_data_type_name()}_process_manager", ) - setup_daq_ers_logger(self.log, session) + setup_daq_ers_logger(self.log, session, "drunc.process_manager") self.log.debug(pid_info_str()) self.log.debug("Initialized ProcessManager") From edb83e84d11febdee148f3757e129986b51336f4 Mon Sep 17 00:00:00 2001 From: Emir Muhammad Date: Fri, 27 Feb 2026 08:58:31 +0100 Subject: [PATCH 05/10] Update path --- src/drunc/controller/controller.py | 2 +- src/drunc/process_manager/process_manager.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/drunc/controller/controller.py b/src/drunc/controller/controller.py index 9094286c4..45ed1bda4 100644 --- a/src/drunc/controller/controller.py +++ b/src/drunc/controller/controller.py @@ -4,7 +4,7 @@ from concurrent.futures import ThreadPoolExecutor, as_completed from typing import Callable, List, TypeVar -from daqpytools.logging.handlers import LogHandlerConf +from daqpytools.logging.handlerconf import LogHandlerConf from daqpytools.logging.logger import setup_daq_ers_logger from druncschema.authoriser_pb2 import ActionType, SystemType from druncschema.broadcast_pb2 import BroadcastType diff --git a/src/drunc/process_manager/process_manager.py b/src/drunc/process_manager/process_manager.py index b4a68194b..83ef58c3f 100644 --- a/src/drunc/process_manager/process_manager.py +++ b/src/drunc/process_manager/process_manager.py @@ -3,7 +3,7 @@ import threading import time -from daqpytools.logging.handlers import LogHandlerConf +from daqpytools.logging.handlerconf import LogHandlerConf from daqpytools.logging.logger import setup_daq_ers_logger from druncschema.authoriser_pb2 import ActionType, SystemType from druncschema.broadcast_pb2 import BroadcastType From 47afe0ffff307bbf6561c0f53ca3921f5086649b Mon Sep 17 00:00:00 2001 From: Emir Muhammad Date: Fri, 27 Feb 2026 15:28:22 +0100 Subject: [PATCH 06/10] Update to using add_handler --- src/drunc/process_manager/interface/process_manager.py | 5 +++-- src/drunc/process_manager/interface/shell.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/src/drunc/process_manager/interface/process_manager.py b/src/drunc/process_manager/interface/process_manager.py index 649ba831e..102eb1426 100644 --- a/src/drunc/process_manager/interface/process_manager.py +++ b/src/drunc/process_manager/interface/process_manager.py @@ -7,7 +7,8 @@ import click import grpc -from daqpytools.logging.handlers import add_file_handler +from daqpytools.logging.handlerconf import HandlerType +from daqpytools.logging.handlers import add_handler from daqpytools.logging.levels import logging_log_levels from druncschema.process_manager_pb2_grpc import add_ProcessManagerServicer_to_server @@ -75,7 +76,7 @@ def run_pm( ) # Logger has been added to process_manager, so everything will be logged - add_file_handler(log, use_parent_handlers=True, path=log_path) + add_handler(log, HandlerType.File, True, path=log_path) for key, value in pmch.data.environment.items(): os.environ[key] = value diff --git a/src/drunc/process_manager/interface/shell.py b/src/drunc/process_manager/interface/shell.py index ad0e4c46e..a68be05b3 100644 --- a/src/drunc/process_manager/interface/shell.py +++ b/src/drunc/process_manager/interface/shell.py @@ -3,7 +3,8 @@ import click import click_shell -from daqpytools.logging.handlers import add_file_handler +from daqpytools.logging.handlerconf import HandlerType +from daqpytools.logging.handlers import add_handler from daqpytools.logging.levels import logging_log_levels from drunc.process_manager.interface.commands import ( @@ -64,7 +65,7 @@ def process_manager_shell(ctx, process_manager_address: str, log_level: str) -> # Not possible to initialise logger immediately as it requires # knowledge of the log path if desc.info: - add_file_handler(process_manager_log, use_parent_handlers=True, path=desc.info) + add_handler(process_manager_log, HandlerType.File, True, path=desc.info) process_manager_log.info( f"[green]{getpass.getuser()}[/green] connected to the process manager through a [green]drunc-process-manager-shell[/green] via address [green]{process_manager_address}[/green]" From 92dca0034c735ad23b078fecfda5888a57fabc93 Mon Sep 17 00:00:00 2001 From: Emir Muhammad Date: Fri, 27 Feb 2026 15:40:44 +0100 Subject: [PATCH 07/10] Clean up imports --- src/drunc/apps/ssh_configurator.py | 2 +- src/drunc/apps/ssh_doctor.py | 2 +- src/drunc/apps/ssh_validator.py | 2 +- src/drunc/controller/controller.py | 3 +-- src/drunc/controller/interface/controller.py | 2 +- src/drunc/controller/interface/shell.py | 2 +- src/drunc/process_manager/interface/process_manager.py | 4 +--- src/drunc/process_manager/interface/shell.py | 4 +--- src/drunc/process_manager/process_manager.py | 3 +-- src/drunc/unified_shell/shell.py | 2 +- src/drunc/utils/utils.py | 2 +- 11 files changed, 11 insertions(+), 17 deletions(-) diff --git a/src/drunc/apps/ssh_configurator.py b/src/drunc/apps/ssh_configurator.py index 6a87dc576..0b4ee2168 100644 --- a/src/drunc/apps/ssh_configurator.py +++ b/src/drunc/apps/ssh_configurator.py @@ -12,7 +12,7 @@ import click import paramiko -from daqpytools.logging.levels import logging_log_levels +from daqpytools.logging import logging_log_levels from jinja2 import Template import drunc as _drunc diff --git a/src/drunc/apps/ssh_doctor.py b/src/drunc/apps/ssh_doctor.py index c1b56ca71..147f4c9fa 100755 --- a/src/drunc/apps/ssh_doctor.py +++ b/src/drunc/apps/ssh_doctor.py @@ -10,7 +10,7 @@ import click import conffwk -from daqpytools.logging.levels import logging_log_levels +from daqpytools.logging import logging_log_levels from drunc.process_manager.oks_parser import collect_apps from drunc.processes.ssh_process_lifetime_manager_paramiko import ( diff --git a/src/drunc/apps/ssh_validator.py b/src/drunc/apps/ssh_validator.py index 426bcfdd6..29070fb1c 100644 --- a/src/drunc/apps/ssh_validator.py +++ b/src/drunc/apps/ssh_validator.py @@ -3,7 +3,7 @@ import click import conffwk -from daqpytools.logging.levels import logging_log_levels +from daqpytools.logging import logging_log_levels from sh import Command from drunc.process_manager.oks_parser import collect_apps diff --git a/src/drunc/controller/controller.py b/src/drunc/controller/controller.py index 45ed1bda4..0d735449b 100644 --- a/src/drunc/controller/controller.py +++ b/src/drunc/controller/controller.py @@ -4,8 +4,7 @@ from concurrent.futures import ThreadPoolExecutor, as_completed from typing import Callable, List, TypeVar -from daqpytools.logging.handlerconf import LogHandlerConf -from daqpytools.logging.logger import setup_daq_ers_logger +from daqpytools.logging import LogHandlerConf, setup_daq_ers_logger from druncschema.authoriser_pb2 import ActionType, SystemType from druncschema.broadcast_pb2 import BroadcastType from druncschema.controller_pb2 import ( diff --git a/src/drunc/controller/interface/controller.py b/src/drunc/controller/interface/controller.py index 33afddf92..4eadef8a2 100644 --- a/src/drunc/controller/interface/controller.py +++ b/src/drunc/controller/interface/controller.py @@ -4,7 +4,7 @@ import click import grpc -from daqpytools.logging.levels import logging_log_levels +from daqpytools.logging import logging_log_levels from druncschema.controller_pb2_grpc import add_ControllerServicer_to_server from druncschema.token_pb2 import Token diff --git a/src/drunc/controller/interface/shell.py b/src/drunc/controller/interface/shell.py index 11c484c19..ab33f9cd5 100644 --- a/src/drunc/controller/interface/shell.py +++ b/src/drunc/controller/interface/shell.py @@ -3,7 +3,7 @@ import click import click_shell -from daqpytools.logging.levels import logging_log_levels +from daqpytools.logging import logging_log_levels from drunc.controller.interface.commands import ( connect, diff --git a/src/drunc/process_manager/interface/process_manager.py b/src/drunc/process_manager/interface/process_manager.py index 102eb1426..6e3d1b294 100644 --- a/src/drunc/process_manager/interface/process_manager.py +++ b/src/drunc/process_manager/interface/process_manager.py @@ -7,9 +7,7 @@ import click import grpc -from daqpytools.logging.handlerconf import HandlerType -from daqpytools.logging.handlers import add_handler -from daqpytools.logging.levels import logging_log_levels +from daqpytools.logging import HandlerType, add_handler, logging_log_levels from druncschema.process_manager_pb2_grpc import add_ProcessManagerServicer_to_server from drunc.exceptions import DruncSetupException diff --git a/src/drunc/process_manager/interface/shell.py b/src/drunc/process_manager/interface/shell.py index a68be05b3..5da7434c5 100644 --- a/src/drunc/process_manager/interface/shell.py +++ b/src/drunc/process_manager/interface/shell.py @@ -3,9 +3,7 @@ import click import click_shell -from daqpytools.logging.handlerconf import HandlerType -from daqpytools.logging.handlers import add_handler -from daqpytools.logging.levels import logging_log_levels +from daqpytools.logging import HandlerType, add_handler, logging_log_levels from drunc.process_manager.interface.commands import ( boot, diff --git a/src/drunc/process_manager/process_manager.py b/src/drunc/process_manager/process_manager.py index 83ef58c3f..397355283 100644 --- a/src/drunc/process_manager/process_manager.py +++ b/src/drunc/process_manager/process_manager.py @@ -3,8 +3,7 @@ import threading import time -from daqpytools.logging.handlerconf import LogHandlerConf -from daqpytools.logging.logger import setup_daq_ers_logger +from daqpytools.logging import LogHandlerConf, setup_daq_ers_logger from druncschema.authoriser_pb2 import ActionType, SystemType from druncschema.broadcast_pb2 import BroadcastType from druncschema.description_pb2 import CommandDescription, Description diff --git a/src/drunc/unified_shell/shell.py b/src/drunc/unified_shell/shell.py index e6776a6af..b80d8e33d 100644 --- a/src/drunc/unified_shell/shell.py +++ b/src/drunc/unified_shell/shell.py @@ -11,7 +11,7 @@ import click import click_shell import conffwk -from daqpytools.logging.levels import logging_log_levels +from daqpytools.logging import logging_log_levels from druncschema.description_pb2 import Description from druncschema.process_manager_pb2 import ProcessQuery diff --git a/src/drunc/utils/utils.py b/src/drunc/utils/utils.py index 2f7ad1923..983f5753c 100644 --- a/src/drunc/utils/utils.py +++ b/src/drunc/utils/utils.py @@ -14,7 +14,7 @@ from urllib.parse import urlparse from click import BadParameter -from daqpytools.logging.logger import get_daq_logger, setup_root_logger +from daqpytools.logging import get_daq_logger, setup_root_logger from requests import delete, get, patch, post from rich.progress import ( BarColumn, From bb1147e454b668f49b273ae358adfed0f4dbfd4c Mon Sep 17 00:00:00 2001 From: Emir Muhammad Date: Mon, 2 Mar 2026 14:50:39 +0100 Subject: [PATCH 08/10] empty commit trigger CI From 0a3bcfd4f04fc001a5579b0877130308ed44bd1d Mon Sep 17 00:00:00 2001 From: PawelPlesniak Date: Fri, 6 Mar 2026 16:47:14 +0100 Subject: [PATCH 09/10] Making the process manager publish to the correct topic --- src/drunc/process_manager/process_manager.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/src/drunc/process_manager/process_manager.py b/src/drunc/process_manager/process_manager.py index 397355283..342003569 100644 --- a/src/drunc/process_manager/process_manager.py +++ b/src/drunc/process_manager/process_manager.py @@ -65,7 +65,7 @@ def __init__( self.log = get_logger( f"process_manager.{configuration.get_data_type_name()}_process_manager", ) - setup_daq_ers_logger(self.log, session, "drunc.process_manager") + self.ers_handler_initialized: bool = False self.log.debug(pid_info_str()) self.log.debug("Initialized ProcessManager") @@ -226,7 +226,13 @@ def find_by_uuid(pi_list, target_uuid: str): ) continue pi = find_by_uuid(results, diff) - err_msg = f"Process {pi.process_description.metadata.name} with UUID {pi.uuid.uuid} has died with a return code {pi.return_code}" + err_msg = f"Process {pi.process_description.metadata.name} has died with a return code {pi.return_code}" + if not self.ers_handler_initialized: + setup_daq_ers_logger( + self.log, + pi.process_description.metadata.session, + "drunc.process_manager", + ) self.log.critical(err_msg, extra=self.handlerconf.ERS) time.sleep(interval_s) From 7687da9dfd47cfd6bccf12f33fb8efd9b0446476 Mon Sep 17 00:00:00 2001 From: PawelPlesniak Date: Fri, 6 Mar 2026 17:16:42 +0100 Subject: [PATCH 10/10] Adding a check for the ERS env vars --- src/drunc/process_manager/process_manager.py | 17 ++++++++++++++--- 1 file changed, 14 insertions(+), 3 deletions(-) diff --git a/src/drunc/process_manager/process_manager.py b/src/drunc/process_manager/process_manager.py index 342003569..59d77bffe 100644 --- a/src/drunc/process_manager/process_manager.py +++ b/src/drunc/process_manager/process_manager.py @@ -1,9 +1,10 @@ import abc import re +import sys import threading import time -from daqpytools.logging import LogHandlerConf, setup_daq_ers_logger +from daqpytools.logging import LogHandlerConf, exceptions, setup_daq_ers_logger from druncschema.authoriser_pb2 import ActionType, SystemType from druncschema.broadcast_pb2 import BroadcastType from druncschema.description_pb2 import CommandDescription, Description @@ -61,14 +62,24 @@ def __init__( """C'tor. Note that this takes the ERS env variables from the json files defined in data/process_manager!""" super().__init__() - self.handlerconf = LogHandlerConf(init_ers=True) + self.log = get_logger( f"process_manager.{configuration.get_data_type_name()}_process_manager", ) - self.ers_handler_initialized: bool = False self.log.debug(pid_info_str()) self.log.debug("Initialized ProcessManager") + # Validate that the ERS configuration is valid + try: + self.handlerconf = LogHandlerConf(init_ers=True) + except exceptions.ERSEnvError as e: + self.log.error( + f"Failed to set up ERS logger for process manager: [red]{e}[/red]" + ) + sys.exit(1) + + self.ers_handler_initialized: bool = False + self.configuration = configuration self.name = name self.session = session