Skip to content

Commit cb4977e

Browse files
committed
refactor: nodes analytics (#847)
* refactor: nodes analytics * feat(debug): add pprof in debug mode * refactor: websocket error handler
1 parent b1ba719 commit cb4977e

File tree

17 files changed

+276
-155
lines changed

17 files changed

+276
-155
lines changed

api/analytic/analytic.go

Lines changed: 9 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,10 @@ package analytic
22

33
import (
44
"fmt"
5+
"net/http"
6+
"runtime"
7+
"time"
8+
59
"github.com/0xJacky/Nginx-UI/internal/analytic"
610
"github.com/0xJacky/Nginx-UI/internal/helper"
711
"github.com/shirou/gopsutil/v4/cpu"
@@ -10,9 +14,6 @@ import (
1014
"github.com/shirou/gopsutil/v4/net"
1115
"github.com/spf13/cast"
1216
"github.com/uozi-tech/cosy/logger"
13-
"net/http"
14-
"runtime"
15-
"time"
1617

1718
"github.com/gin-gonic/gin"
1819
"github.com/gorilla/websocket"
@@ -86,12 +87,14 @@ func Analytic(c *gin.Context) {
8687

8788
// write
8889
err = ws.WriteJSON(stat)
89-
if helper.IsUnexpectedWebsocketError(err) {
90-
logger.Error(err)
90+
if err != nil {
91+
if helper.IsUnexpectedWebsocketError(err) {
92+
logger.Error(err)
93+
}
9194
break
9295
}
9396

94-
time.Sleep(1000 * time.Microsecond)
97+
time.Sleep(1 * time.Second)
9598
}
9699
}
97100

api/analytic/nodes.go

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
package analytic
22

33
import (
4+
"net/http"
5+
"time"
6+
47
"github.com/0xJacky/Nginx-UI/internal/analytic"
58
"github.com/0xJacky/Nginx-UI/internal/helper"
69
"github.com/gin-gonic/gin"
710
"github.com/gorilla/websocket"
811
"github.com/uozi-tech/cosy/logger"
9-
"net/http"
10-
"time"
1112
)
1213

1314
func GetNodeStat(c *gin.Context) {
@@ -28,8 +29,10 @@ func GetNodeStat(c *gin.Context) {
2829
for {
2930
// write
3031
err = ws.WriteJSON(analytic.GetNodeStat())
31-
if helper.IsUnexpectedWebsocketError(err) {
32-
logger.Error(err)
32+
if err != nil {
33+
if helper.IsUnexpectedWebsocketError(err) {
34+
logger.Error(err)
35+
}
3336
break
3437
}
3538

@@ -55,8 +58,10 @@ func GetNodesAnalytic(c *gin.Context) {
5558
for {
5659
// write
5760
err = ws.WriteJSON(analytic.NodeMap)
58-
if helper.IsUnexpectedWebsocketError(err) {
59-
logger.Error(err)
61+
if err != nil {
62+
if helper.IsUnexpectedWebsocketError(err) {
63+
logger.Error(err)
64+
}
6065
break
6166
}
6267

api/nginx_log/nginx_log.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package nginx_log
22

33
import (
44
"encoding/json"
5+
"github.com/0xJacky/Nginx-UI/internal/helper"
56
"github.com/0xJacky/Nginx-UI/internal/nginx"
67
"github.com/0xJacky/Nginx-UI/internal/nginx_log"
78
"github.com/gin-gonic/gin"
@@ -252,9 +253,10 @@ func tailNginxLog(ws *websocket.Conn, controlChan chan controlStruct, errChan ch
252253
}
253254

254255
err = ws.WriteMessage(websocket.TextMessage, []byte(line.Text))
255-
256-
if err != nil && websocket.IsUnexpectedCloseError(err, websocket.CloseNormalClosure) {
257-
errChan <- errors.Wrap(err, "error tailNginxLog write message")
256+
if err != nil {
257+
if helper.IsUnexpectedWebsocketError(err) {
258+
errChan <- errors.Wrap(err, "error tailNginxLog write message")
259+
}
258260
return
259261
}
260262
case control = <-controlChan:

api/upstream/upstream.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,8 +36,10 @@ func AvailabilityTest(c *gin.Context) {
3636

3737
for {
3838
err = ws.WriteJSON(upstream.AvailabilityTest(body))
39-
if helper.IsUnexpectedWebsocketError(err) {
40-
logger.Error(err)
39+
if err != nil {
40+
if helper.IsUnexpectedWebsocketError(err) {
41+
logger.Error(err)
42+
}
4143
break
4244
}
4345

app/src/views/dashboard/ServerAnalytic.vue

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,10 +90,6 @@ onMounted(() => {
9090
})
9191
})
9292
93-
onUnmounted(() => {
94-
websocket.close()
95-
})
96-
9793
function handle_uptime(t: number) {
9894
// uptime
9995
let _uptime = Math.floor(t)

app/src/views/dashboard/components/NodeAnalyticItem.vue

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ defineProps<{
3131
<div class="hardware-monitor-item longer">
3232
<div class="mb-1">
3333
<LineChartOutlined class="mr-1" />
34-
<span class="load-avg-describe">1min:</span>{{ ` ${item.avg_load?.load1?.toFixed(2)}` }} ·
34+
<span class="load-avg-describe">1min:</span>{{ item.avg_load?.load1?.toFixed(2) }} ·
3535
<span class="load-avg-describe">5min:</span>{{ item.avg_load?.load5?.toFixed(2) }} ·
3636
<span class="load-avg-describe">15min:</span>{{ item.avg_load?.load15?.toFixed(2) }}
3737
</div>
@@ -123,6 +123,11 @@ defineProps<{
123123
.longer {
124124
width: 180px;
125125
}
126+
127+
.load-avg-describe {
128+
margin-right: 2px;
129+
}
130+
126131
@media (max-width: 400px) {
127132
.longer {
128133
width: 180px;

app/src/views/environment/Environment.vue

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,10 +8,15 @@ import { message } from 'ant-design-vue'
88
99
const route = useRoute()
1010
const curd = ref()
11+
const loadingFromSettings = ref(false)
12+
1113
function loadFromSettings() {
14+
loadingFromSettings.value = true
1215
environment.load_from_settings().then(() => {
1316
curd.value.get_list()
1417
message.success($gettext('Load successfully'))
18+
}).finally(() => {
19+
loadingFromSettings.value = false
1520
})
1621
}
1722
const selectedNodeIds = ref([])
@@ -25,14 +30,6 @@ function batchUpgrade() {
2530
const inTrash = computed(() => {
2631
return route.query.trash === 'true'
2732
})
28-
29-
// const timer = setInterval(() => {
30-
// curd.value.get_list()
31-
// }, 10000)
32-
33-
// onUnmounted(() => {
34-
// clearInterval(timer)
35-
// })
3633
</script>
3734

3835
<template>
@@ -48,7 +45,7 @@ const inTrash = computed(() => {
4845
:columns="envColumns"
4946
>
5047
<template #beforeAdd>
51-
<AButton size="small" type="link" @click="loadFromSettings">
48+
<AButton size="small" type="link" :loading="loadingFromSettings" @click="loadFromSettings">
5249
{{ $gettext('Load from settings') }}
5350
</AButton>
5451
</template>

go.mod

Lines changed: 31 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ require (
1111
github.com/dgraph-io/ristretto/v2 v2.1.0
1212
github.com/dustin/go-humanize v1.0.1
1313
github.com/elliotchance/orderedmap/v3 v3.1.0
14+
github.com/gin-contrib/pprof v1.5.2
1415
github.com/gin-contrib/static v1.1.3
1516
github.com/gin-gonic/gin v1.10.0
1617
github.com/go-acme/lego/v4 v4.21.0
@@ -30,12 +31,12 @@ require (
3031
github.com/pretty66/websocketproxy v0.0.0-20220507015215-930b3a686308
3132
github.com/samber/lo v1.49.1
3233
github.com/sashabaranov/go-openai v1.36.1
33-
github.com/shirou/gopsutil/v4 v4.24.12
34+
github.com/shirou/gopsutil/v4 v4.25.1
3435
github.com/spf13/cast v1.7.1
3536
github.com/stretchr/testify v1.10.0
3637
github.com/tufanbarisyildirim/gonginx v0.0.0-20250120210832-12a9c7ae0c8a
3738
github.com/uozi-tech/cosy v1.14.3
38-
github.com/uozi-tech/cosy-driver-sqlite v0.2.0
39+
github.com/uozi-tech/cosy-driver-sqlite v0.2.1
3940
github.com/urfave/cli/v3 v3.0.0-beta1
4041
golang.org/x/crypto v0.32.0
4142
golang.org/x/net v0.34.0
@@ -74,20 +75,20 @@ require (
7475
github.com/StackExchange/wmi v1.2.1 // indirect
7576
github.com/akamai/AkamaiOPEN-edgegrid-golang v1.2.2 // indirect
7677
github.com/aliyun/alibaba-cloud-sdk-go v1.63.84 // indirect
77-
github.com/aws/aws-sdk-go-v2 v1.35.0 // indirect
78-
github.com/aws/aws-sdk-go-v2/config v1.29.3 // indirect
79-
github.com/aws/aws-sdk-go-v2/credentials v1.17.56 // indirect
80-
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.26 // indirect
81-
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.30 // indirect
82-
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.30 // indirect
78+
github.com/aws/aws-sdk-go-v2 v1.36.0 // indirect
79+
github.com/aws/aws-sdk-go-v2/config v1.29.5 // indirect
80+
github.com/aws/aws-sdk-go-v2/credentials v1.17.58 // indirect
81+
github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.27 // indirect
82+
github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.31 // indirect
83+
github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.31 // indirect
8384
github.com/aws/aws-sdk-go-v2/internal/ini v1.8.2 // indirect
8485
github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.12.2 // indirect
85-
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.11 // indirect
86-
github.com/aws/aws-sdk-go-v2/service/lightsail v1.42.13 // indirect
87-
github.com/aws/aws-sdk-go-v2/service/route53 v1.48.4 // indirect
88-
github.com/aws/aws-sdk-go-v2/service/sso v1.24.13 // indirect
89-
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.12 // indirect
90-
github.com/aws/aws-sdk-go-v2/service/sts v1.33.11 // indirect
86+
github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.12.12 // indirect
87+
github.com/aws/aws-sdk-go-v2/service/lightsail v1.42.14 // indirect
88+
github.com/aws/aws-sdk-go-v2/service/route53 v1.48.6 // indirect
89+
github.com/aws/aws-sdk-go-v2/service/sso v1.24.14 // indirect
90+
github.com/aws/aws-sdk-go-v2/service/ssooidc v1.28.13 // indirect
91+
github.com/aws/aws-sdk-go-v2/service/sts v1.33.13 // indirect
9192
github.com/aws/smithy-go v1.22.2 // indirect
9293
github.com/benbjohnson/clock v1.3.5 // indirect
9394
github.com/boombuler/barcode v1.0.2 // indirect
@@ -194,7 +195,7 @@ require (
194195
github.com/nxadm/tail v1.4.11 // indirect
195196
github.com/nzdjb/go-metaname v1.0.0 // indirect
196197
github.com/opentracing/opentracing-go v1.2.1-0.20220228012449-10b1cf09e00b // indirect
197-
github.com/oracle/oci-go-sdk/v65 v65.82.0 // indirect
198+
github.com/oracle/oci-go-sdk/v65 v65.83.0 // indirect
198199
github.com/ovh/go-ovh v1.6.0 // indirect
199200
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
200201
github.com/pelletier/go-toml/v2 v2.2.3 // indirect
@@ -211,7 +212,7 @@ require (
211212
github.com/sacloud/packages-go v0.0.11 // indirect
212213
github.com/sagikazarmark/locafero v0.7.0 // indirect
213214
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
214-
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.31 // indirect
215+
github.com/scaleway/scaleway-sdk-go v1.0.0-beta.32 // indirect
215216
github.com/selectel/domains-go v1.1.0 // indirect
216217
github.com/selectel/go-selvpcclient/v3 v3.2.1 // indirect
217218
github.com/shopspring/decimal v1.4.0 // indirect
@@ -226,8 +227,8 @@ require (
226227
github.com/spf13/pflag v1.0.6 // indirect
227228
github.com/spf13/viper v1.19.0 // indirect
228229
github.com/subosito/gotenv v1.6.0 // indirect
229-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1090 // indirect
230-
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1090 // indirect
230+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/common v1.0.1091 // indirect
231+
github.com/tencentcloud/tencentcloud-sdk-go/tencentcloud/dnspod v1.0.1091 // indirect
231232
github.com/tjfoc/gmsm v1.4.1 // indirect
232233
github.com/tklauser/go-sysconf v0.3.14 // indirect
233234
github.com/tklauser/numcpus v0.9.0 // indirect
@@ -241,8 +242,8 @@ require (
241242
github.com/volcengine/volc-sdk-golang v1.0.194 // indirect
242243
github.com/vultr/govultr/v3 v3.14.1 // indirect
243244
github.com/x448/float16 v0.8.4 // indirect
244-
github.com/yandex-cloud/go-genproto v0.0.0-20250127124313-5be1a2cc06d4 // indirect
245-
github.com/yandex-cloud/go-sdk v0.0.0-20250127132311-016f84adc072 // indirect
245+
github.com/yandex-cloud/go-genproto v0.0.0-20250203115010-0bcba64c41f6 // indirect
246+
github.com/yandex-cloud/go-sdk v0.0.0-20250203123950-24786ecffd92 // indirect
246247
github.com/yusufpapurcu/wmi v1.2.4 // indirect
247248
go.mongodb.org/mongo-driver v1.17.2 // indirect
248249
go.opentelemetry.io/auto/sdk v1.1.0 // indirect
@@ -254,19 +255,19 @@ require (
254255
go.uber.org/multierr v1.11.0 // indirect
255256
go.uber.org/ratelimit v0.3.1 // indirect
256257
go.uber.org/zap v1.27.0 // indirect
257-
golang.org/x/arch v0.13.0 // indirect
258+
golang.org/x/arch v0.14.0 // indirect
258259
golang.org/x/exp v0.0.0-20250128182459-e0ece0dbea4c // indirect
259-
golang.org/x/mod v0.22.0 // indirect
260-
golang.org/x/oauth2 v0.25.0 // indirect
261-
golang.org/x/sync v0.10.0 // indirect
262-
golang.org/x/sys v0.29.0 // indirect
263-
golang.org/x/text v0.21.0 // indirect
264-
golang.org/x/time v0.9.0 // indirect
260+
golang.org/x/mod v0.23.0 // indirect
261+
golang.org/x/oauth2 v0.26.0 // indirect
262+
golang.org/x/sync v0.11.0 // indirect
263+
golang.org/x/sys v0.30.0 // indirect
264+
golang.org/x/text v0.22.0 // indirect
265+
golang.org/x/time v0.10.0 // indirect
265266
golang.org/x/tools v0.29.0 // indirect
266267
google.golang.org/api v0.219.0 // indirect
267-
google.golang.org/genproto v0.0.0-20250127172529-29210b9bc287 // indirect
268-
google.golang.org/genproto/googleapis/api v0.0.0-20250127172529-29210b9bc287 // indirect
269-
google.golang.org/genproto/googleapis/rpc v0.0.0-20250127172529-29210b9bc287 // indirect
268+
google.golang.org/genproto v0.0.0-20250204164813-702378808489 // indirect
269+
google.golang.org/genproto/googleapis/api v0.0.0-20250204164813-702378808489 // indirect
270+
google.golang.org/genproto/googleapis/rpc v0.0.0-20250204164813-702378808489 // indirect
270271
google.golang.org/grpc v1.70.0 // indirect
271272
google.golang.org/protobuf v1.36.4 // indirect
272273
gopkg.in/fsnotify.v1 v1.4.7 // indirect

0 commit comments

Comments
 (0)