使用datadog协议实现statsd度量的收集和延迟释放的库。
dogstatsd-collector的Python项目详细描述
dogstatsd-collector是一个易于收集数据狗样式的库 状态counters 和histograms 有标签和刷新时的控制。它 为计数器和 柱状图,允许您推迟刷新度量,直到您选择。这个 功能使您能够以任意粒度收集statsd度量,用于 基于每个web请求或每个作业的示例(而不是每次刷新 间隔基础)。
计数器和柱状图分别跟踪每个度量序列(唯一 当 收集器被冲洗。你不必考虑跟踪你的指标 单独系列;您只需使用DogstatsdCollector对象,就像使用 普通的DogStatsD对象,准备好后刷新;库将 小心为你发射所有的系列。
- 自由软件:BSD 3条款许可证
安装
pip install dogstatsd-collector
示例用法
假设您希望跟踪由 对你的webapp的请求,并标记它们查询的数据库和 使用动词。您在发出查询时收集以下指标:
collector=DogstatsdCollector(dogstatsd)...collector.histogram('query',tags=['database:master','verb:insert'])collector.histogram('query',tags=['database:master','verb:update'])collector.histogram('query',tags=['database:master','verb:update'])collector.histogram('query',tags=['database:replica','verb:select'])collector.histogram('query',tags=['database:replica','verb:select'])
然后,在Web请求结束时,当刷新收集器时, 以下指标将被推送到DogStatsD(shown in DogStatsD datagram format):
collector.flush()# query:1|h|#database:master,verb:insert# query:2|h|#database:master,verb:update# query:2|h|#database:replica,verb:select
动机
statsd模型是在 基础结构和定期刷新聚合到 集中位置。这个模型的可伸缩性很好,因为度量的数量 发送到集中位置的增长非常缓慢,即使您扩展 您的应用程序;每个statsd代理计算聚合以刷新到 后端而不是每个数据点,因此存储量非常低,即使对于 一个体积很大的应用程序。
此模型的一个缺点是您对粒度没有太多的控制 你的指标所代表的。当聚合到达集中式 位置(在本例中是datadog),您只知道计数或分布 在冲洗间隔内。你不能代表任何其他执行 粒度超过“跨x秒”(其中x是刷新间隔)。这个 限制使您无法在“每个请求”上轻松表示度量 例如,基础。
这个库的目的是使控制statsd的时间变得简单 发出度量,以便您可以将度量的发出推迟到某个点 你决定。这允许您表示比“跨x”更细的粒度 秒,例如“通过web请求”或“通过cron作业”。 通过在收集器 被刷新,这确保您不会失去任何标记的好处 您的度量(例如在datadog中进行聚合/切片)。
模式
DogstatsdCollector对象是提供类似 接口作为DogStatsDincrement 和histogram 方法。在调用这些方法时,将收集 每个系列(由包含的任何标记确定)。在调用flush()之后, 每个序列作为statsd度量单独发出。
简单请求度量
您可以通过请求收集各种度量,并在 请求获取每个请求的粒度。
在Django:
fromdatadog.dogstatsd.baseimportDogStatsdfromdogstatsd_collectorimportDogstatsdCollector# MiddlewareclassMetricsMiddleware:def__init__(self,get_response):self.get_response=get_responseself.dogstatsd=DogStatsd()def__call__(self,request):request.metrics=DogstatsdCollector(self.dogstatsd)response=self.get_response(request)request.metrics.flush()returnresponse# Inside a viewdefmy_view(request):# Do some stuff...request.metrics.increment('my.count')request.metrics.histogram('my.time',0.5)returnHttpResponse('ok')
在烧瓶中:
fromdatadog.dogstatsd.baseimportDogStatsdfromdogstatsd_collectorimportDogstatsdCollectorfromflaskimportFlaskfromflaskimportrequestapp=Flask(__name__)dogstatsd=DogStatsd()@app.before_requestdefinit_metrics():request.metrics=DogstatsdCollector(dogstatsd)@app.after_requestdefflush_metrics():request.metrics.flush()@app.route('/')defmy_view():# Do some stuff...request.metrics.increment('my.count')request.metrics.histogram('my.time',0.5)return'ok'
芹菜任务指标
和上面一样,不过是因为芹菜的问题。
fromdatadog.dogstatsd.baseimportDogStatsdfromdogstatsd_collectorimportDogstatsdCollectorfromceleryimportCeleryfromceleryimportcurrent_taskfromcelery.signalsimporttask_prerunfromcelery.signalsimporttask_postrunapp=Celery('tasks',broker='pyamqp://guest@localhost//')dogstatsd=DogStatsd()@task_prerun.connectdefinit_metrics(task_id,task,*args,**kwargs):task.request.metrics=DogstatsdCollector(dogstatsd)@task_postrun.connectdefflush_metrics(task_id,task,*args,**kwargs):task.request.metrics.flush()@app.taskdefmy_task():# Do some stuff...current_task.request.metrics.increment('my.count')current_task.request.metrics.histogram('my.time',0.5)
函数中的度量
为执行的特定函数发出一组度量。
fromdatadog.dogstatsd.baseimportDogStatsdfromdogstatsd_collectorimportDogstatsdCollectordogstatsd=DogStatsd()defdo_stuff(metrics):# Do some stuff...metrics.increment('my.count')metrics.histogram('my.time',0.5)metrics=DogstatsdCollector(dogstatsd)do_stuff(metrics)metrics.flush()
螺纹安全性
DogstatsdCollectorsingleton不是线程安全的。不要共享 多个线程中的单个DogstatsdCollector对象。
开发
要运行所有测试,请运行:
tox
更改日志
0.0.2(2019-08-14)
- 添加基本标记可选Kwarg以支持添加到所有获取 脸红了。
0.0.1(2019-05-02)
- pypi上的第一个版本。