菜单
开源

使用 k6 对日志查询进行负载测试

在为 Loki 安装的读取路径设计负载测试场景时,了解您预期的查询类型非常重要。

支持的查询类型

Loki 有 5 种查询类型

  • 即时查询
  • 范围查询
  • 标签查询
  • 标签值查询
  • series 查询

在实际应用中,例如将 Loki 用作 Grafana 数据源进行查询时,会使用所有这些查询类型。每种查询类型都有不同的 API 端点。xk6-loki 扩展为所有这些查询类型提供了 Javascript API

即时查询

即时查询可以使用 `loki.Client` 实例上的函数 instantQuery(query, limit) 来执行

Javascript 代码示例片段

JavaScript
export default () => {
  client.instantQuery(`rate({app="my-app-name"} | logfmt | level="error" [5m])`);
}

范围查询

范围查询可以使用 `loki.Client` 实例上的函数 rangeQuery(query, duration, limit) 来执行

Javascript 代码示例片段

JavaScript
export default () => {
  client.rangeQuery(`{app="my-app-name"} | logfmt | level="error"`, "15m");
}

标签查询

标签查询可以使用 `loki.Client` 实例上的函数 labelsQuery(duration) 来执行

Javascript 代码示例片段

JavaScript
export default () => {
  client.labelsQuery("10m");
}

标签值查询

标签值查询可以使用 `loki.Client` 实例上的函数 labelValuesQuery(label, duration) 来执行

Javascript 代码示例片段

JavaScript
export default () => {
  client.labelValuesQuery("app", "10m");
}

Series 查询

Series 查询可以使用 `loki.Client` 实例上的函数 seriesQuery(matcher, range) 来执行

Javascript 代码示例片段

JavaScript
export default () => {
  client.seriesQuery(`match[]={app=~"loki-.*"}`, "10m");
}

指标

该扩展除了内置指标外,还会收集在测试结束摘要中打印的指标。这些指标仅针对即时查询和范围查询收集。

名称描述
loki_bytes_processed_per_secondLoki 每秒处理的字节数
loki_bytes_processed_totalLoki 总共处理的字节数
loki_lines_processed_per_secondLoki 每秒处理的行数
loki_lines_processed_totalLoki 总共处理的行数

标签池

使用 xk6-loki 扩展,您可以使用 `Config` 对象上的 `labels` 字段。它包含以可重现方式生成的标签名称和值。对 `write` 和 `read` 测试使用相同的标签基数配置。

Javascript 代码示例片段

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 示例

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% 即时查询

在测试运行期间。