-
Notifications
You must be signed in to change notification settings - Fork 167
Alibaba RSocket Broker Observability
Alibaba RSocket Broker可观测性,目前主要包括Metrics、Logging的支持。
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中三分钟上手阿里云日志服务Log Service: https://neatlifecoco.com/15589619730811.html
- Logback JSON encoder and appenders: https://github.com/logstash/logstash-logback-encoder
关于Spring Boot的logging特性,请访问: Spring Boot features logging 如果你使用ElasticSearch Stack,你可以参考这个演讲: https://xeraa.net/talks/logging-in-spring-boot-with-the-elastic-stack/
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,然后到调用方。
目前的一些工作:
- Zipkin Server With RSocket Collector: 通过RSocket fireAndForget完成span的采集。目前的方案是Spring Boot 2.2.x + @EnableZipkinServer + Spring RSocket https://github.com/linux-china/zipkin-rsocket-server
- Zipkin Sender RSocket实现,这个并不是什么问题。 可能需要提供一个ZipkinService,这样任何应用都可以通过RSocket Broker完成span发送,而不用关注Zipkin Server在哪里。 https://github.com/linux-china/zipkin-sender-rsocket
- Brave的TraceContext和RSocket Trace Metadata对接: 已经完成
希望通过这些调整能够将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 14提供了非常便捷的JFR API,可以进行实时的数据监控,相关的实现可以参考 https://github.com/linux-china/jfr-rsocket
- Binary: byte stream
- Async message
- Multi transports
- Reactive Semantics
- request/response
- request/stream
- fire-and-forget
- channel
- TCP+TLS
- WebSocket+TLS
- UDP(Aeron)
- RDMA