为asyncio应用程序提供zipkin分布式跟踪的仪器
项目描述
aiozipkin
aiozipkin 是一个Python 3.6+模块,它通过zipkin (http://zipkin.io) 服务器仪器,为asyncio应用程序添加了分布式跟踪功能。
zipkin 是一个分布式追踪系统。它有助于收集解决微服务架构中延迟问题的所需时间数据。它管理这些数据的收集和查找。Zipkin 的设计基于 Google Dapper 论文。
应用程序通过 aiozipkin 进行了仪表化,并将时间数据报告给 zipkin。Zipkin UI 还展示了依赖关系图,显示了有多少追踪请求通过了每个应用程序。如果您正在解决延迟问题或错误,可以根据应用程序、追踪长度、注释或时间戳对所有追踪进行筛选或排序。
功能
为 asyncio 应用程序提供分布式追踪功能。
支持 zipkin v2 协议。
易于使用的 API。
显式上下文处理,无线程局部变量。
可以通过与 zipkin 兼容的 API 与 jaeger 和 stackdriver 一起使用。
zipkin 词汇
在代码之前,让我们学习重要的 zipkin 词汇,有关更详细的信息,请访问 https://zipkin.io/pages/instrumenting
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()
文档
安装
安装过程很简单,只需
$ pip install aiozipkin
其他收集器的支持
aiozipkin 可以与任何其他 zipkin 兼容的服务一起工作,目前我们已经测试了它与 jaeger 和 stackdriver 一起工作。
Jaeger 支持
jaeger 支持 zipkin span 格式,因此可以使用 aiozipkin 与 jaeger 服务器一起使用。您只需指定 jaeger 服务器地址,它应该可以开箱即用。无需运行本地 zipkin 服务器。有关更多信息,请参阅测试和 jaeger 文档。
Stackdriver 支持
Google stackdriver 支持 zipkin span 格式,因此可以使用 aiozipkin 与此 google 服务一起使用。为了使此功能正常工作,您需要设置本地 zipkin 服务,该服务将发送追踪到云端。请参阅 google 云文档,了解如何设置 zipkin 收集器。
要求
CHANGES
1.1.1 (2021-10-23)
错误修复
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客户端跟踪支持
添加了示例和演示