-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
133 lines (110 loc) · 3.33 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
package main
import (
"embed"
"fmt"
"github.com/gorilla/websocket"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"github.com/labstack/gommon/log"
"github.com/shirou/gopsutil/v4/mem"
"net/http"
"time"
)
const kbToMb = 1024 * 1024
// responseMessage, webSocket üzerinden göndereceğimiz mesajın yapısı.
type responseMessage struct {
TotalMemory string
FreeMemory string
UsedMemory string
PercentageUsedMemory string
Time string
}
var (
// tüm websocket client'larını tutacağımız map.
clients = make(map[*websocket.Conn]bool)
// oluşturduğumuz goroutine'ler arası iletişimi sağlayacağımız responseMessage tipinde channel.
broadcast = make(chan *responseMessage)
// http bağlantımızı websocket'e çeviren gorilla kütüphanesi metodu ve config'leri
upgrader = websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
)
//go:embed web
var webAssets embed.FS
func main() {
e := echo.New()
// Web dosyalarını sunmak için middleware'i ayarlıyoruz.
e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
Root: "web",
Filesystem: http.FS(webAssets),
}))
// WebSocket bağlantılarını yönetmek için handler tanımlıyoruz.
e.GET("/wsUrl", handleConnections)
// WebSocket mesajlarını yönetecek bir goroutine başlatıyoruz.
go handleMessages()
// Bellek istatistiklerini toplayacak bir goroutine başlatıyoruz.
go collectStats()
e.Logger.Fatal(e.Start(":3000"))
}
// handleConnections, yeni ve kapanan websocket bağlantılarını yönetir.
func handleConnections(c echo.Context) error {
// http bağlantımızı,websocket bağlantısına dönüştürüyoruz.
ws, err := upgrader.Upgrade(c.Response(), c.Request(), nil)
if err != nil {
log.Fatalf("Failed to upgrade connection: %v", err)
return err
}
defer ws.Close()
// Yeni bağlantıyı clients map'ine ekliyoruz.
clients[ws] = true
for {
// WebSocket mesajlarını okuyoruz. socket'in kapanması ve hata durumunda,
// önceden clients map'ine eklediğimiz bağlantıyı temizliyoruz.
_, _, err = ws.ReadMessage()
if err != nil {
log.Printf("error: %v", err)
delete(clients, ws)
break
}
}
return nil
}
// handleMessages, broadcast kanalından gelen mesajları, tüm websocket bağlantılara gönderir.
func handleMessages() {
for {
msg := <-broadcast
for client := range clients {
err := client.WriteJSON(msg)
if err != nil {
log.Printf("error: %v", err)
client.Close()
delete(clients, client)
}
}
}
}
// collectStats, sistem bellek bilgilerini toplayıp broadcast kanalına gönderir.
// insani olması açısından 1 saniye olarak ayarlandım.isterseniz kaldırabilirsiniz.
func collectStats() {
for {
v, err := mem.VirtualMemory()
if err != nil {
log.Printf("error: %v", err)
continue
}
totalMemory := fmt.Sprintf("%d", v.Total/kbToMb)
userMemory := fmt.Sprintf("%d", v.Used/kbToMb)
freeMemory := fmt.Sprintf("%d", v.Free/kbToMb)
percentUsage := fmt.Sprintf("%.2f", v.UsedPercent)
timeNow := time.Now().Format("02-01-2006 15:04:05")
broadcast <- &responseMessage{
TotalMemory: totalMemory,
UsedMemory: userMemory,
FreeMemory: freeMemory,
PercentageUsedMemory: percentUsage,
Time: timeNow,
}
time.Sleep(1 * time.Second)
}
}