109 lines
2.0 KiB
Go
109 lines
2.0 KiB
Go
|
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
|
||
|
}
|