munin/templates/system.html
2026-10-19 10:13:56 +02:00

265 lines
11 KiB
HTML
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

{{template "header" .}}
<div class="page-header">
<div class="page-header-title">
<h1>System {{template "helplink" "plattform-admin#system"}}</h1>
<span class="help">Ob etwas zu tun ist, wie Munin genutzt wird und worauf es läuft.</span>
</div>
</div>
{{with .Data}}
<div class="metrics">
<div class="metric">
<span class="metric-value">{{if .Ready}}bereit{{else}}<span class="warn-text">nicht bereit</span>{{end}}</span>
<span class="metric-name">Datenbank (wie /ready)</span>
</div>
<div class="metric">
<span class="metric-value">{{.OpenConns}}{{if .Capacity.Limited}} / {{.Capacity.Allowed}}{{end}}</span>
<span class="metric-name">offene Verbindungen{{if .Capacity.Limited}} / max_connections{{end}}</span>
</div>
<div class="metric">
<span class="metric-value">{{.WorkspaceCount}}{{if .Capacity.Limited}} / {{.Capacity.MaxWorkspaces}}{{end}}</span>
<span class="metric-name">Workspaces{{if .Capacity.Limited}} / höchstens möglich{{end}}</span>
</div>
<div class="metric">
<span class="metric-value">{{.Uptime}}</span>
<span class="metric-name">seit dem Start</span>
</div>
</div>
{{if not .Ready}}
<div class="message error">Die Kontroll-Datenbank antwortet nicht: {{.ReadyText}}</div>
{{end}}
<section class="section">
<h2>Zustand</h2>
{{if .Hints}}
<ul class="status">
{{range .Hints}}
<li class="{{if .Warning}}status-warning{{else}}status-hint{{end}}">
<span class="status-kind">{{if .Warning}}Warnung{{else}}Hinweis{{end}}</span>
<span>{{.Text}}</span>
</li>
{{end}}
</ul>
{{else if .Ready}}
<div class="message hint">Alles in Ordnung — nichts zu tun.</div>
{{end}}
</section>
{{if not .Snapshot.CollectedAt.IsZero}}
<section class="section">
<h2>Aktivität der letzten {{.ChartDays}} Tage</h2>
<span class="help">Alle Workspaces. Stand {{.Snapshot.CollectedAt.Local.Format "15:04"}} — gezählt wird höchstens
alle 5 Minuten neu.</span>
<div class="charts">
<figure class="chart-frame">
<figcaption>
<strong>Schreibvorgänge</strong>
<span class="legend"><span class="legend-swatch bar-agent"></span>Agenten (MCP)</span>
<span class="legend"><span class="legend-swatch bar-human"></span>Menschen (Weboberfläche)</span>
</figcaption>
{{template "chart" .WriteChart}}
</figure>
<figure class="chart-frame">
<figcaption>
<strong>Suchen</strong>
<span class="legend"><span class="legend-swatch bar-search"></span>recall von Agenten</span>
</figcaption>
{{template "chart" .SearchChart}}
</figure>
</div>
<span class="help">Schreiben heißt angelegt, geändert oder gelöscht. Tage in UTC; mit der Maus über einen
Tag zeigt die genauen Zahlen.</span>
<details class="disclosure">
<summary>Als Tabelle</summary>
<div class="table-wrap">
<table class="styled-table">
<thead>
<tr><th>Tag</th><th class="num">Agenten</th><th class="num">Menschen</th><th class="num">Suchen</th></tr>
</thead>
<tbody>
{{range .Snapshot.Days}}
<tr>
<td>{{.Date.Format "02.01.2006"}}</td>
<td class="num">{{.AgentWrites}}</td>
<td class="num">{{.HumanWrites}}</td>
<td class="num">{{.Searches}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</details>
<h3>Am aktivsten</h3>
{{if .TopProjects}}
<div class="table-wrap">
<table class="styled-table">
<thead>
<tr>
<th>Projekt</th>
<th>Workspace</th>
<th class="num">Schreiben Agenten</th>
<th class="num">Schreiben Menschen</th>
<th class="num">Suchen</th>
</tr>
</thead>
<tbody>
{{range .TopProjects}}
<tr>
<td>{{.Name}} <span class="help">{{.Slug}}</span></td>
<td>{{.Workspace}}</td>
<td class="num">{{.AgentWrites}}</td>
<td class="num">{{.HumanWrites}}</td>
<td class="num">{{.Searches}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
{{if .MoreActive}}<span class="help">… und {{.MoreActive}} weitere mit Aktivität.</span>{{end}}
{{else}}
<p class="help">In den letzten {{.ChartDays}} Tagen hat in keinem Projekt jemand geschrieben oder gesucht.</p>
{{end}}
{{with .Snapshot.Idle}}
<details class="disclosure">
<summary>{{len .}} {{if eq (len .) 1}}Projekt{{else}}Projekte{{end}} ohne jede Aktivität</summary>
<span class="help">Weder geschrieben noch gesucht. Wird das Projekt noch gebraucht, oder fehlt dem Team
die Anbindung?</span>
<ul class="idle-list">
{{range .}}<li>{{.Name}} <span class="help">{{.Workspace}}</span></li>{{end}}
</ul>
</details>
{{end}}
</section>
<section class="section">
<h2>Bestand je Workspace</h2>
<div class="table-wrap">
<table class="styled-table">
<thead>
<tr>
<th>Workspace</th>
<th class="num">Projekte</th>
<th class="num">Einträge</th>
<th class="num">Fassungen</th>
<th class="num">Papierkorb</th>
<th class="num">Keys</th>
<th class="num">Platz</th>
</tr>
</thead>
<tbody>
{{range .Snapshot.Workspaces}}
<tr>
<td>{{.Name}}<div class="help storage-location">{{.Location}}</div></td>
<td class="num">{{.Inventory.Projects}}</td>
<td class="num">{{.Inventory.Entries}}</td>
<td class="num">{{.Inventory.Versions}}</td>
<td class="num">{{.Inventory.Trash}}</td>
<td class="num">{{.Inventory.Keys}}</td>
<td class="num">{{byteSize .DiskUsage.Total}}{{if .DiskUsage.WAL}}
<div class="help">davon WAL {{byteSize .DiskUsage.WAL}}</div>{{end}}</td>
</tr>
{{end}}
{{if gt (len .Snapshot.Workspaces) 1}}
<tr class="total">
<td>Zusammen</td>
<td class="num">{{.Snapshot.Total.Projects}}</td>
<td class="num">{{.Snapshot.Total.Entries}}</td>
<td class="num">{{.Snapshot.Total.Versions}}</td>
<td class="num">{{.Snapshot.Total.Trash}}</td>
<td class="num">{{.Snapshot.Total.Keys}}</td>
<td class="num">{{byteSize .Snapshot.DiskUsage.Total}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
<span class="help">Keys: nur gültige. Platz: bei SQLite die Datei samt WAL, bei PostgreSQL die Tabellen
des Schemas samt Indizes. Sicherungen und Export kommen hinzu.</span>
</section>
{{end}}
<section class="section">
<h2>Speicher</h2>
<dl class="properties">
<dt>Datenbank</dt><dd><code>{{.Backend}}</code></dd>
{{if .Capacity.Limited}}
<dt>Verbindungsbudget</dt>
<dd>{{.Capacity.PerWorkspace}} je geöffnetem Workspace, {{.Capacity.Fixed}} fest,
{{.Capacity.Reserve}} Reserve, bei max_connections {{.Capacity.Allowed}}
→ höchstens {{.Capacity.MaxWorkspaces}} Workspaces.
<span class="help">Darüber lehnt Munin neue Workspaces ab bzw. startet nicht.</span></dd>
{{else}}
<dt>Verbindungsbudget</dt>
<dd>keins — jede SQLite-Datei hat ihre eigenen Verbindungen.</dd>
{{end}}
<dt>Gewartet</dt>
<dd>{{.WaitCount}}× musste eine Anfrage auf eine freie Verbindung warten (seit dem Start).
<span class="help">Ab und zu ist normal. Wächst die Zahl stetig, sind die Pools zu klein für die Last.</span></dd>
</dl>
</section>
<section class="section">
<h2>Verbindungen je Workspace</h2>
<span class="help">Nur geöffnete Workspaces belegen Verbindungen. Ein Workspace wird beim ersten
Zugriff geöffnet; ruhige Pools geben ihre Verbindungen nach kurzer Zeit zurück.
Diese Zahlen sind immer aktuell.</span>
<div class="table-wrap">
<table class="styled-table">
<thead>
<tr>
<th>Workspace</th>
<th class="num">offen</th>
<th class="num">in Benutzung</th>
<th class="num">lesen / schreiben</th>
<th class="num">gewartet</th>
</tr>
</thead>
<tbody>
<tr>
<td>Kontroll-Datenbank</td>
<td class="num">{{.Control.OpenConns}}</td>
<td class="num">{{.Control.InUse}}</td>
<td class="num">{{.Control.Read.OpenConnections}} / {{.Control.Write.OpenConnections}}</td>
<td class="num">{{.Control.WaitCount}}</td>
</tr>
{{range .Workspaces}}
<tr>
<td>{{if .Name}}{{.Name}}{{else}}<span class="help">gelöscht</span>{{end}}
<div class="help storage-location">{{.Location}}</div></td>
<td class="num">{{.PoolStats.OpenConns}}</td>
<td class="num">{{.PoolStats.InUse}}</td>
<td class="num">{{.PoolStats.Read.OpenConnections}} / {{.PoolStats.Write.OpenConnections}}</td>
<td class="num">{{.PoolStats.WaitCount}}</td>
</tr>
{{end}}
</tbody>
</table>
</div>
</section>
<section class="section">
<h2>Programm</h2>
<dl class="properties">
<dt>Fassung</dt><dd><code>{{.Version}}</code></dd>
<dt>Go</dt><dd><code>{{.GoVersion}}</code></dd>
<dt>Gestartet</dt><dd>{{datetime .StartedAt}}</dd>
{{with .Snapshot.SchemaVersion}}<dt>Schema</dt><dd><code>{{.}}</code></dd>{{end}}
<dt>Markdown-Export</dt>
<dd>{{if not .ExportConfigured}}nicht eingerichtet (EXPORT_DIR fehlt)
{{else if .Export.End.IsZero}}seit dem Start noch kein Lauf fertig
{{else}}zuletzt {{datetime .Export.End}}, {{.Export.Stats.Written}} {{if eq .Export.Stats.Written 1}}Datei{{else}}Dateien{{end}}
{{- if .Export.Stats.Removed}}, {{.Export.Stats.Removed}} verwaiste entfernt{{end}}
{{- if .Export.Err}} — <span class="warn-text">unvollständig</span>{{end}}{{end}}</dd>
{{if not .Snapshot.CollectedAt.IsZero}}<dt>Zählung</dt>
<dd>{{.Snapshot.Duration.Round 1000000}} für alle Workspaces</dd>{{end}}
</dl>
</section>
{{end}}
{{template "footer" .}}