// Code generated by protoc-gen-go. DO NOT EDIT.
// versions:
// 	protoc-gen-go v1.25.0-devel
// 	protoc        v3.6.1
// source: chromiumos/metrics.proto

package chromiumos

import (
	protoreflect "google.golang.org/protobuf/reflect/protoreflect"
	protoimpl "google.golang.org/protobuf/runtime/protoimpl"
	reflect "reflect"
	sync "sync"
)

const (
	// Verify that this generated code is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(20 - protoimpl.MinVersion)
	// Verify that runtime/protoimpl is sufficiently up-to-date.
	_ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20)
)

// MetricEvent encompasses all datapoints that might be of interest for
// monitoring within chromiumos infrastructure.
type MetricEvent struct {
	state         protoimpl.MessageState
	sizeCache     protoimpl.SizeCache
	unknownFields protoimpl.UnknownFields

	// The name of this event.
	Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"`
	// The timestamp in Unix-epoch millisecond time.
	TimestampMilliseconds int64 `protobuf:"varint,2,opt,name=timestamp_milliseconds,json=timestampMilliseconds,proto3" json:"timestamp_milliseconds,omitempty"`
	// If the event was a timer, give its duration.
	DurationMilliseconds uint64 `protobuf:"varint,3,opt,name=duration_milliseconds,json=durationMilliseconds,proto3" json:"duration_milliseconds,omitempty"`
	// An arbitrary integer gauge.
	Gauge uint64 `protobuf:"varint,4,opt,name=gauge,proto3" json:"gauge,omitempty"`
}

func (x *MetricEvent) Reset() {
	*x = MetricEvent{}
	if protoimpl.UnsafeEnabled {
		mi := &file_chromiumos_metrics_proto_msgTypes[0]
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		ms.StoreMessageInfo(mi)
	}
}

func (x *MetricEvent) String() string {
	return protoimpl.X.MessageStringOf(x)
}

func (*MetricEvent) ProtoMessage() {}

func (x *MetricEvent) ProtoReflect() protoreflect.Message {
	mi := &file_chromiumos_metrics_proto_msgTypes[0]
	if protoimpl.UnsafeEnabled && x != nil {
		ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x))
		if ms.LoadMessageInfo() == nil {
			ms.StoreMessageInfo(mi)
		}
		return ms
	}
	return mi.MessageOf(x)
}

// Deprecated: Use MetricEvent.ProtoReflect.Descriptor instead.
func (*MetricEvent) Descriptor() ([]byte, []int) {
	return file_chromiumos_metrics_proto_rawDescGZIP(), []int{0}
}

func (x *MetricEvent) GetName() string {
	if x != nil {
		return x.Name
	}
	return ""
}

func (x *MetricEvent) GetTimestampMilliseconds() int64 {
	if x != nil {
		return x.TimestampMilliseconds
	}
	return 0
}

func (x *MetricEvent) GetDurationMilliseconds() uint64 {
	if x != nil {
		return x.DurationMilliseconds
	}
	return 0
}

func (x *MetricEvent) GetGauge() uint64 {
	if x != nil {
		return x.Gauge
	}
	return 0
}

var File_chromiumos_metrics_proto protoreflect.FileDescriptor

var file_chromiumos_metrics_proto_rawDesc = []byte{
	0x0a, 0x18, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x6d, 0x65, 0x74,
	0x72, 0x69, 0x63, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x63, 0x68, 0x72, 0x6f,
	0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x22, 0xa3, 0x01, 0x0a, 0x0b, 0x4d, 0x65, 0x74, 0x72, 0x69,
	0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01,
	0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x35, 0x0a, 0x16, 0x74, 0x69,
	0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63,
	0x6f, 0x6e, 0x64, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x74, 0x69, 0x6d, 0x65,
	0x73, 0x74, 0x61, 0x6d, 0x70, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64,
	0x73, 0x12, 0x33, 0x0a, 0x15, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x69,
	0x6c, 0x6c, 0x69, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04,
	0x52, 0x14, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x69, 0x6c, 0x6c, 0x69, 0x73,
	0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x67, 0x61, 0x75, 0x67, 0x65, 0x18,
	0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x67, 0x61, 0x75, 0x67, 0x65, 0x42, 0x36, 0x5a, 0x34,
	0x67, 0x6f, 0x2e, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x2e, 0x6f, 0x72, 0x67, 0x2f,
	0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69, 0x75, 0x6d, 0x6f, 0x73, 0x2f, 0x69, 0x6e, 0x66, 0x72, 0x61,
	0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x63, 0x68, 0x72, 0x6f, 0x6d, 0x69,
	0x75, 0x6d, 0x6f, 0x73, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33,
}

var (
	file_chromiumos_metrics_proto_rawDescOnce sync.Once
	file_chromiumos_metrics_proto_rawDescData = file_chromiumos_metrics_proto_rawDesc
)

func file_chromiumos_metrics_proto_rawDescGZIP() []byte {
	file_chromiumos_metrics_proto_rawDescOnce.Do(func() {
		file_chromiumos_metrics_proto_rawDescData = protoimpl.X.CompressGZIP(file_chromiumos_metrics_proto_rawDescData)
	})
	return file_chromiumos_metrics_proto_rawDescData
}

var file_chromiumos_metrics_proto_msgTypes = make([]protoimpl.MessageInfo, 1)
var file_chromiumos_metrics_proto_goTypes = []interface{}{
	(*MetricEvent)(nil), // 0: chromiumos.MetricEvent
}
var file_chromiumos_metrics_proto_depIdxs = []int32{
	0, // [0:0] is the sub-list for method output_type
	0, // [0:0] is the sub-list for method input_type
	0, // [0:0] is the sub-list for extension type_name
	0, // [0:0] is the sub-list for extension extendee
	0, // [0:0] is the sub-list for field type_name
}

func init() { file_chromiumos_metrics_proto_init() }
func file_chromiumos_metrics_proto_init() {
	if File_chromiumos_metrics_proto != nil {
		return
	}
	if !protoimpl.UnsafeEnabled {
		file_chromiumos_metrics_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} {
			switch v := v.(*MetricEvent); i {
			case 0:
				return &v.state
			case 1:
				return &v.sizeCache
			case 2:
				return &v.unknownFields
			default:
				return nil
			}
		}
	}
	type x struct{}
	out := protoimpl.TypeBuilder{
		File: protoimpl.DescBuilder{
			GoPackagePath: reflect.TypeOf(x{}).PkgPath(),
			RawDescriptor: file_chromiumos_metrics_proto_rawDesc,
			NumEnums:      0,
			NumMessages:   1,
			NumExtensions: 0,
			NumServices:   0,
		},
		GoTypes:           file_chromiumos_metrics_proto_goTypes,
		DependencyIndexes: file_chromiumos_metrics_proto_depIdxs,
		MessageInfos:      file_chromiumos_metrics_proto_msgTypes,
	}.Build()
	File_chromiumos_metrics_proto = out.File
	file_chromiumos_metrics_proto_rawDesc = nil
	file_chromiumos_metrics_proto_goTypes = nil
	file_chromiumos_metrics_proto_depIdxs = nil
}
