|
|
@ -18,8 +18,8 @@ import (
|
|
|
|
// App context
|
|
|
|
// App context
|
|
|
|
type App struct {
|
|
|
|
type App struct {
|
|
|
|
cli *cli.App
|
|
|
|
cli *cli.App
|
|
|
|
client *client.Client
|
|
|
|
Client *client.Client
|
|
|
|
out io.Writer
|
|
|
|
Out io.Writer
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
var (
|
|
|
|
var (
|
|
|
@ -60,7 +60,7 @@ var (
|
|
|
|
func New() *App {
|
|
|
|
func New() *App {
|
|
|
|
cliapp := cli.NewApp()
|
|
|
|
cliapp := cli.NewApp()
|
|
|
|
app := &App{
|
|
|
|
app := &App{
|
|
|
|
out: os.Stdout,
|
|
|
|
Out: os.Stdout,
|
|
|
|
cli: cliapp,
|
|
|
|
cli: cliapp,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -79,19 +79,19 @@ func New() *App {
|
|
|
|
cli.Command{
|
|
|
|
cli.Command{
|
|
|
|
Name: "print",
|
|
|
|
Name: "print",
|
|
|
|
Usage: "pretty prints api result",
|
|
|
|
Usage: "pretty prints api result",
|
|
|
|
Action: app.actionPrint,
|
|
|
|
Action: app.ActionPrint,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
cli.Command{
|
|
|
|
cli.Command{
|
|
|
|
Name: "export",
|
|
|
|
Name: "export",
|
|
|
|
Usage: "runs http exporter for prometheus",
|
|
|
|
Usage: "runs http exporter for prometheus",
|
|
|
|
Action: app.actionMetrics,
|
|
|
|
Action: app.ActionMetrics,
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
Flags: []cli.Flag{
|
|
|
|
FlagInterface,
|
|
|
|
FlagInterface,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
},
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
app.cli.Before = app.before
|
|
|
|
app.cli.Before = app.Before
|
|
|
|
return app
|
|
|
|
return app
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -101,8 +101,8 @@ func (a *App) Run(args []string) error {
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// Before sets up app
|
|
|
|
// Before sets up app
|
|
|
|
func (a *App) before(ctx *cli.Context) error {
|
|
|
|
func (a *App) Before(ctx *cli.Context) error {
|
|
|
|
a.client = &client.Client{
|
|
|
|
a.Client = &client.Client{
|
|
|
|
URL: url.URL{
|
|
|
|
URL: url.URL{
|
|
|
|
Scheme: ctx.String("scheme"),
|
|
|
|
Scheme: ctx.String("scheme"),
|
|
|
|
Host: ctx.String("host"),
|
|
|
|
Host: ctx.String("host"),
|
|
|
@ -112,40 +112,48 @@ func (a *App) before(ctx *cli.Context) error {
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (a *App) actionPrint(_ *cli.Context) error {
|
|
|
|
// ActionPrint prints api result
|
|
|
|
node, err := a.client.Fetch()
|
|
|
|
func (a *App) ActionPrint(_ *cli.Context) error {
|
|
|
|
|
|
|
|
node, err := a.Client.Fetch()
|
|
|
|
if err != nil {
|
|
|
|
if err != nil {
|
|
|
|
return err
|
|
|
|
return err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
fmt.Fprint(a.out, node.Stringify())
|
|
|
|
fmt.Print(a.Out, node.Stringify())
|
|
|
|
return nil
|
|
|
|
return nil
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
func (a *App) actionMetrics(ctx *cli.Context) error {
|
|
|
|
// ActionMetrics serves http
|
|
|
|
|
|
|
|
func (a *App) ActionMetrics(ctx *cli.Context) error {
|
|
|
|
addr := ctx.String("http")
|
|
|
|
addr := ctx.String("http")
|
|
|
|
http.HandleFunc("/metrics", func(resp http.ResponseWriter, req *http.Request) {
|
|
|
|
http.HandleFunc("/metrics", a.HandleMetrics)
|
|
|
|
log.Println("GET /metrics")
|
|
|
|
log.Println(a.Out, "listen on: "+addr)
|
|
|
|
root, err := a.client.Fetch()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
vals, err := root.Values()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
collection := metrics.FromVals(vals)
|
|
|
|
|
|
|
|
registry := prometheus.NewRegistry()
|
|
|
|
|
|
|
|
if err := registry.Register(collection); err != nil {
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handler := promhttp.HandlerFor(registry, promhttp.HandlerOpts{
|
|
|
|
|
|
|
|
Registry: registry,
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handler.ServeHTTP(resp, req)
|
|
|
|
|
|
|
|
registry.Unregister(collection)
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
log.Println("listen on: " + addr)
|
|
|
|
|
|
|
|
return http.ListenAndServe(addr, nil)
|
|
|
|
return http.ListenAndServe(addr, nil)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// HandleMetrics handler
|
|
|
|
|
|
|
|
func (a *App) HandleMetrics(resp http.ResponseWriter, req *http.Request) {
|
|
|
|
|
|
|
|
log.Println("GET /metrics")
|
|
|
|
|
|
|
|
root, err := a.Client.Fetch()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
http.Error(resp, err.Error(), http.StatusInternalServerError)
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
vals, err := root.Values()
|
|
|
|
|
|
|
|
if err != nil {
|
|
|
|
|
|
|
|
http.Error(resp, err.Error(), http.StatusInternalServerError)
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
collection := metrics.FromVals(vals)
|
|
|
|
|
|
|
|
registry := prometheus.NewRegistry()
|
|
|
|
|
|
|
|
if err := registry.Register(collection); err != nil {
|
|
|
|
|
|
|
|
http.Error(resp, err.Error(), http.StatusInternalServerError)
|
|
|
|
|
|
|
|
return
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handler := promhttp.HandlerFor(registry, promhttp.HandlerOpts{
|
|
|
|
|
|
|
|
Registry: registry,
|
|
|
|
|
|
|
|
})
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
handler.ServeHTTP(resp, req)
|
|
|
|
|
|
|
|
registry.Unregister(collection)
|
|
|
|
|
|
|
|
}
|
|
|
|