Python 使用kafka 0.8.2.0跟踪主题大小和消费者滞后

Python 使用kafka 0.8.2.0跟踪主题大小和消费者滞后,python,apache-kafka,Python,Apache Kafka,自从卡夫卡0.8.2.0以来,跟踪消费者滞后和话题大小似乎变得非常困难 如何跟踪卡夫卡中的偏移量(主题大小)和滞后?当制作人插入消息时,您是否会在某处增加计数器,当消费者确认消息时,是否会增加另一个计数器 我正在使用-但是所有关于主题大小的指标总是0,出于某种原因,这可能是他们的错误报告,但是你怎么做呢 我们的消费者和生产者是使用python编写的,他们声明不支持ConsumerCoordinator offset API,所以我已经准备了一个查询zookeeper并将这些指标发送到statsd

自从卡夫卡0.8.2.0以来,跟踪消费者滞后和话题大小似乎变得非常困难

如何跟踪卡夫卡中的偏移量(主题大小)和滞后?当制作人插入消息时,您是否会在某处增加计数器,当消费者确认消息时,是否会增加另一个计数器

我正在使用-但是所有关于主题大小的指标总是
0
,出于某种原因,这可能是他们的错误报告,但是你怎么做呢

我们的消费者和生产者是使用python编写的,他们声明不支持ConsumerCoordinator offset API,所以我已经准备了一个查询zookeeper并将这些指标发送到statsd实例的解决方案(看起来很尴尬),但我仍然缺少主题大小指标

我们使用collectd收集系统指标,我没有使用JMX的经验,在collectd中配置它似乎非常复杂,我已经尝试了几次,所以我找到了一些不这样做的方法


如果您有任何意见,我很想听听,即使是:“这属于x stackexchange站点”

如果我理解正确,您可以从
获取响应中使用
高水位偏移量
。这样,您将知道分区末尾的偏移量是多少,并能够将其与当前确认的偏移量或此
FetchResponse
中最后一条消息的偏移量进行比较


详细信息

您是否已尝试使用它来监控消费者延迟。它适用于0.8.2.0

这是代码片段,请确保在active controller中运行此程序。 引导服务器是活动的控制器IP

client = KafkaAdminClient(bootstrap_servers=BOOTSTRAP_SERVERS, request_timeout_ms=300)
      list_groups_request  = client.list_consumer_groups()

      for group in list_groups_request:
        if group[1] == 'consumer':
          list_mebers_in_groups = client.describe_consumer_groups([group[0]])
          (error_code, group_id, state, protocol_type, protocol, members) = list_mebers_in_groups[0]

          if len(members) !=0:
            for member in members:
              (member_id, client_id, client_host, member_metadata, member_assignment) = member
              member_topics_assignment = []
              for (topic, partitions) in MemberAssignment.decode(member_assignment).assignment:
                member_topics_assignment.append(topic)

              for topic in member_topics_assignment:
                consumer = KafkaConsumer(
                          bootstrap_servers=BOOTSTRAP_SERVERS,
                          group_id=group[0],
                          enable_auto_commit=False
                          )
                consumer.topics()

                for p in consumer.partitions_for_topic(topic):
                  tp = TopicPartition(topic, p)
                  consumer.assign([tp])
                  committed = consumer.committed(tp)
                  consumer.seek_to_end(tp)
                  last_offset = consumer.position(tp)
                  if last_offset != None and committed != None:
                    lag = last_offset - committed
                    print "group: {} topic:{} partition: {} lag: {}".format(group[0], topic, p, lag)

有人能说MemberAssignment是从哪个模块导入的吗


对于MemberAssignment中的(主题、分区)。decode(member_assignment)。assignment:

我将您的答案标记为我的答案,因为您首先来到这里,而且它也是正确的。我最终创建了一个程序来跟踪我们的消费者从Zookeeper获得的补偿,因为kafka python仍然在使用这个程序。这个解决方案的好处是可以很容易地将结果导入我们的graphite设置:)非常感谢您的帮助!这很奇怪。我从0.8.2.0之前就安装了它,但升级后它一直不起作用,但我只是想了想,然后再试一次,现在它在没有任何更新的情况下工作得很好……KafkaOffsetMonitor似乎无法与简单的使用者一起工作,因为它试图从zookeeper中检索分区所有者,而zookeeper似乎只由高级使用者设置。我想。。。YMMV这和这个问题有什么关系?