statsd 的副作用可能会导致额外的延迟

statsd's side effects possibly causing extra latency

我正在使用 Datadog 的 statsd client 来记录特定服务器响应的持续时间。当 time-ing 这些响应时,我过去常常传入相当多的自定义标签。所以我正在减少自定义标签的数量。

但是,问题是当我减少传入的标签数量时,服务器响应会有额外的延迟,这不直观,因为我传入的标签更少而且实现没有改变。

根据 Datadog 和 Etsy(最初发布 statsd)的说法,这些记录这些指标的方法没有阻塞。但是,他们必须使用一些额外的线程来执行此操作。

可能是什么问题?使用此客户端是否可能有任何副作用?

我不能具体说明 Java 实现,但在 CSharp 客户端中,通过 UDP 端口 8125 将此数据发送到 127.0.0.1 的能力已完成。它在同一个线程上作为您的执行代码而不是异步的。一旦发送 UDP 消息,您的流程的全部工作就完成了 - 它被触发并立即被遗忘。

你提到的线程开销发生在单独的 Datadog 代理进程中,该进程在 UDP 8125 的另一端侦听,并且有自己的线程池和在发送到 Datadog 服务器之前缓冲一些数据的能力。

您是否有显示此行为的其他信息?据我所知,这听起来不像是 Datadog/StatsD 东西的副作用。

我在 Datadog 的帮助论坛上找到了答案:"How to graph percentiles in Datadog"

  • Making a change to increase tag complexity (adding additional tags to be more specific) will lead to changes in the behavior of a rolled up metric visualization
    • EX: Whereas before the change METRIC_NAME.avg (without any tags) would be aggregating across all raw points (statsd takes all the raw datapoints, aggregates it and then ships over a single metric stream), adding a tag like region (US, EU) tag causes statsd to bin raw datapoints into two region bins, aggregate them, and ship over two streams. This means when graphing METRIC_NAME.avg AVG by * means an aggregate across the two streams rather than a single one

所以要点是延迟本身并没有增加,但是聚合多个流(每个流对应每个自定义标签)导致图形显示不同的形状。