github.com/yankunsam/loki/v2@v2.6.3-0.20220817130409-389df5235c27/production/loki-mixin/dashboards/loki-reads.libsonnet (about) 1 local utils = import 'mixin-utils/utils.libsonnet'; 2 3 (import 'dashboard-utils.libsonnet') { 4 grafanaDashboards+: { 5 local dashboards = self, 6 local showBigTable = false, 7 8 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', 9 local grpc_routes = '/logproto.Querier/Query|/logproto.Querier/Label|/logproto.Querier/Series|/logproto.Querier/QuerySample|/logproto.Querier/GetChunkIDs', 10 11 'loki-reads.json': { 12 local cfg = self, 13 14 showMultiCluster:: true, 15 clusterLabel:: $._config.per_cluster_label, 16 clusterMatchers:: 17 if cfg.showMultiCluster then 18 [utils.selector.re(cfg.clusterLabel, '$cluster')] 19 else 20 [], 21 22 matchers:: { 23 cortexgateway: [utils.selector.re('job', '($namespace)/cortex-gw')], 24 queryFrontend: [utils.selector.re('job', '($namespace)/%s' % (if $._config.ssd.enabled then '%s-read' % $._config.ssd.pod_prefix_matcher else 'query-frontend'))], 25 querier: [utils.selector.re('job', '($namespace)/%s' % (if $._config.ssd.enabled then '%s-write' % $._config.ssd.pod_prefix_matcher else 'querier'))], 26 ingester: [utils.selector.re('job', '($namespace)/%s' % (if $._config.ssd.enabled then '%s-write' % $._config.ssd.pod_prefix_matcher else 'ingester'))], 27 querierOrIndexGateway: [utils.selector.re('job', '($namespace)/%s' % (if $._config.ssd.enabled then '%s-read' % $._config.ssd.pod_prefix_matcher else '(querier|index-gateway)'))], 28 }, 29 30 local selector(matcherId) = 31 local ms = (cfg.clusterMatchers + cfg.matchers[matcherId]); 32 if std.length(ms) > 0 then 33 std.join(',', ['%(label)s%(op)s"%(value)s"' % matcher for matcher in ms]) + ',' 34 else '', 35 36 cortexGwSelector:: selector('cortexgateway'), 37 queryFrontendSelector:: selector('queryFrontend'), 38 querierSelector:: selector('querier'), 39 ingesterSelector:: selector('ingester'), 40 querierOrIndexGatewaySelector:: selector('querierOrIndexGateway'), 41 } + 42 $.dashboard('Loki / Reads', uid='reads') 43 .addCluster() 44 .addNamespace() 45 .addTag() 46 .addRowIf( 47 $._config.internal_components, 48 $.row('Frontend (cortex_gw)') 49 .addPanel( 50 $.panel('QPS') + 51 $.qpsPanel('loki_request_duration_seconds_count{%s route=~"%s"}' % [dashboards['loki-reads.json'].cortexGwSelector, http_routes]) 52 ) 53 .addPanel( 54 $.panel('Latency') + 55 utils.latencyRecordingRulePanel( 56 'loki_request_duration_seconds', 57 dashboards['loki-reads.json'].matchers.cortexgateway + [utils.selector.re('route', http_routes)], 58 extra_selectors=dashboards['loki-reads.json'].clusterMatchers, 59 sum_by=['route'] 60 ) 61 ) 62 ) 63 .addRow( 64 $.row(if $._config.ssd.enabled then 'Read Path' else 'Frontend (query-frontend)') 65 .addPanel( 66 $.panel('QPS') + 67 $.qpsPanel('loki_request_duration_seconds_count{%s route=~"%s"}' % [dashboards['loki-reads.json'].queryFrontendSelector, http_routes]) 68 ) 69 .addPanel( 70 $.panel('Latency') + 71 utils.latencyRecordingRulePanel( 72 'loki_request_duration_seconds', 73 dashboards['loki-reads.json'].matchers.queryFrontend + [utils.selector.re('route', http_routes)], 74 extra_selectors=dashboards['loki-reads.json'].clusterMatchers, 75 sum_by=['route'] 76 ) 77 ) 78 ) 79 .addRowIf( 80 !$._config.ssd.enabled, 81 $.row('Querier') 82 .addPanel( 83 $.panel('QPS') + 84 $.qpsPanel('loki_request_duration_seconds_count{%s route=~"%s"}' % [dashboards['loki-reads.json'].querierSelector, http_routes]) 85 ) 86 .addPanel( 87 $.panel('Latency') + 88 utils.latencyRecordingRulePanel( 89 'loki_request_duration_seconds', 90 dashboards['loki-reads.json'].matchers.querier + [utils.selector.re('route', http_routes)], 91 extra_selectors=dashboards['loki-reads.json'].clusterMatchers, 92 sum_by=['route'] 93 ) 94 ) 95 ) 96 .addRowIf( 97 !$._config.ssd.enabled, 98 $.row('Ingester') 99 .addPanel( 100 $.panel('QPS') + 101 $.qpsPanel('loki_request_duration_seconds_count{%s route=~"%s"}' % [dashboards['loki-reads.json'].ingesterSelector, grpc_routes]) 102 ) 103 .addPanel( 104 $.panel('Latency') + 105 utils.latencyRecordingRulePanel( 106 'loki_request_duration_seconds', 107 dashboards['loki-reads.json'].matchers.ingester + [utils.selector.re('route', grpc_routes)], 108 extra_selectors=dashboards['loki-reads.json'].clusterMatchers, 109 sum_by=['route'] 110 ) 111 ) 112 ) 113 .addRowIf( 114 showBigTable, 115 $.row('BigTable') 116 .addPanel( 117 $.panel('QPS') + 118 $.qpsPanel('loki_bigtable_request_duration_seconds_count{%s operation="/google.bigtable.v2.Bigtable/ReadRows"}' % dashboards['loki-reads.json'].querierSelector) 119 ) 120 .addPanel( 121 $.panel('Latency') + 122 utils.latencyRecordingRulePanel( 123 'loki_bigtable_request_duration_seconds', 124 dashboards['loki-reads.json'].matchers.querier + [utils.selector.eq('operation', '/google.bigtable.v2.Bigtable/ReadRows')] 125 ) 126 ) 127 ) 128 .addRow( 129 $.row('BoltDB Shipper') 130 .addPanel( 131 $.panel('QPS') + 132 $.qpsPanel('loki_boltdb_shipper_request_duration_seconds_count{%s operation="Shipper.Query"}' % dashboards['loki-reads.json'].querierOrIndexGatewaySelector) 133 ) 134 .addPanel( 135 $.panel('Latency') + 136 $.latencyPanel('loki_boltdb_shipper_request_duration_seconds', '{%s operation="Shipper.Query"}' % dashboards['loki-reads.json'].querierOrIndexGatewaySelector) 137 ) 138 ), 139 }, 140 }