- Notifications
You must be signed in to change notification settings - Fork21
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
Topics
Resources
License
Code of conduct
Security policy
Uh oh!
There was an error while loading.Please reload this page.
Stars
Watchers
Forks
Packages0
Uh oh!
There was an error while loading.Please reload this page.
Contributors11
Uh oh!
There was an error while loading.Please reload this page.