博客/工程

用Grafana k6加载测试Grafana Loki的快速指南

2022年6月8日8分钟

作为Grafana实验室的一名软件工程师,我了解到当人们开始建bob电竞频道立一个新的系统时,通常会出现两个问题洛基安装:“我可以将多少日志摄取到集群中?,然后是“查询这些日志的速度有多快?”

有两种方法可以找到答案。

您可以配置现有的应用程序基础结构来推送日志并查看发生了什么—或者您可以找到聪明的方法并使用该方法对系统进行负载测试Grafana转k6

Grafana k6是一种现代负载测试工具。它的干净和可接近的脚本API可以在本地或云中工作。值得庆幸的是,还有一个k6扩展,允许您将日志推到Loki并从Loki查询日志。它充当Loki客户机,模拟真实的负载来测试Loki安装的可伸缩性、可靠性和性能。

在这篇文章中,我将解释如何做到这一点,并向您展示编写和查询路径测试的基本概念,以及关于如何使用配置选项调优测试的更多见解。在我的解释中,我将假设您对如何使用k6有一个基本的了解。(如果你是新手,去看看文档-太棒了!)此外,我不打算解释如何构建和安装k6 Loki扩展,但它并不像你可能认为的那么难。你可以找到说明在这里

一旦构建了扩展,就可以使用生成的二进制文件来执行用Javascript编写的负载测试文件。在JS文件中,可以使用由xk6-loki扩展提供的API.指令本身不是由JS运行时执行的,而是二进制代码的函数调用。通过这种方式,它结合了编译后的Go代码生成日志行和执行网络请求的性能,以及Javascript脚本的灵活性。

一个非常基本的test.js加载测试文件是这样的:

Import Loki from 'k6/x/ Loki ';Const timeout = 5000;// ms const conf = loki。配置("http://localhost:3100", timeout); const client = loki.Client(conf); export default () => { client.push(); };

可以像这样执行:

./k6运行test.js

把日志

首先,让我们看看如何随机化推请求来模拟写路径负载。如上例所示,Client对象有一个方法push ().这将生成一个包含5个有效负载的单个推送请求随机标签值,未压缩的日志文件总大小在800Kb到1Mb之间。

需要调整请求参数吗?客户端也有一个pushParameterized(streams, minSize, maxSize)方法,它允许您完成此操作。在下面的示例中,推送请求生成2到8个流之间的随机数量,总日志大小在1到2MB之间。

Import Loki from 'k6/x/ Loki ';const conf = loki.Config("http://localhost:3100");const client = loki.Client(conf);export default () => {let streams = randInt(2,8);客户端。pushParameterized(流,1024*1024,2*1024*1024);};函数randomInt(min, max){返回Math.floor(Math.random() * (max - min + 1) + min);};

如果您想要固定的批处理大小,请将第二个和第三个参数设置为相同的值。每个单独流的大小是总大小除以流的数量。

对于实际的日志行,xk6-loki使用鞭打库,它生成各种常用日志格式的假日志行,例如apache_commonsyslog rfc5424,或json.方法定义日志行格式格式流的标签。

标签和流

到目前为止,我们已经控制了实际日志的格式和大小,但没有查看日志元数据(也称为标签)。一组具有惟一键-值对的标签称为流,流包含许多日志行。当使用pushParameterized(n, minSize, maxSize)函数将日志推到Loki, xk6-loki创建n个随机标签值的流。

一个流总是包含三个预定义的标签-实例操作系统,格式-以及可选标签名称空间应用程序圆荚体语言,.预定义标签实例设置为VU和主机名;操作系统是其中之一窗户linux,或达尔文;而且格式是flog支持的日志格式之一。

当Config对象用“标签基数”映射实例化时,将使用可选标签。映射定义了对于给定的标签名应该使用多少不同的标签值。它允许您控制负载测试可能生成的惟一流的数量,即可能值的笛卡尔积。

下面的示例演示如何配置可选标签的基数。

Import Loki from 'k6/x/ Loki ';Const标签= {"namespace": 2, "app": 5,};Const conf = loki。配置("http://localhost:3100", 10000, labels); const client = loki.Client(conf);

假设测试是从一台具有10 vu的机器上运行的,惟一流的最大数量是:

