kafka-streams 在 kafka 连接失败时发出警报
kafka-streams alert on kafka connection faliure
当kafka-streams应用程序运行并且Kafka突然宕机时,应用程序进入“等待”模式,向其发送警告日志的消费者和生产者线程无法连接,当Kafka回来了,一切都应该(理论上)恢复正常。
我正试图就这种情况发出警报,但我无法找到捕捉它并发送 log/metric 的地方。
我尝试了以下方法:
streams.setUncaughtExceptionHandler
但这只发生在例外情况下,这里不是这种情况
- 扩展
ProductionExceptionHandler
并将 default.production.exception.handler
属性 更改为我的 class 以扩展此接口。再次,与 setUncaughtExceptionHandler
一样,这里没有抛出异常,所以什么都没有发生。
我知道 Kafka 有自己的指标,我可以听取这些指标并发现代理是否已关闭。但在某些情况下,Kafka 代理可以正常工作,而我的 kafka-streams 应用程序无法连接(即错误的身份验证配置或 vpn/vpc 问题)
我能做些什么来发现这些问题并记录它们/报告它们?
更新
如果 kafka 不可用,请查看 consumer/producer 日志:
2020-08-24 21:41:32,055 [my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-StreamThread-1] WARN o.apache.kafka.clients.NetworkClient - [] [Consumer clientId=my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-StreamThread-1-consumer, groupId=my-kafka-streams-app] Bootstrap broker localhost:9092 (id: -1 rack: null) disconnected
2020-08-24 21:41:32,186 [kafka-admin-client-thread | my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-admin] WARN o.apache.kafka.clients.NetworkClient - [] [AdminClient clientId=my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-admin] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
2020-08-24 21:41:32,250 [kafka-producer-network-thread | my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-StreamThread-1-producer] WARN o.apache.kafka.clients.NetworkClient - [] [Producer clientId=my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-StreamThread-1-producer] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
这种情况不容易以编程方式检测。问题是,客户端并没有真正将他们的状态暴露给 Kafka Streams,因此 Kafka Streams 并不知道断开连接。有KIP提议增加一个DISCONNECT
状态,但实现起来并不容易(cf https://cwiki.apache.org/confluence/display/KAFKA/KIP-457%3A+Add+DISCONNECTED+status+to+Kafka+Streams)。
您提到的异常处理程序对这种情况没有帮助,因为没有抛出异常(至少不在 Kafka Streams 代码库中)。
您可以尝试监控消费者延迟或一些 Kafka Streams 指标(如处理率)。他们可能会提供足够好的代理。比照https://docs.confluent.io/current/streams/monitoring.html
当kafka-streams应用程序运行并且Kafka突然宕机时,应用程序进入“等待”模式,向其发送警告日志的消费者和生产者线程无法连接,当Kafka回来了,一切都应该(理论上)恢复正常。 我正试图就这种情况发出警报,但我无法找到捕捉它并发送 log/metric 的地方。 我尝试了以下方法:
streams.setUncaughtExceptionHandler
但这只发生在例外情况下,这里不是这种情况- 扩展
ProductionExceptionHandler
并将default.production.exception.handler
属性 更改为我的 class 以扩展此接口。再次,与setUncaughtExceptionHandler
一样,这里没有抛出异常,所以什么都没有发生。
我知道 Kafka 有自己的指标,我可以听取这些指标并发现代理是否已关闭。但在某些情况下,Kafka 代理可以正常工作,而我的 kafka-streams 应用程序无法连接(即错误的身份验证配置或 vpn/vpc 问题)
我能做些什么来发现这些问题并记录它们/报告它们?
更新
如果 kafka 不可用,请查看 consumer/producer 日志:
2020-08-24 21:41:32,055 [my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-StreamThread-1] WARN o.apache.kafka.clients.NetworkClient - [] [Consumer clientId=my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-StreamThread-1-consumer, groupId=my-kafka-streams-app] Bootstrap broker localhost:9092 (id: -1 rack: null) disconnected
2020-08-24 21:41:32,186 [kafka-admin-client-thread | my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-admin] WARN o.apache.kafka.clients.NetworkClient - [] [AdminClient clientId=my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-admin] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
2020-08-24 21:41:32,250 [kafka-producer-network-thread | my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-StreamThread-1-producer] WARN o.apache.kafka.clients.NetworkClient - [] [Producer clientId=my-kafka-streams-app-23a462fe-28c6-415a-a08a-b11d3ffffc2e-StreamThread-1-producer] Connection to node -1 (localhost/127.0.0.1:9092) could not be established. Broker may not be available.
这种情况不容易以编程方式检测。问题是,客户端并没有真正将他们的状态暴露给 Kafka Streams,因此 Kafka Streams 并不知道断开连接。有KIP提议增加一个DISCONNECT
状态,但实现起来并不容易(cf https://cwiki.apache.org/confluence/display/KAFKA/KIP-457%3A+Add+DISCONNECTED+status+to+Kafka+Streams)。
您提到的异常处理程序对这种情况没有帮助,因为没有抛出异常(至少不在 Kafka Streams 代码库中)。
您可以尝试监控消费者延迟或一些 Kafka Streams 指标(如处理率)。他们可能会提供足够好的代理。比照https://docs.confluent.io/current/streams/monitoring.html