mirror of
https://github.com/Dokploy/dokploy
synced 2025-06-26 18:27:59 +00:00
Reapply "Merge branch 'canary' into kucherenko/canary"
This reverts commit e6cb6454db.
This commit is contained in:
164
apps/monitoring/main.go
Normal file
164
apps/monitoring/main.go
Normal file
@@ -0,0 +1,164 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"log"
|
||||
"os"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/gofiber/fiber/v2/middleware/cors"
|
||||
"github.com/joho/godotenv"
|
||||
"github.com/mauriciogm/dokploy/apps/monitoring/config"
|
||||
"github.com/mauriciogm/dokploy/apps/monitoring/containers"
|
||||
"github.com/mauriciogm/dokploy/apps/monitoring/database"
|
||||
"github.com/mauriciogm/dokploy/apps/monitoring/middleware"
|
||||
"github.com/mauriciogm/dokploy/apps/monitoring/monitoring"
|
||||
)
|
||||
|
||||
func main() {
|
||||
godotenv.Load()
|
||||
|
||||
// Get configuration
|
||||
cfg := config.GetMetricsConfig()
|
||||
token := cfg.Server.Token
|
||||
METRICS_URL_CALLBACK := cfg.Server.UrlCallback
|
||||
log.Printf("Environment variables:")
|
||||
log.Printf("METRICS_CONFIG: %s", os.Getenv("METRICS_CONFIG"))
|
||||
|
||||
if token == "" || METRICS_URL_CALLBACK == "" {
|
||||
log.Fatal("token and urlCallback are required in the configuration")
|
||||
}
|
||||
|
||||
db, err := database.InitDB()
|
||||
if err != nil {
|
||||
log.Fatal(err)
|
||||
}
|
||||
|
||||
// Iniciar el sistema de limpieza de métricas
|
||||
cleanupCron, err := database.StartMetricsCleanup(db.DB, cfg.Server.RetentionDays, cfg.Server.CronJob)
|
||||
if err != nil {
|
||||
log.Fatalf("Error starting metrics cleanup system: %v", err)
|
||||
}
|
||||
defer cleanupCron.Stop()
|
||||
|
||||
app := fiber.New()
|
||||
|
||||
app.Use(cors.New(cors.Config{
|
||||
AllowOrigins: "*",
|
||||
AllowHeaders: "Origin, Content-Type, Accept, Authorization",
|
||||
}))
|
||||
|
||||
app.Get("/health", func(c *fiber.Ctx) error {
|
||||
return c.JSON(fiber.Map{
|
||||
"status": "ok",
|
||||
})
|
||||
})
|
||||
|
||||
app.Use(func(c *fiber.Ctx) error {
|
||||
if c.Path() == "/health" {
|
||||
return c.Next()
|
||||
}
|
||||
return middleware.AuthMiddleware()(c)
|
||||
})
|
||||
|
||||
app.Get("/metrics", func(c *fiber.Ctx) error {
|
||||
limit := c.Query("limit", "50")
|
||||
|
||||
var metrics []monitoring.SystemMetrics
|
||||
if limit == "all" {
|
||||
dbMetrics, err := db.GetAllMetrics()
|
||||
if err != nil {
|
||||
return c.Status(500).JSON(fiber.Map{
|
||||
"error": "Failed to fetch metrics",
|
||||
})
|
||||
}
|
||||
for _, m := range dbMetrics {
|
||||
metrics = append(metrics, monitoring.ConvertToSystemMetrics(m))
|
||||
}
|
||||
} else {
|
||||
n, err := strconv.Atoi(limit)
|
||||
if err != nil {
|
||||
n = 50
|
||||
}
|
||||
dbMetrics, err := db.GetLastNMetrics(n)
|
||||
if err != nil {
|
||||
return c.Status(500).JSON(fiber.Map{
|
||||
"error": "Failed to fetch metrics",
|
||||
})
|
||||
}
|
||||
for _, m := range dbMetrics {
|
||||
metrics = append(metrics, monitoring.ConvertToSystemMetrics(m))
|
||||
}
|
||||
}
|
||||
|
||||
return c.JSON(metrics)
|
||||
})
|
||||
|
||||
containerMonitor, err := containers.NewContainerMonitor(db)
|
||||
if err != nil {
|
||||
log.Fatalf("Failed to create container monitor: %v", err)
|
||||
}
|
||||
if err := containerMonitor.Start(); err != nil {
|
||||
log.Fatalf("Failed to start container monitor: %v", err)
|
||||
}
|
||||
defer containerMonitor.Stop()
|
||||
|
||||
app.Get("/metrics/containers", func(c *fiber.Ctx) error {
|
||||
limit := c.Query("limit", "50")
|
||||
appName := c.Query("appName", "")
|
||||
|
||||
if appName == "" {
|
||||
return c.JSON([]database.ContainerMetric{})
|
||||
}
|
||||
|
||||
var metrics []database.ContainerMetric
|
||||
var err error
|
||||
|
||||
if limit == "all" {
|
||||
metrics, err = db.GetAllMetricsContainer(appName)
|
||||
} else {
|
||||
limitNum, parseErr := strconv.Atoi(limit)
|
||||
if parseErr != nil {
|
||||
limitNum = 50
|
||||
}
|
||||
metrics, err = db.GetLastNContainerMetrics(appName, limitNum)
|
||||
}
|
||||
|
||||
if err != nil {
|
||||
return c.Status(500).JSON(fiber.Map{
|
||||
"error": "Error getting container metrics: " + err.Error(),
|
||||
})
|
||||
}
|
||||
|
||||
return c.JSON(metrics)
|
||||
})
|
||||
|
||||
go func() {
|
||||
refreshRate := cfg.Server.RefreshRate
|
||||
duration := time.Duration(refreshRate) * time.Second
|
||||
|
||||
log.Printf("Refreshing server metrics every %v", duration)
|
||||
ticker := time.NewTicker(duration)
|
||||
defer ticker.Stop()
|
||||
|
||||
for range ticker.C {
|
||||
metrics := monitoring.GetServerMetrics()
|
||||
if err := db.SaveMetric(metrics); err != nil {
|
||||
log.Printf("Error saving metrics: %v", err)
|
||||
}
|
||||
|
||||
if err := monitoring.CheckThresholds(metrics); err != nil {
|
||||
log.Printf("Error checking thresholds: %v", err)
|
||||
}
|
||||
}
|
||||
}()
|
||||
|
||||
port := cfg.Server.Port
|
||||
if port == 0 {
|
||||
port = 3001
|
||||
}
|
||||
|
||||
log.Printf("Server starting on port %d", port)
|
||||
log.Fatal(app.Listen(":" + strconv.Itoa(port)))
|
||||
}
|
||||
Reference in New Issue
Block a user