mirror of
https://github.com/kata-containers/kata-containers.git
synced 2025-09-14 05:19:21 +00:00
Merge pull request #4062 from liubin/fix/4061-add-links-for-kata-monitor
kata-monitor: add some links when generating pages for browsers
This commit is contained in:
@@ -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
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user