3

我正在使用 statsd(确切地说是 django-statsd 库)来跟踪我的应用程序的计时指标。当我需要在堆栈的多个级别上测试某些东西时,就会出现问题。一个典型的例子:创建一个对象,从该对象调用一个 post_save 方法,然后从那里触发一个 celery 任务,随后触发另一个 celery 任务调用 twilio 向用户发送文本消息,最终命中在我的服务器上设置一个端点,让我知道文本已成功发送。

我很想跟踪这个的总时间,而不必求助于手动拼凑每个函数的时间(无论如何,这会丢失调用之间的延迟时间)。我还想避免将“开始时间”写入数据库以在调用堆栈行程结束时引用,因为开始时间的数据库查找时间也会扭曲我的指标。但是,对某种缓存的调用可能具有足够低的延迟,可以忽略不计。但这需要比我在这个原型阶段所希望的更多的基础设施。

关于此最佳方法的任何想法?

4

1 回答 1

1

我还想避免将“开始时间”写入数据库以在调用堆栈行程结束时引用,因为开始时间的数据库查找时间也会扭曲我的指标。但是,对某种缓存的调用可能具有足够低的延迟,可以忽略不计。

Statsd 是正确的,因为它默认为 UDP,使其成为一种开销很小的即发即弃机制。此外,由于 UDP 是异步的,因此抛出数据包的函数不会等待 ACK 并立即继续。

Any ideas on the best approach for this?

也可以分析延迟,尽管它需要一点点努力。如果您不希望从函数到函数再到模块传递额外的变量,那么您必须根据控制流的语义“处理”原始数据。

a(){
    statsd(a.begin_time)    
    ...
    statsd(a.end_time)
}
.........................
.......LATENCY SEA.......
.........................

b(){
    statsd(b.begin_time)
    ...
    statsd(b.end_time)
}

.........................
.......LATENCY SEA.......
.........................

c(){
    statsd(c.begin_time)
    ...
    statsd(c.end_time)
}

因为在控制流中“B 在 A 之后”-

latency(a,b) = b.begin_time - a.end_time 
于 2014-02-12T05:45:08.410 回答