跳转到主要内容

为asyncio应用程序提供zipkin分布式跟踪的仪器

项目描述

aiozipkin

https://github.com/aio-libs/aiozipkin/workflows/CI/badge.svg https://codecov.io/gh/aio-libs/aiozipkin/branch/master/graph/badge.svg Maintainability https://img.shields.io/pypi/v/aiozipkin.svg Documentation Status Chat on Gitter

aiozipkin 是一个Python 3.6+模块,它通过zipkin (http://zipkin.io) 服务器仪器,为asyncio应用程序添加了分布式跟踪功能。

zipkin 是一个分布式追踪系统。它有助于收集解决微服务架构中延迟问题的所需时间数据。它管理这些数据的收集和查找。Zipkin 的设计基于 Google Dapper 论文。

应用程序通过 aiozipkin 进行了仪表化,并将时间数据报告给 zipkin。Zipkin UI 还展示了依赖关系图,显示了有多少追踪请求通过了每个应用程序。如果您正在解决延迟问题或错误,可以根据应用程序、追踪长度、注释或时间戳对所有追踪进行筛选或排序。

zipkin ui animation

功能

  • asyncio 应用程序提供分布式追踪功能。

  • 支持 zipkin v2 协议。

  • 易于使用的 API。

  • 显式上下文处理,无线程局部变量。

  • 可以通过与 zipkin 兼容的 API 与 jaegerstackdriver 一起使用。

zipkin 词汇

在代码之前,让我们学习重要的 zipkin 词汇,有关更详细的信息,请访问 https://zipkin.io/pages/instrumenting

zipkin ui glossary
  • Span 代表一个特定的方法(RPC)调用

  • Annotation 与 span 中的特定时间戳相关联的字符串数据

  • Tag - 与给定 span 关联的键和值

  • Trace - 与特定请求服务相关的 span 集合

简单示例

import asyncio
import aiozipkin as az


async def run():
    # setup zipkin client
    zipkin_address = 'http://127.0.0.1:9411/api/v2/spans'
    endpoint = az.create_endpoint(
        "simple_service", ipv4="127.0.0.1", port=8080)
    tracer = await az.create(zipkin_address, endpoint, sample_rate=1.0)

    # create and setup new trace
    with tracer.new_trace(sampled=True) as span:
        # give a name for the span
        span.name("Slow SQL")
        # tag with relevant information
        span.tag("span_type", "root")
        # indicate that this is client span
        span.kind(az.CLIENT)
        # make timestamp and name it with START SQL query
        span.annotate("START SQL SELECT * FROM")
        # imitate long SQL query
        await asyncio.sleep(0.1)
        # make other timestamp and name it "END SQL"
        span.annotate("END SQL")

    await tracer.close()

if __name__ == "__main__":
    loop = asyncio.get_event_loop()
    loop.run_until_complete(run())

aiohttp 示例

aiozipkin 包含 aiohttp 服务器仪表化,为此,像往常一样创建 web.Application() 并安装 aiozipkin 插件

import aiozipkin as az

def init_app():
    host, port = "127.0.0.1", 8080
    app = web.Application()
    endpoint = az.create_endpoint("AIOHTTP_SERVER", ipv4=host, port=port)
    tracer = await az.create(zipkin_address, endpoint, sample_rate=1.0)
    az.setup(app, tracer)

就这样,插件添加了中间件,该中间件尝试从头部获取上下文,并创建/加入新的追踪。可选地,在客户端,您可以在请求中添加传播头部,以强制进行追踪并查看客户端和服务器之间的网络延迟。

import aiozipkin as az

endpoint = az.create_endpoint("AIOHTTP_CLIENT")
tracer = await az.create(zipkin_address, endpoint)

with tracer.new_trace() as span:
    span.kind(az.CLIENT)
    headers = span.context.make_headers()
    host = "http://127.0.0.1:8080/api/v1/posts/{}".format(i)
    resp = await session.get(host, headers=headers)
    await resp.text()

文档

http://aiozipkin.readthedocs.io/

安装

安装过程很简单,只需

$ pip install aiozipkin

其他收集器的支持

aiozipkin 可以与任何其他 zipkin 兼容的服务一起工作,目前我们已经测试了它与 jaegerstackdriver 一起工作。

Jaeger 支持

jaeger 支持 zipkin span 格式,因此可以使用 aiozipkinjaeger 服务器一起使用。您只需指定 jaeger 服务器地址,它应该可以开箱即用。无需运行本地 zipkin 服务器。有关更多信息,请参阅测试和 jaeger 文档。

jaeger ui animation

Stackdriver 支持

Google stackdriver 支持 zipkin span 格式,因此可以使用 aiozipkin 与此 google 服务一起使用。为了使此功能正常工作,您需要设置本地 zipkin 服务,该服务将发送追踪到云端。请参阅 google 云文档,了解如何设置 zipkin 收集器。

jaeger ui animation

要求

CHANGES

1.1.1 (2021-10-23)

错误修复

  • 修复了在 aiohttp 集成中未知资源被用户请求时未处理的 AssertionError。 #400

  • 修复了使用 SystemRoute 时的 NoneType 错误。 #410


1.1.0 (2021-05-17)

错误修复

  • 期望追踪请求上下文是 SimpleNamespace 类型。 #385


1.0.0 (2020-11-06)

错误修复

  • 支持 Python 3.8 和 Python 3.9 #259


0.7.1 (2020-09-20)

错误修复

  • 修复了 Manifest.in 文件;将 CHANGES.rst 添加到源存档。

0.7.0 (2020-07-17)

功能

  • 添加对AWS X-Ray跟踪ID格式的支持。 #273


0.6.0 (2019-10-12)

  • 为python3.7 aiohttp配置添加上下文变量支持 #187

  • 单头部跟踪支持 #189

  • 向传输添加重试和批量操作(感谢 @konstantin-stepanov)

  • 弃用python3.5支持 #238

  • 在代码库中使用新的类型语法 #237

0.5.0 (2018-12-25)

  • 使用更严格的类型配置 #147

  • 修复代码和文档中的大量错误 #151 #153(感谢 @deejay1)

  • 添加了Transport的接口 #155(感谢 @deejay1)

  • 添加了create_custom辅助器以简化跟踪器配置 #160(感谢 @deejay1)

  • 添加了Sampler的接口 #160(感谢 @deejay1)

  • 添加了py.typed标记

0.4.0 (2018-07-11)

  • 使用类型添加更多覆盖率 #147

  • 重大更改:send_inteval => send_interval #144(感谢 @gugu)

  • 重大更改:不要将api/v2/spans附加到zipkin dress #150

0.3.0 (2018-06-13)

  • 为aiohttp添加http.route标签支持 #138

  • 使zipkin地址生成器更加宽容 #141(感谢 @dsantosfff)

0.2.0 (2018-03-03)

  • 重大更改:az.create现在是协程 #114

  • 为跟踪器对象添加了上下文管理器 #114

  • 添加了更多mypy类型 #117

0.1.1 (2018-01-26)

  • 添加了new_child辅助方法 #83

0.1.0 (2018-01-21)

经过几个月的工作和beta版本,以下是基本功能

  • 初始发布。

  • 实现了使用HTTP传输的zipkin v2协议

  • 添加了Jaeger支持

  • 添加了Stackdriver支持

  • 添加了aiohttp服务器支持

  • 添加了aiohttp 3.0.0客户端跟踪支持

  • 添加了示例和演示

由以下支持