【问题标题】: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 
    

    【讨论】:

      猜你喜欢
      • 2015-08-22
      • 1970-01-01
      • 1970-01-01
      • 2011-05-25
      • 2011-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多