mirror of
https://github.com/ClusterCockpit/cc-backend
synced 2024-09-20 11:27:26 +02:00
114 lines
2.6 KiB
Go
114 lines
2.6 KiB
Go
package schema
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"unsafe"
|
|
)
|
|
|
|
type JobData map[string]map[MetricScope]*JobMetric
|
|
|
|
type JobMetric struct {
|
|
Unit string `json:"unit"`
|
|
Scope MetricScope `json:"scope"`
|
|
Timestep int `json:"timestep"`
|
|
Series []Series `json:"series"`
|
|
StatisticsSeries *StatsSeries `json:"statisticsSeries"`
|
|
}
|
|
|
|
type Series struct {
|
|
Hostname string `json:"hostname"`
|
|
Id *int `json:"id,omitempty"`
|
|
Statistics *MetricStatistics `json:"statistics"`
|
|
Data []Float `json:"data"`
|
|
}
|
|
|
|
type MetricStatistics struct {
|
|
Avg float64 `json:"avg"`
|
|
Min float64 `json:"min"`
|
|
Max float64 `json:"max"`
|
|
}
|
|
|
|
type StatsSeries struct {
|
|
Mean []Float `json:"mean"`
|
|
Min []Float `json:"min"`
|
|
Max []Float `json:"max"`
|
|
Percentiles map[int][]Float `json:"percentiles,omitempty"`
|
|
}
|
|
|
|
type MetricScope string
|
|
|
|
const (
|
|
MetricScopeNode MetricScope = "node"
|
|
MetricScopeSocket MetricScope = "socket"
|
|
MetricScopeCore MetricScope = "core"
|
|
MetricScopeHWThread MetricScope = "hwthread"
|
|
|
|
MetricScopeAccelerator MetricScope = "accelerator"
|
|
)
|
|
|
|
var metricScopeGranularity map[MetricScope]int = map[MetricScope]int{
|
|
MetricScopeNode: 10,
|
|
MetricScopeSocket: 5,
|
|
MetricScopeCore: 2,
|
|
MetricScopeHWThread: 1,
|
|
|
|
MetricScopeAccelerator: 5, // Special/Randomly choosen
|
|
}
|
|
|
|
func (e *MetricScope) LT(other MetricScope) bool {
|
|
a := metricScopeGranularity[*e]
|
|
b := metricScopeGranularity[other]
|
|
return a < b
|
|
}
|
|
|
|
func (e *MetricScope) LTE(other MetricScope) bool {
|
|
a := metricScopeGranularity[*e]
|
|
b := metricScopeGranularity[other]
|
|
return a <= b
|
|
}
|
|
|
|
func (e *MetricScope) Max(other MetricScope) MetricScope {
|
|
a := metricScopeGranularity[*e]
|
|
b := metricScopeGranularity[other]
|
|
if a > b {
|
|
return *e
|
|
}
|
|
return other
|
|
}
|
|
|
|
func (e *MetricScope) UnmarshalGQL(v interface{}) error {
|
|
str, ok := v.(string)
|
|
if !ok {
|
|
return fmt.Errorf("enums must be strings")
|
|
}
|
|
|
|
*e = MetricScope(str)
|
|
if _, ok := metricScopeGranularity[*e]; !ok {
|
|
return fmt.Errorf("%s is not a valid MetricScope", str)
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (e MetricScope) MarshalGQL(w io.Writer) {
|
|
fmt.Fprintf(w, "\"%s\"", e)
|
|
}
|
|
|
|
func (jd *JobData) Size() int {
|
|
n := 128
|
|
for _, scopes := range *jd {
|
|
for _, metric := range scopes {
|
|
if metric.StatisticsSeries != nil {
|
|
n += len(metric.StatisticsSeries.Max)
|
|
n += len(metric.StatisticsSeries.Mean)
|
|
n += len(metric.StatisticsSeries.Min)
|
|
}
|
|
|
|
for _, series := range metric.Series {
|
|
n += len(series.Data)
|
|
}
|
|
}
|
|
}
|
|
return n * int(unsafe.Sizeof(Float(0)))
|
|
}
|