diff --git a/public/app/features/plugins/VariableQueryComponentLoader.tsx b/public/app/features/plugins/VariableQueryComponentLoader.tsx
index c7bb826d302..631161b4e9b 100644
--- a/public/app/features/plugins/VariableQueryComponentLoader.tsx
+++ b/public/app/features/plugins/VariableQueryComponentLoader.tsx
@@ -14,7 +14,7 @@ async function loadComponent(module) {
 }
 
 /** @ngInject */
-function variableQueryEditorLoader() {
+function variableQueryEditorLoader(templateSrv) {
   return {
     restrict: 'E',
     link: async (scope, elem) => {
@@ -23,6 +23,7 @@ function variableQueryEditorLoader() {
         datasource: scope.currentDatasource,
         query: scope.current.query,
         onChange: scope.onQueryChange,
+        templateSrv,
       };
       ReactDOM.render(, elem[0]);
       scope.$on('$destroy', () => {
diff --git a/public/app/plugins/datasource/stackdriver/StackdriverMetricFindQuery.ts b/public/app/plugins/datasource/stackdriver/StackdriverMetricFindQuery.ts
index 2dea8c0405a..8920fed989e 100644
--- a/public/app/plugins/datasource/stackdriver/StackdriverMetricFindQuery.ts
+++ b/public/app/plugins/datasource/stackdriver/StackdriverMetricFindQuery.ts
@@ -1,7 +1,12 @@
 import isString from 'lodash/isString';
 import { alignmentPeriods } from './constants';
 import { MetricFindQueryTypes } from './types';
-import { getMetricTypesByService, getAlignmentOptionsByMetric, getAggregationOptionsByMetric } from './functions';
+import {
+  getMetricTypesByService,
+  getAlignmentOptionsByMetric,
+  getAggregationOptionsByMetric,
+  getLabelKeys,
+} from './functions';
 
 export default class StackdriverMetricFindQuery {
   constructor(private datasource) {}
@@ -37,37 +42,34 @@ export default class StackdriverMetricFindQuery {
       return [];
     }
     const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
-    return getMetricTypesByService(metricDescriptors, selectedService).map(s => ({
+    return getMetricTypesByService(metricDescriptors, this.datasource.templateSrv.replace(selectedService)).map(s => ({
       text: s.displayName,
       value: s.type,
       expandable: true,
     }));
   }
 
-  async handleLabelKeysQuery({ selectedQueryType, selectedMetricType, labelKey }) {
+  async handleLabelKeysQuery({ selectedMetricType }) {
     if (!selectedMetricType) {
       return [];
     }
-    const refId = 'handleLabelKeysQuery';
-    const response = await this.datasource.getLabels(selectedMetricType, refId);
-    const labelKeys = response.meta
-      ? [...Object.keys(response.meta.resourceLabels), ...Object.keys(response.meta.metricLabels)]
-      : [];
+    const labelKeys = await getLabelKeys(this.datasource, selectedMetricType);
     return labelKeys.map(this.toFindQueryResult);
   }
 
-  async handleLabelValuesQuery({ selectedQueryType, selectedMetricType, labelKey }) {
+  async handleLabelValuesQuery({ selectedMetricType, labelKey }) {
     if (!selectedMetricType) {
       return [];
     }
     const refId = 'handleLabelValuesQuery';
     const response = await this.datasource.getLabels(selectedMetricType, refId);
-
+    const interpolatedKey = this.datasource.templateSrv.replace(labelKey);
+    const [name] = interpolatedKey.split('.').reverse();
     let values = [];
-    if (response.meta && response.meta.metricLabels && response.meta.metricLabels.hasOwnProperty(labelKey)) {
-      values = response.meta.metricLabels[labelKey];
-    } else if (response.meta && response.meta.resourceLabels && response.meta.resourceLabels.hasOwnProperty(labelKey)) {
-      values = response.meta.resourceLabels[labelKey];
+    if (response.meta && response.meta.metricLabels && response.meta.metricLabels.hasOwnProperty(name)) {
+      values = response.meta.metricLabels[name];
+    } else if (response.meta && response.meta.resourceLabels && response.meta.resourceLabels.hasOwnProperty(name)) {
+      values = response.meta.resourceLabels[name];
     }
 
     return values.map(this.toFindQueryResult);
@@ -87,7 +89,9 @@ export default class StackdriverMetricFindQuery {
       return [];
     }
     const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
-    const { valueType, metricKind } = metricDescriptors.find(m => m.type === selectedMetricType);
+    const { valueType, metricKind } = metricDescriptors.find(
+      m => m.type === this.datasource.templateSrv.replace(selectedMetricType)
+    );
     return getAlignmentOptionsByMetric(valueType, metricKind).map(this.toFindQueryResult);
   }
 
@@ -96,7 +100,9 @@ export default class StackdriverMetricFindQuery {
       return [];
     }
     const metricDescriptors = await this.datasource.getMetricTypes(this.datasource.projectName);
-    const { valueType, metricKind } = metricDescriptors.find(m => m.type === selectedMetricType);
+    const { valueType, metricKind } = metricDescriptors.find(
+      m => m.type === this.datasource.templateSrv.replace(selectedMetricType)
+    );
     return getAggregationOptionsByMetric(valueType, metricKind).map(this.toFindQueryResult);
   }
 
diff --git a/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.test.tsx b/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.test.tsx
index 5143348f0fe..d1fc3d87288 100644
--- a/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.test.tsx
+++ b/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.test.tsx
@@ -14,6 +14,7 @@ const props: VariableQueryProps = {
   datasource: {
     getMetricTypes: async p => [],
   },
+  templateSrv: { replace: s => s },
 };
 
 describe('VariableQueryEditor', () => {
diff --git a/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.tsx b/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.tsx
index 4ce5910e191..20eb451ce4b 100644
--- a/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.tsx
+++ b/public/app/plugins/datasource/stackdriver/components/VariableQueryEditor.tsx
@@ -2,7 +2,7 @@ import React, { PureComponent } from 'react';
 import uniqBy from 'lodash/uniqBy';
 import { VariableQueryProps } from 'app/types/plugins';
 import SimpleSelect from './SimpleSelect';
-import { getMetricTypes } from '../functions';
+import { getMetricTypes, getLabelKeys } from '../functions';
 import { MetricFindQueryTypes, VariableQueryData } from '../types';
 
 export class StackdriverVariableQueryEditor extends PureComponent {
@@ -40,7 +40,7 @@ export class StackdriverVariableQueryEditor extends PureComponent s.value === this.state.selectedService)) {
+    if (services.some(s => s.value === this.props.templateSrv.replace(this.state.selectedService))) {
       selectedService = this.state.selectedService;
     } else if (services && services.length > 0) {
       selectedService = services[0].value;
@@ -49,6 +49,7 @@ export class StackdriverVariableQueryEditor extends PureComponent l === this.state.labelKey) ? this.state.labelKey : labels[0];
+      const labels = await getLabelKeys(this.props.datasource, selectedMetricType);
+      const labelKey = labels.some(l => l === this.props.templateSrv.replace(this.state.labelKey))
+        ? this.state.labelKey
+        : labels[0];
       result = { labels, labelKey };
     }
     return result;
   }
 
+  insertTemplateVariables(options) {
+    const templateVariables = this.props.templateSrv.variables.map(v => ({ name: `$${v.name}`, value: `$${v.name}` }));
+    return [...templateVariables, ...options];
+  }
+
   renderQueryTypeSwitch(queryType) {
     switch (queryType) {
       case MetricFindQueryTypes.MetricTypes:
@@ -136,14 +143,14 @@ export class StackdriverVariableQueryEditor extends PureComponent
              this.onMetricTypeChange(e)}
               label="Metric Types"
             />
             {queryType === MetricFindQueryTypes.LabelValues && (
                ({ value: l, name: l }))}
+                options={this.insertTemplateVariables(this.state.labels.map(l => ({ value: l, name: l })))}
                 onValueChange={e => this.onLabelKeyChange(e)}
                 label="Label Keys"
               />
@@ -162,7 +169,7 @@ export class StackdriverVariableQueryEditor extends PureComponent
              this.onMetricTypeChange(e)}
               label="Metric Types"
             />
diff --git a/public/app/plugins/datasource/stackdriver/functions.ts b/public/app/plugins/datasource/stackdriver/functions.ts
index 79e8aa30325..0b1a37aa933 100644
--- a/public/app/plugins/datasource/stackdriver/functions.ts
+++ b/public/app/plugins/datasource/stackdriver/functions.ts
@@ -3,12 +3,12 @@ import { alignOptions, aggOptions } from './constants';
 export const getMetricTypesByService = (metricDescriptors, service) =>
   metricDescriptors.filter(m => m.service === service);
 
-export const getMetricTypes = (metricDescriptors, metricType, selectedService) => {
+export const getMetricTypes = (metricDescriptors, metricType, interpolatedMetricType, selectedService) => {
   const metricTypes = getMetricTypesByService(metricDescriptors, selectedService).map(m => ({
     value: m.type,
     name: m.displayName,
   }));
-  const metricTypeExistInArray = metricTypes.some(m => m.value === metricType);
+  const metricTypeExistInArray = metricTypes.some(m => m.value === interpolatedMetricType);
   const selectedMetricType = metricTypeExistInArray ? metricType : metricTypes[0].value;
   return {
     metricTypes,
@@ -31,3 +31,15 @@ export const getAggregationOptionsByMetric = (valueType, metricKind) => {
         return i.valueTypes.indexOf(valueType) !== -1 && i.metricKinds.indexOf(metricKind) !== -1;
       });
 };
+
+export const getLabelKeys = async (datasource, selectedMetricType) => {
+  const refId = 'handleLabelKeysQuery';
+  const response = await datasource.getLabels(selectedMetricType, refId);
+  const labelKeys = response.meta
+    ? [
+        ...Object.keys(response.meta.resourceLabels).map(l => `resource.label.${l}`),
+        ...Object.keys(response.meta.metricLabels).map(l => `metric.label.${l}`),
+      ]
+    : [];
+  return labelKeys;
+};
diff --git a/public/app/plugins/datasource/stackdriver/query_aggregation_ctrl.ts b/public/app/plugins/datasource/stackdriver/query_aggregation_ctrl.ts
index 03fa3b6cecb..628cc494242 100644
--- a/public/app/plugins/datasource/stackdriver/query_aggregation_ctrl.ts
+++ b/public/app/plugins/datasource/stackdriver/query_aggregation_ctrl.ts
@@ -65,7 +65,9 @@ export class StackdriverAggregationCtrl {
     const selectedAlignment = this.alignOptions.find(
       ap => ap.value === this.templateSrv.replace(this.target.aggregation.perSeriesAligner)
     );
-    return `${kbn.secondsToHms(this.$scope.alignmentPeriod)} interval (${selectedAlignment.text})`;
+    return `${kbn.secondsToHms(this.$scope.alignmentPeriod)} interval (${
+      selectedAlignment ? selectedAlignment.text : ''
+    })`;
   }
 
   deselectAggregationOption(notValidOptionValue: string) {
diff --git a/public/app/types/plugins.ts b/public/app/types/plugins.ts
index 95d27afd496..9e3264be70c 100644
--- a/public/app/types/plugins.ts
+++ b/public/app/types/plugins.ts
@@ -104,4 +104,5 @@ export interface VariableQueryProps {
   query: any;
   onChange: (query: any, definition: string) => void;
   datasource: any;
+  templateSrv: any;
 }