作者:Jakub Scholz
在我们之前的博客文章中,我们主要关注跟踪,这是0.14.0版本中的一个新特性。但是跟踪并不是我们在0.14.0中对监视功能进行的惟一改进。我们还对Prometheus的监控进行了一些重大改进。Strimzi几乎从一开始就支持Prometheus的Kafka指标。但是在0.14.0中,通过添加对Kafka导出器(Kafka Exporter )的支持,我们做出了一些重大改进。Kafka导出器增加了Kafka代理中缺少的一些额外指标。在这篇博文中了解更多关于它们的信息。
https://strimzi.io/2019/10/08/strimzi-apache-kafka-and-tracing.html
https://github.com/danielqsj/kafka_exporter
Prometheus监控
Prometheus是一个开源的监控解决方案,它已经成为云计算领域中指标和警报的实际标准。与许多其它监视系统不同,使用Prometheus,你的应用程序不必将指标数据推给Prometheus。相反,Prometheus将从你的应用程序中获取(收集)指标,并将它们存储在时间序列数据库中。Prometheus获取这些数据的接口是一个简单的HTTP端点,提供带有指标的文本输出。有许多工具和库可以让你轻松地在应用程序中创建Prometheus端点。查看Prometheus文档的测仪(Instrumenting)部分,了解更多关于如何从你的应用程序中公开Prometheus指标的信息。
https://prometheus.io/docs/instrumenting/clientlibs/
一旦指标存储在数据库中,就可以使用PromQL查询语言查询它们。PromQL语言是一个API,其它应用程序可以使用它来查询指标。支持它的工具之一是Grafana,它可以用来可视化来自Prometheus数据库的数据。
Prometheus也可以用来警报。你可以配置应该触发警报的规则。Prometheus将根据它正在抓取的指标来评估规则,当任何规则匹配时,它将把它发送给Alertmanager。Alertmanager将负责管理这些警报。它将处理重复、沉默、抑制和聚集警报,并向你选择的系统发送通知。你可以让你的提醒发送到许多不同的通知渠道,如电子邮件、Slack、PagerDuty等。
https://prometheus.io/docs/alerting/alertmanager/
Apache Kafka和Prometheus
默认情况下,Apache Kafka不支持Prometheus指标。与许多基于JVM的应用程序一样,它使用JMX(Java Management Extension,Java管理扩展)来公开指标。但是,由于我们在Strimzi项目中的目标是在运行Apache Kafka时提供一种Kubernetes原生体验,所以我们希望将指标作为Prometheus端点公开。为了帮助解决这个问题,我们使用Prometheus JMX导出器(Prometheus JMX Exporter)项目,获取JMX指标并将其公开为Prometheus端点。除了集成JMX导出器,我们还提供Grafana仪表盘和样本Prometheus警报规则,你可以使用和适应自己的需要。
https://github.com/prometheus/jmx_exporter
要在Strimzi中启用JMX导出器,你必须在Strimzi Kafka、KafkaConnect和KafkaConnectS2I自定义资源中指定metrics部分。该部分配置JMX导出器,并告诉它如何将JMX指标转换为Prometheus指标。配置JMX导出器有不同的方法。当然,你可以根据自己的需要随意配置它,但如果你想使用我们的仪表板和警报规则,则必须遵循我们的配置。
Prometheus的支持、仪表板和示例警报规则不仅适用于Kafka代理。它们还支持Kafka Connect和Apache Zookeeper。Prometheus监控所需的所有文件都可以在GitHub仓库的metrics文件夹中找到。你也可以按照我们的文档,这不仅将帮助你的仪表板,也帮助设置Prometheus、PrometheusAlertManager和Grafana。
https://github.com/strimzi/strimzi-kafka-operator/tree/master/metrics/examples
https://strimzi.io/docs/latest/full.html#assembly-metrics-setup-str
Kafka导出器
这就解释了Strimzi对指标的支持,但是我们提到的Kafka导出器是有什么关系呢?Kafka代理提供了许多与代理状态、使用和性能相关的有用指标。但一些重要的指标却被遗漏了。例如,它不提供关于消费者滞后或主题信息的任何指标。你可以通过Kafka命令行工具或Kafka管理API获得这些信息。但不是作为JMX或Prometheus的指标标准。
消费者延迟尤其重要,因为它允许你监视消费者消费的偏离量(offset),与最近添加的消息的偏离量之间的延迟。当滞后增长时,表明消费者比生产者慢,他们落后了。如果你的应用程序应该能够近乎实时地工作,那么你需要做一些事情来纠正这种情况。
在Grafana仪表板中有消费者延迟,并且能够根据它配置警报,这将使监视基于Kafka的应用程序变得更加容易。这就是为什么我们增加了对Kafka导出器的支持。Kafka导出器是一个伟大的开源项目,来自Daniel Qian和其他贡献者 - 谢谢你的工作。Strimzi只是将它集成到我们自己的Kafka部署中。Kafka导出器作为客户端连接到Kafka,并收集关于主题、分区和用户组的不同信息。然后将此信息作为Prometheus指标端点公开。
https://github.com/danielqsj/kafka_exporter
用Strimzi部署Kafka导出器很容易。所有你需要做的是把它添加到Kafka自定义资源:
apiVersion: kafka.strimzi.io/v1beta1
kind: Kafka
metadata:
name: my-cluster
spec:
# ...
kafkaExporter: {}
Strimzi将使用Kafka导出器创建一个新的部署,并将其配置为连接到Kafka集群。你不需要创建任何证书或配置它应该连接的位置。但如果需要,你可以配置它应该监视的消费者组或主题:
apiVersion: kafka.strimzi.io/v1beta1
kind: Kafka
metadata:
name: my-cluster
spec:
# ...
kafkaExporter:
topicRegex: "important-topic-.*"
groupRegex: "important-group-.*"
你可以在我们的API参考中找到所有可用的配置选项。
https://strimzi.io/docs/0.14.0/full.html#type-KafkaExporterSpec-reference
Kafka导出器不仅提供消费者滞后指标。它还提供了许多关于消费者组和主题的附加细节。
一旦部署了Kafka导出器,就可以开始获取它提供的指标。我们还提供了一个新的Grafana仪表板和警报规则,它与新的指标一起工作。在0.14.0中,我们的仪表板是相当基本的。在0.15.0中,我们将发布一个改进的Grafana仪表板,它将使用Kafka导出器提供的更多不同指标。你可以在我们的GitHub上找到样本Prometheus警报和Grafana仪表板。
https://github.com/strimzi/strimzi-kafka-operator/blob/master/metrics/examples/prometheus/install/prometheus-rules.yaml
https://github.com/strimzi/strimzi-kafka-operator/blob/master/metrics/examples/grafana/strimzi-kafka-exporter.json
结论
对我们来说,提供生产可用的Kafka是很重要的。有效的监控是其中重要的一部分。Kafka导出器是Strimzi监控能力的重要改进。它为我们的用户提供了即时可用的消费者滞后监控。如果你喜欢Kafka导出器提供的功能,别忘了在GitHub上给它打颗星。
https://github.com/danielqsj/kafka_exporter
如果你喜欢Strimzi,请在GitHub上给我们加星,并在Twitter上关注我们,以确保你不会错过我们未来的任何博文!
https://github.com/strimzi/strimzi-kafka-operator
https://twitter.com/strimziio