Skip to content
This repository has been archived by the owner on Jul 16, 2024. It is now read-only.

Alibaba RSocket Broker Observability

linux_china edited this page Aug 27, 2020 · 16 revisions

Alibaba RSocket Broker可观测性,目前主要包括Metrics、Logging的支持。

Prometheus支持

Alibaba RSocket Broker是基于Spring Boot的应用,默认集成了Micrometer的Prometheus模块, 我们可以通过 http://localhost:9997/actuator/prometheus 就可以访问Prometheus格式的metrics。

另外,我们只需要在Prometheus的配置项中添加rsocket broker对应的scrape_config,配置样例如下:

scrape_configs:
  - job_name: 'alibaba-rsocket-broker'
    metrics_path: '/actuator/prometheus'
    scrape_interval: 5s
    static_configs:
      - targets: ['broker_ip:9997']

还有一种简单的方式就是使用file_sd_configs,样例如下:

scrape_configs:
  - job_name: 'alibaba-rsocket-broker'
    file_sd_configs:
    - files:
      # http://localhost:9998/metrics/prometheus/broker/targets
      - '/etc/prometheus/alibaba-rsocket-brokers.json'

RSocket Broker默认提供了快速生成Prometheus file_sd_configs需要的json数据格式, 你只需要将 http://localhost:9998/metrics/prometheus/broker/targets 的内容保存为alibaba-rsocket-brokers.json就可以啦。 你只需要创建一个cron tab,定期访问上述URL然后刷新json文件内容就可以啦。crontab规则参考 https://crontab.guru/

*/5 * * * * root curl -o /etc/prometheus/alibaba-rsocket-apps.json http://broker-ip-here:9998/metrics/prometheus/app/targets

同样的道理,如果你要采集所有连接到Broker上应用的metrics信息,配置如下:

scrape_configs:
- job_name: 'alibaba-rsocket-apps'
  file_sd_configs:
  - files:
    # http://localhost:9998/metrics/prometheus/app/targets
    - '/etc/prometheus/alibaba-rsocket-apps.json'

样例demo请参考: https://github.com/alibaba/alibaba-rsocket-broker/tree/master/alibaba-broker-server/src/main/config

注意: RSocket Broker的Metrics采集机制有些不同,它并不要求应用通过HTTP暴露metrics REST API,而是通过RSocket的对等通讯机制实现的。 当Prometheus发起一个Metrics HTTP pull请求给broker后,broker发起一个metrics采集的request给连接的应用实例,然后应用返回对应的Prometheus文本,然后在返回给Prometheus。 这种机制的好处有以下几点:

  • 应用无需HTTP暴露,这样更安全更简单
  • 更能适应复杂的网络:如果你的Prometheus在云端,而应用部署在Edge端或者办公室等,云端可能无法访问这些应用,而通过RSocket Broker,无论应用在哪里,都能采集metrics。
  • 简单高效:Prometheus只需要跟踪几台broker就可以,网络性能都非常容易做到。

更多关于Micrometer的Prometheus和Grafana集成,请参考Micrometer Prometheus文档 http://micrometer.io/docs/registry/prometheus

这里列举一下默认的一些metrics项:

  • Traffic: 基于service name的调用次数, RSocket的四个通讯接口调用次数
  • Latency: RT for request/response
  • Gauge: 连接到broker的应用数、服务接口数量、服务提供方数量, broker集群的机器数
  • Errors: 超时错误
  • Utilization: JVM
  • Saturation: 主要是RSocket的消息发送队列和等待返回队列

当然Reactor和Micrometer都提供了非常多框架的Metrics集成,你可以自行扩展。

日志支持

Spring Boot支持使用logback或者log4j进行日志记录,不少日志系统也提供了对应的Logback、Log4j和Spring Boot的支持,大家可以自行参考日志系统对应的开发文档。 这里列举一些接入案例供大家参考:

关于Spring Boot的logging特性,请访问: Spring Boot features logging 如果你使用ElasticSearch Stack,你可以参考这个演讲: https://xeraa.net/talks/logging-in-spring-boot-with-the-elastic-stack/

Tracing

RSocket在协议设计上,已经考虑到对Tracing的支持,可以参考 https://github.com/rsocket/rsocket/blob/master/Extensions/Tracing-Zipkin.md Alibaba RSocket Broker目前也添加了对Tracing的支持。 如果你使用了Spring Cloud的spring-cloud-starter-zipkin,alibaba rsocket starter会默认适配。
工作的原理也很简单: Reactor的context会包含Brave的TraceContext,而TraceContext信息会被转换为TraceMetadata,一直传递给broker,然后到调用方。

目前的一些工作:

希望通过这些调整能够将Tracing整合到Broker,同时不影响Broker的性能,于此同时Zipkin服务RSocket化,应用不用进行Zipkin相关的配置。

实现思路

  • Responder Handler实现: 如果你现在就像实现Tracing的功能,我们建议在RSocketBrokerResponderHandler.java和RSocketResponderHandler.java中添加Tracing支持。
 ScopedSpan span = tracer.startScopedSpanWithParent("alibaba-rsocket-broker",parentSpan);
 return rsocket.requestResponse(payload)
                .doOnError((span::error))
                .doFinally((signalType -> span.finish()));
  • RSocketInterceptor: 通过ResponderPlugin,拦截RSocket,解析TracingMetadata完成trace。

Java Flight Recorder

Java 14提供了非常便捷的JFR API,可以进行实时的数据监控,相关的实现可以参考 https://github.com/linux-china/jfr-rsocket

RSocket

Network Protocol

  • Binary: byte stream
  • Async message
  • Multi transports
  • Reactive Semantics

Symmetric interactions

  • request/response
  • request/stream
  • fire-and-forget
  • channel

Transports

  • TCP+TLS
  • WebSocket+TLS
  • UDP(Aeron)
  • RDMA

Polyglot

Clone this wiki locally