@roomkit/worker 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (158) hide show
  1. package/README.md +122 -0
  2. package/dist/src/admin/admin.controller.d.ts +275 -0
  3. package/dist/src/admin/admin.controller.d.ts.map +1 -0
  4. package/dist/src/admin/admin.controller.js +296 -0
  5. package/dist/src/admin/admin.controller.js.map +1 -0
  6. package/dist/src/admin/admin.module.d.ts +3 -0
  7. package/dist/src/admin/admin.module.d.ts.map +1 -0
  8. package/dist/src/admin/admin.module.js +35 -0
  9. package/dist/src/admin/admin.module.js.map +1 -0
  10. package/dist/src/admin/admin.service.d.ts +282 -0
  11. package/dist/src/admin/admin.service.d.ts.map +1 -0
  12. package/dist/src/admin/admin.service.js +508 -0
  13. package/dist/src/admin/admin.service.js.map +1 -0
  14. package/dist/src/auth/auth.module.d.ts +10 -0
  15. package/dist/src/auth/auth.module.d.ts.map +1 -0
  16. package/dist/src/auth/auth.module.js +37 -0
  17. package/dist/src/auth/auth.module.js.map +1 -0
  18. package/dist/src/auth/auth.service.d.ts +21 -0
  19. package/dist/src/auth/auth.service.d.ts.map +1 -0
  20. package/dist/src/auth/auth.service.js +69 -0
  21. package/dist/src/auth/auth.service.js.map +1 -0
  22. package/dist/src/circuit-breaker/circuit-breaker.module.d.ts +3 -0
  23. package/dist/src/circuit-breaker/circuit-breaker.module.d.ts.map +1 -0
  24. package/dist/src/circuit-breaker/circuit-breaker.module.js +24 -0
  25. package/dist/src/circuit-breaker/circuit-breaker.module.js.map +1 -0
  26. package/dist/src/circuit-breaker/circuit-breaker.service.d.ts +89 -0
  27. package/dist/src/circuit-breaker/circuit-breaker.service.d.ts.map +1 -0
  28. package/dist/src/circuit-breaker/circuit-breaker.service.js +207 -0
  29. package/dist/src/circuit-breaker/circuit-breaker.service.js.map +1 -0
  30. package/dist/src/config/config.module.d.ts +3 -0
  31. package/dist/src/config/config.module.d.ts.map +1 -0
  32. package/dist/src/config/config.module.js +22 -0
  33. package/dist/src/config/config.module.js.map +1 -0
  34. package/dist/src/config/config.service.d.ts +19 -0
  35. package/dist/src/config/config.service.d.ts.map +1 -0
  36. package/dist/src/config/config.service.js +58 -0
  37. package/dist/src/config/config.service.js.map +1 -0
  38. package/dist/src/config/worker.config.d.ts +82 -0
  39. package/dist/src/config/worker.config.d.ts.map +1 -0
  40. package/dist/src/config/worker.config.js +35 -0
  41. package/dist/src/config/worker.config.js.map +1 -0
  42. package/dist/src/index.d.ts +48 -0
  43. package/dist/src/index.d.ts.map +1 -0
  44. package/dist/src/index.js +108 -0
  45. package/dist/src/index.js.map +1 -0
  46. package/dist/src/lifecycle/graceful-shutdown.service.d.ts +71 -0
  47. package/dist/src/lifecycle/graceful-shutdown.service.d.ts.map +1 -0
  48. package/dist/src/lifecycle/graceful-shutdown.service.js +221 -0
  49. package/dist/src/lifecycle/graceful-shutdown.service.js.map +1 -0
  50. package/dist/src/lifecycle/index.d.ts +2 -0
  51. package/dist/src/lifecycle/index.d.ts.map +1 -0
  52. package/dist/src/lifecycle/index.js +18 -0
  53. package/dist/src/lifecycle/index.js.map +1 -0
  54. package/dist/src/main.d.ts +2 -0
  55. package/dist/src/main.d.ts.map +1 -0
  56. package/dist/src/main.js +54 -0
  57. package/dist/src/main.js.map +1 -0
  58. package/dist/src/metrics/metrics.controller.d.ts +15 -0
  59. package/dist/src/metrics/metrics.controller.d.ts.map +1 -0
  60. package/dist/src/metrics/metrics.controller.js +44 -0
  61. package/dist/src/metrics/metrics.controller.js.map +1 -0
  62. package/dist/src/metrics/metrics.module.d.ts +7 -0
  63. package/dist/src/metrics/metrics.module.d.ts.map +1 -0
  64. package/dist/src/metrics/metrics.module.js +28 -0
  65. package/dist/src/metrics/metrics.module.js.map +1 -0
  66. package/dist/src/metrics/metrics.service.d.ts +65 -0
  67. package/dist/src/metrics/metrics.service.d.ts.map +1 -0
  68. package/dist/src/metrics/metrics.service.js +306 -0
  69. package/dist/src/metrics/metrics.service.js.map +1 -0
  70. package/dist/src/migration/migration.module.d.ts +3 -0
  71. package/dist/src/migration/migration.module.d.ts.map +1 -0
  72. package/dist/src/migration/migration.module.js +30 -0
  73. package/dist/src/migration/migration.module.js.map +1 -0
  74. package/dist/src/migration/migration.service.d.ts +68 -0
  75. package/dist/src/migration/migration.service.d.ts.map +1 -0
  76. package/dist/src/migration/migration.service.js +295 -0
  77. package/dist/src/migration/migration.service.js.map +1 -0
  78. package/dist/src/migration/room-migration.service.d.ts +92 -0
  79. package/dist/src/migration/room-migration.service.d.ts.map +1 -0
  80. package/dist/src/migration/room-migration.service.js +297 -0
  81. package/dist/src/migration/room-migration.service.js.map +1 -0
  82. package/dist/src/redis/redis.module.d.ts +3 -0
  83. package/dist/src/redis/redis.module.d.ts.map +1 -0
  84. package/dist/src/redis/redis.module.js +22 -0
  85. package/dist/src/redis/redis.module.js.map +1 -0
  86. package/dist/src/redis/redis.service.d.ts +68 -0
  87. package/dist/src/redis/redis.service.d.ts.map +1 -0
  88. package/dist/src/redis/redis.service.js +260 -0
  89. package/dist/src/redis/redis.service.js.map +1 -0
  90. package/dist/src/room/client-proxy.d.ts +43 -0
  91. package/dist/src/room/client-proxy.d.ts.map +1 -0
  92. package/dist/src/room/client-proxy.js +91 -0
  93. package/dist/src/room/client-proxy.js.map +1 -0
  94. package/dist/src/room/game-room.d.ts +243 -0
  95. package/dist/src/room/game-room.d.ts.map +1 -0
  96. package/dist/src/room/game-room.js +434 -0
  97. package/dist/src/room/game-room.js.map +1 -0
  98. package/dist/src/room/message-handler.service.d.ts +70 -0
  99. package/dist/src/room/message-handler.service.d.ts.map +1 -0
  100. package/dist/src/room/message-handler.service.js +541 -0
  101. package/dist/src/room/message-handler.service.js.map +1 -0
  102. package/dist/src/room/room-manager.service.d.ts +132 -0
  103. package/dist/src/room/room-manager.service.d.ts.map +1 -0
  104. package/dist/src/room/room-manager.service.js +571 -0
  105. package/dist/src/room/room-manager.service.js.map +1 -0
  106. package/dist/src/room/room-persistence.service.d.ts +101 -0
  107. package/dist/src/room/room-persistence.service.d.ts.map +1 -0
  108. package/dist/src/room/room-persistence.service.js +307 -0
  109. package/dist/src/room/room-persistence.service.js.map +1 -0
  110. package/dist/src/room/room-registry.service.d.ts +16 -0
  111. package/dist/src/room/room-registry.service.d.ts.map +1 -0
  112. package/dist/src/room/room-registry.service.js +60 -0
  113. package/dist/src/room/room-registry.service.js.map +1 -0
  114. package/dist/src/room/room.module.d.ts +15 -0
  115. package/dist/src/room/room.module.d.ts.map +1 -0
  116. package/dist/src/room/room.module.js +55 -0
  117. package/dist/src/room/room.module.js.map +1 -0
  118. package/dist/src/room/rooms/echo-room.d.ts +18 -0
  119. package/dist/src/room/rooms/echo-room.d.ts.map +1 -0
  120. package/dist/src/room/rooms/echo-room.js +85 -0
  121. package/dist/src/room/rooms/echo-room.js.map +1 -0
  122. package/dist/src/room/rooms/index.d.ts +2 -0
  123. package/dist/src/room/rooms/index.d.ts.map +1 -0
  124. package/dist/src/room/rooms/index.js +6 -0
  125. package/dist/src/room/rooms/index.js.map +1 -0
  126. package/dist/src/worker.module.d.ts +10 -0
  127. package/dist/src/worker.module.d.ts.map +1 -0
  128. package/dist/src/worker.module.js +46 -0
  129. package/dist/src/worker.module.js.map +1 -0
  130. package/dist/test/circuit-breaker/circuit-breaker.service.spec.d.ts +2 -0
  131. package/dist/test/circuit-breaker/circuit-breaker.service.spec.d.ts.map +1 -0
  132. package/dist/test/circuit-breaker/circuit-breaker.service.spec.js +220 -0
  133. package/dist/test/circuit-breaker/circuit-breaker.service.spec.js.map +1 -0
  134. package/dist/test/integration/admin-api.spec.d.ts +2 -0
  135. package/dist/test/integration/admin-api.spec.d.ts.map +1 -0
  136. package/dist/test/integration/admin-api.spec.js +246 -0
  137. package/dist/test/integration/admin-api.spec.js.map +1 -0
  138. package/dist/test/migration/game-room-migration.spec.d.ts +2 -0
  139. package/dist/test/migration/game-room-migration.spec.d.ts.map +1 -0
  140. package/dist/test/migration/game-room-migration.spec.js +222 -0
  141. package/dist/test/migration/game-room-migration.spec.js.map +1 -0
  142. package/dist/test/room/client-proxy.spec.d.ts +2 -0
  143. package/dist/test/room/client-proxy.spec.d.ts.map +1 -0
  144. package/dist/test/room/client-proxy.spec.js +117 -0
  145. package/dist/test/room/client-proxy.spec.js.map +1 -0
  146. package/dist/test/room/game-room.spec.d.ts +2 -0
  147. package/dist/test/room/game-room.spec.d.ts.map +1 -0
  148. package/dist/test/room/game-room.spec.js +219 -0
  149. package/dist/test/room/game-room.spec.js.map +1 -0
  150. package/dist/test/room/room-manager.service.spec.d.ts +2 -0
  151. package/dist/test/room/room-manager.service.spec.d.ts.map +1 -0
  152. package/dist/test/room/room-manager.service.spec.js +280 -0
  153. package/dist/test/room/room-manager.service.spec.js.map +1 -0
  154. package/dist/test/setup.d.ts +2 -0
  155. package/dist/test/setup.d.ts.map +1 -0
  156. package/dist/test/setup.js +56 -0
  157. package/dist/test/setup.js.map +1 -0
  158. package/package.json +74 -0
