博客/工程

开始使用分布式跟踪和使用foobar Grafana节奏,演示用Python编写的

2021年5月4日 5分钟

丹尼尔是一个网站可靠性工程师k6.io。他特别感兴趣的可观测性,分布式系统,开源的。在他的空闲时间,他帮助维护Grafana节奏一个易于使用的,大规模的分布式跟踪后端。

分布式跟踪是一种通过应用程序跟踪请求的路径。这是特别有用,当你正在microservice架构。但开始使用很难:你必须仪表服务,摄取跟踪数据,存储所有痕迹的地方,选一个跟踪发现方法,并一起祈祷一切正常。同时,你必须解释你团队的其他成员这个新事物是如何工作的,以及如何有效地使用它。

这就是为什么我foobar,一个小microservices,用Python编写的应用程序包含所有你需要的东西开始使用分布式跟踪。

在这篇文章中,我们将尝试foobar和排除一些(完全)意想不到的问题。

开始

foobar演示包含两个复杂的服务:foo和bar。

两个服务是用Python编写的,与OpenTelemetry检测,并使用OTLP gRPC出口商发货跟踪OpenTelemetry收集器。这个出口收集器Grafana节奏的痕迹,我们可以查询跟踪数据从数据源Grafana使用节奏。

在本地运行

如果你想跟随,确保您已经安装了码头工人,码头工人组成。

让我们开始通过克隆回购:

➜git克隆https://github.com/dgzlopes/foobar-demo;cd foobar-demo

然后我们会得到整个设置启动并运行:

➜docker-compose -构建- d #(这是需要几分钟)

就是这样!我们有我们所需要的。现在我们必须检查foobar启动并工作正常。这里有两种方式我们可以这样做:

  1. Curl:运行curl http://localhost: 5000 / foo
  2. 与您的浏览器:去http://localhost: 5000 / foo

无论哪种方式,响应应该是一样的:foobar。哈!

找到一些痕迹

毕竟这是一个跟踪教程,对吧?让我们找到一些痕迹。

现在,查找痕迹在节奏的唯一方法就是通过了解trace_id,每个跟踪一个惟一的ID。我们要查询的日志服务使用码头工人组成CLI foo,然后我们将使用grep来找到trace_ids:

➜docker-compose日志foo | grep trace_id foo_1 |时间=“2021-04-18 09:08:26,543”服务= foo = INFO addr =“172.19.0.1”方法=水平得到计划= = http路径“/ foo ?”状态= 200 trace_id = 5 ac85e3e517f7ff62ac5aaaacccfabe8 foo_1 |时间=“2021-04-18 09:08:26,545”服务= foo = INFO addr =“172.19.0.1”方法=水平得到计划= = http路径“/ foo ?”状态= 200 trace_id = 9 e38679e1782a593eb60c3375496467b foo_1 |时间=“2021-04-18 09:08:26,545”服务= foo = INFO addr =“172.19.0.1”方法=水平得到计划= = http路径“/ foo ?”状态= 200 trace_id = 61 b93a71bf42369c988930847ba12381

选择其中一个,去Grafana (http://localhost: 3000) - >探索- >节奏,粘贴trace_id,点击运行查询。您应该看到完整的跟踪显示在你的屏幕!

要进一步

我们检查旋度与浏览器(和/或)foobar工作,但这是不够的。我们应该进行冒烟测试。

冒烟测试

冒烟测试是一个常规的负载测试,配置为最小负载运行很有用,当你想确认您的系统最小负荷时不会抛出任何错误。

冒烟测试,我们将使用转k6,让我们创建一个开源的负载测试工具测试使用JavaScript代码。这是我们的测试是什么样子:

从“转k6进口http / http ';进口睡眠}{检查,从“转k6”;执行出口让选项={的vu: 5、持续时间:20年代,};出口的默认函数(){让res = http.get (http://foo: 5000 / foo);检查(res,{“状态200”:r (r) = >。状态= = = 200,“回报foobar”: r (r) = >。身体= =“foobar”});睡眠(1);}

这个测试将使用5个虚拟用户运行20秒钟,它会发出HTTP GET请求我们foo端点。同时,它会检查响应状态是身体foobar 200和。

运行这个测试,我们将使用转k6码头工人形象:

码头工人跑——我——网络= foobar-demo_default loadimpact /转k6 - < example.js运行——安静

一旦测试完成后,转k6给了我们一个总结在测试运行期间发生了什么,我们可以看到…意想不到的东西。一些检查失败!呵。

故障排除

让我们保持冷静,尝试理解发生了什么。

我们知道有时状态代码200,不是吗?然后我们可以去foo的日志服务,和grep找到匹配的离群值的请求(地位! = 200):

➜docker-compose日志foo | grep trace_id | grep - v状态= 200 foo_1 |时间=“2021-04-18 10:28:11,142”服务= foo = INFO addr =“172.19.0.7”方法=水平得到计划= = http路径“/ foo ?”状态= 500 trace_id = b9e61bb959353927062acf99ed0b2de2 foo_1 |时间=“2021-04-18 10:28:16,233”服务= foo = INFO addr =“172.19.0.7”方法=水平得到计划= = http路径“/ foo吗?”= 500 trace_id = ae6ed04f4aa4244065fb04955fdcc9af地位

一旦我们有了这些有问题的日志行请求,我们可以从其中之一,选择trace_id Grafana打开跟踪,正如我们前面显示的。

正如您可以看到的,有一些感叹号。不是很好!做更深入的跨越,我们可以看到请求foo禁止返回500状态码。

所以说这个问题可能是安全与酒吧服务,以及它是如何运作的。这是正确的!这是酒吧服务的一部分代码片段:

@app.route(" /酒吧”)def bar (): random_value =随机()#随机数范围[0.0,1.0)如果random_value < 0.05:返回“边缘案例!”,500年返回“酒吧”

是这样的服务是随机编码失败…设计决策。

我们应该删除。:)

结束

在这篇文章中,我们发挥了一些与foobar的帮助下发现了一些奇怪的行为追踪和转k6分布。如果你想了解更多关于分布式跟踪,之前的博客查看。”新手指南:分布式跟踪。”

如果转k6听起来很有趣,看看我们文档Github库

如果你认为节奏看起来很酷,看“开始使用跟踪和Grafana节奏”研讨会在需求。你可以得到免费公测进入节奏Grafana云。我们有免费和付费Grafana云计划以适应每个用例-现在免费注册


在这一页上