使用datadog协议实现statsd度量的收集和延迟释放的库。

dogstatsd-collector的Python项目详细描述


dogstatsd-collector是一个易于收集数据狗样式的库 状态countershistograms 有标签和刷新时的控制。它 为计数器和 柱状图,允许您推迟刷新度量,直到您选择。这个 功能使您能够以任意粒度收集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请求结束时,当刷新收集器时, 以下指标将被推送到DogStatsDshown 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

基本标签

collector对象还支持指定一组基本标记,这些标记将 包括在发出的每个度量上。

base_tags=['mytag:myvalue']collector=DogstatsdCollector(dogstatsd,base_tags=base_tags)collector.histogram('query',tags=['database:master','verb:insert'])collector.histogram('query',tags=['database:master','verb:update'])collector.flush()# query:1|h|#database:master,verb:insert,mytag:myvalue# query:1|h|#database:master,verb:update,mytag:myvalue

动机

statsd模型是在 基础结构和定期刷新聚合到 集中位置。这个模型的可伸缩性很好,因为度量的数量 发送到集中位置的增长非常缓慢,即使您扩展 您的应用程序;每个statsd代理计算聚合以刷新到 后端而不是每个数据点,因此存储量非常低,即使对于 一个体积很大的应用程序。

此模型的一个缺点是您对粒度没有太多的控制 你的指标所代表的。当聚合到达集中式 位置(在本例中是datadog),您只知道计数或分布 在冲洗间隔内。你不能代表任何其他执行 粒度超过“跨x秒”(其中x是刷新间隔)。这个 限制使您无法在“每个请求”上轻松表示度量 例如,基础。

这个库的目的是使控制statsd的时间变得简单 发出度量,以便您可以将度量的发出推迟到某个点 你决定。这允许您表示比“跨x”更细的粒度 秒,例如“通过web请求”或“通过cron作业”。 通过在收集器 被刷新,这确保您不会失去任何标记的好处 您的度量(例如在datadog中进行聚合/切片)。

模式

DogstatsdCollector对象是提供类似 接口作为DogStatsDincrementhistogram 方法。在调用这些方法时,将收集 每个系列(由包含的任何标记确定)。在调用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对象。

更多文档

完整的文档可以在“阅读文档”中找到:

https://dogstatsd-collector.readthedocs.io/

开发

要运行所有测试,请运行:

tox

更改日志

0.0.2(2019-08-14)

  • 添加基本标记可选Kwarg以支持添加到所有获取 脸红了。

0.0.1(2019-05-02)

  • pypi上的第一个版本。

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
相对于框架java窗口的鼠标位置错误   Java 8流peek api   java将数据附加到文件中   java使用ExoPlayer 2.8播放播放列表中的特定文件   JavaSpring国际化:如何动态设置语言环境值   java如何在mysql中实现两个表之间的两个关联   java在gradle可执行jar文件中包含运行时参数   surefire插件中的java maven多套测试套件   java试图理解堆分析以确定内存泄漏或所需的大量内存   java识别字符串有数字   数组如何解决错误“java.lang.ArrayIndexOutOfBoundsException:5”   java Swt文件对话框选择的文件太多?   java此登录代码易受SQL注入攻击吗?   Java[3]中的文件<identifier>预期编译错误   java如何在spring webflux中发送列表   jar中未找到java文件异常   如何在java中合并2D数组?   java如何评测本机JNI库