💄 — Quick supervision overview on homepage

This commit is contained in:
Luc Didry 2023-11-21 15:42:32 +01:00
parent 2383326af8
commit d2a12aea30
5 changed files with 92 additions and 32 deletions

View file

@ -19,7 +19,7 @@ Internally, a HTTP API is exposed, and a job queue is used to distribute the che
## Todo: ## Todo:
- [ ] Do not return empty list on / when no results from agents. - [ ] Do not return empty list on / when no results from agents.
- [ ] donner un aperçu rapide de létat de la supervision. - [X] donner un aperçu rapide de létat de la supervision.
- [ ] Allow passing a dict to check - [ ] Allow passing a dict to check
- [ ] Rename error in unexpected error - [ ] Rename error in unexpected error
- [ ] Use background tasks for alerting - [ ] Use background tasks for alerting
@ -29,4 +29,4 @@ Internally, a HTTP API is exposed, and a job queue is used to distribute the che
- [ ] Un flag de configuration permet dajouter automatiquement un job de vérification de redirection 301 de la version HTTP vers HTTPS - [ ] Un flag de configuration permet dajouter automatiquement un job de vérification de redirection 301 de la version HTTP vers HTTPS
- [ ] add an "unknown" severity for check errors - [ ] add an "unknown" severity for check errors
- [ ] Add a way to specify the severity of the alerts in the config - [ ] Add a way to specify the severity of the alerts in the config
- [ ] Add a command to generate new authentication token - [ ] Add a command to generate new authentication token

View file

@ -7,6 +7,7 @@ from sqlalchemy import desc
from sqlalchemy.orm import Session, aliased from sqlalchemy.orm import Session, aliased
from argos.schemas import Config from argos.schemas import Config
from argos.server import queries
from argos.server.models import Result, Task from argos.server.models import Result, Task
from argos.server.routes.dependencies import get_config, get_db from argos.server.routes.dependencies import get_config, get_db
@ -16,6 +17,25 @@ templates = Jinja2Templates(directory="argos/server/templates")
@route.get("/") @route.get("/")
async def get_severity_counts(request: Request, db: Session = Depends(get_db)):
"""Returns the number of results per severity"""
counts = await queries.get_severity_counts(db)
counts_dict = dict(counts)
for key in ("ok", "warning", "critical"):
counts_dict.setdefault(key, 0)
agents = db.query(Result.agent_id).distinct().all()
return templates.TemplateResponse(
"index.html",
{
"request": request,
"counts_dict": counts_dict,
"agents": agents,
},
)
@route.get("/details")
async def read_tasks(request: Request, db: Session = Depends(get_db)): async def read_tasks(request: Request, db: Session = Depends(get_db)):
tasks = db.query(Task).order_by(Task.domain).all() tasks = db.query(Task).order_by(Task.domain).all()
@ -46,7 +66,7 @@ async def read_tasks(request: Request, db: Session = Depends(get_db)):
agents = db.query(Result.agent_id).distinct().all() agents = db.query(Result.agent_id).distinct().all()
return templates.TemplateResponse( return templates.TemplateResponse(
"index.html", "details.html",
{ {
"request": request, "request": request,
"domains": domains, "domains": domains,

View file

@ -2,4 +2,16 @@
code { code {
white-space: pre-wrap; white-space: pre-wrap;
} }
.grid-index {
font-size: 2rem;
}
.text-center,
.grid-index {
text-align: center;
}
.grid-index article {
margin-top: 0;
margin-bottom: 1rem;
}

View file

@ -0,0 +1,35 @@
{% extends "base.html" %}
{% block content %}
<div id="domains" class="frame">
<p>
{{domains | length}} domains,
{{ total_task_count }} tasks,
<a href="/agents">{{ agents |length }} agent{% if agents|length > 1 %}s{% endif %}</a>
</p>
<table id="domains-list" role="grid">
<thead>
<tr>
<th>Domain</th>
<th class="today">Current status</th>
<th>Last check</th>
</thead>
<tbody id="domains-body">
{% for (domain, status) in domains %}
<tr>
<td>
<a href="/domain/{{domain}}">
{{ domain }} </a>
</td>
<td class="status highlight">{% if status == "ok" %}✅ OK {% elif statuts == "warning"%}⚠ Warning{% elif status == "critical"%}❌ Critical{% elif status == "to-process" %}⏱︎ Waiting for the jobs{% endif %}</td>
<td>{{ last_checks.get(domain) }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div>
{% endblock %}

View file

@ -2,34 +2,27 @@
{% block content %} {% block content %}
<div id="domains" class="frame"> <div id="domains" class="frame">
<p> <p>
{{domains | length}} domains, <a href="/agents">{{ agents | length }} agent{% if agents| length > 1 %}s{% endif %}</a>
{{ total_task_count }} tasks, </p>
<a href="/agents">{{ agents |length }} agent{% if agents|length > 1 %}s{% endif %}</a>
<div class="container">
<div class="grid grid-index">
<article>
<header>✅ OK </header>
{{ counts_dict['ok'] }}
</article>
<article>
<header> ⚠️ Warning</header>
{{ counts_dict['warning'] }}
</article>
<article>
<header>❌ Critical</header>
{{ counts_dict['critical'] }}
</article>
</div>
<p class="text-center">
<a href="/details" role="button">Details</a>
</p> </p>
</div>
<table id="domains-list" role="grid">
<thead>
<tr>
<th>Domain</th>
<th class="today">Current status</th>
<th>Last check</th>
</thead>
<tbody id="domains-body">
{% for (domain, status) in domains %}
<tr>
<td>
<a href="/domain/{{domain}}">
{{ domain }} </a>
</td>
<td class="status highlight">{% if status == "ok" %}✅ OK {% elif statuts == "warning"%}⚠ Warning{% elif status == "critical"%}❌ Critical{% elif status == "to-process" %}⏱︎ Waiting for the jobs{% endif %}</td>
<td>{{ last_checks.get(domain) }}</td>
</tr>
{% endfor %}
</tbody>
</table>
</div> </div>
{% endblock %} {% endblock %}