def handler(metrics_handler, params): targets = params.get('target', None) if targets is None or len(targets) < 1: raise RuntimeError(f'invalid or missing target: {targets}') registry = CollectorRegistry() timer = Gauge('probe_duration_seconds', 'Duration of NFS probing', registry=registry) success = True with timer.time(): for target in targets: host, path = target.split(':') target = f'nfs://{host}{path}?version=4' result = subprocess.run(["nfs-ls", target], stdout=subprocess.PIPE) if result.returncode != 0: success = False break success_gauge = Gauge('probe_success', 'Success of NFS probing', registry=registry) success_gauge.set(success) return registry
def extract_image(image_name: str, timeout: int = None, *, registry_credentials: str = None, tls_verify: bool=True) -> dict: """Extract dependencies from an image.""" #Start prometheus prometheus_registry = CollectorRegistry() metric_analyzer_job = Gauge('package_extract_time','Runtime of package extract job', registry=prometheus_registry) #Begin the timer for when the job starts with metric_analyzer_job.time(): image_name = quote(image_name) with tempfile.TemporaryDirectory() as dir_path: download_image( image_name, dir_path, timeout=timeout or None, registry_credentials=registry_credentials or None, tls_verify=tls_verify ) rootfs_path = os.path.join(dir_path, 'rootfs') layers = construct_rootfs(dir_path, rootfs_path) result = run_analyzers(rootfs_path) result['layers'] = layers push_gateway = os.getenv('PROMETHEUS_PUSH_GATEWAY', 'pushgateway:9091') if push_gateway: try: pushadd_to_gateway(push_gateway, job='package-extract-runtime',registry=prometheus_registry) except Exception as e: _LOGGER.exception('An error occurred pushing the metrics: {}'.format(str(e))) return result
def wrapper_log_to_prometheus(*args, **kwargs): result = None if not settings.PUSHGATEWAY_HOST: result = job_func(*args, **kwargs) else: registry = CollectorRegistry() duration = Gauge( f"os2bos_{job_name}_duration_seconds", f"Duration of {job_name}", registry=registry, ) try: with duration.time(): result = job_func(*args, **kwargs) except Exception: pass else: # only runs when there are no exceptions last_success = Gauge( f"os2bos_{job_name}_last_success", f"Unixtime {job_name} last succeeded", registry=registry, ) last_success.set_to_current_time() finally: pushadd_to_gateway( settings.PUSHGATEWAY_HOST, job=f"{job_name}", registry=registry, ) return result
class TestGauge(unittest.TestCase): def setUp(self): self.registry = CollectorRegistry() self.gauge = Gauge('g', 'help', registry=self.registry) def test_gauge(self): self.assertEqual(0, self.registry.get_sample_value('g')) self.gauge.inc() self.assertEqual(1, self.registry.get_sample_value('g')) self.gauge.dec(3) self.assertEqual(-2, self.registry.get_sample_value('g')) self.gauge.set(9) self.assertEqual(9, self.registry.get_sample_value('g')) def test_function_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) @self.gauge.track_inprogress() def f(): self.assertEqual(1, self.registry.get_sample_value('g')) f() self.assertEqual(0, self.registry.get_sample_value('g')) def test_block_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) with self.gauge.track_inprogress(): self.assertEqual(1, self.registry.get_sample_value('g')) self.assertEqual(0, self.registry.get_sample_value('g')) def test_gauge_function(self): x = {} self.gauge.set_function(lambda: len(x)) self.assertEqual(0, self.registry.get_sample_value('g')) self.gauge.inc() self.assertEqual(0, self.registry.get_sample_value('g')) x['a'] = None self.assertEqual(1, self.registry.get_sample_value('g')) def test_function_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) @self.gauge.time() def f(): time.sleep(.001) f() self.assertNotEqual(0, self.registry.get_sample_value('g')) def test_block_decorator(self): self.assertEqual(0, self.registry.get_sample_value('g')) with self.gauge.time(): time.sleep(.001) self.assertNotEqual(0, self.registry.get_sample_value('g'))
def extract_image( image_name: str, timeout: int = None, *, registry_credentials: str = None, tls_verify: bool = True, ) -> dict: """Extract dependencies from an image.""" # Setting up the prometheus registry and the Gauge metric prometheus_registry = CollectorRegistry() metric_analyzer_job = Gauge( "package_extract_time", "Runtime of package extract job", registry=prometheus_registry, ) # Begins a timer to record the running time of the job with metric_analyzer_job.time(), tempfile.TemporaryDirectory() as dir_path: image_name = quote(image_name) download_image( image_name, dir_path, timeout=timeout or None, registry_credentials=registry_credentials or None, tls_verify=tls_verify, ) image_size = get_image_size(dir_path) rootfs_path = os.path.join(dir_path, "rootfs") layers = construct_rootfs(dir_path, rootfs_path) result = run_analyzers(rootfs_path) result["layers"] = layers result["image_size"] = image_size _push_gateway_host = os.getenv("PROMETHEUS_PUSHGATEWAY_HOST") _push_gateway_port = os.getenv("PROMETHEUS_PUSHGATEWAY_PORT") if _push_gateway_host and _push_gateway_port: try: push_gateway = f"{_push_gateway_host:_push_gateway_port}" _LOGGER.debug( f"Submitting metrics to Prometheus push gateway {push_gateway}" ) pushadd_to_gateway( push_gateway, job="package-extract-runtime", registry=prometheus_registry, ) except Exception as e: _LOGGER.exception( "An error occurred pushing the metrics: {}".format(str(e)) ) return result
def main(self): """ Execute SBR OpenStack bot. """ job_name = self.job + '-job-exec-time' job_name = job_name.replace('-', '_') job_metric_time = Gauge(job_name, 'Runtime of application job execution', registry=prometheus_registry) try: with job_metric_time.time(): solutions = list() complete = False remote_host, remote_port, remote_dir = self.get_ticket_config() if remote_host and remote_port and remote_dir: self.ssh_copy_attachments(remote_host, remote_port, remote_dir) if os.path.isdir(self.path): sosreports = self.get_all_sosreports() print("List of extracted sosreports: ", sosreports) for sosreport in sosreports: execution_path = f"{self.path}/{sosreport}" self.execute_citellus(execution_path) solution_data = self.get_solutions(execution_path) solutions.append(solution_data) comment, link = self.generate_comments(solution_data) print("Comment:", comment) complete = True if comment: complete = self.publish_comments(comment, link) if complete: print('Script successfully completed') else: metric_name = self.job + '-application-failed' metric_name = metric_name.replace('-', '_') job_comment_metric = Gauge(metric_name, 'Script Unable to process the ticket', registry=prometheus_registry) job_comment_metric.inc() _LOGGER.info('Script Unable to process the ticket') print('Script Failed!') except Exception as e: print("Script Failed!") traceback.print_exc() self.pushgateway(self.job)
def read_temperature(reader: DS18B20TemperatureReader, duration_gauge: Gauge): with duration_gauge.time(): return reader.read_temperature_celsius()
import time import random from prometheus_client import Gauge, CollectorRegistry, pushadd_to_gateway registry = CollectorRegistry() duration = Gauge( 'mybatchjob_duration_seconds', 'Duration of batch job', registry=registry ) try: with duration.time(): print("调度任务就愉快的开始了!") time.sleep(random.randint(1, 10)) #time.sleep(100) print("这里跑了我们的调度任务") except: pass else: last_success = Gauge( 'mybatchjob_last_success', 'Unixtime my batch job last succeeded', registry=registry ) last_success.set_to_current_time() finally: pushadd_to_gateway('10.8.8.61:9091', job='my_batch_job', registry=registry)