使用 Spring 公开有关当前 Websocket 连接的指标
Exposing metrics about current Websocket connections with Spring
对于我的仪表板应用程序,我想使用内部 Spring 指标监控我的 Spring 基于引导的应用程序。因此,我使用 spring-boot-actuator
依赖项,它公开了很多内部指标。有很多基于 HTTP 的指标和 Tomcat 指标,例如当前会话、状态 X 的 HTTP 调用量等。我找不到关于我的 Websocket 连接的任何信息。
是否有针对当前 Websockets 的开箱即用指标公开工具 Spring,或者我是否必须创建自己的指标(例如,用于在 Grafana 中使用 Prometheus 显示数据)并拥有手动注册例如当我收到 SessionConnectEvent
或 SessionConnectEvent
?
时更新的计数器
提前致谢!
如果您在 WebSocket 上使用 STOMP,Spring 会从 WebSocketMessageBrokerStats
中设置的关键基础结构组件聚合有关内部状态和计数器的信息,默认情况下每 30 秒记录一次。它被创建为一个 Spring bean,可以很容易地自动装配。这是您将获得的信息示例:
目前没有执行器端点,但我已经将它们创建为我的 Spring WebSocket Chat 示例的一部分:
- Trace Endpoint: 公开 WebSocket 痕迹
- Mappings Endpoint:公开 WebSocket 消息映射
- Stats Endpoint:公开 WebSocketMessageBrokerStats
找到了非常简单的方法。
如果您在 WebSocket 上使用 STOMP,在您的控制器中 class 只需自动装配 WebSocketMessageBrokerStats class 并使用它的方法。
@Autowired
WebSocketMessageBrokerStats webSocketMessageBrokerStats;
System.out.println("Session Stats info " +webSocketMessageBrokerStats.getWebSocketSessionStatsInfo());
无需创建任何单独的 class。
阅读 https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#websocket-stomp-stats 了解更多信息。
另外,还有一个办法。如果您想获得有关活动会话的更多详细信息,那么它包含在 SubProtocolWebSocketHandler
中。这个 bean 处理活动会话并有一个方法 getStats
。 Stats 对象有方法:
int getTotalSessions();
int getWebSocketSessions();
int getHttpStreamingSessions();
int getHttpPollingSessions();
int getLimitExceededSessions();
int getNoMessagesReceivedSessions();
int getTransportErrorSessions();
实际上 WebSocketMessageBrokerStats
使用方法 #SubProtocolWebSocketHandler.getStatsInfo
调用 Stats 对象 toSting
。
因此,可能的代码如下所示:
@Autowired
private WebSocketHandler webSocketHandler;
@GetMapping("/total")
public int getTotalSessions() {
return ((SubProtocolWebSocketHandler) webSocketHandler).getStats().getTotalSessions();
}
对于我的仪表板应用程序,我想使用内部 Spring 指标监控我的 Spring 基于引导的应用程序。因此,我使用 spring-boot-actuator
依赖项,它公开了很多内部指标。有很多基于 HTTP 的指标和 Tomcat 指标,例如当前会话、状态 X 的 HTTP 调用量等。我找不到关于我的 Websocket 连接的任何信息。
是否有针对当前 Websockets 的开箱即用指标公开工具 Spring,或者我是否必须创建自己的指标(例如,用于在 Grafana 中使用 Prometheus 显示数据)并拥有手动注册例如当我收到 SessionConnectEvent
或 SessionConnectEvent
?
提前致谢!
如果您在 WebSocket 上使用 STOMP,Spring 会从 WebSocketMessageBrokerStats
中设置的关键基础结构组件聚合有关内部状态和计数器的信息,默认情况下每 30 秒记录一次。它被创建为一个 Spring bean,可以很容易地自动装配。这是您将获得的信息示例:
目前没有执行器端点,但我已经将它们创建为我的 Spring WebSocket Chat 示例的一部分:
- Trace Endpoint: 公开 WebSocket 痕迹
- Mappings Endpoint:公开 WebSocket 消息映射
- Stats Endpoint:公开 WebSocketMessageBrokerStats
找到了非常简单的方法。
如果您在 WebSocket 上使用 STOMP,在您的控制器中 class 只需自动装配 WebSocketMessageBrokerStats class 并使用它的方法。
@Autowired
WebSocketMessageBrokerStats webSocketMessageBrokerStats;
System.out.println("Session Stats info " +webSocketMessageBrokerStats.getWebSocketSessionStatsInfo());
无需创建任何单独的 class。
阅读 https://docs.spring.io/spring/docs/current/spring-framework-reference/web.html#websocket-stomp-stats 了解更多信息。
另外,还有一个办法。如果您想获得有关活动会话的更多详细信息,那么它包含在 SubProtocolWebSocketHandler
中。这个 bean 处理活动会话并有一个方法 getStats
。 Stats 对象有方法:
int getTotalSessions();
int getWebSocketSessions();
int getHttpStreamingSessions();
int getHttpPollingSessions();
int getLimitExceededSessions();
int getNoMessagesReceivedSessions();
int getTransportErrorSessions();
实际上 WebSocketMessageBrokerStats
使用方法 #SubProtocolWebSocketHandler.getStatsInfo
调用 Stats 对象 toSting
。
因此,可能的代码如下所示:
@Autowired
private WebSocketHandler webSocketHandler;
@GetMapping("/total")
public int getTotalSessions() {
return ((SubProtocolWebSocketHandler) webSocketHandler).getStats().getTotalSessions();
}