From f720dc90ecf2d15eedf105498f37c8898b2c06d5 Mon Sep 17 00:00:00 2001 From: Karen Miller Date: Mon, 12 Jul 2021 16:35:16 -0700 Subject: [PATCH 1/2] Revise portions of the docs LogQL section --- docs/sources/logql/_index.md | 214 +++++++++++++++--------- docs/sources/logql/query_components.png | Bin 0 -> 11389 bytes 2 files changed, 139 insertions(+), 75 deletions(-) create mode 100644 docs/sources/logql/query_components.png diff --git a/docs/sources/logql/_index.md b/docs/sources/logql/_index.md index fd29dd9ad11e1..a851a3729ebab 100644 --- a/docs/sources/logql/_index.md +++ b/docs/sources/logql/_index.md @@ -4,29 +4,27 @@ weight: 700 --- # LogQL: Log Query Language -Loki comes with its own PromQL-inspired language for queries called *LogQL*. -LogQL can be considered a distributed `grep` that aggregates log sources. +LogQL is Loki's PromQL-inspired query language. +Queries act as if they are a distributed `grep` to aggregate log sources. LogQL uses labels and operators for filtering. There are two types of LogQL queries: - *Log queries* return the contents of log lines. -- *Metric queries* extend log queries and calculate sample values based on the content of logs from a log query. +- *Metric queries* extend log queries to calculate values +based on query results. ## Log Queries -A basic log query consists of two parts: +All LogQL queries contain a **log stream selector**. -- **log stream selector** -- **log pipeline** - -Due to Loki's design, all LogQL queries must contain a **log stream selector**. +![parts of a query](query_components.png) The log stream selector determines how many log streams (unique sources of log content, such as files) will be searched. A more granular log stream selector then reduces the number of searched streams to a manageable volume. This means that the labels passed to the log stream selector will affect the relative performance of the query's execution. -**Optionally** the log stream selector can be followed by a **log pipeline**. A log pipeline is a set of stage expressions chained together and applied to the selected log streams. Each expressions can filter out, parse and mutate log lines and their respective labels. +Optionally, the log stream selector can be followed by a **log pipeline**. A log pipeline is a set of stage expressions that are chained together and applied to the selected log streams. Each expression can filter out, parse, or mutate log lines and their respective labels. The following example shows a full log query in action: @@ -45,95 +43,153 @@ This is specially useful when writing a regular expression which contains multip ### Log Stream Selector -The log stream selector determines which log streams should be included in your query results. -The stream selector is comprised of one or more key-value pairs, where each key is a **log label** and each value is that **label's value**. +The stream selector determines which log streams to include in a query's results. +The stream selector is specified by one or more comma-separated key-value pairs. Each key is a log label and each value is that label's value. +Curly braces (`{` and `}`) delimit the stream selector. -The log stream selector is written by wrapping the key-value pairs in a pair of curly braces: +Consider this stream selector: ```logql {app="mysql",name="mysql-backup"} ``` -In this example, all log streams that have a label of `app` whose value is `mysql` _and_ a label of `name` whose value is `mysql-backup` will be included in the query results. -Note that this will match any log stream whose labels _at least_ contain `mysql-backup` for their name label; -if there are multiple streams that contain that label, logs from all of the matching streams will be shown in the results. +All log streams that have both a label of `app` whose value is `mysql` +and a label of `name` whose value is `mysql-backup` will be included in +the query results. +A stream may contain other pairs of labels and values, +but only the specified pairs within the stream selector are used to determine +which streams will be included within the query results. + +The same rules that apply for [Prometheus Label Selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#instant-vector-selectors) apply for Loki log stream selectors. The `=` operator after the label name is a **label matching operator**. The following label matching operators are supported: -- `=`: exactly equal. -- `!=`: not equal. -- `=~`: regex matches. -- `!~`: regex does not match. - -Examples: - -- `{name=~"mysql.+"}` -- `{name!~"mysql.+"}` -- `` {name!~`mysql-\d+`} `` - -The same rules that apply for [Prometheus Label Selectors](https://prometheus.io/docs/prometheus/latest/querying/basics/#instant-vector-selectors) apply for Loki log stream selectors. +- `=`: exactly equal +- `!=`: not equal +- `=~`: regex matches +- `!~`: regex does not match -**Important note:** The `=~` regex operator is fully anchored, meaning regex must match against the *entire* string, including newlines. The regex `.` character does not match newlines by default. If you want the regex dot character to match newlines you can use the single-line flag, like so: `(?s)search_term.+` matches `search_term\n`. +Regex log stream examples: -#### Offset modifier -The offset modifier allows changing the time offset for individual range vectors in a query. +- `{name =~ "mysql.+"}` +- `{name !~ "mysql.+"}` +- `` {name !~ `mysql-\d+`} `` -For example, the following expression counts all the logs within the last ten minutes to five minutes rather than last five minutes for the MySQL job. Note that the `offset` modifier always needs to follow the range vector selector immediately. -```logql -count_over_time({job="mysql"}[5m] offset 5m) // GOOD -count_over_time({job="mysql"}[5m]) offset 5m // INVALID -``` +**Note:** The `=~` regex operator is fully anchored, meaning regex must match against the *entire* string, including newlines. The regex `.` character does not match newlines by default. If you want the regex dot character to match newlines you can use the single-line flag, like so: `(?s)search_term.+` matches `search_term\n`. ### Log Pipeline A log pipeline can be appended to a log stream selector to further process and filter log streams. It usually is composed of one or multiple expressions, each expressions is executed in sequence for each log line. If an expression filters out a log line, the pipeline will stop at this point and start processing the next line. -Some expressions can mutate the log content and respective labels (e.g `| line_format "{{.status_code}}"`), which will be then available for further filtering and processing following expressions or metric queries. +Some expressions can mutate the log content and respective labels. +For example, + +``` +| line_format "{{.status_code}}"`) +``` + +will be available for further filtering and processing following expressions or metric queries. A log pipeline can be composed of: -- [Line Filter Expression](#line-filter-expression). +- [Line Filter Expression](#line-filter-expression) - [Parser Expression](#parser-expression) - [Label Filter Expression](#label-filter-expression) - [Line Format Expression](#line-format-expression) - [Labels Format Expression](#labels-format-expression) -- [Unwrap Expression](#unwrapped-range-aggregations) - -The [unwrap Expression](#unwrapped-range-aggregations) is a special expression that should only be used within metric queries. +- [Unwrap Expression](#unwrapped-range-aggregations). An unwrapped expression is only used within metric queries. #### Line Filter Expression -The line filter expression is used to do a distributed `grep` over the aggregated logs from the matching log streams. +The line filter expression does a distributed `grep` +over the aggregated logs from the matching log streams. +It searches the contents of the log line, +discarding those lines that do not match the case sensitive expression. + +Each line filter expression has a **filter operator** +followed by text or a regular expression. +These filter operators are supported: -After writing the log stream selector, the resulting set of logs can be further filtered with a search expression. -The search expression can be just text or regex: +- `|=`: Log line contains string +- `!=`: Log line does not contain string +- `|~`: Log line contains a match to the regular expression +- `!~`: Log line does not contain a match to the regular expression -- `{job="mysql"} |= "error"` -- `{name="kafka"} |~ "tsdb-ops.*io:2003"` -- `` {name="cassandra"} |~ `error=\w+` `` -- `{instance=~"kafka-[23]",name="kafka"} != "kafka.server:type=ReplicaManager"` +Line filter expression examples: -In the previous examples, `|=`, `|~`, and `!=` act as **filter operators**. -The following filter operators are supported: +- Keep log lines that have the substring "error": -- `|=`: Log line contains string. -- `!=`: Log line does not contain string. -- `|~`: Log line matches regular expression. -- `!~`: Log line does not match regular expression. + ``` + |= "error" + ``` -Filter operators can be chained and will sequentially filter down the expression - resulting log lines must satisfy _every_ filter: + A complete query using this example: + + ``` + {job="mysql"} |= "error" + ``` + +- Discard log lines that have the substring "kafka.server:type=ReplicaManager": + + ``` + != "kafka.server:type=ReplicaManager" + ``` + + A complete query using this example: + + ``` + {instance=~"kafka-[23]",name="kafka"} != "kafka.server:type=ReplicaManager" + ``` + +- Keep log lines that contain a substring that starts with `tsdb-ops` and ends with `io:2003`. A complete query with a regular expression: + + ``` + {name="kafka"} |~ "tsdb-ops.*io:2003" + ``` + +- Keep log lines that contain a substring that starts with `error=`, +and is followed by 1 or more word characters. A complete query with a regular expression: + + ``` + {name="cassandra"} |~ `error=\w+` + ``` + +Filter operators can be chained. +Filters are applied sequentially. +Query results will have satisfied every filter. +This complete query example will give results that include the string `error`, +and do not include the string `timeout`. ```logql {job="mysql"} |= "error" != "timeout" ``` When using `|~` and `!~`, Go (as in [Golang](https://golang.org/)) [RE2 syntax](https://github.com/google/re2/wiki/Syntax) regex may be used. -The matching is case-sensitive by default and can be switched to case-insensitive prefixing the regex with `(?i)`. +The matching is case-sensitive by default. +Switch to case-insensitive matching by prefixing the regular expression +with `(?i)`. + +While line filter expressions could be placed anywhere within a log pipeline, +it is almost always better to have them at the beginning. +Placing them at the beginning improves the performance of the query, +as it only does further processing when a line matches. +For example, + while the results will be the same, +the query specified with + +``` +{job="mysql"} |= "error" | json | line_format "{{.err}}" +``` -While line filter expressions could be placed anywhere in a pipeline, it is almost always better to have them at the beginning. This ways it will improve the performance of the query doing further processing only when a line matches. +will always run faster than -For example, while the result will be the same, the following query `{job="mysql"} |= "error" | json | line_format "{{.err}}"` will always run faster than `{job="mysql"} | json | line_format "{{.message}}" |= "error"`. Line filter expressions are the fastest way to filter logs after log stream selectors. +``` +{job="mysql"} | json | line_format "{{.message}}" |= "error" +``` + +Line filter expressions are the fastest way to filter logs once the +log stream selectors have been applied. #### Parser Expression @@ -159,7 +215,7 @@ Loki supports [JSON](#json), [logfmt](#logfmt), [pattern](#pattern), [regexp](# It's easier to use the predefined parsers `json` and `logfmt` when you can. If you can't, the `pattern` and `regexp` parsers can be used for log lines with an unusual structure. The `pattern` parser is easier and faster to write; it also outperforms the `regexp` parser. Multiple parsers can be used by a single log pipeline. This is useful for parsing complex logs. There are examples in [Multiple parsers](#multiple-parsers). -##### Json +##### JSON The **json** parser operates in two modes: @@ -531,24 +587,32 @@ The result would be: ## Metric Queries -LogQL also supports wrapping a log query with functions that allow for creating metrics out of the logs. +LogQL supports applying a function to log query results. +This powerful feature creates metrics from logs. Metric queries can be used to calculate things such as the rate of error messages, or the top N log sources with the most amount of logs over the last 3 hours. -Combined with log [parsers](#parser-expression), metrics queries can also be used to calculate metrics from a sample value within the log line such latency or request size. -Furthermore all labels, including extracted ones, will be available for aggregations and generation of new series. +Combined with log parsers, metrics queries can also be used to calculate metrics from a sample value within the log line, such as latency or request size. +All labels, including extracted ones, will be available for aggregations and generation of new series. ### Range Vector aggregation -LogQL shares the same [range vector](https://prometheus.io/docs/prometheus/latest/querying/basics/#range-vector-selectors) concept from Prometheus, except the selected range of samples is a range of selected log or label values. +LogQL shares the [range vector](https://prometheus.io/docs/prometheus/latest/querying/basics/#range-vector-selectors) concept of Prometheus. +In Loki, the selected range of samples is a range of selected log or label values. + +The aggregation is applied over a time duration. +Loki defines [Time Durations](https://prometheus.io/docs/prometheus/latest/querying/basics/#time-durations) with the same syntax as Prometheus. -Loki supports two types of range aggregations. Log range and unwrapped range aggregations. +Loki supports two types of range vector aggregations: log range aggregations and unwrapped range aggregations. #### Log Range Aggregations -A log range is a log query (with or without a log pipeline) followed by the range notation e.g [1m]. It should be noted that the range notation `[5m]` can be placed at end of the log pipeline or right after the log stream matcher. +A log range aggregation is a query followed by a duration. +A function is applied to aggregate the query over the duration. +The duration can be placed +after the log stream selector or at end of the log pipeline. -The first type uses log entries to compute values and supported functions for operating over are: +The functions: - `rate(log-range)`: calculates the number of entries per second - `count_over_time(log-range)`: counts the entries for each log stream within the given range. @@ -556,20 +620,20 @@ The first type uses log entries to compute values and supported functions for op - `bytes_over_time(log-range)`: counts the amount of bytes used by each log stream for a given range. - `absent_over_time(log-range)`: returns an empty vector if the range vector passed to it has any elements and a 1-element vector with the value 1 if the range vector passed to it has no elements. (`absent_over_time` is useful for alerting on when no time series and logs stream exist for label combination for a certain amount of time.) -##### Log Examples +Examples: -```logql -count_over_time({job="mysql"}[5m]) -``` +- Count all the log lines within the last five minutes for the MySQL job. -This example counts all the log lines within the last five minutes for the MySQL job. + ```logql + count_over_time({job="mysql"}[5m]) + ``` -```logql -sum by (host) (rate({job="mysql"} |= "error" != "timeout" | json | duration > 10s [1m])) -``` +- This aggregation includes filters and parsers. + It returns the per-second rate of all non-timeout errors within the last minutes per host for the MySQL job and only includes errors whose duration is above ten seconds. -This example demonstrates a LogQL aggregation which includes filters and parsers. -It returns the per-second rate of all non-timeout errors within the last minutes per host for the MySQL job and only includes errors whose duration is above ten seconds. + ```logql + sum by (host) (rate({job="mysql"} |= "error" != "timeout" | json | duration > 10s [1m])) + ``` #### Unwrapped Range Aggregations diff --git a/docs/sources/logql/query_components.png b/docs/sources/logql/query_components.png new file mode 100644 index 0000000000000000000000000000000000000000..3f4d6704d2e4c922290ee3b005702f4e0a4600a7 GIT binary patch literal 11389 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 Date: Wed, 21 Jul 2021 11:34:05 -0700 Subject: [PATCH 2/2] Update query diagram per review request --- docs/sources/logql/query_components.png | Bin 11389 -> 20160 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/sources/logql/query_components.png b/docs/sources/logql/query_components.png index 3f4d6704d2e4c922290ee3b005702f4e0a4600a7..1defab9a95dbd9894bdd3bec0def3cc8f140d0f0 100644 GIT binary patch literal 20160 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