X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c6c3d3c8748b59ca0e8a9d5cfec0a54bdfd212f0..50128b53da4003912635b03fb27b5be2c5beaca1:/services/keepstore/handlers.go?ds=inline diff --git a/services/keepstore/handlers.go b/services/keepstore/handlers.go index 289dce15a0..b51009ea4d 100644 --- a/services/keepstore/handlers.go +++ b/services/keepstore/handlers.go @@ -46,6 +46,9 @@ func MakeRESTRouter() *mux.Router { // Privileged client only. rest.HandleFunc(`/index/{prefix:[0-9a-f]{0,32}}`, IndexHandler).Methods("GET", "HEAD") + // Internals/debugging info (runtime.MemStats) + rest.HandleFunc(`/debug.json`, DebugHandler).Methods("GET", "HEAD") + // List volumes: path, device number, bytes used/avail. rest.HandleFunc(`/status.json`, StatusHandler).Methods("GET", "HEAD") @@ -239,18 +242,6 @@ func IndexHandler(resp http.ResponseWriter, req *http.Request) { resp.Write([]byte{'\n'}) } -// StatusHandler -// Responds to /status.json requests with the current node status, -// described in a JSON structure. -// -// The data given in a status.json response includes: -// volumes - a list of Keep volumes currently in use by this server -// each volume is an object with the following fields: -// * mount_point -// * device_num (an integer identifying the underlying filesystem) -// * bytes_free -// * bytes_used - // PoolStatus struct type PoolStatus struct { Alloc uint64 `json:"BytesAllocated"` @@ -258,18 +249,37 @@ type PoolStatus struct { Len int `json:"BuffersInUse"` } +type volumeStatusEnt struct { + Label string + Status *VolumeStatus `json:",omitempty"` + VolumeStats *ioStats `json:",omitempty"` + InternalStats interface{} `json:",omitempty"` +} + // NodeStatus struct type NodeStatus struct { - Volumes []*VolumeStatus `json:"volumes"` + Volumes []*volumeStatusEnt BufferPool PoolStatus PullQueue WorkQueueStatus TrashQueue WorkQueueStatus - Memory runtime.MemStats } var st NodeStatus var stLock sync.Mutex +// DebugHandler addresses /debug.json requests. +func DebugHandler(resp http.ResponseWriter, req *http.Request) { + type debugStats struct { + MemStats runtime.MemStats + } + var ds debugStats + runtime.ReadMemStats(&ds.MemStats) + err := json.NewEncoder(resp).Encode(&ds) + if err != nil { + http.Error(resp, err.Error(), 500) + } +} + // StatusHandler addresses /status.json requests. func StatusHandler(resp http.ResponseWriter, req *http.Request) { stLock.Lock() @@ -289,20 +299,26 @@ func StatusHandler(resp http.ResponseWriter, req *http.Request) { func readNodeStatus(st *NodeStatus) { vols := KeepVM.AllReadable() if cap(st.Volumes) < len(vols) { - st.Volumes = make([]*VolumeStatus, len(vols)) + st.Volumes = make([]*volumeStatusEnt, len(vols)) } st.Volumes = st.Volumes[:0] for _, vol := range vols { - if s := vol.Status(); s != nil { - st.Volumes = append(st.Volumes, s) + var internalStats interface{} + if vol, ok := vol.(InternalStatser); ok { + internalStats = vol.InternalStats() } + st.Volumes = append(st.Volumes, &volumeStatusEnt{ + Label: vol.String(), + Status: vol.Status(), + InternalStats: internalStats, + //VolumeStats: KeepVM.VolumeStats(vol), + }) } st.BufferPool.Alloc = bufs.Alloc() st.BufferPool.Cap = bufs.Cap() st.BufferPool.Len = bufs.Len() st.PullQueue = getWorkQueueStatus(pullq) st.TrashQueue = getWorkQueueStatus(trashq) - runtime.ReadMemStats(&st.Memory) } // return a WorkQueueStatus for the given queue. If q is nil (which