Implement target selection, autodiscovery via aggregator, implement listTargets
This commit is contained in:
@@ -76,6 +76,7 @@ type PageData struct {
|
||||
Breadcrumbs []Crumb
|
||||
Windows []Tab
|
||||
GroupBys []Tab
|
||||
Targets []Tab // source/target picker; empty when only one target available
|
||||
RefreshSecs int
|
||||
Error string
|
||||
FilterExpr string // current filter serialised to mini-language for the input box
|
||||
@@ -340,6 +341,38 @@ func buildGroupByTabs(p QueryParams) []Tab {
|
||||
return tabs
|
||||
}
|
||||
|
||||
// buildTargetTabs builds the source/target picker tabs from a ListTargets response.
|
||||
// Returns nil (hide picker) when only one endpoint is reachable.
|
||||
func (h *Handler) buildTargetTabs(p QueryParams, lt *pb.ListTargetsResponse) []Tab {
|
||||
// "all" always points at the configured aggregator default.
|
||||
allTab := Tab{
|
||||
Label: "all",
|
||||
URL: p.buildURL(map[string]string{"target": h.defaultTarget}),
|
||||
Active: p.Target == h.defaultTarget,
|
||||
}
|
||||
|
||||
var collectorTabs []Tab
|
||||
if lt != nil {
|
||||
for _, t := range lt.Targets {
|
||||
addr := t.Addr
|
||||
if addr == "" {
|
||||
addr = p.Target // collector reporting itself; addr is the current target
|
||||
}
|
||||
collectorTabs = append(collectorTabs, Tab{
|
||||
Label: t.Name,
|
||||
URL: p.buildURL(map[string]string{"target": addr}),
|
||||
Active: p.Target == addr,
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
// Only render the picker when there is more than one choice.
|
||||
if len(collectorTabs) == 0 {
|
||||
return nil
|
||||
}
|
||||
return append([]Tab{allTab}, collectorTabs...)
|
||||
}
|
||||
|
||||
func buildTableRows(entries []*pb.TopNEntry, p QueryParams) ([]TableRow, int64) {
|
||||
if len(entries) == 0 {
|
||||
return nil, 0
|
||||
@@ -410,6 +443,7 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
topNCh := make(chan topNResult, 1)
|
||||
trendCh := make(chan trendResult, 1)
|
||||
ltCh := make(chan *pb.ListTargetsResponse, 1)
|
||||
|
||||
go func() {
|
||||
resp, err := client.TopN(ctx, &pb.TopNRequest{
|
||||
@@ -427,9 +461,18 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
})
|
||||
trendCh <- trendResult{resp, err}
|
||||
}()
|
||||
go func() {
|
||||
resp, err := client.ListTargets(ctx, &pb.ListTargetsRequest{})
|
||||
if err != nil {
|
||||
ltCh <- nil
|
||||
} else {
|
||||
ltCh <- resp
|
||||
}
|
||||
}()
|
||||
|
||||
tn := <-topNCh
|
||||
tr := <-trendCh
|
||||
lt := <-ltCh
|
||||
|
||||
if tn.err != nil {
|
||||
h.render(w, http.StatusBadGateway, h.errorPage(params,
|
||||
@@ -459,6 +502,7 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
|
||||
Breadcrumbs: buildCrumbs(params),
|
||||
Windows: buildWindowTabs(params),
|
||||
GroupBys: buildGroupByTabs(params),
|
||||
Targets: h.buildTargetTabs(params, lt),
|
||||
RefreshSecs: h.refreshSecs,
|
||||
FilterExpr: filterExprInput,
|
||||
FilterErr: filterErr,
|
||||
|
||||
Reference in New Issue
Block a user