跳转到主要内容

异步发送指标到statsd实例。

项目描述

异步发送指标到 statsd 实例。

build coverage sonar docs source download license

此库提供连接器,用于通过TCP或UDP将指标发送到statsd实例。

import asyncio
import time

import sprockets_statsd.statsd

statsd = sprockets_statsd.statsd.Connector(
   host=os.environ.get('STATSD_HOST', '127.0.0.1'))

async def do_stuff():
   start = time.time()
   response = make_some_http_call()
   statsd.timing(f'timers.http.something.{response.code}',
                 (time.time() - start))

async def main():
   await statsd.start()
   try:
      do_stuff()
   finally:
      await statsd.stop()

连接器实例维护与目标StatsD实例的弹性连接,将指标数据格式化为有效负载,并将其发送到StatsD目标。它默认使用TCP作为传输协议,但如果将ip_protocol关键字设置为socket.IPPROTO_UDP,则将使用UDP。Connector.start方法启动一个负责维护连接的后台asyncio.Task。Timing方法将时间指标入队以发送,任务在连接时消耗内部队列。

以下是一些方便的方法。您还可以调用inject_metric以完全控制有效负载。

incr

增加计数器指标

decr

减少计数器指标

gauge

调整或设置仪表指标

timer

使用上下文管理器将持续时间附加到计时器指标

timing

将持续时间附加到计时器指标

如果您是 python-statsd 的用户,那么方法名看起来应该很熟悉。这是故意的。我喜欢这个接口,很多人也喜欢。不过有一个非常重要的区别——计时 方法将持续时间作为秒数以 float 类型传递,而不是以毫秒数传递。

Tornado 辅助工具

sprockets_statsd.tornado 模块包含混入类,使从您的 tornado 网络应用程序中报告指标变得简单。您需要安装 sprockets_statsd[tornado] 扩展,以确保满足 Tornado 对此库的要求。

import asyncio
import logging

from tornado import ioloop, web

import sprockets_statsd.tornado


class MyHandler(sprockets_statsd.tornado.RequestHandler,
                web.RequestHandler):
    async def get(self):
        with self.execution_timer('some-operation'):
            await self.do_something()
        self.set_status(204)

    async def do_something(self):
        await asyncio.sleep(1)


class Application(sprockets_statsd.tornado.Application, web.Application):
    def __init__(self, **settings):
        settings['statsd'] = {
            'host': os.environ['STATSD_HOST'],
            'prefix': 'applications.my-service',
        }
        super().__init__([web.url('/', MyHandler)], **settings)

    async def on_start(self):
        await self.start_statsd()

    async def on_stop(self):
        await self.stop_statsd()


if __name__ == '__main__':
    logging.basicConfig(level=logging.DEBUG)
    app = Application()
    app.listen(8888)
    iol = ioloop.IOLoop.current()
    try:
        iol.add_callback(app.on_start)
        iol.start()
    except KeyboardInterrupt:
        iol.add_future(asyncio.ensure_future(app.on_stop()),
                       lambda f: iol.stop())
        iol.start()

每次调用端点时,此应用程序将发出两个计时指标

applications.my-service.timers.some-operation:1001.3449192047119|ms
applications.my-service.timers.MyHandler.GET.204:1002.4960041046143|ms

您需要设置 $STATSD_HOST 环境变量以在应用程序内部启用 statsd 处理。RequestHandler 类公开了将计数器和计时指标发送到 statsd 服务器的方法。只要在应用程序启动期间调用 start_statsd 方法,连接就由 Application 管理。

指标由 start_statsd 启动的 asyncio.Task 发送。请求处理程序方法将指标数据插入由任务读取的 asyncio.Queue。当任务未连接到服务器时,指标数据将保留在队列中,并在任务建立服务器连接时按接收顺序发送。

与 sprockets.http 的集成

如果您在应用程序堆栈中使用 sprockets.http,那么 Tornado 集成将检测到它并为您安装初始化和关闭钩子。只要设置了 $STATSD_HOST$STATSD_PREFIX 环境变量,应用程序就会正常工作。下面的代码片段将产生与 Tornado 示例相同的结果,即使没有设置前缀也是如此

class Application(sprockets_statsd.tornado.Application,
                  sprockets.http.app.Application):
    def __init__(self, **settings):
        statsd = settings.setdefault('statsd', {})
        statsd.setdefault('host', os.environ['STATSD_HOST'])
        statsd.setdefault('protocol', 'tcp')
        settings.update({
            'service': 'my-service',
            'environment': os.environ.get('ENVIRONMENT', 'development'),
            'statsd': statsd,
            'version': getattr(__package__, 'version'),
        })
        super().__init__([web.url('/', MyHandler)], **settings)

if __name__ == '__main__':
    sprockets.http.run(Application, log_config=...)

如上所述在 settings 中定义 serviceenvironment 将导致前缀设置为

applications.{self.settings["service"]}.{self.settings["environment"]}

推荐的用法是

  1. 在设置中定义 serviceenvironmentversion

  2. self.settings["statsd"] 中显式设置 hostprotocol 设置

项目详情


下载文件

下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。

源分布

sprockets-statsd-1.0.0.tar.gz (25.3 kB 查看哈希值)

上传时间

构建分布

sprockets_statsd-1.0.0-py3-none-any.whl (15.2 kB 查看哈希值)

上传于 Python 3

支持