Functional Weave
Code in Rust

monitor.uptime-bars@1.0.0

impl/python.py

1,761 bytes · the Python implementation · view raw

Imports name this capability’s declared dependencies, which fune builds next to it in your project; each one links to its page.

from typing import List, Sequence

from .monitor_check_status import Check  ← from monitor.check-status ^1.0.0 · built alongside by fune
from .monitor_uptime import uptime  ← from monitor.uptime ^1.0.0 · built alongside by fune
from .time_unix_to_iso import unix_to_iso  ← from time.unix-to-iso ^1.0.0 · built alongside by fune
from .monitor_uptime_bars_types import BarState, DayBar

_DAY = 86400


def _whole(value: object) -> bool:
    return isinstance(value, int) and not isinstance(value, bool)


def uptime_bars(checks: Sequence[Check], now: int, days: int, max_gap_seconds: int) -> List[DayBar]:
    """The last `days` UTC days ending with today, oldest first, each measured
    by monitor.uptime. Today's bar ends at `now`, so it never shows the rest
    of today as unknown."""
    if not _whole(now):
        raise ValueError("now must be whole seconds")
    if not _whole(days) or days < 1 or days > 366:
        raise ValueError("days must be 1 to 366, received %s" % (days,))
    # Floored, not truncated: before 1970 today starts on the earlier midnight.
    today_start = now - now % _DAY
    bars: List[DayBar] = []
    for i in range(days - 1, -1, -1):
        start = today_start - i * _DAY
        end = now if i == 0 else start + _DAY
        r = uptime(checks, start, end, max_gap_seconds)
        state: BarState
        if r.uptime_basis_points is None:
            state = "no-data"
        elif r.down_seconds > 0:
            state = "outage"
        elif r.degraded_seconds > 0:
            state = "degraded"
        else:
            state = "operational"
        bars.append(DayBar(
            date=unix_to_iso(start)[:10],
            uptime_basis_points=r.uptime_basis_points,
            up_seconds=r.up_seconds,
            degraded_seconds=r.degraded_seconds,
            down_seconds=r.down_seconds,
            unknown_seconds=r.unknown_seconds,
            state=state,
        ))
    return bars