异步发送指标到statsd实例。
项目描述
异步发送指标到 statsd 实例。
此库提供连接器,用于通过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 中定义 service 和 environment 将导致前缀设置为
applications.{self.settings["service"]}.{self.settings["environment"]}
推荐的用法是
在设置中定义 service、environment 和 version
在 self.settings["statsd"] 中显式设置 host 和 protocol 设置
项目详情
下载文件
下载适合您平台的文件。如果您不确定选择哪个,请了解更多关于 安装包 的信息。