-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.mjs
107 lines (93 loc) · 3.51 KB
/
main.mjs
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
import axios from "axios";
import express from "express";
// NeosのUserStatus APIエンドポイント
const API_ENDPOINT = "https://cloudx.azurewebsites.net/api/stats/onlineUserStats"
let cache = ""
const app = express()
app.listen(3000, () => {console.log("OK 3000")})
// prometheus用エンドポイント
app.get("*", async (req, res) => {
res.header('Content-Type', 'text/plain;charset=utf-8');
return res.send(cache)
})
const getStatus = async () => {
try {
/**
* response example
* {
* "captureTimestamp": "2023-01-28T11:38:39.1834105Z",
* "registeredUserCount": 333,
* "instanceCount": 330,
* "vrUserCount": 119,
* "screenUserCount": 77,
* "headlessUserCount": 129,
* "mobileUserCount": 0,
* "publicSessionCount": 123,
* "activePublicSessionCount": 23,
* "publicWorldUserCount": 55,
* "PartitionKey": "2517273948808165894",
* "RowKey": "",
* "Timestamp": "0001-01-01T00:00:00+00:00",
* "ETag": null
* }
*/
const { data } = await axios.get(API_ENDPOINT)
return formatData(data || {})
} catch {
console.error("err")
}
}
const formatData = (data) => {
let date = 0
try {
date = new Date(data.captureTimestamp).getTime()
} catch {}
return {
captureTimestamp: date,
registeredUserCount: data.registeredUserCount || 0,
instanceCount: data.instanceCount || 0,
vrUserCount: data.vrUserCount || 0,
screenUserCount: data.screenUserCount || 0,
headlessUserCount: data.headlessUserCount || 0,
mobileUserCount: data.mobileUserCount || 0,
publicSessionCount: data.publicSessionCount || 0,
activePublicSessionCount: data.activePublicSessionCount || 0,
publicWorldUserCount: data.publicWorldUserCount || 0,
}
}
// prometheus用テキスト作成
const makeGaugeText = (data) => {
return `# HELP neos_capture_timestamp neos capture_timestamp value
# TYPE neos_capture_timestamp gauge
neos_capture_timestamp ${data.captureTimestamp}
# HELP neos_registered_users neos registered_users value
# TYPE neos_registered_users gauge
neos_registered_users ${data.registeredUserCount}
# HELP neos_instances neos instances value
# TYPE neos_instances gauge
neos_instances ${data.instanceCount}
# HELP neos_online_users online neos users value
# TYPE neos_online_users gauge
neos_online_users{device="vr"} ${data.vrUserCount}
neos_online_users{device="screen"} ${data.screenUserCount}
neos_online_users{device="headless"} ${data.headlessUserCount}
neos_online_users{device="mobile"} ${data.mobileUserCount}
# HELP neos_public_sessions neos public_sessions value
# TYPE neos_public_sessions gauge
neos_public_sessions ${data.publicSessionCount}
# HELP neos_active_public_sessions neos active_public_sessions value
# TYPE neos_active_public_sessions gauge
neos_active_public_sessions ${data.activePublicSessionCount}
# HELP neos_public_world_users neos public_world_users value
# TYPE neos_public_world_users gauge
neos_public_world_users ${data.publicWorldUserCount}`
}
// キャッシュ更新
const updateData = async () => {
const data = await getStatus()
cache = makeGaugeText(data)
}
// 初回取得
await updateData()
// 1分に1回更新
setInterval(async () => await updateData() , 60 * 1000)