aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDmitry Vyukov <dvyukov@google.com>2020-06-30 17:50:27 +0200
committerDmitry Vyukov <dvyukov@google.com>2020-07-09 19:40:12 +0200
commitc0631963487790b901d281202df69282e5e2efd3 (patch)
treeb8122bd798778740ea9d0a4a7c0f5844815b3847
parent353d19019153d6e7ee4e98b18d790b2523901c58 (diff)
dashboard/app: add memcache to admin interface
Add memcache statistics and flush action to the admin page in preparation for actually using memcache in future commits.
-rw-r--r--dashboard/app/admin.html24
-rw-r--r--dashboard/app/main.go32
2 files changed, 48 insertions, 8 deletions
diff --git a/dashboard/app/admin.html b/dashboard/app/admin.html
index 172070821..bce5d2cda 100644
--- a/dashboard/app/admin.html
+++ b/dashboard/app/admin.html
@@ -22,6 +22,30 @@ Main page.
</script>
<br><br>
+ {{with $.MemcacheStats}}
+ <table class="list_table">
+ <caption><a href="https://pkg.go.dev/google.golang.org/appengine/memcache?tab=doc#Item" target="_blank">Memcache stats:</a></caption>
+ <tr>
+ <th>Hits</th>
+ <th>Misses</th>
+ <th>ByteHits</th>
+ <th>Items</th>
+ <th>Bytes</th>
+ <th>Oldest</th>
+ <th></th>
+ </tr>
+ <tr>
+ <td class="stat">{{.Hits}}</td>
+ <td class="stat">{{.Misses}}</td>
+ <td class="stat">{{.ByteHits}}</td>
+ <td class="stat">{{.Items}}</td>
+ <td class="stat">{{.Bytes}}</td>
+ <td class="stat">{{.Oldest}}</td>
+ <td><a href="?action=memcache_flush">flush</input></td>
+ </tr>
+ </table>
+ {{end}}
+
{{template "manager_list" $.Managers}}
{{template "job_list" $.Jobs}}
</body>
diff --git a/dashboard/app/main.go b/dashboard/app/main.go
index 1039d230b..270a1750b 100644
--- a/dashboard/app/main.go
+++ b/dashboard/app/main.go
@@ -19,6 +19,7 @@ import (
"golang.org/x/net/context"
db "google.golang.org/appengine/datastore"
"google.golang.org/appengine/log"
+ "google.golang.org/appengine/memcache"
)
// This file contains web UI http handlers.
@@ -58,10 +59,11 @@ type uiTerminalPage struct {
}
type uiAdminPage struct {
- Header *uiHeader
- Log []byte
- Managers []*uiManager
- Jobs *uiJobList
+ Header *uiHeader
+ Log []byte
+ Managers []*uiManager
+ Jobs *uiJobList
+ MemcacheStats *memcache.Statistics
}
type uiManager struct {
@@ -284,10 +286,23 @@ func handleAdmin(c context.Context, w http.ResponseWriter, r *http.Request) erro
if accessLevel != AccessAdmin {
return ErrAccess
}
+ switch action := r.FormValue("action"); action {
+ case "":
+ case "memcache_flush":
+ if err := memcache.Flush(c); err != nil {
+ return fmt.Errorf("failed to flush memcache: %v", err)
+ }
+ default:
+ return fmt.Errorf("unknown action %q", action)
+ }
hdr, err := commonHeader(c, r, w, "")
if err != nil {
return err
}
+ memcacheStats, err := memcache.Stats(c)
+ if err != nil {
+ return err
+ }
managers, err := loadManagers(c, accessLevel, "")
if err != nil {
return err
@@ -301,10 +316,11 @@ func handleAdmin(c context.Context, w http.ResponseWriter, r *http.Request) erro
return err
}
data := &uiAdminPage{
- Header: hdr,
- Log: errorLog,
- Managers: managers,
- Jobs: &uiJobList{Jobs: jobs},
+ Header: hdr,
+ Log: errorLog,
+ Managers: managers,
+ Jobs: &uiJobList{Jobs: jobs},
+ MemcacheStats: memcacheStats,
}
return serveTemplate(w, "admin.html", data)
}