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
| // services/monitoring/GameMetricsCollector.ts
class GameMetricsCollector {
private prometheus: PrometheusRegistry;
// 定义指标
private metrics = {
// 在线玩家数
onlinePlayers: new Gauge({
name: 'game_online_players',
help: 'Number of online players',
labelNames: ['server', 'region']
}),
// 游戏帧率
fps: new Histogram({
name: 'game_fps',
help: 'Game frames per second',
labelNames: ['server', 'scene'],
buckets: [30, 45, 55, 60]
}),
// 匹配延迟
matchLatency: new Histogram({
name: 'game_match_latency_ms',
help: 'Matchmaking latency in milliseconds',
labelNames: ['region'],
buckets: [50, 100, 200, 500, 1000, 2000]
}),
// 错误率
errors: new Counter({
name: 'game_errors_total',
help: 'Total number of errors',
labelNames: ['server', 'error_type', 'severity']
}),
// API 请求
apiRequests: new Counter({
name: 'game_api_requests_total',
help: 'Total number of API requests',
labelNames: ['method', 'endpoint', 'status']
}),
// 活跃玩家
activePlayers: new Gauge({
name: 'game_active_players',
help: 'Number of active players in last 24h',
labelNames: ['platform']
}),
// 收入
revenue: new Counter({
name: 'game_revenue_total',
help: 'Total revenue',
labelNames: ['currency', 'item_type']
}),
// 服务器负载
serverLoad: new Gauge({
name: 'game_server_load',
help: 'Server load percentage',
labelNames: ['server', 'type'] // cpu, memory, network
})
};
// 收集在线玩家数
async collectOnlinePlayers(servers: ServerInfo[]): Promise<void> {
for (const server of servers) {
const count = await this.getServerOnlinePlayerCount(server);
this.metrics.onlinePlayers.set(
{ server: server.name, region: server.region },
count
);
}
}
// 收集帧率
async collectFPS(server: ServerInfo): Promise<void> {
const fpsData = await this.getServerFPS(server);
for (const [scene, fps] of Object.entries(fpsData)) {
this.metrics.fps.observe(
{ server: server.name, scene },
fps
);
}
}
// 收集API指标
recordAPICall(method: string, endpoint: string, statusCode: number): void {
this.metrics.apiRequests.inc(
{ method, endpoint, status: statusCode.toString() }
);
}
// 收集收入
recordRevenue(currency: string, itemType: string, amount: number): void {
this.metrics.revenue.inc(
{ currency, item_type: itemType },
amount
);
}
// 收集错误
recordError(server: string, errorType: string, severity: string): void {
this.metrics.errors.inc(
{ server, error_type, severity }
);
}
}
|