v1.27.0-a #10
@ -173,6 +173,7 @@ retryRecordCompletion:
|
|||||||
cm, err := h.TaskEngine.db.BeginTransaction(h.TaskEngine.ctx, func(tx *harmonydb.Tx) (bool, error) {
|
cm, err := h.TaskEngine.db.BeginTransaction(h.TaskEngine.ctx, func(tx *harmonydb.Tx) (bool, error) {
|
||||||
var postedTime time.Time
|
var postedTime time.Time
|
||||||
err := tx.QueryRow(`SELECT posted_time FROM harmony_task WHERE id=$1`, tID).Scan(&postedTime)
|
err := tx.QueryRow(`SELECT posted_time FROM harmony_task WHERE id=$1`, tID).Scan(&postedTime)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return false, fmt.Errorf("could not log completion: %w ", err)
|
return false, fmt.Errorf("could not log completion: %w ", err)
|
||||||
}
|
}
|
||||||
|
@ -32,6 +32,7 @@ func Routes(r *mux.Router, deps *deps.Deps) error {
|
|||||||
r.HandleFunc("/simpleinfo/machines", a.indexMachines)
|
r.HandleFunc("/simpleinfo/machines", a.indexMachines)
|
||||||
r.HandleFunc("/simpleinfo/tasks", a.indexTasks)
|
r.HandleFunc("/simpleinfo/tasks", a.indexTasks)
|
||||||
r.HandleFunc("/simpleinfo/taskhistory", a.indexTasksHistory)
|
r.HandleFunc("/simpleinfo/taskhistory", a.indexTasksHistory)
|
||||||
|
r.HandleFunc("/simpleinfo/pipeline-porep", a.indexPipelinePorep)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -3,6 +3,7 @@ package hapi
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"github.com/filecoin-project/lotus/api/v1api"
|
"github.com/filecoin-project/lotus/api/v1api"
|
||||||
|
"golang.org/x/xerrors"
|
||||||
"html/template"
|
"html/template"
|
||||||
"net/http"
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
@ -81,6 +82,17 @@ func (a *app) indexTasksHistory(w http.ResponseWriter, r *http.Request) {
|
|||||||
a.executeTemplate(w, "cluster_task_history", s)
|
a.executeTemplate(w, "cluster_task_history", s)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (a *app) indexPipelinePorep(w http.ResponseWriter, r *http.Request) {
|
||||||
|
s, err := a.porepPipelineSummary(r.Context())
|
||||||
|
if err != nil {
|
||||||
|
log.Errorf("porep pipeline summary: %v", err)
|
||||||
|
http.Error(w, "internal server error", http.StatusInternalServerError)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
a.executeTemplate(w, "pipeline_porep", s)
|
||||||
|
}
|
||||||
|
|
||||||
var templateDev = os.Getenv("LOTUS_WEB_DEV") == "1"
|
var templateDev = os.Getenv("LOTUS_WEB_DEV") == "1"
|
||||||
|
|
||||||
func (a *app) executeTemplate(w http.ResponseWriter, name string, data interface{}) {
|
func (a *app) executeTemplate(w http.ResponseWriter, name string, data interface{}) {
|
||||||
@ -111,7 +123,7 @@ type taskHistorySummary struct {
|
|||||||
Name string
|
Name string
|
||||||
TaskID int64
|
TaskID int64
|
||||||
|
|
||||||
Posted, Start, End string
|
Posted, Start, Queued, Took string
|
||||||
|
|
||||||
Result bool
|
Result bool
|
||||||
Err string
|
Err string
|
||||||
@ -181,11 +193,67 @@ func (a *app) clusterTaskHistorySummary(ctx context.Context) ([]taskHistorySumma
|
|||||||
return nil, err // Handle error
|
return nil, err // Handle error
|
||||||
}
|
}
|
||||||
|
|
||||||
t.Posted = posted.Round(time.Second).Format("02 Jan 06 15:04")
|
t.Posted = posted.Local().Round(time.Second).Format("02 Jan 06 15:04")
|
||||||
t.Start = start.Round(time.Second).Format("02 Jan 06 15:04")
|
t.Start = start.Local().Round(time.Second).Format("02 Jan 06 15:04")
|
||||||
t.End = end.Round(time.Second).Format("02 Jan 06 15:04")
|
//t.End = end.Local().Round(time.Second).Format("02 Jan 06 15:04")
|
||||||
|
|
||||||
|
t.Queued = start.Sub(posted).Round(time.Second).String()
|
||||||
|
if t.Queued == "0s" {
|
||||||
|
t.Queued = start.Sub(posted).Round(time.Millisecond).String()
|
||||||
|
}
|
||||||
|
|
||||||
|
t.Took = end.Sub(start).Round(time.Second).String()
|
||||||
|
if t.Took == "0s" {
|
||||||
|
t.Took = end.Sub(start).Round(time.Millisecond).String()
|
||||||
|
}
|
||||||
|
|
||||||
summaries = append(summaries, t)
|
summaries = append(summaries, t)
|
||||||
}
|
}
|
||||||
return summaries, nil
|
return summaries, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type porepPipelineSummary struct {
|
||||||
|
Actor string
|
||||||
|
|
||||||
|
CountSDR int
|
||||||
|
CountTrees int
|
||||||
|
CountPrecommitMsg int
|
||||||
|
CountWaitSeed int
|
||||||
|
CountPoRep int
|
||||||
|
CountCommitMsg int
|
||||||
|
CountDone int
|
||||||
|
CountFailed int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (a *app) porepPipelineSummary(ctx context.Context) ([]porepPipelineSummary, error) {
|
||||||
|
rows, err := a.db.Query(ctx, `
|
||||||
|
SELECT
|
||||||
|
sp_id,
|
||||||
|
COUNT(*) FILTER (WHERE after_sdr = true AND after_tree_d = false) as CountSDR,
|
||||||
|
COUNT(*) FILTER (WHERE (after_tree_d = true OR after_tree_c = true OR after_tree_r = true) AND after_precommit_msg = false) as CountTrees,
|
||||||
|
COUNT(*) FILTER (WHERE after_precommit_msg = true AND after_precommit_msg_success = false) as CountPrecommitMsg,
|
||||||
|
COUNT(*) FILTER (WHERE after_precommit_msg_success = true AND after_porep = false) as CountWaitSeed,
|
||||||
|
COUNT(*) FILTER (WHERE after_porep = true AND after_commit_msg = false) as CountPoRep,
|
||||||
|
COUNT(*) FILTER (WHERE after_commit_msg = true AND after_commit_msg_success = false) as CountCommitMsg,
|
||||||
|
COUNT(*) FILTER (WHERE after_commit_msg_success = true) as CountDone,
|
||||||
|
COUNT(*) FILTER (WHERE failed = true) as CountFailed
|
||||||
|
FROM
|
||||||
|
sectors_sdr_pipeline
|
||||||
|
GROUP BY sp_id`)
|
||||||
|
if err != nil {
|
||||||
|
return nil, xerrors.Errorf("query: %w", err)
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
|
||||||
|
var summaries []porepPipelineSummary
|
||||||
|
for rows.Next() {
|
||||||
|
var summary porepPipelineSummary
|
||||||
|
if err := rows.Scan(&summary.Actor, &summary.CountSDR, &summary.CountTrees, &summary.CountPrecommitMsg, &summary.CountWaitSeed, &summary.CountPoRep, &summary.CountCommitMsg, &summary.CountDone, &summary.CountFailed); err != nil {
|
||||||
|
return nil, xerrors.Errorf("scan: %w", err)
|
||||||
|
}
|
||||||
|
summary.Actor = "f0" + summary.Actor
|
||||||
|
|
||||||
|
summaries = append(summaries, summary)
|
||||||
|
}
|
||||||
|
return summaries, nil
|
||||||
|
}
|
||||||
|
@ -6,7 +6,8 @@
|
|||||||
<td>{{.CompletedBy}}</td>
|
<td>{{.CompletedBy}}</td>
|
||||||
<td>{{.Posted}}</td>
|
<td>{{.Posted}}</td>
|
||||||
<td>{{.Start}}</td>
|
<td>{{.Start}}</td>
|
||||||
<td>{{.End}}</td>
|
<td>{{.Queued}}</td>
|
||||||
|
<td>{{.Took}}</td>
|
||||||
<td>{{if .Result}}<span class="success">success</span>{{else}}<span class="error">error</span>{{end}}</td>
|
<td>{{if .Result}}<span class="success">success</span>{{else}}<span class="error">error</span>{{end}}</td>
|
||||||
<td style="max-width: 25vh">
|
<td style="max-width: 25vh">
|
||||||
<div style="overflow: hidden; white-space: nowrap; text-overflow: ellipsis" title="{{.Err}}">
|
<div style="overflow: hidden; white-space: nowrap; text-overflow: ellipsis" title="{{.Err}}">
|
||||||
|
15
provider/lpweb/hapi/web/pipline_porep.gohtml
Normal file
15
provider/lpweb/hapi/web/pipline_porep.gohtml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
{{define "pipeline_porep"}}
|
||||||
|
{{range .}}
|
||||||
|
<tr>
|
||||||
|
<td><b>{{.Actor}}</b></td>
|
||||||
|
<td {{if ne .CountSDR 0}}class="success"{{end}}>{{.CountSDR}}</td>
|
||||||
|
<td {{if ne .CountTrees 0}}class="success"{{end}}>{{.CountTrees}}</td>
|
||||||
|
<td {{if ne .CountPrecommitMsg 0}}class="success"{{end}}>{{.CountPrecommitMsg}}</td>
|
||||||
|
<td {{if ne .CountWaitSeed 0}}class="success"{{end}}>{{.CountWaitSeed}}</td>
|
||||||
|
<td {{if ne .CountPoRep 0}}class="success"{{end}}>{{.CountPoRep}}</td>
|
||||||
|
<td {{if ne .CountCommitMsg 0}}class="success"{{end}}>{{.CountCommitMsg}}</td>
|
||||||
|
<td>{{.CountDone}}</td>
|
||||||
|
<td>{{.CountFailed}}</td>
|
||||||
|
</tr>
|
||||||
|
{{end}}
|
||||||
|
{{end}}
|
@ -3,6 +3,7 @@
|
|||||||
<title>Lotus Provider Cluster Overview</title>
|
<title>Lotus Provider Cluster Overview</title>
|
||||||
<script src="https://unpkg.com/htmx.org@1.9.5" integrity="sha384-xcuj3WpfgjlKF+FXhSQFQ0ZNr39ln+hwjN3npfM9VBnUskLolQAcN80McRIVOPuO" crossorigin="anonymous"></script>
|
<script src="https://unpkg.com/htmx.org@1.9.5" integrity="sha384-xcuj3WpfgjlKF+FXhSQFQ0ZNr39ln+hwjN3npfM9VBnUskLolQAcN80McRIVOPuO" crossorigin="anonymous"></script>
|
||||||
<script type="module" src="chain-connectivity.js"></script>
|
<script type="module" src="chain-connectivity.js"></script>
|
||||||
|
<link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/hack-font@3.3.0/build/web/hack-subset.css'>
|
||||||
<style>
|
<style>
|
||||||
html, body {
|
html, body {
|
||||||
background: #0f0f0f;
|
background: #0f0f0f;
|
||||||
@ -10,7 +11,7 @@
|
|||||||
padding: 0;
|
padding: 0;
|
||||||
margin: 0;
|
margin: 0;
|
||||||
|
|
||||||
font-family: monospace;
|
font-family: 'Hack', monospace;
|
||||||
}
|
}
|
||||||
|
|
||||||
table td, table th {
|
table td, table th {
|
||||||
@ -54,7 +55,7 @@
|
|||||||
}
|
}
|
||||||
|
|
||||||
.success {
|
.success {
|
||||||
color: green;
|
color: greenyellow;
|
||||||
}
|
}
|
||||||
.warning {
|
.warning {
|
||||||
color: yellow;
|
color: yellow;
|
||||||
@ -121,22 +122,6 @@
|
|||||||
<chain-connectivity></chain-connectivity>
|
<chain-connectivity></chain-connectivity>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
<div class="info-block">
|
|
||||||
<h2>Actor Summary</h2>
|
|
||||||
<table>
|
|
||||||
<thead>
|
|
||||||
<tr>
|
|
||||||
<th>Address</th>
|
|
||||||
<th>Config Layers</th>
|
|
||||||
<th>QaP</th>
|
|
||||||
<th>Deadlines</th>
|
|
||||||
</tr>
|
|
||||||
</thead>
|
|
||||||
<tbody hx-get="/hapi/simpleinfo/actorsummary" hx-trigger="load,every 5s">
|
|
||||||
</tbody>
|
|
||||||
</table>
|
|
||||||
</div>
|
|
||||||
<hr>
|
|
||||||
<div class="info-block">
|
<div class="info-block">
|
||||||
<h2>Cluster Machines</h2>
|
<h2>Cluster Machines</h2>
|
||||||
<table>
|
<table>
|
||||||
@ -153,6 +138,43 @@
|
|||||||
</table>
|
</table>
|
||||||
</div>
|
</div>
|
||||||
<hr>
|
<hr>
|
||||||
|
<div class="info-block">
|
||||||
|
<h2>PoRep Pipeline</h2>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Address</th>
|
||||||
|
<th>SDR</th>
|
||||||
|
<th>Trees</th>
|
||||||
|
<th>Precommit Msg</th>
|
||||||
|
<th>Wait Seed</th>
|
||||||
|
<th>PoRep</th>
|
||||||
|
<th>Commit Msg</th>
|
||||||
|
<th>Done</th>
|
||||||
|
<th>Failed</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody hx-get="/hapi/simpleinfo/pipeline-porep" hx-trigger="load,every 5s">
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
|
<div class="info-block">
|
||||||
|
<h2>Actor Summary</h2>
|
||||||
|
<table>
|
||||||
|
<thead>
|
||||||
|
<tr>
|
||||||
|
<th>Address</th>
|
||||||
|
<th>Config Layers</th>
|
||||||
|
<th>QaP</th>
|
||||||
|
<th>Deadlines</th>
|
||||||
|
</tr>
|
||||||
|
</thead>
|
||||||
|
<tbody hx-get="/hapi/simpleinfo/actorsummary" hx-trigger="load,every 5s">
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<hr>
|
||||||
<div class="info-block">
|
<div class="info-block">
|
||||||
<h2>Recently Finished Tasks</h2>
|
<h2>Recently Finished Tasks</h2>
|
||||||
<table>
|
<table>
|
||||||
@ -163,7 +185,8 @@
|
|||||||
<th>Executor</th>
|
<th>Executor</th>
|
||||||
<th>Posted</th>
|
<th>Posted</th>
|
||||||
<th>Start</th>
|
<th>Start</th>
|
||||||
<th>End</th>
|
<th>Queued</th>
|
||||||
|
<th>Took</th>
|
||||||
<th>Outcome</th>
|
<th>Outcome</th>
|
||||||
<th>Message</th>
|
<th>Message</th>
|
||||||
</tr>
|
</tr>
|
||||||
|
Loading…
Reference in New Issue
Block a user