Like Prometheus, but for logs.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
loki/production/loki-mixin/dashboards/loki-reads.libsonnet

136 lines
7.3 KiB

local utils = import 'mixin-utils/utils.libsonnet';
(import 'dashboard-utils.libsonnet') {
grafanaDashboards+: {
local dashboards = self,
local http_routes = 'loki_api_v1_series|api_prom_series|api_prom_query|api_prom_label|api_prom_label_name_values|loki_api_v1_query|loki_api_v1_query_range|loki_api_v1_labels|loki_api_v1_label_name_values',
local grpc_routes = '/logproto.Querier/Query|/logproto.Querier/Label|/logproto.Querier/Series|/logproto.Querier/QuerySample|/logproto.Querier/GetChunkIDs',
'loki-reads.json': {
local cfg = self,
showMultiCluster:: true,
clusterLabel:: 'cluster',
clusterMatchers::
if cfg.showMultiCluster then
[utils.selector.re(cfg.clusterLabel, '$cluster')]
else
[],
matchers:: {
cortexgateway: [utils.selector.re('job', '($namespace)/cortex-gw')],
queryFrontend: [utils.selector.re('job', '($namespace)/query-frontend')],
querier: [utils.selector.re('job', '($namespace)/querier')],
ingester: [utils.selector.re('job', '($namespace)/ingester')],
querierOrIndexGateway: [utils.selector.re('job', '($namespace)/(querier|index-gateway)')],
},
local selector(matcherId) =
local ms = (cfg.clusterMatchers + cfg.matchers[matcherId]);
if std.length(ms) > 0 then
std.join(',', ['%(label)s%(op)s"%(value)s"' % matcher for matcher in ms]) + ','
else '',
cortexGwSelector:: selector('cortexgateway'),
queryFrontendSelector:: selector('queryFrontend'),
querierSelector:: selector('querier'),
ingesterSelector:: selector('ingester'),
querierOrIndexGatewaySelector:: selector('querierOrIndexGateway'),
} +
$.dashboard('Loki / Reads', uid='reads')
.addCluster()
.addNamespace()
.addTag()
.addRow(
$.row('Frontend (cortex_gw)')
.addPanel(
$.panel('QPS') +
$.qpsPanel('loki_request_duration_seconds_count{%s route=~"%s"}' % [dashboards['loki-reads.json'].cortexGwSelector, http_routes])
)
.addPanel(
$.panel('Latency') +
utils.latencyRecordingRulePanel(
'loki_request_duration_seconds',
dashboards['loki-reads.json'].matchers.cortexgateway + [utils.selector.re('route', http_routes)],
extra_selectors=dashboards['loki-reads.json'].clusterMatchers,
sum_by=['route']
)
)
)
.addRow(
$.row('Frontend (query-frontend)')
.addPanel(
$.panel('QPS') +
$.qpsPanel('loki_request_duration_seconds_count{%s route=~"%s"}' % [dashboards['loki-reads.json'].queryFrontendSelector, http_routes])
)
.addPanel(
$.panel('Latency') +
utils.latencyRecordingRulePanel(
'loki_request_duration_seconds',
dashboards['loki-reads.json'].matchers.queryFrontend + [utils.selector.re('route', http_routes)],
extra_selectors=dashboards['loki-reads.json'].clusterMatchers,
sum_by=['route']
)
)
)
.addRow(
$.row('Querier')
.addPanel(
$.panel('QPS') +
$.qpsPanel('loki_request_duration_seconds_count{%s route=~"%s"}' % [dashboards['loki-reads.json'].querierSelector, http_routes])
)
.addPanel(
$.panel('Latency') +
utils.latencyRecordingRulePanel(
'loki_request_duration_seconds',
dashboards['loki-reads.json'].matchers.querier + [utils.selector.re('route', http_routes)],
extra_selectors=dashboards['loki-reads.json'].clusterMatchers,
sum_by=['route']
)
)
)
.addRow(
$.row('Ingester')
.addPanel(
$.panel('QPS') +
$.qpsPanel('loki_request_duration_seconds_count{%s route=~"%s"}' % [dashboards['loki-reads.json'].ingesterSelector, grpc_routes])
)
.addPanel(
$.panel('Latency') +
utils.latencyRecordingRulePanel(
'loki_request_duration_seconds',
dashboards['loki-reads.json'].matchers.ingester + [utils.selector.re('route', grpc_routes)],
extra_selectors=dashboards['loki-reads.json'].clusterMatchers,
sum_by=['route']
)
)
)
.addRow(
$.row('BigTable')
.addPanel(
$.panel('QPS') +
$.qpsPanel('loki_bigtable_request_duration_seconds_count{%s operation="/google.bigtable.v2.Bigtable/ReadRows"}' % dashboards['loki-reads.json'].querierSelector)
)
.addPanel(
$.panel('Latency') +
utils.latencyRecordingRulePanel(
'loki_bigtable_request_duration_seconds',
dashboards['loki-reads.json'].matchers.querier + [utils.selector.eq('operation', '/google.bigtable.v2.Bigtable/ReadRows')]
)
)
)
.addRow(
$.row('BoltDB Shipper')
.addPanel(
$.panel('QPS') +
$.qpsPanel('loki_boltdb_shipper_request_duration_seconds_count{%s operation="Shipper.Query"}' % dashboards['loki-reads.json'].querierOrIndexGatewaySelector)
)
.addPanel(
$.panel('Latency') +
$.latencyPanel('loki_boltdb_shipper_request_duration_seconds', '{%s operation="Shipper.Query"}' % dashboards['loki-reads.json'].querierOrIndexGatewaySelector)
)
),
},
}