Warning

This document is for an old release of Galaxy. You can alternatively view this page in the latest release if it exists or view the top of the latest release's documentation.

Source code for galaxy.job_metrics.instrumenters

"""This module describes the abstract interface for :class:`InstrumentPlugin`.

These are responsible for collecting and formatting a coherent set of metrics.
"""
import os.path
from abc import (
    ABCMeta,
    abstractmethod,
)
from typing import (
    Any,
    Dict,
    List,
    Optional,
    Union,
)

from .. import formatting
from ..safety import (
    DEFAULT_SAFETY,
    Safety,
)

INSTRUMENT_FILE_PREFIX = "__instrument"
InstrumentableT = Optional[Union[str, List[str]]]


[docs]class InstrumentPlugin(metaclass=ABCMeta): """Describes how to instrument job scripts and retrieve collected metrics.""" formatter = formatting.JobMetricFormatter() default_safety = DEFAULT_SAFETY @property @abstractmethod def plugin_type(self): """Short string providing labelling this plugin"""
[docs] def pre_execute_instrument(self, job_directory: str) -> InstrumentableT: """Optionally return one or more commands to instrument job. These commands will be executed on the compute server prior to the job running. """ return None
[docs] def post_execute_instrument(self, job_directory: str) -> InstrumentableT: """Optionally return one or more commands to instrument job. These commands will be executed on the compute server after the tool defined command is ran. """ return None
[docs] @abstractmethod def job_properties(self, job_id, job_directory: str) -> Dict[str, Any]: """Collect properties for this plugin from specified job directory. This method will run on the Galaxy server and can assume files created in job_directory with pre_execute_instrument and post_execute_instrument are available. """
[docs] def safety(self, metric_name: str) -> Safety: """Return safety level of metric.""" # None of the plugins override this to dispatch on metric_name but on next # iteration it would make sense to allow admins to expose particular env vars # or to have cgroup keys we know are about runtime or memeory to be exposed # at a safer level. return self.default_safety
def _instrument_file_name(self, name: str) -> str: """Provide a common pattern for naming files used by instrumentation plugins - to ease their staging out of remote job directories. """ return f"{INSTRUMENT_FILE_PREFIX}_{self.plugin_type}_{name}" def _instrument_file_path(self, job_directory: str, name: str) -> str: return os.path.join(job_directory, self._instrument_file_name(name))