Skip to content

Commit

Permalink
Merge pull request #43 from SiaFoundation/nate/metrics-improvements
Browse files Browse the repository at this point in the history
api,metrics: performance and usability fixes
  • Loading branch information
n8maninger committed May 2, 2023
2 parents 32e397f + 4ea1ea2 commit 5b9bc3c
Show file tree
Hide file tree
Showing 5 changed files with 194 additions and 145 deletions.
4 changes: 2 additions & 2 deletions api/api.go
Original file line number Diff line number Diff line change
Expand Up @@ -42,8 +42,8 @@ type (

// Metrics retrieves metrics related to the host
Metrics interface {
// PeriodMetrics returns aggregated metrics for the period between start and end.
PeriodMetrics(start, end time.Time, interval metrics.Interval) (period []metrics.Metrics, err error)
// PeriodMetrics returns metrics for n periods starting at start.
PeriodMetrics(start time.Time, periods int, interval metrics.Interval) (period []metrics.Metrics, err error)
// Metrics returns aggregated metrics for the host as of the timestamp.
Metrics(time.Time) (m metrics.Metrics, err error)
}
Expand Down
9 changes: 5 additions & 4 deletions api/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package api
import (
"fmt"
"net/url"
"strconv"
"strings"
"time"

Expand Down Expand Up @@ -87,11 +88,11 @@ func (c *Client) Metrics(at time.Time) (metrics metrics.Metrics, err error) {
return
}

// PeriodMetrics returns the metrics of the host for the specified period
func (c *Client) PeriodMetrics(start, end time.Time, interval metrics.Interval) (periods []metrics.Metrics, err error) {
// PeriodMetrics returns the metrics of the host for n periods starting at start.
func (c *Client) PeriodMetrics(start time.Time, n int, interval metrics.Interval) (periods []metrics.Metrics, err error) {
v := url.Values{
"start": []string{start.Format(time.RFC3339)},
"end": []string{end.Format(time.RFC3339)},
"start": []string{start.Format(time.RFC3339)},
"periods": []string{strconv.Itoa(n)},
}
err = c.c.GET("/metrics/"+interval.String()+"?"+v.Encode(), &periods)
return
Expand Down
18 changes: 11 additions & 7 deletions api/endpoints.go
Original file line number Diff line number Diff line change
Expand Up @@ -162,19 +162,23 @@ func (a *api) handleGETPeriodMetrics(c jape.Context) {
if err := c.DecodeParam("period", &interval); err != nil {
c.Error(fmt.Errorf("failed to parse period: %w", err), http.StatusBadRequest)
}
var start, end time.Time
if len(c.Request.FormValue("start")) == 0 || len(c.Request.FormValue("end")) == 0 {
c.Error(fmt.Errorf("start and end time must be specified"), http.StatusBadRequest)
return
} else if err := c.DecodeForm("start", &start); err != nil {
var start time.Time
var periods int
if err := c.DecodeForm("start", &start); err != nil {
c.Error(fmt.Errorf("failed to parse start time: %w", err), http.StatusBadRequest)
return
} else if err := c.DecodeForm("end", &end); err != nil {
} else if err := c.DecodeForm("periods", &periods); err != nil {
c.Error(fmt.Errorf("failed to parse end time: %w", err), http.StatusBadRequest)
return
} else if start.IsZero() {
c.Error(errors.New("start time cannot be zero"), http.StatusBadRequest)
return
} else if periods <= 0 {
c.Error(errors.New("periods must be greater than zero"), http.StatusBadRequest)
return
}

period, err := a.metrics.PeriodMetrics(start, end, interval)
period, err := a.metrics.PeriodMetrics(start, periods, interval)
if !a.checkServerError(c, "failed to get metrics", err) {
return
}
Expand Down
10 changes: 5 additions & 5 deletions host/metrics/metrics.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import (
type (
// A Store retrieves metrics
Store interface {
// PeriodMetrics returns aggregated metrics for the period between start and end.
PeriodMetrics(start, end time.Time, interval Interval) (period []Metrics, err error)
// PeriodMetrics returns metrics for n periods starting at start.
PeriodMetrics(start time.Time, n int, interval Interval) (period []Metrics, err error)
// Metrics returns aggregated metrics for the host as of the timestamp.
Metrics(time.Time) (m Metrics, err error)
}
Expand All @@ -19,9 +19,9 @@ type (
}
)

// PeriodMetrics returns aggregated PeriodMetrics for the period between start and end.
func (mm *MetricManager) PeriodMetrics(start, end time.Time, interval Interval) (period []Metrics, err error) {
return mm.store.PeriodMetrics(start, end, interval)
// PeriodMetrics returns metrics for n periods starting at start.
func (mm *MetricManager) PeriodMetrics(start time.Time, periods int, interval Interval) ([]Metrics, error) {
return mm.store.PeriodMetrics(start, periods, interval)
}

// Metrics returns the current metrics for the host.
Expand Down
Loading

0 comments on commit 5b9bc3c

Please sign in to comment.