我正在使用statsd(确切地说是django-statsd库)来跟踪我的应用程序的时间度量。当我需要跨堆栈的多个级别测试某些东西时会出现问题。一个主要的例子:创建一个对象,从该对象调用post_save方法,然后从那里触发芹菜任务,随后触发另一个芹菜任务,该任务调用twilio向用户发送文本消息,最终命中在我的服务器上建立一个端点,让我知道文本已成功发送。
我喜欢跟踪整体时间,而不必手动拼凑每个功能的时间(无论如何,这会减少呼叫之间的延迟时间)。我还想避免将“开始时间”写入数据库以在调用堆栈行程结束时引用,因为开始时间的数据库查找时间也会扭曲我的指标。但是,对某种缓存的调用可能是低延迟,足以忽略不计。但这需要比我原本希望在原型阶段需要更多的基础设施。
关于最佳方法的任何想法?
答案 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