From bcf77f6a1045793fcb4a87b2be5273c649c4b267 Mon Sep 17 00:00:00 2001 From: Rickard Date: Thu, 15 Jun 2023 01:19:14 +0200 Subject: [PATCH] Modernized and added temperature, fan and CPU speed readings --- Dockerfile | 4 +-- requirements.txt | 4 +-- setup.py | 4 +-- src/hpilo_exporter/{main.py => __main__.py} | 2 +- src/hpilo_exporter/exporter.py | 36 +++++++++++++++------ src/hpilo_exporter/prometheus_metrics.py | 9 ++++++ 6 files changed, 42 insertions(+), 17 deletions(-) rename src/hpilo_exporter/{main.py => __main__.py} (92%) diff --git a/Dockerfile b/Dockerfile index ff6f2cd..f471677 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -FROM python:2.7-alpine +FROM python:3.11-alpine ADD . /usr/src/hpilo_exporter RUN pip install -e /usr/src/hpilo_exporter -ENTRYPOINT ["hpilo-exporter"] +ENTRYPOINT ["/usr/local/bin/python", "-m", "hpilo_exporter"] EXPOSE 9416 diff --git a/requirements.txt b/requirements.txt index 0df67ab..1472b1d 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,2 +1,2 @@ -prometheus-client>=0.0.19 -python-hpilo>=3.8 +prometheus-client>=0.17.0 +python-hpilo>=4.4.3 diff --git a/setup.py b/setup.py index 58dd8c5..267860f 100644 --- a/setup.py +++ b/setup.py @@ -36,8 +36,8 @@ def readme(): 'Topic :: Internet :: WWW/HTTP', ], install_requires=[ - "prometheus-client", - "python-hpilo", + "prometheus-client>=0.17.0", + "python-hpilo>=4.4.3" ], entry_points={ 'console_scripts': [ diff --git a/src/hpilo_exporter/main.py b/src/hpilo_exporter/__main__.py similarity index 92% rename from src/hpilo_exporter/main.py rename to src/hpilo_exporter/__main__.py index b41497d..ae737ac 100644 --- a/src/hpilo_exporter/main.py +++ b/src/hpilo_exporter/__main__.py @@ -4,7 +4,7 @@ import argparse -from hpilo_exporter.exporter import ILOExporterServer +from .exporter import ILOExporterServer def main(): diff --git a/src/hpilo_exporter/exporter.py b/src/hpilo_exporter/exporter.py index 319e89d..4493d2d 100644 --- a/src/hpilo_exporter/exporter.py +++ b/src/hpilo_exporter/exporter.py @@ -1,19 +1,15 @@ """ Pulls data from specified iLO and presents as Prometheus metrics """ -from __future__ import print_function from _socket import gaierror import sys import hpilo - import time -import prometheus_metrics -from BaseHTTPServer import BaseHTTPRequestHandler -from BaseHTTPServer import HTTPServer -from SocketServer import ForkingMixIn +from . import prometheus_metrics +from http.server import BaseHTTPRequestHandler, HTTPServer +from socketserver import ForkingMixIn +from urllib.parse import parse_qs, urlparse from prometheus_client import generate_latest, Summary -from urlparse import parse_qs -from urlparse import urlparse def print_err(*args, **kwargs): @@ -61,7 +57,7 @@ def do_GET(self): ilo_port = int(query_components['ilo_port'][0]) ilo_user = query_components['ilo_user'][0] ilo_password = query_components['ilo_password'][0] - except KeyError, e: + except KeyError as e: print_err("missing parameter %s" % e) self.return_error() error_detected = True @@ -80,7 +76,7 @@ def do_GET(self): except gaierror: print("ILO invalid address or port") self.return_error() - except hpilo.IloCommunicationError, e: + except hpilo.IloCommunicationError as e: print(e) # get product and server name @@ -137,6 +133,26 @@ def do_GET(self): prometheus_metrics.hpilo_firmware_version.labels(product_name=product_name, server_name=server_name).set(fw_version) + health_data = ilo.get_embedded_health() + for name, val in (health_data.get('processors') or {}).items(): + if "speed" in val: + prometheus_metrics.hpilo_cpu_speed_gauge.labels(product_name=product_name, + server_name=server_name, + name=val.get('name'), + label=val.get('label') or name).set(float(val["speed"].split(' ')[0])) + for name, val in (health_data.get('fans') or {}).items(): + if "speed" in val: + prometheus_metrics.hpilo_fan_speed_gauge.labels(product_name=product_name, + server_name=server_name, + name=name, + zone=val.get('zone') or '').set(val.get('speed')[0]) + for name, val in (health_data.get('temperature') or {}).items(): + if "currentreading" in val and val["currentreading"][0] != 0 and val["currentreading"][0] != "N": + prometheus_metrics.hpilo_temperature_value_gauge.labels(product_name=product_name, + server_name=server_name, + name=name, + location=val.get('location') or '').set(val["currentreading"][0]) + # get the amount of time the request took REQUEST_TIME.observe(time.time() - start_time) diff --git a/src/hpilo_exporter/prometheus_metrics.py b/src/hpilo_exporter/prometheus_metrics.py index 16f9f72..a6bdc36 100644 --- a/src/hpilo_exporter/prometheus_metrics.py +++ b/src/hpilo_exporter/prometheus_metrics.py @@ -17,6 +17,11 @@ hpilo_temperature_gauge = Gauge('hpilo_temperature', 'HP iLO temperature status', ["product_name", "server_name"]) hpilo_firmware_version = Gauge('hpilo_firmware_version', 'HP iLO firmware version', ["product_name", "server_name"]) +hpilo_nic_status_gauge = Gauge('hpilo_nic_status', 'HP iLO NIC status', ["product_name", "server_name", "nic_name", "ip_address"]) +hpilo_cpu_speed_gauge = Gauge('hpilo_cpu_speed', 'HP iLO CPU speed', ["product_name", "server_name", "name", "label"]) +hpilo_fan_speed_gauge = Gauge('hpilo_fan_speed', 'HP iLO fan speed', ["product_name", "server_name", "name", "zone"]) +hpilo_temperature_value_gauge = Gauge('hpilo_temperature_value', 'HP iLO temperature', ["product_name", "server_name", "name", "location"]) + gauges = { 'hpilo_vrm_gauge': hpilo_vrm_gauge, 'hpilo_drive_gauge': hpilo_drive_gauge, @@ -30,4 +35,8 @@ 'hpilo_network_gauge': hpilo_network_gauge, 'hpilo_temperature_gauge': hpilo_temperature_gauge, 'hpilo_firmware_version': hpilo_firmware_version, + 'hpilo_nic_status_gauge': hpilo_nic_status_gauge, + 'hpilo_cpu_speed_gauge': hpilo_cpu_speed_gauge, + 'hpilo_fan_speed_gauge': hpilo_fan_speed_gauge, + 'hpilo_temperature_value_gauge': hpilo_temperature_value_gauge, }