diff --git a/production/ksonnet/loki/distributor.libsonnet b/production/ksonnet/loki/distributor.libsonnet
index ac767705704406dc59ec655463c7baa6ee42e69d..dabddc917edd97c7edf7c11f159ab37718b19da8 100644
--- a/production/ksonnet/loki/distributor.libsonnet
+++ b/production/ksonnet/loki/distributor.libsonnet
@@ -10,7 +10,9 @@
   distributor_container::
     container.new('distributor', $._images.distributor) +
     container.withPorts($.util.defaultPorts) +
-    container.withArgsMixin($.util.mapToFlags($.distributor_args)),
+    container.withArgsMixin($.util.mapToFlags($.distributor_args)) +
+    $.util.resourcesRequests('0.5', '100Mi') +
+    $.util.resourcesLimits('1', '200Mi'),
 
   local deployment = $.apps.v1beta1.deployment,
 
diff --git a/production/ksonnet/loki/ingester.libsonnet b/production/ksonnet/loki/ingester.libsonnet
index 31860be20fcbc0a5876d67157f35c9f93f8e7d9f..2267209bbdff9141040a3b803eb199c8bd01b423 100644
--- a/production/ksonnet/loki/ingester.libsonnet
+++ b/production/ksonnet/loki/ingester.libsonnet
@@ -13,7 +13,9 @@
     container.mixin.readinessProbe.httpGet.withPath('/ready') +
     container.mixin.readinessProbe.httpGet.withPort(80) +
     container.mixin.readinessProbe.withInitialDelaySeconds(15) +
-    container.mixin.readinessProbe.withTimeoutSeconds(1),
+    container.mixin.readinessProbe.withTimeoutSeconds(1) +
+    $.util.resourcesRequests('1', '5Gi') +
+    $.util.resourcesLimits('2', '10Gi'),
 
   local deployment = $.apps.v1beta1.deployment,
 
diff --git a/production/loki-mixin/dashboards.libsonnet b/production/loki-mixin/dashboards.libsonnet
index d2587cd2411951126585ff57f9a9b554b6a25e0d..81b62f05728d636566bc1147b61fe48a03f1a3fe 100644
--- a/production/loki-mixin/dashboards.libsonnet
+++ b/production/loki-mixin/dashboards.libsonnet
@@ -5,44 +5,44 @@ local utils = import "mixin-utils/utils.libsonnet";
   dashboards+: {
     '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')
+      .addMultiTemplate('cluster', 'kube_pod_container_info{image=~".*loki.*"}', 'cluster')
+      .addMultiTemplate('namespace', 'kube_pod_container_info{image=~".*loki.*"}', 'namespace')
       .addRow(
         g.row('Frontend (cortex_gw)')
         .addPanel(
           g.panel('QPS') +
-          g.qpsPanel('cortex_gw_request_duration_seconds_count{cluster="$cluster", job="$namespace/cortex-gw", route="cortex-write"}')
+          g.qpsPanel('cortex_gw_request_duration_seconds_count{cluster=~"$cluster", job=~"($namespace)/cortex-gw", route="cortex-write"}')
         )
         .addPanel(
           g.panel('Latency') +
-          utils.latencyRecordingRulePanel('cortex_gw_request_duration_seconds', [utils.selector.eq('job', '$namespace/cortex-gw'), utils.selector.eq('route', 'cortex-write')], extra_selectors=[utils.selector.eq('cluster', '$cluster')])
+          utils.latencyRecordingRulePanel('cortex_gw_request_duration_seconds', [utils.selector.re('job', '($namespace)/cortex-gw'), utils.selector.eq('route', 'cortex-write')], extra_selectors=[utils.selector.re('cluster', '$cluster')])
         )
       )
       .addRow(
         g.row('Distributor')
         .addPanel(
           g.panel('QPS') +
-          g.qpsPanel('loki_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"}')
         )
         .addPanel(
           g.panel('Latency') +
-          utils.latencyRecordingRulePanel('loki_request_duration_seconds', [utils.selector.eq('job', '$namespace/distributor'), utils.selector.eq('route', 'api_prom_push')], extra_selectors=[utils.selector.eq('cluster', '$cluster')])
+          utils.latencyRecordingRulePanel('loki_request_duration_seconds', [utils.selector.re('job', '($namespace)/distributor')], extra_selectors=[utils.selector.re('cluster', '$cluster')])
         )
       )
       .addRow(
         g.row('Ingester')
         .addPanel(
           g.panel('QPS') +
-          g.qpsPanel('loki_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') +
-          utils.latencyRecordingRulePanel('loki_request_duration_seconds', [utils.selector.eq('job', '$namespace/ingester'), utils.selector.eq('route', '/logproto.Pusher/Push')], extra_selectors=[utils.selector.eq('cluster', '$cluster')])
+          utils.latencyRecordingRulePanel('loki_request_duration_seconds', [utils.selector.re('job', '($namespace)/ingester'), utils.selector.eq('route', '/logproto.Pusher/Push')], extra_selectors=[utils.selector.re('cluster', '$cluster')])
         )
       ),
 
     'loki-reads.json':
-      g.dashboard('loki / Reads')
+      g.dashboard('Loki / Reads')
       .addTemplate('cluster', 'kube_pod_container_info{image=~".*loki.*"}', 'cluster')
       .addTemplate('namespace', 'kube_pod_container_info{image=~".*loki.*"}', 'namespace')
       .addRow(