| #!/usr/bin/env python3 |
| # Licensed to the Apache Software Foundation (ASF) under one |
| # or more contributor license agreements. See the NOTICE file |
| # distributed with this work for additional information |
| # regarding copyright ownership. The ASF licenses this file |
| # to you under the Apache License, Version 2.0 (the |
| # "License"); you may not use this file except in compliance |
| # with the License. You may obtain a copy of the License at |
| # |
| # http://www.apache.org/licenses/LICENSE-2.0 |
| # |
| # Unless required by applicable law or agreed to in writing, |
| # software distributed under the License is distributed on an |
| # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY |
| # KIND, either express or implied. See the License for the |
| # specific language governing permissions and limitations |
| # under the License. |
| """ASF Infrastructure Reporting Dashboard""" |
| import functools |
| |
| """Handler for uptime stats""" |
| import quart |
| from ..lib import middleware, config |
| from ..plugins import uptime |
| |
| |
| # @asfuid.session_required |
| async def process(form_data): |
| uptime_stats = uptime.get_stats() |
| series = config.reporting.uptime.get("series", {}) |
| uptime_collated = {} |
| uptime_summed = { |
| "year": 100.0, |
| "month": 100.0, |
| "week": 100.0, |
| } |
| if series: |
| u_y = 0 |
| u_m = 0 |
| u_w = 0 |
| u_c = 0 |
| for key, hosts in series.items(): |
| series_stats = [] |
| series_months = {} |
| for host in hosts: |
| if host in uptime_stats: |
| u_avg = uptime_stats[host]["uptime_average"] |
| u_monthly = list(uptime_stats[host]["uptime_monthly"].values()) |
| u_month = u_monthly[-1] if u_monthly else 100.0 |
| u_week = uptime_stats[host]["uptime_past_week"] |
| series_stats.append((u_avg, u_month, u_week, u_monthly)) |
| for month, value in uptime_stats[host]["uptime_monthly"].items(): |
| series_months[month] = series_months.get(month, []) |
| series_months[month].append(value) |
| # total stats across all hosts |
| u_c += 1 |
| u_y += u_avg |
| u_m += u_month |
| u_w += u_week |
| |
| uptime_collated[key] = { |
| "average": sum([x[0] for x in series_stats]) / float(len(series_stats)) if series_stats else 100.0, |
| "past_month": sum([x[1] for x in series_stats]) / float(len(series_stats)) if series_stats else 100.0, |
| "past_week": sum([x[2] for x in series_stats]) / float(len(series_stats)) if series_stats else 100.0, |
| "monthly": {k: sum(vx for vx in v) / float(len(v)) if v else 100.0 for k, v in series_months.items()}, |
| } |
| return { |
| "uptime_total": { |
| "year": float(u_y / u_c), |
| "month": float(u_m / u_c), |
| "week": float(u_w / u_c), |
| }, |
| "uptime_collated": uptime_collated, |
| "uptime_individual": uptime_stats, |
| } |
| |
| |
| quart.current_app.add_url_rule( |
| "/api/uptime", |
| methods=[ |
| "GET", # Session get/delete |
| ], |
| view_func=middleware.glued(process), |
| ) |