mirror of https://github.com/prometheus/prometheus
Beginnings of a Prometheus status page.
parent
c3d31febd6
commit
23374788d3
|
@ -0,0 +1,28 @@
|
||||||
|
// Copyright 2013 Prometheus Team
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package appstate
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/prometheus/prometheus/config"
|
||||||
|
"github.com/prometheus/prometheus/retrieval"
|
||||||
|
"github.com/prometheus/prometheus/rules"
|
||||||
|
"github.com/prometheus/prometheus/storage/metric"
|
||||||
|
)
|
||||||
|
|
||||||
|
type ApplicationState struct {
|
||||||
|
Config *config.Config
|
||||||
|
RuleManager rules.RuleManager
|
||||||
|
Persistence metric.MetricPersistence
|
||||||
|
TargetManager retrieval.TargetManager
|
||||||
|
}
|
10
main.go
10
main.go
|
@ -15,6 +15,7 @@ package main
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"flag"
|
"flag"
|
||||||
|
"github.com/prometheus/prometheus/appstate"
|
||||||
"github.com/prometheus/prometheus/config"
|
"github.com/prometheus/prometheus/config"
|
||||||
"github.com/prometheus/prometheus/retrieval"
|
"github.com/prometheus/prometheus/retrieval"
|
||||||
"github.com/prometheus/prometheus/retrieval/format"
|
"github.com/prometheus/prometheus/retrieval/format"
|
||||||
|
@ -73,7 +74,14 @@ func main() {
|
||||||
log.Fatalf("Error loading rule files: %v", err)
|
log.Fatalf("Error loading rule files: %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
web.StartServing(persistence)
|
appState := &appstate.ApplicationState{
|
||||||
|
Config: conf,
|
||||||
|
RuleManager: ruleManager,
|
||||||
|
Persistence: persistence,
|
||||||
|
TargetManager: targetManager,
|
||||||
|
}
|
||||||
|
|
||||||
|
web.StartServing(appState)
|
||||||
|
|
||||||
for {
|
for {
|
||||||
select {
|
select {
|
||||||
|
|
|
@ -17,8 +17,8 @@ type MetricsService struct {
|
||||||
time utility.Time
|
time utility.Time
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewMetricsService(p metric.MetricPersistence) *MetricsService {
|
func NewMetricsService(persistence metric.MetricPersistence) *MetricsService {
|
||||||
return &MetricsService{
|
return &MetricsService{
|
||||||
persistence: p,
|
persistence: persistence,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,23 @@
|
||||||
|
body {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph_container {
|
||||||
|
font-family: Arial, Helvetica, sans-serif;
|
||||||
|
}
|
||||||
|
|
||||||
|
.graph {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
svg {
|
||||||
|
border: 1px solid #aaa;
|
||||||
|
margin-bottom: 5px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.legend {
|
||||||
|
display: inline-block;
|
||||||
|
vertical-align: top;
|
||||||
|
margin: 0 0 0 0px;
|
||||||
|
background-
|
||||||
|
}
|
|
@ -1,5 +1,4 @@
|
||||||
body {
|
body {
|
||||||
margin: 0;
|
|
||||||
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
|
||||||
font-size: 14px;
|
font-size: 14px;
|
||||||
line-height: 20px;
|
line-height: 20px;
|
||||||
|
@ -7,26 +6,6 @@ body {
|
||||||
background-color: #eee;
|
background-color: #eee;
|
||||||
}
|
}
|
||||||
|
|
||||||
.graph_container {
|
|
||||||
font-family: Arial, Helvetica, sans-serif;
|
|
||||||
}
|
|
||||||
|
|
||||||
.graph {
|
|
||||||
position: relative;
|
|
||||||
}
|
|
||||||
|
|
||||||
svg {
|
|
||||||
border: 1px solid #aaa;
|
|
||||||
margin-bottom: 5px;
|
|
||||||
}
|
|
||||||
|
|
||||||
.legend {
|
|
||||||
display: inline-block;
|
|
||||||
vertical-align: top;
|
|
||||||
margin: 0 0 0 0px;
|
|
||||||
background-
|
|
||||||
}
|
|
||||||
|
|
||||||
input:not([type=submit]):not([type=file]):not([type=button]) {
|
input:not([type=submit]):not([type=file]):not([type=button]) {
|
||||||
border: 1px solid #aaa;
|
border: 1px solid #aaa;
|
||||||
-webkit-border-radius: 3px;
|
-webkit-border-radius: 3px;
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
|
||||||
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js"></script>
|
<script src="//ajax.googleapis.com/ajax/libs/jqueryui/1.8.15/jquery-ui.min.js"></script>
|
||||||
<link type="text/css" rel="stylesheet" href="css/prometheus.css">
|
<link type="text/css" rel="stylesheet" href="css/prometheus.css">
|
||||||
|
<link type="text/css" rel="stylesheet" href="css/graph.css">
|
||||||
|
|
||||||
<!-- copy all these CSSen/JSen to our own location -->
|
<!-- copy all these CSSen/JSen to our own location -->
|
||||||
<link type="text/css" rel="stylesheet" href="http://code.shutterstock.com/rickshaw/rickshaw.min.css">
|
<link type="text/css" rel="stylesheet" href="http://code.shutterstock.com/rickshaw/rickshaw.min.css">
|
||||||
|
|
|
@ -4,6 +4,7 @@
|
||||||
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
<title>Prometheus Expression Browser</title>
|
<title>Prometheus Expression Browser</title>
|
||||||
<link type="text/css" rel="stylesheet" href="css/prometheus.css">
|
<link type="text/css" rel="stylesheet" href="css/prometheus.css">
|
||||||
|
<link type="text/css" rel="stylesheet" href="css/graph.css">
|
||||||
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
|
||||||
<script src="js/exprBrowser.js"></script>
|
<script src="js/exprBrowser.js"></script>
|
||||||
</head>
|
</head>
|
||||||
|
|
|
@ -0,0 +1,42 @@
|
||||||
|
// Copyright 2013 Prometheus Team
|
||||||
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
// you may not use this file except in compliance with the License.
|
||||||
|
// You may obtain a copy of the License at
|
||||||
|
//
|
||||||
|
// http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
//
|
||||||
|
// Unless required by applicable law or agreed to in writing, software
|
||||||
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
// See the License for the specific language governing permissions and
|
||||||
|
// limitations under the License.
|
||||||
|
|
||||||
|
package web
|
||||||
|
|
||||||
|
import (
|
||||||
|
"github.com/prometheus/prometheus/appstate"
|
||||||
|
"html/template"
|
||||||
|
"net/http"
|
||||||
|
)
|
||||||
|
|
||||||
|
type PrometheusStatus struct {
|
||||||
|
Status string
|
||||||
|
Config string
|
||||||
|
Rules string
|
||||||
|
Targets string
|
||||||
|
}
|
||||||
|
|
||||||
|
type StatusHandler struct {
|
||||||
|
appState *appstate.ApplicationState
|
||||||
|
}
|
||||||
|
|
||||||
|
func (h *StatusHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||||
|
status := &PrometheusStatus{
|
||||||
|
Status: "TODO: add status information here",
|
||||||
|
Config: h.appState.Config.ToString(0),
|
||||||
|
Rules: "TODO: list rules here",
|
||||||
|
Targets: "TODO: list targets here",
|
||||||
|
}
|
||||||
|
t, _ := template.ParseFiles("web/templates/status.html")
|
||||||
|
t.Execute(w, status)
|
||||||
|
}
|
|
@ -0,0 +1,33 @@
|
||||||
|
<!DOCTYPE html>
|
||||||
|
<html lang="en">
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
|
||||||
|
<title>Prometheus Status</title>
|
||||||
|
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.8.3/jquery.min.js"></script>
|
||||||
|
<link type="text/css" rel="stylesheet" href="static/css/prometheus.css">
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body>
|
||||||
|
<h2>Status</h2>
|
||||||
|
<div class="grouping_box">
|
||||||
|
{{.Status}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Configuration</h2>
|
||||||
|
<div class="grouping_box">
|
||||||
|
<pre>
|
||||||
|
{{.Config}}
|
||||||
|
</pre>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Rules</h2>
|
||||||
|
<div class="grouping_box">
|
||||||
|
{{.Rules}}
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<h2>Targets</h2>
|
||||||
|
<div class="grouping_box">
|
||||||
|
{{.Targets}}
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
</html>
|
12
web/web.go
12
web/web.go
|
@ -17,7 +17,7 @@ import (
|
||||||
"code.google.com/p/gorest"
|
"code.google.com/p/gorest"
|
||||||
"flag"
|
"flag"
|
||||||
"github.com/prometheus/client_golang"
|
"github.com/prometheus/client_golang"
|
||||||
"github.com/prometheus/prometheus/storage/metric"
|
"github.com/prometheus/prometheus/appstate"
|
||||||
"github.com/prometheus/prometheus/web/api"
|
"github.com/prometheus/prometheus/web/api"
|
||||||
"net/http"
|
"net/http"
|
||||||
_ "net/http/pprof"
|
_ "net/http/pprof"
|
||||||
|
@ -28,11 +28,13 @@ var (
|
||||||
listenAddress = flag.String("listenAddress", ":9090", "Address to listen on for web interface.")
|
listenAddress = flag.String("listenAddress", ":9090", "Address to listen on for web interface.")
|
||||||
)
|
)
|
||||||
|
|
||||||
func StartServing(persistence metric.MetricPersistence) {
|
func StartServing(appState *appstate.ApplicationState) {
|
||||||
gorest.RegisterService(api.NewMetricsService(persistence))
|
gorest.RegisterService(api.NewMetricsService(appState.Persistence))
|
||||||
|
exporter := registry.DefaultRegistry.YieldExporter()
|
||||||
|
|
||||||
http.Handle("/", gorest.Handle())
|
http.Handle("/status", &StatusHandler{appState: appState})
|
||||||
http.Handle("/metrics.json", registry.DefaultHandler)
|
http.Handle("/api/", gorest.Handle())
|
||||||
|
http.Handle("/metrics.json", exporter)
|
||||||
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("web/static"))))
|
http.Handle("/static/", http.StripPrefix("/static/", http.FileServer(http.Dir("web/static"))))
|
||||||
|
|
||||||
go http.ListenAndServe(*listenAddress, nil)
|
go http.ListenAndServe(*listenAddress, nil)
|
||||||
|
|
Loading…
Reference in New Issue