diff --git a/third_party/go/opencensus-proto/BUILD b/third_party/go/opencensus-proto/BUILD
deleted file mode 100644
index 53b75e8..0000000
--- a/third_party/go/opencensus-proto/BUILD
+++ /dev/null
@@ -1 +0,0 @@
-# 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
deleted file mode 100644
index c109667..0000000
--- a/third_party/go/opencensus-proto/README.md
+++ /dev/null
@@ -1,5 +0,0 @@
-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
deleted file mode 100644
index 081ae17..0000000
--- a/third_party/go/opencensus-proto/WORKSPACE
+++ /dev/null
@@ -1 +0,0 @@
-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
deleted file mode 100644
index 45c9cf3..0000000
--- a/third_party/go/opencensus-proto/gen-go/agent/common/v1/BUILD.bazel
+++ /dev/null
@@ -1,12 +0,0 @@
-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
deleted file mode 100644
index a6f0feb..0000000
--- a/third_party/go/opencensus-proto/gen-go/agent/common/v1/common.pb.go
+++ /dev/null
@@ -1,361 +0,0 @@
-// 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
deleted file mode 100644
index 280baf5..0000000
--- a/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/BUILD.bazel
+++ /dev/null
@@ -1,17 +0,0 @@
-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
deleted file mode 100644
index 5f222b4..0000000
--- a/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.go
+++ /dev/null
@@ -1,275 +0,0 @@
-// 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
deleted file mode 100644
index 158c160..0000000
--- a/third_party/go/opencensus-proto/gen-go/agent/metrics/v1/metrics_service.pb.gw.go
+++ /dev/null
@@ -1,150 +0,0 @@
-// 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
deleted file mode 100644
index 9147599..0000000
--- a/third_party/go/opencensus-proto/gen-go/agent/trace/v1/BUILD.bazel
+++ /dev/null
@@ -1,24 +0,0 @@
-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
deleted file mode 100644
index a0a3504..0000000
--- a/third_party/go/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.go
+++ /dev/null
@@ -1,457 +0,0 @@
-// 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
deleted file mode 100644
index 334331b..0000000
--- a/third_party/go/opencensus-proto/gen-go/agent/trace/v1/trace_service.pb.gw.go
+++ /dev/null
@@ -1,150 +0,0 @@
-// 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
deleted file mode 100644
index b130dcf..0000000
--- a/third_party/go/opencensus-proto/gen-go/metrics/v1/BUILD.bazel
+++ /dev/null
@@ -1,14 +0,0 @@
-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
deleted file mode 100644
index 466b234..0000000
--- a/third_party/go/opencensus-proto/gen-go/metrics/v1/metrics.pb.go
+++ /dev/null
@@ -1,1127 +0,0 @@
-// 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
deleted file mode 100644
index f2a3ec3..0000000
--- a/third_party/go/opencensus-proto/gen-go/resource/v1/BUILD.bazel
+++ /dev/null
@@ -1,11 +0,0 @@
-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
deleted file mode 100644
index 5dba6a2..0000000
--- a/third_party/go/opencensus-proto/gen-go/resource/v1/resource.pb.go
+++ /dev/null
@@ -1,100 +0,0 @@
-// 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
deleted file mode 100644
index f3f9349..0000000
--- a/third_party/go/opencensus-proto/gen-go/stats/v1/BUILD.bazel
+++ /dev/null
@@ -1,12 +0,0 @@
-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
deleted file mode 100644
index f7f96fa..0000000
--- a/third_party/go/opencensus-proto/gen-go/stats/v1/stats.pb.go
+++ /dev/null
@@ -1,644 +0,0 @@
-// 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
deleted file mode 100644
index 6ec165d..0000000
--- a/third_party/go/opencensus-proto/gen-go/trace/v1/BUILD.bazel
+++ /dev/null
@@ -1,17 +0,0 @@
-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
deleted file mode 100644
index 2f4ab19..0000000
--- a/third_party/go/opencensus-proto/gen-go/trace/v1/trace.pb.go
+++ /dev/null
@@ -1,1553 +0,0 @@
-// 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
deleted file mode 100644
index 0253877..0000000
--- a/third_party/go/opencensus-proto/gen-go/trace/v1/trace_config.pb.go
+++ /dev/null
@@ -1,359 +0,0 @@
-// 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,
-}
diff --git a/third_party/go/repositories.bzl b/third_party/go/repositories.bzl
index 8449dd3..2a9c249 100644
--- a/third_party/go/repositories.bzl
+++ b/third_party/go/repositories.bzl
@@ -26,8 +26,9 @@
         name = "com_github_bitnami_kubecfg",
         importpath = "github.com/bitnami/kubecfg",
         vcs = "git",
-        commit = "b6817a94492c561ed61a44eeea2d92dcf2e6b8c0",
+        commit = "5070ed28ed12016b0ca75dcfd257f567f581c095",
         remote = "https://github.com/q3k/kubecfg",
+        build_extra_args = ["-exclude=vendor"],
     )
 
     go_repository(
@@ -519,11 +520,6 @@
         tag = "v11.5.0",
     )
 
-    native.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",
@@ -552,12 +548,14 @@
         name = "com_github_docker_cli",
         commit = "54c19e67f69c",
         importpath = "github.com/docker/cli",
+        build_extra_args = ["-exclude=vendor"],
     )
 
     go_repository(
         name = "com_github_docker_distribution",
         importpath = "github.com/docker/distribution",
         tag = "v2.7.1",
+        build_extra_args = ["-exclude=vendor"],
     )
 
     go_repository(
@@ -570,6 +568,7 @@
         name = "com_github_docker_docker_ce",
         commit = "f53bd8bb8e43",
         importpath = "github.com/docker/docker-ce",
+        build_extra_args = ["-exclude=components/cli/vendor"],
     )
 
     go_repository(
@@ -636,6 +635,7 @@
         name = "com_github_genuinetools_reg",
         commit = "d959057b30da",
         importpath = "github.com/genuinetools/reg",
+        build_extra_args = ["-exclude=vendor"],
     )
 
     go_repository(
@@ -695,7 +695,8 @@
     go_repository(
         name = "com_github_grpc_ecosystem_grpc_gateway",
         importpath = "github.com/grpc-ecosystem/grpc-gateway",
-        tag = "v1.9.5",
+        sum = "h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo=",
+        version = "v1.16.0",
     )
 
     go_repository(
@@ -916,7 +917,8 @@
     go_repository(
         name = "io_opencensus_go_contrib_exporter_ocagent",
         importpath = "contrib.go.opencensus.io/exporter/ocagent",
-        tag = "v0.6.0",
+        sum = "h1:BEfdCTXfMV30tLZD8c9n64V/tIZX5+9sXiuFLnrr1k8=",
+        version = "v0.7.0",
     )
 
     go_repository(
@@ -1781,3 +1783,10 @@
         sum = "h1:K6V0Kwa5efKo60sqbTk1FOBbltdyX9Klw2a9+lKhA18=",
         version = "v0.0.0-20201101162038-25d840ce174a",
     )
+    go_repository(
+        name = "com_github_census_instrumentation_opencensus_proto",
+        importpath = "github.com/census-instrumentation/opencensus-proto",
+        sum = "h1:t/LhUZLVitR1Ow2YOnduCsavhwFUklBMoGVYUCqmCqk=",
+        version = "v0.3.0",
+        build_extra_args = ["-exclude=src"],
+    )
