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

时间:2015-03-03 19:04:47

标签: python apache-kafka

自从kafka 0.8.2.0以来,似乎很难追踪消费者滞后和话题规模

如何跟踪卡夫卡的偏移(主题大小)和滞后?当您的生产者插入消息并在消费者确认消息时递增另一个计数器时,您是否在某处递增计数器?

我正在使用airbnb's kafka-statsd-metrics2 - 但由于某些原因,所有关于主题大小的指标始终为0,它可能是针对他们的错误报告,但您是如何做到的?

我们的消费者和生产者是使用kafka-python用python编写的,他们说他们不支持ConsumerCoordinator偏移API,所以我把一个解决方案查询到zookeeper并将这些指标发送到statsd实例(看起来非常好)尴尬),但我仍然缺少主题大小指标。

我们正在使用collectd来收集系统指标,我没有使用JMX的经验并且在collectd中配置它似乎相当复杂,我已经尝试了几次,所以我找到了一些不这样做的方法。 / p>

如果您有任何输入我很乐意听到它,即使它是:“这属于x stackexchange-site”

4 个答案:

答案 0 :(得分:2)

如果我理解正确,您可以使用HighwaterMarkOffset中的FetchResponse。通过这种方式,您将知道分区末尾的偏移量,并且能够将其与当前的acked偏移量或此FetchResponse中最后一条消息的偏移量进行比较。

详情here

答案 1 :(得分:1)

您是否尝试使用https://github.com/quantifind/KafkaOffsetMonitor来监控消费者滞后情况。它适用于0.8.2.0

答案 2 :(得分:0)

这是代码段,请确保在活动控制器中运行它。 BOOTSTRAP_SERVERS是活动的控制器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)

答案 3 :(得分:-2)

有人可以说MemberAssignment是从哪个模块导入的吗?

对于MemberAssignment.decode(member_assignment).assignment中的(主题,分区):