swirl/model/metric.go
2018-07-02 17:33:14 +08:00

99 lines
2.5 KiB
Go

package model
import (
"fmt"
"github.com/cuigh/auxo/data"
"github.com/cuigh/auxo/util/cast"
)
// Chart represents a dashboard chart.
type Chart struct {
Name string `json:"name" bson:"_id" valid:"required"` // unique, the name of build-in charts has '$' prefix.
Title string `json:"title" valid:"required"`
Description string `json:"desc"`
Legend string `json:"-"`
Query string `json:"-"`
Metrics []ChartMetric `json:"metrics" valid:"required"`
Kind string `json:"kind"` // builtin/custom
Dashboard string `json:"dashboard"` // home/service/task...
Type string `json:"type"` // pie/line...
Unit string `json:"unit"` // bytes/milliseconds/percent:100...
Width int32 `json:"width"` // 1-12(12 columns total)
Height int32 `json:"height"` // default 50
Options data.Map `json:"options"`
//Colors []string `json:"colors"`
}
func NewChart(dashboard, name, title, legend, query, unit string) *Chart {
return &Chart{
Name: name,
Title: title,
Description: title,
Metrics: []ChartMetric{
{Legend: legend, Query: query},
},
Dashboard: dashboard,
Type: "line",
Unit: unit,
Width: 12,
Height: 200,
}
}
type ChartMetric struct {
Legend string `json:"legend"`
Query string `json:"query"`
}
type ChartOption struct {
Name string `json:"name"`
Width int32 `json:"width"`
Height int32 `json:"height"`
//Colors []string `json:"colors"`
}
type ChartDashboard struct {
Name string `json:"name"`
Key string `json:"key"`
Period int32 `json:"period"` // minutes
RefreshInterval int32 `json:"refresh_interval"` // seconds, 0 means disabled.
Charts []ChartOption `json:"charts"`
}
func (cd *ChartDashboard) ID() string {
if cd.Key == "" {
return cd.Name
}
return cd.Name + ":" + cd.Key
}
type ChartPoint struct {
X int64 `json:"x"`
Y float64 `json:"y"`
}
func (p *ChartPoint) MarshalJSON() ([]byte, error) {
return cast.StringToBytes(fmt.Sprintf("[%v,%v]", p.X, p.Y)), nil
}
type ChartLine struct {
Name string `json:"name"`
Data []ChartPoint `json:"data"`
}
type ChartMatrixData struct {
Legend []string `json:"legend"`
Series []ChartLine `json:"series"`
}
type ChartValue struct {
Name string `json:"name"`
Value float64 `json:"value"`
}
type ChartVectorData struct {
Legend []string `json:"legend"`
Data []ChartValue `json:"data"`
}