@ -2,10 +2,10 @@ local g = import 'grafana-builder/grafana.libsonnet';
{
dashboards+: {
'tempo -writes.json':
g.dashboard('Tempo / Writes')
.addTemplate('cluster', 'kube_pod_container_info{image=~".*tempo .*"}', 'cluster')
.addTemplate('namespace', 'kube_pod_container_info{image=~".*tempo .*"}', 'namespace')
'loki -writes.json':
g.dashboard('Loki / Writes')
.addTemplate('cluster', 'kube_pod_container_info{image=~".*loki .*"}', 'cluster')
.addTemplate('namespace', 'kube_pod_container_info{image=~".*loki .*"}', 'namespace')
.addRow(
g.row('Frontend (cortex_gw)')
.addPanel(
@ -21,29 +21,29 @@ local g = import 'grafana-builder/grafana.libsonnet';
g.row('Distributor')
.addPanel(
g.panel('QPS') +
g.qpsPanel('tempo _request_duration_seconds_count{cluster="$cluster", job="$namespace/distributor", route="api_prom_push"}')
g.qpsPanel('loki _request_duration_seconds_count{cluster="$cluster", job="$namespace/distributor", route="api_prom_push"}')
)
.addPanel(
g.panel('Latency') +
g.latencyRecordingRulePanel('tempo _request_duration_seconds', [g.selector.eq('job', '$namespace/distributor'), g.selector.eq('route', 'api_prom_push')], extra_selectors=[g.selector.eq('cluster', '$cluster')])
g.latencyRecordingRulePanel('loki _request_duration_seconds', [g.selector.eq('job', '$namespace/distributor'), g.selector.eq('route', 'api_prom_push')], extra_selectors=[g.selector.eq('cluster', '$cluster')])
)
)
.addRow(
g.row('Ingester')
.addPanel(
g.panel('QPS') +
g.qpsPanel('tempo _request_duration_seconds_count{cluster="$cluster", job="$namespace/ingester",route="/logproto.Pusher/Push"}')
g.qpsPanel('loki _request_duration_seconds_count{cluster="$cluster", job="$namespace/ingester",route="/logproto.Pusher/Push"}')
)
.addPanel(
g.panel('Latency') +
g.latencyRecordingRulePanel('tempo _request_duration_seconds', [g.selector.eq('job', '$namespace/ingester'), g.selector.eq('route', '/logproto.Pusher/Push')], extra_selectors=[g.selector.eq('cluster', '$cluster')])
g.latencyRecordingRulePanel('loki _request_duration_seconds', [g.selector.eq('job', '$namespace/ingester'), g.selector.eq('route', '/logproto.Pusher/Push')], extra_selectors=[g.selector.eq('cluster', '$cluster')])
)
),
'tempo -reads.json':
g.dashboard('tempo / Reads')
.addTemplate('cluster', 'kube_pod_container_info{image=~".*tempo .*"}', 'cluster')
.addTemplate('namespace', 'kube_pod_container_info{image=~".*tempo .*"}', 'namespace')
'loki -reads.json':
g.dashboard('loki / Reads')
.addTemplate('cluster', 'kube_pod_container_info{image=~".*loki .*"}', 'cluster')
.addTemplate('namespace', 'kube_pod_container_info{image=~".*loki .*"}', 'namespace')
.addRow(
g.row('Frontend (cortex_gw)')
.addPanel(
@ -59,83 +59,83 @@ local g = import 'grafana-builder/grafana.libsonnet';
g.row('Querier')
.addPanel(
g.panel('QPS') +
g.qpsPanel('tempo _request_duration_seconds_count{cluster="$cluster", job="$namespace/querier"}')
g.qpsPanel('loki _request_duration_seconds_count{cluster="$cluster", job="$namespace/querier"}')
)
.addPanel(
g.panel('Latency') +
g.latencyRecordingRulePanel('tempo _request_duration_seconds', [g.selector.eq('job', '$namespace/querier')], extra_selectors=[g.selector.eq('cluster', '$cluster')])
g.latencyRecordingRulePanel('loki _request_duration_seconds', [g.selector.eq('job', '$namespace/querier')], extra_selectors=[g.selector.eq('cluster', '$cluster')])
)
)
.addRow(
g.row('Ingester')
.addPanel(
g.panel('QPS') +
g.qpsPanel('tempo _request_duration_seconds_count{cluster="$cluster", job="$namespace/ingester",route!~"/logproto.Pusher/Push|metrics|ready|traces"}')
g.qpsPanel('loki _request_duration_seconds_count{cluster="$cluster", job="$namespace/ingester",route!~"/logproto.Pusher/Push|metrics|ready|traces"}')
)
.addPanel(
g.panel('Latency') +
g.latencyRecordingRulePanel('tempo _request_duration_seconds', [g.selector.eq('job', '$namespace/ingester'), g.selector.nre('route', '/logproto.Pusher/Push|metrics|ready')], extra_selectors=[g.selector.eq('cluster', '$cluster')])
g.latencyRecordingRulePanel('loki _request_duration_seconds', [g.selector.eq('job', '$namespace/ingester'), g.selector.nre('route', '/logproto.Pusher/Push|metrics|ready')], extra_selectors=[g.selector.eq('cluster', '$cluster')])
)
),
'tempo -chunks.json':
g.dashboard('Tempo / Chunks')
.addTemplate('cluster', 'kube_pod_container_info{image=~".*tempo .*"}', 'cluster')
.addTemplate('namespace', 'kube_pod_container_info{image=~".*tempo .*"}', 'namespace')
'loki -chunks.json':
g.dashboard('Loki / Chunks')
.addTemplate('cluster', 'kube_pod_container_info{image=~".*loki .*"}', 'cluster')
.addTemplate('namespace', 'kube_pod_container_info{image=~".*loki .*"}', 'namespace')
.addRow(
g.row('Active Series / Chunks')
.addPanel(
g.panel('Series') +
g.queryPanel('sum(tempo _ingester_memory_chunks{cluster="$cluster", job="$namespace/ingester"})', 'series'),
g.queryPanel('sum(loki _ingester_memory_chunks{cluster="$cluster", job="$namespace/ingester"})', 'series'),
)
.addPanel(
g.panel('Chunks per series') +
g.queryPanel('sum(tempo_ingester_memory_chunks{cluster="$cluster", job="$namespace/ingester"}) / sum(tempo _ingester_memory_series{job="$namespace/ingester"})', 'chunks'),
g.queryPanel('sum(loki_ingester_memory_chunks{cluster="$cluster", job="$namespace/ingester"}) / sum(loki _ingester_memory_series{job="$namespace/ingester"})', 'chunks'),
)
)
.addRow(
g.row('Flush Stats')
.addPanel(
g.panel('Utilization') +
g.latencyPanel('tempo _ingester_chunk_utilization', '{cluster="$cluster", job="$namespace/ingester"}', multiplier='1') +
g.latencyPanel('loki _ingester_chunk_utilization', '{cluster="$cluster", job="$namespace/ingester"}', multiplier='1') +
{ yaxes: g.yaxes('percentunit') },
)
.addPanel(
g.panel('Age') +
g.latencyPanel('tempo _ingester_chunk_age_seconds', '{cluster="$cluster", job="$namespace/ingester"}'),
g.latencyPanel('loki _ingester_chunk_age_seconds', '{cluster="$cluster", job="$namespace/ingester"}'),
),
)
.addRow(
g.row('Flush Stats')
.addPanel(
g.panel('Size') +
g.latencyPanel('tempo _ingester_chunk_length', '{cluster="$cluster", job="$namespace/ingester"}', multiplier='1') +
g.latencyPanel('loki _ingester_chunk_length', '{cluster="$cluster", job="$namespace/ingester"}', multiplier='1') +
{ yaxes: g.yaxes('short') },
)
.addPanel(
g.panel('Entries') +
g.queryPanel('sum(rate(tempo _chunk_store_index_entries_per_chunk_sum{cluster="$cluster", job="$namespace/ingester"}[5m])) / sum(rate(tempo _chunk_store_index_entries_per_chunk_count{cluster="$cluster", job="$namespace/ingester"}[5m]))', 'entries'),
g.queryPanel('sum(rate(loki _chunk_store_index_entries_per_chunk_sum{cluster="$cluster", job="$namespace/ingester"}[5m])) / sum(rate(loki _chunk_store_index_entries_per_chunk_count{cluster="$cluster", job="$namespace/ingester"}[5m]))', 'entries'),
),
)
.addRow(
g.row('Flush Stats')
.addPanel(
g.panel('Queue Length') +
g.queryPanel('tempo _ingester_flush_queue_length{cluster="$cluster", job="$namespace/ingester"}', '{{instance}}'),
g.queryPanel('loki _ingester_flush_queue_length{cluster="$cluster", job="$namespace/ingester"}', '{{instance}}'),
)
.addPanel(
g.panel('Flush Rate') +
g.qpsPanel('tempo _ingester_chunk_age_seconds_count{cluster="$cluster", job="$namespace/ingester"}'),
g.qpsPanel('loki _ingester_chunk_age_seconds_count{cluster="$cluster", job="$namespace/ingester"}'),
),
),
'tempo -frontend.json':
g.dashboard('Tempo / Frontend')
.addTemplate('cluster', 'kube_pod_container_info{image=~".*tempo .*"}', 'cluster')
.addTemplate('namespace', 'kube_pod_container_info{image=~".*tempo .*"}', 'namespace')
'loki -frontend.json':
g.dashboard('Loki / Frontend')
.addTemplate('cluster', 'kube_pod_container_info{image=~".*loki .*"}', 'cluster')
.addTemplate('namespace', 'kube_pod_container_info{image=~".*loki .*"}', 'namespace')
.addRow(
g.row('tempo Reqs (cortex_gw)')
g.row('loki Reqs (cortex_gw)')
.addPanel(
g.panel('QPS') +
g.qpsPanel('cortex_gw_request_duration_seconds_count{cluster="$cluster", job="$namespace/cortex-gw"}')
@ -146,9 +146,9 @@ local g = import 'grafana-builder/grafana.libsonnet';
)
),
'promtail.json':
g.dashboard('Tempo / Promtail')
.addTemplate('cluster', 'kube_pod_container_info{image=~".*tempo .*"}', 'cluster')
.addTemplate('namespace', 'kube_pod_container_info{image=~".*tempo .*"}', 'namespace')
g.dashboard('Loki / Promtail')
.addTemplate('cluster', 'kube_pod_container_info{image=~".*loki .*"}', 'cluster')
.addTemplate('namespace', 'kube_pod_container_info{image=~".*loki .*"}', 'namespace')
.addRow(
g.row('promtail Reqs')
.addPanel(