*: bump to q3k's kubecfg, kubernetes 1.16

Change-Id: I302876d5a45cbfb63d87ad9f6ea9aaeff7bec17d
diff --git a/WORKSPACE b/WORKSPACE
index 2b63406..3d6c2c2 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -238,9 +238,9 @@
     name = "io_k8s_kubernetes",
     importpath = "k8s.io/kubernetes",
     # Get from HTTP instead, this repository is _big_
-    urls = ["https://github.com/kubernetes/kubernetes/archive/v1.14.2.tar.gz"],
-    sha256 = "1effa926aedb0ed51eadcef3d5d49fd9799ec4d018200f95f51fcaa2a2d2cbf4",
-    strip_prefix = "kubernetes-1.14.2",
+    urls = ["https://github.com/kubernetes/kubernetes/archive/v1.16.0.tar.gz"],
+    sha256 = "a8b2ee84ce38fa14404d7e56daa87aa2f2fb13e0114fb1150f294c992ab3f36c",
+    strip_prefix = "kubernetes-1.16.0",
 )
 
 go_repository(
@@ -250,9 +250,11 @@
 )
 
 go_repository(
-    name = "com_github_ksonnet_kubecfg",
-    commit = "59bc7dedf70e7496a2837207d8723f98f0e5f8e8",
-    importpath = "github.com/ksonnet/kubecfg",
+    name = "com_github_bitnami_kubecfg",
+    importpath = "github.com/bitnami/kubecfg",
+    vcs = "git",
+    commit = "dddf366990f581132cd046c723d73a2357de2dc8",
+    remote = "https://github.com/q3k/kubecfg",
 )
 
 go_repository(
@@ -309,44 +311,44 @@
 
 go_repository(
     name = "ml_vbom_util",
-    commit = "efcd4e0f97874370259c7d93e12aad57911dea81",
+    commit = "db5cfe13f5cc",
     importpath = "vbom.ml/util",
 )
 
 go_repository(
     name = "com_github_go_openapi_strfmt",
-    commit = "6faa644e1cdafc07f7b38eb06c1af5f92128f289",
     importpath = "github.com/go-openapi/strfmt",
+    tag = "v0.19.0",
 )
 
 go_repository(
     name = "com_github_go_openapi_swag",
-    commit = "de649ffb9e02183a414820c5b1b4582f7b009792",
     importpath = "github.com/go-openapi/swag",
+    tag = "v0.19.5",
 )
 
 go_repository(
     name = "com_github_go_openapi_errors",
-    commit = "9b273e805998abc751853b4e1574d66e5df888b4",
     importpath = "github.com/go-openapi/errors",
+    tag = "v0.19.2",
 )
 
 go_repository(
     name = "com_github_go_openapi_runtime",
-    commit = "58872d9a7ca5f28beff9effa19ac4c17d3e42cd3",
     importpath = "github.com/go-openapi/runtime",
+    tag = "v0.19.0",
 )
 
 go_repository(
     name = "com_github_go_openapi_validate",
-    commit = "6405b9095e4c96aabb45856da08a9323d50d9336",
     importpath = "github.com/go-openapi/validate",
+    tag = "v0.19.2",
 )
 
 go_repository(
     name = "com_github_mitchellh_mapstructure",
-    commit = "3536a929edddb9a5b34bd6861dc4a9647cb459fe",
     importpath = "github.com/mitchellh/mapstructure",
+    tag = "v1.1.2",
 )
 
 go_repository(
@@ -357,61 +359,61 @@
 
 go_repository(
     name = "in_gopkg_yaml_v2",
-    commit = "51d6538a90f86fe93ac480b35f37b2be17fef232",
     importpath = "gopkg.in/yaml.v2",
+    tag = "v2.2.4",
 )
 
 go_repository(
     name = "com_github_asaskevich_govalidator",
-    commit = "f61b66f89f4a311bef65f13e575bcf1a2ffadda6",
+    commit = "f61b66f89f4a",
     importpath = "github.com/asaskevich/govalidator",
 )
 
 go_repository(
     name = "com_github_go_openapi_spec",
-    commit = "bdfd7e07daecc404d77868a88b2364d0aed0ee5a",
     importpath = "github.com/go-openapi/spec",
+    tag = "v0.19.2",
 )
 
 go_repository(
     name = "com_github_mailru_easyjson",
-    commit = "b2ccc519800e761ac8000b95e5d57c80a897ff9e",
+    commit = "b2ccc519800e",
     importpath = "github.com/mailru/easyjson",
 )
 
 go_repository(
     name = "com_github_go_openapi_analysis",
-    commit = "48f4521ad6c3df9d6192efb04287c4a411e1f806",
     importpath = "github.com/go-openapi/analysis",
+    tag = "v0.19.2",
 )
 
 go_repository(
     name = "com_github_go_openapi_jsonpointer",
-    commit = "a105a905c5e6ad147f08504784917f3e178e0ba5",
     importpath = "github.com/go-openapi/jsonpointer",
+    tag = "v0.19.3",
 )
 
 go_repository(
     name = "com_github_go_openapi_loads",
-    commit = "8548893a17237be4a5b2f74773f23002f4179bbe",
     importpath = "github.com/go-openapi/loads",
+    tag = "v0.19.2",
 )
 
 go_repository(
     name = "com_github_go_openapi_jsonreference",
-    commit = "2903bfd4bfbaf188694f1edf731f2725a8fa344f",
     importpath = "github.com/go-openapi/jsonreference",
+    tag = "v0.19.2",
 )
 
 go_repository(
     name = "com_github_puerkitobio_purell",
-    commit = "44968752391892e1b0d0b821ee79e9a85fa13049",
     importpath = "github.com/PuerkitoBio/purell",
+    tag = "v1.1.1",
 )
 
 go_repository(
     name = "com_github_puerkitobio_urlesc",
-    commit = "de5bf2ad457846296e2031421a34e2568e304e35",
+    commit = "de5bf2ad4578",
     importpath = "github.com/PuerkitoBio/urlesc",
 )
 
@@ -423,19 +425,19 @@
 
 go_repository(
     name = "com_github_urfave_cli",
-    commit = "693af58b4d51b8fcc7f9d89576da170765980581",
     importpath = "github.com/urfave/cli",
+    tag = "v1.20.0",
 )
 
 go_repository(
     name = "org_golang_x_crypto",
-    commit = "4def268fd1a49955bfb3dda92fe3db4f924f2285",
+    commit = "60c769a6c586",
     importpath = "golang.org/x/crypto",
 )
 
 go_repository(
     name = "org_golang_x_oauth2",
-    commit = "0f29369cfe4552d0e4bcddc57cc75f4d7e672a33",
+    commit = "0f29369cfe45",
     importpath = "golang.org/x/oauth2",
 )
 
@@ -447,13 +449,13 @@
 
 go_repository(
     name = "com_google_cloud_go",
-    commit = "71971b35976fc2f904ed2772536790a5458d9996",
     importpath = "cloud.google.com/go",
+    tag = "v0.38.0",
 )
 
 go_repository(
     name = "org_golang_x_net",
-    commit = "da137c7871d730100384dbcf36e6f8fa493aef5b",
+    commit = "13f9640d40b9",
     importpath = "golang.org/x/net",
 )
 
@@ -471,94 +473,94 @@
 
 go_repository(
     name = "com_github_dustin_go_humanize",
-    commit = "9f541cc9db5d55bce703bd99987c9d5cb8eea45e",
     importpath = "github.com/dustin/go-humanize",
+    tag = "v1.0.0",
 )
 
 go_repository(
     name = "io_k8s_client_go",
-    commit = "0c47f9da00011ea9a8717671127ac21625c7a6c0",
+    commit = "0a8a1d7b7fae",
     importpath = "k8s.io/client-go",
 )
 
 go_repository(
     name = "io_k8s_apimachinery",
-    commit = "bfcf53abc9f82bad3e534fcb1c36599d3c989ebf",
-    importpath = "k8s.io/apimachinery",
     build_file_proto_mode = "disable",
+    commit = "08e4eafd6d11",
+    importpath = "k8s.io/apimachinery",
 )
 
 go_repository(
     name = "io_k8s_klog",
-    commit = "6a023d6d0e0954feabd46dc2d3a6a2c3c991fe1a",
     importpath = "k8s.io/klog",
+    tag = "v1.0.0",
 )
 
 go_repository(
     name = "io_k8s_utils",
-    commit = "3dccf664f023863740c508fb4284e49742bedfa4",
+    commit = "e782cd3c129f",
     importpath = "k8s.io/utils",
 )
 
 go_repository(
     name = "com_github_googleapis_gnostic",
-    commit = "25d8b0b6698593f520d9d8dc5a88e6b16ca9ecc0",
+    commit = "15cf44e552f9",
     importpath = "github.com/googleapis/gnostic",
 )
 
 go_repository(
     name = "io_k8s_api",
-    commit = "3043179095b6baa0087e8735d796bd6dfa881f8e",
-    importpath = "k8s.io/api",
     build_file_proto_mode = "disable",
+    commit = "bbc9463b57e5",
+    importpath = "k8s.io/api",
 )
 
 go_repository(
     name = "org_golang_x_time",
-    commit = "9d24e82272b4f38b78bc8cff74fa936d31ccd8ef",
+    commit = "9d24e82272b4",
     importpath = "golang.org/x/time",
 )
 
 go_repository(
     name = "com_github_google_gofuzz",
-    commit = "f140a6486e521aad38f5917de355cbf147cc0496",
     importpath = "github.com/google/gofuzz",
+    tag = "v1.0.0",
 )
 
 go_repository(
     name = "io_k8s_sigs_yaml",
-    commit = "4cd0c284b15f1735b8cc247df097d262b8903f9f",
     importpath = "sigs.k8s.io/yaml",
+    tag = "v1.1.0",
 )
 
 go_repository(
     name = "com_github_modern_go_reflect2",
-    commit = "94122c33edd36123c84d5368cfb2b69df93a0ec8",
     importpath = "github.com/modern-go/reflect2",
+    tag = "v1.0.1",
 )
 
 go_repository(
     name = "com_github_davecgh_go_spew",
-    commit = "d8f796af33cc11cb798c1aaeb27a4ebc5099927d",
     importpath = "github.com/davecgh/go-spew",
+    tag = "v1.1.1",
 )
 
 go_repository(
     name = "com_github_json_iterator_go",
-    commit = "27518f6661eba504be5a7a9a9f6d9460d892ade3",
     importpath = "github.com/json-iterator/go",
+    tag = "v1.1.8",
 )
 
 go_repository(
     name = "com_github_modern_go_concurrent",
-    commit = "bacd9c7ef1dd9b15be4a9909b8ac7a4e313eec94",
+    commit = "bacd9c7ef1dd",
     importpath = "github.com/modern-go/concurrent",
 )
 
 go_repository(
     name = "in_gopkg_inf_v0",
-    commit = "d2d2541c53f18d2a059457998ce2876cc8e67cbf",
     importpath = "gopkg.in/inf.v0",
+    tag = "v0.9.1",
 )
 
 go_repository(
@@ -569,8 +571,8 @@
 
 go_repository(
     name = "com_github_prometheus_client_golang",
-    commit = "bb9b00a86ebaaa691ba43af1f9ba9d16156cc545",
     importpath = "github.com/prometheus/client_golang",
+    tag = "v1.0.0",
 )
 
 go_repository(
@@ -587,44 +589,44 @@
 
 go_repository(
     name = "com_github_gorilla_mux",
-    commit = "e67b3c02c7195c052acff13261f0c9fd1ba53011",
     importpath = "github.com/gorilla/mux",
+    tag = "v1.6.2",
 )
 
 go_repository(
     name = "com_github_sirupsen_logrus",
-    commit = "07a84ee7412e7a28663d92930a1d46f81b124ee1",
     importpath = "github.com/sirupsen/logrus",
+    tag = "v1.4.2",
 )
 
 go_repository(
     name = "com_github_prometheus_common",
-    commit = "33bc620f956eb70fbb8355e87df6a97891657ed5",
     importpath = "github.com/prometheus/common",
+    tag = "v0.4.1",
 )
 
 go_repository(
     name = "com_github_beorn7_perks",
-    commit = "4b2b341e8d7715fae06375aa633dbb6e91b3fb46",
     importpath = "github.com/beorn7/perks",
+    tag = "v1.0.0",
 )
 
 go_repository(
     name = "com_github_prometheus_client_model",
-    commit = "fd36f4220a901265f90734c3183c5f0c91daa0b8",
+    commit = "fd36f4220a90",
     importpath = "github.com/prometheus/client_model",
 )
 
 go_repository(
     name = "com_github_prometheus_procfs",
-    commit = "8f55e607908ea781ad9d08521730d73e047d9ac4",
     importpath = "github.com/prometheus/procfs",
+    tag = "v0.0.2",
 )
 
 go_repository(
     name = "com_github_matttproud_golang_protobuf_extensions",
-    commit = "c182affec369e30f25d3eb8cd8a478dee585ae7d",
     importpath = "github.com/matttproud/golang_protobuf_extensions",
+    tag = "v1.0.1",
 )
 
 go_repository(
@@ -718,3 +720,1167 @@
     commit = "af0e3abb1bcef7197b3b9f91d7d094e6528a2d05",
     importpath = "github.com/q3k/cursedjson",
 )
+
+go_repository(
+    name = "co_honnef_go_tools",
+    commit = "ea95bdfd59fc",
+    importpath = "honnef.co/go/tools",
+)
+
+go_repository(
+    name = "com_github_azure_go_ansiterm",
+    commit = "d6e3b3328b78",
+    importpath = "github.com/Azure/go-ansiterm",
+)
+
+go_repository(
+    name = "com_github_azure_go_autorest",
+    importpath = "github.com/Azure/go-autorest",
+    tag = "v11.5.0",
+)
+
+local_repository(
+    name = "com_github_census_instrumentation_opencensus_proto",
+    path = "./third_party/go/opencensus-proto",
+)
+
+go_repository(
+    name = "com_github_client9_misspell",
+    importpath = "github.com/client9/misspell",
+    tag = "v0.3.4",
+)
+
+go_repository(
+    name = "com_github_containerd_continuity",
+    commit = "7f53d412b9eb",
+    importpath = "github.com/containerd/continuity",
+)
+
+go_repository(
+    name = "com_github_coreos_clair",
+    commit = "44ae4bc9590a",
+    importpath = "github.com/coreos/clair",
+)
+
+go_repository(
+    name = "com_github_dgrijalva_jwt_go",
+    importpath = "github.com/dgrijalva/jwt-go",
+    tag = "v3.2.0",
+)
+
+go_repository(
+    name = "com_github_docker_cli",
+    commit = "54c19e67f69c",
+    importpath = "github.com/docker/cli",
+)
+
+go_repository(
+    name = "com_github_docker_distribution",
+    importpath = "github.com/docker/distribution",
+    tag = "v2.7.1",
+)
+
+go_repository(
+    name = "com_github_docker_docker",
+    commit = "be7ac8be2ae0",
+    importpath = "github.com/docker/docker",
+)
+
+go_repository(
+    name = "com_github_docker_docker_ce",
+    commit = "f53bd8bb8e43",
+    importpath = "github.com/docker/docker-ce",
+)
+
+go_repository(
+    name = "com_github_docker_docker_credential_helpers",
+    importpath = "github.com/docker/docker-credential-helpers",
+    tag = "v0.6.1",
+)
+
+go_repository(
+    name = "com_github_docker_go_connections",
+    commit = "97c2040d34df",
+    importpath = "github.com/docker/go-connections",
+)
+
+go_repository(
+    name = "com_github_docker_go_metrics",
+    commit = "399ea8c73916",
+    importpath = "github.com/docker/go-metrics",
+)
+
+go_repository(
+    name = "com_github_docker_go_units",
+    importpath = "github.com/docker/go-units",
+    tag = "v0.3.3",
+)
+
+go_repository(
+    name = "com_github_docker_libtrust",
+    commit = "aabc10ec26b7",
+    importpath = "github.com/docker/libtrust",
+)
+
+go_repository(
+    name = "com_github_elazarl_go_bindata_assetfs",
+    commit = "38087fe4dafb",
+    importpath = "github.com/elazarl/go-bindata-assetfs",
+)
+
+go_repository(
+    name = "com_github_evanphx_json_patch",
+    importpath = "github.com/evanphx/json-patch",
+    tag = "v4.2.0",
+)
+
+go_repository(
+    name = "com_github_fernet_fernet_go",
+    commit = "9eac43b88a5e",
+    importpath = "github.com/fernet/fernet-go",
+)
+
+go_repository(
+    name = "com_github_fsnotify_fsnotify",
+    importpath = "github.com/fsnotify/fsnotify",
+    tag = "v1.4.7",
+)
+
+go_repository(
+    name = "com_github_genuinetools_pkg",
+    commit = "1c141f661797",
+    importpath = "github.com/genuinetools/pkg",
+)
+
+go_repository(
+    name = "com_github_genuinetools_reg",
+    commit = "d959057b30da",
+    importpath = "github.com/genuinetools/reg",
+)
+
+go_repository(
+    name = "com_github_ghodss_yaml",
+    importpath = "github.com/ghodss/yaml",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_gogo_protobuf",
+    commit = "65acae22fc9d",
+    importpath = "github.com/gogo/protobuf",
+)
+
+go_repository(
+    name = "com_github_golang_glog",
+    commit = "23def4e6c14b",
+    importpath = "github.com/golang/glog",
+)
+
+go_repository(
+    name = "com_github_golang_mock",
+    importpath = "github.com/golang/mock",
+    tag = "v1.2.0",
+)
+
+go_repository(
+    name = "com_github_golang_protobuf",
+    importpath = "github.com/golang/protobuf",
+    tag = "v1.3.2",
+)
+
+go_repository(
+    name = "com_github_google_btree",
+    importpath = "github.com/google/btree",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_google_go_cmp",
+    importpath = "github.com/google/go-cmp",
+    tag = "v0.3.0",
+)
+
+go_repository(
+    name = "com_github_google_go_jsonnet",
+    importpath = "github.com/google/go-jsonnet",
+    tag = "v0.12.1",
+)
+
+go_repository(
+    name = "com_github_gophercloud_gophercloud",
+    importpath = "github.com/gophercloud/gophercloud",
+    tag = "v0.1.0",
+)
+
+go_repository(
+    name = "com_github_gorilla_context",
+    importpath = "github.com/gorilla/context",
+    tag = "v1.1.1",
+)
+
+go_repository(
+    name = "com_github_gregjones_httpcache",
+    commit = "9cad4c3443a7",
+    importpath = "github.com/gregjones/httpcache",
+)
+
+go_repository(
+    name = "com_github_grpc_ecosystem_grpc_gateway",
+    importpath = "github.com/grpc-ecosystem/grpc-gateway",
+    tag = "v1.9.5",
+)
+
+go_repository(
+    name = "com_github_hpcloud_tail",
+    importpath = "github.com/hpcloud/tail",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_imdario_mergo",
+    importpath = "github.com/imdario/mergo",
+    tag = "v0.3.5",
+)
+
+go_repository(
+    name = "com_github_inconshreveable_mousetrap",
+    importpath = "github.com/inconshreveable/mousetrap",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_kisielk_gotool",
+    importpath = "github.com/kisielk/gotool",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_kr_pretty",
+    importpath = "github.com/kr/pretty",
+    tag = "v0.1.0",
+)
+
+go_repository(
+    name = "com_github_kr_pty",
+    importpath = "github.com/kr/pty",
+    tag = "v1.1.5",
+)
+
+go_repository(
+    name = "com_github_kr_text",
+    importpath = "github.com/kr/text",
+    tag = "v0.1.0",
+)
+
+go_repository(
+    name = "com_github_mattn_go_isatty",
+    importpath = "github.com/mattn/go-isatty",
+    tag = "v0.0.4",
+)
+
+go_repository(
+    name = "com_github_microsoft_go_winio",
+    importpath = "github.com/Microsoft/go-winio",
+    tag = "v0.4.11",
+)
+
+go_repository(
+    name = "com_github_mitchellh_go_wordwrap",
+    importpath = "github.com/mitchellh/go-wordwrap",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_nvveen_gotty",
+    commit = "cd527374f1e5",
+    importpath = "github.com/Nvveen/Gotty",
+)
+
+go_repository(
+    name = "com_github_onsi_ginkgo",
+    importpath = "github.com/onsi/ginkgo",
+    tag = "v1.10.1",
+)
+
+go_repository(
+    name = "com_github_onsi_gomega",
+    importpath = "github.com/onsi/gomega",
+    tag = "v1.7.0",
+)
+
+go_repository(
+    name = "com_github_opencontainers_go_digest",
+    importpath = "github.com/opencontainers/go-digest",
+    tag = "v1.0.0-rc1",
+)
+
+go_repository(
+    name = "com_github_opencontainers_image_spec",
+    importpath = "github.com/opencontainers/image-spec",
+    tag = "v1.0.1",
+)
+
+go_repository(
+    name = "com_github_opencontainers_runc",
+    importpath = "github.com/opencontainers/runc",
+    tag = "v0.1.1",
+)
+
+go_repository(
+    name = "com_github_openzipkin_zipkin_go",
+    importpath = "github.com/openzipkin/zipkin-go",
+    tag = "v0.1.3",
+)
+
+go_repository(
+    name = "com_github_peterbourgon_diskv",
+    importpath = "github.com/peterbourgon/diskv",
+    tag = "v2.0.1",
+)
+
+go_repository(
+    name = "com_github_peterhellberg_link",
+    importpath = "github.com/peterhellberg/link",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_pkg_errors",
+    importpath = "github.com/pkg/errors",
+    tag = "v0.8.1",
+)
+
+go_repository(
+    name = "com_github_pmezard_go_difflib",
+    importpath = "github.com/pmezard/go-difflib",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_sergi_go_diff",
+    commit = "feef008d51ad",
+    importpath = "github.com/sergi/go-diff",
+)
+
+go_repository(
+    name = "com_github_shurcool_httpfs",
+    commit = "809beceb2371",
+    importpath = "github.com/shurcooL/httpfs",
+)
+
+go_repository(
+    name = "com_github_spf13_cobra",
+    importpath = "github.com/spf13/cobra",
+    tag = "v0.0.5",
+)
+
+go_repository(
+    name = "com_github_spf13_pflag",
+    importpath = "github.com/spf13/pflag",
+    tag = "v1.0.5",
+)
+
+go_repository(
+    name = "com_github_stretchr_objx",
+    importpath = "github.com/stretchr/objx",
+    tag = "v0.2.0",
+)
+
+go_repository(
+    name = "com_github_stretchr_testify",
+    importpath = "github.com/stretchr/testify",
+    tag = "v1.3.0",
+)
+
+go_repository(
+    name = "in_gopkg_airbrake_gobrake_v2",
+    importpath = "gopkg.in/airbrake/gobrake.v2",
+    tag = "v2.0.9",
+)
+
+go_repository(
+    name = "in_gopkg_check_v1",
+    commit = "788fd7840127",
+    importpath = "gopkg.in/check.v1",
+)
+
+go_repository(
+    name = "in_gopkg_fsnotify_v1",
+    importpath = "gopkg.in/fsnotify.v1",
+    tag = "v1.4.7",
+)
+
+go_repository(
+    name = "in_gopkg_gemnasium_logrus_airbrake_hook_v2",
+    importpath = "gopkg.in/gemnasium/logrus-airbrake-hook.v2",
+    tag = "v2.1.2",
+)
+
+go_repository(
+    name = "in_gopkg_tomb_v1",
+    commit = "dd632973f1e7",
+    importpath = "gopkg.in/tomb.v1",
+)
+
+go_repository(
+    name = "io_k8s_apiextensions_apiserver",
+    build_file_proto_mode = "disable",
+    commit = "b615a37f53e7",
+    importpath = "k8s.io/apiextensions-apiserver",
+)
+
+go_repository(
+    name = "io_k8s_kube_openapi",
+    commit = "30be4d16710a",
+    importpath = "k8s.io/kube-openapi",
+)
+
+go_repository(
+    name = "io_opencensus_go",
+    importpath = "go.opencensus.io",
+    tag = "v0.21.0",
+)
+
+go_repository(
+    name = "io_opencensus_go_contrib_exporter_ocagent",
+    importpath = "contrib.go.opencensus.io/exporter/ocagent",
+    tag = "v0.6.0",
+)
+
+go_repository(
+    name = "org_apache_git_thrift_git",
+    commit = "9b75e4fe745a",
+    importpath = "git.apache.org/thrift.git",
+)
+
+go_repository(
+    name = "org_golang_google_api",
+    importpath = "google.golang.org/api",
+    tag = "v0.4.0",
+)
+
+go_repository(
+    name = "org_golang_google_appengine",
+    importpath = "google.golang.org/appengine",
+    tag = "v1.5.0",
+)
+
+go_repository(
+    name = "org_golang_google_genproto",
+    commit = "54afdca5d873",
+    importpath = "google.golang.org/genproto",
+)
+
+go_repository(
+    name = "org_golang_google_grpc",
+    importpath = "google.golang.org/grpc",
+    tag = "v1.23.1",
+)
+
+go_repository(
+    name = "org_golang_x_lint",
+    commit = "d0100b6bd8b3",
+    importpath = "golang.org/x/lint",
+)
+
+go_repository(
+    name = "org_golang_x_sync",
+    commit = "112230192c58",
+    importpath = "golang.org/x/sync",
+)
+
+go_repository(
+    name = "org_golang_x_sys",
+    commit = "c7b8b68b1456",
+    importpath = "golang.org/x/sys",
+)
+
+go_repository(
+    name = "org_golang_x_text",
+    importpath = "golang.org/x/text",
+    tag = "v0.3.2",
+)
+
+go_repository(
+    name = "org_golang_x_tools",
+    commit = "5eefd052ad72",
+    importpath = "golang.org/x/tools",
+)
+
+go_repository(
+    name = "tools_gotest",
+    importpath = "gotest.tools",
+    tag = "v2.2.0",
+)
+
+go_repository(
+    name = "com_github_alecthomas_template",
+    commit = "a0175ee3bccc",
+    importpath = "github.com/alecthomas/template",
+)
+
+go_repository(
+    name = "com_github_alecthomas_units",
+    commit = "2efee857e7cf",
+    importpath = "github.com/alecthomas/units",
+)
+
+go_repository(
+    name = "com_github_armon_consul_api",
+    commit = "eb2c6b5be1b6",
+    importpath = "github.com/armon/consul-api",
+)
+
+go_repository(
+    name = "com_github_azure_go_autorest_autorest",
+    importpath = "github.com/Azure/go-autorest/autorest",
+    tag = "v0.9.0",
+)
+
+go_repository(
+    name = "com_github_azure_go_autorest_autorest_adal",
+    importpath = "github.com/Azure/go-autorest/autorest/adal",
+    tag = "v0.5.0",
+)
+
+go_repository(
+    name = "com_github_azure_go_autorest_autorest_date",
+    importpath = "github.com/Azure/go-autorest/autorest/date",
+    tag = "v0.1.0",
+)
+
+go_repository(
+    name = "com_github_azure_go_autorest_autorest_mocks",
+    importpath = "github.com/Azure/go-autorest/autorest/mocks",
+    tag = "v0.2.0",
+)
+
+go_repository(
+    name = "com_github_azure_go_autorest_logger",
+    importpath = "github.com/Azure/go-autorest/logger",
+    tag = "v0.1.0",
+)
+
+go_repository(
+    name = "com_github_azure_go_autorest_tracing",
+    importpath = "github.com/Azure/go-autorest/tracing",
+    tag = "v0.5.0",
+)
+
+go_repository(
+    name = "com_github_bgentry_speakeasy",
+    importpath = "github.com/bgentry/speakeasy",
+    tag = "v0.1.0",
+)
+
+go_repository(
+    name = "com_github_blang_semver",
+    importpath = "github.com/blang/semver",
+    tag = "v3.5.0",
+)
+
+go_repository(
+    name = "com_github_burntsushi_toml",
+    importpath = "github.com/BurntSushi/toml",
+    tag = "v0.3.1",
+)
+
+go_repository(
+    name = "com_github_burntsushi_xgb",
+    commit = "27f122750802",
+    importpath = "github.com/BurntSushi/xgb",
+)
+
+go_repository(
+    name = "com_github_chai2010_gettext_go",
+    commit = "c6fed771bfd5",
+    importpath = "github.com/chai2010/gettext-go",
+)
+
+go_repository(
+    name = "com_github_cockroachdb_datadriven",
+    commit = "80d97fb3cbaa",
+    importpath = "github.com/cockroachdb/datadriven",
+)
+
+go_repository(
+    name = "com_github_coreos_etcd",
+    importpath = "github.com/coreos/etcd",
+    tag = "v3.3.10",
+)
+
+go_repository(
+    name = "com_github_coreos_go_etcd",
+    importpath = "github.com/coreos/go-etcd",
+    tag = "v2.0.0",
+)
+
+go_repository(
+    name = "com_github_coreos_go_oidc",
+    importpath = "github.com/coreos/go-oidc",
+    tag = "v2.1.0",
+)
+
+go_repository(
+    name = "com_github_coreos_go_semver",
+    importpath = "github.com/coreos/go-semver",
+    tag = "v0.3.0",
+)
+
+go_repository(
+    name = "com_github_coreos_go_systemd",
+    commit = "95778dfbb74e",
+    importpath = "github.com/coreos/go-systemd",
+)
+
+go_repository(
+    name = "com_github_coreos_pkg",
+    commit = "97fdf19511ea",
+    importpath = "github.com/coreos/pkg",
+)
+
+go_repository(
+    name = "com_github_cpuguy83_go_md2man",
+    importpath = "github.com/cpuguy83/go-md2man",
+    tag = "v1.0.10",
+)
+
+go_repository(
+    name = "com_github_creack_pty",
+    importpath = "github.com/creack/pty",
+    tag = "v1.1.7",
+)
+
+go_repository(
+    name = "com_github_daviddengcn_go_colortext",
+    commit = "511bcaf42ccd",
+    importpath = "github.com/daviddengcn/go-colortext",
+)
+
+go_repository(
+    name = "com_github_docker_spdystream",
+    commit = "449fdfce4d96",
+    importpath = "github.com/docker/spdystream",
+)
+
+go_repository(
+    name = "com_github_elazarl_goproxy",
+    commit = "c4fc26588b6e",
+    importpath = "github.com/elazarl/goproxy",
+)
+
+go_repository(
+    name = "com_github_emicklei_go_restful",
+    importpath = "github.com/emicklei/go-restful",
+    tag = "v2.9.5",
+)
+
+go_repository(
+    name = "com_github_exponent_io_jsonpath",
+    commit = "d6023ce2651d",
+    importpath = "github.com/exponent-io/jsonpath",
+)
+
+go_repository(
+    name = "com_github_fatih_camelcase",
+    importpath = "github.com/fatih/camelcase",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_fatih_color",
+    importpath = "github.com/fatih/color",
+    tag = "v1.7.0",
+)
+
+go_repository(
+    name = "com_github_globalsign_mgo",
+    commit = "eeefdecb41b8",
+    importpath = "github.com/globalsign/mgo",
+)
+
+go_repository(
+    name = "com_github_go_kit_kit",
+    importpath = "github.com/go-kit/kit",
+    tag = "v0.8.0",
+)
+
+go_repository(
+    name = "com_github_go_logfmt_logfmt",
+    importpath = "github.com/go-logfmt/logfmt",
+    tag = "v0.3.0",
+)
+
+go_repository(
+    name = "com_github_go_logr_logr",
+    importpath = "github.com/go-logr/logr",
+    tag = "v0.1.0",
+)
+
+go_repository(
+    name = "com_github_go_stack_stack",
+    importpath = "github.com/go-stack/stack",
+    tag = "v1.8.0",
+)
+
+go_repository(
+    name = "com_github_golang_groupcache",
+    commit = "02826c3e7903",
+    importpath = "github.com/golang/groupcache",
+)
+
+go_repository(
+    name = "com_github_golangplus_bytes",
+    commit = "45c989fe5450",
+    importpath = "github.com/golangplus/bytes",
+)
+
+go_repository(
+    name = "com_github_golangplus_fmt",
+    commit = "2a5d6d7d2995",
+    importpath = "github.com/golangplus/fmt",
+)
+
+go_repository(
+    name = "com_github_golangplus_testing",
+    commit = "af21d9c3145e",
+    importpath = "github.com/golangplus/testing",
+)
+
+go_repository(
+    name = "com_github_google_martian",
+    importpath = "github.com/google/martian",
+    tag = "v2.1.0",
+)
+
+go_repository(
+    name = "com_github_google_pprof",
+    commit = "3ea8567a2e57",
+    importpath = "github.com/google/pprof",
+)
+
+go_repository(
+    name = "com_github_google_uuid",
+    importpath = "github.com/google/uuid",
+    tag = "v1.1.1",
+)
+
+go_repository(
+    name = "com_github_googleapis_gax_go_v2",
+    importpath = "github.com/googleapis/gax-go/v2",
+    tag = "v2.0.4",
+)
+
+go_repository(
+    name = "com_github_gorilla_websocket",
+    importpath = "github.com/gorilla/websocket",
+    tag = "v1.4.0",
+)
+
+go_repository(
+    name = "com_github_grpc_ecosystem_go_grpc_middleware",
+    commit = "f849b5445de4",
+    importpath = "github.com/grpc-ecosystem/go-grpc-middleware",
+)
+
+go_repository(
+    name = "com_github_grpc_ecosystem_go_grpc_prometheus",
+    importpath = "github.com/grpc-ecosystem/go-grpc-prometheus",
+    tag = "v1.2.0",
+)
+
+go_repository(
+    name = "com_github_hashicorp_golang_lru",
+    importpath = "github.com/hashicorp/golang-lru",
+    tag = "v0.5.1",
+)
+
+go_repository(
+    name = "com_github_hashicorp_hcl",
+    importpath = "github.com/hashicorp/hcl",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_jonboulle_clockwork",
+    importpath = "github.com/jonboulle/clockwork",
+    tag = "v0.1.0",
+)
+
+go_repository(
+    name = "com_github_jstemmer_go_junit_report",
+    commit = "af01ea7f8024",
+    importpath = "github.com/jstemmer/go-junit-report",
+)
+
+go_repository(
+    name = "com_github_julienschmidt_httprouter",
+    importpath = "github.com/julienschmidt/httprouter",
+    tag = "v1.2.0",
+)
+
+go_repository(
+    name = "com_github_kisielk_errcheck",
+    importpath = "github.com/kisielk/errcheck",
+    tag = "v1.2.0",
+)
+
+go_repository(
+    name = "com_github_konsorten_go_windows_terminal_sequences",
+    importpath = "github.com/konsorten/go-windows-terminal-sequences",
+    tag = "v1.0.1",
+)
+
+go_repository(
+    name = "com_github_kr_logfmt",
+    commit = "b84e30acd515",
+    importpath = "github.com/kr/logfmt",
+)
+
+go_repository(
+    name = "com_github_liggitt_tabwriter",
+    commit = "89fcab3d43de",
+    importpath = "github.com/liggitt/tabwriter",
+)
+
+go_repository(
+    name = "com_github_lithammer_dedent",
+    importpath = "github.com/lithammer/dedent",
+    tag = "v1.1.0",
+)
+
+go_repository(
+    name = "com_github_magiconair_properties",
+    importpath = "github.com/magiconair/properties",
+    tag = "v1.8.0",
+)
+
+go_repository(
+    name = "com_github_makenowjust_heredoc",
+    commit = "bb23615498cd",
+    importpath = "github.com/MakeNowJust/heredoc",
+)
+
+go_repository(
+    name = "com_github_mattn_go_colorable",
+    importpath = "github.com/mattn/go-colorable",
+    tag = "v0.0.9",
+)
+
+go_repository(
+    name = "com_github_mattn_go_runewidth",
+    importpath = "github.com/mattn/go-runewidth",
+    tag = "v0.0.2",
+)
+
+go_repository(
+    name = "com_github_mitchellh_go_homedir",
+    importpath = "github.com/mitchellh/go-homedir",
+    tag = "v1.1.0",
+)
+
+go_repository(
+    name = "com_github_morikuni_aec",
+    importpath = "github.com/morikuni/aec",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_munnerz_goautoneg",
+    commit = "a7dc8b61c822",
+    importpath = "github.com/munnerz/goautoneg",
+)
+
+go_repository(
+    name = "com_github_mwitkow_go_conntrack",
+    commit = "cc309e4a2223",
+    importpath = "github.com/mwitkow/go-conntrack",
+)
+
+go_repository(
+    name = "com_github_mxk_go_flowrate",
+    commit = "cca7078d478f",
+    importpath = "github.com/mxk/go-flowrate",
+)
+
+go_repository(
+    name = "com_github_nytimes_gziphandler",
+    commit = "56545f4a5d46",
+    importpath = "github.com/NYTimes/gziphandler",
+)
+
+go_repository(
+    name = "com_github_olekukonko_tablewriter",
+    commit = "a0225b3f23b5",
+    importpath = "github.com/olekukonko/tablewriter",
+)
+
+go_repository(
+    name = "com_github_pelletier_go_toml",
+    importpath = "github.com/pelletier/go-toml",
+    tag = "v1.2.0",
+)
+
+go_repository(
+    name = "com_github_pquerna_cachecontrol",
+    commit = "0dec1b30a021",
+    importpath = "github.com/pquerna/cachecontrol",
+)
+
+go_repository(
+    name = "com_github_remyoudompheng_bigfft",
+    commit = "52369c62f446",
+    importpath = "github.com/remyoudompheng/bigfft",
+)
+
+go_repository(
+    name = "com_github_rogpeppe_fastuuid",
+    commit = "6724a57986af",
+    importpath = "github.com/rogpeppe/fastuuid",
+)
+
+go_repository(
+    name = "com_github_russross_blackfriday",
+    importpath = "github.com/russross/blackfriday",
+    tag = "v1.5.2",
+)
+
+go_repository(
+    name = "com_github_soheilhy_cmux",
+    importpath = "github.com/soheilhy/cmux",
+    tag = "v0.1.4",
+)
+
+go_repository(
+    name = "com_github_spf13_afero",
+    importpath = "github.com/spf13/afero",
+    tag = "v1.2.2",
+)
+
+go_repository(
+    name = "com_github_spf13_cast",
+    importpath = "github.com/spf13/cast",
+    tag = "v1.3.0",
+)
+
+go_repository(
+    name = "com_github_spf13_jwalterweatherman",
+    importpath = "github.com/spf13/jwalterweatherman",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "com_github_spf13_viper",
+    importpath = "github.com/spf13/viper",
+    tag = "v1.3.2",
+)
+
+go_repository(
+    name = "com_github_tmc_grpc_websocket_proxy",
+    commit = "89b8d40f7ca8",
+    importpath = "github.com/tmc/grpc-websocket-proxy",
+)
+
+go_repository(
+    name = "com_github_ugorji_go_codec",
+    commit = "d75b2dcb6bc8",
+    importpath = "github.com/ugorji/go/codec",
+)
+
+go_repository(
+    name = "com_github_xiang90_probing",
+    commit = "43a291ad63a2",
+    importpath = "github.com/xiang90/probing",
+)
+
+go_repository(
+    name = "com_github_xlab_handysort",
+    commit = "fb3537ed64a1",
+    importpath = "github.com/xlab/handysort",
+)
+
+go_repository(
+    name = "com_github_xordataexchange_crypt",
+    commit = "b2862e3d0a77",
+    importpath = "github.com/xordataexchange/crypt",
+)
+
+go_repository(
+    name = "in_gopkg_alecthomas_kingpin_v2",
+    importpath = "gopkg.in/alecthomas/kingpin.v2",
+    tag = "v2.2.6",
+)
+
+go_repository(
+    name = "in_gopkg_cheggaaa_pb_v1",
+    importpath = "gopkg.in/cheggaaa/pb.v1",
+    tag = "v1.0.25",
+)
+
+go_repository(
+    name = "in_gopkg_natefinch_lumberjack_v2",
+    importpath = "gopkg.in/natefinch/lumberjack.v2",
+    tag = "v2.0.0",
+)
+
+go_repository(
+    name = "in_gopkg_resty_v1",
+    importpath = "gopkg.in/resty.v1",
+    tag = "v1.12.0",
+)
+
+go_repository(
+    name = "in_gopkg_square_go_jose_v2",
+    importpath = "gopkg.in/square/go-jose.v2",
+    tag = "v2.2.2",
+)
+
+go_repository(
+    name = "io_etcd_go_bbolt",
+    importpath = "go.etcd.io/bbolt",
+    tag = "v1.3.3",
+)
+
+go_repository(
+    name = "io_etcd_go_etcd",
+    commit = "3cf2f69b5738",
+    importpath = "go.etcd.io/etcd",
+)
+
+go_repository(
+    name = "io_k8s_apiserver",
+    commit = "f2537b84c964",
+    importpath = "k8s.io/apiserver",
+)
+
+go_repository(
+    name = "io_k8s_cli_runtime",
+    commit = "ec04ad4dbd24",
+    importpath = "k8s.io/cli-runtime",
+)
+
+go_repository(
+    name = "io_k8s_code_generator",
+    commit = "2a85f169f05f",
+    importpath = "k8s.io/code-generator",
+)
+
+go_repository(
+    name = "io_k8s_component_base",
+    commit = "ea09a2678486",
+    importpath = "k8s.io/component-base",
+)
+
+go_repository(
+    name = "io_k8s_gengo",
+    commit = "26a664648505",
+    importpath = "k8s.io/gengo",
+)
+
+go_repository(
+    name = "io_k8s_kubectl",
+    commit = "fbc5d36fee2d",
+    importpath = "k8s.io/kubectl",
+)
+
+go_repository(
+    name = "io_k8s_metrics",
+    commit = "dea8d0e6b550",
+    importpath = "k8s.io/metrics",
+)
+
+go_repository(
+    name = "io_k8s_sigs_kustomize",
+    importpath = "sigs.k8s.io/kustomize",
+    tag = "v2.0.3",
+)
+
+go_repository(
+    name = "io_k8s_sigs_structured_merge_diff",
+    commit = "b1b620dd3f06",
+    importpath = "sigs.k8s.io/structured-merge-diff",
+)
+
+go_repository(
+    name = "org_golang_x_exp",
+    commit = "4b39c73a6495",
+    importpath = "golang.org/x/exp",
+)
+
+go_repository(
+    name = "org_golang_x_image",
+    commit = "0694c2d4d067",
+    importpath = "golang.org/x/image",
+)
+
+go_repository(
+    name = "org_golang_x_mobile",
+    commit = "d3739f865fa6",
+    importpath = "golang.org/x/mobile",
+)
+
+go_repository(
+    name = "org_golang_x_xerrors",
+    commit = "a985d3407aa7",
+    importpath = "golang.org/x/xerrors",
+)
+
+go_repository(
+    name = "org_gonum_v1_gonum",
+    commit = "3d26580ed485",
+    importpath = "gonum.org/v1/gonum",
+)
+
+go_repository(
+    name = "org_gonum_v1_netlib",
+    commit = "76723241ea4e",
+    importpath = "gonum.org/v1/netlib",
+)
+
+go_repository(
+    name = "org_modernc_cc",
+    importpath = "modernc.org/cc",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "org_modernc_golex",
+    importpath = "modernc.org/golex",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "org_modernc_mathutil",
+    importpath = "modernc.org/mathutil",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "org_modernc_strutil",
+    importpath = "modernc.org/strutil",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "org_modernc_xc",
+    importpath = "modernc.org/xc",
+    tag = "v1.0.0",
+)
+
+go_repository(
+    name = "org_uber_go_atomic",
+    importpath = "go.uber.org/atomic",
+    tag = "v1.3.2",
+)
+
+go_repository(
+    name = "org_uber_go_multierr",
+    importpath = "go.uber.org/multierr",
+    tag = "v1.1.0",
+)
+
+go_repository(
+    name = "org_uber_go_zap",
+    importpath = "go.uber.org/zap",
+    tag = "v1.10.0",
+)
diff --git a/cluster/tools/BUILD b/cluster/tools/BUILD
index de5c5b7..8e0900e 100644
--- a/cluster/tools/BUILD
+++ b/cluster/tools/BUILD
@@ -9,7 +9,7 @@
 
 copy_go_binary(
     name = "kubecfg",
-    src = "@com_github_ksonnet_kubecfg//:kubecfg",
+    src = "@com_github_bitnami_kubecfg//:kubecfg",
     visibility = ["//visibility:public"],
 )
 
diff --git a/third_party/go/opencensus-proto/BUILD b/third_party/go/opencensus-proto/BUILD
new file mode 100644
index 0000000..53b75e8
--- /dev/null
+++ b/third_party/go/opencensus-proto/BUILD
@@ -0,0 +1 @@
+# Stay away Gazelle. (this files tells Gazelle to ignore it)
diff --git a/third_party/go/opencensus-proto/README.md b/third_party/go/opencensus-proto/README.md
new file mode 100644
index 0000000..c109667
--- /dev/null
+++ b/third_party/go/opencensus-proto/README.md
@@ -0,0 +1,5 @@
+From github.com/census-instrumentation/opencensus-proto.
+
+Why is this vendored? https://github.com/census-instrumentation/opencensus-proto/issues/200
+
+Hopefully we can get rid of this at some point.
diff --git a/third_party/go/opencensus-proto/WORKSPACE b/third_party/go/opencensus-proto/WORKSPACE
new file mode 100644
index 0000000..081ae17
--- /dev/null
+++ b/third_party/go/opencensus-proto/WORKSPACE
@@ -0,0 +1 @@
+workspace(name = "com_github_census_instrumentation_opencensus_proto")
diff --git a/third_party/go/opencensus-proto/gen-go/agent/common/v1/BUILD.bazel b/third_party/go/opencensus-proto/gen-go/agent/common/v1/BUILD.bazel
new file mode 100644
index 0000000..45c9cf3
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/agent/common/v1/BUILD.bazel
@@ -0,0 +1,12 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["common.pb.go"],
+    importpath = "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1",
+    visibility = ["//visibility:public"],
+    deps = [
+        "@com_github_golang_protobuf//proto:go_default_library",
+        "@io_bazel_rules_go//proto/wkt:timestamp_go_proto",
+    ],
+)
diff --git a/third_party/go/opencensus-proto/gen-go/agent/common/v1/common.pb.go b/third_party/go/opencensus-proto/gen-go/agent/common/v1/common.pb.go
new file mode 100644
index 0000000..a6f0feb
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/agent/common/v1/common.pb.go
@@ -0,0 +1,361 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: opencensus/proto/agent/common/v1/common.proto
+
+package v1
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type LibraryInfo_Language int32
+
+const (
+	LibraryInfo_LANGUAGE_UNSPECIFIED LibraryInfo_Language = 0
+	LibraryInfo_CPP                  LibraryInfo_Language = 1
+	LibraryInfo_C_SHARP              LibraryInfo_Language = 2
+	LibraryInfo_ERLANG               LibraryInfo_Language = 3
+	LibraryInfo_GO_LANG              LibraryInfo_Language = 4
+	LibraryInfo_JAVA                 LibraryInfo_Language = 5
+	LibraryInfo_NODE_JS              LibraryInfo_Language = 6
+	LibraryInfo_PHP                  LibraryInfo_Language = 7
+	LibraryInfo_PYTHON               LibraryInfo_Language = 8
+	LibraryInfo_RUBY                 LibraryInfo_Language = 9
+	LibraryInfo_WEB_JS               LibraryInfo_Language = 10
+)
+
+var LibraryInfo_Language_name = map[int32]string{
+	0:  "LANGUAGE_UNSPECIFIED",
+	1:  "CPP",
+	2:  "C_SHARP",
+	3:  "ERLANG",
+	4:  "GO_LANG",
+	5:  "JAVA",
+	6:  "NODE_JS",
+	7:  "PHP",
+	8:  "PYTHON",
+	9:  "RUBY",
+	10: "WEB_JS",
+}
+
+var LibraryInfo_Language_value = map[string]int32{
+	"LANGUAGE_UNSPECIFIED": 0,
+	"CPP":                  1,
+	"C_SHARP":              2,
+	"ERLANG":               3,
+	"GO_LANG":              4,
+	"JAVA":                 5,
+	"NODE_JS":              6,
+	"PHP":                  7,
+	"PYTHON":               8,
+	"RUBY":                 9,
+	"WEB_JS":               10,
+}
+
+func (x LibraryInfo_Language) String() string {
+	return proto.EnumName(LibraryInfo_Language_name, int32(x))
+}
+
+func (LibraryInfo_Language) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_126c72ed8a252c84, []int{2, 0}
+}
+
+// Identifier metadata of the Node that produces the span or tracing data.
+// Note, this is not the metadata about the Node or service that is described by associated spans.
+// In the future we plan to extend the identifier proto definition to support
+// additional information (e.g cloud id, etc.)
+type Node struct {
+	// Identifier that uniquely identifies a process within a VM/container.
+	Identifier *ProcessIdentifier `protobuf:"bytes,1,opt,name=identifier,proto3" json:"identifier,omitempty"`
+	// Information on the OpenCensus Library that initiates the stream.
+	LibraryInfo *LibraryInfo `protobuf:"bytes,2,opt,name=library_info,json=libraryInfo,proto3" json:"library_info,omitempty"`
+	// Additional information on service.
+	ServiceInfo *ServiceInfo `protobuf:"bytes,3,opt,name=service_info,json=serviceInfo,proto3" json:"service_info,omitempty"`
+	// Additional attributes.
+	Attributes           map[string]string `protobuf:"bytes,4,rep,name=attributes,proto3" json:"attributes,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *Node) Reset()         { *m = Node{} }
+func (m *Node) String() string { return proto.CompactTextString(m) }
+func (*Node) ProtoMessage()    {}
+func (*Node) Descriptor() ([]byte, []int) {
+	return fileDescriptor_126c72ed8a252c84, []int{0}
+}
+
+func (m *Node) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Node.Unmarshal(m, b)
+}
+func (m *Node) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Node.Marshal(b, m, deterministic)
+}
+func (m *Node) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Node.Merge(m, src)
+}
+func (m *Node) XXX_Size() int {
+	return xxx_messageInfo_Node.Size(m)
+}
+func (m *Node) XXX_DiscardUnknown() {
+	xxx_messageInfo_Node.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Node proto.InternalMessageInfo
+
+func (m *Node) GetIdentifier() *ProcessIdentifier {
+	if m != nil {
+		return m.Identifier
+	}
+	return nil
+}
+
+func (m *Node) GetLibraryInfo() *LibraryInfo {
+	if m != nil {
+		return m.LibraryInfo
+	}
+	return nil
+}
+
+func (m *Node) GetServiceInfo() *ServiceInfo {
+	if m != nil {
+		return m.ServiceInfo
+	}
+	return nil
+}
+
+func (m *Node) GetAttributes() map[string]string {
+	if m != nil {
+		return m.Attributes
+	}
+	return nil
+}
+
+// Identifier that uniquely identifies a process within a VM/container.
+type ProcessIdentifier struct {
+	// The host name. Usually refers to the machine/container name.
+	// For example: os.Hostname() in Go, socket.gethostname() in Python.
+	HostName string `protobuf:"bytes,1,opt,name=host_name,json=hostName,proto3" json:"host_name,omitempty"`
+	// Process id.
+	Pid uint32 `protobuf:"varint,2,opt,name=pid,proto3" json:"pid,omitempty"`
+	// Start time of this ProcessIdentifier. Represented in epoch time.
+	StartTimestamp       *timestamp.Timestamp `protobuf:"bytes,3,opt,name=start_timestamp,json=startTimestamp,proto3" json:"start_timestamp,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *ProcessIdentifier) Reset()         { *m = ProcessIdentifier{} }
+func (m *ProcessIdentifier) String() string { return proto.CompactTextString(m) }
+func (*ProcessIdentifier) ProtoMessage()    {}
+func (*ProcessIdentifier) Descriptor() ([]byte, []int) {
+	return fileDescriptor_126c72ed8a252c84, []int{1}
+}
+
+func (m *ProcessIdentifier) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProcessIdentifier.Unmarshal(m, b)
+}
+func (m *ProcessIdentifier) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProcessIdentifier.Marshal(b, m, deterministic)
+}
+func (m *ProcessIdentifier) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProcessIdentifier.Merge(m, src)
+}
+func (m *ProcessIdentifier) XXX_Size() int {
+	return xxx_messageInfo_ProcessIdentifier.Size(m)
+}
+func (m *ProcessIdentifier) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProcessIdentifier.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProcessIdentifier proto.InternalMessageInfo
+
+func (m *ProcessIdentifier) GetHostName() string {
+	if m != nil {
+		return m.HostName
+	}
+	return ""
+}
+
+func (m *ProcessIdentifier) GetPid() uint32 {
+	if m != nil {
+		return m.Pid
+	}
+	return 0
+}
+
+func (m *ProcessIdentifier) GetStartTimestamp() *timestamp.Timestamp {
+	if m != nil {
+		return m.StartTimestamp
+	}
+	return nil
+}
+
+// Information on OpenCensus Library.
+type LibraryInfo struct {
+	// Language of OpenCensus Library.
+	Language LibraryInfo_Language `protobuf:"varint,1,opt,name=language,proto3,enum=opencensus.proto.agent.common.v1.LibraryInfo_Language" json:"language,omitempty"`
+	// Version of Agent exporter of Library.
+	ExporterVersion string `protobuf:"bytes,2,opt,name=exporter_version,json=exporterVersion,proto3" json:"exporter_version,omitempty"`
+	// Version of OpenCensus Library.
+	CoreLibraryVersion   string   `protobuf:"bytes,3,opt,name=core_library_version,json=coreLibraryVersion,proto3" json:"core_library_version,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LibraryInfo) Reset()         { *m = LibraryInfo{} }
+func (m *LibraryInfo) String() string { return proto.CompactTextString(m) }
+func (*LibraryInfo) ProtoMessage()    {}
+func (*LibraryInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_126c72ed8a252c84, []int{2}
+}
+
+func (m *LibraryInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LibraryInfo.Unmarshal(m, b)
+}
+func (m *LibraryInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LibraryInfo.Marshal(b, m, deterministic)
+}
+func (m *LibraryInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LibraryInfo.Merge(m, src)
+}
+func (m *LibraryInfo) XXX_Size() int {
+	return xxx_messageInfo_LibraryInfo.Size(m)
+}
+func (m *LibraryInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_LibraryInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LibraryInfo proto.InternalMessageInfo
+
+func (m *LibraryInfo) GetLanguage() LibraryInfo_Language {
+	if m != nil {
+		return m.Language
+	}
+	return LibraryInfo_LANGUAGE_UNSPECIFIED
+}
+
+func (m *LibraryInfo) GetExporterVersion() string {
+	if m != nil {
+		return m.ExporterVersion
+	}
+	return ""
+}
+
+func (m *LibraryInfo) GetCoreLibraryVersion() string {
+	if m != nil {
+		return m.CoreLibraryVersion
+	}
+	return ""
+}
+
+// Additional service information.
+type ServiceInfo struct {
+	// Name of the service.
+	Name                 string   `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ServiceInfo) Reset()         { *m = ServiceInfo{} }
+func (m *ServiceInfo) String() string { return proto.CompactTextString(m) }
+func (*ServiceInfo) ProtoMessage()    {}
+func (*ServiceInfo) Descriptor() ([]byte, []int) {
+	return fileDescriptor_126c72ed8a252c84, []int{3}
+}
+
+func (m *ServiceInfo) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ServiceInfo.Unmarshal(m, b)
+}
+func (m *ServiceInfo) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ServiceInfo.Marshal(b, m, deterministic)
+}
+func (m *ServiceInfo) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ServiceInfo.Merge(m, src)
+}
+func (m *ServiceInfo) XXX_Size() int {
+	return xxx_messageInfo_ServiceInfo.Size(m)
+}
+func (m *ServiceInfo) XXX_DiscardUnknown() {
+	xxx_messageInfo_ServiceInfo.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ServiceInfo proto.InternalMessageInfo
+
+func (m *ServiceInfo) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func init() {
+	proto.RegisterEnum("opencensus.proto.agent.common.v1.LibraryInfo_Language", LibraryInfo_Language_name, LibraryInfo_Language_value)
+	proto.RegisterType((*Node)(nil), "opencensus.proto.agent.common.v1.Node")
+	proto.RegisterMapType((map[string]string)(nil), "opencensus.proto.agent.common.v1.Node.AttributesEntry")
+	proto.RegisterType((*ProcessIdentifier)(nil), "opencensus.proto.agent.common.v1.ProcessIdentifier")
+	proto.RegisterType((*LibraryInfo)(nil), "opencensus.proto.agent.common.v1.LibraryInfo")
+	proto.RegisterType((*ServiceInfo)(nil), "opencensus.proto.agent.common.v1.ServiceInfo")
+}
+
+func init() {
+	proto.RegisterFile("opencensus/proto/agent/common/v1/common.proto", fileDescriptor_126c72ed8a252c84)
+}
+
+var fileDescriptor_126c72ed8a252c84 = []byte{
+	// 618 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x94, 0x4f, 0x6e, 0xda, 0x4e,
+	0x14, 0xc7, 0x7f, 0xc6, 0x24, 0x81, 0xe7, 0x5f, 0x13, 0x77, 0x94, 0x05, 0x4a, 0x17, 0xa5, 0x74,
+	0x93, 0x2e, 0xb0, 0x9b, 0x44, 0xaa, 0xaa, 0x4a, 0x5d, 0x18, 0xe2, 0x26, 0x44, 0x11, 0x58, 0x26,
+	0xa1, 0x4a, 0x37, 0x96, 0x21, 0x83, 0x33, 0x2a, 0x9e, 0x41, 0xe3, 0x31, 0x2a, 0x27, 0xe8, 0x09,
+	0xda, 0x03, 0xf4, 0x50, 0x3d, 0x44, 0x4f, 0x51, 0xcd, 0x8c, 0x01, 0xab, 0x59, 0x90, 0xdd, 0xfb,
+	0xf3, 0xfd, 0x7e, 0x9e, 0xf5, 0xe6, 0xc9, 0xd0, 0x66, 0x73, 0x4c, 0x27, 0x98, 0x66, 0x79, 0xe6,
+	0xce, 0x39, 0x13, 0xcc, 0x8d, 0x13, 0x4c, 0x85, 0x3b, 0x61, 0x69, 0xca, 0xa8, 0xbb, 0x38, 0x29,
+	0x22, 0x47, 0x35, 0x51, 0x73, 0x23, 0xd7, 0x15, 0x47, 0xc9, 0x9d, 0x42, 0xb4, 0x38, 0x39, 0x7a,
+	0x99, 0x30, 0x96, 0xcc, 0xb0, 0x86, 0x8d, 0xf3, 0xa9, 0x2b, 0x48, 0x8a, 0x33, 0x11, 0xa7, 0x73,
+	0x6d, 0x68, 0xfd, 0x34, 0xa1, 0xda, 0x67, 0xf7, 0x18, 0x0d, 0x01, 0xc8, 0x3d, 0xa6, 0x82, 0x4c,
+	0x09, 0xe6, 0x0d, 0xa3, 0x69, 0x1c, 0x5b, 0xa7, 0x67, 0xce, 0xb6, 0x01, 0x4e, 0xc0, 0xd9, 0x04,
+	0x67, 0x59, 0x6f, 0x6d, 0x0d, 0x4b, 0x18, 0x14, 0xc0, 0xff, 0x33, 0x32, 0xe6, 0x31, 0x5f, 0x46,
+	0x84, 0x4e, 0x59, 0xa3, 0xa2, 0xb0, 0xed, 0xed, 0xd8, 0x6b, 0xed, 0xea, 0xd1, 0x29, 0x0b, 0xad,
+	0xd9, 0x26, 0x91, 0xc4, 0x0c, 0xf3, 0x05, 0x99, 0x60, 0x4d, 0x34, 0x9f, 0x4a, 0x1c, 0x6a, 0x97,
+	0x26, 0x66, 0x9b, 0x04, 0x8d, 0x00, 0x62, 0x21, 0x38, 0x19, 0xe7, 0x02, 0x67, 0x8d, 0x6a, 0xd3,
+	0x3c, 0xb6, 0x4e, 0xdf, 0x6d, 0xe7, 0xc9, 0xa5, 0x39, 0xde, 0xda, 0xe8, 0x53, 0xc1, 0x97, 0x61,
+	0x89, 0x74, 0xf4, 0x11, 0x0e, 0xfe, 0x69, 0x23, 0x1b, 0xcc, 0xaf, 0x78, 0xa9, 0x96, 0x5b, 0x0f,
+	0x65, 0x88, 0x0e, 0x61, 0x67, 0x11, 0xcf, 0x72, 0xac, 0x36, 0x53, 0x0f, 0x75, 0xf2, 0xa1, 0xf2,
+	0xde, 0x68, 0x7d, 0x37, 0xe0, 0xf9, 0xa3, 0xe5, 0xa2, 0x17, 0x50, 0x7f, 0x60, 0x99, 0x88, 0x68,
+	0x9c, 0xe2, 0x82, 0x53, 0x93, 0x85, 0x7e, 0x9c, 0x62, 0x89, 0x9f, 0x93, 0x7b, 0x85, 0x7a, 0x16,
+	0xca, 0x10, 0x75, 0xe1, 0x20, 0x13, 0x31, 0x17, 0xd1, 0xfa, 0xd9, 0x8b, 0x85, 0x1d, 0x39, 0xfa,
+	0x30, 0x9c, 0xd5, 0x61, 0x38, 0x37, 0x2b, 0x45, 0xb8, 0xaf, 0x2c, 0xeb, 0xbc, 0xf5, 0xbb, 0x02,
+	0x56, 0xe9, 0x3d, 0x50, 0x08, 0xb5, 0x59, 0x4c, 0x93, 0x3c, 0x4e, 0xf4, 0x27, 0xec, 0x3f, 0x65,
+	0x5d, 0x25, 0x80, 0x73, 0x5d, 0xb8, 0xc3, 0x35, 0x07, 0xbd, 0x01, 0x1b, 0x7f, 0x9b, 0x33, 0x2e,
+	0x30, 0x8f, 0x16, 0x98, 0x67, 0x84, 0xd1, 0x62, 0x25, 0x07, 0xab, 0xfa, 0x48, 0x97, 0xd1, 0x5b,
+	0x38, 0x9c, 0x30, 0x8e, 0xa3, 0xd5, 0x61, 0xad, 0xe4, 0xa6, 0x92, 0x23, 0xd9, 0x2b, 0x86, 0x15,
+	0x8e, 0xd6, 0x0f, 0x03, 0x6a, 0xab, 0x99, 0xa8, 0x01, 0x87, 0xd7, 0x5e, 0xff, 0xe2, 0xd6, 0xbb,
+	0xf0, 0xa3, 0xdb, 0xfe, 0x30, 0xf0, 0xbb, 0xbd, 0x4f, 0x3d, 0xff, 0xdc, 0xfe, 0x0f, 0xed, 0x81,
+	0xd9, 0x0d, 0x02, 0xdb, 0x40, 0x16, 0xec, 0x75, 0xa3, 0xe1, 0xa5, 0x17, 0x06, 0x76, 0x05, 0x01,
+	0xec, 0xfa, 0xa1, 0x74, 0xd8, 0xa6, 0x6c, 0x5c, 0x0c, 0x22, 0x95, 0x54, 0x51, 0x0d, 0xaa, 0x57,
+	0xde, 0xc8, 0xb3, 0x77, 0x64, 0xb9, 0x3f, 0x38, 0xf7, 0xa3, 0xab, 0xa1, 0xbd, 0x2b, 0x29, 0xc1,
+	0x65, 0x60, 0xef, 0x49, 0x63, 0x70, 0x77, 0x73, 0x39, 0xe8, 0xdb, 0x35, 0xa9, 0x0d, 0x6f, 0x3b,
+	0x77, 0x76, 0x5d, 0x56, 0x3f, 0xfb, 0x1d, 0x29, 0x85, 0xd6, 0x2b, 0xb0, 0x4a, 0x57, 0x89, 0x10,
+	0x54, 0x4b, 0xcf, 0xaa, 0xe2, 0xce, 0x2f, 0x03, 0x5e, 0x13, 0xb6, 0x75, 0xbd, 0x1d, 0xab, 0xab,
+	0xc2, 0x40, 0x36, 0x03, 0xe3, 0x4b, 0x2f, 0x21, 0xe2, 0x21, 0x1f, 0x4b, 0x81, 0xab, 0x7d, 0x6d,
+	0x42, 0x33, 0xc1, 0xf3, 0x14, 0x53, 0x11, 0x0b, 0xc2, 0xa8, 0xbb, 0x41, 0xb6, 0xf5, 0x9f, 0x26,
+	0xc1, 0xb4, 0x9d, 0x3c, 0xfa, 0xe1, 0xfc, 0xa9, 0x34, 0x07, 0x73, 0x4c, 0xbb, 0x7a, 0xb8, 0xe2,
+	0x3b, 0x9e, 0x1a, 0xae, 0x27, 0x3a, 0xa3, 0x93, 0xf1, 0xae, 0x02, 0x9c, 0xfd, 0x0d, 0x00, 0x00,
+	0xff, 0xff, 0xe3, 0x53, 0x74, 0x5e, 0xbe, 0x04, 0x00, 0x00,
+}
diff --git a/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/BUILD.bazel b/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/BUILD.bazel
new file mode 100644
index 0000000..280baf5
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/BUILD.bazel
@@ -0,0 +1,17 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["metrics_service.pb.go"],
+    importpath = "github.com/census-instrumentation/opencensus-proto/gen-go/agent/metrics/v1",
+    visibility = ["//visibility:public"],
+    deps = [
+        "@com_github_census_instrumentation_opencensus_proto//gen-go/agent/common/v1:go_default_library",
+        "@com_github_census_instrumentation_opencensus_proto//gen-go/metrics/v1:go_default_library",
+        "@com_github_census_instrumentation_opencensus_proto//gen-go/resource/v1:go_default_library",
+        "@com_github_golang_protobuf//proto:go_default_library",
+        "@org_golang_google_grpc//:go_default_library",
+        "@org_golang_google_grpc//status:go_default_library",
+        "@org_golang_google_grpc//codes:go_default_library",
+    ],
+)
diff --git a/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.go b/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.go
new file mode 100644
index 0000000..5f222b4
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.go
@@ -0,0 +1,275 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: opencensus/proto/agent/metrics/v1/metrics_service.proto
+
+package v1
+
+import (
+	context "context"
+	fmt "fmt"
+	v1 "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1"
+	v11 "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1"
+	v12 "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
+	proto "github.com/golang/protobuf/proto"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type ExportMetricsServiceRequest struct {
+	// This is required only in the first message on the stream or if the
+	// previous sent ExportMetricsServiceRequest message has a different Node (e.g.
+	// when the same RPC is used to send Metrics from multiple Applications).
+	Node *v1.Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
+	// A list of metrics that belong to the last received Node.
+	Metrics []*v11.Metric `protobuf:"bytes,2,rep,name=metrics,proto3" json:"metrics,omitempty"`
+	// The resource for the metrics in this message that do not have an explicit
+	// resource set.
+	// If unset, the most recently set resource in the RPC stream applies. It is
+	// valid to never be set within a stream, e.g. when no resource info is known
+	// at all or when all sent metrics have an explicit resource set.
+	Resource             *v12.Resource `protobuf:"bytes,3,opt,name=resource,proto3" json:"resource,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *ExportMetricsServiceRequest) Reset()         { *m = ExportMetricsServiceRequest{} }
+func (m *ExportMetricsServiceRequest) String() string { return proto.CompactTextString(m) }
+func (*ExportMetricsServiceRequest) ProtoMessage()    {}
+func (*ExportMetricsServiceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_47e253a956287d04, []int{0}
+}
+
+func (m *ExportMetricsServiceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExportMetricsServiceRequest.Unmarshal(m, b)
+}
+func (m *ExportMetricsServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExportMetricsServiceRequest.Marshal(b, m, deterministic)
+}
+func (m *ExportMetricsServiceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExportMetricsServiceRequest.Merge(m, src)
+}
+func (m *ExportMetricsServiceRequest) XXX_Size() int {
+	return xxx_messageInfo_ExportMetricsServiceRequest.Size(m)
+}
+func (m *ExportMetricsServiceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExportMetricsServiceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExportMetricsServiceRequest proto.InternalMessageInfo
+
+func (m *ExportMetricsServiceRequest) GetNode() *v1.Node {
+	if m != nil {
+		return m.Node
+	}
+	return nil
+}
+
+func (m *ExportMetricsServiceRequest) GetMetrics() []*v11.Metric {
+	if m != nil {
+		return m.Metrics
+	}
+	return nil
+}
+
+func (m *ExportMetricsServiceRequest) GetResource() *v12.Resource {
+	if m != nil {
+		return m.Resource
+	}
+	return nil
+}
+
+type ExportMetricsServiceResponse struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ExportMetricsServiceResponse) Reset()         { *m = ExportMetricsServiceResponse{} }
+func (m *ExportMetricsServiceResponse) String() string { return proto.CompactTextString(m) }
+func (*ExportMetricsServiceResponse) ProtoMessage()    {}
+func (*ExportMetricsServiceResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_47e253a956287d04, []int{1}
+}
+
+func (m *ExportMetricsServiceResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExportMetricsServiceResponse.Unmarshal(m, b)
+}
+func (m *ExportMetricsServiceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExportMetricsServiceResponse.Marshal(b, m, deterministic)
+}
+func (m *ExportMetricsServiceResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExportMetricsServiceResponse.Merge(m, src)
+}
+func (m *ExportMetricsServiceResponse) XXX_Size() int {
+	return xxx_messageInfo_ExportMetricsServiceResponse.Size(m)
+}
+func (m *ExportMetricsServiceResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExportMetricsServiceResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExportMetricsServiceResponse proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterType((*ExportMetricsServiceRequest)(nil), "opencensus.proto.agent.metrics.v1.ExportMetricsServiceRequest")
+	proto.RegisterType((*ExportMetricsServiceResponse)(nil), "opencensus.proto.agent.metrics.v1.ExportMetricsServiceResponse")
+}
+
+func init() {
+	proto.RegisterFile("opencensus/proto/agent/metrics/v1/metrics_service.proto", fileDescriptor_47e253a956287d04)
+}
+
+var fileDescriptor_47e253a956287d04 = []byte{
+	// 361 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x92, 0x41, 0x4a, 0xc3, 0x40,
+	0x14, 0x86, 0x9d, 0x56, 0xaa, 0x4c, 0xc1, 0x45, 0xdc, 0x94, 0x2a, 0xd2, 0x56, 0x91, 0x8a, 0x64,
+	0x62, 0xea, 0x42, 0x10, 0x54, 0xac, 0xb8, 0x11, 0xd4, 0x12, 0xc1, 0x85, 0x1b, 0x69, 0xd3, 0x47,
+	0xcc, 0x22, 0x33, 0x71, 0x66, 0x12, 0xbc, 0x85, 0x77, 0x70, 0xef, 0x8d, 0x3c, 0x81, 0xa7, 0x90,
+	0xe4, 0x4d, 0x5a, 0x4a, 0x8c, 0x05, 0x77, 0x8f, 0xe4, 0xff, 0xfe, 0xf7, 0xff, 0x33, 0x43, 0x4f,
+	0x44, 0x0c, 0xdc, 0x07, 0xae, 0x12, 0xe5, 0xc4, 0x52, 0x68, 0xe1, 0x8c, 0x03, 0xe0, 0xda, 0x89,
+	0x40, 0xcb, 0xd0, 0x57, 0x4e, 0xea, 0x16, 0xe3, 0xb3, 0x02, 0x99, 0x86, 0x3e, 0xb0, 0x5c, 0x66,
+	0x75, 0xe7, 0x20, 0x7e, 0x61, 0x39, 0xc8, 0x8c, 0x9a, 0xa5, 0x6e, 0xdb, 0xae, 0xf0, 0xf6, 0x45,
+	0x14, 0x09, 0x9e, 0x59, 0xe3, 0x84, 0x7c, 0xfb, 0xa0, 0x24, 0x2f, 0x87, 0x30, 0xd2, 0xc3, 0x92,
+	0x54, 0x82, 0x12, 0x89, 0xf4, 0x21, 0xd3, 0x16, 0x33, 0x8a, 0x7b, 0x5f, 0x84, 0x6e, 0x5d, 0xbf,
+	0xc5, 0x42, 0xea, 0x5b, 0x34, 0x79, 0xc0, 0x22, 0x1e, 0xbc, 0x26, 0xa0, 0xb4, 0x75, 0x4a, 0x57,
+	0xb9, 0x98, 0x42, 0x8b, 0x74, 0x48, 0xbf, 0x39, 0xd8, 0x67, 0x15, 0xc5, 0x4c, 0xd6, 0xd4, 0x65,
+	0x77, 0x62, 0x0a, 0x5e, 0xce, 0x58, 0x67, 0x74, 0xcd, 0x24, 0x6b, 0xd5, 0x3a, 0xf5, 0x7e, 0x73,
+	0xb0, 0x5b, 0xc6, 0xe7, 0x27, 0xc2, 0x30, 0x80, 0x57, 0x30, 0xd6, 0x90, 0xae, 0x17, 0x61, 0x5b,
+	0xf5, 0xaa, 0xf5, 0xb3, 0x3a, 0xa9, 0xcb, 0x3c, 0x33, 0x7b, 0x33, 0xae, 0xb7, 0x43, 0xb7, 0x7f,
+	0x6f, 0xa7, 0x62, 0xc1, 0x15, 0x0c, 0x3e, 0x08, 0xdd, 0x58, 0xfc, 0x65, 0xbd, 0x13, 0xda, 0x40,
+	0xc6, 0x3a, 0x67, 0x4b, 0xef, 0x91, 0xfd, 0x71, 0x78, 0xed, 0x8b, 0x7f, 0xf3, 0x18, 0xaf, 0xb7,
+	0xd2, 0x27, 0x47, 0x64, 0xf8, 0x49, 0xe8, 0x5e, 0x28, 0x96, 0x7b, 0x0d, 0x37, 0x17, 0x6d, 0x46,
+	0x99, 0x6a, 0x44, 0x9e, 0x6e, 0x82, 0x50, 0xbf, 0x24, 0x93, 0xec, 0x92, 0x1c, 0x34, 0xb0, 0x43,
+	0xae, 0xb4, 0x4c, 0x22, 0xe0, 0x7a, 0xac, 0x43, 0xc1, 0x9d, 0xb9, 0xb7, 0x8d, 0x4f, 0x26, 0x00,
+	0x6e, 0x07, 0xe5, 0xf7, 0xfe, 0x5d, 0xeb, 0xde, 0xc7, 0xc0, 0xaf, 0x30, 0x46, 0xbe, 0x80, 0x5d,
+	0xe6, 0x31, 0xcc, 0x6a, 0xf6, 0xe8, 0x4e, 0x1a, 0xb9, 0xc5, 0xf1, 0x4f, 0x00, 0x00, 0x00, 0xff,
+	0xff, 0x19, 0x28, 0xa4, 0x50, 0x3f, 0x03, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// MetricsServiceClient is the client API for MetricsService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type MetricsServiceClient interface {
+	// For performance reasons, it is recommended to keep this RPC
+	// alive for the entire life of the application.
+	Export(ctx context.Context, opts ...grpc.CallOption) (MetricsService_ExportClient, error)
+}
+
+type metricsServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewMetricsServiceClient(cc *grpc.ClientConn) MetricsServiceClient {
+	return &metricsServiceClient{cc}
+}
+
+func (c *metricsServiceClient) Export(ctx context.Context, opts ...grpc.CallOption) (MetricsService_ExportClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_MetricsService_serviceDesc.Streams[0], "/opencensus.proto.agent.metrics.v1.MetricsService/Export", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &metricsServiceExportClient{stream}
+	return x, nil
+}
+
+type MetricsService_ExportClient interface {
+	Send(*ExportMetricsServiceRequest) error
+	Recv() (*ExportMetricsServiceResponse, error)
+	grpc.ClientStream
+}
+
+type metricsServiceExportClient struct {
+	grpc.ClientStream
+}
+
+func (x *metricsServiceExportClient) Send(m *ExportMetricsServiceRequest) error {
+	return x.ClientStream.SendMsg(m)
+}
+
+func (x *metricsServiceExportClient) Recv() (*ExportMetricsServiceResponse, error) {
+	m := new(ExportMetricsServiceResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// MetricsServiceServer is the server API for MetricsService service.
+type MetricsServiceServer interface {
+	// For performance reasons, it is recommended to keep this RPC
+	// alive for the entire life of the application.
+	Export(MetricsService_ExportServer) error
+}
+
+// UnimplementedMetricsServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedMetricsServiceServer struct {
+}
+
+func (*UnimplementedMetricsServiceServer) Export(srv MetricsService_ExportServer) error {
+	return status.Errorf(codes.Unimplemented, "method Export not implemented")
+}
+
+func RegisterMetricsServiceServer(s *grpc.Server, srv MetricsServiceServer) {
+	s.RegisterService(&_MetricsService_serviceDesc, srv)
+}
+
+func _MetricsService_Export_Handler(srv interface{}, stream grpc.ServerStream) error {
+	return srv.(MetricsServiceServer).Export(&metricsServiceExportServer{stream})
+}
+
+type MetricsService_ExportServer interface {
+	Send(*ExportMetricsServiceResponse) error
+	Recv() (*ExportMetricsServiceRequest, error)
+	grpc.ServerStream
+}
+
+type metricsServiceExportServer struct {
+	grpc.ServerStream
+}
+
+func (x *metricsServiceExportServer) Send(m *ExportMetricsServiceResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func (x *metricsServiceExportServer) Recv() (*ExportMetricsServiceRequest, error) {
+	m := new(ExportMetricsServiceRequest)
+	if err := x.ServerStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+var _MetricsService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "opencensus.proto.agent.metrics.v1.MetricsService",
+	HandlerType: (*MetricsServiceServer)(nil),
+	Methods:     []grpc.MethodDesc{},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "Export",
+			Handler:       _MetricsService_Export_Handler,
+			ServerStreams: true,
+			ClientStreams: true,
+		},
+	},
+	Metadata: "opencensus/proto/agent/metrics/v1/metrics_service.proto",
+}
diff --git a/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.gw.go b/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.gw.go
new file mode 100644
index 0000000..158c160
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.gw.go
@@ -0,0 +1,150 @@
+// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
+// source: opencensus/proto/agent/metrics/v1/metrics_service.proto
+
+/*
+Package v1 is a reverse proxy.
+
+It translates gRPC into RESTful JSON APIs.
+*/
+package v1
+
+import (
+	"context"
+	"io"
+	"net/http"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/grpc-ecosystem/grpc-gateway/runtime"
+	"github.com/grpc-ecosystem/grpc-gateway/utilities"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/grpclog"
+	"google.golang.org/grpc/status"
+)
+
+var _ codes.Code
+var _ io.Reader
+var _ status.Status
+var _ = runtime.String
+var _ = utilities.NewDoubleArray
+
+func request_MetricsService_Export_0(ctx context.Context, marshaler runtime.Marshaler, client MetricsServiceClient, req *http.Request, pathParams map[string]string) (MetricsService_ExportClient, runtime.ServerMetadata, error) {
+	var metadata runtime.ServerMetadata
+	stream, err := client.Export(ctx)
+	if err != nil {
+		grpclog.Infof("Failed to start streaming: %v", err)
+		return nil, metadata, err
+	}
+	dec := marshaler.NewDecoder(req.Body)
+	handleSend := func() error {
+		var protoReq ExportMetricsServiceRequest
+		err := dec.Decode(&protoReq)
+		if err == io.EOF {
+			return err
+		}
+		if err != nil {
+			grpclog.Infof("Failed to decode request: %v", err)
+			return err
+		}
+		if err := stream.Send(&protoReq); err != nil {
+			grpclog.Infof("Failed to send request: %v", err)
+			return err
+		}
+		return nil
+	}
+	if err := handleSend(); err != nil {
+		if cerr := stream.CloseSend(); cerr != nil {
+			grpclog.Infof("Failed to terminate client stream: %v", cerr)
+		}
+		if err == io.EOF {
+			return stream, metadata, nil
+		}
+		return nil, metadata, err
+	}
+	go func() {
+		for {
+			if err := handleSend(); err != nil {
+				break
+			}
+		}
+		if err := stream.CloseSend(); err != nil {
+			grpclog.Infof("Failed to terminate client stream: %v", err)
+		}
+	}()
+	header, err := stream.Header()
+	if err != nil {
+		grpclog.Infof("Failed to get header from client: %v", err)
+		return nil, metadata, err
+	}
+	metadata.HeaderMD = header
+	return stream, metadata, nil
+}
+
+// RegisterMetricsServiceHandlerFromEndpoint is same as RegisterMetricsServiceHandler but
+// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
+func RegisterMetricsServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
+	conn, err := grpc.Dial(endpoint, opts...)
+	if err != nil {
+		return err
+	}
+	defer func() {
+		if err != nil {
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+			return
+		}
+		go func() {
+			<-ctx.Done()
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+		}()
+	}()
+
+	return RegisterMetricsServiceHandler(ctx, mux, conn)
+}
+
+// RegisterMetricsServiceHandler registers the http handlers for service MetricsService to "mux".
+// The handlers forward requests to the grpc endpoint over "conn".
+func RegisterMetricsServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
+	return RegisterMetricsServiceHandlerClient(ctx, mux, NewMetricsServiceClient(conn))
+}
+
+// RegisterMetricsServiceHandlerClient registers the http handlers for service MetricsService
+// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "MetricsServiceClient".
+// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "MetricsServiceClient"
+// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
+// "MetricsServiceClient" to call the correct interceptors.
+func RegisterMetricsServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client MetricsServiceClient) error {
+
+	mux.Handle("POST", pattern_MetricsService_Export_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_MetricsService_Export_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_MetricsService_Export_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...)
+
+	})
+
+	return nil
+}
+
+var (
+	pattern_MetricsService_Export_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "metrics"}, ""))
+)
+
+var (
+	forward_MetricsService_Export_0 = runtime.ForwardResponseStream
+)
diff --git a/third_party/go/opencensus-proto/gen-go/agent/trace/v1/BUILD.bazel b/third_party/go/opencensus-proto/gen-go/agent/trace/v1/BUILD.bazel
new file mode 100644
index 0000000..9147599
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/agent/trace/v1/BUILD.bazel
@@ -0,0 +1,24 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = [
+        "trace_service.pb.go",
+        "trace_service.pb.gw.go",
+    ],
+    importpath = "github.com/census-instrumentation/opencensus-proto/gen-go/agent/trace/v1",
+    visibility = ["//visibility:public"],
+    deps = [
+        "@com_github_census_instrumentation_opencensus_proto//gen-go/agent/common/v1:go_default_library",
+        "@com_github_census_instrumentation_opencensus_proto//gen-go/resource/v1:go_default_library",
+        "@com_github_census_instrumentation_opencensus_proto//gen-go/trace/v1:go_default_library",
+        "@com_github_golang_protobuf//proto:go_default_library",
+        "@com_github_grpc_ecosystem_grpc_gateway//runtime:go_default_library",
+        "@com_github_grpc_ecosystem_grpc_gateway//utilities:go_default_library",
+        "@org_golang_google_grpc//:go_default_library",
+        "@org_golang_google_grpc//codes:go_default_library",
+        "@org_golang_google_grpc//grpclog:go_default_library",
+        "@org_golang_google_grpc//status:go_default_library",
+        "@org_golang_x_net//context:go_default_library",
+    ],
+)
diff --git a/third_party/go/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.go b/third_party/go/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.go
new file mode 100644
index 0000000..a0a3504
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.go
@@ -0,0 +1,457 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: opencensus/proto/agent/trace/v1/trace_service.proto
+
+package v1
+
+import (
+	context "context"
+	fmt "fmt"
+	v1 "github.com/census-instrumentation/opencensus-proto/gen-go/agent/common/v1"
+	v12 "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
+	v11 "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1"
+	proto "github.com/golang/protobuf/proto"
+	grpc "google.golang.org/grpc"
+	codes "google.golang.org/grpc/codes"
+	status "google.golang.org/grpc/status"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type CurrentLibraryConfig struct {
+	// This is required only in the first message on the stream or if the
+	// previous sent CurrentLibraryConfig message has a different Node (e.g.
+	// when the same RPC is used to configure multiple Applications).
+	Node *v1.Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
+	// Current configuration.
+	Config               *v11.TraceConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
+}
+
+func (m *CurrentLibraryConfig) Reset()         { *m = CurrentLibraryConfig{} }
+func (m *CurrentLibraryConfig) String() string { return proto.CompactTextString(m) }
+func (*CurrentLibraryConfig) ProtoMessage()    {}
+func (*CurrentLibraryConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7027f99caf7ac6a5, []int{0}
+}
+
+func (m *CurrentLibraryConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CurrentLibraryConfig.Unmarshal(m, b)
+}
+func (m *CurrentLibraryConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CurrentLibraryConfig.Marshal(b, m, deterministic)
+}
+func (m *CurrentLibraryConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CurrentLibraryConfig.Merge(m, src)
+}
+func (m *CurrentLibraryConfig) XXX_Size() int {
+	return xxx_messageInfo_CurrentLibraryConfig.Size(m)
+}
+func (m *CurrentLibraryConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_CurrentLibraryConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CurrentLibraryConfig proto.InternalMessageInfo
+
+func (m *CurrentLibraryConfig) GetNode() *v1.Node {
+	if m != nil {
+		return m.Node
+	}
+	return nil
+}
+
+func (m *CurrentLibraryConfig) GetConfig() *v11.TraceConfig {
+	if m != nil {
+		return m.Config
+	}
+	return nil
+}
+
+type UpdatedLibraryConfig struct {
+	// This field is ignored when the RPC is used to configure only one Application.
+	// This is required only in the first message on the stream or if the
+	// previous sent UpdatedLibraryConfig message has a different Node.
+	Node *v1.Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
+	// Requested updated configuration.
+	Config               *v11.TraceConfig `protobuf:"bytes,2,opt,name=config,proto3" json:"config,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
+}
+
+func (m *UpdatedLibraryConfig) Reset()         { *m = UpdatedLibraryConfig{} }
+func (m *UpdatedLibraryConfig) String() string { return proto.CompactTextString(m) }
+func (*UpdatedLibraryConfig) ProtoMessage()    {}
+func (*UpdatedLibraryConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7027f99caf7ac6a5, []int{1}
+}
+
+func (m *UpdatedLibraryConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_UpdatedLibraryConfig.Unmarshal(m, b)
+}
+func (m *UpdatedLibraryConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_UpdatedLibraryConfig.Marshal(b, m, deterministic)
+}
+func (m *UpdatedLibraryConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_UpdatedLibraryConfig.Merge(m, src)
+}
+func (m *UpdatedLibraryConfig) XXX_Size() int {
+	return xxx_messageInfo_UpdatedLibraryConfig.Size(m)
+}
+func (m *UpdatedLibraryConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_UpdatedLibraryConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_UpdatedLibraryConfig proto.InternalMessageInfo
+
+func (m *UpdatedLibraryConfig) GetNode() *v1.Node {
+	if m != nil {
+		return m.Node
+	}
+	return nil
+}
+
+func (m *UpdatedLibraryConfig) GetConfig() *v11.TraceConfig {
+	if m != nil {
+		return m.Config
+	}
+	return nil
+}
+
+type ExportTraceServiceRequest struct {
+	// This is required only in the first message on the stream or if the
+	// previous sent ExportTraceServiceRequest message has a different Node (e.g.
+	// when the same RPC is used to send Spans from multiple Applications).
+	Node *v1.Node `protobuf:"bytes,1,opt,name=node,proto3" json:"node,omitempty"`
+	// A list of Spans that belong to the last received Node.
+	Spans []*v11.Span `protobuf:"bytes,2,rep,name=spans,proto3" json:"spans,omitempty"`
+	// The resource for the spans in this message that do not have an explicit
+	// resource set.
+	// If unset, the most recently set resource in the RPC stream applies. It is
+	// valid to never be set within a stream, e.g. when no resource info is known.
+	Resource             *v12.Resource `protobuf:"bytes,3,opt,name=resource,proto3" json:"resource,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *ExportTraceServiceRequest) Reset()         { *m = ExportTraceServiceRequest{} }
+func (m *ExportTraceServiceRequest) String() string { return proto.CompactTextString(m) }
+func (*ExportTraceServiceRequest) ProtoMessage()    {}
+func (*ExportTraceServiceRequest) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7027f99caf7ac6a5, []int{2}
+}
+
+func (m *ExportTraceServiceRequest) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExportTraceServiceRequest.Unmarshal(m, b)
+}
+func (m *ExportTraceServiceRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExportTraceServiceRequest.Marshal(b, m, deterministic)
+}
+func (m *ExportTraceServiceRequest) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExportTraceServiceRequest.Merge(m, src)
+}
+func (m *ExportTraceServiceRequest) XXX_Size() int {
+	return xxx_messageInfo_ExportTraceServiceRequest.Size(m)
+}
+func (m *ExportTraceServiceRequest) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExportTraceServiceRequest.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExportTraceServiceRequest proto.InternalMessageInfo
+
+func (m *ExportTraceServiceRequest) GetNode() *v1.Node {
+	if m != nil {
+		return m.Node
+	}
+	return nil
+}
+
+func (m *ExportTraceServiceRequest) GetSpans() []*v11.Span {
+	if m != nil {
+		return m.Spans
+	}
+	return nil
+}
+
+func (m *ExportTraceServiceRequest) GetResource() *v12.Resource {
+	if m != nil {
+		return m.Resource
+	}
+	return nil
+}
+
+type ExportTraceServiceResponse struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ExportTraceServiceResponse) Reset()         { *m = ExportTraceServiceResponse{} }
+func (m *ExportTraceServiceResponse) String() string { return proto.CompactTextString(m) }
+func (*ExportTraceServiceResponse) ProtoMessage()    {}
+func (*ExportTraceServiceResponse) Descriptor() ([]byte, []int) {
+	return fileDescriptor_7027f99caf7ac6a5, []int{3}
+}
+
+func (m *ExportTraceServiceResponse) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ExportTraceServiceResponse.Unmarshal(m, b)
+}
+func (m *ExportTraceServiceResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ExportTraceServiceResponse.Marshal(b, m, deterministic)
+}
+func (m *ExportTraceServiceResponse) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ExportTraceServiceResponse.Merge(m, src)
+}
+func (m *ExportTraceServiceResponse) XXX_Size() int {
+	return xxx_messageInfo_ExportTraceServiceResponse.Size(m)
+}
+func (m *ExportTraceServiceResponse) XXX_DiscardUnknown() {
+	xxx_messageInfo_ExportTraceServiceResponse.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ExportTraceServiceResponse proto.InternalMessageInfo
+
+func init() {
+	proto.RegisterType((*CurrentLibraryConfig)(nil), "opencensus.proto.agent.trace.v1.CurrentLibraryConfig")
+	proto.RegisterType((*UpdatedLibraryConfig)(nil), "opencensus.proto.agent.trace.v1.UpdatedLibraryConfig")
+	proto.RegisterType((*ExportTraceServiceRequest)(nil), "opencensus.proto.agent.trace.v1.ExportTraceServiceRequest")
+	proto.RegisterType((*ExportTraceServiceResponse)(nil), "opencensus.proto.agent.trace.v1.ExportTraceServiceResponse")
+}
+
+func init() {
+	proto.RegisterFile("opencensus/proto/agent/trace/v1/trace_service.proto", fileDescriptor_7027f99caf7ac6a5)
+}
+
+var fileDescriptor_7027f99caf7ac6a5 = []byte{
+	// 442 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x94, 0xcf, 0xaa, 0xd4, 0x30,
+	0x14, 0xc6, 0x4d, 0xaf, 0x16, 0xc9, 0x75, 0x63, 0x71, 0x51, 0x8b, 0x30, 0x97, 0x82, 0x32, 0xa0,
+	0x4d, 0xed, 0x5c, 0xee, 0xe6, 0x0a, 0x82, 0x33, 0x08, 0x2e, 0x44, 0x2f, 0x1d, 0x75, 0xe1, 0x66,
+	0xe8, 0xb4, 0xc7, 0xda, 0xc5, 0x24, 0x31, 0x49, 0x8b, 0x82, 0x7b, 0xf7, 0x2e, 0x7c, 0x03, 0x5f,
+	0xc8, 0xc7, 0xf0, 0x29, 0xa4, 0x39, 0x9d, 0x3f, 0x3a, 0x53, 0x0b, 0xba, 0xb9, 0xbb, 0x43, 0xf3,
+	0xfd, 0xbe, 0xf3, 0x25, 0x39, 0x29, 0x3d, 0x15, 0x12, 0x78, 0x0e, 0x5c, 0xd7, 0x3a, 0x96, 0x4a,
+	0x18, 0x11, 0x67, 0x25, 0x70, 0x13, 0x1b, 0x95, 0xe5, 0x10, 0x37, 0x09, 0x16, 0x0b, 0x0d, 0xaa,
+	0xa9, 0x72, 0x60, 0x56, 0xe2, 0x8d, 0xb6, 0x10, 0x7e, 0x61, 0x16, 0x62, 0x56, 0xcb, 0x9a, 0x24,
+	0x88, 0x7a, 0x5c, 0x73, 0xb1, 0x5a, 0x09, 0xde, 0xda, 0x62, 0x85, 0x74, 0x70, 0x7f, 0x4f, 0xae,
+	0x40, 0x8b, 0x5a, 0x61, 0x82, 0x75, 0xdd, 0x89, 0xef, 0xee, 0x89, 0x7f, 0xcf, 0xda, 0xc9, 0x1e,
+	0x0c, 0xc8, 0x16, 0xb9, 0xe0, 0xef, 0xaa, 0x12, 0xd5, 0xe1, 0x57, 0x42, 0x6f, 0xcd, 0x6a, 0xa5,
+	0x80, 0x9b, 0xe7, 0xd5, 0x52, 0x65, 0xea, 0xd3, 0xcc, 0x2e, 0x7b, 0xe7, 0xf4, 0x2a, 0x17, 0x05,
+	0xf8, 0xe4, 0x84, 0x8c, 0x8f, 0x27, 0xf7, 0x58, 0xcf, 0xce, 0xbb, 0xed, 0x34, 0x09, 0x7b, 0x21,
+	0x0a, 0x48, 0x2d, 0xe3, 0x3d, 0xa6, 0x2e, 0x36, 0xf1, 0x9d, 0x3e, 0x7a, 0x7d, 0x62, 0xec, 0x55,
+	0x5b, 0x60, 0xcf, 0xb4, 0xa3, 0x6c, 0xa8, 0xd7, 0xb2, 0xc8, 0x0c, 0x14, 0x97, 0x27, 0xd4, 0x0f,
+	0x42, 0x6f, 0x3f, 0xfd, 0x28, 0x85, 0x32, 0x76, 0x75, 0x8e, 0x83, 0x91, 0xc2, 0x87, 0x1a, 0xb4,
+	0xf9, 0xaf, 0x64, 0x67, 0xf4, 0x9a, 0x96, 0x19, 0xd7, 0xbe, 0x73, 0x72, 0x34, 0x3e, 0x9e, 0x8c,
+	0xfe, 0x12, 0x6c, 0x2e, 0x33, 0x9e, 0xa2, 0xda, 0x9b, 0xd2, 0xeb, 0xeb, 0x09, 0xf1, 0x8f, 0xfa,
+	0xda, 0x6e, 0x66, 0xa8, 0x49, 0x58, 0xda, 0xd5, 0xe9, 0x86, 0x0b, 0xef, 0xd0, 0xe0, 0xd0, 0x9e,
+	0xb4, 0x14, 0x5c, 0xc3, 0xe4, 0x9b, 0x43, 0x6f, 0xec, 0x2e, 0x78, 0x9f, 0xa9, 0xdb, 0xdd, 0xc4,
+	0x19, 0x1b, 0x78, 0x0a, 0xec, 0xd0, 0x54, 0x05, 0xc3, 0xd8, 0xa1, 0x7b, 0x0f, 0xaf, 0x8c, 0xc9,
+	0x43, 0xe2, 0x7d, 0x21, 0xd4, 0xc5, 0xb4, 0xde, 0xf9, 0xa0, 0x4f, 0xef, 0x55, 0x05, 0x8f, 0xfe,
+	0x89, 0xc5, 0x23, 0xc1, 0x24, 0xd3, 0xef, 0x84, 0x86, 0x95, 0x18, 0xf2, 0x99, 0xde, 0xdc, 0xb5,
+	0xb8, 0x68, 0x15, 0x17, 0xe4, 0xed, 0xb3, 0xb2, 0x32, 0xef, 0xeb, 0x65, 0x3b, 0x0a, 0x31, 0xc2,
+	0x51, 0xc5, 0xb5, 0x51, 0xf5, 0x0a, 0xb8, 0xc9, 0x4c, 0x25, 0x78, 0xbc, 0xf5, 0x8d, 0xf0, 0x05,
+	0x97, 0xc0, 0xa3, 0xf2, 0xcf, 0x3f, 0xd4, 0x4f, 0x67, 0xf4, 0x52, 0x02, 0x9f, 0x61, 0x00, 0x6b,
+	0xcf, 0x9e, 0xd8, 0x00, 0xb6, 0x2d, 0x7b, 0x93, 0x2c, 0x5d, 0x8b, 0x9f, 0xfe, 0x0a, 0x00, 0x00,
+	0xff, 0xff, 0x65, 0x76, 0xd7, 0xb9, 0xed, 0x04, 0x00, 0x00,
+}
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ context.Context
+var _ grpc.ClientConn
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the grpc package it is being compiled against.
+const _ = grpc.SupportPackageIsVersion4
+
+// TraceServiceClient is the client API for TraceService service.
+//
+// For semantics around ctx use and closing/ending streaming RPCs, please refer to https://godoc.org/google.golang.org/grpc#ClientConn.NewStream.
+type TraceServiceClient interface {
+	// After initialization, this RPC must be kept alive for the entire life of
+	// the application. The agent pushes configs down to applications via a
+	// stream.
+	Config(ctx context.Context, opts ...grpc.CallOption) (TraceService_ConfigClient, error)
+	// For performance reasons, it is recommended to keep this RPC
+	// alive for the entire life of the application.
+	Export(ctx context.Context, opts ...grpc.CallOption) (TraceService_ExportClient, error)
+}
+
+type traceServiceClient struct {
+	cc *grpc.ClientConn
+}
+
+func NewTraceServiceClient(cc *grpc.ClientConn) TraceServiceClient {
+	return &traceServiceClient{cc}
+}
+
+func (c *traceServiceClient) Config(ctx context.Context, opts ...grpc.CallOption) (TraceService_ConfigClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_TraceService_serviceDesc.Streams[0], "/opencensus.proto.agent.trace.v1.TraceService/Config", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &traceServiceConfigClient{stream}
+	return x, nil
+}
+
+type TraceService_ConfigClient interface {
+	Send(*CurrentLibraryConfig) error
+	Recv() (*UpdatedLibraryConfig, error)
+	grpc.ClientStream
+}
+
+type traceServiceConfigClient struct {
+	grpc.ClientStream
+}
+
+func (x *traceServiceConfigClient) Send(m *CurrentLibraryConfig) error {
+	return x.ClientStream.SendMsg(m)
+}
+
+func (x *traceServiceConfigClient) Recv() (*UpdatedLibraryConfig, error) {
+	m := new(UpdatedLibraryConfig)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func (c *traceServiceClient) Export(ctx context.Context, opts ...grpc.CallOption) (TraceService_ExportClient, error) {
+	stream, err := c.cc.NewStream(ctx, &_TraceService_serviceDesc.Streams[1], "/opencensus.proto.agent.trace.v1.TraceService/Export", opts...)
+	if err != nil {
+		return nil, err
+	}
+	x := &traceServiceExportClient{stream}
+	return x, nil
+}
+
+type TraceService_ExportClient interface {
+	Send(*ExportTraceServiceRequest) error
+	Recv() (*ExportTraceServiceResponse, error)
+	grpc.ClientStream
+}
+
+type traceServiceExportClient struct {
+	grpc.ClientStream
+}
+
+func (x *traceServiceExportClient) Send(m *ExportTraceServiceRequest) error {
+	return x.ClientStream.SendMsg(m)
+}
+
+func (x *traceServiceExportClient) Recv() (*ExportTraceServiceResponse, error) {
+	m := new(ExportTraceServiceResponse)
+	if err := x.ClientStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+// TraceServiceServer is the server API for TraceService service.
+type TraceServiceServer interface {
+	// After initialization, this RPC must be kept alive for the entire life of
+	// the application. The agent pushes configs down to applications via a
+	// stream.
+	Config(TraceService_ConfigServer) error
+	// For performance reasons, it is recommended to keep this RPC
+	// alive for the entire life of the application.
+	Export(TraceService_ExportServer) error
+}
+
+// UnimplementedTraceServiceServer can be embedded to have forward compatible implementations.
+type UnimplementedTraceServiceServer struct {
+}
+
+func (*UnimplementedTraceServiceServer) Config(srv TraceService_ConfigServer) error {
+	return status.Errorf(codes.Unimplemented, "method Config not implemented")
+}
+func (*UnimplementedTraceServiceServer) Export(srv TraceService_ExportServer) error {
+	return status.Errorf(codes.Unimplemented, "method Export not implemented")
+}
+
+func RegisterTraceServiceServer(s *grpc.Server, srv TraceServiceServer) {
+	s.RegisterService(&_TraceService_serviceDesc, srv)
+}
+
+func _TraceService_Config_Handler(srv interface{}, stream grpc.ServerStream) error {
+	return srv.(TraceServiceServer).Config(&traceServiceConfigServer{stream})
+}
+
+type TraceService_ConfigServer interface {
+	Send(*UpdatedLibraryConfig) error
+	Recv() (*CurrentLibraryConfig, error)
+	grpc.ServerStream
+}
+
+type traceServiceConfigServer struct {
+	grpc.ServerStream
+}
+
+func (x *traceServiceConfigServer) Send(m *UpdatedLibraryConfig) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func (x *traceServiceConfigServer) Recv() (*CurrentLibraryConfig, error) {
+	m := new(CurrentLibraryConfig)
+	if err := x.ServerStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+func _TraceService_Export_Handler(srv interface{}, stream grpc.ServerStream) error {
+	return srv.(TraceServiceServer).Export(&traceServiceExportServer{stream})
+}
+
+type TraceService_ExportServer interface {
+	Send(*ExportTraceServiceResponse) error
+	Recv() (*ExportTraceServiceRequest, error)
+	grpc.ServerStream
+}
+
+type traceServiceExportServer struct {
+	grpc.ServerStream
+}
+
+func (x *traceServiceExportServer) Send(m *ExportTraceServiceResponse) error {
+	return x.ServerStream.SendMsg(m)
+}
+
+func (x *traceServiceExportServer) Recv() (*ExportTraceServiceRequest, error) {
+	m := new(ExportTraceServiceRequest)
+	if err := x.ServerStream.RecvMsg(m); err != nil {
+		return nil, err
+	}
+	return m, nil
+}
+
+var _TraceService_serviceDesc = grpc.ServiceDesc{
+	ServiceName: "opencensus.proto.agent.trace.v1.TraceService",
+	HandlerType: (*TraceServiceServer)(nil),
+	Methods:     []grpc.MethodDesc{},
+	Streams: []grpc.StreamDesc{
+		{
+			StreamName:    "Config",
+			Handler:       _TraceService_Config_Handler,
+			ServerStreams: true,
+			ClientStreams: true,
+		},
+		{
+			StreamName:    "Export",
+			Handler:       _TraceService_Export_Handler,
+			ServerStreams: true,
+			ClientStreams: true,
+		},
+	},
+	Metadata: "opencensus/proto/agent/trace/v1/trace_service.proto",
+}
diff --git a/third_party/go/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.gw.go b/third_party/go/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.gw.go
new file mode 100644
index 0000000..334331b
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.gw.go
@@ -0,0 +1,150 @@
+// Code generated by protoc-gen-grpc-gateway. DO NOT EDIT.
+// source: opencensus/proto/agent/trace/v1/trace_service.proto
+
+/*
+Package v1 is a reverse proxy.
+
+It translates gRPC into RESTful JSON APIs.
+*/
+package v1
+
+import (
+	"context"
+	"io"
+	"net/http"
+
+	"github.com/golang/protobuf/proto"
+	"github.com/grpc-ecosystem/grpc-gateway/runtime"
+	"github.com/grpc-ecosystem/grpc-gateway/utilities"
+	"google.golang.org/grpc"
+	"google.golang.org/grpc/codes"
+	"google.golang.org/grpc/grpclog"
+	"google.golang.org/grpc/status"
+)
+
+var _ codes.Code
+var _ io.Reader
+var _ status.Status
+var _ = runtime.String
+var _ = utilities.NewDoubleArray
+
+func request_TraceService_Export_0(ctx context.Context, marshaler runtime.Marshaler, client TraceServiceClient, req *http.Request, pathParams map[string]string) (TraceService_ExportClient, runtime.ServerMetadata, error) {
+	var metadata runtime.ServerMetadata
+	stream, err := client.Export(ctx)
+	if err != nil {
+		grpclog.Infof("Failed to start streaming: %v", err)
+		return nil, metadata, err
+	}
+	dec := marshaler.NewDecoder(req.Body)
+	handleSend := func() error {
+		var protoReq ExportTraceServiceRequest
+		err := dec.Decode(&protoReq)
+		if err == io.EOF {
+			return err
+		}
+		if err != nil {
+			grpclog.Infof("Failed to decode request: %v", err)
+			return err
+		}
+		if err := stream.Send(&protoReq); err != nil {
+			grpclog.Infof("Failed to send request: %v", err)
+			return err
+		}
+		return nil
+	}
+	if err := handleSend(); err != nil {
+		if cerr := stream.CloseSend(); cerr != nil {
+			grpclog.Infof("Failed to terminate client stream: %v", cerr)
+		}
+		if err == io.EOF {
+			return stream, metadata, nil
+		}
+		return nil, metadata, err
+	}
+	go func() {
+		for {
+			if err := handleSend(); err != nil {
+				break
+			}
+		}
+		if err := stream.CloseSend(); err != nil {
+			grpclog.Infof("Failed to terminate client stream: %v", err)
+		}
+	}()
+	header, err := stream.Header()
+	if err != nil {
+		grpclog.Infof("Failed to get header from client: %v", err)
+		return nil, metadata, err
+	}
+	metadata.HeaderMD = header
+	return stream, metadata, nil
+}
+
+// RegisterTraceServiceHandlerFromEndpoint is same as RegisterTraceServiceHandler but
+// automatically dials to "endpoint" and closes the connection when "ctx" gets done.
+func RegisterTraceServiceHandlerFromEndpoint(ctx context.Context, mux *runtime.ServeMux, endpoint string, opts []grpc.DialOption) (err error) {
+	conn, err := grpc.Dial(endpoint, opts...)
+	if err != nil {
+		return err
+	}
+	defer func() {
+		if err != nil {
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+			return
+		}
+		go func() {
+			<-ctx.Done()
+			if cerr := conn.Close(); cerr != nil {
+				grpclog.Infof("Failed to close conn to %s: %v", endpoint, cerr)
+			}
+		}()
+	}()
+
+	return RegisterTraceServiceHandler(ctx, mux, conn)
+}
+
+// RegisterTraceServiceHandler registers the http handlers for service TraceService to "mux".
+// The handlers forward requests to the grpc endpoint over "conn".
+func RegisterTraceServiceHandler(ctx context.Context, mux *runtime.ServeMux, conn *grpc.ClientConn) error {
+	return RegisterTraceServiceHandlerClient(ctx, mux, NewTraceServiceClient(conn))
+}
+
+// RegisterTraceServiceHandlerClient registers the http handlers for service TraceService
+// to "mux". The handlers forward requests to the grpc endpoint over the given implementation of "TraceServiceClient".
+// Note: the gRPC framework executes interceptors within the gRPC handler. If the passed in "TraceServiceClient"
+// doesn't go through the normal gRPC flow (creating a gRPC client etc.) then it will be up to the passed in
+// "TraceServiceClient" to call the correct interceptors.
+func RegisterTraceServiceHandlerClient(ctx context.Context, mux *runtime.ServeMux, client TraceServiceClient) error {
+
+	mux.Handle("POST", pattern_TraceService_Export_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
+		ctx, cancel := context.WithCancel(req.Context())
+		defer cancel()
+		inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
+		rctx, err := runtime.AnnotateContext(ctx, mux, req)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+		resp, md, err := request_TraceService_Export_0(rctx, inboundMarshaler, client, req, pathParams)
+		ctx = runtime.NewServerMetadataContext(ctx, md)
+		if err != nil {
+			runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
+			return
+		}
+
+		forward_TraceService_Export_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...)
+
+	})
+
+	return nil
+}
+
+var (
+	pattern_TraceService_Export_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "trace"}, ""))
+)
+
+var (
+	forward_TraceService_Export_0 = runtime.ForwardResponseStream
+)
diff --git a/third_party/go/opencensus-proto/gen-go/metrics/v1/BUILD.bazel b/third_party/go/opencensus-proto/gen-go/metrics/v1/BUILD.bazel
new file mode 100644
index 0000000..b130dcf
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/metrics/v1/BUILD.bazel
@@ -0,0 +1,14 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["metrics.pb.go"],
+    importpath = "github.com/census-instrumentation/opencensus-proto/gen-go/metrics/v1",
+    visibility = ["//visibility:public"],
+    deps = [
+        "@com_github_census_instrumentation_opencensus_proto//gen-go/resource/v1:go_default_library",
+        "@com_github_golang_protobuf//proto:go_default_library",
+        "@io_bazel_rules_go//proto/wkt:timestamp_go_proto",
+        "@io_bazel_rules_go//proto/wkt:wrappers_go_proto",
+    ],
+)
diff --git a/third_party/go/opencensus-proto/gen-go/metrics/v1/metrics.pb.go b/third_party/go/opencensus-proto/gen-go/metrics/v1/metrics.pb.go
new file mode 100644
index 0000000..466b234
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/metrics/v1/metrics.pb.go
@@ -0,0 +1,1127 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: opencensus/proto/metrics/v1/metrics.proto
+
+package v1
+
+import (
+	fmt "fmt"
+	v1 "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// The kind of metric. It describes how the data is reported.
+//
+// A gauge is an instantaneous measurement of a value.
+//
+// A cumulative measurement is a value accumulated over a time interval. In
+// a time series, cumulative measurements should have the same start time,
+// increasing values and increasing end times, until an event resets the
+// cumulative value to zero and sets a new start time for the following
+// points.
+type MetricDescriptor_Type int32
+
+const (
+	// Do not use this default value.
+	MetricDescriptor_UNSPECIFIED MetricDescriptor_Type = 0
+	// Integer gauge. The value can go both up and down.
+	MetricDescriptor_GAUGE_INT64 MetricDescriptor_Type = 1
+	// Floating point gauge. The value can go both up and down.
+	MetricDescriptor_GAUGE_DOUBLE MetricDescriptor_Type = 2
+	// Distribution gauge measurement. The count and sum can go both up and
+	// down. Recorded values are always >= 0.
+	// Used in scenarios like a snapshot of time the current items in a queue
+	// have spent there.
+	MetricDescriptor_GAUGE_DISTRIBUTION MetricDescriptor_Type = 3
+	// Integer cumulative measurement. The value cannot decrease, if resets
+	// then the start_time should also be reset.
+	MetricDescriptor_CUMULATIVE_INT64 MetricDescriptor_Type = 4
+	// Floating point cumulative measurement. The value cannot decrease, if
+	// resets then the start_time should also be reset. Recorded values are
+	// always >= 0.
+	MetricDescriptor_CUMULATIVE_DOUBLE MetricDescriptor_Type = 5
+	// Distribution cumulative measurement. The count and sum cannot decrease,
+	// if resets then the start_time should also be reset.
+	MetricDescriptor_CUMULATIVE_DISTRIBUTION MetricDescriptor_Type = 6
+	// Some frameworks implemented Histograms as a summary of observations
+	// (usually things like request durations and response sizes). While it
+	// also provides a total count of observations and a sum of all observed
+	// values, it calculates configurable percentiles over a sliding time
+	// window. This is not recommended, since it cannot be aggregated.
+	MetricDescriptor_SUMMARY MetricDescriptor_Type = 7
+)
+
+var MetricDescriptor_Type_name = map[int32]string{
+	0: "UNSPECIFIED",
+	1: "GAUGE_INT64",
+	2: "GAUGE_DOUBLE",
+	3: "GAUGE_DISTRIBUTION",
+	4: "CUMULATIVE_INT64",
+	5: "CUMULATIVE_DOUBLE",
+	6: "CUMULATIVE_DISTRIBUTION",
+	7: "SUMMARY",
+}
+
+var MetricDescriptor_Type_value = map[string]int32{
+	"UNSPECIFIED":             0,
+	"GAUGE_INT64":             1,
+	"GAUGE_DOUBLE":            2,
+	"GAUGE_DISTRIBUTION":      3,
+	"CUMULATIVE_INT64":        4,
+	"CUMULATIVE_DOUBLE":       5,
+	"CUMULATIVE_DISTRIBUTION": 6,
+	"SUMMARY":                 7,
+}
+
+func (x MetricDescriptor_Type) String() string {
+	return proto.EnumName(MetricDescriptor_Type_name, int32(x))
+}
+
+func (MetricDescriptor_Type) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{1, 0}
+}
+
+// Defines a Metric which has one or more timeseries.
+type Metric struct {
+	// The descriptor of the Metric.
+	// TODO(issue #152): consider only sending the name of descriptor for
+	// optimization.
+	MetricDescriptor *MetricDescriptor `protobuf:"bytes,1,opt,name=metric_descriptor,json=metricDescriptor,proto3" json:"metric_descriptor,omitempty"`
+	// One or more timeseries for a single metric, where each timeseries has
+	// one or more points.
+	Timeseries []*TimeSeries `protobuf:"bytes,2,rep,name=timeseries,proto3" json:"timeseries,omitempty"`
+	// The resource for the metric. If unset, it may be set to a default value
+	// provided for a sequence of messages in an RPC stream.
+	Resource             *v1.Resource `protobuf:"bytes,3,opt,name=resource,proto3" json:"resource,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
+	XXX_unrecognized     []byte       `json:"-"`
+	XXX_sizecache        int32        `json:"-"`
+}
+
+func (m *Metric) Reset()         { *m = Metric{} }
+func (m *Metric) String() string { return proto.CompactTextString(m) }
+func (*Metric) ProtoMessage()    {}
+func (*Metric) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{0}
+}
+
+func (m *Metric) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Metric.Unmarshal(m, b)
+}
+func (m *Metric) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Metric.Marshal(b, m, deterministic)
+}
+func (m *Metric) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Metric.Merge(m, src)
+}
+func (m *Metric) XXX_Size() int {
+	return xxx_messageInfo_Metric.Size(m)
+}
+func (m *Metric) XXX_DiscardUnknown() {
+	xxx_messageInfo_Metric.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Metric proto.InternalMessageInfo
+
+func (m *Metric) GetMetricDescriptor() *MetricDescriptor {
+	if m != nil {
+		return m.MetricDescriptor
+	}
+	return nil
+}
+
+func (m *Metric) GetTimeseries() []*TimeSeries {
+	if m != nil {
+		return m.Timeseries
+	}
+	return nil
+}
+
+func (m *Metric) GetResource() *v1.Resource {
+	if m != nil {
+		return m.Resource
+	}
+	return nil
+}
+
+// Defines a metric type and its schema.
+type MetricDescriptor struct {
+	// The metric type, including its DNS name prefix. It must be unique.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// A detailed description of the metric, which can be used in documentation.
+	Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	// The unit in which the metric value is reported. Follows the format
+	// described by http://unitsofmeasure.org/ucum.html.
+	Unit string                `protobuf:"bytes,3,opt,name=unit,proto3" json:"unit,omitempty"`
+	Type MetricDescriptor_Type `protobuf:"varint,4,opt,name=type,proto3,enum=opencensus.proto.metrics.v1.MetricDescriptor_Type" json:"type,omitempty"`
+	// The label keys associated with the metric descriptor.
+	LabelKeys            []*LabelKey `protobuf:"bytes,5,rep,name=label_keys,json=labelKeys,proto3" json:"label_keys,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}    `json:"-"`
+	XXX_unrecognized     []byte      `json:"-"`
+	XXX_sizecache        int32       `json:"-"`
+}
+
+func (m *MetricDescriptor) Reset()         { *m = MetricDescriptor{} }
+func (m *MetricDescriptor) String() string { return proto.CompactTextString(m) }
+func (*MetricDescriptor) ProtoMessage()    {}
+func (*MetricDescriptor) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{1}
+}
+
+func (m *MetricDescriptor) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_MetricDescriptor.Unmarshal(m, b)
+}
+func (m *MetricDescriptor) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_MetricDescriptor.Marshal(b, m, deterministic)
+}
+func (m *MetricDescriptor) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_MetricDescriptor.Merge(m, src)
+}
+func (m *MetricDescriptor) XXX_Size() int {
+	return xxx_messageInfo_MetricDescriptor.Size(m)
+}
+func (m *MetricDescriptor) XXX_DiscardUnknown() {
+	xxx_messageInfo_MetricDescriptor.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_MetricDescriptor proto.InternalMessageInfo
+
+func (m *MetricDescriptor) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *MetricDescriptor) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+func (m *MetricDescriptor) GetUnit() string {
+	if m != nil {
+		return m.Unit
+	}
+	return ""
+}
+
+func (m *MetricDescriptor) GetType() MetricDescriptor_Type {
+	if m != nil {
+		return m.Type
+	}
+	return MetricDescriptor_UNSPECIFIED
+}
+
+func (m *MetricDescriptor) GetLabelKeys() []*LabelKey {
+	if m != nil {
+		return m.LabelKeys
+	}
+	return nil
+}
+
+// Defines a label key associated with a metric descriptor.
+type LabelKey struct {
+	// The key for the label.
+	Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	// A human-readable description of what this label key represents.
+	Description          string   `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LabelKey) Reset()         { *m = LabelKey{} }
+func (m *LabelKey) String() string { return proto.CompactTextString(m) }
+func (*LabelKey) ProtoMessage()    {}
+func (*LabelKey) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{2}
+}
+
+func (m *LabelKey) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LabelKey.Unmarshal(m, b)
+}
+func (m *LabelKey) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LabelKey.Marshal(b, m, deterministic)
+}
+func (m *LabelKey) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LabelKey.Merge(m, src)
+}
+func (m *LabelKey) XXX_Size() int {
+	return xxx_messageInfo_LabelKey.Size(m)
+}
+func (m *LabelKey) XXX_DiscardUnknown() {
+	xxx_messageInfo_LabelKey.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LabelKey proto.InternalMessageInfo
+
+func (m *LabelKey) GetKey() string {
+	if m != nil {
+		return m.Key
+	}
+	return ""
+}
+
+func (m *LabelKey) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+// A collection of data points that describes the time-varying values
+// of a metric.
+type TimeSeries struct {
+	// Must be present for cumulative metrics. The time when the cumulative value
+	// was reset to zero. Exclusive. The cumulative value is over the time interval
+	// (start_timestamp, timestamp]. If not specified, the backend can use the
+	// previous recorded value.
+	StartTimestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=start_timestamp,json=startTimestamp,proto3" json:"start_timestamp,omitempty"`
+	// The set of label values that uniquely identify this timeseries. Applies to
+	// all points. The order of label values must match that of label keys in the
+	// metric descriptor.
+	LabelValues []*LabelValue `protobuf:"bytes,2,rep,name=label_values,json=labelValues,proto3" json:"label_values,omitempty"`
+	// The data points of this timeseries. Point.value type MUST match the
+	// MetricDescriptor.type.
+	Points               []*Point `protobuf:"bytes,3,rep,name=points,proto3" json:"points,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TimeSeries) Reset()         { *m = TimeSeries{} }
+func (m *TimeSeries) String() string { return proto.CompactTextString(m) }
+func (*TimeSeries) ProtoMessage()    {}
+func (*TimeSeries) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{3}
+}
+
+func (m *TimeSeries) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TimeSeries.Unmarshal(m, b)
+}
+func (m *TimeSeries) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TimeSeries.Marshal(b, m, deterministic)
+}
+func (m *TimeSeries) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TimeSeries.Merge(m, src)
+}
+func (m *TimeSeries) XXX_Size() int {
+	return xxx_messageInfo_TimeSeries.Size(m)
+}
+func (m *TimeSeries) XXX_DiscardUnknown() {
+	xxx_messageInfo_TimeSeries.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TimeSeries proto.InternalMessageInfo
+
+func (m *TimeSeries) GetStartTimestamp() *timestamp.Timestamp {
+	if m != nil {
+		return m.StartTimestamp
+	}
+	return nil
+}
+
+func (m *TimeSeries) GetLabelValues() []*LabelValue {
+	if m != nil {
+		return m.LabelValues
+	}
+	return nil
+}
+
+func (m *TimeSeries) GetPoints() []*Point {
+	if m != nil {
+		return m.Points
+	}
+	return nil
+}
+
+type LabelValue struct {
+	// The value for the label.
+	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	// If false the value field is ignored and considered not set.
+	// This is used to differentiate a missing label from an empty string.
+	HasValue             bool     `protobuf:"varint,2,opt,name=has_value,json=hasValue,proto3" json:"has_value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LabelValue) Reset()         { *m = LabelValue{} }
+func (m *LabelValue) String() string { return proto.CompactTextString(m) }
+func (*LabelValue) ProtoMessage()    {}
+func (*LabelValue) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{4}
+}
+
+func (m *LabelValue) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LabelValue.Unmarshal(m, b)
+}
+func (m *LabelValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LabelValue.Marshal(b, m, deterministic)
+}
+func (m *LabelValue) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LabelValue.Merge(m, src)
+}
+func (m *LabelValue) XXX_Size() int {
+	return xxx_messageInfo_LabelValue.Size(m)
+}
+func (m *LabelValue) XXX_DiscardUnknown() {
+	xxx_messageInfo_LabelValue.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LabelValue proto.InternalMessageInfo
+
+func (m *LabelValue) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+func (m *LabelValue) GetHasValue() bool {
+	if m != nil {
+		return m.HasValue
+	}
+	return false
+}
+
+// A timestamped measurement.
+type Point struct {
+	// The moment when this point was recorded. Inclusive.
+	// If not specified, the timestamp will be decided by the backend.
+	Timestamp *timestamp.Timestamp `protobuf:"bytes,1,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	// The actual point value.
+	//
+	// Types that are valid to be assigned to Value:
+	//	*Point_Int64Value
+	//	*Point_DoubleValue
+	//	*Point_DistributionValue
+	//	*Point_SummaryValue
+	Value                isPoint_Value `protobuf_oneof:"value"`
+	XXX_NoUnkeyedLiteral struct{}      `json:"-"`
+	XXX_unrecognized     []byte        `json:"-"`
+	XXX_sizecache        int32         `json:"-"`
+}
+
+func (m *Point) Reset()         { *m = Point{} }
+func (m *Point) String() string { return proto.CompactTextString(m) }
+func (*Point) ProtoMessage()    {}
+func (*Point) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{5}
+}
+
+func (m *Point) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Point.Unmarshal(m, b)
+}
+func (m *Point) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Point.Marshal(b, m, deterministic)
+}
+func (m *Point) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Point.Merge(m, src)
+}
+func (m *Point) XXX_Size() int {
+	return xxx_messageInfo_Point.Size(m)
+}
+func (m *Point) XXX_DiscardUnknown() {
+	xxx_messageInfo_Point.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Point proto.InternalMessageInfo
+
+func (m *Point) GetTimestamp() *timestamp.Timestamp {
+	if m != nil {
+		return m.Timestamp
+	}
+	return nil
+}
+
+type isPoint_Value interface {
+	isPoint_Value()
+}
+
+type Point_Int64Value struct {
+	Int64Value int64 `protobuf:"varint,2,opt,name=int64_value,json=int64Value,proto3,oneof"`
+}
+
+type Point_DoubleValue struct {
+	DoubleValue float64 `protobuf:"fixed64,3,opt,name=double_value,json=doubleValue,proto3,oneof"`
+}
+
+type Point_DistributionValue struct {
+	DistributionValue *DistributionValue `protobuf:"bytes,4,opt,name=distribution_value,json=distributionValue,proto3,oneof"`
+}
+
+type Point_SummaryValue struct {
+	SummaryValue *SummaryValue `protobuf:"bytes,5,opt,name=summary_value,json=summaryValue,proto3,oneof"`
+}
+
+func (*Point_Int64Value) isPoint_Value() {}
+
+func (*Point_DoubleValue) isPoint_Value() {}
+
+func (*Point_DistributionValue) isPoint_Value() {}
+
+func (*Point_SummaryValue) isPoint_Value() {}
+
+func (m *Point) GetValue() isPoint_Value {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func (m *Point) GetInt64Value() int64 {
+	if x, ok := m.GetValue().(*Point_Int64Value); ok {
+		return x.Int64Value
+	}
+	return 0
+}
+
+func (m *Point) GetDoubleValue() float64 {
+	if x, ok := m.GetValue().(*Point_DoubleValue); ok {
+		return x.DoubleValue
+	}
+	return 0
+}
+
+func (m *Point) GetDistributionValue() *DistributionValue {
+	if x, ok := m.GetValue().(*Point_DistributionValue); ok {
+		return x.DistributionValue
+	}
+	return nil
+}
+
+func (m *Point) GetSummaryValue() *SummaryValue {
+	if x, ok := m.GetValue().(*Point_SummaryValue); ok {
+		return x.SummaryValue
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Point) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Point_Int64Value)(nil),
+		(*Point_DoubleValue)(nil),
+		(*Point_DistributionValue)(nil),
+		(*Point_SummaryValue)(nil),
+	}
+}
+
+// Distribution contains summary statistics for a population of values. It
+// optionally contains a histogram representing the distribution of those
+// values across a set of buckets.
+type DistributionValue struct {
+	// The number of values in the population. Must be non-negative. This value
+	// must equal the sum of the values in bucket_counts if a histogram is
+	// provided.
+	Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
+	// The sum of the values in the population. If count is zero then this field
+	// must be zero.
+	Sum float64 `protobuf:"fixed64,2,opt,name=sum,proto3" json:"sum,omitempty"`
+	// The sum of squared deviations from the mean of the values in the
+	// population. For values x_i this is:
+	//
+	//     Sum[i=1..n]((x_i - mean)^2)
+	//
+	// Knuth, "The Art of Computer Programming", Vol. 2, page 323, 3rd edition
+	// describes Welford's method for accumulating this sum in one pass.
+	//
+	// If count is zero then this field must be zero.
+	SumOfSquaredDeviation float64 `protobuf:"fixed64,3,opt,name=sum_of_squared_deviation,json=sumOfSquaredDeviation,proto3" json:"sum_of_squared_deviation,omitempty"`
+	// Don't change bucket boundaries within a TimeSeries if your backend doesn't
+	// support this.
+	// TODO(issue #152): consider not required to send bucket options for
+	// optimization.
+	BucketOptions *DistributionValue_BucketOptions `protobuf:"bytes,4,opt,name=bucket_options,json=bucketOptions,proto3" json:"bucket_options,omitempty"`
+	// If the distribution does not have a histogram, then omit this field.
+	// If there is a histogram, then the sum of the values in the Bucket counts
+	// must equal the value in the count field of the distribution.
+	Buckets              []*DistributionValue_Bucket `protobuf:"bytes,5,rep,name=buckets,proto3" json:"buckets,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *DistributionValue) Reset()         { *m = DistributionValue{} }
+func (m *DistributionValue) String() string { return proto.CompactTextString(m) }
+func (*DistributionValue) ProtoMessage()    {}
+func (*DistributionValue) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{6}
+}
+
+func (m *DistributionValue) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DistributionValue.Unmarshal(m, b)
+}
+func (m *DistributionValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DistributionValue.Marshal(b, m, deterministic)
+}
+func (m *DistributionValue) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DistributionValue.Merge(m, src)
+}
+func (m *DistributionValue) XXX_Size() int {
+	return xxx_messageInfo_DistributionValue.Size(m)
+}
+func (m *DistributionValue) XXX_DiscardUnknown() {
+	xxx_messageInfo_DistributionValue.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DistributionValue proto.InternalMessageInfo
+
+func (m *DistributionValue) GetCount() int64 {
+	if m != nil {
+		return m.Count
+	}
+	return 0
+}
+
+func (m *DistributionValue) GetSum() float64 {
+	if m != nil {
+		return m.Sum
+	}
+	return 0
+}
+
+func (m *DistributionValue) GetSumOfSquaredDeviation() float64 {
+	if m != nil {
+		return m.SumOfSquaredDeviation
+	}
+	return 0
+}
+
+func (m *DistributionValue) GetBucketOptions() *DistributionValue_BucketOptions {
+	if m != nil {
+		return m.BucketOptions
+	}
+	return nil
+}
+
+func (m *DistributionValue) GetBuckets() []*DistributionValue_Bucket {
+	if m != nil {
+		return m.Buckets
+	}
+	return nil
+}
+
+// A Distribution may optionally contain a histogram of the values in the
+// population. The bucket boundaries for that histogram are described by
+// BucketOptions.
+//
+// If bucket_options has no type, then there is no histogram associated with
+// the Distribution.
+type DistributionValue_BucketOptions struct {
+	// Types that are valid to be assigned to Type:
+	//	*DistributionValue_BucketOptions_Explicit_
+	Type                 isDistributionValue_BucketOptions_Type `protobuf_oneof:"type"`
+	XXX_NoUnkeyedLiteral struct{}                               `json:"-"`
+	XXX_unrecognized     []byte                                 `json:"-"`
+	XXX_sizecache        int32                                  `json:"-"`
+}
+
+func (m *DistributionValue_BucketOptions) Reset()         { *m = DistributionValue_BucketOptions{} }
+func (m *DistributionValue_BucketOptions) String() string { return proto.CompactTextString(m) }
+func (*DistributionValue_BucketOptions) ProtoMessage()    {}
+func (*DistributionValue_BucketOptions) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{6, 0}
+}
+
+func (m *DistributionValue_BucketOptions) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DistributionValue_BucketOptions.Unmarshal(m, b)
+}
+func (m *DistributionValue_BucketOptions) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DistributionValue_BucketOptions.Marshal(b, m, deterministic)
+}
+func (m *DistributionValue_BucketOptions) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DistributionValue_BucketOptions.Merge(m, src)
+}
+func (m *DistributionValue_BucketOptions) XXX_Size() int {
+	return xxx_messageInfo_DistributionValue_BucketOptions.Size(m)
+}
+func (m *DistributionValue_BucketOptions) XXX_DiscardUnknown() {
+	xxx_messageInfo_DistributionValue_BucketOptions.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DistributionValue_BucketOptions proto.InternalMessageInfo
+
+type isDistributionValue_BucketOptions_Type interface {
+	isDistributionValue_BucketOptions_Type()
+}
+
+type DistributionValue_BucketOptions_Explicit_ struct {
+	Explicit *DistributionValue_BucketOptions_Explicit `protobuf:"bytes,1,opt,name=explicit,proto3,oneof"`
+}
+
+func (*DistributionValue_BucketOptions_Explicit_) isDistributionValue_BucketOptions_Type() {}
+
+func (m *DistributionValue_BucketOptions) GetType() isDistributionValue_BucketOptions_Type {
+	if m != nil {
+		return m.Type
+	}
+	return nil
+}
+
+func (m *DistributionValue_BucketOptions) GetExplicit() *DistributionValue_BucketOptions_Explicit {
+	if x, ok := m.GetType().(*DistributionValue_BucketOptions_Explicit_); ok {
+		return x.Explicit
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*DistributionValue_BucketOptions) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*DistributionValue_BucketOptions_Explicit_)(nil),
+	}
+}
+
+// Specifies a set of buckets with arbitrary upper-bounds.
+// This defines size(bounds) + 1 (= N) buckets. The boundaries for bucket
+// index i are:
+//
+// [0, bucket_bounds[i]) for i == 0
+// [bucket_bounds[i-1], bucket_bounds[i]) for 0 < i < N-1
+// [bucket_bounds[i], +infinity) for i == N-1
+type DistributionValue_BucketOptions_Explicit struct {
+	// The values must be strictly increasing and > 0.
+	Bounds               []float64 `protobuf:"fixed64,1,rep,packed,name=bounds,proto3" json:"bounds,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
+	XXX_unrecognized     []byte    `json:"-"`
+	XXX_sizecache        int32     `json:"-"`
+}
+
+func (m *DistributionValue_BucketOptions_Explicit) Reset() {
+	*m = DistributionValue_BucketOptions_Explicit{}
+}
+func (m *DistributionValue_BucketOptions_Explicit) String() string { return proto.CompactTextString(m) }
+func (*DistributionValue_BucketOptions_Explicit) ProtoMessage()    {}
+func (*DistributionValue_BucketOptions_Explicit) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{6, 0, 0}
+}
+
+func (m *DistributionValue_BucketOptions_Explicit) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Unmarshal(m, b)
+}
+func (m *DistributionValue_BucketOptions_Explicit) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Marshal(b, m, deterministic)
+}
+func (m *DistributionValue_BucketOptions_Explicit) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Merge(m, src)
+}
+func (m *DistributionValue_BucketOptions_Explicit) XXX_Size() int {
+	return xxx_messageInfo_DistributionValue_BucketOptions_Explicit.Size(m)
+}
+func (m *DistributionValue_BucketOptions_Explicit) XXX_DiscardUnknown() {
+	xxx_messageInfo_DistributionValue_BucketOptions_Explicit.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DistributionValue_BucketOptions_Explicit proto.InternalMessageInfo
+
+func (m *DistributionValue_BucketOptions_Explicit) GetBounds() []float64 {
+	if m != nil {
+		return m.Bounds
+	}
+	return nil
+}
+
+type DistributionValue_Bucket struct {
+	// The number of values in each bucket of the histogram, as described in
+	// bucket_bounds.
+	Count int64 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"`
+	// If the distribution does not have a histogram, then omit this field.
+	Exemplar             *DistributionValue_Exemplar `protobuf:"bytes,2,opt,name=exemplar,proto3" json:"exemplar,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                    `json:"-"`
+	XXX_unrecognized     []byte                      `json:"-"`
+	XXX_sizecache        int32                       `json:"-"`
+}
+
+func (m *DistributionValue_Bucket) Reset()         { *m = DistributionValue_Bucket{} }
+func (m *DistributionValue_Bucket) String() string { return proto.CompactTextString(m) }
+func (*DistributionValue_Bucket) ProtoMessage()    {}
+func (*DistributionValue_Bucket) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{6, 1}
+}
+
+func (m *DistributionValue_Bucket) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DistributionValue_Bucket.Unmarshal(m, b)
+}
+func (m *DistributionValue_Bucket) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DistributionValue_Bucket.Marshal(b, m, deterministic)
+}
+func (m *DistributionValue_Bucket) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DistributionValue_Bucket.Merge(m, src)
+}
+func (m *DistributionValue_Bucket) XXX_Size() int {
+	return xxx_messageInfo_DistributionValue_Bucket.Size(m)
+}
+func (m *DistributionValue_Bucket) XXX_DiscardUnknown() {
+	xxx_messageInfo_DistributionValue_Bucket.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DistributionValue_Bucket proto.InternalMessageInfo
+
+func (m *DistributionValue_Bucket) GetCount() int64 {
+	if m != nil {
+		return m.Count
+	}
+	return 0
+}
+
+func (m *DistributionValue_Bucket) GetExemplar() *DistributionValue_Exemplar {
+	if m != nil {
+		return m.Exemplar
+	}
+	return nil
+}
+
+// Exemplars are example points that may be used to annotate aggregated
+// Distribution values. They are metadata that gives information about a
+// particular value added to a Distribution bucket.
+type DistributionValue_Exemplar struct {
+	// Value of the exemplar point. It determines which bucket the exemplar
+	// belongs to.
+	Value float64 `protobuf:"fixed64,1,opt,name=value,proto3" json:"value,omitempty"`
+	// The observation (sampling) time of the above value.
+	Timestamp *timestamp.Timestamp `protobuf:"bytes,2,opt,name=timestamp,proto3" json:"timestamp,omitempty"`
+	// Contextual information about the example value.
+	Attachments          map[string]string `protobuf:"bytes,3,rep,name=attachments,proto3" json:"attachments,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *DistributionValue_Exemplar) Reset()         { *m = DistributionValue_Exemplar{} }
+func (m *DistributionValue_Exemplar) String() string { return proto.CompactTextString(m) }
+func (*DistributionValue_Exemplar) ProtoMessage()    {}
+func (*DistributionValue_Exemplar) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{6, 2}
+}
+
+func (m *DistributionValue_Exemplar) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DistributionValue_Exemplar.Unmarshal(m, b)
+}
+func (m *DistributionValue_Exemplar) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DistributionValue_Exemplar.Marshal(b, m, deterministic)
+}
+func (m *DistributionValue_Exemplar) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DistributionValue_Exemplar.Merge(m, src)
+}
+func (m *DistributionValue_Exemplar) XXX_Size() int {
+	return xxx_messageInfo_DistributionValue_Exemplar.Size(m)
+}
+func (m *DistributionValue_Exemplar) XXX_DiscardUnknown() {
+	xxx_messageInfo_DistributionValue_Exemplar.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DistributionValue_Exemplar proto.InternalMessageInfo
+
+func (m *DistributionValue_Exemplar) GetValue() float64 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+func (m *DistributionValue_Exemplar) GetTimestamp() *timestamp.Timestamp {
+	if m != nil {
+		return m.Timestamp
+	}
+	return nil
+}
+
+func (m *DistributionValue_Exemplar) GetAttachments() map[string]string {
+	if m != nil {
+		return m.Attachments
+	}
+	return nil
+}
+
+// The start_timestamp only applies to the count and sum in the SummaryValue.
+type SummaryValue struct {
+	// The total number of recorded values since start_time. Optional since
+	// some systems don't expose this.
+	Count *wrappers.Int64Value `protobuf:"bytes,1,opt,name=count,proto3" json:"count,omitempty"`
+	// The total sum of recorded values since start_time. Optional since some
+	// systems don't expose this. If count is zero then this field must be zero.
+	// This field must be unset if the sum is not available.
+	Sum *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=sum,proto3" json:"sum,omitempty"`
+	// Values calculated over an arbitrary time window.
+	Snapshot             *SummaryValue_Snapshot `protobuf:"bytes,3,opt,name=snapshot,proto3" json:"snapshot,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *SummaryValue) Reset()         { *m = SummaryValue{} }
+func (m *SummaryValue) String() string { return proto.CompactTextString(m) }
+func (*SummaryValue) ProtoMessage()    {}
+func (*SummaryValue) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{7}
+}
+
+func (m *SummaryValue) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SummaryValue.Unmarshal(m, b)
+}
+func (m *SummaryValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SummaryValue.Marshal(b, m, deterministic)
+}
+func (m *SummaryValue) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SummaryValue.Merge(m, src)
+}
+func (m *SummaryValue) XXX_Size() int {
+	return xxx_messageInfo_SummaryValue.Size(m)
+}
+func (m *SummaryValue) XXX_DiscardUnknown() {
+	xxx_messageInfo_SummaryValue.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SummaryValue proto.InternalMessageInfo
+
+func (m *SummaryValue) GetCount() *wrappers.Int64Value {
+	if m != nil {
+		return m.Count
+	}
+	return nil
+}
+
+func (m *SummaryValue) GetSum() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Sum
+	}
+	return nil
+}
+
+func (m *SummaryValue) GetSnapshot() *SummaryValue_Snapshot {
+	if m != nil {
+		return m.Snapshot
+	}
+	return nil
+}
+
+// The values in this message can be reset at arbitrary unknown times, with
+// the requirement that all of them are reset at the same time.
+type SummaryValue_Snapshot struct {
+	// The number of values in the snapshot. Optional since some systems don't
+	// expose this.
+	Count *wrappers.Int64Value `protobuf:"bytes,1,opt,name=count,proto3" json:"count,omitempty"`
+	// The sum of values in the snapshot. Optional since some systems don't
+	// expose this. If count is zero then this field must be zero or not set
+	// (if not supported).
+	Sum *wrappers.DoubleValue `protobuf:"bytes,2,opt,name=sum,proto3" json:"sum,omitempty"`
+	// A list of values at different percentiles of the distribution calculated
+	// from the current snapshot. The percentiles must be strictly increasing.
+	PercentileValues     []*SummaryValue_Snapshot_ValueAtPercentile `protobuf:"bytes,3,rep,name=percentile_values,json=percentileValues,proto3" json:"percentile_values,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                                   `json:"-"`
+	XXX_unrecognized     []byte                                     `json:"-"`
+	XXX_sizecache        int32                                      `json:"-"`
+}
+
+func (m *SummaryValue_Snapshot) Reset()         { *m = SummaryValue_Snapshot{} }
+func (m *SummaryValue_Snapshot) String() string { return proto.CompactTextString(m) }
+func (*SummaryValue_Snapshot) ProtoMessage()    {}
+func (*SummaryValue_Snapshot) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{7, 0}
+}
+
+func (m *SummaryValue_Snapshot) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SummaryValue_Snapshot.Unmarshal(m, b)
+}
+func (m *SummaryValue_Snapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SummaryValue_Snapshot.Marshal(b, m, deterministic)
+}
+func (m *SummaryValue_Snapshot) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SummaryValue_Snapshot.Merge(m, src)
+}
+func (m *SummaryValue_Snapshot) XXX_Size() int {
+	return xxx_messageInfo_SummaryValue_Snapshot.Size(m)
+}
+func (m *SummaryValue_Snapshot) XXX_DiscardUnknown() {
+	xxx_messageInfo_SummaryValue_Snapshot.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SummaryValue_Snapshot proto.InternalMessageInfo
+
+func (m *SummaryValue_Snapshot) GetCount() *wrappers.Int64Value {
+	if m != nil {
+		return m.Count
+	}
+	return nil
+}
+
+func (m *SummaryValue_Snapshot) GetSum() *wrappers.DoubleValue {
+	if m != nil {
+		return m.Sum
+	}
+	return nil
+}
+
+func (m *SummaryValue_Snapshot) GetPercentileValues() []*SummaryValue_Snapshot_ValueAtPercentile {
+	if m != nil {
+		return m.PercentileValues
+	}
+	return nil
+}
+
+// Represents the value at a given percentile of a distribution.
+type SummaryValue_Snapshot_ValueAtPercentile struct {
+	// The percentile of a distribution. Must be in the interval
+	// (0.0, 100.0].
+	Percentile float64 `protobuf:"fixed64,1,opt,name=percentile,proto3" json:"percentile,omitempty"`
+	// The value at the given percentile of a distribution.
+	Value                float64  `protobuf:"fixed64,2,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SummaryValue_Snapshot_ValueAtPercentile) Reset() {
+	*m = SummaryValue_Snapshot_ValueAtPercentile{}
+}
+func (m *SummaryValue_Snapshot_ValueAtPercentile) String() string { return proto.CompactTextString(m) }
+func (*SummaryValue_Snapshot_ValueAtPercentile) ProtoMessage()    {}
+func (*SummaryValue_Snapshot_ValueAtPercentile) Descriptor() ([]byte, []int) {
+	return fileDescriptor_0ee3deb72053811a, []int{7, 0, 0}
+}
+
+func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Unmarshal(m, b)
+}
+func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Marshal(b, m, deterministic)
+}
+func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Merge(m, src)
+}
+func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_Size() int {
+	return xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.Size(m)
+}
+func (m *SummaryValue_Snapshot_ValueAtPercentile) XXX_DiscardUnknown() {
+	xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SummaryValue_Snapshot_ValueAtPercentile proto.InternalMessageInfo
+
+func (m *SummaryValue_Snapshot_ValueAtPercentile) GetPercentile() float64 {
+	if m != nil {
+		return m.Percentile
+	}
+	return 0
+}
+
+func (m *SummaryValue_Snapshot_ValueAtPercentile) GetValue() float64 {
+	if m != nil {
+		return m.Value
+	}
+	return 0
+}
+
+func init() {
+	proto.RegisterEnum("opencensus.proto.metrics.v1.MetricDescriptor_Type", MetricDescriptor_Type_name, MetricDescriptor_Type_value)
+	proto.RegisterType((*Metric)(nil), "opencensus.proto.metrics.v1.Metric")
+	proto.RegisterType((*MetricDescriptor)(nil), "opencensus.proto.metrics.v1.MetricDescriptor")
+	proto.RegisterType((*LabelKey)(nil), "opencensus.proto.metrics.v1.LabelKey")
+	proto.RegisterType((*TimeSeries)(nil), "opencensus.proto.metrics.v1.TimeSeries")
+	proto.RegisterType((*LabelValue)(nil), "opencensus.proto.metrics.v1.LabelValue")
+	proto.RegisterType((*Point)(nil), "opencensus.proto.metrics.v1.Point")
+	proto.RegisterType((*DistributionValue)(nil), "opencensus.proto.metrics.v1.DistributionValue")
+	proto.RegisterType((*DistributionValue_BucketOptions)(nil), "opencensus.proto.metrics.v1.DistributionValue.BucketOptions")
+	proto.RegisterType((*DistributionValue_BucketOptions_Explicit)(nil), "opencensus.proto.metrics.v1.DistributionValue.BucketOptions.Explicit")
+	proto.RegisterType((*DistributionValue_Bucket)(nil), "opencensus.proto.metrics.v1.DistributionValue.Bucket")
+	proto.RegisterType((*DistributionValue_Exemplar)(nil), "opencensus.proto.metrics.v1.DistributionValue.Exemplar")
+	proto.RegisterMapType((map[string]string)(nil), "opencensus.proto.metrics.v1.DistributionValue.Exemplar.AttachmentsEntry")
+	proto.RegisterType((*SummaryValue)(nil), "opencensus.proto.metrics.v1.SummaryValue")
+	proto.RegisterType((*SummaryValue_Snapshot)(nil), "opencensus.proto.metrics.v1.SummaryValue.Snapshot")
+	proto.RegisterType((*SummaryValue_Snapshot_ValueAtPercentile)(nil), "opencensus.proto.metrics.v1.SummaryValue.Snapshot.ValueAtPercentile")
+}
+
+func init() {
+	proto.RegisterFile("opencensus/proto/metrics/v1/metrics.proto", fileDescriptor_0ee3deb72053811a)
+}
+
+var fileDescriptor_0ee3deb72053811a = []byte{
+	// 1118 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xdd, 0x6e, 0x1b, 0xc5,
+	0x17, 0xcf, 0xda, 0x8e, 0xe3, 0x9c, 0x75, 0xd2, 0xf5, 0xa8, 0xed, 0xdf, 0x72, 0xfe, 0x0a, 0x61,
+	0x11, 0x90, 0x0a, 0x65, 0xad, 0x98, 0xd2, 0x56, 0x15, 0x2a, 0x8a, 0x63, 0x37, 0x31, 0x24, 0xb1,
+	0x35, 0xb6, 0x23, 0xd1, 0x1b, 0x6b, 0xbd, 0x9e, 0x24, 0x4b, 0xbc, 0x1f, 0xdd, 0x99, 0x0d, 0xf8,
+	0x05, 0x78, 0x02, 0xc4, 0x35, 0xb7, 0x88, 0xe7, 0xe0, 0x8a, 0x27, 0xe0, 0x15, 0xb8, 0x41, 0xbc,
+	0x01, 0xda, 0x99, 0xd9, 0x8f, 0xc4, 0x60, 0xea, 0x22, 0x71, 0x77, 0xe6, 0xcc, 0x39, 0xbf, 0xfd,
+	0x9d, 0xcf, 0x1d, 0x78, 0xe4, 0xf9, 0xc4, 0xb5, 0x88, 0x4b, 0x43, 0x5a, 0xf7, 0x03, 0x8f, 0x79,
+	0x75, 0x87, 0xb0, 0xc0, 0xb6, 0x68, 0xfd, 0x66, 0x3f, 0x16, 0x0d, 0x7e, 0x81, 0xb6, 0x52, 0x53,
+	0xa1, 0x31, 0xe2, 0xfb, 0x9b, 0xfd, 0xda, 0x3b, 0x97, 0x9e, 0x77, 0x39, 0x25, 0x02, 0x63, 0x1c,
+	0x5e, 0xd4, 0x99, 0xed, 0x10, 0xca, 0x4c, 0xc7, 0x17, 0xb6, 0xb5, 0xed, 0xbb, 0x06, 0x5f, 0x07,
+	0xa6, 0xef, 0x93, 0x40, 0x62, 0xd5, 0x3e, 0x9a, 0x23, 0x12, 0x10, 0xea, 0x85, 0x81, 0x45, 0x22,
+	0x26, 0xb1, 0x2c, 0x8c, 0xf5, 0x3f, 0x14, 0x28, 0x9e, 0xf2, 0x8f, 0xa3, 0x57, 0x50, 0x11, 0x34,
+	0x46, 0x13, 0x42, 0xad, 0xc0, 0xf6, 0x99, 0x17, 0x54, 0x95, 0x1d, 0x65, 0x57, 0x6d, 0xec, 0x19,
+	0x0b, 0x18, 0x1b, 0xc2, 0xbf, 0x95, 0x38, 0x61, 0xcd, 0xb9, 0xa3, 0x41, 0x47, 0x00, 0x3c, 0x0c,
+	0x12, 0xd8, 0x84, 0x56, 0x73, 0x3b, 0xf9, 0x5d, 0xb5, 0xf1, 0xe1, 0x42, 0xd0, 0x81, 0xed, 0x90,
+	0x3e, 0x37, 0xc7, 0x19, 0x57, 0xd4, 0x84, 0x52, 0x1c, 0x41, 0x35, 0xcf, 0xb9, 0x7d, 0x30, 0x0f,
+	0x93, 0xc4, 0x78, 0xb3, 0x6f, 0x60, 0x29, 0xe3, 0xc4, 0x4f, 0xff, 0x3e, 0x0f, 0xda, 0x5d, 0xce,
+	0x08, 0x41, 0xc1, 0x35, 0x1d, 0xc2, 0x03, 0x5e, 0xc7, 0x5c, 0x46, 0x3b, 0xa0, 0xc6, 0xa9, 0xb0,
+	0x3d, 0xb7, 0x9a, 0xe3, 0x57, 0x59, 0x55, 0xe4, 0x15, 0xba, 0x36, 0xe3, 0x54, 0xd6, 0x31, 0x97,
+	0xd1, 0x4b, 0x28, 0xb0, 0x99, 0x4f, 0xaa, 0x85, 0x1d, 0x65, 0x77, 0xb3, 0xd1, 0x58, 0x2a, 0x75,
+	0xc6, 0x60, 0xe6, 0x13, 0xcc, 0xfd, 0x51, 0x0b, 0x60, 0x6a, 0x8e, 0xc9, 0x74, 0x74, 0x4d, 0x66,
+	0xb4, 0xba, 0xca, 0x73, 0xf6, 0xfe, 0x42, 0xb4, 0x93, 0xc8, 0xfc, 0x0b, 0x32, 0xc3, 0xeb, 0x53,
+	0x29, 0x51, 0xfd, 0x47, 0x05, 0x0a, 0x11, 0x28, 0xba, 0x07, 0xea, 0xf0, 0xac, 0xdf, 0x6b, 0x1f,
+	0x76, 0x5e, 0x76, 0xda, 0x2d, 0x6d, 0x25, 0x52, 0x1c, 0x1d, 0x0c, 0x8f, 0xda, 0xa3, 0xce, 0xd9,
+	0xe0, 0xc9, 0x63, 0x4d, 0x41, 0x1a, 0x94, 0x85, 0xa2, 0xd5, 0x1d, 0x36, 0x4f, 0xda, 0x5a, 0x0e,
+	0x3d, 0x04, 0x24, 0x35, 0x9d, 0xfe, 0x00, 0x77, 0x9a, 0xc3, 0x41, 0xa7, 0x7b, 0xa6, 0xe5, 0xd1,
+	0x7d, 0xd0, 0x0e, 0x87, 0xa7, 0xc3, 0x93, 0x83, 0x41, 0xe7, 0x3c, 0xf6, 0x2f, 0xa0, 0x07, 0x50,
+	0xc9, 0x68, 0x25, 0xc8, 0x2a, 0xda, 0x82, 0xff, 0x65, 0xd5, 0x59, 0xa4, 0x22, 0x52, 0x61, 0xad,
+	0x3f, 0x3c, 0x3d, 0x3d, 0xc0, 0x5f, 0x6a, 0x6b, 0xfa, 0x0b, 0x28, 0xc5, 0x21, 0x20, 0x0d, 0xf2,
+	0xd7, 0x64, 0x26, 0xcb, 0x11, 0x89, 0xff, 0x5c, 0x0d, 0xfd, 0x57, 0x05, 0x20, 0xed, 0x1b, 0x74,
+	0x08, 0xf7, 0x28, 0x33, 0x03, 0x36, 0x4a, 0x26, 0x48, 0xb6, 0x73, 0xcd, 0x10, 0x23, 0x64, 0xc4,
+	0x23, 0xc4, 0xbb, 0x8d, 0x5b, 0xe0, 0x4d, 0xee, 0x92, 0x9c, 0xd1, 0xe7, 0x50, 0x16, 0x55, 0xb8,
+	0x31, 0xa7, 0xe1, 0x1b, 0xf6, 0x2e, 0x0f, 0xe2, 0x3c, 0xb2, 0xc7, 0xea, 0x34, 0x91, 0x29, 0x7a,
+	0x0e, 0x45, 0xdf, 0xb3, 0x5d, 0x46, 0xab, 0x79, 0x8e, 0xa2, 0x2f, 0x44, 0xe9, 0x45, 0xa6, 0x58,
+	0x7a, 0xe8, 0x9f, 0x01, 0xa4, 0xb0, 0xe8, 0x3e, 0xac, 0x72, 0x3e, 0x32, 0x3f, 0xe2, 0x80, 0xb6,
+	0x60, 0xfd, 0xca, 0xa4, 0x82, 0x29, 0xcf, 0x4f, 0x09, 0x97, 0xae, 0x4c, 0xca, 0x5d, 0xf4, 0x9f,
+	0x73, 0xb0, 0xca, 0x21, 0xd1, 0x33, 0x58, 0x5f, 0x26, 0x23, 0xa9, 0x31, 0x7a, 0x17, 0x54, 0xdb,
+	0x65, 0x4f, 0x1e, 0x67, 0x3e, 0x91, 0x3f, 0x5e, 0xc1, 0xc0, 0x95, 0x82, 0xd9, 0x7b, 0x50, 0x9e,
+	0x78, 0xe1, 0x78, 0x4a, 0xa4, 0x4d, 0x34, 0x19, 0xca, 0xf1, 0x0a, 0x56, 0x85, 0x56, 0x18, 0x8d,
+	0x00, 0x4d, 0x6c, 0xca, 0x02, 0x7b, 0x1c, 0x46, 0x85, 0x93, 0xa6, 0x05, 0x4e, 0xc5, 0x58, 0x98,
+	0x94, 0x56, 0xc6, 0x8d, 0x63, 0x1d, 0xaf, 0xe0, 0xca, 0xe4, 0xae, 0x12, 0xf5, 0x60, 0x83, 0x86,
+	0x8e, 0x63, 0x06, 0x33, 0x89, 0xbd, 0xca, 0xb1, 0x1f, 0x2d, 0xc4, 0xee, 0x0b, 0x8f, 0x18, 0xb6,
+	0x4c, 0x33, 0xe7, 0xe6, 0x9a, 0xcc, 0xb8, 0xfe, 0x4b, 0x11, 0x2a, 0x73, 0x2c, 0xa2, 0x82, 0x58,
+	0x5e, 0xe8, 0x32, 0x9e, 0xcf, 0x3c, 0x16, 0x87, 0xa8, 0x89, 0x69, 0xe8, 0xf0, 0x3c, 0x29, 0x38,
+	0x12, 0xd1, 0x53, 0xa8, 0xd2, 0xd0, 0x19, 0x79, 0x17, 0x23, 0xfa, 0x3a, 0x34, 0x03, 0x32, 0x19,
+	0x4d, 0xc8, 0x8d, 0x6d, 0xf2, 0x8e, 0xe6, 0xa9, 0xc2, 0x0f, 0x68, 0xe8, 0x74, 0x2f, 0xfa, 0xe2,
+	0xb6, 0x15, 0x5f, 0x22, 0x0b, 0x36, 0xc7, 0xa1, 0x75, 0x4d, 0xd8, 0xc8, 0xe3, 0xcd, 0x4e, 0x65,
+	0xba, 0x3e, 0x5d, 0x2e, 0x5d, 0x46, 0x93, 0x83, 0x74, 0x05, 0x06, 0xde, 0x18, 0x67, 0x8f, 0xa8,
+	0x0b, 0x6b, 0x42, 0x11, 0xef, 0x9b, 0x4f, 0xde, 0x0a, 0x1d, 0xc7, 0x28, 0xb5, 0x1f, 0x14, 0xd8,
+	0xb8, 0xf5, 0x45, 0x64, 0x41, 0x89, 0x7c, 0xe3, 0x4f, 0x6d, 0xcb, 0x66, 0xb2, 0xf7, 0xda, 0xff,
+	0x26, 0x02, 0xa3, 0x2d, 0xc1, 0x8e, 0x57, 0x70, 0x02, 0x5c, 0xd3, 0xa1, 0x14, 0xeb, 0xd1, 0x43,
+	0x28, 0x8e, 0xbd, 0xd0, 0x9d, 0xd0, 0xaa, 0xb2, 0x93, 0xdf, 0x55, 0xb0, 0x3c, 0x35, 0x8b, 0x62,
+	0x4d, 0xd7, 0x28, 0x14, 0x05, 0xe2, 0xdf, 0xd4, 0xb0, 0x1f, 0x11, 0x26, 0x8e, 0x3f, 0x35, 0x03,
+	0x5e, 0x48, 0xb5, 0xf1, 0x74, 0x49, 0xc2, 0x6d, 0xe9, 0x8e, 0x13, 0xa0, 0xda, 0xb7, 0xb9, 0x88,
+	0xa1, 0x38, 0xdc, 0x1e, 0x66, 0x25, 0x1e, 0xe6, 0x5b, 0x53, 0x9a, 0x5b, 0x66, 0x4a, 0xbf, 0x02,
+	0xd5, 0x64, 0xcc, 0xb4, 0xae, 0x1c, 0x92, 0xee, 0x9a, 0xe3, 0xb7, 0x24, 0x6d, 0x1c, 0xa4, 0x50,
+	0x6d, 0x97, 0x05, 0x33, 0x9c, 0x05, 0xaf, 0xbd, 0x00, 0xed, 0xae, 0xc1, 0x5f, 0xac, 0xee, 0x24,
+	0xc2, 0x5c, 0x66, 0x5d, 0x3d, 0xcf, 0x3d, 0x53, 0xf4, 0xdf, 0xf3, 0x50, 0xce, 0xce, 0x1d, 0xda,
+	0xcf, 0x16, 0x41, 0x6d, 0x6c, 0xcd, 0x85, 0xdc, 0x49, 0x76, 0x4d, 0x5c, 0x21, 0x23, 0x9d, 0x32,
+	0xb5, 0xf1, 0xff, 0x39, 0x87, 0x56, 0xba, 0x78, 0xc4, 0x0c, 0x9e, 0x41, 0x89, 0xba, 0xa6, 0x4f,
+	0xaf, 0x3c, 0x26, 0xdf, 0x10, 0x8d, 0x37, 0xde, 0x0b, 0x46, 0x5f, 0x7a, 0xe2, 0x04, 0xa3, 0xf6,
+	0x53, 0x0e, 0x4a, 0xb1, 0xfa, 0xbf, 0xe0, 0xff, 0x1a, 0x2a, 0x3e, 0x09, 0x2c, 0xe2, 0x32, 0x3b,
+	0x5e, 0xb3, 0x71, 0x95, 0x5b, 0xcb, 0x07, 0x62, 0xf0, 0xe3, 0x01, 0xeb, 0x25, 0x90, 0x58, 0x4b,
+	0xe1, 0xc5, 0x9f, 0xab, 0xd6, 0x81, 0xca, 0x9c, 0x19, 0xda, 0x06, 0x48, 0x0d, 0x65, 0xf3, 0x66,
+	0x34, 0xb7, 0xab, 0x1e, 0xf7, 0x75, 0xf3, 0x3b, 0x05, 0xb6, 0x6d, 0x6f, 0x11, 0xcf, 0x66, 0x59,
+	0x3c, 0x8b, 0x68, 0x2f, 0xba, 0xe8, 0x29, 0xaf, 0x5a, 0x97, 0x36, 0xbb, 0x0a, 0xc7, 0x86, 0xe5,
+	0x39, 0x75, 0xe1, 0xb3, 0x67, 0xbb, 0x94, 0x05, 0x61, 0xd4, 0x74, 0x7c, 0x3d, 0xd6, 0x53, 0xb8,
+	0x3d, 0xf1, 0xe6, 0xbd, 0x24, 0xee, 0xde, 0x65, 0xf6, 0x0d, 0xfe, 0x5b, 0x6e, 0xab, 0xeb, 0x13,
+	0xf7, 0x50, 0x7c, 0x93, 0x43, 0xcb, 0xe7, 0x17, 0x35, 0xce, 0xf7, 0xc7, 0x45, 0xee, 0xf6, 0xf1,
+	0x9f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf8, 0xd0, 0xb4, 0x8d, 0xc7, 0x0b, 0x00, 0x00,
+}
diff --git a/third_party/go/opencensus-proto/gen-go/resource/v1/BUILD.bazel b/third_party/go/opencensus-proto/gen-go/resource/v1/BUILD.bazel
new file mode 100644
index 0000000..f2a3ec3
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/resource/v1/BUILD.bazel
@@ -0,0 +1,11 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["resource.pb.go"],
+    importpath = "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1",
+    visibility = ["//visibility:public"],
+    deps = [
+        "@com_github_golang_protobuf//proto:go_default_library",
+    ],
+)
diff --git a/third_party/go/opencensus-proto/gen-go/resource/v1/resource.pb.go b/third_party/go/opencensus-proto/gen-go/resource/v1/resource.pb.go
new file mode 100644
index 0000000..5dba6a2
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/resource/v1/resource.pb.go
@@ -0,0 +1,100 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: opencensus/proto/resource/v1/resource.proto
+
+package v1
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Resource information.
+type Resource struct {
+	// Type identifier for the resource.
+	Type string `protobuf:"bytes,1,opt,name=type,proto3" json:"type,omitempty"`
+	// Set of labels that describe the resource.
+	Labels               map[string]string `protobuf:"bytes,2,rep,name=labels,proto3" json:"labels,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	XXX_NoUnkeyedLiteral struct{}          `json:"-"`
+	XXX_unrecognized     []byte            `json:"-"`
+	XXX_sizecache        int32             `json:"-"`
+}
+
+func (m *Resource) Reset()         { *m = Resource{} }
+func (m *Resource) String() string { return proto.CompactTextString(m) }
+func (*Resource) ProtoMessage()    {}
+func (*Resource) Descriptor() ([]byte, []int) {
+	return fileDescriptor_584700775a2fc762, []int{0}
+}
+
+func (m *Resource) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Resource.Unmarshal(m, b)
+}
+func (m *Resource) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Resource.Marshal(b, m, deterministic)
+}
+func (m *Resource) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Resource.Merge(m, src)
+}
+func (m *Resource) XXX_Size() int {
+	return xxx_messageInfo_Resource.Size(m)
+}
+func (m *Resource) XXX_DiscardUnknown() {
+	xxx_messageInfo_Resource.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Resource proto.InternalMessageInfo
+
+func (m *Resource) GetType() string {
+	if m != nil {
+		return m.Type
+	}
+	return ""
+}
+
+func (m *Resource) GetLabels() map[string]string {
+	if m != nil {
+		return m.Labels
+	}
+	return nil
+}
+
+func init() {
+	proto.RegisterType((*Resource)(nil), "opencensus.proto.resource.v1.Resource")
+	proto.RegisterMapType((map[string]string)(nil), "opencensus.proto.resource.v1.Resource.LabelsEntry")
+}
+
+func init() {
+	proto.RegisterFile("opencensus/proto/resource/v1/resource.proto", fileDescriptor_584700775a2fc762)
+}
+
+var fileDescriptor_584700775a2fc762 = []byte{
+	// 251 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0xce, 0x2f, 0x48, 0xcd,
+	0x4b, 0x4e, 0xcd, 0x2b, 0x2e, 0x2d, 0xd6, 0x2f, 0x28, 0xca, 0x2f, 0xc9, 0xd7, 0x2f, 0x4a, 0x2d,
+	0xce, 0x2f, 0x2d, 0x4a, 0x4e, 0xd5, 0x2f, 0x33, 0x84, 0xb3, 0xf5, 0xc0, 0x52, 0x42, 0x32, 0x08,
+	0xc5, 0x10, 0x11, 0x3d, 0xb8, 0x82, 0x32, 0x43, 0xa5, 0xa5, 0x8c, 0x5c, 0x1c, 0x41, 0x50, 0xbe,
+	0x90, 0x10, 0x17, 0x4b, 0x49, 0x65, 0x41, 0xaa, 0x04, 0xa3, 0x02, 0xa3, 0x06, 0x67, 0x10, 0x98,
+	0x2d, 0xe4, 0xc5, 0xc5, 0x96, 0x93, 0x98, 0x94, 0x9a, 0x53, 0x2c, 0xc1, 0xa4, 0xc0, 0xac, 0xc1,
+	0x6d, 0x64, 0xa4, 0x87, 0xcf, 0x3c, 0x3d, 0x98, 0x59, 0x7a, 0x3e, 0x60, 0x4d, 0xae, 0x79, 0x25,
+	0x45, 0x95, 0x41, 0x50, 0x13, 0xa4, 0x2c, 0xb9, 0xb8, 0x91, 0x84, 0x85, 0x04, 0xb8, 0x98, 0xb3,
+	0x53, 0x2b, 0xa1, 0xb6, 0x81, 0x98, 0x42, 0x22, 0x5c, 0xac, 0x65, 0x89, 0x39, 0xa5, 0xa9, 0x12,
+	0x4c, 0x60, 0x31, 0x08, 0xc7, 0x8a, 0xc9, 0x82, 0xd1, 0x69, 0x06, 0x23, 0x97, 0x7c, 0x66, 0x3e,
+	0x5e, 0xbb, 0x9d, 0x78, 0x61, 0x96, 0x07, 0x80, 0xa4, 0x02, 0x18, 0xa3, 0x5c, 0xd3, 0x33, 0x4b,
+	0x32, 0x4a, 0x93, 0xf4, 0x92, 0xf3, 0x73, 0xf5, 0x21, 0xba, 0x74, 0x33, 0xf3, 0x8a, 0x4b, 0x8a,
+	0x4a, 0x73, 0x53, 0xf3, 0x4a, 0x12, 0x4b, 0x32, 0xf3, 0xf3, 0xf4, 0x11, 0x06, 0xea, 0x42, 0x42,
+	0x32, 0x3d, 0x35, 0x4f, 0x37, 0x1d, 0x25, 0x40, 0x5f, 0x31, 0xc9, 0xf8, 0x17, 0xa4, 0xe6, 0x39,
+	0x43, 0xac, 0x05, 0x9b, 0x8d, 0xf0, 0x66, 0x98, 0x61, 0x12, 0x1b, 0x58, 0xa3, 0x31, 0x20, 0x00,
+	0x00, 0xff, 0xff, 0xcf, 0x32, 0xff, 0x46, 0x96, 0x01, 0x00, 0x00,
+}
diff --git a/third_party/go/opencensus-proto/gen-go/stats/v1/BUILD.bazel b/third_party/go/opencensus-proto/gen-go/stats/v1/BUILD.bazel
new file mode 100644
index 0000000..f3f9349
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/stats/v1/BUILD.bazel
@@ -0,0 +1,12 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = ["stats.pb.go"],
+    importpath = "github.com/census-instrumentation/opencensus-proto/gen-go/stats/v1",
+    visibility = ["//visibility:public"],
+    deps = [
+        "@com_github_golang_protobuf//proto:go_default_library",
+        "@io_bazel_rules_go//proto/wkt:timestamp_go_proto",
+    ],
+)
diff --git a/third_party/go/opencensus-proto/gen-go/stats/v1/stats.pb.go b/third_party/go/opencensus-proto/gen-go/stats/v1/stats.pb.go
new file mode 100644
index 0000000..f7f96fa
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/stats/v1/stats.pb.go
@@ -0,0 +1,644 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: opencensus/proto/stats/v1/stats.proto
+
+package v1
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+type Measure_Type int32
+
+const (
+	// Unknown type.
+	Measure_TYPE_UNSPECIFIED Measure_Type = 0
+	// Indicates an int64 Measure.
+	Measure_INT64 Measure_Type = 1
+	// Indicates a double Measure.
+	Measure_DOUBLE Measure_Type = 2
+)
+
+var Measure_Type_name = map[int32]string{
+	0: "TYPE_UNSPECIFIED",
+	1: "INT64",
+	2: "DOUBLE",
+}
+
+var Measure_Type_value = map[string]int32{
+	"TYPE_UNSPECIFIED": 0,
+	"INT64":            1,
+	"DOUBLE":           2,
+}
+
+func (x Measure_Type) String() string {
+	return proto.EnumName(Measure_Type_name, int32(x))
+}
+
+func (Measure_Type) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_5cb731b1ef81fd07, []int{1, 0}
+}
+
+// TODO(bdrutu): Consider if this should be moved to a "tags" directory to match the API structure.
+type Tag struct {
+	Key                  string   `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Tag) Reset()         { *m = Tag{} }
+func (m *Tag) String() string { return proto.CompactTextString(m) }
+func (*Tag) ProtoMessage()    {}
+func (*Tag) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5cb731b1ef81fd07, []int{0}
+}
+
+func (m *Tag) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Tag.Unmarshal(m, b)
+}
+func (m *Tag) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Tag.Marshal(b, m, deterministic)
+}
+func (m *Tag) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Tag.Merge(m, src)
+}
+func (m *Tag) XXX_Size() int {
+	return xxx_messageInfo_Tag.Size(m)
+}
+func (m *Tag) XXX_DiscardUnknown() {
+	xxx_messageInfo_Tag.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Tag proto.InternalMessageInfo
+
+func (m *Tag) GetKey() string {
+	if m != nil {
+		return m.Key
+	}
+	return ""
+}
+
+func (m *Tag) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+// Measure .
+type Measure struct {
+	// A string by which the measure will be referred to, e.g. "rpc_server_latency". Names MUST be
+	// unique within the library.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// Describes the measure, e.g. "RPC latency in seconds".
+	Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	// Describes the unit used for the Measure. Follows the format described by
+	// http://unitsofmeasure.org/ucum.html.
+	Unit string `protobuf:"bytes,3,opt,name=unit,proto3" json:"unit,omitempty"`
+	// The type used for this Measure.
+	Type                 Measure_Type `protobuf:"varint,4,opt,name=type,proto3,enum=opencensus.proto.stats.v1.Measure_Type" json:"type,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}     `json:"-"`
+	XXX_unrecognized     []byte       `json:"-"`
+	XXX_sizecache        int32        `json:"-"`
+}
+
+func (m *Measure) Reset()         { *m = Measure{} }
+func (m *Measure) String() string { return proto.CompactTextString(m) }
+func (*Measure) ProtoMessage()    {}
+func (*Measure) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5cb731b1ef81fd07, []int{1}
+}
+
+func (m *Measure) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Measure.Unmarshal(m, b)
+}
+func (m *Measure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Measure.Marshal(b, m, deterministic)
+}
+func (m *Measure) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Measure.Merge(m, src)
+}
+func (m *Measure) XXX_Size() int {
+	return xxx_messageInfo_Measure.Size(m)
+}
+func (m *Measure) XXX_DiscardUnknown() {
+	xxx_messageInfo_Measure.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Measure proto.InternalMessageInfo
+
+func (m *Measure) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *Measure) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+func (m *Measure) GetUnit() string {
+	if m != nil {
+		return m.Unit
+	}
+	return ""
+}
+
+func (m *Measure) GetType() Measure_Type {
+	if m != nil {
+		return m.Type
+	}
+	return Measure_TYPE_UNSPECIFIED
+}
+
+type View struct {
+	// A string by which the View will be referred to, e.g. "rpc_latency". Names MUST be unique
+	// within the library.
+	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
+	// Describes the view, e.g. "RPC latency distribution"
+	Description string `protobuf:"bytes,2,opt,name=description,proto3" json:"description,omitempty"`
+	// The Measure to which this view is applied.
+	Measure *Measure `protobuf:"bytes,3,opt,name=measure,proto3" json:"measure,omitempty"`
+	// An array of tag keys. These values associated with tags of this name form the basis by which
+	// individual stats will be aggregated (one aggregation per unique tag value). If none are
+	// provided, then all data is recorded in a single aggregation.
+	Columns []string `protobuf:"bytes,4,rep,name=columns,proto3" json:"columns,omitempty"`
+	// The description of the aggregation used for this view which describes how data collected are
+	// aggregated.
+	//
+	// Types that are valid to be assigned to Aggregation:
+	//	*View_CountAggregation
+	//	*View_SumAggregation
+	//	*View_LastValueAggregation
+	//	*View_DistributionAggregation
+	Aggregation          isView_Aggregation `protobuf_oneof:"aggregation"`
+	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
+	XXX_unrecognized     []byte             `json:"-"`
+	XXX_sizecache        int32              `json:"-"`
+}
+
+func (m *View) Reset()         { *m = View{} }
+func (m *View) String() string { return proto.CompactTextString(m) }
+func (*View) ProtoMessage()    {}
+func (*View) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5cb731b1ef81fd07, []int{2}
+}
+
+func (m *View) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_View.Unmarshal(m, b)
+}
+func (m *View) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_View.Marshal(b, m, deterministic)
+}
+func (m *View) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_View.Merge(m, src)
+}
+func (m *View) XXX_Size() int {
+	return xxx_messageInfo_View.Size(m)
+}
+func (m *View) XXX_DiscardUnknown() {
+	xxx_messageInfo_View.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_View proto.InternalMessageInfo
+
+func (m *View) GetName() string {
+	if m != nil {
+		return m.Name
+	}
+	return ""
+}
+
+func (m *View) GetDescription() string {
+	if m != nil {
+		return m.Description
+	}
+	return ""
+}
+
+func (m *View) GetMeasure() *Measure {
+	if m != nil {
+		return m.Measure
+	}
+	return nil
+}
+
+func (m *View) GetColumns() []string {
+	if m != nil {
+		return m.Columns
+	}
+	return nil
+}
+
+type isView_Aggregation interface {
+	isView_Aggregation()
+}
+
+type View_CountAggregation struct {
+	CountAggregation *CountAggregation `protobuf:"bytes,5,opt,name=count_aggregation,json=countAggregation,proto3,oneof"`
+}
+
+type View_SumAggregation struct {
+	SumAggregation *SumAggregation `protobuf:"bytes,6,opt,name=sum_aggregation,json=sumAggregation,proto3,oneof"`
+}
+
+type View_LastValueAggregation struct {
+	LastValueAggregation *LastValueAggregation `protobuf:"bytes,7,opt,name=last_value_aggregation,json=lastValueAggregation,proto3,oneof"`
+}
+
+type View_DistributionAggregation struct {
+	DistributionAggregation *DistributionAggregation `protobuf:"bytes,8,opt,name=distribution_aggregation,json=distributionAggregation,proto3,oneof"`
+}
+
+func (*View_CountAggregation) isView_Aggregation() {}
+
+func (*View_SumAggregation) isView_Aggregation() {}
+
+func (*View_LastValueAggregation) isView_Aggregation() {}
+
+func (*View_DistributionAggregation) isView_Aggregation() {}
+
+func (m *View) GetAggregation() isView_Aggregation {
+	if m != nil {
+		return m.Aggregation
+	}
+	return nil
+}
+
+func (m *View) GetCountAggregation() *CountAggregation {
+	if x, ok := m.GetAggregation().(*View_CountAggregation); ok {
+		return x.CountAggregation
+	}
+	return nil
+}
+
+func (m *View) GetSumAggregation() *SumAggregation {
+	if x, ok := m.GetAggregation().(*View_SumAggregation); ok {
+		return x.SumAggregation
+	}
+	return nil
+}
+
+func (m *View) GetLastValueAggregation() *LastValueAggregation {
+	if x, ok := m.GetAggregation().(*View_LastValueAggregation); ok {
+		return x.LastValueAggregation
+	}
+	return nil
+}
+
+func (m *View) GetDistributionAggregation() *DistributionAggregation {
+	if x, ok := m.GetAggregation().(*View_DistributionAggregation); ok {
+		return x.DistributionAggregation
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*View) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*View_CountAggregation)(nil),
+		(*View_SumAggregation)(nil),
+		(*View_LastValueAggregation)(nil),
+		(*View_DistributionAggregation)(nil),
+	}
+}
+
+type CountAggregation struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *CountAggregation) Reset()         { *m = CountAggregation{} }
+func (m *CountAggregation) String() string { return proto.CompactTextString(m) }
+func (*CountAggregation) ProtoMessage()    {}
+func (*CountAggregation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5cb731b1ef81fd07, []int{3}
+}
+
+func (m *CountAggregation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_CountAggregation.Unmarshal(m, b)
+}
+func (m *CountAggregation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_CountAggregation.Marshal(b, m, deterministic)
+}
+func (m *CountAggregation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_CountAggregation.Merge(m, src)
+}
+func (m *CountAggregation) XXX_Size() int {
+	return xxx_messageInfo_CountAggregation.Size(m)
+}
+func (m *CountAggregation) XXX_DiscardUnknown() {
+	xxx_messageInfo_CountAggregation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_CountAggregation proto.InternalMessageInfo
+
+type SumAggregation struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *SumAggregation) Reset()         { *m = SumAggregation{} }
+func (m *SumAggregation) String() string { return proto.CompactTextString(m) }
+func (*SumAggregation) ProtoMessage()    {}
+func (*SumAggregation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5cb731b1ef81fd07, []int{4}
+}
+
+func (m *SumAggregation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_SumAggregation.Unmarshal(m, b)
+}
+func (m *SumAggregation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_SumAggregation.Marshal(b, m, deterministic)
+}
+func (m *SumAggregation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_SumAggregation.Merge(m, src)
+}
+func (m *SumAggregation) XXX_Size() int {
+	return xxx_messageInfo_SumAggregation.Size(m)
+}
+func (m *SumAggregation) XXX_DiscardUnknown() {
+	xxx_messageInfo_SumAggregation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_SumAggregation proto.InternalMessageInfo
+
+type LastValueAggregation struct {
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *LastValueAggregation) Reset()         { *m = LastValueAggregation{} }
+func (m *LastValueAggregation) String() string { return proto.CompactTextString(m) }
+func (*LastValueAggregation) ProtoMessage()    {}
+func (*LastValueAggregation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5cb731b1ef81fd07, []int{5}
+}
+
+func (m *LastValueAggregation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_LastValueAggregation.Unmarshal(m, b)
+}
+func (m *LastValueAggregation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_LastValueAggregation.Marshal(b, m, deterministic)
+}
+func (m *LastValueAggregation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_LastValueAggregation.Merge(m, src)
+}
+func (m *LastValueAggregation) XXX_Size() int {
+	return xxx_messageInfo_LastValueAggregation.Size(m)
+}
+func (m *LastValueAggregation) XXX_DiscardUnknown() {
+	xxx_messageInfo_LastValueAggregation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_LastValueAggregation proto.InternalMessageInfo
+
+type DistributionAggregation struct {
+	// A Distribution may optionally contain a histogram of the values in the
+	// population. The bucket boundaries for that histogram are described by
+	// `bucket_bounds`. This defines `size(bucket_bounds) + 1` (= N)
+	// buckets. The boundaries for bucket index i are:
+	//
+	// (-infinity, bucket_bounds[i]) for i == 0
+	// [bucket_bounds[i-1], bucket_bounds[i]) for 0 < i < N-2
+	// [bucket_bounds[i-1], +infinity) for i == N-1
+	//
+	// i.e. an underflow bucket (number 0), zero or more finite buckets (1
+	// through N - 2, and an overflow bucket (N - 1), with inclusive lower
+	// bounds and exclusive upper bounds.
+	//
+	// If `bucket_bounds` has no elements (zero size), then there is no
+	// histogram associated with the Distribution. If `bucket_bounds` has only
+	// one element, there are no finite buckets, and that single element is the
+	// common boundary of the overflow and underflow buckets. The values must
+	// be monotonically increasing.
+	BucketBounds         []float64 `protobuf:"fixed64,1,rep,packed,name=bucket_bounds,json=bucketBounds,proto3" json:"bucket_bounds,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}  `json:"-"`
+	XXX_unrecognized     []byte    `json:"-"`
+	XXX_sizecache        int32     `json:"-"`
+}
+
+func (m *DistributionAggregation) Reset()         { *m = DistributionAggregation{} }
+func (m *DistributionAggregation) String() string { return proto.CompactTextString(m) }
+func (*DistributionAggregation) ProtoMessage()    {}
+func (*DistributionAggregation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5cb731b1ef81fd07, []int{6}
+}
+
+func (m *DistributionAggregation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_DistributionAggregation.Unmarshal(m, b)
+}
+func (m *DistributionAggregation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_DistributionAggregation.Marshal(b, m, deterministic)
+}
+func (m *DistributionAggregation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_DistributionAggregation.Merge(m, src)
+}
+func (m *DistributionAggregation) XXX_Size() int {
+	return xxx_messageInfo_DistributionAggregation.Size(m)
+}
+func (m *DistributionAggregation) XXX_DiscardUnknown() {
+	xxx_messageInfo_DistributionAggregation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_DistributionAggregation proto.InternalMessageInfo
+
+func (m *DistributionAggregation) GetBucketBounds() []float64 {
+	if m != nil {
+		return m.BucketBounds
+	}
+	return nil
+}
+
+// Describes a data point to be collected for a Measure.
+type Measurement struct {
+	Tags []*Tag `protobuf:"bytes,1,rep,name=tags,proto3" json:"tags,omitempty"`
+	// The name of the measure to which the value is applied.
+	MeasureName string `protobuf:"bytes,2,opt,name=measure_name,json=measureName,proto3" json:"measure_name,omitempty"`
+	// The recorded value, MUST have the appropriate type to match the Measure.
+	//
+	// Types that are valid to be assigned to Value:
+	//	*Measurement_DoubleValue
+	//	*Measurement_IntValue
+	Value isMeasurement_Value `protobuf_oneof:"value"`
+	// The time when this measurement was recorded. If the implementation uses a async buffer to
+	// record measurements this may be the time when the measurement was read from the buffer.
+	Time                 *timestamp.Timestamp `protobuf:"bytes,5,opt,name=time,proto3" json:"time,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}             `json:"-"`
+	XXX_unrecognized     []byte               `json:"-"`
+	XXX_sizecache        int32                `json:"-"`
+}
+
+func (m *Measurement) Reset()         { *m = Measurement{} }
+func (m *Measurement) String() string { return proto.CompactTextString(m) }
+func (*Measurement) ProtoMessage()    {}
+func (*Measurement) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5cb731b1ef81fd07, []int{7}
+}
+
+func (m *Measurement) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Measurement.Unmarshal(m, b)
+}
+func (m *Measurement) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Measurement.Marshal(b, m, deterministic)
+}
+func (m *Measurement) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Measurement.Merge(m, src)
+}
+func (m *Measurement) XXX_Size() int {
+	return xxx_messageInfo_Measurement.Size(m)
+}
+func (m *Measurement) XXX_DiscardUnknown() {
+	xxx_messageInfo_Measurement.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Measurement proto.InternalMessageInfo
+
+func (m *Measurement) GetTags() []*Tag {
+	if m != nil {
+		return m.Tags
+	}
+	return nil
+}
+
+func (m *Measurement) GetMeasureName() string {
+	if m != nil {
+		return m.MeasureName
+	}
+	return ""
+}
+
+type isMeasurement_Value interface {
+	isMeasurement_Value()
+}
+
+type Measurement_DoubleValue struct {
+	DoubleValue float64 `protobuf:"fixed64,3,opt,name=double_value,json=doubleValue,proto3,oneof"`
+}
+
+type Measurement_IntValue struct {
+	IntValue int64 `protobuf:"varint,4,opt,name=int_value,json=intValue,proto3,oneof"`
+}
+
+func (*Measurement_DoubleValue) isMeasurement_Value() {}
+
+func (*Measurement_IntValue) isMeasurement_Value() {}
+
+func (m *Measurement) GetValue() isMeasurement_Value {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func (m *Measurement) GetDoubleValue() float64 {
+	if x, ok := m.GetValue().(*Measurement_DoubleValue); ok {
+		return x.DoubleValue
+	}
+	return 0
+}
+
+func (m *Measurement) GetIntValue() int64 {
+	if x, ok := m.GetValue().(*Measurement_IntValue); ok {
+		return x.IntValue
+	}
+	return 0
+}
+
+func (m *Measurement) GetTime() *timestamp.Timestamp {
+	if m != nil {
+		return m.Time
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Measurement) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Measurement_DoubleValue)(nil),
+		(*Measurement_IntValue)(nil),
+	}
+}
+
+func init() {
+	proto.RegisterEnum("opencensus.proto.stats.v1.Measure_Type", Measure_Type_name, Measure_Type_value)
+	proto.RegisterType((*Tag)(nil), "opencensus.proto.stats.v1.Tag")
+	proto.RegisterType((*Measure)(nil), "opencensus.proto.stats.v1.Measure")
+	proto.RegisterType((*View)(nil), "opencensus.proto.stats.v1.View")
+	proto.RegisterType((*CountAggregation)(nil), "opencensus.proto.stats.v1.CountAggregation")
+	proto.RegisterType((*SumAggregation)(nil), "opencensus.proto.stats.v1.SumAggregation")
+	proto.RegisterType((*LastValueAggregation)(nil), "opencensus.proto.stats.v1.LastValueAggregation")
+	proto.RegisterType((*DistributionAggregation)(nil), "opencensus.proto.stats.v1.DistributionAggregation")
+	proto.RegisterType((*Measurement)(nil), "opencensus.proto.stats.v1.Measurement")
+}
+
+func init() {
+	proto.RegisterFile("opencensus/proto/stats/v1/stats.proto", fileDescriptor_5cb731b1ef81fd07)
+}
+
+var fileDescriptor_5cb731b1ef81fd07 = []byte{
+	// 654 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x9c, 0x54, 0xdd, 0x4e, 0xdb, 0x4c,
+	0x10, 0x8d, 0x89, 0x21, 0x64, 0x02, 0x7c, 0xfe, 0x56, 0x11, 0x18, 0xd4, 0x9f, 0xd4, 0xa8, 0x6a,
+	0xaa, 0x2a, 0xb6, 0x08, 0x55, 0x6f, 0x5a, 0x55, 0xaa, 0x21, 0x15, 0x48, 0x14, 0x22, 0x63, 0x90,
+	0xca, 0x4d, 0x64, 0x3b, 0x5b, 0xd7, 0x22, 0xde, 0xb5, 0xbc, 0xbb, 0x54, 0xbc, 0x43, 0xdf, 0xa5,
+	0x4f, 0xd1, 0x07, 0xe9, 0x6d, 0x9f, 0xa2, 0xf2, 0xae, 0xa3, 0x60, 0x44, 0x52, 0xa9, 0x77, 0xb3,
+	0xc7, 0x73, 0xce, 0xd9, 0x99, 0x1d, 0x0f, 0x3c, 0xa7, 0x19, 0x26, 0x11, 0x26, 0x4c, 0x30, 0x27,
+	0xcb, 0x29, 0xa7, 0x0e, 0xe3, 0x01, 0x67, 0xce, 0xcd, 0x9e, 0x0a, 0x6c, 0x09, 0xa2, 0xed, 0x59,
+	0x9a, 0x42, 0x6c, 0xf5, 0xf5, 0x66, 0x6f, 0xe7, 0x69, 0x4c, 0x69, 0x3c, 0xc1, 0x8a, 0x1d, 0x8a,
+	0x2f, 0x0e, 0x4f, 0x52, 0xcc, 0x78, 0x90, 0x66, 0x2a, 0xd3, 0xea, 0x41, 0xdd, 0x0f, 0x62, 0x64,
+	0x40, 0xfd, 0x1a, 0xdf, 0x9a, 0x5a, 0x47, 0xeb, 0x36, 0xbd, 0x22, 0x44, 0x6d, 0x58, 0xbe, 0x09,
+	0x26, 0x02, 0x9b, 0x4b, 0x12, 0x53, 0x07, 0xeb, 0xa7, 0x06, 0x8d, 0x4f, 0x38, 0x60, 0x22, 0xc7,
+	0x08, 0x81, 0x4e, 0x82, 0x14, 0x97, 0x24, 0x19, 0xa3, 0x0e, 0xb4, 0xc6, 0x98, 0x45, 0x79, 0x92,
+	0xf1, 0x84, 0x92, 0x92, 0x7b, 0x17, 0x2a, 0x58, 0x82, 0x24, 0xdc, 0xac, 0x2b, 0x56, 0x11, 0xa3,
+	0xb7, 0xa0, 0xf3, 0xdb, 0x0c, 0x9b, 0x7a, 0x47, 0xeb, 0x6e, 0xf4, 0x5f, 0xd8, 0x73, 0xeb, 0xb1,
+	0x4b, 0x6f, 0xdb, 0xbf, 0xcd, 0xb0, 0x27, 0x49, 0xd6, 0x3e, 0xe8, 0xc5, 0x09, 0xb5, 0xc1, 0xf0,
+	0x3f, 0x0f, 0x07, 0xa3, 0x8b, 0xd3, 0xf3, 0xe1, 0xe0, 0xe0, 0xf8, 0xe3, 0xf1, 0xe0, 0xd0, 0xa8,
+	0xa1, 0x26, 0x2c, 0x1f, 0x9f, 0xfa, 0x6f, 0x5e, 0x1b, 0x1a, 0x02, 0x58, 0x39, 0x3c, 0xbb, 0x70,
+	0x4f, 0x06, 0xc6, 0x92, 0xf5, 0x43, 0x07, 0xfd, 0x32, 0xc1, 0xdf, 0xfe, 0xb1, 0x88, 0x77, 0xd0,
+	0x48, 0xd5, 0x4d, 0x64, 0x1d, 0xad, 0xbe, 0xf5, 0xf7, 0x3b, 0x7b, 0x53, 0x0a, 0x32, 0xa1, 0x11,
+	0xd1, 0x89, 0x48, 0x09, 0x33, 0xf5, 0x4e, 0xbd, 0xdb, 0xf4, 0xa6, 0x47, 0x74, 0x05, 0xff, 0x47,
+	0x54, 0x10, 0x3e, 0x0a, 0xe2, 0x38, 0xc7, 0x71, 0x20, 0xfd, 0x97, 0xa5, 0xc3, 0xab, 0x05, 0x0e,
+	0x07, 0x05, 0xe7, 0xc3, 0x8c, 0x72, 0x54, 0xf3, 0x8c, 0xe8, 0x1e, 0x86, 0x7c, 0xf8, 0x8f, 0x89,
+	0xb4, 0xa2, 0xbc, 0x22, 0x95, 0x5f, 0x2e, 0x50, 0x3e, 0x17, 0x69, 0x55, 0x77, 0x83, 0x55, 0x10,
+	0x14, 0xc3, 0xe6, 0x24, 0x60, 0x7c, 0x24, 0xc7, 0xa3, 0x22, 0xde, 0x90, 0xe2, 0xce, 0x02, 0xf1,
+	0x93, 0x80, 0xf1, 0xcb, 0x82, 0x57, 0xb5, 0x68, 0x4f, 0x1e, 0xc0, 0x11, 0x05, 0x73, 0x9c, 0x30,
+	0x9e, 0x27, 0xa1, 0x28, 0xce, 0x15, 0xab, 0x55, 0x69, 0xd5, 0x5f, 0x60, 0x75, 0x78, 0x87, 0x5a,
+	0x75, 0xdb, 0x1a, 0x3f, 0xfc, 0xc9, 0x5d, 0x87, 0xd6, 0x1d, 0x0f, 0x0b, 0x81, 0x71, 0xbf, 0xcd,
+	0x96, 0x01, 0x1b, 0xd5, 0x06, 0x59, 0x9b, 0xd0, 0x7e, 0xa8, 0x2a, 0xeb, 0x3d, 0x6c, 0xcd, 0xb9,
+	0x02, 0xda, 0x85, 0xf5, 0x50, 0x44, 0xd7, 0x98, 0x8f, 0x42, 0x2a, 0xc8, 0x98, 0x99, 0x5a, 0xa7,
+	0xde, 0xd5, 0xbc, 0x35, 0x05, 0xba, 0x12, 0xb3, 0x7e, 0x69, 0xd0, 0x2a, 0xe7, 0x28, 0xc5, 0x84,
+	0xa3, 0x3e, 0xe8, 0x3c, 0x88, 0x55, 0x6e, 0xab, 0xff, 0x64, 0x41, 0xe5, 0x7e, 0x10, 0x7b, 0x32,
+	0x17, 0x3d, 0x83, 0xb5, 0x72, 0x02, 0x47, 0x72, 0xe4, 0xcb, 0xb9, 0x2e, 0xb1, 0xd3, 0x62, 0xf2,
+	0x77, 0x61, 0x6d, 0x4c, 0x45, 0x38, 0xc1, 0xea, 0x3d, 0xe5, 0x70, 0x6b, 0x47, 0x35, 0xaf, 0xa5,
+	0x50, 0x59, 0x16, 0x7a, 0x0c, 0xcd, 0x84, 0x94, 0x2f, 0x2e, 0x7f, 0xd9, 0xfa, 0x51, 0xcd, 0x5b,
+	0x4d, 0x88, 0xaa, 0x1a, 0xd9, 0xa0, 0x17, 0x4b, 0xa6, 0x1c, 0xdb, 0x1d, 0x5b, 0x6d, 0x20, 0x7b,
+	0xba, 0x81, 0x6c, 0x7f, 0xba, 0x81, 0x3c, 0x99, 0xe7, 0x36, 0xca, 0x45, 0xe3, 0x7e, 0xd7, 0xe0,
+	0x51, 0x42, 0xe7, 0x97, 0xe2, 0xc2, 0x79, 0x11, 0x0d, 0x0b, 0x70, 0xa8, 0x5d, 0xb9, 0x71, 0xc2,
+	0xbf, 0x8a, 0xd0, 0x8e, 0x68, 0xea, 0xa8, 0xfc, 0x5e, 0x42, 0x18, 0xcf, 0x45, 0xd1, 0x20, 0xd9,
+	0x5a, 0x67, 0x26, 0xd5, 0x53, 0xeb, 0x33, 0xc6, 0xa4, 0x17, 0xcf, 0xb6, 0xe8, 0xef, 0xa5, 0xed,
+	0xb3, 0x0c, 0x93, 0x03, 0xe5, 0x26, 0x85, 0x6d, 0xe9, 0x61, 0x5f, 0xee, 0x85, 0x2b, 0x92, 0xb2,
+	0xff, 0x27, 0x00, 0x00, 0xff, 0xff, 0x25, 0x26, 0x34, 0x5a, 0x85, 0x05, 0x00, 0x00,
+}
diff --git a/third_party/go/opencensus-proto/gen-go/trace/v1/BUILD.bazel b/third_party/go/opencensus-proto/gen-go/trace/v1/BUILD.bazel
new file mode 100644
index 0000000..6ec165d
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/trace/v1/BUILD.bazel
@@ -0,0 +1,17 @@
+load("@io_bazel_rules_go//go:def.bzl", "go_library")
+
+go_library(
+    name = "go_default_library",
+    srcs = [
+        "trace.pb.go",
+        "trace_config.pb.go",
+    ],
+    importpath = "github.com/census-instrumentation/opencensus-proto/gen-go/trace/v1",
+    visibility = ["//visibility:public"],
+    deps = [
+        "@com_github_census_instrumentation_opencensus_proto//gen-go/resource/v1:go_default_library",
+        "@com_github_golang_protobuf//proto:go_default_library",
+        "@io_bazel_rules_go//proto/wkt:timestamp_go_proto",
+        "@io_bazel_rules_go//proto/wkt:wrappers_go_proto",
+    ],
+)
diff --git a/third_party/go/opencensus-proto/gen-go/trace/v1/trace.pb.go b/third_party/go/opencensus-proto/gen-go/trace/v1/trace.pb.go
new file mode 100644
index 0000000..2f4ab19
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/trace/v1/trace.pb.go
@@ -0,0 +1,1553 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: opencensus/proto/trace/v1/trace.proto
+
+package v1
+
+import (
+	fmt "fmt"
+	v1 "github.com/census-instrumentation/opencensus-proto/gen-go/resource/v1"
+	proto "github.com/golang/protobuf/proto"
+	timestamp "github.com/golang/protobuf/ptypes/timestamp"
+	wrappers "github.com/golang/protobuf/ptypes/wrappers"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// Type of span. Can be used to specify additional relationships between spans
+// in addition to a parent/child relationship.
+type Span_SpanKind int32
+
+const (
+	// Unspecified.
+	Span_SPAN_KIND_UNSPECIFIED Span_SpanKind = 0
+	// Indicates that the span covers server-side handling of an RPC or other
+	// remote network request.
+	Span_SERVER Span_SpanKind = 1
+	// Indicates that the span covers the client-side wrapper around an RPC or
+	// other remote request.
+	Span_CLIENT Span_SpanKind = 2
+)
+
+var Span_SpanKind_name = map[int32]string{
+	0: "SPAN_KIND_UNSPECIFIED",
+	1: "SERVER",
+	2: "CLIENT",
+}
+
+var Span_SpanKind_value = map[string]int32{
+	"SPAN_KIND_UNSPECIFIED": 0,
+	"SERVER":                1,
+	"CLIENT":                2,
+}
+
+func (x Span_SpanKind) String() string {
+	return proto.EnumName(Span_SpanKind_name, int32(x))
+}
+
+func (Span_SpanKind) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 0}
+}
+
+// Indicates whether the message was sent or received.
+type Span_TimeEvent_MessageEvent_Type int32
+
+const (
+	// Unknown event type.
+	Span_TimeEvent_MessageEvent_TYPE_UNSPECIFIED Span_TimeEvent_MessageEvent_Type = 0
+	// Indicates a sent message.
+	Span_TimeEvent_MessageEvent_SENT Span_TimeEvent_MessageEvent_Type = 1
+	// Indicates a received message.
+	Span_TimeEvent_MessageEvent_RECEIVED Span_TimeEvent_MessageEvent_Type = 2
+)
+
+var Span_TimeEvent_MessageEvent_Type_name = map[int32]string{
+	0: "TYPE_UNSPECIFIED",
+	1: "SENT",
+	2: "RECEIVED",
+}
+
+var Span_TimeEvent_MessageEvent_Type_value = map[string]int32{
+	"TYPE_UNSPECIFIED": 0,
+	"SENT":             1,
+	"RECEIVED":         2,
+}
+
+func (x Span_TimeEvent_MessageEvent_Type) String() string {
+	return proto.EnumName(Span_TimeEvent_MessageEvent_Type_name, int32(x))
+}
+
+func (Span_TimeEvent_MessageEvent_Type) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 2, 1, 0}
+}
+
+// The relationship of the current span relative to the linked span: child,
+// parent, or unspecified.
+type Span_Link_Type int32
+
+const (
+	// The relationship of the two spans is unknown, or known but other
+	// than parent-child.
+	Span_Link_TYPE_UNSPECIFIED Span_Link_Type = 0
+	// The linked span is a child of the current span.
+	Span_Link_CHILD_LINKED_SPAN Span_Link_Type = 1
+	// The linked span is a parent of the current span.
+	Span_Link_PARENT_LINKED_SPAN Span_Link_Type = 2
+)
+
+var Span_Link_Type_name = map[int32]string{
+	0: "TYPE_UNSPECIFIED",
+	1: "CHILD_LINKED_SPAN",
+	2: "PARENT_LINKED_SPAN",
+}
+
+var Span_Link_Type_value = map[string]int32{
+	"TYPE_UNSPECIFIED":   0,
+	"CHILD_LINKED_SPAN":  1,
+	"PARENT_LINKED_SPAN": 2,
+}
+
+func (x Span_Link_Type) String() string {
+	return proto.EnumName(Span_Link_Type_name, int32(x))
+}
+
+func (Span_Link_Type) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 4, 0}
+}
+
+// A span represents a single operation within a trace. Spans can be
+// nested to form a trace tree. Spans may also be linked to other spans
+// from the same or different trace. And form graphs. Often, a trace
+// contains a root span that describes the end-to-end latency, and one
+// or more subspans for its sub-operations. A trace can also contain
+// multiple root spans, or none at all. Spans do not need to be
+// contiguous - there may be gaps or overlaps between spans in a trace.
+//
+// The next id is 17.
+// TODO(bdrutu): Add an example.
+type Span struct {
+	// A unique identifier for a trace. All spans from the same trace share
+	// the same `trace_id`. The ID is a 16-byte array. An ID with all zeroes
+	// is considered invalid.
+	//
+	// This field is semantically required. Receiver should generate new
+	// random trace_id if empty or invalid trace_id was received.
+	//
+	// This field is required.
+	TraceId []byte `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"`
+	// A unique identifier for a span within a trace, assigned when the span
+	// is created. The ID is an 8-byte array. An ID with all zeroes is considered
+	// invalid.
+	//
+	// This field is semantically required. Receiver should generate new
+	// random span_id if empty or invalid span_id was received.
+	//
+	// This field is required.
+	SpanId []byte `protobuf:"bytes,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"`
+	// The Tracestate on the span.
+	Tracestate *Span_Tracestate `protobuf:"bytes,15,opt,name=tracestate,proto3" json:"tracestate,omitempty"`
+	// The `span_id` of this span's parent span. If this is a root span, then this
+	// field must be empty. The ID is an 8-byte array.
+	ParentSpanId []byte `protobuf:"bytes,3,opt,name=parent_span_id,json=parentSpanId,proto3" json:"parent_span_id,omitempty"`
+	// A description of the span's operation.
+	//
+	// For example, the name can be a qualified method name or a file name
+	// and a line number where the operation is called. A best practice is to use
+	// the same display name at the same call point in an application.
+	// This makes it easier to correlate spans in different traces.
+	//
+	// This field is semantically required to be set to non-empty string.
+	// When null or empty string received - receiver may use string "name"
+	// as a replacement. There might be smarted algorithms implemented by
+	// receiver to fix the empty span name.
+	//
+	// This field is required.
+	Name *TruncatableString `protobuf:"bytes,4,opt,name=name,proto3" json:"name,omitempty"`
+	// Distinguishes between spans generated in a particular context. For example,
+	// two spans with the same name may be distinguished using `CLIENT` (caller)
+	// and `SERVER` (callee) to identify queueing latency associated with the span.
+	Kind Span_SpanKind `protobuf:"varint,14,opt,name=kind,proto3,enum=opencensus.proto.trace.v1.Span_SpanKind" json:"kind,omitempty"`
+	// The start time of the span. On the client side, this is the time kept by
+	// the local machine where the span execution starts. On the server side, this
+	// is the time when the server's application handler starts running.
+	//
+	// This field is semantically required. When not set on receive -
+	// receiver should set it to the value of end_time field if it was
+	// set. Or to the current time if neither was set. It is important to
+	// keep end_time > start_time for consistency.
+	//
+	// This field is required.
+	StartTime *timestamp.Timestamp `protobuf:"bytes,5,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"`
+	// The end time of the span. On the client side, this is the time kept by
+	// the local machine where the span execution ends. On the server side, this
+	// is the time when the server application handler stops running.
+	//
+	// This field is semantically required. When not set on receive -
+	// receiver should set it to start_time value. It is important to
+	// keep end_time > start_time for consistency.
+	//
+	// This field is required.
+	EndTime *timestamp.Timestamp `protobuf:"bytes,6,opt,name=end_time,json=endTime,proto3" json:"end_time,omitempty"`
+	// A set of attributes on the span.
+	Attributes *Span_Attributes `protobuf:"bytes,7,opt,name=attributes,proto3" json:"attributes,omitempty"`
+	// A stack trace captured at the start of the span.
+	StackTrace *StackTrace `protobuf:"bytes,8,opt,name=stack_trace,json=stackTrace,proto3" json:"stack_trace,omitempty"`
+	// The included time events.
+	TimeEvents *Span_TimeEvents `protobuf:"bytes,9,opt,name=time_events,json=timeEvents,proto3" json:"time_events,omitempty"`
+	// The included links.
+	Links *Span_Links `protobuf:"bytes,10,opt,name=links,proto3" json:"links,omitempty"`
+	// An optional final status for this span. Semantically when Status
+	// wasn't set it is means span ended without errors and assume
+	// Status.Ok (code = 0).
+	Status *Status `protobuf:"bytes,11,opt,name=status,proto3" json:"status,omitempty"`
+	// An optional resource that is associated with this span. If not set, this span
+	// should be part of a batch that does include the resource information, unless resource
+	// information is unknown.
+	Resource *v1.Resource `protobuf:"bytes,16,opt,name=resource,proto3" json:"resource,omitempty"`
+	// A highly recommended but not required flag that identifies when a
+	// trace crosses a process boundary. True when the parent_span belongs
+	// to the same process as the current span. This flag is most commonly
+	// used to indicate the need to adjust time as clocks in different
+	// processes may not be synchronized.
+	SameProcessAsParentSpan *wrappers.BoolValue `protobuf:"bytes,12,opt,name=same_process_as_parent_span,json=sameProcessAsParentSpan,proto3" json:"same_process_as_parent_span,omitempty"`
+	// An optional number of child spans that were generated while this span
+	// was active. If set, allows an implementation to detect missing child spans.
+	ChildSpanCount       *wrappers.UInt32Value `protobuf:"bytes,13,opt,name=child_span_count,json=childSpanCount,proto3" json:"child_span_count,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}              `json:"-"`
+	XXX_unrecognized     []byte                `json:"-"`
+	XXX_sizecache        int32                 `json:"-"`
+}
+
+func (m *Span) Reset()         { *m = Span{} }
+func (m *Span) String() string { return proto.CompactTextString(m) }
+func (*Span) ProtoMessage()    {}
+func (*Span) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0}
+}
+
+func (m *Span) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Span.Unmarshal(m, b)
+}
+func (m *Span) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Span.Marshal(b, m, deterministic)
+}
+func (m *Span) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Span.Merge(m, src)
+}
+func (m *Span) XXX_Size() int {
+	return xxx_messageInfo_Span.Size(m)
+}
+func (m *Span) XXX_DiscardUnknown() {
+	xxx_messageInfo_Span.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Span proto.InternalMessageInfo
+
+func (m *Span) GetTraceId() []byte {
+	if m != nil {
+		return m.TraceId
+	}
+	return nil
+}
+
+func (m *Span) GetSpanId() []byte {
+	if m != nil {
+		return m.SpanId
+	}
+	return nil
+}
+
+func (m *Span) GetTracestate() *Span_Tracestate {
+	if m != nil {
+		return m.Tracestate
+	}
+	return nil
+}
+
+func (m *Span) GetParentSpanId() []byte {
+	if m != nil {
+		return m.ParentSpanId
+	}
+	return nil
+}
+
+func (m *Span) GetName() *TruncatableString {
+	if m != nil {
+		return m.Name
+	}
+	return nil
+}
+
+func (m *Span) GetKind() Span_SpanKind {
+	if m != nil {
+		return m.Kind
+	}
+	return Span_SPAN_KIND_UNSPECIFIED
+}
+
+func (m *Span) GetStartTime() *timestamp.Timestamp {
+	if m != nil {
+		return m.StartTime
+	}
+	return nil
+}
+
+func (m *Span) GetEndTime() *timestamp.Timestamp {
+	if m != nil {
+		return m.EndTime
+	}
+	return nil
+}
+
+func (m *Span) GetAttributes() *Span_Attributes {
+	if m != nil {
+		return m.Attributes
+	}
+	return nil
+}
+
+func (m *Span) GetStackTrace() *StackTrace {
+	if m != nil {
+		return m.StackTrace
+	}
+	return nil
+}
+
+func (m *Span) GetTimeEvents() *Span_TimeEvents {
+	if m != nil {
+		return m.TimeEvents
+	}
+	return nil
+}
+
+func (m *Span) GetLinks() *Span_Links {
+	if m != nil {
+		return m.Links
+	}
+	return nil
+}
+
+func (m *Span) GetStatus() *Status {
+	if m != nil {
+		return m.Status
+	}
+	return nil
+}
+
+func (m *Span) GetResource() *v1.Resource {
+	if m != nil {
+		return m.Resource
+	}
+	return nil
+}
+
+func (m *Span) GetSameProcessAsParentSpan() *wrappers.BoolValue {
+	if m != nil {
+		return m.SameProcessAsParentSpan
+	}
+	return nil
+}
+
+func (m *Span) GetChildSpanCount() *wrappers.UInt32Value {
+	if m != nil {
+		return m.ChildSpanCount
+	}
+	return nil
+}
+
+// This field conveys information about request position in multiple distributed tracing graphs.
+// It is a list of Tracestate.Entry with a maximum of 32 members in the list.
+//
+// See the https://github.com/w3c/distributed-tracing for more details about this field.
+type Span_Tracestate struct {
+	// A list of entries that represent the Tracestate.
+	Entries              []*Span_Tracestate_Entry `protobuf:"bytes,1,rep,name=entries,proto3" json:"entries,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                 `json:"-"`
+	XXX_unrecognized     []byte                   `json:"-"`
+	XXX_sizecache        int32                    `json:"-"`
+}
+
+func (m *Span_Tracestate) Reset()         { *m = Span_Tracestate{} }
+func (m *Span_Tracestate) String() string { return proto.CompactTextString(m) }
+func (*Span_Tracestate) ProtoMessage()    {}
+func (*Span_Tracestate) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 0}
+}
+
+func (m *Span_Tracestate) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Span_Tracestate.Unmarshal(m, b)
+}
+func (m *Span_Tracestate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Span_Tracestate.Marshal(b, m, deterministic)
+}
+func (m *Span_Tracestate) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Span_Tracestate.Merge(m, src)
+}
+func (m *Span_Tracestate) XXX_Size() int {
+	return xxx_messageInfo_Span_Tracestate.Size(m)
+}
+func (m *Span_Tracestate) XXX_DiscardUnknown() {
+	xxx_messageInfo_Span_Tracestate.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Span_Tracestate proto.InternalMessageInfo
+
+func (m *Span_Tracestate) GetEntries() []*Span_Tracestate_Entry {
+	if m != nil {
+		return m.Entries
+	}
+	return nil
+}
+
+type Span_Tracestate_Entry struct {
+	// The key must begin with a lowercase letter, and can only contain
+	// lowercase letters 'a'-'z', digits '0'-'9', underscores '_', dashes
+	// '-', asterisks '*', and forward slashes '/'.
+	Key string `protobuf:"bytes,1,opt,name=key,proto3" json:"key,omitempty"`
+	// The value is opaque string up to 256 characters printable ASCII
+	// RFC0020 characters (i.e., the range 0x20 to 0x7E) except ',' and '='.
+	// Note that this also excludes tabs, newlines, carriage returns, etc.
+	Value                string   `protobuf:"bytes,2,opt,name=value,proto3" json:"value,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Span_Tracestate_Entry) Reset()         { *m = Span_Tracestate_Entry{} }
+func (m *Span_Tracestate_Entry) String() string { return proto.CompactTextString(m) }
+func (*Span_Tracestate_Entry) ProtoMessage()    {}
+func (*Span_Tracestate_Entry) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 0, 0}
+}
+
+func (m *Span_Tracestate_Entry) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Span_Tracestate_Entry.Unmarshal(m, b)
+}
+func (m *Span_Tracestate_Entry) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Span_Tracestate_Entry.Marshal(b, m, deterministic)
+}
+func (m *Span_Tracestate_Entry) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Span_Tracestate_Entry.Merge(m, src)
+}
+func (m *Span_Tracestate_Entry) XXX_Size() int {
+	return xxx_messageInfo_Span_Tracestate_Entry.Size(m)
+}
+func (m *Span_Tracestate_Entry) XXX_DiscardUnknown() {
+	xxx_messageInfo_Span_Tracestate_Entry.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Span_Tracestate_Entry proto.InternalMessageInfo
+
+func (m *Span_Tracestate_Entry) GetKey() string {
+	if m != nil {
+		return m.Key
+	}
+	return ""
+}
+
+func (m *Span_Tracestate_Entry) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+// A set of attributes, each with a key and a value.
+type Span_Attributes struct {
+	// The set of attributes. The value can be a string, an integer, a double
+	// or the Boolean values `true` or `false`. Note, global attributes like
+	// server name can be set as tags using resource API. Examples of attributes:
+	//
+	//     "/http/user_agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36"
+	//     "/http/server_latency": 300
+	//     "abc.com/myattribute": true
+	//     "abc.com/score": 10.239
+	AttributeMap map[string]*AttributeValue `protobuf:"bytes,1,rep,name=attribute_map,json=attributeMap,proto3" json:"attribute_map,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"`
+	// The number of attributes that were discarded. Attributes can be discarded
+	// because their keys are too long or because there are too many attributes.
+	// If this value is 0, then no attributes were dropped.
+	DroppedAttributesCount int32    `protobuf:"varint,2,opt,name=dropped_attributes_count,json=droppedAttributesCount,proto3" json:"dropped_attributes_count,omitempty"`
+	XXX_NoUnkeyedLiteral   struct{} `json:"-"`
+	XXX_unrecognized       []byte   `json:"-"`
+	XXX_sizecache          int32    `json:"-"`
+}
+
+func (m *Span_Attributes) Reset()         { *m = Span_Attributes{} }
+func (m *Span_Attributes) String() string { return proto.CompactTextString(m) }
+func (*Span_Attributes) ProtoMessage()    {}
+func (*Span_Attributes) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 1}
+}
+
+func (m *Span_Attributes) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Span_Attributes.Unmarshal(m, b)
+}
+func (m *Span_Attributes) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Span_Attributes.Marshal(b, m, deterministic)
+}
+func (m *Span_Attributes) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Span_Attributes.Merge(m, src)
+}
+func (m *Span_Attributes) XXX_Size() int {
+	return xxx_messageInfo_Span_Attributes.Size(m)
+}
+func (m *Span_Attributes) XXX_DiscardUnknown() {
+	xxx_messageInfo_Span_Attributes.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Span_Attributes proto.InternalMessageInfo
+
+func (m *Span_Attributes) GetAttributeMap() map[string]*AttributeValue {
+	if m != nil {
+		return m.AttributeMap
+	}
+	return nil
+}
+
+func (m *Span_Attributes) GetDroppedAttributesCount() int32 {
+	if m != nil {
+		return m.DroppedAttributesCount
+	}
+	return 0
+}
+
+// A time-stamped annotation or message event in the Span.
+type Span_TimeEvent struct {
+	// The time the event occurred.
+	Time *timestamp.Timestamp `protobuf:"bytes,1,opt,name=time,proto3" json:"time,omitempty"`
+	// A `TimeEvent` can contain either an `Annotation` object or a
+	// `MessageEvent` object, but not both.
+	//
+	// Types that are valid to be assigned to Value:
+	//	*Span_TimeEvent_Annotation_
+	//	*Span_TimeEvent_MessageEvent_
+	Value                isSpan_TimeEvent_Value `protobuf_oneof:"value"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *Span_TimeEvent) Reset()         { *m = Span_TimeEvent{} }
+func (m *Span_TimeEvent) String() string { return proto.CompactTextString(m) }
+func (*Span_TimeEvent) ProtoMessage()    {}
+func (*Span_TimeEvent) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 2}
+}
+
+func (m *Span_TimeEvent) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Span_TimeEvent.Unmarshal(m, b)
+}
+func (m *Span_TimeEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Span_TimeEvent.Marshal(b, m, deterministic)
+}
+func (m *Span_TimeEvent) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Span_TimeEvent.Merge(m, src)
+}
+func (m *Span_TimeEvent) XXX_Size() int {
+	return xxx_messageInfo_Span_TimeEvent.Size(m)
+}
+func (m *Span_TimeEvent) XXX_DiscardUnknown() {
+	xxx_messageInfo_Span_TimeEvent.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Span_TimeEvent proto.InternalMessageInfo
+
+func (m *Span_TimeEvent) GetTime() *timestamp.Timestamp {
+	if m != nil {
+		return m.Time
+	}
+	return nil
+}
+
+type isSpan_TimeEvent_Value interface {
+	isSpan_TimeEvent_Value()
+}
+
+type Span_TimeEvent_Annotation_ struct {
+	Annotation *Span_TimeEvent_Annotation `protobuf:"bytes,2,opt,name=annotation,proto3,oneof"`
+}
+
+type Span_TimeEvent_MessageEvent_ struct {
+	MessageEvent *Span_TimeEvent_MessageEvent `protobuf:"bytes,3,opt,name=message_event,json=messageEvent,proto3,oneof"`
+}
+
+func (*Span_TimeEvent_Annotation_) isSpan_TimeEvent_Value() {}
+
+func (*Span_TimeEvent_MessageEvent_) isSpan_TimeEvent_Value() {}
+
+func (m *Span_TimeEvent) GetValue() isSpan_TimeEvent_Value {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func (m *Span_TimeEvent) GetAnnotation() *Span_TimeEvent_Annotation {
+	if x, ok := m.GetValue().(*Span_TimeEvent_Annotation_); ok {
+		return x.Annotation
+	}
+	return nil
+}
+
+func (m *Span_TimeEvent) GetMessageEvent() *Span_TimeEvent_MessageEvent {
+	if x, ok := m.GetValue().(*Span_TimeEvent_MessageEvent_); ok {
+		return x.MessageEvent
+	}
+	return nil
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*Span_TimeEvent) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*Span_TimeEvent_Annotation_)(nil),
+		(*Span_TimeEvent_MessageEvent_)(nil),
+	}
+}
+
+// A text annotation with a set of attributes.
+type Span_TimeEvent_Annotation struct {
+	// A user-supplied message describing the event.
+	Description *TruncatableString `protobuf:"bytes,1,opt,name=description,proto3" json:"description,omitempty"`
+	// A set of attributes on the annotation.
+	Attributes           *Span_Attributes `protobuf:"bytes,2,opt,name=attributes,proto3" json:"attributes,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
+}
+
+func (m *Span_TimeEvent_Annotation) Reset()         { *m = Span_TimeEvent_Annotation{} }
+func (m *Span_TimeEvent_Annotation) String() string { return proto.CompactTextString(m) }
+func (*Span_TimeEvent_Annotation) ProtoMessage()    {}
+func (*Span_TimeEvent_Annotation) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 2, 0}
+}
+
+func (m *Span_TimeEvent_Annotation) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Span_TimeEvent_Annotation.Unmarshal(m, b)
+}
+func (m *Span_TimeEvent_Annotation) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Span_TimeEvent_Annotation.Marshal(b, m, deterministic)
+}
+func (m *Span_TimeEvent_Annotation) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Span_TimeEvent_Annotation.Merge(m, src)
+}
+func (m *Span_TimeEvent_Annotation) XXX_Size() int {
+	return xxx_messageInfo_Span_TimeEvent_Annotation.Size(m)
+}
+func (m *Span_TimeEvent_Annotation) XXX_DiscardUnknown() {
+	xxx_messageInfo_Span_TimeEvent_Annotation.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Span_TimeEvent_Annotation proto.InternalMessageInfo
+
+func (m *Span_TimeEvent_Annotation) GetDescription() *TruncatableString {
+	if m != nil {
+		return m.Description
+	}
+	return nil
+}
+
+func (m *Span_TimeEvent_Annotation) GetAttributes() *Span_Attributes {
+	if m != nil {
+		return m.Attributes
+	}
+	return nil
+}
+
+// An event describing a message sent/received between Spans.
+type Span_TimeEvent_MessageEvent struct {
+	// The type of MessageEvent. Indicates whether the message was sent or
+	// received.
+	Type Span_TimeEvent_MessageEvent_Type `protobuf:"varint,1,opt,name=type,proto3,enum=opencensus.proto.trace.v1.Span_TimeEvent_MessageEvent_Type" json:"type,omitempty"`
+	// An identifier for the MessageEvent's message that can be used to match
+	// SENT and RECEIVED MessageEvents. For example, this field could
+	// represent a sequence ID for a streaming RPC. It is recommended to be
+	// unique within a Span.
+	Id uint64 `protobuf:"varint,2,opt,name=id,proto3" json:"id,omitempty"`
+	// The number of uncompressed bytes sent or received.
+	UncompressedSize uint64 `protobuf:"varint,3,opt,name=uncompressed_size,json=uncompressedSize,proto3" json:"uncompressed_size,omitempty"`
+	// The number of compressed bytes sent or received. If zero, assumed to
+	// be the same size as uncompressed.
+	CompressedSize       uint64   `protobuf:"varint,4,opt,name=compressed_size,json=compressedSize,proto3" json:"compressed_size,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Span_TimeEvent_MessageEvent) Reset()         { *m = Span_TimeEvent_MessageEvent{} }
+func (m *Span_TimeEvent_MessageEvent) String() string { return proto.CompactTextString(m) }
+func (*Span_TimeEvent_MessageEvent) ProtoMessage()    {}
+func (*Span_TimeEvent_MessageEvent) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 2, 1}
+}
+
+func (m *Span_TimeEvent_MessageEvent) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Span_TimeEvent_MessageEvent.Unmarshal(m, b)
+}
+func (m *Span_TimeEvent_MessageEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Span_TimeEvent_MessageEvent.Marshal(b, m, deterministic)
+}
+func (m *Span_TimeEvent_MessageEvent) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Span_TimeEvent_MessageEvent.Merge(m, src)
+}
+func (m *Span_TimeEvent_MessageEvent) XXX_Size() int {
+	return xxx_messageInfo_Span_TimeEvent_MessageEvent.Size(m)
+}
+func (m *Span_TimeEvent_MessageEvent) XXX_DiscardUnknown() {
+	xxx_messageInfo_Span_TimeEvent_MessageEvent.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Span_TimeEvent_MessageEvent proto.InternalMessageInfo
+
+func (m *Span_TimeEvent_MessageEvent) GetType() Span_TimeEvent_MessageEvent_Type {
+	if m != nil {
+		return m.Type
+	}
+	return Span_TimeEvent_MessageEvent_TYPE_UNSPECIFIED
+}
+
+func (m *Span_TimeEvent_MessageEvent) GetId() uint64 {
+	if m != nil {
+		return m.Id
+	}
+	return 0
+}
+
+func (m *Span_TimeEvent_MessageEvent) GetUncompressedSize() uint64 {
+	if m != nil {
+		return m.UncompressedSize
+	}
+	return 0
+}
+
+func (m *Span_TimeEvent_MessageEvent) GetCompressedSize() uint64 {
+	if m != nil {
+		return m.CompressedSize
+	}
+	return 0
+}
+
+// A collection of `TimeEvent`s. A `TimeEvent` is a time-stamped annotation
+// on the span, consisting of either user-supplied key-value pairs, or
+// details of a message sent/received between Spans.
+type Span_TimeEvents struct {
+	// A collection of `TimeEvent`s.
+	TimeEvent []*Span_TimeEvent `protobuf:"bytes,1,rep,name=time_event,json=timeEvent,proto3" json:"time_event,omitempty"`
+	// The number of dropped annotations in all the included time events.
+	// If the value is 0, then no annotations were dropped.
+	DroppedAnnotationsCount int32 `protobuf:"varint,2,opt,name=dropped_annotations_count,json=droppedAnnotationsCount,proto3" json:"dropped_annotations_count,omitempty"`
+	// The number of dropped message events in all the included time events.
+	// If the value is 0, then no message events were dropped.
+	DroppedMessageEventsCount int32    `protobuf:"varint,3,opt,name=dropped_message_events_count,json=droppedMessageEventsCount,proto3" json:"dropped_message_events_count,omitempty"`
+	XXX_NoUnkeyedLiteral      struct{} `json:"-"`
+	XXX_unrecognized          []byte   `json:"-"`
+	XXX_sizecache             int32    `json:"-"`
+}
+
+func (m *Span_TimeEvents) Reset()         { *m = Span_TimeEvents{} }
+func (m *Span_TimeEvents) String() string { return proto.CompactTextString(m) }
+func (*Span_TimeEvents) ProtoMessage()    {}
+func (*Span_TimeEvents) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 3}
+}
+
+func (m *Span_TimeEvents) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Span_TimeEvents.Unmarshal(m, b)
+}
+func (m *Span_TimeEvents) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Span_TimeEvents.Marshal(b, m, deterministic)
+}
+func (m *Span_TimeEvents) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Span_TimeEvents.Merge(m, src)
+}
+func (m *Span_TimeEvents) XXX_Size() int {
+	return xxx_messageInfo_Span_TimeEvents.Size(m)
+}
+func (m *Span_TimeEvents) XXX_DiscardUnknown() {
+	xxx_messageInfo_Span_TimeEvents.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Span_TimeEvents proto.InternalMessageInfo
+
+func (m *Span_TimeEvents) GetTimeEvent() []*Span_TimeEvent {
+	if m != nil {
+		return m.TimeEvent
+	}
+	return nil
+}
+
+func (m *Span_TimeEvents) GetDroppedAnnotationsCount() int32 {
+	if m != nil {
+		return m.DroppedAnnotationsCount
+	}
+	return 0
+}
+
+func (m *Span_TimeEvents) GetDroppedMessageEventsCount() int32 {
+	if m != nil {
+		return m.DroppedMessageEventsCount
+	}
+	return 0
+}
+
+// A pointer from the current span to another span in the same trace or in a
+// different trace. For example, this can be used in batching operations,
+// where a single batch handler processes multiple requests from different
+// traces or when the handler receives a request from a different project.
+type Span_Link struct {
+	// A unique identifier of a trace that this linked span is part of. The ID is a
+	// 16-byte array.
+	TraceId []byte `protobuf:"bytes,1,opt,name=trace_id,json=traceId,proto3" json:"trace_id,omitempty"`
+	// A unique identifier for the linked span. The ID is an 8-byte array.
+	SpanId []byte `protobuf:"bytes,2,opt,name=span_id,json=spanId,proto3" json:"span_id,omitempty"`
+	// The relationship of the current span relative to the linked span.
+	Type Span_Link_Type `protobuf:"varint,3,opt,name=type,proto3,enum=opencensus.proto.trace.v1.Span_Link_Type" json:"type,omitempty"`
+	// A set of attributes on the link.
+	Attributes *Span_Attributes `protobuf:"bytes,4,opt,name=attributes,proto3" json:"attributes,omitempty"`
+	// The Tracestate associated with the link.
+	Tracestate           *Span_Tracestate `protobuf:"bytes,5,opt,name=tracestate,proto3" json:"tracestate,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}         `json:"-"`
+	XXX_unrecognized     []byte           `json:"-"`
+	XXX_sizecache        int32            `json:"-"`
+}
+
+func (m *Span_Link) Reset()         { *m = Span_Link{} }
+func (m *Span_Link) String() string { return proto.CompactTextString(m) }
+func (*Span_Link) ProtoMessage()    {}
+func (*Span_Link) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 4}
+}
+
+func (m *Span_Link) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Span_Link.Unmarshal(m, b)
+}
+func (m *Span_Link) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Span_Link.Marshal(b, m, deterministic)
+}
+func (m *Span_Link) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Span_Link.Merge(m, src)
+}
+func (m *Span_Link) XXX_Size() int {
+	return xxx_messageInfo_Span_Link.Size(m)
+}
+func (m *Span_Link) XXX_DiscardUnknown() {
+	xxx_messageInfo_Span_Link.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Span_Link proto.InternalMessageInfo
+
+func (m *Span_Link) GetTraceId() []byte {
+	if m != nil {
+		return m.TraceId
+	}
+	return nil
+}
+
+func (m *Span_Link) GetSpanId() []byte {
+	if m != nil {
+		return m.SpanId
+	}
+	return nil
+}
+
+func (m *Span_Link) GetType() Span_Link_Type {
+	if m != nil {
+		return m.Type
+	}
+	return Span_Link_TYPE_UNSPECIFIED
+}
+
+func (m *Span_Link) GetAttributes() *Span_Attributes {
+	if m != nil {
+		return m.Attributes
+	}
+	return nil
+}
+
+func (m *Span_Link) GetTracestate() *Span_Tracestate {
+	if m != nil {
+		return m.Tracestate
+	}
+	return nil
+}
+
+// A collection of links, which are references from this span to a span
+// in the same or different trace.
+type Span_Links struct {
+	// A collection of links.
+	Link []*Span_Link `protobuf:"bytes,1,rep,name=link,proto3" json:"link,omitempty"`
+	// The number of dropped links after the maximum size was enforced. If
+	// this value is 0, then no links were dropped.
+	DroppedLinksCount    int32    `protobuf:"varint,2,opt,name=dropped_links_count,json=droppedLinksCount,proto3" json:"dropped_links_count,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Span_Links) Reset()         { *m = Span_Links{} }
+func (m *Span_Links) String() string { return proto.CompactTextString(m) }
+func (*Span_Links) ProtoMessage()    {}
+func (*Span_Links) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{0, 5}
+}
+
+func (m *Span_Links) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Span_Links.Unmarshal(m, b)
+}
+func (m *Span_Links) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Span_Links.Marshal(b, m, deterministic)
+}
+func (m *Span_Links) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Span_Links.Merge(m, src)
+}
+func (m *Span_Links) XXX_Size() int {
+	return xxx_messageInfo_Span_Links.Size(m)
+}
+func (m *Span_Links) XXX_DiscardUnknown() {
+	xxx_messageInfo_Span_Links.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Span_Links proto.InternalMessageInfo
+
+func (m *Span_Links) GetLink() []*Span_Link {
+	if m != nil {
+		return m.Link
+	}
+	return nil
+}
+
+func (m *Span_Links) GetDroppedLinksCount() int32 {
+	if m != nil {
+		return m.DroppedLinksCount
+	}
+	return 0
+}
+
+// The `Status` type defines a logical error model that is suitable for different
+// programming environments, including REST APIs and RPC APIs. This proto's fields
+// are a subset of those of
+// [google.rpc.Status](https://github.com/googleapis/googleapis/blob/master/google/rpc/status.proto),
+// which is used by [gRPC](https://github.com/grpc).
+type Status struct {
+	// The status code. This is optional field. It is safe to assume 0 (OK)
+	// when not set.
+	Code int32 `protobuf:"varint,1,opt,name=code,proto3" json:"code,omitempty"`
+	// A developer-facing error message, which should be in English.
+	Message              string   `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *Status) Reset()         { *m = Status{} }
+func (m *Status) String() string { return proto.CompactTextString(m) }
+func (*Status) ProtoMessage()    {}
+func (*Status) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{1}
+}
+
+func (m *Status) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Status.Unmarshal(m, b)
+}
+func (m *Status) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Status.Marshal(b, m, deterministic)
+}
+func (m *Status) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Status.Merge(m, src)
+}
+func (m *Status) XXX_Size() int {
+	return xxx_messageInfo_Status.Size(m)
+}
+func (m *Status) XXX_DiscardUnknown() {
+	xxx_messageInfo_Status.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Status proto.InternalMessageInfo
+
+func (m *Status) GetCode() int32 {
+	if m != nil {
+		return m.Code
+	}
+	return 0
+}
+
+func (m *Status) GetMessage() string {
+	if m != nil {
+		return m.Message
+	}
+	return ""
+}
+
+// The value of an Attribute.
+type AttributeValue struct {
+	// The type of the value.
+	//
+	// Types that are valid to be assigned to Value:
+	//	*AttributeValue_StringValue
+	//	*AttributeValue_IntValue
+	//	*AttributeValue_BoolValue
+	//	*AttributeValue_DoubleValue
+	Value                isAttributeValue_Value `protobuf_oneof:"value"`
+	XXX_NoUnkeyedLiteral struct{}               `json:"-"`
+	XXX_unrecognized     []byte                 `json:"-"`
+	XXX_sizecache        int32                  `json:"-"`
+}
+
+func (m *AttributeValue) Reset()         { *m = AttributeValue{} }
+func (m *AttributeValue) String() string { return proto.CompactTextString(m) }
+func (*AttributeValue) ProtoMessage()    {}
+func (*AttributeValue) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{2}
+}
+
+func (m *AttributeValue) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_AttributeValue.Unmarshal(m, b)
+}
+func (m *AttributeValue) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_AttributeValue.Marshal(b, m, deterministic)
+}
+func (m *AttributeValue) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_AttributeValue.Merge(m, src)
+}
+func (m *AttributeValue) XXX_Size() int {
+	return xxx_messageInfo_AttributeValue.Size(m)
+}
+func (m *AttributeValue) XXX_DiscardUnknown() {
+	xxx_messageInfo_AttributeValue.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_AttributeValue proto.InternalMessageInfo
+
+type isAttributeValue_Value interface {
+	isAttributeValue_Value()
+}
+
+type AttributeValue_StringValue struct {
+	StringValue *TruncatableString `protobuf:"bytes,1,opt,name=string_value,json=stringValue,proto3,oneof"`
+}
+
+type AttributeValue_IntValue struct {
+	IntValue int64 `protobuf:"varint,2,opt,name=int_value,json=intValue,proto3,oneof"`
+}
+
+type AttributeValue_BoolValue struct {
+	BoolValue bool `protobuf:"varint,3,opt,name=bool_value,json=boolValue,proto3,oneof"`
+}
+
+type AttributeValue_DoubleValue struct {
+	DoubleValue float64 `protobuf:"fixed64,4,opt,name=double_value,json=doubleValue,proto3,oneof"`
+}
+
+func (*AttributeValue_StringValue) isAttributeValue_Value() {}
+
+func (*AttributeValue_IntValue) isAttributeValue_Value() {}
+
+func (*AttributeValue_BoolValue) isAttributeValue_Value() {}
+
+func (*AttributeValue_DoubleValue) isAttributeValue_Value() {}
+
+func (m *AttributeValue) GetValue() isAttributeValue_Value {
+	if m != nil {
+		return m.Value
+	}
+	return nil
+}
+
+func (m *AttributeValue) GetStringValue() *TruncatableString {
+	if x, ok := m.GetValue().(*AttributeValue_StringValue); ok {
+		return x.StringValue
+	}
+	return nil
+}
+
+func (m *AttributeValue) GetIntValue() int64 {
+	if x, ok := m.GetValue().(*AttributeValue_IntValue); ok {
+		return x.IntValue
+	}
+	return 0
+}
+
+func (m *AttributeValue) GetBoolValue() bool {
+	if x, ok := m.GetValue().(*AttributeValue_BoolValue); ok {
+		return x.BoolValue
+	}
+	return false
+}
+
+func (m *AttributeValue) GetDoubleValue() float64 {
+	if x, ok := m.GetValue().(*AttributeValue_DoubleValue); ok {
+		return x.DoubleValue
+	}
+	return 0
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*AttributeValue) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*AttributeValue_StringValue)(nil),
+		(*AttributeValue_IntValue)(nil),
+		(*AttributeValue_BoolValue)(nil),
+		(*AttributeValue_DoubleValue)(nil),
+	}
+}
+
+// The call stack which originated this span.
+type StackTrace struct {
+	// Stack frames in this stack trace.
+	StackFrames *StackTrace_StackFrames `protobuf:"bytes,1,opt,name=stack_frames,json=stackFrames,proto3" json:"stack_frames,omitempty"`
+	// The hash ID is used to conserve network bandwidth for duplicate
+	// stack traces within a single trace.
+	//
+	// Often multiple spans will have identical stack traces.
+	// The first occurrence of a stack trace should contain both
+	// `stack_frames` and a value in `stack_trace_hash_id`.
+	//
+	// Subsequent spans within the same request can refer
+	// to that stack trace by setting only `stack_trace_hash_id`.
+	//
+	// TODO: describe how to deal with the case where stack_trace_hash_id is
+	// zero because it was not set.
+	StackTraceHashId     uint64   `protobuf:"varint,2,opt,name=stack_trace_hash_id,json=stackTraceHashId,proto3" json:"stack_trace_hash_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StackTrace) Reset()         { *m = StackTrace{} }
+func (m *StackTrace) String() string { return proto.CompactTextString(m) }
+func (*StackTrace) ProtoMessage()    {}
+func (*StackTrace) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{3}
+}
+
+func (m *StackTrace) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StackTrace.Unmarshal(m, b)
+}
+func (m *StackTrace) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StackTrace.Marshal(b, m, deterministic)
+}
+func (m *StackTrace) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StackTrace.Merge(m, src)
+}
+func (m *StackTrace) XXX_Size() int {
+	return xxx_messageInfo_StackTrace.Size(m)
+}
+func (m *StackTrace) XXX_DiscardUnknown() {
+	xxx_messageInfo_StackTrace.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StackTrace proto.InternalMessageInfo
+
+func (m *StackTrace) GetStackFrames() *StackTrace_StackFrames {
+	if m != nil {
+		return m.StackFrames
+	}
+	return nil
+}
+
+func (m *StackTrace) GetStackTraceHashId() uint64 {
+	if m != nil {
+		return m.StackTraceHashId
+	}
+	return 0
+}
+
+// A single stack frame in a stack trace.
+type StackTrace_StackFrame struct {
+	// The fully-qualified name that uniquely identifies the function or
+	// method that is active in this frame.
+	FunctionName *TruncatableString `protobuf:"bytes,1,opt,name=function_name,json=functionName,proto3" json:"function_name,omitempty"`
+	// An un-mangled function name, if `function_name` is
+	// [mangled](http://www.avabodh.com/cxxin/namemangling.html). The name can
+	// be fully qualified.
+	OriginalFunctionName *TruncatableString `protobuf:"bytes,2,opt,name=original_function_name,json=originalFunctionName,proto3" json:"original_function_name,omitempty"`
+	// The name of the source file where the function call appears.
+	FileName *TruncatableString `protobuf:"bytes,3,opt,name=file_name,json=fileName,proto3" json:"file_name,omitempty"`
+	// The line number in `file_name` where the function call appears.
+	LineNumber int64 `protobuf:"varint,4,opt,name=line_number,json=lineNumber,proto3" json:"line_number,omitempty"`
+	// The column number where the function call appears, if available.
+	// This is important in JavaScript because of its anonymous functions.
+	ColumnNumber int64 `protobuf:"varint,5,opt,name=column_number,json=columnNumber,proto3" json:"column_number,omitempty"`
+	// The binary module from where the code was loaded.
+	LoadModule *Module `protobuf:"bytes,6,opt,name=load_module,json=loadModule,proto3" json:"load_module,omitempty"`
+	// The version of the deployed source code.
+	SourceVersion        *TruncatableString `protobuf:"bytes,7,opt,name=source_version,json=sourceVersion,proto3" json:"source_version,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
+	XXX_unrecognized     []byte             `json:"-"`
+	XXX_sizecache        int32              `json:"-"`
+}
+
+func (m *StackTrace_StackFrame) Reset()         { *m = StackTrace_StackFrame{} }
+func (m *StackTrace_StackFrame) String() string { return proto.CompactTextString(m) }
+func (*StackTrace_StackFrame) ProtoMessage()    {}
+func (*StackTrace_StackFrame) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{3, 0}
+}
+
+func (m *StackTrace_StackFrame) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StackTrace_StackFrame.Unmarshal(m, b)
+}
+func (m *StackTrace_StackFrame) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StackTrace_StackFrame.Marshal(b, m, deterministic)
+}
+func (m *StackTrace_StackFrame) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StackTrace_StackFrame.Merge(m, src)
+}
+func (m *StackTrace_StackFrame) XXX_Size() int {
+	return xxx_messageInfo_StackTrace_StackFrame.Size(m)
+}
+func (m *StackTrace_StackFrame) XXX_DiscardUnknown() {
+	xxx_messageInfo_StackTrace_StackFrame.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StackTrace_StackFrame proto.InternalMessageInfo
+
+func (m *StackTrace_StackFrame) GetFunctionName() *TruncatableString {
+	if m != nil {
+		return m.FunctionName
+	}
+	return nil
+}
+
+func (m *StackTrace_StackFrame) GetOriginalFunctionName() *TruncatableString {
+	if m != nil {
+		return m.OriginalFunctionName
+	}
+	return nil
+}
+
+func (m *StackTrace_StackFrame) GetFileName() *TruncatableString {
+	if m != nil {
+		return m.FileName
+	}
+	return nil
+}
+
+func (m *StackTrace_StackFrame) GetLineNumber() int64 {
+	if m != nil {
+		return m.LineNumber
+	}
+	return 0
+}
+
+func (m *StackTrace_StackFrame) GetColumnNumber() int64 {
+	if m != nil {
+		return m.ColumnNumber
+	}
+	return 0
+}
+
+func (m *StackTrace_StackFrame) GetLoadModule() *Module {
+	if m != nil {
+		return m.LoadModule
+	}
+	return nil
+}
+
+func (m *StackTrace_StackFrame) GetSourceVersion() *TruncatableString {
+	if m != nil {
+		return m.SourceVersion
+	}
+	return nil
+}
+
+// A collection of stack frames, which can be truncated.
+type StackTrace_StackFrames struct {
+	// Stack frames in this call stack.
+	Frame []*StackTrace_StackFrame `protobuf:"bytes,1,rep,name=frame,proto3" json:"frame,omitempty"`
+	// The number of stack frames that were dropped because there
+	// were too many stack frames.
+	// If this value is 0, then no stack frames were dropped.
+	DroppedFramesCount   int32    `protobuf:"varint,2,opt,name=dropped_frames_count,json=droppedFramesCount,proto3" json:"dropped_frames_count,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *StackTrace_StackFrames) Reset()         { *m = StackTrace_StackFrames{} }
+func (m *StackTrace_StackFrames) String() string { return proto.CompactTextString(m) }
+func (*StackTrace_StackFrames) ProtoMessage()    {}
+func (*StackTrace_StackFrames) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{3, 1}
+}
+
+func (m *StackTrace_StackFrames) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_StackTrace_StackFrames.Unmarshal(m, b)
+}
+func (m *StackTrace_StackFrames) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_StackTrace_StackFrames.Marshal(b, m, deterministic)
+}
+func (m *StackTrace_StackFrames) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_StackTrace_StackFrames.Merge(m, src)
+}
+func (m *StackTrace_StackFrames) XXX_Size() int {
+	return xxx_messageInfo_StackTrace_StackFrames.Size(m)
+}
+func (m *StackTrace_StackFrames) XXX_DiscardUnknown() {
+	xxx_messageInfo_StackTrace_StackFrames.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_StackTrace_StackFrames proto.InternalMessageInfo
+
+func (m *StackTrace_StackFrames) GetFrame() []*StackTrace_StackFrame {
+	if m != nil {
+		return m.Frame
+	}
+	return nil
+}
+
+func (m *StackTrace_StackFrames) GetDroppedFramesCount() int32 {
+	if m != nil {
+		return m.DroppedFramesCount
+	}
+	return 0
+}
+
+// A description of a binary module.
+type Module struct {
+	// TODO: document the meaning of this field.
+	// For example: main binary, kernel modules, and dynamic libraries
+	// such as libc.so, sharedlib.so.
+	Module *TruncatableString `protobuf:"bytes,1,opt,name=module,proto3" json:"module,omitempty"`
+	// A unique identifier for the module, usually a hash of its
+	// contents.
+	BuildId              *TruncatableString `protobuf:"bytes,2,opt,name=build_id,json=buildId,proto3" json:"build_id,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}           `json:"-"`
+	XXX_unrecognized     []byte             `json:"-"`
+	XXX_sizecache        int32              `json:"-"`
+}
+
+func (m *Module) Reset()         { *m = Module{} }
+func (m *Module) String() string { return proto.CompactTextString(m) }
+func (*Module) ProtoMessage()    {}
+func (*Module) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{4}
+}
+
+func (m *Module) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_Module.Unmarshal(m, b)
+}
+func (m *Module) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_Module.Marshal(b, m, deterministic)
+}
+func (m *Module) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_Module.Merge(m, src)
+}
+func (m *Module) XXX_Size() int {
+	return xxx_messageInfo_Module.Size(m)
+}
+func (m *Module) XXX_DiscardUnknown() {
+	xxx_messageInfo_Module.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_Module proto.InternalMessageInfo
+
+func (m *Module) GetModule() *TruncatableString {
+	if m != nil {
+		return m.Module
+	}
+	return nil
+}
+
+func (m *Module) GetBuildId() *TruncatableString {
+	if m != nil {
+		return m.BuildId
+	}
+	return nil
+}
+
+// A string that might be shortened to a specified length.
+type TruncatableString struct {
+	// The shortened string. For example, if the original string was 500 bytes long and
+	// the limit of the string was 128 bytes, then this value contains the first 128
+	// bytes of the 500-byte string. Note that truncation always happens on a
+	// character boundary, to ensure that a truncated string is still valid UTF-8.
+	// Because it may contain multi-byte characters, the size of the truncated string
+	// may be less than the truncation limit.
+	Value string `protobuf:"bytes,1,opt,name=value,proto3" json:"value,omitempty"`
+	// The number of bytes removed from the original string. If this
+	// value is 0, then the string was not shortened.
+	TruncatedByteCount   int32    `protobuf:"varint,2,opt,name=truncated_byte_count,json=truncatedByteCount,proto3" json:"truncated_byte_count,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TruncatableString) Reset()         { *m = TruncatableString{} }
+func (m *TruncatableString) String() string { return proto.CompactTextString(m) }
+func (*TruncatableString) ProtoMessage()    {}
+func (*TruncatableString) Descriptor() ([]byte, []int) {
+	return fileDescriptor_8ea38bbb821bf584, []int{5}
+}
+
+func (m *TruncatableString) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TruncatableString.Unmarshal(m, b)
+}
+func (m *TruncatableString) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TruncatableString.Marshal(b, m, deterministic)
+}
+func (m *TruncatableString) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TruncatableString.Merge(m, src)
+}
+func (m *TruncatableString) XXX_Size() int {
+	return xxx_messageInfo_TruncatableString.Size(m)
+}
+func (m *TruncatableString) XXX_DiscardUnknown() {
+	xxx_messageInfo_TruncatableString.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TruncatableString proto.InternalMessageInfo
+
+func (m *TruncatableString) GetValue() string {
+	if m != nil {
+		return m.Value
+	}
+	return ""
+}
+
+func (m *TruncatableString) GetTruncatedByteCount() int32 {
+	if m != nil {
+		return m.TruncatedByteCount
+	}
+	return 0
+}
+
+func init() {
+	proto.RegisterEnum("opencensus.proto.trace.v1.Span_SpanKind", Span_SpanKind_name, Span_SpanKind_value)
+	proto.RegisterEnum("opencensus.proto.trace.v1.Span_TimeEvent_MessageEvent_Type", Span_TimeEvent_MessageEvent_Type_name, Span_TimeEvent_MessageEvent_Type_value)
+	proto.RegisterEnum("opencensus.proto.trace.v1.Span_Link_Type", Span_Link_Type_name, Span_Link_Type_value)
+	proto.RegisterType((*Span)(nil), "opencensus.proto.trace.v1.Span")
+	proto.RegisterType((*Span_Tracestate)(nil), "opencensus.proto.trace.v1.Span.Tracestate")
+	proto.RegisterType((*Span_Tracestate_Entry)(nil), "opencensus.proto.trace.v1.Span.Tracestate.Entry")
+	proto.RegisterType((*Span_Attributes)(nil), "opencensus.proto.trace.v1.Span.Attributes")
+	proto.RegisterMapType((map[string]*AttributeValue)(nil), "opencensus.proto.trace.v1.Span.Attributes.AttributeMapEntry")
+	proto.RegisterType((*Span_TimeEvent)(nil), "opencensus.proto.trace.v1.Span.TimeEvent")
+	proto.RegisterType((*Span_TimeEvent_Annotation)(nil), "opencensus.proto.trace.v1.Span.TimeEvent.Annotation")
+	proto.RegisterType((*Span_TimeEvent_MessageEvent)(nil), "opencensus.proto.trace.v1.Span.TimeEvent.MessageEvent")
+	proto.RegisterType((*Span_TimeEvents)(nil), "opencensus.proto.trace.v1.Span.TimeEvents")
+	proto.RegisterType((*Span_Link)(nil), "opencensus.proto.trace.v1.Span.Link")
+	proto.RegisterType((*Span_Links)(nil), "opencensus.proto.trace.v1.Span.Links")
+	proto.RegisterType((*Status)(nil), "opencensus.proto.trace.v1.Status")
+	proto.RegisterType((*AttributeValue)(nil), "opencensus.proto.trace.v1.AttributeValue")
+	proto.RegisterType((*StackTrace)(nil), "opencensus.proto.trace.v1.StackTrace")
+	proto.RegisterType((*StackTrace_StackFrame)(nil), "opencensus.proto.trace.v1.StackTrace.StackFrame")
+	proto.RegisterType((*StackTrace_StackFrames)(nil), "opencensus.proto.trace.v1.StackTrace.StackFrames")
+	proto.RegisterType((*Module)(nil), "opencensus.proto.trace.v1.Module")
+	proto.RegisterType((*TruncatableString)(nil), "opencensus.proto.trace.v1.TruncatableString")
+}
+
+func init() {
+	proto.RegisterFile("opencensus/proto/trace/v1/trace.proto", fileDescriptor_8ea38bbb821bf584)
+}
+
+var fileDescriptor_8ea38bbb821bf584 = []byte{
+	// 1581 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0xdb, 0x6e, 0x1b, 0x41,
+	0x19, 0xce, 0xfa, 0xec, 0xdf, 0x8e, 0xeb, 0x4c, 0xd3, 0x74, 0x63, 0x0a, 0x0d, 0x6e, 0x0b, 0x29,
+	0x25, 0x9b, 0x26, 0x2d, 0x55, 0x8f, 0x2a, 0x71, 0xe2, 0x60, 0x37, 0xa9, 0xeb, 0x8e, 0xdd, 0x88,
+	0x83, 0xd0, 0x6a, 0xed, 0x9d, 0x38, 0x4b, 0xec, 0xd9, 0x65, 0x77, 0x36, 0x28, 0x7d, 0x01, 0x84,
+	0xe0, 0x86, 0x0b, 0xc4, 0x0b, 0x70, 0xc1, 0xeb, 0x20, 0xee, 0x79, 0x00, 0x24, 0x9e, 0x80, 0x1b,
+	0x34, 0x33, 0x7b, 0x72, 0xd2, 0x26, 0xc6, 0xbd, 0xb1, 0xe6, 0xf0, 0x7f, 0xdf, 0x3f, 0xff, 0xcc,
+	0x7f, 0x5a, 0xc3, 0x03, 0xdb, 0x21, 0x74, 0x48, 0xa8, 0xe7, 0x7b, 0x9b, 0x8e, 0x6b, 0x33, 0x7b,
+	0x93, 0xb9, 0xc6, 0x90, 0x6c, 0x9e, 0x6d, 0xc9, 0x81, 0x26, 0x16, 0xd1, 0x6a, 0x2c, 0x26, 0x57,
+	0x34, 0xb9, 0x7b, 0xb6, 0x55, 0x7b, 0x74, 0x89, 0xc1, 0x25, 0x9e, 0xed, 0xbb, 0x92, 0x24, 0x1c,
+	0x4b, 0x54, 0xed, 0xee, 0xc8, 0xb6, 0x47, 0x63, 0x22, 0x05, 0x07, 0xfe, 0xf1, 0x26, 0xb3, 0x26,
+	0xc4, 0x63, 0xc6, 0xc4, 0x09, 0x04, 0xbe, 0x77, 0x51, 0xe0, 0x77, 0xae, 0xe1, 0x38, 0xc4, 0x0d,
+	0xd4, 0xd6, 0xff, 0xbc, 0x02, 0x99, 0x9e, 0x63, 0x50, 0xb4, 0x0a, 0x05, 0x71, 0x04, 0xdd, 0x32,
+	0x55, 0x65, 0x4d, 0x59, 0x2f, 0xe3, 0xbc, 0x98, 0xb7, 0x4d, 0x74, 0x1b, 0xf2, 0x9e, 0x63, 0x50,
+	0xbe, 0x93, 0x12, 0x3b, 0x39, 0x3e, 0x6d, 0x9b, 0xe8, 0x1d, 0x80, 0x90, 0xf1, 0x98, 0xc1, 0x88,
+	0x7a, 0x63, 0x4d, 0x59, 0x2f, 0x6d, 0xff, 0x48, 0xfb, 0xaa, 0x69, 0x1a, 0x57, 0xa4, 0xf5, 0x23,
+	0x04, 0x4e, 0xa0, 0xd1, 0x7d, 0xa8, 0x38, 0x86, 0x4b, 0x28, 0xd3, 0x43, 0x5d, 0x69, 0xa1, 0xab,
+	0x2c, 0x57, 0x7b, 0x52, 0xe3, 0x4f, 0x21, 0x43, 0x8d, 0x09, 0x51, 0x33, 0x42, 0xd7, 0x8f, 0xaf,
+	0xd0, 0xd5, 0x77, 0x7d, 0x3a, 0x34, 0x98, 0x31, 0x18, 0x93, 0x1e, 0x73, 0x2d, 0x3a, 0xc2, 0x02,
+	0x89, 0x5e, 0x43, 0xe6, 0xd4, 0xa2, 0xa6, 0x5a, 0x59, 0x53, 0xd6, 0x2b, 0xdb, 0xeb, 0xd7, 0x9d,
+	0x96, 0xff, 0x1c, 0x58, 0xd4, 0xc4, 0x02, 0x85, 0x5e, 0x00, 0x78, 0xcc, 0x70, 0x99, 0xce, 0xef,
+	0x59, 0xcd, 0x8a, 0x53, 0xd4, 0x34, 0x79, 0xc7, 0x5a, 0x78, 0xc7, 0x5a, 0x3f, 0x7c, 0x04, 0x5c,
+	0x14, 0xd2, 0x7c, 0x8e, 0x7e, 0x02, 0x05, 0x42, 0x4d, 0x09, 0xcc, 0x5d, 0x0b, 0xcc, 0x13, 0x6a,
+	0x0a, 0xd8, 0x3b, 0x00, 0x83, 0x31, 0xd7, 0x1a, 0xf8, 0x8c, 0x78, 0x6a, 0x7e, 0xb6, 0x3b, 0xde,
+	0x89, 0x10, 0x38, 0x81, 0x46, 0xfb, 0x50, 0xf2, 0x98, 0x31, 0x3c, 0xd5, 0x85, 0xb4, 0x5a, 0x10,
+	0x64, 0x0f, 0xae, 0x22, 0xe3, 0xd2, 0xe2, 0xc1, 0x30, 0x78, 0xd1, 0x18, 0x1d, 0x40, 0x89, 0x9b,
+	0xa1, 0x93, 0x33, 0x42, 0x99, 0xa7, 0x16, 0x67, 0x7c, 0x78, 0x6b, 0x42, 0x9a, 0x02, 0x81, 0x81,
+	0x45, 0x63, 0xf4, 0x0a, 0xb2, 0x63, 0x8b, 0x9e, 0x7a, 0x2a, 0x5c, 0x7f, 0x1c, 0x4e, 0x73, 0xc8,
+	0x85, 0xb1, 0xc4, 0xa0, 0x17, 0x90, 0xe3, 0xee, 0xe3, 0x7b, 0x6a, 0x49, 0xa0, 0xbf, 0x7f, 0xb5,
+	0x31, 0xcc, 0xf7, 0x70, 0x00, 0x40, 0x0d, 0x28, 0x84, 0xc1, 0xa4, 0x56, 0x05, 0xf8, 0x07, 0x97,
+	0xc1, 0x51, 0xb8, 0x9d, 0x6d, 0x69, 0x38, 0x18, 0xe3, 0x08, 0x87, 0x7e, 0x0e, 0xdf, 0xf1, 0x8c,
+	0x09, 0xd1, 0x1d, 0xd7, 0x1e, 0x12, 0xcf, 0xd3, 0x0d, 0x4f, 0x4f, 0x38, 0xb1, 0x5a, 0xfe, 0xca,
+	0x33, 0x37, 0x6c, 0x7b, 0x7c, 0x64, 0x8c, 0x7d, 0x82, 0x6f, 0x73, 0x78, 0x57, 0xa2, 0x77, 0xbc,
+	0x6e, 0xe4, 0xea, 0x68, 0x1f, 0xaa, 0xc3, 0x13, 0x6b, 0x6c, 0xca, 0x68, 0x18, 0xda, 0x3e, 0x65,
+	0xea, 0xa2, 0xa0, 0xbb, 0x73, 0x89, 0xee, 0x53, 0x9b, 0xb2, 0x27, 0xdb, 0x92, 0xb0, 0x22, 0x50,
+	0x9c, 0x62, 0x97, 0x63, 0x6a, 0x7f, 0x50, 0x00, 0xe2, 0x88, 0x43, 0xef, 0x20, 0x4f, 0x28, 0x73,
+	0x2d, 0xe2, 0xa9, 0xca, 0x5a, 0x7a, 0xbd, 0xb4, 0xfd, 0x78, 0xf6, 0x70, 0xd5, 0x9a, 0x94, 0xb9,
+	0xe7, 0x38, 0x24, 0xa8, 0x6d, 0x42, 0x56, 0xac, 0xa0, 0x2a, 0xa4, 0x4f, 0xc9, 0xb9, 0xc8, 0x1a,
+	0x45, 0xcc, 0x87, 0x68, 0x19, 0xb2, 0x67, 0xfc, 0x38, 0x22, 0x5f, 0x14, 0xb1, 0x9c, 0xd4, 0xfe,
+	0x92, 0x02, 0x88, 0x3d, 0x13, 0x19, 0xb0, 0x18, 0xf9, 0xa6, 0x3e, 0x31, 0x9c, 0xe0, 0x44, 0xaf,
+	0x67, 0x77, 0xee, 0x78, 0xf8, 0xde, 0x70, 0xe4, 0xe9, 0xca, 0x46, 0x62, 0x09, 0x3d, 0x07, 0xd5,
+	0x74, 0x6d, 0xc7, 0x21, 0xa6, 0x1e, 0x87, 0x41, 0x70, 0x9b, 0xfc, 0x68, 0x59, 0xbc, 0x12, 0xec,
+	0xc7, 0xa4, 0xf2, 0xde, 0x7e, 0x03, 0x4b, 0x97, 0xc8, 0xbf, 0x60, 0xe8, 0xdb, 0xa4, 0xa1, 0xa5,
+	0xed, 0x87, 0x57, 0x9c, 0x3d, 0xa2, 0x93, 0x0f, 0x25, 0x71, 0x2f, 0x53, 0xcf, 0x95, 0xda, 0xdf,
+	0xb2, 0x50, 0x8c, 0x82, 0x03, 0x69, 0x90, 0x11, 0x39, 0x42, 0xb9, 0x36, 0x47, 0x08, 0x39, 0x74,
+	0x04, 0x60, 0x50, 0x6a, 0x33, 0x83, 0x59, 0x36, 0x0d, 0xce, 0xf1, 0x74, 0xe6, 0x58, 0xd4, 0x76,
+	0x22, 0x6c, 0x6b, 0x01, 0x27, 0x98, 0xd0, 0xaf, 0x61, 0x71, 0x42, 0x3c, 0xcf, 0x18, 0x05, 0x71,
+	0x2e, 0xf2, 0x71, 0x69, 0xfb, 0xd9, 0xec, 0xd4, 0xef, 0x25, 0x5c, 0x4c, 0x5a, 0x0b, 0xb8, 0x3c,
+	0x49, 0xcc, 0x6b, 0x7f, 0x57, 0x00, 0x62, 0xdd, 0xa8, 0x03, 0x25, 0x93, 0x78, 0x43, 0xd7, 0x72,
+	0x84, 0x19, 0xca, 0x1c, 0xf9, 0x3d, 0x49, 0x70, 0x21, 0x6d, 0xa6, 0xbe, 0x25, 0x6d, 0xd6, 0xfe,
+	0xab, 0x40, 0x39, 0x69, 0x0b, 0xfa, 0x00, 0x19, 0x76, 0xee, 0xc8, 0x27, 0xaa, 0x6c, 0xbf, 0x9a,
+	0xef, 0x46, 0xb4, 0xfe, 0xb9, 0x43, 0xb0, 0x20, 0x42, 0x15, 0x48, 0x05, 0xc5, 0x35, 0x83, 0x53,
+	0x96, 0x89, 0x1e, 0xc1, 0x92, 0x4f, 0x87, 0xf6, 0xc4, 0x71, 0x89, 0xe7, 0x11, 0x53, 0xf7, 0xac,
+	0xcf, 0x44, 0xdc, 0x7f, 0x06, 0x57, 0x93, 0x1b, 0x3d, 0xeb, 0x33, 0x41, 0x3f, 0x84, 0x1b, 0x17,
+	0x45, 0x33, 0x42, 0xb4, 0x32, 0x2d, 0x58, 0x7f, 0x0a, 0x19, 0xae, 0x13, 0x2d, 0x43, 0xb5, 0xff,
+	0x8b, 0x6e, 0x53, 0xff, 0xd4, 0xe9, 0x75, 0x9b, 0xbb, 0xed, 0xfd, 0x76, 0x73, 0xaf, 0xba, 0x80,
+	0x0a, 0x90, 0xe9, 0x35, 0x3b, 0xfd, 0xaa, 0x82, 0xca, 0x50, 0xc0, 0xcd, 0xdd, 0x66, 0xfb, 0xa8,
+	0xb9, 0x57, 0x4d, 0x35, 0xf2, 0x81, 0x8b, 0xd7, 0xfe, 0xc9, 0x53, 0x49, 0x9c, 0xb7, 0x5b, 0x00,
+	0x71, 0x11, 0x08, 0x62, 0xf7, 0xe1, 0xcc, 0x57, 0x81, 0x8b, 0x51, 0x09, 0x40, 0x2f, 0x61, 0x35,
+	0x8a, 0xd2, 0xc8, 0x23, 0xa6, 0xc3, 0xf4, 0x76, 0x18, 0xa6, 0xf1, 0xbe, 0x88, 0x53, 0xf4, 0x16,
+	0xee, 0x84, 0xd8, 0x29, 0x6f, 0x0d, 0xe1, 0x69, 0x01, 0x0f, 0xf9, 0x93, 0xf7, 0x1f, 0x04, 0xfa,
+	0xbf, 0x52, 0x90, 0xe1, 0x25, 0x65, 0xae, 0x06, 0xe8, 0x4d, 0xe0, 0x08, 0x69, 0xe1, 0x08, 0x0f,
+	0x67, 0x29, 0x5d, 0xc9, 0x67, 0x9f, 0x76, 0xd2, 0xcc, 0x37, 0xd5, 0xf6, 0xe9, 0x5e, 0x2c, 0xfb,
+	0x2d, 0xbd, 0x58, 0xfd, 0xe0, 0x4a, 0x47, 0xb9, 0x05, 0x4b, 0xbb, 0xad, 0xf6, 0xe1, 0x9e, 0x7e,
+	0xd8, 0xee, 0x1c, 0x34, 0xf7, 0xf4, 0x5e, 0x77, 0xa7, 0x53, 0x55, 0xd0, 0x0a, 0xa0, 0xee, 0x0e,
+	0x6e, 0x76, 0xfa, 0x53, 0xeb, 0xa9, 0xda, 0x6f, 0x21, 0x2b, 0x4a, 0x36, 0x7a, 0x0e, 0x19, 0x5e,
+	0xb4, 0x03, 0x57, 0xb9, 0x3f, 0xcb, 0x65, 0x61, 0x81, 0x40, 0x1a, 0xdc, 0x0c, 0x1f, 0x59, 0x94,
+	0xfd, 0x29, 0xd7, 0x58, 0x0a, 0xb6, 0x84, 0x12, 0xf1, 0xa6, 0xf5, 0x37, 0x50, 0x08, 0xfb, 0x36,
+	0xb4, 0x0a, 0xb7, 0xf8, 0x41, 0xf4, 0x83, 0x76, 0x67, 0xef, 0x82, 0x21, 0x00, 0xb9, 0x5e, 0x13,
+	0x1f, 0x35, 0x71, 0x55, 0xe1, 0xe3, 0xdd, 0xc3, 0x36, 0xf7, 0xff, 0x54, 0xfd, 0x19, 0xe4, 0x64,
+	0xaf, 0x80, 0x10, 0x64, 0x86, 0xb6, 0x29, 0x03, 0x3d, 0x8b, 0xc5, 0x18, 0xa9, 0x90, 0x0f, 0x3c,
+	0x2d, 0xa8, 0x6e, 0xe1, 0xb4, 0xfe, 0x0f, 0x05, 0x2a, 0xd3, 0x59, 0x1e, 0x7d, 0x84, 0xb2, 0x27,
+	0xb2, 0x93, 0x2e, 0xcb, 0xc4, 0x1c, 0x79, 0xad, 0xb5, 0x80, 0x4b, 0x92, 0x43, 0x52, 0x7e, 0x17,
+	0x8a, 0x16, 0x65, 0x7a, 0x5c, 0x76, 0xd2, 0xad, 0x05, 0x5c, 0xb0, 0x28, 0x93, 0xdb, 0x77, 0x01,
+	0x06, 0xb6, 0x3d, 0x0e, 0xf6, 0xb9, 0x63, 0x16, 0x5a, 0x0b, 0xb8, 0x38, 0x08, 0x5b, 0x0e, 0x74,
+	0x0f, 0xca, 0xa6, 0xed, 0x0f, 0xc6, 0x24, 0x10, 0xe1, 0x6e, 0xa7, 0x70, 0x25, 0x72, 0x55, 0x08,
+	0x45, 0x41, 0x5f, 0xff, 0x63, 0x0e, 0x20, 0xee, 0x02, 0x51, 0x9f, 0xdb, 0xc3, 0x3b, 0xc8, 0x63,
+	0xd7, 0x98, 0x88, 0x26, 0x82, 0xdb, 0xb3, 0x35, 0x53, 0x0b, 0x29, 0x87, 0xfb, 0x02, 0x88, 0x65,
+	0x23, 0x2a, 0x27, 0x68, 0x03, 0x6e, 0x26, 0xfa, 0x52, 0xfd, 0xc4, 0xf0, 0x4e, 0xf4, 0x28, 0x1f,
+	0x56, 0xe3, 0xc6, 0xb3, 0x65, 0x78, 0x27, 0x6d, 0xb3, 0xf6, 0x9f, 0x74, 0x70, 0x26, 0x01, 0x47,
+	0x1f, 0x61, 0xf1, 0xd8, 0xa7, 0x43, 0x9e, 0x14, 0x74, 0xf1, 0x71, 0x30, 0x4f, 0xf1, 0x28, 0x87,
+	0x14, 0x1d, 0x4e, 0x39, 0x80, 0x15, 0xdb, 0xb5, 0x46, 0x16, 0x35, 0xc6, 0xfa, 0x34, 0x77, 0x6a,
+	0x0e, 0xee, 0xe5, 0x90, 0x6b, 0x3f, 0xa9, 0xa3, 0x0d, 0xc5, 0x63, 0x6b, 0x4c, 0x24, 0x6d, 0x7a,
+	0x0e, 0xda, 0x02, 0x87, 0x0b, 0xaa, 0xbb, 0x50, 0x1a, 0x5b, 0x94, 0xe8, 0xd4, 0x9f, 0x0c, 0x88,
+	0x2b, 0x5e, 0x34, 0x8d, 0x81, 0x2f, 0x75, 0xc4, 0x0a, 0xba, 0x07, 0x8b, 0x43, 0x7b, 0xec, 0x4f,
+	0x68, 0x28, 0x92, 0x15, 0x22, 0x65, 0xb9, 0x18, 0x08, 0x35, 0xa0, 0x34, 0xb6, 0x0d, 0x53, 0x9f,
+	0xd8, 0xa6, 0x3f, 0x0e, 0xbf, 0x51, 0xae, 0x6a, 0xa8, 0xdf, 0x0b, 0x41, 0x0c, 0x1c, 0x25, 0xc7,
+	0xa8, 0x07, 0x15, 0xd9, 0x1a, 0xeb, 0x67, 0xc4, 0xf5, 0x78, 0x25, 0xcf, 0xcf, 0x61, 0xd9, 0xa2,
+	0xe4, 0x38, 0x92, 0x14, 0xb5, 0xdf, 0x2b, 0x50, 0x4a, 0xf8, 0x0e, 0xda, 0x87, 0xac, 0x70, 0xbf,
+	0x59, 0x5a, 0xd8, 0x2f, 0x79, 0x1f, 0x96, 0x70, 0xf4, 0x18, 0x96, 0xc3, 0xb4, 0x22, 0xdd, 0x79,
+	0x2a, 0xaf, 0xa0, 0x60, 0x4f, 0x2a, 0x95, 0x89, 0xe5, 0xaf, 0x0a, 0xe4, 0x02, 0x4b, 0xf7, 0x20,
+	0x17, 0x5c, 0xd4, 0x3c, 0xee, 0x16, 0x60, 0xd1, 0xcf, 0xa0, 0x30, 0xf0, 0x79, 0x9b, 0x1f, 0xb8,
+	0xfb, 0xff, 0xcb, 0x93, 0x17, 0xe8, 0xb6, 0x59, 0xff, 0x15, 0x2c, 0x5d, 0xda, 0x8d, 0xdb, 0x70,
+	0x25, 0xd1, 0x86, 0x73, 0xb3, 0x99, 0x14, 0x25, 0xa6, 0x3e, 0x38, 0x67, 0x64, 0xda, 0xec, 0x68,
+	0xaf, 0x71, 0xce, 0x88, 0x30, 0xbb, 0xf1, 0x27, 0x05, 0xee, 0x58, 0xf6, 0xd7, 0x0f, 0xd6, 0x90,
+	0x9f, 0x18, 0x5d, 0xbe, 0xd8, 0x55, 0x7e, 0xd9, 0x18, 0x59, 0xec, 0xc4, 0x1f, 0x68, 0x43, 0x7b,
+	0xb2, 0x29, 0xe5, 0x37, 0x2c, 0xea, 0x31, 0xd7, 0x9f, 0x10, 0x2a, 0x8b, 0xf7, 0x66, 0x4c, 0xb5,
+	0x21, 0xff, 0xe3, 0x18, 0x11, 0xba, 0x31, 0x8a, 0xff, 0x2c, 0xf9, 0x77, 0x6a, 0xf5, 0x83, 0x43,
+	0xe8, 0xae, 0xd4, 0x26, 0x88, 0x65, 0xb1, 0xd2, 0x8e, 0xb6, 0x06, 0x39, 0x01, 0x79, 0xf2, 0xbf,
+	0x00, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x56, 0xb6, 0xfd, 0x6c, 0x11, 0x00, 0x00,
+}
diff --git a/third_party/go/opencensus-proto/gen-go/trace/v1/trace_config.pb.go b/third_party/go/opencensus-proto/gen-go/trace/v1/trace_config.pb.go
new file mode 100644
index 0000000..0253877
--- /dev/null
+++ b/third_party/go/opencensus-proto/gen-go/trace/v1/trace_config.pb.go
@@ -0,0 +1,359 @@
+// Code generated by protoc-gen-go. DO NOT EDIT.
+// source: opencensus/proto/trace/v1/trace_config.proto
+
+package v1
+
+import (
+	fmt "fmt"
+	proto "github.com/golang/protobuf/proto"
+	math "math"
+)
+
+// Reference imports to suppress errors if they are not otherwise used.
+var _ = proto.Marshal
+var _ = fmt.Errorf
+var _ = math.Inf
+
+// This is a compile-time assertion to ensure that this generated file
+// is compatible with the proto package it is being compiled against.
+// A compilation error at this line likely means your copy of the
+// proto package needs to be updated.
+const _ = proto.ProtoPackageIsVersion3 // please upgrade the proto package
+
+// How spans should be sampled:
+// - Always off
+// - Always on
+// - Always follow the parent Span's decision (off if no parent).
+type ConstantSampler_ConstantDecision int32
+
+const (
+	ConstantSampler_ALWAYS_OFF    ConstantSampler_ConstantDecision = 0
+	ConstantSampler_ALWAYS_ON     ConstantSampler_ConstantDecision = 1
+	ConstantSampler_ALWAYS_PARENT ConstantSampler_ConstantDecision = 2
+)
+
+var ConstantSampler_ConstantDecision_name = map[int32]string{
+	0: "ALWAYS_OFF",
+	1: "ALWAYS_ON",
+	2: "ALWAYS_PARENT",
+}
+
+var ConstantSampler_ConstantDecision_value = map[string]int32{
+	"ALWAYS_OFF":    0,
+	"ALWAYS_ON":     1,
+	"ALWAYS_PARENT": 2,
+}
+
+func (x ConstantSampler_ConstantDecision) String() string {
+	return proto.EnumName(ConstantSampler_ConstantDecision_name, int32(x))
+}
+
+func (ConstantSampler_ConstantDecision) EnumDescriptor() ([]byte, []int) {
+	return fileDescriptor_5359209b41ff50c5, []int{2, 0}
+}
+
+// Global configuration of the trace service. All fields must be specified, or
+// the default (zero) values will be used for each type.
+type TraceConfig struct {
+	// The global default sampler used to make decisions on span sampling.
+	//
+	// Types that are valid to be assigned to Sampler:
+	//	*TraceConfig_ProbabilitySampler
+	//	*TraceConfig_ConstantSampler
+	//	*TraceConfig_RateLimitingSampler
+	Sampler isTraceConfig_Sampler `protobuf_oneof:"sampler"`
+	// The global default max number of attributes per span.
+	MaxNumberOfAttributes int64 `protobuf:"varint,4,opt,name=max_number_of_attributes,json=maxNumberOfAttributes,proto3" json:"max_number_of_attributes,omitempty"`
+	// The global default max number of annotation events per span.
+	MaxNumberOfAnnotations int64 `protobuf:"varint,5,opt,name=max_number_of_annotations,json=maxNumberOfAnnotations,proto3" json:"max_number_of_annotations,omitempty"`
+	// The global default max number of message events per span.
+	MaxNumberOfMessageEvents int64 `protobuf:"varint,6,opt,name=max_number_of_message_events,json=maxNumberOfMessageEvents,proto3" json:"max_number_of_message_events,omitempty"`
+	// The global default max number of link entries per span.
+	MaxNumberOfLinks     int64    `protobuf:"varint,7,opt,name=max_number_of_links,json=maxNumberOfLinks,proto3" json:"max_number_of_links,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *TraceConfig) Reset()         { *m = TraceConfig{} }
+func (m *TraceConfig) String() string { return proto.CompactTextString(m) }
+func (*TraceConfig) ProtoMessage()    {}
+func (*TraceConfig) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5359209b41ff50c5, []int{0}
+}
+
+func (m *TraceConfig) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_TraceConfig.Unmarshal(m, b)
+}
+func (m *TraceConfig) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_TraceConfig.Marshal(b, m, deterministic)
+}
+func (m *TraceConfig) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_TraceConfig.Merge(m, src)
+}
+func (m *TraceConfig) XXX_Size() int {
+	return xxx_messageInfo_TraceConfig.Size(m)
+}
+func (m *TraceConfig) XXX_DiscardUnknown() {
+	xxx_messageInfo_TraceConfig.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_TraceConfig proto.InternalMessageInfo
+
+type isTraceConfig_Sampler interface {
+	isTraceConfig_Sampler()
+}
+
+type TraceConfig_ProbabilitySampler struct {
+	ProbabilitySampler *ProbabilitySampler `protobuf:"bytes,1,opt,name=probability_sampler,json=probabilitySampler,proto3,oneof"`
+}
+
+type TraceConfig_ConstantSampler struct {
+	ConstantSampler *ConstantSampler `protobuf:"bytes,2,opt,name=constant_sampler,json=constantSampler,proto3,oneof"`
+}
+
+type TraceConfig_RateLimitingSampler struct {
+	RateLimitingSampler *RateLimitingSampler `protobuf:"bytes,3,opt,name=rate_limiting_sampler,json=rateLimitingSampler,proto3,oneof"`
+}
+
+func (*TraceConfig_ProbabilitySampler) isTraceConfig_Sampler() {}
+
+func (*TraceConfig_ConstantSampler) isTraceConfig_Sampler() {}
+
+func (*TraceConfig_RateLimitingSampler) isTraceConfig_Sampler() {}
+
+func (m *TraceConfig) GetSampler() isTraceConfig_Sampler {
+	if m != nil {
+		return m.Sampler
+	}
+	return nil
+}
+
+func (m *TraceConfig) GetProbabilitySampler() *ProbabilitySampler {
+	if x, ok := m.GetSampler().(*TraceConfig_ProbabilitySampler); ok {
+		return x.ProbabilitySampler
+	}
+	return nil
+}
+
+func (m *TraceConfig) GetConstantSampler() *ConstantSampler {
+	if x, ok := m.GetSampler().(*TraceConfig_ConstantSampler); ok {
+		return x.ConstantSampler
+	}
+	return nil
+}
+
+func (m *TraceConfig) GetRateLimitingSampler() *RateLimitingSampler {
+	if x, ok := m.GetSampler().(*TraceConfig_RateLimitingSampler); ok {
+		return x.RateLimitingSampler
+	}
+	return nil
+}
+
+func (m *TraceConfig) GetMaxNumberOfAttributes() int64 {
+	if m != nil {
+		return m.MaxNumberOfAttributes
+	}
+	return 0
+}
+
+func (m *TraceConfig) GetMaxNumberOfAnnotations() int64 {
+	if m != nil {
+		return m.MaxNumberOfAnnotations
+	}
+	return 0
+}
+
+func (m *TraceConfig) GetMaxNumberOfMessageEvents() int64 {
+	if m != nil {
+		return m.MaxNumberOfMessageEvents
+	}
+	return 0
+}
+
+func (m *TraceConfig) GetMaxNumberOfLinks() int64 {
+	if m != nil {
+		return m.MaxNumberOfLinks
+	}
+	return 0
+}
+
+// XXX_OneofWrappers is for the internal use of the proto package.
+func (*TraceConfig) XXX_OneofWrappers() []interface{} {
+	return []interface{}{
+		(*TraceConfig_ProbabilitySampler)(nil),
+		(*TraceConfig_ConstantSampler)(nil),
+		(*TraceConfig_RateLimitingSampler)(nil),
+	}
+}
+
+// Sampler that tries to uniformly sample traces with a given probability.
+// The probability of sampling a trace is equal to that of the specified probability.
+type ProbabilitySampler struct {
+	// The desired probability of sampling. Must be within [0.0, 1.0].
+	SamplingProbability  float64  `protobuf:"fixed64,1,opt,name=samplingProbability,proto3" json:"samplingProbability,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *ProbabilitySampler) Reset()         { *m = ProbabilitySampler{} }
+func (m *ProbabilitySampler) String() string { return proto.CompactTextString(m) }
+func (*ProbabilitySampler) ProtoMessage()    {}
+func (*ProbabilitySampler) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5359209b41ff50c5, []int{1}
+}
+
+func (m *ProbabilitySampler) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ProbabilitySampler.Unmarshal(m, b)
+}
+func (m *ProbabilitySampler) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ProbabilitySampler.Marshal(b, m, deterministic)
+}
+func (m *ProbabilitySampler) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ProbabilitySampler.Merge(m, src)
+}
+func (m *ProbabilitySampler) XXX_Size() int {
+	return xxx_messageInfo_ProbabilitySampler.Size(m)
+}
+func (m *ProbabilitySampler) XXX_DiscardUnknown() {
+	xxx_messageInfo_ProbabilitySampler.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ProbabilitySampler proto.InternalMessageInfo
+
+func (m *ProbabilitySampler) GetSamplingProbability() float64 {
+	if m != nil {
+		return m.SamplingProbability
+	}
+	return 0
+}
+
+// Sampler that always makes a constant decision on span sampling.
+type ConstantSampler struct {
+	Decision             ConstantSampler_ConstantDecision `protobuf:"varint,1,opt,name=decision,proto3,enum=opencensus.proto.trace.v1.ConstantSampler_ConstantDecision" json:"decision,omitempty"`
+	XXX_NoUnkeyedLiteral struct{}                         `json:"-"`
+	XXX_unrecognized     []byte                           `json:"-"`
+	XXX_sizecache        int32                            `json:"-"`
+}
+
+func (m *ConstantSampler) Reset()         { *m = ConstantSampler{} }
+func (m *ConstantSampler) String() string { return proto.CompactTextString(m) }
+func (*ConstantSampler) ProtoMessage()    {}
+func (*ConstantSampler) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5359209b41ff50c5, []int{2}
+}
+
+func (m *ConstantSampler) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_ConstantSampler.Unmarshal(m, b)
+}
+func (m *ConstantSampler) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_ConstantSampler.Marshal(b, m, deterministic)
+}
+func (m *ConstantSampler) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_ConstantSampler.Merge(m, src)
+}
+func (m *ConstantSampler) XXX_Size() int {
+	return xxx_messageInfo_ConstantSampler.Size(m)
+}
+func (m *ConstantSampler) XXX_DiscardUnknown() {
+	xxx_messageInfo_ConstantSampler.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_ConstantSampler proto.InternalMessageInfo
+
+func (m *ConstantSampler) GetDecision() ConstantSampler_ConstantDecision {
+	if m != nil {
+		return m.Decision
+	}
+	return ConstantSampler_ALWAYS_OFF
+}
+
+// Sampler that tries to sample with a rate per time window.
+type RateLimitingSampler struct {
+	// Rate per second.
+	Qps                  int64    `protobuf:"varint,1,opt,name=qps,proto3" json:"qps,omitempty"`
+	XXX_NoUnkeyedLiteral struct{} `json:"-"`
+	XXX_unrecognized     []byte   `json:"-"`
+	XXX_sizecache        int32    `json:"-"`
+}
+
+func (m *RateLimitingSampler) Reset()         { *m = RateLimitingSampler{} }
+func (m *RateLimitingSampler) String() string { return proto.CompactTextString(m) }
+func (*RateLimitingSampler) ProtoMessage()    {}
+func (*RateLimitingSampler) Descriptor() ([]byte, []int) {
+	return fileDescriptor_5359209b41ff50c5, []int{3}
+}
+
+func (m *RateLimitingSampler) XXX_Unmarshal(b []byte) error {
+	return xxx_messageInfo_RateLimitingSampler.Unmarshal(m, b)
+}
+func (m *RateLimitingSampler) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
+	return xxx_messageInfo_RateLimitingSampler.Marshal(b, m, deterministic)
+}
+func (m *RateLimitingSampler) XXX_Merge(src proto.Message) {
+	xxx_messageInfo_RateLimitingSampler.Merge(m, src)
+}
+func (m *RateLimitingSampler) XXX_Size() int {
+	return xxx_messageInfo_RateLimitingSampler.Size(m)
+}
+func (m *RateLimitingSampler) XXX_DiscardUnknown() {
+	xxx_messageInfo_RateLimitingSampler.DiscardUnknown(m)
+}
+
+var xxx_messageInfo_RateLimitingSampler proto.InternalMessageInfo
+
+func (m *RateLimitingSampler) GetQps() int64 {
+	if m != nil {
+		return m.Qps
+	}
+	return 0
+}
+
+func init() {
+	proto.RegisterEnum("opencensus.proto.trace.v1.ConstantSampler_ConstantDecision", ConstantSampler_ConstantDecision_name, ConstantSampler_ConstantDecision_value)
+	proto.RegisterType((*TraceConfig)(nil), "opencensus.proto.trace.v1.TraceConfig")
+	proto.RegisterType((*ProbabilitySampler)(nil), "opencensus.proto.trace.v1.ProbabilitySampler")
+	proto.RegisterType((*ConstantSampler)(nil), "opencensus.proto.trace.v1.ConstantSampler")
+	proto.RegisterType((*RateLimitingSampler)(nil), "opencensus.proto.trace.v1.RateLimitingSampler")
+}
+
+func init() {
+	proto.RegisterFile("opencensus/proto/trace/v1/trace_config.proto", fileDescriptor_5359209b41ff50c5)
+}
+
+var fileDescriptor_5359209b41ff50c5 = []byte{
+	// 506 bytes of a gzipped FileDescriptorProto
+	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x93, 0xc1, 0x6e, 0xd3, 0x30,
+	0x18, 0xc7, 0x97, 0x76, 0x6c, 0xec, 0x9b, 0xb6, 0x05, 0x57, 0x43, 0xa9, 0xb4, 0xc3, 0x94, 0x0b,
+	0x13, 0x22, 0x09, 0x1d, 0x07, 0x84, 0x90, 0x90, 0xda, 0x6e, 0x15, 0x87, 0xd2, 0x56, 0xd9, 0x44,
+	0x05, 0x97, 0xe0, 0x64, 0x6e, 0xb0, 0x68, 0xec, 0x60, 0x3b, 0xd5, 0x78, 0x0d, 0xce, 0x3c, 0x04,
+	0xcf, 0xc5, 0x53, 0xa0, 0x3a, 0x21, 0x49, 0xdb, 0x6d, 0xe2, 0x96, 0xef, 0xfb, 0x7f, 0xbf, 0x9f,
+	0xad, 0xd8, 0x86, 0x17, 0x3c, 0x25, 0x2c, 0x22, 0x4c, 0x66, 0xd2, 0x4b, 0x05, 0x57, 0xdc, 0x53,
+	0x02, 0x47, 0xc4, 0x5b, 0x74, 0xf2, 0x8f, 0x20, 0xe2, 0x6c, 0x46, 0x63, 0x57, 0x67, 0xa8, 0x5d,
+	0x4d, 0xe7, 0x1d, 0x57, 0x0f, 0xb9, 0x8b, 0x8e, 0xfd, 0x6b, 0x1b, 0xf6, 0xaf, 0x97, 0x45, 0x5f,
+	0x03, 0xe8, 0x0b, 0xb4, 0x52, 0xc1, 0x43, 0x1c, 0xd2, 0x39, 0x55, 0x3f, 0x02, 0x89, 0x93, 0x74,
+	0x4e, 0x84, 0x65, 0x9c, 0x1a, 0x67, 0xfb, 0xe7, 0x8e, 0x7b, 0xaf, 0xc8, 0x9d, 0x54, 0xd4, 0x55,
+	0x0e, 0xbd, 0xdf, 0xf2, 0x51, 0xba, 0xd1, 0x45, 0x53, 0x30, 0x23, 0xce, 0xa4, 0xc2, 0x4c, 0x95,
+	0xfa, 0x86, 0xd6, 0x3f, 0x7f, 0x40, 0xdf, 0x2f, 0x90, 0xca, 0x7d, 0x14, 0xad, 0xb6, 0xd0, 0x0d,
+	0x1c, 0x0b, 0xac, 0x48, 0x30, 0xa7, 0x09, 0x55, 0x94, 0xc5, 0xa5, 0xbd, 0xa9, 0xed, 0xee, 0x03,
+	0x76, 0x1f, 0x2b, 0x32, 0x2c, 0xb0, 0x6a, 0x85, 0x96, 0xd8, 0x6c, 0xa3, 0xd7, 0x60, 0x25, 0xf8,
+	0x36, 0x60, 0x59, 0x12, 0x12, 0x11, 0xf0, 0x59, 0x80, 0x95, 0x12, 0x34, 0xcc, 0x14, 0x91, 0xd6,
+	0xf6, 0xa9, 0x71, 0xd6, 0xf4, 0x8f, 0x13, 0x7c, 0x3b, 0xd2, 0xf1, 0x78, 0xd6, 0x2d, 0x43, 0xf4,
+	0x06, 0xda, 0x6b, 0x20, 0x63, 0x5c, 0x61, 0x45, 0x39, 0x93, 0xd6, 0x23, 0x4d, 0x3e, 0xad, 0x93,
+	0x55, 0x8a, 0xde, 0xc1, 0xc9, 0x2a, 0x9a, 0x10, 0x29, 0x71, 0x4c, 0x02, 0xb2, 0x20, 0x4c, 0x49,
+	0x6b, 0x47, 0xd3, 0x56, 0x8d, 0xfe, 0x90, 0x0f, 0x5c, 0xea, 0x1c, 0x39, 0xd0, 0x5a, 0xe5, 0xe7,
+	0x94, 0x7d, 0x93, 0xd6, 0xae, 0xc6, 0xcc, 0x1a, 0x36, 0x5c, 0xf6, 0x7b, 0x7b, 0xb0, 0x5b, 0xfc,
+	0x3a, 0x7b, 0x00, 0x68, 0xf3, 0x60, 0xd1, 0x4b, 0x68, 0xe9, 0x01, 0xca, 0xe2, 0x5a, 0xaa, 0x2f,
+	0x89, 0xe1, 0xdf, 0x15, 0xd9, 0xbf, 0x0d, 0x38, 0x5a, 0x3b, 0x42, 0x34, 0x85, 0xc7, 0x37, 0x24,
+	0xa2, 0x92, 0x72, 0xa6, 0xd1, 0xc3, 0xf3, 0xb7, 0xff, 0x7f, 0x01, 0xca, 0xfa, 0xa2, 0x50, 0xf8,
+	0xa5, 0xcc, 0xbe, 0x00, 0x73, 0x3d, 0x45, 0x87, 0x00, 0xdd, 0xe1, 0xb4, 0xfb, 0xe9, 0x2a, 0x18,
+	0x0f, 0x06, 0xe6, 0x16, 0x3a, 0x80, 0xbd, 0x7f, 0xf5, 0xc8, 0x34, 0xd0, 0x13, 0x38, 0x28, 0xca,
+	0x49, 0xd7, 0xbf, 0x1c, 0x5d, 0x9b, 0x0d, 0xfb, 0x19, 0xb4, 0xee, 0xb8, 0x16, 0xc8, 0x84, 0xe6,
+	0xf7, 0x54, 0xea, 0x0d, 0x37, 0xfd, 0xe5, 0x67, 0xef, 0xa7, 0x01, 0x27, 0x94, 0xdf, 0xbf, 0xf5,
+	0x9e, 0x59, 0x7b, 0x60, 0x93, 0x65, 0x34, 0x31, 0x3e, 0xf7, 0x62, 0xaa, 0xbe, 0x66, 0xa1, 0x1b,
+	0xf1, 0xc4, 0xcb, 0x29, 0x87, 0x32, 0xa9, 0x44, 0x96, 0x10, 0x96, 0x1f, 0xbb, 0x57, 0x09, 0x9d,
+	0xfc, 0x89, 0xc7, 0x84, 0x39, 0x71, 0xf5, 0xd2, 0xff, 0x34, 0xda, 0xe3, 0x94, 0xb0, 0x7e, 0xbe,
+	0xa6, 0x16, 0xbb, 0x7a, 0x25, 0xf7, 0x63, 0x27, 0xdc, 0xd1, 0xc8, 0xab, 0xbf, 0x01, 0x00, 0x00,
+	0xff, 0xff, 0x50, 0x0c, 0xfe, 0x32, 0x29, 0x04, 0x00, 0x00,
+}