1
0
Files
omc_api/features/monitor/monitor/monitor.go
2024-03-18 15:22:47 +08:00

163 lines
4.9 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package monitor
import (
"net/http"
"sort"
"strings"
"time"
"be.ems/lib/core/utils/ctx"
"be.ems/lib/dborm"
"be.ems/lib/services"
"be.ems/restagent/config"
"github.com/shirou/gopsutil/disk"
"github.com/shirou/gopsutil/net"
)
// 点击【主机 - 监控】菜单进入监控报表直观的了解服务器的运行状态包含【平均负载】、【CPU性能监控】、【内存使用监控】、【磁盘IO监控】、【网络IO监控】
// 可以查看昨天今天最近7天最近30天自定义时间的监控指标情况。
// 默认监控是开启的,可以在【面板设置 - 监控】页面中根据需求对监控进行开启和关闭。
// 监控数据默认保存30天可以自行修改也可手动清理该日志。
var (
// IP地址
UriIPAddr = config.DefaultUriPrefix + "/monitor/{apiVersion}/monitor/ipaddr"
// 可选网络
UriNetOpt = config.DefaultUriPrefix + "/monitor/{apiVersion}/monitor/netoptions"
// 可选磁盘
UriIoOpt = config.DefaultUriPrefix + "/monitor/{apiVersion}/monitor/iooptions"
// 加载
UriLoad = config.DefaultUriPrefix + "/monitor/{apiVersion}/monitor/load"
// IP地址
UriIPAddrOAM = config.UriPrefix + "/monitor/{apiVersion}/monitor/ipaddr"
// 可选网络
UriNetOptOAM = config.UriPrefix + "/monitor/{apiVersion}/monitor/netoptions"
// 可选磁盘
UriIoOptOAM = config.UriPrefix + "/monitor/{apiVersion}/monitor/iooptions"
// 加载
UriLoadOAM = config.UriPrefix + "/monitor/{apiVersion}/monitor/load"
)
// IPAddr IP地址
func IPAddr(w http.ResponseWriter, r *http.Request) {
ipAddrs := []map[string]string{}
interfaces, err := net.Interfaces()
if err == nil {
for _, iface := range interfaces {
addrs := map[string]string{}
for _, v := range iface.Addrs {
prefix := strings.Split(v.Addr, "/")[0]
if strings.Contains(prefix, "::") {
addrs["IPv6"] = prefix
}
if strings.Contains(prefix, ".") {
addrs["IPv4"] = prefix
}
}
ipAddrs = append(ipAddrs, addrs)
}
}
services.ResponseWithJson(w, 200, ipAddrs)
}
// Netoptions 可选网络
func Netoptions(w http.ResponseWriter, r *http.Request) {
netStat, _ := net.IOCounters(true)
var options []string
options = append(options, "all")
for _, net := range netStat {
options = append(options, net.Name)
}
sort.Strings(options)
services.ResponseWithJson(w, 200, options)
}
// Iooptions 可选磁盘
func Iooptions(w http.ResponseWriter, r *http.Request) {
diskStat, _ := disk.IOCounters()
var options []string
options = append(options, "all")
for _, net := range diskStat {
options = append(options, net.Name)
}
sort.Strings(options)
services.ResponseWithJson(w, 200, options)
}
// LoadMonitor 载入监控
func LoadMonitor(w http.ResponseWriter, r *http.Request) {
// json 請求參數獲取
var bodyArgs MonitorSearch
err := ctx.ShouldBindJSON(r, &bodyArgs)
if err != nil || dborm.DbClient.XEngine == nil {
services.ResponseErrorWithJson(w, 400, err.Error())
return
}
loc := time.Now().Location()
bodyArgs.StartTime = bodyArgs.StartTime.In(loc)
bodyArgs.EndTime = bodyArgs.EndTime.In(loc)
var backdatas []MonitorData
if bodyArgs.Param == "all" || bodyArgs.Param == "cpu" || bodyArgs.Param == "memory" || bodyArgs.Param == "load" {
var bases []MonitorBase
err := dborm.DbClient.XEngine.Table("monitor_base").
Where("created_at > ? AND created_at < ?", bodyArgs.StartTime, bodyArgs.EndTime).
Desc("created_at").
Find(&bases)
if err != nil {
services.ResponseErrorWithJson(w, 400, err.Error())
return
}
var itemData MonitorData
itemData.Param = "base"
for _, base := range bases {
itemData.Date = append(itemData.Date, base.CreatedAt)
itemData.Value = append(itemData.Value, base)
}
backdatas = append(backdatas, itemData)
}
if bodyArgs.Param == "all" || bodyArgs.Param == "io" {
var bases []MonitorIO
err := dborm.DbClient.XEngine.Table("monitor_io").
Where("created_at > ? AND created_at < ?", bodyArgs.StartTime, bodyArgs.EndTime).
Desc("created_at").
Find(&bases)
if err != nil {
services.ResponseErrorWithJson(w, 400, err.Error())
return
}
var itemData MonitorData
itemData.Param = "io"
for _, base := range bases {
itemData.Date = append(itemData.Date, base.CreatedAt)
itemData.Value = append(itemData.Value, base)
}
backdatas = append(backdatas, itemData)
}
if bodyArgs.Param == "all" || bodyArgs.Param == "network" {
var bases []MonitorNetwork
err := dborm.DbClient.XEngine.Table("monitor_network").
Where("name = ? AND created_at > ? AND created_at < ?", bodyArgs.Info, bodyArgs.StartTime, bodyArgs.EndTime).
Desc("created_at").
Find(&bases)
if err != nil {
services.ResponseErrorWithJson(w, 400, err.Error())
return
}
var itemData MonitorData
itemData.Param = "network"
for _, base := range bases {
itemData.Date = append(itemData.Date, base.CreatedAt)
itemData.Value = append(itemData.Value, base)
}
backdatas = append(backdatas, itemData)
}
services.ResponseWithJson(w, 200, backdatas)
}