extract part of monitoring lib to x/lib/gcm.

The main purpose is to let allocatord to use those functions
to retrieve data from GCM to render dashboard.

MultiPart: 1/2
Change-Id: I8a74cf17f62bdf561ad899fae40d4317dc190b1c
diff --git a/internal/monitoring/.godepcop b/internal/monitoring/.godepcop
deleted file mode 100644
index 917d56f..0000000
--- a/internal/monitoring/.godepcop
+++ /dev/null
@@ -1,5 +0,0 @@
-<godepcop>
-  <pkg allow="code.google.com/p/goauth2/..."/>
-  <pkg allow="golang.org/x/net/..."/>
-  <pkg allow="google.golang.org/api/..."/>
-</godepcop>
diff --git a/internal/monitoring/monitoring.go b/internal/monitoring/monitoring.go
index 8081feb..4e53a2a 100644
--- a/internal/monitoring/monitoring.go
+++ b/internal/monitoring/monitoring.go
@@ -9,7 +9,6 @@
 	"io"
 	"io/ioutil"
 	"net/http"
-	"sort"
 	"strings"
 	"time"
 
@@ -28,8 +27,7 @@
 )
 
 const (
-	customMetricPrefix = "custom.googleapis.com"
-	defaultTimeout     = 20 * time.Second
+	defaultTimeout = 20 * time.Second
 )
 
 // Human-readable service names.
@@ -94,161 +92,6 @@
 	Zone     string
 }
 
