Add meteocat exporter
Allows us to track ambient temperature changes and estimate the temperature delta between the server room and exterior temperature. We should be able to predict when we would need to stop the machines due to excesive temperature as summer approaches. Reviewed-by: Aleix Boné <abonerib@bsc.es>
This commit is contained in:
		
							parent
							
								
									7d10816c98
								
							
						
					
					
						commit
						3b5781ba63
					
				| @ -3,6 +3,7 @@ | |||||||
| { | { | ||||||
|   imports = [ |   imports = [ | ||||||
|     ../module/slurm-exporter.nix |     ../module/slurm-exporter.nix | ||||||
|  |     ../module/meteocat-exporter.nix | ||||||
|     ./gpfs-probe.nix |     ./gpfs-probe.nix | ||||||
|     ./nix-daemon-exporter.nix |     ./nix-daemon-exporter.nix | ||||||
|   ]; |   ]; | ||||||
| @ -110,6 +111,7 @@ | |||||||
|             "127.0.0.1:9341" # Slurm exporter |             "127.0.0.1:9341" # Slurm exporter | ||||||
|             "127.0.0.1:9966" # GPFS custom exporter |             "127.0.0.1:9966" # GPFS custom exporter | ||||||
|             "127.0.0.1:9999" # Nix-daemon custom exporter |             "127.0.0.1:9999" # Nix-daemon custom exporter | ||||||
|  |             "127.0.0.1:9929" # Meteocat custom exporter | ||||||
|             "127.0.0.1:${toString config.services.prometheus.exporters.blackbox.port}" |             "127.0.0.1:${toString config.services.prometheus.exporters.blackbox.port}" | ||||||
|           ]; |           ]; | ||||||
|         }]; |         }]; | ||||||
|  | |||||||
							
								
								
									
										17
									
								
								m/module/meteocat-exporter.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								m/module/meteocat-exporter.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | |||||||
|  | { config, lib, pkgs, ... }: | ||||||
|  | 
 | ||||||
|  | with lib; | ||||||
|  | 
 | ||||||