# instance x OS x format x namespace x app 10 x 3 x 6 x 2 x 5 = 1800个流

在撰写本文时,还没有办法定义自定义标签名。

查询日志

与推送日志一样,Client对象还提供了从Loki查询日志和元数据的函数。就像洛基的问题一样API端点,这些方法是:

  • instantQuery(查询、限制)
  • rangeQuery(查询,持续时间,限制)
  • labelsQuery(持续时间)
  • labelValuesQuery(标签、持续时间)
  • seriesQuery(匹配器、持续时间)

(他们做的事和他们的名字很像。)

下面的示例使用Config对象中的标签来生成随机化的LogQL查询。因为在实例化Config对象时已经生成了标签池——而且是用固定的种子完成的——标签名称和值以可预测的方式生成。当您希望分别运行写和读负载测试时,这非常有用。

从'k6'导入{check};Import Loki from 'k6/x/ Loki ';const conf = loki.Config("http://localhost:3100");const client = loki.Client(conf);export default() =>{//从标签池中选择一个随机的日志格式let format = randomChoice(conf.labels\["format"]);//执行限制为1的即时查询res = client.instantQuery(' count_over_time({format="${format}"}[15m]) ', 1) //检查读检查是否成功(res, {'successful instant query': (res) => res.status == 200});//执行最近15m的范围查询,限制1000 res = client。rangeQuery(' {format="${format}"} ', "15m", 1000) //检查读检查是否成功(res, {'successful range query': (res) => res.status == 200});}函数randomChoice(items){返回条目\[Math.floor(Math.random() * items.length)];}

在执行查询测试时,一定要检查API调用的响应,因为它可以进一步了解查询是否成功。

单用户vs多租户

Loki可以在单租户和多租户模式下运行。在单租户模式下运行时,所有日志都存储在同一个租户:“fake”下。在多租户模式下,客户端可以指定X-Scope-OrgID头标识为租户。指定租户存储的日志只能由同一租户检索。Xk6-loki也支持莫迪的两种操作方式。

如果配置Loki为多租户模式(启用身份验证),则洛基。配置方法没有接收用户名作为URL的一部分,xk6-loki将使用不同的X-Scope-OrgID值,格式为xk6-tenant - VU美元为每个VU (virtual user)配置。这意味着使用n个VU运行测试将为每个VU摄取大约1/n的总日志。这同样适用于查询,因此对租户的查询只处理摄入的总数据的1/n。

如果在多租户模式下配置Loki,但希望在单用户模式下使用xk6-loki,则可以在URL的用户信息部分指定用户名,还可以指定密码。它看起来是这样的:

' const conf = loi . config (" http://username[:password]@localhost:3100 ") '

通过这种方式,每个推送和查询日志的请求都使用相同的方式完成X-Scope-OrgID在负载测试的所有vu上执行头文件。

与单用户模式(可选地接受密码)不同,多租户模式不允许单个租户的授权(密码)。

监视负载测试

最后但并非最不重要的是,如果不收集可以分析和比较的硬数据,负载测试还会是什么?除了k6的内置度量之外,扩展还收集额外的自定义度量—用于推送和查询请求—并将它们打印在end-of-test总结.下面是一个例子:

普通测试运行的测试结束摘要
普通测试运行的测试结束摘要

对于查询请求,这些指标是公开的:

  • loki_bytes_processed_total
  • loki_bytes_processed_per_second
  • loki_lines_processed_total
  • loki_lines_processed_per_second

loki_bytes_processed_total而且loki_lines_processed_total分别为字节和行计数器。

loki_bytes_processed_per_second而且loki_lines_processed_per_second分别是字节和行的吞吐量率。

所有四个指标都来自Loki服务器发送的查询响应统计信息。

对于推送请求,你需要使用:

  • loki_client_lines
  • loki_client_uncompressed_bytes

loki_client_lines是一个计数器,它计算在负载测试期间已推入Loki的行总数。loki_client_uncompressed_bytes统计已推送日志行的总字节数。

这些指标提供了对Loki传输和处理的数据量的洞察。

恭喜你!

现在您应该能够针对Loki安装设置和运行负载测试了。

如果你想了解更多,这里有很多更多的信息和完整的参考文档xk6-loki扩展在Github上。