Statsd - 跟踪堆栈中的时间

时间:2014-02-11 22:52:28

标签: python django metrics graphite statsd

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

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

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

1 个答案:

答案 0 :(得分:1)

  

我还想避免将“开始时间”写入数据库来引用   在call-stack trip结束时,作为a的数据库查找时间   开始时间也会扭曲我的指标。但是,打电话到某种程度   缓存可能是低延迟,可以忽略不计。

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