-type labelData struct {
-	key         string
-	description string
-}
-
-var aggLabelData = []labelData{
-	labelData{
-		key:         "aggregation",
-		description: "The aggregation type (min, max, avg, sum, count)",
-	},
-}
-
-// customMetricDescriptors is a map from metric's short names to their
-// MetricDescriptor definitions.
-var customMetricDescriptors = map[string]*cloudmonitoring.MetricDescriptor{
-	// Custom metrics for recording stats of cloud syncbase instances.
-	"cloud-syncbase": createMetric("cloud-syncbase", "Stats of cloud syncbase instances.", "double", false, []labelData{
-		labelData{
-			key:         "mounted_name",
-			description: "The relative mounted name of the instance",
-		},
-	}),
-	"cloud-syncbase-agg": createMetric("cloud-syncbase-agg", "The aggregated stats of cloud syncbase instances.", "double", false, aggLabelData),
-
-	// Custom metrics for recording check latency and its aggregation
-	// of vanadium production services.
-	"service-latency":     createMetric("service/latency", "The check latency (ms) of vanadium production services.", "double", true, nil),
-	"service-latency-agg": createMetric("service/latency-agg", "The aggregated check latency (ms) of vanadium production services.", "double", false, aggLabelData),
-
-	// Custom metric for recording per-method rpc latency and its aggregation
-	// for a service.
-	"service-permethod-latency": createMetric("service/latency/method", "Service latency (ms) per method.", "double", true, []labelData{
-		labelData{
-			key:         "method_name",
-			description: "The method name",
-		},
-	}),
-	"service-permethod-latency-agg": createMetric("service/latency/method-agg", "Aggregated service latency (ms) per method.", "double", false, []labelData{
-		labelData{
-			key:         "method_name",
-			description: "The method name",
-		},
-		aggLabelData[0],
-	}),
-
-	// Custom metric for recording various counters and their aggregations
-	// of vanadium production services.
-	"service-counters":     createMetric("service/counters", "Various counters of vanadium production services.", "double", true, nil),
-	"service-counters-agg": createMetric("service/counters-agg", "Aggregated counters of vanadium production services.", "double", false, aggLabelData),
-
-	// Custom metric for recording service metadata and its aggregation
-	// of vanadium production services.
-	"service-metadata": createMetric("service/metadata", "Various metadata of vanadium production services.", "double", true, []labelData{
-		labelData{
-			key:         "metadata_name",
-			description: "The metadata name",
-		},
-	}),
-	"service-metadata-agg": createMetric("service/metadata-agg", "Aggregated metadata of vanadium production services.", "double", false, []labelData{
-		labelData{
-			key:         "metadata_name",
-			description: "The metadata name",
-		},
-		aggLabelData[0],
-	}),
-
-	// Custom metric for recording total rpc qps and its aggregation for a service.
-	"service-qps-total":     createMetric("service/qps/total", "Total service QPS.", "double", true, nil),
-	"service-qps-total-agg": createMetric("service/qps/total-agg", "Aggregated total service QPS.", "double", false, aggLabelData),
-
-	// Custom metric for recording per-method rpc qps for a service.
-	"service-qps-method": createMetric("service/qps/method", "Service QPS per method.", "double", true, []labelData{
-		labelData{
-			key:         "method_name",
-			description: "The method name",
-		},
-	}),
-	"service-qps-method-agg": createMetric("service/qps/method-agg", "Aggregated service QPS per method.", "double", false, []labelData{
-		labelData{
-			key:         "method_name",
-			description: "The method name",
-		},
-		aggLabelData[0],
-	}),
-
-	// Custom metric for recording gce instance stats.
-	"gce-instance": createMetric("gce-instance/stats", "Various stats for GCE instances.", "double", true, nil),
-
-	// Custom metric for recording nginx stats.
-	"nginx": createMetric("nginx/stats", "Various stats for Nginx server.", "double", true, nil),
-
-	// Custom metric for rpc load tests.
-	"rpc-load-test": createMetric("rpc-load-test", "Results of rpc load test.", "double", false, nil),
-
-	// Custom metric for recording jenkins related data.
-	"jenkins": createMetric("jenkins", "Jenkins related data.", "double", false, nil),
-}
-
-func createMetric(metricType, description, valueType string, includeGCELabels bool, extraLabels []labelData) *cloudmonitoring.MetricDescriptor {
-	labels := []*cloudmonitoring.LabelDescriptor{}
-	if includeGCELabels {
-		labels = append(labels, &cloudmonitoring.LabelDescriptor{
-			Key:         "gce_instance",
-			Description: "The name of the GCE instance associated with this metric.",
-			ValueType:   "string",
-		}, &cloudmonitoring.LabelDescriptor{
-			Key:         "gce_zone",
-			Description: "The zone of the GCE instance associated with this metric.",
-			ValueType:   "string",
-		})
-	}
-	labels = append(labels, &cloudmonitoring.LabelDescriptor{
-		Key:         "metric_name",
-		Description: "The name of the metric.",
-		ValueType:   "string",
-	})
-	if extraLabels != nil {
-		for _, data := range extraLabels {
-			labels = append(labels, &cloudmonitoring.LabelDescriptor{
-				Key:         fmt.Sprintf("%s", data.key),
-				Description: data.description,
-				ValueType:   "string",
-			})
-		}
-	}
-
-	return &cloudmonitoring.MetricDescriptor{
-		Type:        fmt.Sprintf("%s/vanadium/%s", customMetricPrefix, metricType),
-		Description: description,
-		MetricKind:  "gauge",
-		ValueType:   valueType,
-		Labels:      labels,
-	}
-}
-
-// GetMetric gets the custom metric descriptor with the given name and project.
-func GetMetric(name, project string) (*cloudmonitoring.MetricDescriptor, error) {
-	md, ok := customMetricDescriptors[name]
-	if !ok {
-		return nil, fmt.Errorf("metric %q doesn't exist", name)
-	}
-	md.Name = fmt.Sprintf("projects/%s/metricDescriptors/%s", project, md.Type)
-	return md, nil
-}
-
-// GetSortedMetricNames gets the sorted metric names.
-func GetSortedMetricNames() []string {
-	names := []string{}
-	for n := range customMetricDescriptors {
-		names = append(names, n)
-	}
-	sort.Strings(names)
-	return names
-}
-
 // GetServiceMountedName gets the full mounted name for the given service.
 func GetServiceMountedName(namespaceRoot, serviceName string) (string, error) {
 	relativeName, ok := serviceMountedNames[serviceName]
@@ -411,18 +254,3 @@
 
 	return google.DefaultClient(oauth2.NoContext, cloudmonitoring.MonitoringScope)
 }
