使用 Spring 公开有关当前 Websocket 连接的指标

Exposing metrics about current Websocket connections with Spring

对于我的仪表板应用程序,我想使用内部 Spring 指标监控我的 Spring 基于引导的应用程序。因此,我使用 spring-boot-actuator 依赖项,它公开了很多内部指标。有很多基于 HTTP 的指标和 Tomcat 指标,例如当前会话、状态 X 的 HTTP 调用量等。我找不到关于我的 Websocket 连接的任何信息。

是否有针对当前 Websockets 的开箱即用指标公开工具 Spring,或者我是否必须创建自己的指标(例如,用于在 Grafana 中使用 Prometheus 显示数据)并拥有手动注册例如当我收到 SessionConnectEventSessionConnectEvent?

时更新的计数器

提前致谢!

如果您在 WebSocket 上使用 STOMP,Spring 会从 WebSocketMessageBrokerStats 中设置的关键基础结构组件聚合有关内部状态和计数器的信息,默认情况下每 30 秒记录一次。它被创建为一个 Spring bean,可以很容易地自动装配。这是您将获得的信息示例:

目前没有执行器端点,但我已经将它们创建为我的 Spring WebSocket Chat 示例的一部分:

找到了非常简单的方法。

如果您在 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();
  }