import { shuffle } from 'lodash'; import React, { PureComponent } from 'react'; import { QueryEditorHelpProps } from '@grafana/data'; import { reportInteraction } from '@grafana/runtime'; import LokiLanguageProvider from '../language_provider'; import { LokiQuery } from '../types'; 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, { userExamples: string[] }> { declare userLabelTimer: NodeJS.Timeout; state = { userExamples: [], }; componentDidMount() { this.scheduleUserLabelChecking(); reportInteraction('grafana_loki_cheatsheet_opened', {}); } 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; const onClick = (query: LokiQuery) => { onClickExample(query); reportInteraction('grafana_loki_cheatsheet_example_clicked', {}); }; return (
onClick({ refId: 'A', expr })}> {expr}
); } render() { const { userExamples } = this.state; const hasUserExamples = userExamples.length > 0; return (

Loki Cheat Sheet

See your logs
Start by selecting a log stream from the Log browser, or alternatively you can write a stream selector into the query field.
{hasUserExamples ? (
Here are some example streams from your logs:
{userExamples.map((example) => this.renderExpression(example))}
) : (
Here is an example of a log stream:
{this.renderExpression(DEFAULT_EXAMPLES[0])}
)}
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}
))}
); } }