|  | { | ||||||
|  |   systemd.services."prometheus-meteocat-exporter" = { | ||||||
|  |     wantedBy = [ "multi-user.target" ]; | ||||||
|  |     after = [ "network.target" ]; | ||||||
|  |     serviceConfig = { | ||||||
|  |       Restart = mkDefault "always"; | ||||||
|  |       PrivateTmp = mkDefault true; | ||||||
|  |       WorkingDirectory = mkDefault "/tmp"; | ||||||
|  |       DynamicUser = mkDefault true; | ||||||
|  |       ExecStart = "${pkgs.meteocat-exporter}/bin/meteocat-exporter"; | ||||||
|  |     }; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								pkgs/meteocat-exporter/default.nix
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								pkgs/meteocat-exporter/default.nix
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,25 @@ | |||||||
|  | { python3Packages, lib }: | ||||||
|  | 
 | ||||||
|  | python3Packages.buildPythonApplication rec { | ||||||
|  |   pname = "meteocat-exporter"; | ||||||
|  |   version = "1.0"; | ||||||
|  | 
 | ||||||
|  |   src = ./.; | ||||||
|  | 
 | ||||||
|  |   doCheck = false; | ||||||
|  | 
 | ||||||
|  |   build-system = with python3Packages; [ | ||||||
|  |     setuptools | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   dependencies = with python3Packages; [ | ||||||
|  |     beautifulsoup4 | ||||||
|  |     lxml | ||||||
|  |     prometheus-client | ||||||
|  |   ]; | ||||||
|  | 
 | ||||||
|  |   meta = with lib; { | ||||||
|  |     description = "MeteoCat Prometheus Exporter"; | ||||||
|  |     platforms = platforms.linux; | ||||||
|  |   }; | ||||||
|  | } | ||||||
							
								
								
									
										54
									
								
								pkgs/meteocat-exporter/meteocat-exporter
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								pkgs/meteocat-exporter/meteocat-exporter
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | |||||||
|  | #!/usr/bin/env python3 | ||||||
|  | 
 | ||||||
|  | import time | ||||||
|  | from prometheus_client import start_http_server, Gauge | ||||||
|  | from bs4 import BeautifulSoup | ||||||
|  | from urllib import request | ||||||
|  | 
 | ||||||
|  | # Configuration ------------------------------------------- | ||||||
|  | meteo_station = "X8" # Barcelona - Zona Universitària | ||||||
|  | listening_port = 9929 | ||||||
|  | update_period = 60 * 5 # Each 5 min | ||||||
|  | # --------------------------------------------------------- | ||||||
|  | 
 | ||||||
|  | metric_tmin = Gauge('meteocat_temp_min', 'Min temperature') | ||||||
|  | metric_tmax = Gauge('meteocat_temp_max', 'Max temperature') | ||||||
|  | metric_tavg = Gauge('meteocat_temp_avg', 'Average temperature') | ||||||
|  | metric_srad = Gauge('meteocat_solar_radiation', 'Solar radiation') | ||||||
|  | 
 | ||||||
|  | def update(st): | ||||||
|  |     url = 'https://www.meteo.cat/observacions/xema/dades?codi=' + st | ||||||
|  |     response = request.urlopen(url) | ||||||
|  |     data = response.read() | ||||||
|  |     soup = BeautifulSoup(data, 'lxml') | ||||||
|  |     table = soup.find("table", {"class" : "tblperiode"}) | ||||||
|  |     rows = table.find_all('tr') | ||||||
|  |     row = rows[-1] # Take the last row | ||||||
|  |     row_data = [] | ||||||
|  |     header = row.find('th') | ||||||
|  |     header_text = header.text.strip() | ||||||
|  |     row_data.append(header_text) | ||||||
|  |     for col in row.find_all('td'): | ||||||
|  |         row_data.append(col.text) | ||||||
|  |     try: | ||||||
|  |         # Sometimes it will return '(s/d)' and fail to parse | ||||||
|  |         metric_tavg.set(float(row_data[1])) | ||||||
|  |         metric_tmax.set(float(row_data[2])) | ||||||
|  |         metric_tmin.set(float(row_data[3])) | ||||||
|  |         metric_srad.set(float(row_data[10])) | ||||||
|  |         #print("ok: temp_avg={}".format(float(row_data[1]))) | ||||||
|  |     except: | ||||||
|  |         print("cannot parse row: {}".format(row)) | ||||||
|  |         metric_tavg.set(float("nan")) | ||||||
|  |         metric_tmax.set(float("nan")) | ||||||
|  |         metric_tmin.set(float("nan")) | ||||||
|  |         metric_srad.set(float("nan")) | ||||||
|  | 
 | ||||||
|  | if __name__ == '__main__': | ||||||
|  |     start_http_server(port=listening_port, addr="localhost") | ||||||
|  |     while True: | ||||||
|  |         try: | ||||||
|  |             update(meteo_station) | ||||||
|  |         except: | ||||||
|  |             print("update failed") | ||||||
|  |         time.sleep(update_period) | ||||||
							
								
								
									
										11
									
								
								pkgs/meteocat-exporter/setup.py
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										11
									
								
								pkgs/meteocat-exporter/setup.py
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,11 @@ | |||||||
|  | #!/usr/bin/env python | ||||||
|  | 
 | ||||||
|  | from setuptools import setup, find_packages | ||||||
|  | 
 | ||||||
|  | setup(name='meteocat-exporter', | ||||||
|  |       version='1.0', | ||||||
|  |       # Modules to import from other scripts: | ||||||
|  |       packages=find_packages(), | ||||||
|  |       # Executables | ||||||
|  |       scripts=["meteocat-exporter"], | ||||||
|  |      ) | ||||||
| @ -54,4 +54,5 @@ final: prev: | |||||||
|   }); |   }); | ||||||
| 
 | 
 | ||||||
|   prometheus-slurm-exporter = prev.callPackage ./slurm-exporter.nix { }; |   prometheus-slurm-exporter = prev.callPackage ./slurm-exporter.nix { }; | ||||||
|  |   meteocat-exporter = prev.callPackage ./meteocat-exporter/default.nix { }; | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user