import React, { PureComponent } from 'react'; import { shuffle } from 'lodash'; import { QueryEditorHelpProps, DataQuery } from '@grafana/data'; import LokiLanguageProvider from '../language_provider'; const DEFAULT_EXAMPLES = ['{job="default/prometheus"}']; const PREFERRED_LABELS = ['job', 'app', 'k8s_app']; const EXAMPLES_LIMIT = 5; const LOGQL_EXAMPLES = [ { title: 'Log pipeline', expression: '{job="mysql"} |= "metrics" | logfmt | duration > 10s', label: 'This query targets the MySQL job, filters out logs that don’t contain the word "metrics" and parses each log line to extract more labels and filters with them.', }, { title: 'Count over time', expression: 'count_over_time({job="mysql"}[5m])', label: 'This query counts all the log lines within the last five minutes for the MySQL job.', }, { title: 'Rate', expression: 'rate(({job="mysql"} |= "error" != "timeout")[10s])', label: 'This query gets the per-second rate of all non-timeout errors within the last ten seconds for the MySQL job.', }, { title: 'Aggregate, count, and group', expression: 'sum(count_over_time({job="mysql"}[5m])) by (level)', label: 'Get the count of logs during the last five minutes, grouping by level.', }, ]; export default class LokiCheatSheet extends PureComponent { userLabelTimer: NodeJS.Timeout; state = { userExamples: DEFAULT_EXAMPLES, }; componentDidMount() { this.scheduleUserLabelChecking(); } componentWillUnmount() { clearTimeout(this.userLabelTimer); } scheduleUserLabelChecking() { this.userLabelTimer = setTimeout(this.checkUserLabels, 1000); } checkUserLabels = async () => { // Set example from user labels const provider: LokiLanguageProvider = this.props.datasource?.languageProvider; if (provider.started) { const labels = provider.getLabelKeys() || []; const preferredLabel = PREFERRED_LABELS.find((l) => labels.includes(l)); if (preferredLabel) { const values = await provider.getLabelValues(preferredLabel); const userExamples = shuffle(values) .slice(0, EXAMPLES_LIMIT) .map((value) => `{${preferredLabel}="${value}"}`); this.setState({ userExamples }); } } else { this.scheduleUserLabelChecking(); } }; renderExpression(expr: string) { const { onClickExample } = this.props; return (
onClickExample({ refId: 'A', expr } as DataQuery)} > {expr}
); } render() { const { userExamples } = this.state; return (

Loki Cheat Sheet

See your logs
Start by selecting a log stream from the Log labels selector.
Alternatively, you can write a stream selector into the query field:
{this.renderExpression('{job="default/prometheus"}')} {userExamples !== DEFAULT_EXAMPLES && userExamples.length > 0 ? (
Here are some example streams from your logs:
{userExamples.map((example) => this.renderExpression(example))}
) : null}
Combine stream selectors
{this.renderExpression('{app="cassandra",namespace="prod"}')}
Returns all log lines from streams that have both labels.
Filtering for search terms.
{this.renderExpression('{app="cassandra"} |~ "(duration|latency)s*(=|is|of)s*[d.]+"')} {this.renderExpression('{app="cassandra"} |= "exact match"')} {this.renderExpression('{app="cassandra"} != "do not match"')}
LogQL {' '} supports exact and regular expression filters.
{LOGQL_EXAMPLES.map((item) => (
{item.title}
{this.renderExpression(item.expression)}
{item.label}
))}
); } }