bridge/api/Stats.go

109 lines
2.0 KiB
Go
Raw Normal View History

2023-07-02 18:00:59 +02:00
package api
import (
"html/template"
"net/http"
)
type statsApi struct {
ctx *ApiContext
mux *http.ServeMux
}
func (a *statsApi) Name() string {
return "Stats"
}
func (a *statsApi) Domains() []string {
return []string{"bridge.sati.ac"}
}
func (a *statsApi) ServeHTTP(w http.ResponseWriter, r *http.Request) {
a.mux.ServeHTTP(w, r)
}
var statsTemplate = func() *template.Template {
template, err := template.New("stats").Parse(`
<html>
<head>
<title>sati bridge</title>
<style>
.highlight {
color: #FF7143;
}
.header {
margin-bottom: 5px;
font-size: 20px;
}
html, body {
font-size: 14px;
background: #0f0805;
color: #ddd;
font-family: "Segoe UI","Noto Sans",sans-serif;
}
table, th, td {
border: 1px solid #592D25;
border-collapse: collapse;
}
th, td {
padding: 2px 5px;
}
</style>
</head>
<body>
<div class="header">
<span class="highlight">it works!</span> statistics of this instance:
</div>
<table>
<tr><th>domain</th><th>handler</th></tr>
{{range $domain, $handler := .Domains}}
<tr><td>{{$domain}}</td><td>{{$handler}}</td></tr>
{{end}}
</table>
<br/>
<table>
<tr><th>task registry</th></tr>
<tr><td>Total</td><td>{{.Registry.Total}}</td></tr>
<tr><td>Success</td><td>{{.Registry.Success}}</td></tr>
<tr><td>Error</td><td>{{.Registry.Error}}</td></tr>
<tr><td>Processing</td><td>{{.Registry.Processing}}</td></tr>
</table>
</pre>
</body>
</html>
`)
if err != nil {
panic(err)
}
return template
}()
func (a *statsApi) stats(w http.ResponseWriter, r *http.Request) {
w.Header().Add("Content-Type", "text/html")
domains := make(map[string]string, len(a.ctx.Server.domains))
for domain, handler := range a.ctx.Server.domains {
domains[domain] = handler.Name()
}
statsTemplate.Execute(w, &struct {
Domains map[string]string
Registry RegistryStats
}{domains, a.ctx.Registry.Stats()})
}
func newStatsApi(ctx *ApiContext) ApiHandler {
api := &statsApi{ctx, http.NewServeMux()}
api.mux.HandleFunc("/", api.stats)
return api
}