- Notifications
You must be signed in to change notification settings - Fork20
grafana/xk6-loki
Folders and files
Name | Name | Last commit message | Last commit date | |
---|---|---|---|---|
Repository files navigation
A k6 extension for pushing logs to Loki.
Install
xk6
go install go.k6.io/xk6/cmd/xk6@latest
Checkout
grafana/xk6-loki
git clone https://github.com/grafana/xk6-lokicd xk6-loki
Build the extension
make k6
Thek6/x/loki
module contains the Loki extension to interact with the Loki API.To import the module add
importlokifrom'k6/x/loki';
on top of your test file.
The classConfig
holds configuration for the Loki client. The constructortakes the following arguments:
argument | type | description | default |
---|---|---|---|
url | string | The full URL to Loki in format[${scheme}://][${tenant}[:${token}]]@${host}[:${port}] | - |
timeout | integer | Request timeout in milliseconds, e.g.10000 for 10s | 10000 |
ratio | float | The ratio between JSON and Protobuf encoded batch requests for pushing logs Must be a number between (including) 0 (100% JSON) and 1 (100% Protobuf) This is only relevant for write scenarios. | 0.9 |
cardinality | object | The cardinality (unique values) forlabels, where the object key is the name of the label and the value is the maximum amount of different values it may have. | null |
labels | Labels | A Labels object that contains custom label definitions. | null |
Example:
importlokifrom'k6/x/loki';letconf=loki.Config("localhost:3100");
The classLabels
allows the definition of custom labels that can be usedinstead of the built-in labels. An instance of this class can be passed asfifth argument to theloki.Config
constructor.
argument | type | description | default |
---|---|---|---|
labels | object | An object of type string (label name) to list of strings (possibel label values). | - |
Example:
importlokifrom'k6/x/loki';letlabels=loki.Labels({"format":["json","logfmt"],// must contain at least one of the supported log formats"cluster":["prod-us-east-0","prod-eu-west-1"],"namespace":["dev","staging","prod"],"container":["nginx","app-1","app-2","app-3"]});
The classClient
is a Loki client that can read from and write to a Loki instance.The constructor takes the following arguments:
argument | type | description | default |
---|---|---|---|
config | object | An instance ofConfig which holds the configuration for the client. | - |
Example:
importlokifrom'k6/x/loki';letconf=loki.Config("localhost:3100");letclient=loki.Client(conf);
This function is a shortcut forclient.pushParameterized(5, 800*1024, 1024*1024)
.
Execute a push request (POST /loki/api/v1/push).
The functionpushParameterized
generates batch of logs and pushes it to the Loki instance.A batch consists of one or more streams which hold multiple log lines.A stream is a set of log lines with a unique set of labels.
argument | type | description | default |
---|---|---|---|
streams | integer | The amount of streams the pushed batch should contain. | - |
minSize | integer | Minimum size in bytes of the raw log lines of the batch. | - |
maxSize | integer | Maximum size in bytes of the raw log lines of the batch. | - |
minSize
andmaxSize
define the boundaries for a random value of the actual batch size.
This function is a shortcut forclient.instantQueryAt(query, limit, time.Now())
wheretime.Now()
is the current nanosecond.
Execute an instant query (GET /loki/api/v1/query).
argument | type | description | default |
---|---|---|---|
query | string | The LogQL query to perform. | - |
limit | integer | Maxiumum number of entries to return. | - |
instant | integer | Nanosecond at which to execute query. | - |
This function is a shortcut forclient.rangeQueryAt(query, duration, limit, time.Now())
wheretime.Now()
is the current nanosecond.
Execute a range query (GET /loki/api/v1/query_range).
argument | type | description | default |
---|---|---|---|
query | string | The LogQL query to perform. | - |
duration | string | The time span of the range, e.g.15m ,1h , or7d . | - |
limit | integer | Maxiumum number of entries to return. | - |
instant | integer | Nanosecond at which to execute query. | - |
duration
defines the range for the query and uses the current timestamp as end and current timestamp - duration as start.
This function is a shortcut forclient.labelsQueryAt(duration, time.Now())
wheretime.Now()
is the current nanosecond.
Execute a labels query (GET /loki/api/v1/labels).
argument | type | description | default |
---|---|---|---|
duration | string | The time span for which labels should be returned, e.g.15m ,1h , or7d . | - |
instant | integer | Nanosecond at which to execute query. | - |
duration
defines the range for the query and uses the current timestamp as end and current timestamp - duration as start.
This function is a shortcut forclient.labelValuesQueryAt(label, duration, time.Now())
wheretime.Now()
is the current nanosecond.
Execute a label values query (GET /loki/api/v1/label//values).
argument | type | description | default |
---|---|---|---|
label | string | The label name for which to query the values. | - |
duration | string | The time span for which label values should be returned, e.g.15m ,1h , or7d . | - |
instant | integer | Nanosecond at which to execute query. | - |
duration
defines the range for the query and uses the current timestamp as end and current timestamp - duration as start.
This function is a shortcut forclient.seriesQueryAt(matchers, duration, time.Now())
wheretime.Now()
is the current nanosecond.
Execute a series query (GET /loki/api/v1/series).
argument | type | description | default |
---|---|---|---|
matchers | list | A list of label matchers used for the query. | - |
duration | string | The time span for which the matching series should be returned, e.g.15m ,1h , or7d . | - |
instant | integer | Nanosecond at which to execute query. | - |
duration
defines the range for the query and uses the current timestamp as end and current timestamp - duration as start.
xk6-loki
uses the following built-in label names for generating streams:
name | values | notes |
---|---|---|
instance | fixed: 1 per k6 worker | |
format | fixed: apache_common, apache_combined, apache_error, rfc3164, rfc5424, json, logfmt | This label defines how the log lines of a stream are formatted. |
os | fixed: darwin, linux, windows | - |
namespace | variable | 1 |
app | variable | 1 |
pod | variable | 1 |
language | variable | 1 |
word | variable | 1 |
The total amount of different streams is defined by the carthesian product of all label values. Keep in mind that high cardinality impacts the performance of the Loki instance.
Additionally,xk6-loki
also supports custom labels that can be used insteadof the built-in labels.
Seeexamples/custom-labels.js for a full example with custom labels.
The extension collects metrics that are printed in theend-of-test summary in addition to the built-in metrics.
These metrics are collected only for instant and range queries.
name | description |
---|---|
loki_bytes_processed_per_second | amount of bytes processed by Loki per second |
loki_bytes_processed_total | total amount of bytes processed by Loki |
loki_lines_processed_per_second | amount of lines processed by Loki per second |
loki_lines_processed_total | total amount of lines processed by Loki |
name | description |
---|---|
loki_client_uncompressed_bytes | the quantity of uncompressed log data pushed to Loki, in bytes |
loki_client_lines | the number of log lines pushed to Loki |
importsleepfrom'k6';importlokifrom'k6/x/loki';/** * URL used for push and query requests * Path is automatically appended by the client *@constant {string} */constBASE_URL=`http://localhost:3100`;/** * Client timeout for read and write in milliseconds *@constant {number} */consttimeout=5000;/** * Ratio between Protobuf and JSON encoded payloads when pushing logs to Loki *@constant {number} */constratio=0.5;/** * Cardinality for labels *@constant {object} */constcardinality={"app":5,"namespace":5};/** * Execution options */exportconstoptions={vus:10,iterations:10,};/** * Create configuration object */constconf=newloki.Config(BASE_URL,timeout,ratio,cardinality);/** * Create Loki client */constclient=newloki.Client(conf);exportdefault()=>{// Push a batch of 2 streams with a payload size between 500KB and 1MBletres=client.pushParameterized(2,512*1024,1024*1024);// A successful push request returns HTTP status 204check(res,{'successful write':(res)=>res.status==204});sleep(1);}
./k6 run examples/simple.js
You can find more examples in theexamples/ folder.
Footnotes
About
k6 extension for Loki