mirror of
https://github.com/TeaOSLab/EdgeAPI.git
synced 2025-11-07 18:50:26 +08:00
增加内置的统计指标
This commit is contained in:
@@ -5,6 +5,7 @@ type MetricChart struct {
|
||||
Id uint32 `field:"id"` // ID
|
||||
ItemId uint32 `field:"itemId"` // 指标ID
|
||||
Name string `field:"name"` // 名称
|
||||
Code string `field:"code"` // 代号
|
||||
Type string `field:"type"` // 图形类型
|
||||
WidthDiv int32 `field:"widthDiv"` // 宽度划分
|
||||
Params string `field:"params"` // 图形参数
|
||||
@@ -18,6 +19,7 @@ type MetricChartOperator struct {
|
||||
Id interface{} // ID
|
||||
ItemId interface{} // 指标ID
|
||||
Name interface{} // 名称
|
||||
Code interface{} // 代号
|
||||
Type interface{} // 图形类型
|
||||
WidthDiv interface{} // 宽度划分
|
||||
Params interface{} // 图形参数
|
||||
|
||||
@@ -1,12 +1,15 @@
|
||||
package setup
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
teaconst "github.com/TeaOSLab/EdgeAPI/internal/const"
|
||||
"github.com/TeaOSLab/EdgeAPI/internal/errors"
|
||||
"github.com/TeaOSLab/EdgeCommon/pkg/serverconfigs"
|
||||
_ "github.com/go-sql-driver/mysql"
|
||||
"github.com/go-yaml/yaml"
|
||||
"github.com/iwind/TeaGo/Tea"
|
||||
"github.com/iwind/TeaGo/dbs"
|
||||
"github.com/iwind/TeaGo/maps"
|
||||
"github.com/iwind/TeaGo/rands"
|
||||
"github.com/iwind/TeaGo/types"
|
||||
stringutil "github.com/iwind/TeaGo/utils/string"
|
||||
@@ -95,6 +98,12 @@ func (this *SQLExecutor) checkData(db *dbs.DB) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// 检查指标设置
|
||||
err = this.checkMetricItems(db)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 更新版本号
|
||||
err = this.updateVersion(db, teaconst.Version)
|
||||
if err != nil {
|
||||
@@ -245,6 +254,134 @@ func (this *SQLExecutor) checkIPList(db *dbs.DB) error {
|
||||
return nil
|
||||
}
|
||||
|
||||
// 检查统计指标
|
||||
func (this *SQLExecutor) checkMetricItems(db *dbs.DB) error {
|
||||
var createMetricItem = func(code string,
|
||||
category string,
|
||||
name string,
|
||||
keys []string,
|
||||
period int,
|
||||
periodUnit string,
|
||||
value string,
|
||||
chartMaps []maps.Map,
|
||||
) error {
|
||||
// 检查是否已创建
|
||||
itemMap, err := db.FindOne("SELECT id FROM edgeMetricItems WHERE code=? LIMIT 1", code)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
var itemId int64 = 0
|
||||
if len(itemMap) == 0 {
|
||||
keysJSON, err := json.Marshal(keys)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
_, err = db.Exec("INSERT INTO edgeMetricItems (isOn, code, category, name, `keys`, period, periodUnit, value, state, isPublic) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", 1, code, category, name, keysJSON, period, periodUnit, value, 1, 1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
// 再次查询
|
||||
itemMap, err = db.FindOne("SELECT id FROM edgeMetricItems WHERE code=? LIMIT 1", code)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
itemId = itemMap.GetInt64("id")
|
||||
|
||||
// chart
|
||||
for _, chartMap := range chartMaps {
|
||||
chartCode := chartMap.GetString("code")
|
||||
one, err := db.FindOne("SELECT id FROM edgeMetricCharts WHERE itemId=? AND code=? LIMIT 1", itemId, chartCode)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if len(one) == 0 {
|
||||
_, err = db.Exec("INSERT INTO edgeMetricCharts (itemId, name, code, type, widthDiv, params, isOn, state) VALUES (?, ?, ?, ?, ?, ?, ?, ?)", itemId, chartMap.GetString("name"), chartCode, chartMap.GetString("type"), chartMap.GetInt("widthDiv"), "{}", 1, 1)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
{
|
||||
err := createMetricItem("ip_requests", serverconfigs.MetricItemCategoryHTTP, "独立IP请求数", []string{"${remoteAddr}"}, 1, "day", "${countRequest}", []maps.Map{
|
||||
{
|
||||
"name": "独立IP排行",
|
||||
"type": "bar",
|
||||
"widthDiv": 0,
|
||||
"code": "ip_requests_bar",
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
err := createMetricItem("ip_traffic_out", serverconfigs.MetricItemCategoryHTTP, "独立IP下行流量", []string{"${remoteAddr}"}, 1, "day", "${countTrafficOut}", []maps.Map{
|
||||
{
|
||||
"name": "独立IP排行",
|
||||
"type": "bar",
|
||||
"widthDiv": 0,
|
||||
"code": "ip_traffic_out_bar",
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
err := createMetricItem("request_path", serverconfigs.MetricItemCategoryHTTP, "请求路径统计", []string{"${requestPath}"}, 1, "day", "${countRequest}", []maps.Map{
|
||||
{
|
||||
"name": "请求路径排行",
|
||||
"type": "bar",
|
||||
"widthDiv": 0,
|
||||
"code": "request_path_bar",
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
err := createMetricItem("request_method", serverconfigs.MetricItemCategoryHTTP, "请求方法统计", []string{"${requestMethod}"}, 1, "day", "${countRequest}", []maps.Map{
|
||||
{
|
||||
"name": "请求方法分布",
|
||||
"type": "pie",
|
||||
"widthDiv": 2,
|
||||
"code": "request_method_pie",
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
{
|
||||
err := createMetricItem("status", serverconfigs.MetricItemCategoryHTTP, "状态码统计", []string{"${status}"}, 1, "day", "${countRequest}", []maps.Map{
|
||||
{
|
||||
"name": "状态码分布",
|
||||
"type": "pie",
|
||||
"widthDiv": 2,
|
||||
"code": "status_pie",
|
||||
},
|
||||
})
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
// 更新版本号
|
||||
func (this *SQLExecutor) updateVersion(db *dbs.DB, version string) error {
|
||||
stmt, err := db.Prepare("SELECT COUNT(*) FROM edgeVersions")
|
||||
|
||||
@@ -17,3 +17,21 @@ func TestSQLExecutor_Run(t *testing.T) {
|
||||
}
|
||||
t.Log("ok")
|
||||
}
|
||||
|
||||
func TestSQLExecutor_checkMetricItems(t *testing.T) {
|
||||
executor := NewSQLExecutor(&dbs.DBConfig{
|
||||
Driver: "mysql",
|
||||
Prefix: "edge",
|
||||
Dsn: "root:123456@tcp(127.0.0.1:3306)/db_edge_new?charset=utf8mb4&multiStatements=true",
|
||||
})
|
||||
db, err := dbs.NewInstanceFromConfig(executor.dbConfig)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
|
||||
err = executor.checkMetricItems(db)
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
t.Log("ok")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user