""" 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