-
-// Authenticate authenticates with the given JSON credentials file (or the
-// default client if the file is not provided). If successful, it returns a
-// service object that can be used in GCM API calls.
-func Authenticate(keyFilePath string) (*cloudmonitoring.Service, error) {
-	c, err := createClient(keyFilePath)
-	if err != nil {
-		return nil, err
-	}
-	s, err := cloudmonitoring.New(c)
-	if err != nil {
-		return nil, fmt.Errorf("New() failed: %v", err)
-	}
-	return s, nil
-}
diff --git a/internal/monitoring/monitoring_test.go b/internal/monitoring/monitoring_test.go
deleted file mode 100644
index 566cb96..0000000
--- a/internal/monitoring/monitoring_test.go
+++ /dev/null
@@ -1,122 +0,0 @@
-// Copyright 2015 The Vanadium Authors. All rights reserved.
-// Use of this source code is governed by a BSD-style
-// license that can be found in the LICENSE file.
-
-package monitoring
-
-import (
-	"fmt"
-	"reflect"
-	"testing"
-
-	cloudmonitoring "google.golang.org/api/monitoring/v3"
-)
-
-func TestCreateMetric(t *testing.T) {
-	type testCase struct {
-		metricType       string
-		description      string
-		valueType        string
-		includeGCELabels bool
-		extraLabels      []labelData
-		expectedMetric   *cloudmonitoring.MetricDescriptor
-	}
-	testCases := []testCase{
-		testCase{
-			metricType:       "test",
-			description:      "this is a test",
-			valueType:        "double",
-			includeGCELabels: false,
-			extraLabels:      nil,
-			expectedMetric: &cloudmonitoring.MetricDescriptor{
-				Type:        fmt.Sprintf("%s/vanadium/test", customMetricPrefix),
-				Description: "this is a test",
-				MetricKind:  "gauge",
-				ValueType:   "double",
-				Labels: []*cloudmonitoring.LabelDescriptor{
-					&cloudmonitoring.LabelDescriptor{
-						Key:         "metric_name",
-						Description: "The name of the metric.",
-						ValueType:   "string",
-					},
-				},
-			},
-		},
-		testCase{
-			metricType:       "test2",
-			description:      "this is a test2",
-			valueType:        "string",
-			includeGCELabels: true,
-			extraLabels:      nil,
-			expectedMetric: &cloudmonitoring.MetricDescriptor{
-				Type:        fmt.Sprintf("%s/vanadium/test2", customMetricPrefix),
-				Description: "this is a test2",
-				MetricKind:  "gauge",
-				ValueType:   "string",
-				Labels: []*cloudmonitoring.LabelDescriptor{
-					&cloudmonitoring.LabelDescriptor{
-						Key:         "gce_instance",
-						Description: "The name of the GCE instance associated with this metric.",
-						ValueType:   "string",
-					},
-					&cloudmonitoring.LabelDescriptor{
-						Key:         "gce_zone",
-						Description: "The zone of the GCE instance associated with this metric.",
-						ValueType:   "string",
-					},
-					&cloudmonitoring.LabelDescriptor{
-						Key:         "metric_name",
-						Description: "The name of the metric.",
-						ValueType:   "string",
-					},
-				},
-			},
-		},
-		testCase{
-			metricType:       "test3",
-			description:      "this is a test3",
-			valueType:        "double",
-			includeGCELabels: true,
-			extraLabels: []labelData{
-				labelData{
-					key:         "extraLabel",
-					description: "this is an extra label",
-				},
-			},
-			expectedMetric: &cloudmonitoring.MetricDescriptor{
-				Type:        fmt.Sprintf("%s/vanadium/test3", customMetricPrefix),
-				Description: "this is a test3",
-				MetricKind:  "gauge",
-				ValueType:   "double",
-				Labels: []*cloudmonitoring.LabelDescriptor{
-					&cloudmonitoring.LabelDescriptor{
-						Key:         "gce_instance",
-						Description: "The name of the GCE instance associated with this metric.",
-						ValueType:   "string",
-					},
-					&cloudmonitoring.LabelDescriptor{
-						Key:         "gce_zone",
-						Description: "The zone of the GCE instance associated with this metric.",
-						ValueType:   "string",
-					},
-					&cloudmonitoring.LabelDescriptor{
-						Key:         "metric_name",
-						Description: "The name of the metric.",
-						ValueType:   "string",
-					},
-					&cloudmonitoring.LabelDescriptor{
-						Key:         "extraLabel",
-						Description: "this is an extra label",
-						ValueType:   "string",
-					},
-				},
-			},
-		},
-	}
-	for _, test := range testCases {
-		got := createMetric(test.metricType, test.description, test.valueType, test.includeGCELabels, test.extraLabels)
-		if !reflect.DeepEqual(got, test.expectedMetric) {
-			t.Fatalf("want %#v, got %#v", test.expectedMetric, got)
-		}
-	}
-}
diff --git a/oncall/serve.go b/oncall/serve.go
index 57d5f29..8230847 100644
--- a/oncall/serve.go
+++ b/oncall/serve.go
@@ -25,6 +25,7 @@
 	"v.io/x/devtools/internal/cache"
 	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/lib/cmdline"
