特定插件问题排查

编辑

Kafka 问题和解决方案

编辑
Kafka 会话超时问题(输入)
编辑

症状

吞吐量问题和重复事件处理 Logstash 日志警告

[2017-10-18T03:37:59,302][WARN][org.apache.kafka.clients.consumer.internals.ConsumerCoordinator]
Auto offset commit failed for group clap_tx1: Commit cannot be completed since
the group has already rebalanced and assigned the partitions to another member.

后续调用 poll() 之间的时间长于配置的 session.timeout.ms,这通常意味着轮询循环花费太多时间处理消息。您可以通过增加会话超时或通过使用 max.poll.records 减少 poll() 中返回的批次的最大大小来解决此问题。

[INFO][org.apache.kafka.clients.consumer.internals.ConsumerCoordinator] Revoking
previously assigned partitions [] for group log-ronline-node09
`[2018-01-29T14:54:06,485][INFO]`[org.apache.kafka.clients.consumer.internals.ConsumerCoordinator]
Setting newly assigned partitions [elk-pmbr-9] for group log-pmbr

背景

Kafka 会跟踪消费者组中的各个消费者(例如,多个 Logstash 实例),并尝试为每个消费者提供他们正在消费的主题中的一个或多个特定分区的数据。为了实现这一点,Kafka 会跟踪消费者(Logstash Kafka 输入线程)是否在其分配的分区上取得进展,并在设定的时间范围内重新分配未取得进展的分区。

当 Logstash 从 Kafka Broker 请求的事件多于在超时时间内可以处理的事件时,它会触发分区的重新分配。分区的重新分配需要时间,并可能导致重复处理事件和严重的吞吐量问题。

可能的解决方案

  • 减少 Logstash 在一次请求中从 Kafka Broker 轮询的每个请求的记录数,
  • 减少 Kafka 输入线程的数量,和/或
  • 增加 Kafka 消费者配置中的相关超时。

详细信息

max_poll_records 选项设置一次请求中要提取的记录数。如果它超过默认值 500,请尝试减少它。

consumer_threads 选项设置输入线程的数量。如果该值超过 logstash.yml 文件中配置的管道工作进程数,则应肯定减少它。如果该值大于 4,如果客户端有时间/资源,请尝试将其减少到 4 或更少。尝试从 1 的值开始,然后从那里递增以找到最佳性能。

session_timeout_ms 选项设置相关超时。将其设置为一个值,该值确保可以在时间限制内安全地处理 max_poll_records 中的事件数。

EXAMPLE
Pipeline throughput is `10k/s` and `max_poll_records` is set to 1k =>. The value
must be at least 100ms if `consumer_threads` is set to `1`. If it is set to a
higher value `n`, then the minimum session timeout increases proportionally to
`n * 100ms`.

实际上,该值必须设置得远高于理论值,因为管道中输出和过滤器的行为遵循分布。该值还应高于您期望输出停顿的最大时间。默认设置为 10 秒 == 10000 毫秒。如果您在输出时遇到因负载或类似影响(例如 Elasticsearch 输出)而可能停顿的周期性问题,则将此值显着增加到例如 60 秒 几乎没有缺点。

从性能角度来看,减少 max_poll_records 值比增加超时值更可取。如果客户端的问题是由定期停顿的输出引起的,则增加超时是您唯一的选择。检查日志以查找输出停顿的证据,例如 ES 输出记录状态 429

使用模式注册表时 Kafka 输入插件崩溃
编辑

默认情况下,kafka 输入插件会在处理事件之前在插件注册期间检查连接并验证模式注册表。在某些情况下,当它尝试验证已验证的模式注册表时,此过程可能会失败,从而导致插件崩溃。

该插件提供一个 schema_registry_validation 设置来更改默认行为。此设置允许插件在注册期间跳过验证,这允许插件继续并处理事件。有关该插件和其他配置选项的更多信息,请参阅 kafka 输入插件文档

配置不正确的模式注册表仍将阻止插件处理事件。

auto 的默认设置是大多数情况下的最佳选择,无需更改。

大量偏移提交(输入)
编辑

症状

Logstash 的 Kafka 输入导致对偏移主题的提交次数远高于预期。通常,投诉还提到冗余偏移提交,其中重复提交相同的偏移。

解决方案

对于 Kafka Broker 版本 0.10.2.1 到 1.0.x:问题是由 Kafka 中的一个错误引起的。 https://issues.apache.org/jira/browse/KAFKA-6362 客户端的最佳选择是将他们的 Kafka Broker 升级到 1.1 或更新版本。

对于旧版本的 Kafka 或者如果上述方法不能完全解决问题:问题也可能是由于相对于 Kafka Broker 本身接收事件的速率,poll_timeout_ms 的值设置得太低而引起的(或者如果 Broker 在接收到突发事件之间定期空闲)。在这种情况下,按比例增加 poll_timeout_ms 的值会减少偏移提交的数量。例如,将其提高 10 倍将导致偏移提交次数减少 10 倍。

Kafka 输入中的编解码器错误(仅限 6.3.4 之前的插件版本)
编辑

症状

Logstash Kafka 输入随机记录来自配置的编解码器的错误和/或错误读取事件(部分读取,在多个事件之间混合数据等)。

