正在开发,敬请期待
星梦云平台
让监控突破边界,数据云端汇聚
面向大规模监控场景的云端解决方案,解决星梦监控嵌入式数据限制, 轻松支持千级节点、百级任务,配置极简,即开即用。
云端可用性探测分布式探测节点,全球覆盖
负载数据存储重型数据库,海量存储
消息推送多通道通知,极简配置
星梦监控(当前)20 节点 / 20 任务
→
星梦云平台(即将)千级节点 / 百级任务

直观的图表展示服务器运行状态,帮助您快速掌握整体运行状况。
package main
import (
"context"
"fmt"
"log/slog"
"os"
"os/signal"
"strings"
"syscall"
"time"
"github.com/joho/godotenv"
)
const (
trafficUpdateInterval = 30 * time.Second
saveTrafficInterval = 5 * time.Minute
reportInterval = 5 * time.Minute
httpTimeout = 30 * time.Second
)
type Config struct {
MasterAddress string
NodeName string
NodeKey string
}
func loadConfig() (Config, error) {
godotenv.Load()
master := os.Getenv("MASTER_ADDRESS")
nodeName := os.Getenv("NODE_NAME")
nodeKey := os.Getenv("NODE_KEY")
if master == "" || nodeName == "" || nodeKey == "" {
return Config{}, fmt.Errorf("配置不完整,请检查 .env 文件")
}
return Config{
MasterAddress: strings.TrimRight(master, "/"),
NodeName: nodeName,
NodeKey: nodeKey,
}, nil
}
func saveTrafficOnExit(tm *TrafficMonitor) {
month, upload, download := tm.GetSnapshot()
if err := saveMonthlyTraffic(month, upload, download); err != nil {
slog.Error("退出前保存流量数据失败", "error", err)
} else {
slog.Info("流量数据已保存", "upload_mb", fmt.Sprintf("%.2f", upload), "download_mb", fmt.Sprintf("%.2f", download))
}
}
func main() {
slog.Info("探针程序启动")
config, err := loadConfig()
if err != nil {
slog.Error("加载配置失败", "error", err)
return
}
trafficMonitor := NewTrafficMonitor()
if month, upload, download, err := loadMonthlyTraffic(); err == nil {
trafficMonitor.SetMonthlyTraffic(month, upload, download)
slog.Info("已加载月流量数据",
"upload_mb", fmt.Sprintf("%.2f", upload),
"download_mb", fmt.Sprintf("%.2f", download))
}
slog.Info("监控程序运行中", "node", config.NodeName, "master", config.MasterAddress)
ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt, syscall.SIGTERM)
defer stop()
go func() {
ticker := time.NewTicker(trafficUpdateInterval)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
return
case <-ticker.C:
if err := trafficMonitor.UpdateTraffic(); err != nil {
slog.Error("更新流量失败", "error", err)
}
}
}
}()
go func() {
ticker := time.NewTicker(saveTrafficInterval)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
return
case <-ticker.C:
month, upload, download := trafficMonitor.GetSnapshot()
if err := saveMonthlyTraffic(month, upload, download); err != nil {
slog.Error("保存流量失败", "error", err)
}
}
}
}()
go func() {
ticker := time.NewTicker(reportInterval)
defer ticker.Stop()
for {
select {
case <-ctx.Done():
return
case <-ticker.C:
if err := submitData(config, trafficMonitor); err != nil {
slog.Error("上报失败", "error", err)
}
}
}
}()
if err := submitData(config, trafficMonitor); err != nil {
slog.Error("初始上报失败", "error", err)
}
<-ctx.Done()
slog.Info("收到退出信号,正在保存数据...")
saveTrafficOnExit(trafficMonitor)
slog.Info("探针程序已退出")
}
让监控突破边界,数据云端汇聚
面向大规模监控场景的云端解决方案,解决星梦监控嵌入式数据限制, 轻松支持千级节点、百级任务,配置极简,即开即用。