VictoriaMetrics/app/vlogsgenerator
Aliaksandr Valialkin 9c4b0334f2
all: consistently use stringsutil.JSONString() for formatting JSON strings with fmt.* functions instead of using "%q" formatter
The %q formatter may result in incorrectly formatted JSON string if the original string
contains special chars such as \x1b . They must be encoded as \u001b , otherwise the resulting JSON string
cannot be parsed by JSON parsers.

This is a follow-up for c0caa69939

See https://github.com/VictoriaMetrics/victorialogs-datasource/issues/24
2024-07-17 13:52:13 +02:00
..
main.go all: consistently use stringsutil.JSONString() for formatting JSON strings with fmt.* functions instead of using "%q" formatter 2024-07-17 13:52:13 +02:00
Makefile lib/logstorage: initial implementation of pipes in LogsQL 2024-05-12 16:33:31 +02:00
README.md lib/logstorage: work-in-progress 2024-05-25 00:30:58 +02:00

vlogsgenerator

Logs generator for VictoriaLogs.

How to build vlogsgenerator?

Run make vlogsgenerator from the repository root. This builds bin/vlogsgenerator binary.

How run vlogsgenerator?

vlogsgenerator generates logs in JSON line format suitable for the ingestion via /insert/jsonline endpoint at VictoriaLogs.

By default it writes the generated logs into stdout. For example, the following command writes generated logs to stdout:

bin/vlogsgenerator

It is possible to redirect the generated logs to file. For example, the following command writes the generated logs to logs.json file:

bin/vlogsgenerator > logs.json

The generated logs at logs.json file can be inspected with the following command:

head logs.json | jq .

Below is an example output:

{
  "_time": "2024-05-08T14:34:00.854Z",
  "_msg": "message for the stream 8 and worker 0; ip=185.69.136.129; uuid=b4fe8f1a-c93c-dea3-ba11-5b9f0509291e; u64=8996587920687045253",
  "host": "host_8",
  "worker_id": "0",
  "run_id": "f9b3deee-e6b6-7f56-5deb-1586e4e81725",
  "const_0": "some value 0 8",
  "const_1": "some value 1 8",
  "const_2": "some value 2 8",
  "var_0": "some value 0 12752539384823438260",
  "dict_0": "warn",
  "dict_1": "info",
  "u8_0": "6",
  "u16_0": "35202",
  "u32_0": "1964973739",
  "u64_0": "4810489083243239145",
  "float_0": "1.868",
  "ip_0": "250.34.75.125",
  "timestamp_0": "1799-03-16T01:34:18.311Z",
  "json_0": "{\"foo\":\"bar_3\",\"baz\":{\"a\":[\"x\",\"y\"]},\"f3\":NaN,\"f4\":32}"
}
{
  "_time": "2024-05-08T14:34:00.854Z",
  "_msg": "message for the stream 9 and worker 0; ip=164.244.254.194; uuid=7e8373b1-ce0d-1ce7-8e96-4bcab8955598; u64=13949903463741076522",
  "host": "host_9",
  "worker_id": "0",
  "run_id": "f9b3deee-e6b6-7f56-5deb-1586e4e81725",
  "const_0": "some value 0 9",
  "const_1": "some value 1 9",
  "const_2": "some value 2 9",
  "var_0": "some value 0 5371555382075206134",
  "dict_0": "INFO",
  "dict_1": "FATAL",
  "u8_0": "219",
  "u16_0": "31459",
  "u32_0": "3918836777",
  "u64_0": "6593354256620219850",
  "float_0": "1.085",
  "ip_0": "253.151.88.158",
  "timestamp_0": "2042-10-05T16:42:57.082Z",
  "json_0": "{\"foo\":\"bar_5\",\"baz\":{\"a\":[\"x\",\"y\"]},\"f3\":NaN,\"f4\":27}"
}

The run_id field uniquely identifies every vlogsgenerator invocation.

How to write logs to VictoriaLogs?

The generated logs can be written directly to VictoriaLogs by passing the address of /insert/jsonline endpoint to -addr command-line flag. For example, the following command writes the generated logs to VictoriaLogs running at localhost:

bin/vlogsgenerator -addr=http://localhost:9428/insert/jsonline

Configuration

vlogsgenerator accepts various command-line flags, which can be used for configuring the number and the shape of the generated logs. These flags can be inspected by running vlogsgenerator -help. Below are the most interesting flags:

  • -start - starting timestamp for generating logs. Logs are evenly generated on the [-start ... -end] interval.
  • -end - ending timestamp for generating logs. Logs are evenly generated on the [-start ... -end] interval.
  • -activeStreams - the number of active log streams to generate.
  • -logsPerStream - the number of log entries to generate per each log stream. Log entries are evenly distributed on the [-start ... -end] interval.

The total number of generated logs can be calculated as -activeStreams * -logsPerStream.

For example, the following command generates 1_000_000 log entries on the time range [2024-01-01 - 2024-02-01] across 100 log streams, where every logs stream contains 10_000 log entries, and writes them to http://localhost:9428/insert/jsonline:

bin/vlogsgenerator \
  -start=2024-01-01 -end=2024-02-01 \
  -activeStreams=100 \
  -logsPerStream=10_000 \
  -addr=http://localhost:9428/insert/jsonline

Churn rate

It is possible to generate churn rate for active log streams by specifying -totalStreams command-line flag bigger than -activeStreams. For example, the following command generates logs for 1000 total streams, while the number of active streams equals to 100. This means that at every time there are logs for 100 streams, but these streams change over the given [-start ... -end] time range, so the total number of streams on the given time range becomes 1000:

bin/vlogsgenerator \
  -start=2024-01-01 -end=2024-02-01 \
  -activeStreams=100 \
  -totalStreams=1_000 \
  -logsPerStream=10_000 \
  -addr=http://localhost:9428/insert/jsonline

In this case the total number of generated logs equals to -totalStreams * -logsPerStream = 10_000_000.

Benchmark tuning

By default vlogsgenerator generates and writes logs by a single worker. This may limit the maximum data ingestion rate during benchmarks. The number of workers can be changed via -workers command-line flag. For example, the following command generates and writes logs with 16 workers:

bin/vlogsgenerator \
  -start=2024-01-01 -end=2024-02-01 \
  -activeStreams=100 \
  -logsPerStream=10_000 \
  -addr=http://localhost:9428/insert/jsonline \
  -workers=16

Output statistics

Every 10 seconds vlogsgenerator writes statistics about the generated logs into stderr. The frequency of the generated statistics can be adjusted via -statInterval command-line flag. For example, the following command writes statistics every 2 seconds:

bin/vlogsgenerator \
  -start=2024-01-01 -end=2024-02-01 \
  -activeStreams=100 \
  -logsPerStream=10_000 \
  -addr=http://localhost:9428/insert/jsonline \
  -statInterval=2s