Log example:  [2018-02-05T13:51:25,773][FATAL][logstash.runner          ] An
unexpected error occurred! {:error=>#<TypeError: can't convert nil into String>,
:backtrace=>["org/jruby/RubyArray.java:1892:in `join'",
"org/jruby/RubyArray.java:1898:in `join'",
"/usr/share/logstash/logstash-core/lib/logstash/util/buftok.rb:87:in `extract'",
"/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-codec-line-3.0.8/lib/logstash/codecs/line.rb:38:in
`decode'",
"/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-input-kafka-5.1.11/lib/logstash/inputs/kafka.rb:241:in
`thread_runner'",
"file:/usr/share/logstash/vendor/jruby/lib/jruby.jar!/jruby/java/java_ext/java.lang.rb:12:in
`each'",
"/usr/share/logstash/vendor/bundle/jruby/1.9/gems/logstash-input-kafka-5.1.11/lib/logstash/inputs/kafka.rb:240:in
`thread_runner'"]}

背景

在多个线程上运行时(consumer_threads 设置为 > 1),Kafka 输入插件处理编解码器实例的方式存在一个错误。 https://github.com/logstash-plugins/logstash-input-kafka/issues/210

解决方案

  • 将 Kafka 输入插件升级到 v. 6.3.4 或更高版本。
  • 如果(且仅当)无法升级,请将 consumer_threads 设置为 1
设置 Kerberos SASL 的调试
编辑

您可以设置您的机器以帮助您排查 Kafka 客户端中的身份验证失败问题。

  • config/jvm.options 中,添加

    -Dsun.security.krb5.debug=true
  • config/log4j2.properties 中,添加

    logger.kafkainput.name = logstash.inputs.kafka
    logger.kafkainput.level = debug
    logger.kafkaoutput.name = logstash.outputs.kafka
    logger.kafkaoutput.level = debug
    logger.kafka.name = org.apache.kafka
    logger.kafka.level = debug

Kerberos 的日志条目不会通过 Log4j 发送,而是直接发送到控制台。

Azure 事件中心问题和解决方案

编辑
事件中心插件无法连接到存储 Blob(输入)
编辑

症状

Azure EventHub 无法连接到 Blob 存储

[2024-01-01T13:13:13,123][ERROR][com.microsoft.azure.eventprocessorhost.AzureStorageCheckpointLeaseManager][azure_eventhub_pipeline][eh_input_plugin] host logstash-a0a00a00-0aa0-0000-aaaa-0a00a0a0aaaa: Failure while creating lease store
com.microsoft.azure.storage.StorageException: The client could not finish the operation within specified maximum execution timeout.

插件无法完成注册阶段,因为它无法连接到插件 storage_connection 设置中配置的 Azure Blob 存储。

背景

只有在配置了 Blob 存储连接设置后,Azure 事件中心插件才能与其他使用者共享使用者组的偏移位置。EventHub 使用 AMQP 协议传输数据,但 Blob 存储使用利用 JDK 的 http 客户端 HttpURLConnection 的库。要排查 HTTP 连接问题(可能与代理设置有关),必须提高 JDK 这部分的日志级别。问题在于 JDK 将 Java Util Logging 用于其内部日志需求,这无法使用 Logstash 附带的标准 log4j2.properties 进行配置。

可能的解决方案

  • 配置 Logstash 设置以启用 JDK 日志记录。

详细信息

在 Logstash 上启用 JDK 日志记录的步骤

  • 创建一个包含 Java Util Logging (JUL) 日志记录定义的文件。
  • 配置 JVM 属性以通知 JUL 使用此类定义文件。

JUL 定义

创建一个文件,您可以使用该文件定义日志级别、处理程序和记录器。例如,<LS_HOME>/conf/jul.properties

handlers= java.util.logging.ConsoleHandler,java.util.logging.FileHandler
.level= ALL
java.util.logging.FileHandler.pattern = <USER's LOGS FOLDER>/logs/jul_http%u.log 
java.util.logging.FileHandler.limit = 50000
java.util.logging.FileHandler.count = 1
java.util.logging.FileHandler.level=ALL
java.util.logging.FileHandler.maxLocks = 100
java.util.logging.FileHandler.formatter = java.util.logging.SimpleFormatter

java.util.logging.ConsoleHandler.level = INFO # or put FINE
java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter

# defines the logger we are interested in
sun.net.www.protocol.http.HttpURLConnection.level = ALL  

日志文件将创建在用户定义的路径中(<USER's LOGS FOLDER>/logs/

此配置启用 sun.net.www.protocol.http.HttpURLConnection 记录器,并且

将日志级别设置为 ALL。它将记录发送给它的所有消息,从最高优先级到最低优先级。

JVM 属性

为了将所选的定义文件通知 JUL 框架,必须评估一个属性(java.util.logging.config.file),这就是 Logstash 的 config/jvm.properties 派上用场的地方。编辑文件,添加属性,指向创建 JUL 定义文件的路径

-Djava.util.logging.config.file=<LS_HOME>/conf/jul.properties

日志可能包含敏感信息(例如凭据),并且可能很详细,但应该提供有关 Azure Blob 存储的 HTTP 级别连接问题的提示。

其他问题

编辑

即将推出,您可以提供帮助!如果您有任何要添加的内容,请

另请查看 Logstash 讨论论坛