+	"v.io/x/lib/gcm"
 )
 
 const (
@@ -213,7 +214,7 @@
 }
 
 func dataHandler(jirix *jiri.X, root string, w http.ResponseWriter, r *http.Request) {
-	s, err := monitoring.Authenticate(keyFileFlag)
+	s, err := gcm.Authenticate(keyFileFlag)
 	if err != nil {
 		respondWithError(jirix, err, w)
 		return
@@ -255,22 +256,22 @@
 
 	// Create tasks of getting metrics from GCM.
 	allTasks := []getMetricTask{}
-	mdServiceLatency, err := monitoring.GetMetric("service-latency", "vanadium-production")
+	mdServiceLatency, err := gcm.GetMetric("service-latency", "vanadium-production")
 	if err != nil {
 		respondWithError(jirix, err, w)
 		return
 	}
-	mdServiceQPS, err := monitoring.GetMetric("service-qps-total", "vanadium-production")
+	mdServiceQPS, err := gcm.GetMetric("service-qps-total", "vanadium-production")
 	if err != nil {
 		respondWithError(jirix, err, w)
 		return
 	}
-	mdServiceCounters, err := monitoring.GetMetric("service-counters", "vanadium-production")
+	mdServiceCounters, err := gcm.GetMetric("service-counters", "vanadium-production")
 	if err != nil {
 		respondWithError(jirix, err, w)
 		return
 	}
-	mdServiceMetadata, err := monitoring.GetMetric("service-metadata", "vanadium-production")
+	mdServiceMetadata, err := gcm.GetMetric("service-metadata", "vanadium-production")
 	if err != nil {
 		respondWithError(jirix, err, w)
 		return
diff --git a/vmon/check.go b/vmon/check.go
index 1b46d09..90e3d88 100644
--- a/vmon/check.go
+++ b/vmon/check.go
@@ -13,8 +13,8 @@
 
 	"v.io/jiri/tool"
 	"v.io/v23/context"
-	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/lib/cmdline"
+	"v.io/x/lib/gcm"
 	"v.io/x/ref/lib/v23cmd"
 )
 
@@ -85,7 +85,7 @@
 	ctx := tool.NewContextFromEnv(env)
 
 	// Authenticate monitoring APIs.
-	s, err := monitoring.Authenticate(keyFileFlag)
+	s, err := gcm.Authenticate(keyFileFlag)
 	if err != nil {
 		return err
 	}
diff --git a/vmon/cloudsyncbase.go b/vmon/cloudsyncbase.go
index 8d2b3c3..fcfb95a 100644
--- a/vmon/cloudsyncbase.go
+++ b/vmon/cloudsyncbase.go
@@ -17,6 +17,7 @@
 	"v.io/v23/naming"
 	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/devtools/internal/test"
+	"v.io/x/lib/gcm"
 )
 
 const (
@@ -77,7 +78,7 @@
 	}
 
 	// Send number of instances to GCM.
-	md, err := monitoring.GetMetric("cloud-syncbase", projectFlag)
+	md, err := gcm.GetMetric("cloud-syncbase", projectFlag)
 	if err != nil {
 		return err
 	}
@@ -118,7 +119,7 @@
 			continue
 		}
 	}
-	mdAgg, err := monitoring.GetMetric("cloud-syncbase-agg", projectFlag)
+	mdAgg, err := gcm.GetMetric("cloud-syncbase-agg", projectFlag)
 	if err != nil {
 		return err
 	}
