265 lines
11 KiB
HTML
265 lines
11 KiB
HTML
{{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" .}}
|