使用 k6 对日志查询进行负载测试
在为 Loki 安装的读取路径设计负载测试场景时,了解您预期的查询类型非常重要。
支持的查询类型
Loki 有 5 种查询类型
- 即时查询
- 范围查询
- 标签查询
- 标签值查询
- series 查询
在实际应用中,例如将 Loki 用作 Grafana 数据源进行查询时,会使用所有这些查询类型。每种查询类型都有不同的 API 端点。xk6-loki 扩展为所有这些查询类型提供了 Javascript API。
即时查询
即时查询可以使用 `loki.Client` 实例上的函数 instantQuery(query, limit)
来执行
Javascript 代码示例片段
export default () => {
client.instantQuery(`rate({app="my-app-name"} | logfmt | level="error" [5m])`);
}
范围查询
范围查询可以使用 `loki.Client` 实例上的函数 rangeQuery(query, duration, limit)
来执行
Javascript 代码示例片段
export default () => {
client.rangeQuery(`{app="my-app-name"} | logfmt | level="error"`, "15m");
}
标签查询
标签查询可以使用 `loki.Client` 实例上的函数 labelsQuery(duration)
来执行
Javascript 代码示例片段
export default () => {
client.labelsQuery("10m");
}
标签值查询
标签值查询可以使用 `loki.Client` 实例上的函数 labelValuesQuery(label, duration)
来执行
Javascript 代码示例片段
export default () => {
client.labelValuesQuery("app", "10m");
}
Series 查询
Series 查询可以使用 `loki.Client` 实例上的函数 seriesQuery(matcher, range)
来执行
Javascript 代码示例片段
export default () => {
client.seriesQuery(`match[]={app=~"loki-.*"}`, "10m");
}
指标
该扩展除了内置指标外,还会收集在测试结束摘要中打印的指标。这些指标仅针对即时查询和范围查询收集。
名称 | 描述 |
---|---|
loki_bytes_processed_per_second | Loki 每秒处理的字节数 |
loki_bytes_processed_total | Loki 总共处理的字节数 |
loki_lines_processed_per_second | Loki 每秒处理的行数 |
loki_lines_processed_total | Loki 总共处理的行数 |
标签池
使用 xk6-loki 扩展,您可以使用 `Config` 对象上的 `labels` 字段。它包含以可重现方式生成的标签名称和值。对 `write` 和 `read` 测试使用相同的标签基数配置。
Javascript 代码示例片段
const labelCardinality = {
"app": 5,
"namespace": 2,
};
const conf = new loki.Config(BASE_URL, 10000, 1.0, labelCardinality);
const client = new loki.Client(conf);
function randomChoice(items) {
return items[Math.floor(Math.random() * items.length)];
}
export default() {
let app = randomChoice(conf.labels.app);
let namespace = randomChoice(conf.labels.namespace);
client.rangeQuery(`{app="${app}", namespace="${namespace}"} | logfmt | level="error"`, "15m");
}
或者,您可以定义自己的标签名称和值池,然后从您的池中随机选择标签,而不是使用生成的池。
Javascript 示例
xk6-loki 仓库中有一个更复杂的读取场景示例。测试文件 read-scenario.js 可以复用并根据您的需求进行扩展。
它允许您配置每种查询类型的比例以及时间范围的比例。
Javascript 示例
const queryTypeRatioConfig = [
{
ratio: 0.1,
item: readLabels
},
{
ratio: 0.15,
item: readLabelValues
},
{
ratio: 0.05,
item: readSeries
},
{
ratio: 0.5,
item: readRange
},
{
ratio: 0.2,
item: readInstant
},
];
此配置将大约执行
- 10% 标签请求
- 15% 标签值请求
- 5% series 请求
- 50% 范围查询
- 20% 即时查询
在测试运行期间。