【问题标题】:Statsd - Tracking timing across the stackStatsd - 跨堆栈跟踪时间
【发布时间】:2014-02-11 22:52:28
【问题描述】:
我正在使用 statsd(确切地说是 django-statsd 库)来跟踪我的应用程序的计时指标。当我需要在堆栈的多个级别上测试某些东西时,就会出现问题。一个典型的例子:创建一个对象,从该对象调用一个 post_save 方法,然后从那里触发一个 celery 任务,随后触发另一个 celery 任务调用 twilio 向用户发送文本消息,最终命中在我的服务器上设置一个端点,让我知道文本已成功发送。
我很想跟踪这一切的总时间,而不必求助于手动拼凑每个函数的时间(无论如何,这会丢失调用之间的延迟时间)。我还想避免将“开始时间”写入数据库以在调用堆栈行程结束时引用,因为开始时间的数据库查找时间也会扭曲我的指标。但是,对某种缓存的调用可能具有足够低的延迟,可以忽略不计。但这需要比我在这个原型阶段所希望的更多的基础设施。
对此有最佳方法的任何想法?
【问题讨论】:
标签:
python
django
metrics
graphite
statsd
【解决方案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