mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-06-23 22:17:19 +00:00
kata-monitor: add some links when generating pages for browsers
Add some links to rendered webpages for better user experience, let users can jump to pages only by clicking links in browsers. Fixes: #4061 Signed-off-by: bin <bin@hyper.sh>
This commit is contained in:
parent
9c1c219a3f
commit
f8cc5d1ad8
@ -175,6 +175,15 @@ func main() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func indexPage(w http.ResponseWriter, r *http.Request) {
|
func indexPage(w http.ResponseWriter, r *http.Request) {
|
||||||
|
htmlResponse := kataMonitor.IfReturnHTMLResponse(w, r)
|
||||||
|
if htmlResponse {
|
||||||
|
indexPageHTML(w, r)
|
||||||
|
} else {
|
||||||
|
indexPageText(w, r)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func indexPageText(w http.ResponseWriter, r *http.Request) {
|
||||||
w.Write([]byte("Available HTTP endpoints:\n"))
|
w.Write([]byte("Available HTTP endpoints:\n"))
|
||||||
|
|
||||||
spacing := 0
|
spacing := 0
|
||||||
@ -184,13 +193,35 @@ func indexPage(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
spacing = spacing + 3
|
spacing = spacing + 3
|
||||||
|
formatter := fmt.Sprintf("%%-%ds: %%s\n", spacing)
|
||||||
|
|
||||||
formattedString := fmt.Sprintf("%%-%ds: %%s\n", spacing)
|
|
||||||
for _, endpoint := range endpoints {
|
for _, endpoint := range endpoints {
|
||||||
w.Write([]byte(fmt.Sprintf(formattedString, endpoint.path, endpoint.desc)))
|
w.Write([]byte(fmt.Sprintf(formatter, endpoint.path, endpoint.desc)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func indexPageHTML(w http.ResponseWriter, r *http.Request) {
|
||||||
|
|
||||||
|
w.Write([]byte("<h1>Available HTTP endpoints:</h1>\n"))
|
||||||
|
|
||||||
|
var formattedString string
|
||||||
|
needLinkPaths := []string{"/metrics", "/sandboxes"}
|
||||||
|
|
||||||
|
w.Write([]byte("<ul>"))
|
||||||
|
for _, endpoint := range endpoints {
|
||||||
|
formattedString = fmt.Sprintf("<b>%s</b>: %s\n", endpoint.path, endpoint.desc)
|
||||||
|
for _, linkPath := range needLinkPaths {
|
||||||
|
if linkPath == endpoint.path {
|
||||||
|
formattedString = fmt.Sprintf("<b><a href='%s'>%s</a></b>: %s\n", endpoint.path, endpoint.path, endpoint.desc)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
formattedString = fmt.Sprintf("<li>%s</li>", formattedString)
|
||||||
|
w.Write([]byte(formattedString))
|
||||||
|
}
|
||||||
|
w.Write([]byte("</ul>"))
|
||||||
|
}
|
||||||
|
|
||||||
// initLog setup logger
|
// initLog setup logger
|
||||||
func initLog() {
|
func initLog() {
|
||||||
kataMonitorLog := logrus.WithFields(logrus.Fields{
|
kataMonitorLog := logrus.WithFields(logrus.Fields{
|
||||||
|
@ -78,6 +78,21 @@ func (km *KataMonitor) ProcessMetricsRequest(w http.ResponseWriter, r *http.Requ
|
|||||||
scrapeDurationsHistogram.Observe(float64(time.Since(start).Nanoseconds() / int64(time.Millisecond)))
|
scrapeDurationsHistogram.Observe(float64(time.Since(start).Nanoseconds() / int64(time.Millisecond)))
|
||||||
}()
|
}()
|
||||||
|
|
||||||
|
// this is likely the same as `kata-runtime metrics <SANDBOX>`.
|
||||||
|
sandboxID, err := getSandboxIDFromReq(r)
|
||||||
|
if err == nil && sandboxID != "" {
|
||||||
|
metrics, err := GetSandboxMetrics(sandboxID)
|
||||||
|
if err != nil {
|
||||||
|
w.WriteHeader(http.StatusInternalServerError)
|
||||||
|
w.Write([]byte(err.Error()))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
w.Write([]byte(metrics))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
// if no sandbox provided, will get all sandbox's metrics.
|
||||||
|
|
||||||
// prepare writer for writing response.
|
// prepare writer for writing response.
|
||||||
contentType := expfmt.Negotiate(r.Header)
|
contentType := expfmt.Negotiate(r.Header)
|
||||||
|
|
||||||
|
@ -27,6 +27,7 @@ const (
|
|||||||
RuntimeCRIO = "cri-o"
|
RuntimeCRIO = "cri-o"
|
||||||
fsMonitorRetryDelaySeconds = 60
|
fsMonitorRetryDelaySeconds = 60
|
||||||
podCacheRefreshDelaySeconds = 5
|
podCacheRefreshDelaySeconds = 5
|
||||||
|
contentTypeHtml = "text/html"
|
||||||
)
|
)
|
||||||
|
|
||||||
// SetLogger sets the logger for katamonitor package.
|
// SetLogger sets the logger for katamonitor package.
|
||||||
@ -194,7 +195,41 @@ func (km *KataMonitor) GetAgentURL(w http.ResponseWriter, r *http.Request) {
|
|||||||
// ListSandboxes list all sandboxes running in Kata
|
// ListSandboxes list all sandboxes running in Kata
|
||||||
func (km *KataMonitor) ListSandboxes(w http.ResponseWriter, r *http.Request) {
|
func (km *KataMonitor) ListSandboxes(w http.ResponseWriter, r *http.Request) {
|
||||||
sandboxes := km.sandboxCache.getSandboxList()
|
sandboxes := km.sandboxCache.getSandboxList()
|
||||||
|
htmlResponse := IfReturnHTMLResponse(w, r)
|
||||||
|
if htmlResponse {
|
||||||
|
listSandboxesHtml(sandboxes, w)
|
||||||
|
} else {
|
||||||
|
listSandboxesText(sandboxes, w)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func listSandboxesText(sandboxes []string, w http.ResponseWriter) {
|
||||||
for _, s := range sandboxes {
|
for _, s := range sandboxes {
|
||||||
w.Write([]byte(fmt.Sprintf("%s\n", s)))
|
w.Write([]byte(fmt.Sprintf("%s\n", s)))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
func listSandboxesHtml(sandboxes []string, w http.ResponseWriter) {
|
||||||
|
w.Write([]byte("<h1>Sandbox list</h1>\n"))
|
||||||
|
w.Write([]byte("<ul>\n"))
|
||||||
|
for _, s := range sandboxes {
|
||||||
|
w.Write([]byte(fmt.Sprintf("<li>%s: <a href='/debug/pprof/?sandbox=%s'>pprof</a>, <a href='/metrics?sandbox=%s'>metrics</a>, <a href='/agent-url?sandbox=%s'>agent-url</a></li>\n", s, s, s, s)))
|
||||||
|
}
|
||||||
|
w.Write([]byte("</ul>\n"))
|
||||||
|
}
|
||||||
|
|
||||||
|
// IfReturnHTMLResponse returns true if request accepts html response
|
||||||
|
// NOTE: IfReturnHTMLResponse will also set response header to `text/html`
|
||||||
|
func IfReturnHTMLResponse(w http.ResponseWriter, r *http.Request) bool {
|
||||||
|
accepts := r.Header["Accept"]
|
||||||
|
for _, accept := range accepts {
|
||||||
|
fields := strings.Split(accept, ",")
|
||||||
|
for _, field := range fields {
|
||||||
|
if field == contentTypeHtml {
|
||||||
|
w.Header().Set("Content-Type", contentTypeHtml)
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
@ -55,8 +55,10 @@ func (km *KataMonitor) proxyRequest(w http.ResponseWriter, r *http.Request) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
uri := fmt.Sprintf("http://shim%s", r.URL.String())
|
uri := fmt.Sprintf("http://shim%s", r.URL.String())
|
||||||
|
monitorLog.Debugf("proxyRequest to: %s, uri: %s", socketAddress, uri)
|
||||||
resp, err := client.Get(uri)
|
resp, err := client.Get(uri)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
serveError(w, http.StatusInternalServerError, fmt.Sprintf("failed to request %s through %s", uri, socketAddress))
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user