diff --git a/vmon/gceinstance.go b/vmon/gceinstance.go
index cf22fc6..eedbc7a 100644
--- a/vmon/gceinstance.go
+++ b/vmon/gceinstance.go
@@ -23,8 +23,8 @@
 	"v.io/jiri/collect"
 	"v.io/jiri/tool"
 	"v.io/v23/context"
-	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/devtools/internal/test"
+	"v.io/x/lib/gcm"
 )
 
 const localCheckScript = `#!/bin/bash
@@ -382,7 +382,7 @@
 
 // sendToGCM sends instance stats data to GCM.
 func sendToGCM(ctx *tool.Context, instances []*gceInstanceData) error {
-	s, err := monitoring.Authenticate(keyFileFlag)
+	s, err := gcm.Authenticate(keyFileFlag)
 	if err != nil {
 		return err
 	}
@@ -453,7 +453,7 @@
 
 // sendInstanceDataToGCM sends a single instance's stat to GCM.
 func sendInstanceDataToGCM(s *cloudmonitoring.Service, metricType, metricName, timeStr string, instance *gceInstanceData, value float64) error {
-	md, err := monitoring.GetMetric(metricType, projectFlag)
+	md, err := gcm.GetMetric(metricType, projectFlag)
 	if err != nil {
 		return err
 	}
diff --git a/vmon/jenkins.go b/vmon/jenkins.go
index e891b7a..55e9233 100644
--- a/vmon/jenkins.go
+++ b/vmon/jenkins.go
@@ -11,8 +11,8 @@
 	cloudmonitoring "google.golang.org/api/monitoring/v3"
 	"v.io/jiri/tool"
 	"v.io/v23/context"
-	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/devtools/internal/test"
+	"v.io/x/lib/gcm"
 )
 
 const (
@@ -35,7 +35,7 @@
 	msg := fmt.Sprintf("vanadium-go-build age: %f hours.\n", ageInHours)
 
 	// Send data to GCM.
-	md, err := monitoring.GetMetric("jenkins", projectFlag)
+	md, err := gcm.GetMetric("jenkins", projectFlag)
 	if err != nil {
 		return err
 	}
diff --git a/vmon/metricdescriptor.go b/vmon/metricdescriptor.go
index 5a86cad..59ca41d 100644
--- a/vmon/metricdescriptor.go
+++ b/vmon/metricdescriptor.go
@@ -11,8 +11,8 @@
 	cloudmonitoring "google.golang.org/api/monitoring/v3"
 
 	"v.io/v23/context"
-	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/lib/cmdline"
+	"v.io/x/lib/gcm"
 	"v.io/x/ref/lib/v23cmd"
 )
 
@@ -40,7 +40,7 @@
 	Short:    "Create the given metric descriptor in GCM",
 	Long:     "Create the given metric descriptor in GCM.",
 	ArgsName: "<names>",
-	ArgsLong: "<names> is a list of metric descriptor names to create. Available: " + strings.Join(monitoring.GetSortedMetricNames(), ", "),
+	ArgsLong: "<names> is a list of metric descriptor names to create. Available: " + strings.Join(gcm.GetSortedMetricNames(), ", "),
 }
 
 func runMetricDescriptorCreate(_ *context.T, env *cmdline.Env, args []string) error {
@@ -48,12 +48,12 @@
 		return err
 	}
 
-	s, err := monitoring.Authenticate(keyFileFlag)
+	s, err := gcm.Authenticate(keyFileFlag)
 	if err != nil {
 		return err
 	}
 	for _, arg := range args {
-		md, err := monitoring.GetMetric(arg, projectFlag)
+		md, err := gcm.GetMetric(arg, projectFlag)
 		if err != nil {
 			return err
 		}
@@ -73,7 +73,7 @@
 	Short:    "Delete the given metric descriptor from GCM",
 	Long:     "Delete the given metric descriptor from GCM.",
 	ArgsName: "<names>",
-	ArgsLong: "<names> is a list of metric descriptor names to delete. Available: " + strings.Join(monitoring.GetSortedMetricNames(), ", "),
+	ArgsLong: "<names> is a list of metric descriptor names to delete. Available: " + strings.Join(gcm.GetSortedMetricNames(), ", "),
 }
 
 func runMetricDescriptorDelete(_ *context.T, env *cmdline.Env, args []string) error {
@@ -81,12 +81,12 @@
 		return err
 	}
 
-	s, err := monitoring.Authenticate(keyFileFlag)
+	s, err := gcm.Authenticate(keyFileFlag)
 	if err != nil {
 		return err
 	}
 	for _, arg := range args {
-		md, err := monitoring.GetMetric(arg, projectFlag)
+		md, err := gcm.GetMetric(arg, projectFlag)
 		if err != nil {
 			return err
 		}
@@ -108,7 +108,7 @@
 }
 
 func runMetricDescriptorList(_ *context.T, env *cmdline.Env, _ []string) error {
-	for _, n := range monitoring.GetSortedMetricNames() {
+	for _, n := range gcm.GetSortedMetricNames() {
 		fmt.Fprintf(env.Stdout, "%s\n", n)
 	}
 	return nil
@@ -123,7 +123,7 @@
 }
 
 func runMetricDescriptorQuery(_ *context.T, env *cmdline.Env, _ []string) error {
-	s, err := monitoring.Authenticate(keyFileFlag)
+	s, err := gcm.Authenticate(keyFileFlag)
 	if err != nil {
 		return err
 	}
@@ -167,7 +167,7 @@
 
 func checkArgs(env *cmdline.Env, args []string) error {
 	for _, arg := range args {
-		if _, err := monitoring.GetMetric(arg, projectFlag); err != nil {
+		if _, err := gcm.GetMetric(arg, projectFlag); err != nil {
 			return err
 		}
 	}
diff --git a/vmon/rpcloadtest.go b/vmon/rpcloadtest.go
index bc24bb9..911cf6b 100644
--- a/vmon/rpcloadtest.go
+++ b/vmon/rpcloadtest.go
@@ -15,8 +15,8 @@
 
 	"v.io/jiri/tool"
 	"v.io/v23/context"
-	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/devtools/internal/test"
+	"v.io/x/lib/gcm"
 )
 
 // checkRPCLoadTest checks the result of RPC load test and sends the result to GCM.
@@ -41,7 +41,7 @@
 		"latency": results.MsecPerRpc,
 		"qps":     results.Qps,
 	}
-	mdRpcLoadTest, err := monitoring.GetMetric("rpc-load-test", projectFlag)
+	mdRpcLoadTest, err := gcm.GetMetric("rpc-load-test", projectFlag)
 	if err != nil {
 		return err
 	}
diff --git a/vmon/servicecounters.go b/vmon/servicecounters.go
index fe32325..51aff0a 100644
--- a/vmon/servicecounters.go
+++ b/vmon/servicecounters.go
@@ -14,6 +14,7 @@
 	"v.io/v23/context"
 	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/devtools/internal/test"
+	"v.io/x/lib/gcm"
 )
 
 type prodServiceCounter struct {
@@ -42,7 +43,7 @@
 	}
 
 	hasError := false
-	mdCounter, err := monitoring.GetMetric("service-counters", projectFlag)
+	mdCounter, err := gcm.GetMetric("service-counters", projectFlag)
 	if err != nil {
 		return err
 	}
@@ -72,7 +73,7 @@
 			}
 
 			// Send aggregated data to GCM.
-			mdAgg, err := monitoring.GetMetric("service-counters-agg", projectFlag)
+			mdAgg, err := gcm.GetMetric("service-counters-agg", projectFlag)
 			if err != nil {
 				return err
 			}
diff --git a/vmon/servicelatency.go b/vmon/servicelatency.go
index d999475..df7c069 100644
--- a/vmon/servicelatency.go
+++ b/vmon/servicelatency.go
@@ -18,6 +18,7 @@
 	"v.io/v23/verror"
 	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/devtools/internal/test"
+	"v.io/x/lib/gcm"
 )
 
 var (
@@ -46,7 +47,7 @@
 	}
 
 	hasError := false
-	mdLat, err := monitoring.GetMetric("service-latency", projectFlag)
+	mdLat, err := gcm.GetMetric("service-latency", projectFlag)
 	if err != nil {
 		return err
 	}
@@ -80,7 +81,7 @@
 		}
 
 		// Send aggregated data to GCM.
-		mdAgg, err := monitoring.GetMetric("service-latency-agg", projectFlag)
+		mdAgg, err := gcm.GetMetric("service-latency-agg", projectFlag)
 		if err != nil {
 			return err
 		}
diff --git a/vmon/servicemetadata.go b/vmon/servicemetadata.go
index f678290..6c94b29 100644
--- a/vmon/servicemetadata.go
+++ b/vmon/servicemetadata.go
@@ -14,6 +14,7 @@
 	"v.io/v23/context"
 	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/devtools/internal/test"
+	"v.io/x/lib/gcm"
 )
 
 const (
@@ -37,7 +38,7 @@
 	}
 
 	hasError := false
-	mdMetadata, err := monitoring.GetMetric("service-metadata", projectFlag)
+	mdMetadata, err := gcm.GetMetric("service-metadata", projectFlag)
 	if err != nil {
 		return err
 	}
@@ -75,7 +76,7 @@
 		}
 
 		// Send aggregated data to GCM.
-		mdMetadataAgg, err := monitoring.GetMetric("service-metadata-agg", projectFlag)
+		mdMetadataAgg, err := gcm.GetMetric("service-metadata-agg", projectFlag)
 		if err != nil {
 			return err
 		}
diff --git a/vmon/servicemethodlatency.go b/vmon/servicemethodlatency.go
index 8456c38..83967a0 100644
--- a/vmon/servicemethodlatency.go
+++ b/vmon/servicemethodlatency.go
@@ -17,6 +17,7 @@
 	"v.io/v23/context"
 	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/devtools/internal/test"
+	"v.io/x/lib/gcm"
 	"v.io/x/ref/services/stats"
 )
 
@@ -43,7 +44,7 @@
 	}
 
 	hasError := false
-	mdLatPerMethod, err := monitoring.GetMetric("service-permethod-latency", projectFlag)
+	mdLatPerMethod, err := gcm.GetMetric("service-permethod-latency", projectFlag)
 	if err != nil {
 		return err
 	}
@@ -85,7 +86,7 @@
 
 		// Send aggregated data to GCM.
 		for method, agg := range aggByMethod {
-			mdAgg, err := monitoring.GetMetric("service-permethod-latency-agg", projectFlag)
+			mdAgg, err := gcm.GetMetric("service-permethod-latency-agg", projectFlag)
 			if err != nil {
 				return err
 			}
diff --git a/vmon/serviceqps.go b/vmon/serviceqps.go
index f7c076d..08e4912 100644
--- a/vmon/serviceqps.go
+++ b/vmon/serviceqps.go
@@ -17,6 +17,7 @@
 	"v.io/v23/naming"
 	"v.io/x/devtools/internal/monitoring"
 	"v.io/x/devtools/internal/test"
+	"v.io/x/lib/gcm"
 	"v.io/x/ref/services/stats"
 )
 
@@ -47,11 +48,11 @@
 	}
 
 	hasError := false
-	mdPerMethodQPS, err := monitoring.GetMetric("service-qps-method", projectFlag)
+	mdPerMethodQPS, err := gcm.GetMetric("service-qps-method", projectFlag)
 	if err != nil {
 		return err
 	}
-	mdTotalQPS, err := monitoring.GetMetric("service-qps-total", projectFlag)
+	mdTotalQPS, err := gcm.GetMetric("service-qps-total", projectFlag)
 	if err != nil {
 		return err
 	}
@@ -103,7 +104,7 @@
 		}
 
 		// Send aggregated data to GCM.
-		mdTotalAgg, err := monitoring.GetMetric("service-qps-total-agg", projectFlag)
+		mdTotalAgg, err := gcm.GetMetric("service-qps-total-agg", projectFlag)
 		if err != nil {
 			return err
 		}
@@ -111,7 +112,7 @@
 			return err
 		}
 		for method, agg := range aggByMethod {
-			mdMethodAgg, err := monitoring.GetMetric("service-qps-method-agg", projectFlag)
+			mdMethodAgg, err := gcm.GetMetric("service-qps-method-agg", projectFlag)
 			if err != nil {
 				return err
 			}