diff --git a/internal/db/models/metric_chart_model.go b/internal/db/models/metric_chart_model.go index 3107b638..f5d0b23d 100644 --- a/internal/db/models/metric_chart_model.go +++ b/internal/db/models/metric_chart_model.go @@ -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{} // 图形参数 diff --git a/internal/setup/sql_executor.go b/internal/setup/sql_executor.go index e9154da9..fbfb9a0c 100644 --- a/internal/setup/sql_executor.go +++ b/internal/setup/sql_executor.go @@ -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") diff --git a/internal/setup/sql_executor_test.go b/internal/setup/sql_executor_test.go index c4f5a84e..64d7df2f 100644 --- a/internal/setup/sql_executor_test.go +++ b/internal/setup/sql_executor_test.go @@ -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") +} diff --git a/internal/setup/sql_data.go b/internal/setup/sql_upgrade.go similarity index 100% rename from internal/setup/sql_data.go rename to internal/setup/sql_upgrade.go diff --git a/internal/setup/sql_data_test.go b/internal/setup/sql_upgrade_test.go similarity index 100% rename from internal/setup/sql_data_test.go rename to internal/setup/sql_upgrade_test.go