@@ -0,0 +1,65 @@
1
+ import { OnModuleInit } from '@nestjs/common';
2
+ import { Counter, Gauge, Histogram } from 'prom-client';
3
+ import { ConfigService } from '../config/config.service';
4
+ /**
5
+ * Worker Prometheus 指标服务
6
+ * 提供房间、玩家、熔断器等监控指标
7
+ */
8
+ export declare class MetricsService implements OnModuleInit {
9
+ private readonly configService;
10
+ private readonly registry;
11
+ readonly roomsTotal: Counter;
12
+ readonly roomsCurrent: Gauge;
13
+ readonly roomsActive: Gauge;
14
+ readonly roomLifetime: Histogram;
15
+ readonly roomsByType: Gauge;
16
+ readonly playersTotal: Counter;
17
+ readonly playersCurrent: Gauge;
18
+ readonly playersPerRoom: Histogram;
19
+ readonly playerSessionDuration: Histogram;
20
+ readonly messagesProcessed: Counter;
21
+ readonly messageProcessingTime: Histogram;
22
+ readonly messageErrors: Counter;
23
+ readonly circuitBreakerState: Gauge;
24
+ readonly circuitBreakerTrips: Counter;
25
+ readonly circuitBreakerResets: Counter;
26
+ readonly pendingRequests: Gauge;
27
+ readonly migrationsTotal: Counter;
28
+ readonly migrationsSuccessful: Counter;
29
+ readonly migrationsFailed: Counter;
30
+ readonly migrationDuration: Histogram;
31
+ readonly uptime: Gauge;
32
+ readonly memoryUsage: Gauge;
33
+ readonly cpuUsage: Gauge;
34
+ constructor(configService: ConfigService);
35
+ onModuleInit(): void;
36
+ /**
37
+ * 启动定期指标收集
38
+ */
39
+ private startMetricsCollection;
40
+ /**
41
+ * 获取所有指标(Prometheus 格式)
42
+ */
43
+ getMetrics(): Promise<string>;
44
+ /**
45
+ * 获取指标 Content-Type
46
+ */
47
+ getContentType(): string;
48
+ recordRoomCreated(gameType: string): void;
49
+ recordRoomDisposed(gameType: string, lifetimeSeconds: number): void;
50
+ updateRoomCounts(total: number, active: number, byType: Record<string, number>): void;
51
+ recordPlayerJoined(): void;
52
+ recordPlayerLeft(sessionDurationSeconds: number): void;
53
+ updatePlayerCount(total: number): void;
54
+ recordPlayersPerRoom(count: number): void;
55
+ recordMessageProcessed(msgType: string, durationSeconds: number, success: boolean): void;
56
+ recordMessageError(msgType: string, errorType: string): void;
57
+ updateCircuitBreakerState(state: 'closed' | 'half-open' | 'open'): void;
58
+ recordCircuitBreakerTrip(reason: string): void;
59
+ recordCircuitBreakerReset(type: string): void;
60
+ updatePendingRequests(count: number): void;
61
+ recordMigrationStarted(direction: 'incoming' | 'outgoing'): void;
62
+ recordMigrationSuccess(direction: 'incoming' | 'outgoing', durationSeconds: number): void;
63
+ recordMigrationFailed(direction: 'incoming' | 'outgoing', reason: string): void;
64
+ }
65
+ //# sourceMappingURL=metrics.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.service.d.ts","sourceRoot":"","sources":["../../../src/metrics/metrics.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAc,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAC1D,OAAO,EAEL,OAAO,EACP,KAAK,EACL,SAAS,EAEV,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD;;;GAGG;AACH,qBACa,cAAe,YAAW,YAAY;IAsCrC,OAAO,CAAC,QAAQ,CAAC,aAAa;IArC1C,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAW;IAGpC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,YAAY,EAAE,KAAK,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,SAAS,CAAC;IACjC,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC;IAG5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,KAAK,CAAC;IAC/B,QAAQ,CAAC,cAAc,EAAE,SAAS,CAAC;IACnC,QAAQ,CAAC,qBAAqB,EAAE,SAAS,CAAC;IAG1C,QAAQ,CAAC,iBAAiB,EAAE,OAAO,CAAC;IACpC,QAAQ,CAAC,qBAAqB,EAAE,SAAS,CAAC;IAC1C,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAGhC,QAAQ,CAAC,mBAAmB,EAAE,KAAK,CAAC;IACpC,QAAQ,CAAC,mBAAmB,EAAE,OAAO,CAAC;IACtC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,eAAe,EAAE,KAAK,CAAC;IAGhC,QAAQ,CAAC,eAAe,EAAE,OAAO,CAAC;IAClC,QAAQ,CAAC,oBAAoB,EAAE,OAAO,CAAC;IACvC,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,iBAAiB,EAAE,SAAS,CAAC;IAGtC,QAAQ,CAAC,MAAM,EAAE,KAAK,CAAC;IACvB,QAAQ,CAAC,WAAW,EAAE,KAAK,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,KAAK,CAAC;gBAEI,aAAa,EAAE,aAAa;IA6KzD,YAAY;IAWZ;;OAEG;IACH,OAAO,CAAC,sBAAsB;IAgB9B;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC;IAInC;;OAEG;IACH,cAAc,IAAI,MAAM;IAMxB,iBAAiB,CAAC,QAAQ,EAAE,MAAM;IAIlC,kBAAkB,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM;IAK5D,gBAAgB,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC;IAW9E,kBAAkB;IAIlB,gBAAgB,CAAC,sBAAsB,EAAE,MAAM;IAK/C,iBAAiB,CAAC,KAAK,EAAE,MAAM;IAI/B,oBAAoB,CAAC,KAAK,EAAE,MAAM;IAMlC,sBAAsB,CAAC,OAAO,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,OAAO,EAAE,OAAO;IAKjF,kBAAkB,CAAC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM;IAMrD,yBAAyB,CAAC,KAAK,EAAE,QAAQ,GAAG,WAAW,GAAG,MAAM;IAKhE,wBAAwB,CAAC,MAAM,EAAE,MAAM;IAIvC,yBAAyB,CAAC,IAAI,EAAE,MAAM;IAItC,qBAAqB,CAAC,KAAK,EAAE,MAAM;IAMnC,sBAAsB,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU;IAIzD,sBAAsB,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,EAAE,eAAe,EAAE,MAAM;IAKlF,qBAAqB,CAAC,SAAS,EAAE,UAAU,GAAG,UAAU,EAAE,MAAM,EAAE,MAAM;CAGzE"}
@@ -0,0 +1,306 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ var __metadata = (this && this.__metadata) || function (k, v) {
9
+ if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
10
+ };
11
+ Object.defineProperty(exports, "__esModule", { value: true });
12
+ exports.MetricsService = void 0;
13
+ const common_1 = require("@nestjs/common");
14
+ const prom_client_1 = require("prom-client");
15
+ const config_service_1 = require("../config/config.service");
16
+ /**
17
+ * Worker Prometheus 指标服务
18
+ * 提供房间、玩家、熔断器等监控指标
19
+ */
20
+ let MetricsService = class MetricsService {
21
+ configService;
22
+ registry;
23
+ // 房间指标
24
+ roomsTotal;
25
+ roomsCurrent;
26
+ roomsActive;
27
+ roomLifetime;
28
+ roomsByType;
29
+ // 玩家指标
30
+ playersTotal;
31
+ playersCurrent;
32
+ playersPerRoom;
33
+ playerSessionDuration;
34
+ // 消息处理指标
35
+ messagesProcessed;
36
+ messageProcessingTime;
37
+ messageErrors;
38
+ // 熔断器指标
39
+ circuitBreakerState;
40
+ circuitBreakerTrips;
41
+ circuitBreakerResets;
42
+ pendingRequests;
43
+ // 迁移指标
44
+ migrationsTotal;
45
+ migrationsSuccessful;
46
+ migrationsFailed;
47
+ migrationDuration;
48
+ // 系统指标
49
+ uptime;
50
+ memoryUsage;
51
+ cpuUsage;
52
+ constructor(configService) {
53
+ this.configService = configService;
54
+ this.registry = new prom_client_1.Registry();
55
+ // 设置默认标签
56
+ this.registry.setDefaultLabels({
57
+ app: 'worker',
58
+ instance: this.configService.workerId,
59
+ });
60
+ // 房间指标
61
+ this.roomsTotal = new prom_client_1.Counter({
62
+ name: 'worker_rooms_total',
63
+ help: 'Total number of rooms created',
64
+ labelNames: ['game_type', 'status'], // created, disposed, migrated
65
+ registers: [this.registry],
66
+ });
67
+ this.roomsCurrent = new prom_client_1.Gauge({
68
+ name: 'worker_rooms_current',
69
+ help: 'Current number of active rooms',
70
+ registers: [this.registry],
71
+ });
72
+ this.roomsActive = new prom_client_1.Gauge({
73
+ name: 'worker_rooms_active',
74
+ help: 'Number of rooms in active/playing state',
75
+ registers: [this.registry],
76
+ });
77
+ this.roomLifetime = new prom_client_1.Histogram({
78
+ name: 'worker_room_lifetime_seconds',
79
+ help: 'Room lifetime in seconds',
80
+ buckets: [60, 300, 600, 1800, 3600, 7200, 14400],
81
+ labelNames: ['game_type'],
82
+ registers: [this.registry],
83
+ });
84
+ this.roomsByType = new prom_client_1.Gauge({
85
+ name: 'worker_rooms_by_type',
86
+ help: 'Number of rooms by game type',
87
+ labelNames: ['game_type'],
88
+ registers: [this.registry],
89
+ });
90
+ // 玩家指标
91
+ this.playersTotal = new prom_client_1.Counter({
92
+ name: 'worker_players_total',
93
+ help: 'Total number of players joined',
94
+ labelNames: ['action'], // joined, left
95
+ registers: [this.registry],
96
+ });
97
+ this.playersCurrent = new prom_client_1.Gauge({
98
+ name: 'worker_players_current',
99
+ help: 'Current number of players across all rooms',
100
+ registers: [this.registry],
101
+ });
102
+ this.playersPerRoom = new prom_client_1.Histogram({
103
+ name: 'worker_players_per_room',
104
+ help: 'Distribution of players per room',
105
+ buckets: [1, 2, 3, 4, 6, 8, 10, 15, 20, 50],
106
+ registers: [this.registry],
107
+ });
108
+ this.playerSessionDuration = new prom_client_1.Histogram({
109
+ name: 'worker_player_session_duration_seconds',
110
+ help: 'Player session duration in seconds',
111
+ buckets: [30, 60, 180, 300, 600, 1200, 1800, 3600],
112
+ registers: [this.registry],
113
+ });
114
+ // 消息处理指标
115
+ this.messagesProcessed = new prom_client_1.Counter({
116
+ name: 'worker_messages_processed_total',
117
+ help: 'Total number of messages processed',
118
+ labelNames: ['msg_type', 'status'], // success, error
119
+ registers: [this.registry],
120
+ });
121
+ this.messageProcessingTime = new prom_client_1.Histogram({
122
+ name: 'worker_message_processing_seconds',
123
+ help: 'Message processing time in seconds',
124
+ buckets: [0.001, 0.005, 0.01, 0.025, 0.05, 0.1, 0.25, 0.5, 1],
125
+ labelNames: ['msg_type'],
126
+ registers: [this.registry],
127
+ });
128
+ this.messageErrors = new prom_client_1.Counter({
129
+ name: 'worker_message_errors_total',
130
+ help: 'Total number of message processing errors',
131
+ labelNames: ['msg_type', 'error_type'],
132
+ registers: [this.registry],
133
+ });
134
+ // 熔断器指标
135
+ this.circuitBreakerState = new prom_client_1.Gauge({
136
+ name: 'worker_circuit_breaker_state',
137
+ help: 'Circuit breaker state (0=closed, 1=half-open, 2=open)',
138
+ registers: [this.registry],
139
+ });
140
+ this.circuitBreakerTrips = new prom_client_1.Counter({
141
+ name: 'worker_circuit_breaker_trips_total',
142
+ help: 'Total number of circuit breaker trips',
143
+ labelNames: ['reason'], // failures, manual
144
+ registers: [this.registry],
145
+ });
146
+ this.circuitBreakerResets = new prom_client_1.Counter({
147
+ name: 'worker_circuit_breaker_resets_total',
148
+ help: 'Total number of circuit breaker resets',
149
+ labelNames: ['type'], // auto, manual
150
+ registers: [this.registry],
151
+ });
152
+ this.pendingRequests = new prom_client_1.Gauge({
153
+ name: 'worker_pending_requests',
154
+ help: 'Number of pending requests in circuit breaker',
155
+ registers: [this.registry],
156
+ });
157
+ // 迁移指标
158
+ this.migrationsTotal = new prom_client_1.Counter({
159
+ name: 'worker_migrations_total',
160
+ help: 'Total number of room migrations',
161
+ labelNames: ['direction'], // incoming, outgoing
162
+ registers: [this.registry],
163
+ });
164
+ this.migrationsSuccessful = new prom_client_1.Counter({
165
+ name: 'worker_migrations_successful_total',
166
+ help: 'Total number of successful migrations',
167
+ labelNames: ['direction'],
168
+ registers: [this.registry],
169
+ });
170
+ this.migrationsFailed = new prom_client_1.Counter({
171
+ name: 'worker_migrations_failed_total',
172
+ help: 'Total number of failed migrations',
173
+ labelNames: ['direction', 'reason'],
174
+ registers: [this.registry],
175
+ });
176
+ this.migrationDuration = new prom_client_1.Histogram({
177
+ name: 'worker_migration_duration_seconds',
178
+ help: 'Room migration duration in seconds',
179
+ buckets: [0.1, 0.5, 1, 2, 5, 10, 30],
180
+ labelNames: ['direction'],
181
+ registers: [this.registry],
182
+ });
183
+ // 系统指标
184
+ this.uptime = new prom_client_1.Gauge({
185
+ name: 'worker_uptime_seconds',
186
+ help: 'Worker uptime in seconds',
187
+ registers: [this.registry],
188
+ });
189
+ this.memoryUsage = new prom_client_1.Gauge({
190
+ name: 'worker_memory_usage_bytes',
191
+ help: 'Memory usage in bytes',
192
+ labelNames: ['type'],
193
+ registers: [this.registry],
194
+ });
195
+ this.cpuUsage = new prom_client_1.Gauge({
196
+ name: 'worker_cpu_usage_percent',
197
+ help: 'CPU usage percentage',
198
+ registers: [this.registry],
199
+ });
200
+ }
201
+ onModuleInit() {
202
+ // 收集默认的 Node.js 指标
203
+ (0, prom_client_1.collectDefaultMetrics)({
204
+ register: this.registry,
205
+ prefix: 'worker_nodejs_',
206
+ });
207
+ // 定期更新系统指标
208
+ this.startMetricsCollection();
209
+ }
210
+ /**
211
+ * 启动定期指标收集
212
+ */
213
+ startMetricsCollection() {
214
+ const startTime = Date.now();
215
+ setInterval(() => {
216
+ // 更新运行时间
217
+ this.uptime.set((Date.now() - startTime) / 1000);
218
+ // 更新内存使用
219
+ const memory = process.memoryUsage();
220
+ this.memoryUsage.labels('heap_used').set(memory.heapUsed);
221
+ this.memoryUsage.labels('heap_total').set(memory.heapTotal);
222
+ this.memoryUsage.labels('rss').set(memory.rss);
223
+ this.memoryUsage.labels('external').set(memory.external);
224
+ }, 5000);
225
+ }
226
+ /**
227
+ * 获取所有指标(Prometheus 格式)
228
+ */
229
+ async getMetrics() {
230
+ return this.registry.metrics();
231
+ }
232
+ /**
233
+ * 获取指标 Content-Type
234
+ */
235
+ getContentType() {
236
+ return this.registry.contentType;
237
+ }
238
+ // ============ 房间指标方法 ============
239
+ recordRoomCreated(gameType) {
240
+ this.roomsTotal.labels(gameType, 'created').inc();
241
+ }
242
+ recordRoomDisposed(gameType, lifetimeSeconds) {
243
+ this.roomsTotal.labels(gameType, 'disposed').inc();
244
+ this.roomLifetime.labels(gameType).observe(lifetimeSeconds);
245
+ }
246
+ updateRoomCounts(total, active, byType) {
247
+ this.roomsCurrent.set(total);
248
+ this.roomsActive.set(active);
249
+ for (const [gameType, count] of Object.entries(byType)) {
250
+ this.roomsByType.labels(gameType).set(count);
251
+ }
252
+ }
253
+ // ============ 玩家指标方法 ============
254
+ recordPlayerJoined() {
255
+ this.playersTotal.labels('joined').inc();
256
+ }
257
+ recordPlayerLeft(sessionDurationSeconds) {
258
+ this.playersTotal.labels('left').inc();
259
+ this.playerSessionDuration.observe(sessionDurationSeconds);
260
+ }
261
+ updatePlayerCount(total) {
262
+ this.playersCurrent.set(total);
263
+ }
264
+ recordPlayersPerRoom(count) {
265
+ this.playersPerRoom.observe(count);
266
+ }
267
+ // ============ 消息指标方法 ============
268
+ recordMessageProcessed(msgType, durationSeconds, success) {
269
+ this.messagesProcessed.labels(msgType, success ? 'success' : 'error').inc();
270
+ this.messageProcessingTime.labels(msgType).observe(durationSeconds);
271
+ }
272
+ recordMessageError(msgType, errorType) {
273
+ this.messageErrors.labels(msgType, errorType).inc();
274
+ }
275
+ // ============ 熔断器指标方法 ============
276
+ updateCircuitBreakerState(state) {
277
+ const stateValue = state === 'closed' ? 0 : state === 'half-open' ? 1 : 2;
278
+ this.circuitBreakerState.set(stateValue);
279
+ }
280
+ recordCircuitBreakerTrip(reason) {
281
+ this.circuitBreakerTrips.labels(reason).inc();
282
+ }
283
+ recordCircuitBreakerReset(type) {
284
+ this.circuitBreakerResets.labels(type).inc();
285
+ }
286
+ updatePendingRequests(count) {
287
+ this.pendingRequests.set(count);
288
+ }
289
+ // ============ 迁移指标方法 ============
290
+ recordMigrationStarted(direction) {
291
+ this.migrationsTotal.labels(direction).inc();
292
+ }
293
+ recordMigrationSuccess(direction, durationSeconds) {
294
+ this.migrationsSuccessful.labels(direction).inc();
295
+ this.migrationDuration.labels(direction).observe(durationSeconds);
296
+ }
297
+ recordMigrationFailed(direction, reason) {
298
+ this.migrationsFailed.labels(direction, reason).inc();
299
+ }
300
+ };
301
+ exports.MetricsService = MetricsService;
302
+ exports.MetricsService = MetricsService = __decorate([
303
+ (0, common_1.Injectable)(),
304
+ __metadata("design:paramtypes", [config_service_1.ConfigService])
305
+ ], MetricsService);
306
+ //# sourceMappingURL=metrics.service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"metrics.service.js","sourceRoot":"","sources":["../../../src/metrics/metrics.service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare class MigrationModule {
2
+ }
3
+ //# sourceMappingURL=migration.module.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.module.d.ts","sourceRoot":"","sources":["../../../src/migration/migration.module.ts"],"names":[],"mappings":"AAOA,qBASa,eAAe;CAAG"}
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+ var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
3
+ var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
4
+ if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
5
+ else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
6
+ return c > 3 && r && Object.defineProperty(target, key, r), r;
7
+ };
8
+ Object.defineProperty(exports, "__esModule", { value: true });
9
+ exports.MigrationModule = void 0;
10
+ const common_1 = require("@nestjs/common");
11
+ const migration_service_1 = require("./migration.service");
12
+ const room_migration_service_1 = require("./room-migration.service");
13
+ const config_module_1 = require("../config/config.module");
14
+ const redis_module_1 = require("../redis/redis.module");
15
+ const room_module_1 = require("../room/room.module");
16
+ let MigrationModule = class MigrationModule {
17
+ };
18
+ exports.MigrationModule = MigrationModule;
19
+ exports.MigrationModule = MigrationModule = __decorate([
20
+ (0, common_1.Module)({
21
+ imports: [
22
+ config_module_1.ConfigModule,
23
+ redis_module_1.RedisModule,
24
+ (0, common_1.forwardRef)(() => room_module_1.RoomModule),
25
+ ],
26
+ providers: [migration_service_1.MigrationService, room_migration_service_1.RoomMigrationService],
27
+ exports: [migration_service_1.MigrationService, room_migration_service_1.RoomMigrationService],
28
+ })
29
+ ], MigrationModule);
30
+ //# sourceMappingURL=migration.module.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.module.js","sourceRoot":"","sources":["../../../src/migration/migration.module.ts"],"names":[],"mappings":";;;;;;;;;AAAA,2CAAoD;AACpD,2DAAuD;AACvD,qEAAgE;AAChE,2DAAuD;AACvD,wDAAoD;AACpD,qDAAiD;AAW1C,IAAM,eAAe,GAArB,MAAM,eAAe;CAAG,CAAA;AAAlB,0CAAe;0BAAf,eAAe;IAT3B,IAAA,eAAM,EAAC;QACN,OAAO,EAAE;YACP,4BAAY;YACZ,0BAAW;YACX,IAAA,mBAAU,EAAC,GAAG,EAAE,CAAC,wBAAU,CAAC;SAC7B;QACD,SAAS,EAAE,CAAC,oCAAgB,EAAE,6CAAoB,CAAC;QACnD,OAAO,EAAE,CAAC,oCAAgB,EAAE,6CAAoB,CAAC;KAClD,CAAC;GACW,eAAe,CAAG"}
@@ -0,0 +1,68 @@
1
+ import { ConfigService } from '../config/config.service';
2
+ import { RedisService } from '../redis/redis.service';
3
+ import { RoomManagerService } from '../room/room-manager.service';
4
+ import { RoomSnapshot, RoomMigrationRequest, RoomMigrationResult, MigrationStatus } from '@roomkit/core';
5
+ /**
6
+ * 房间迁移服务
7
+ * 负责房间的导出、导入和迁移协调
8
+ */
9
+ export declare class MigrationService {
10
+ private readonly configService;
11
+ private readonly redisService;
12
+ private readonly roomManagerService;
13
+ private readonly logger;
14
+ private activeMigrations;
15
+ constructor(configService: ConfigService, redisService: RedisService, roomManagerService: RoomManagerService);
16
+ /**
17
+ * 创建房间快照(迁移出口)
18
+ */
19
+ createSnapshot(roomId: string): Promise<RoomSnapshot | null>;
20
+ /**
21
+ * 从快照恢复房间(迁移入口)
22
+ */
23
+ restoreFromSnapshot(snapshot: RoomSnapshot): Promise<boolean>;
24
+ /**
25
+ * 清理源 Worker 上的房间(迁移完成后调用)
26
+ */
27
+ cleanupSourceRoom(roomId: string): Promise<boolean>;
28
+ /**
29
+ * 更新 Redis 中的房间映射
30
+ */
31
+ private updateRoomMapping;
32
+ /**
33
+ * 发起完整迁移流程
34
+ * 这个方法在管理端调用,协调整个迁移过程
35
+ */
36
+ inititateMigration(request: RoomMigrationRequest): Promise<RoomMigrationResult>;
37
+ /**
38
+ * 更新迁移状态
39
+ */
40
+ private updateMigrationStatus;
41
+ /**
42
+ * 通过 Redis 向源 Worker 请求快照
43
+ */
44
+ private requestSnapshot;
45
+ /**
46
+ * 通过 Redis 向目标 Worker 请求恢复
47
+ */
48
+ private requestRestore;
49
+ /**
50
+ * 请求清理源 Worker 上的房间
51
+ */
52
+ private requestCleanup;
53
+ /**
54
+ * 获取当前迁移状态
55
+ */
56
+ getMigrationStatus(roomId: string): MigrationStatus | null;
57
+ /**
58
+ * 获取所有活跃迁移
59
+ */
60
+ getActiveMigrations(): Array<{
61
+ roomId: string;
62
+ status: MigrationStatus;
63
+ startTime: number;
64
+ request: RoomMigrationRequest;
65
+ }>;
66
+ private sleep;
67
+ }
68
+ //# sourceMappingURL=migration.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"migration.service.d.ts","sourceRoot":"","sources":["../../../src/migration/migration.service.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AACzD,OAAO,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACtD,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EACL,YAAY,EACZ,oBAAoB,EACpB,mBAAmB,EACnB,eAAe,EAEhB,MAAM,eAAe,CAAC;AAEvB;;;GAGG;AACH,qBACa,gBAAgB;IAWzB,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,YAAY;IAC7B,OAAO,CAAC,QAAQ,CAAC,kBAAkB;IAZrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAqC;IAG5D,OAAO,CAAC,gBAAgB,CAInB;gBAGc,aAAa,EAAE,aAAa,EAC5B,YAAY,EAAE,YAAY,EAC1B,kBAAkB,EAAE,kBAAkB;IAGzD;;OAEG;IACG,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA6BlE;;OAEG;IACG,mBAAmB,CAAC,QAAQ,EAAE,YAAY,GAAG,OAAO,CAAC,OAAO,CAAC;IAiDnE;;OAEG;IACG,iBAAiB,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAoBzD;;OAEG;YACW,iBAAiB;IAK/B;;;OAGG;IACG,kBAAkB,CAAC,OAAO,EAAE,oBAAoB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IAoErF;;OAEG;IACH,OAAO,CAAC,qBAAqB;IAO7B;;OAEG;YACW,eAAe;IAiC7B;;OAEG;YACW,cAAc;IA+B5B;;OAEG;YACW,cAAc;IAW5B;;OAEG;IACH,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,IAAI;IAK1D;;OAEG;IACH,mBAAmB,IAAI,KAAK,CAAC;QAC3B,MAAM,EAAE,MAAM,CAAC;QACf,MAAM,EAAE,eAAe,CAAC;QACxB,SAAS,EAAE,MAAM,CAAC;QAClB,OAAO,EAAE,oBAAoB,CAAC;KAC/B,CAAC;IAOF,OAAO,CAAC,KAAK;CAGd"}