#!/usr/bin/env python3 # https://pimylifeup.com/raspberry-pi-temperature/ import logging import os import time import subprocess import sys from prometheus_client import start_http_server, Gauge, REGISTRY, GC_COLLECTOR, PLATFORM_COLLECTOR, PROCESS_COLLECTOR REGISTRY.unregister(GC_COLLECTOR) REGISTRY.unregister(PLATFORM_COLLECTOR) REGISTRY.unregister(PROCESS_COLLECTOR) logging.basicConfig(stream=sys.stdout, level=logging.DEBUG) def setup_gauge(): logging.info('Setting up Gauge') g = Gauge(f'sys_cpu_temp_celsius_degrees', 'CPU Temperature', ['node_name']) logging.info(f'Created Gauge: {g}') node_name_label = _get_node_name() logging.info(f'Retrieved node_name label {node_name_label}') # Why call `.set()` here? Because, without it, I get "gauge metric is missing label values" g.labels(node_name=node_name_label).set(_get_temp()) logging.info('Setting function for Gauge') g.set_function(_get_temp) def _get_temp(): temp = float(subprocess.run(['/usr/bin/vcgencmd', 'measure_temp'], capture_output=True).stdout.decode('utf-8') .replace('temp=', '').replace("'C\n", '')) logging.info(f'Got temp: {temp}') return temp def _get_node_name(): # https://kubernetes.io/docs/tasks/inject-data-application/environment-variable-expose-pod-information/ try: return os.environ['NODE_NAME'] except: return 'unknown-node' if __name__ == '__main__': setup_gauge() start_http_server(8555) while True: # Stay alive! time.sleep(1)