""" Rendering weather data in the Prometheus format. """ from datetime import datetime from fields import DESCRIPTION def _render_current(data, for_day="current", already_seen=[]): "Converts data into prometheus style format" output = [] for field_name, val in DESCRIPTION.items(): help, name = val try: value = data[field_name] if field_name == "weatherDesc": value = value[0]["value"] except (IndexError, KeyError): try: value = data["astronomy"][0][field_name] if value.endswith(" AM") or value.endswith(" PM"): value = _convert_time_to_minutes(value) except (IndexError, KeyError, ValueError): continue try: if name == "observation_time": value = _convert_time_to_minutes(value) except ValueError: continue description = "" try: float(value) except ValueError: description = f", description=\"{value}\"" value = "1" if name not in already_seen: output.append(f"# HELP {name} {help}") already_seen.append(name) output.append(f"{name}{{forecast=\"{for_day}\"{description}}} {value}") return "\n".join(output)+"\n" def _convert_time_to_minutes(time_str): "Convert time from midnight to minutes" return int((datetime.strptime(time_str, "%I:%M %p") - datetime.strptime("12:00 AM", "%I:%M %p")).total_seconds())//60 def render_prometheus(data): """ Convert `data` into Prometheus format and return it as string. """ already_seen = [] answer = _render_current( data["current_condition"][0], already_seen=already_seen) for i in range(3): answer += _render_current( data["weather"][i], for_day="%sd" % i, already_seen=already_seen) return answer