// Code generated by protoc-gen-go. DO NOT EDIT.
// source: chromiumos/metrics.proto

package chromiumos

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

// MetricEvent encompasses all datapoints that might be of interest for
// monitoring within chromiumos infrastructure.
type MetricEvent struct {
	// 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"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *MetricEvent) Reset()         { *m = MetricEvent{} }
func (m *MetricEvent) String() string { return proto.CompactTextString(m) }
func (*MetricEvent) ProtoMessage()    {}
func (*MetricEvent) Descriptor() ([]byte, []int) {
	return fileDescriptor_0b2d2cb8db0bbed5, []int{0}
}

func (m *MetricEvent) XXX_Unmarshal(b []byte) error {
	return xxx_messageInfo_MetricEvent.Unmarshal(m, b)
}
func (m *MetricEvent) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
	return xxx_messageInfo_MetricEvent.Marshal(b, m, deterministic)
}
func (m *MetricEvent) XXX_Merge(src proto.Message) {
	xxx_messageInfo_MetricEvent.Merge(m, src)
}
func (m *MetricEvent) XXX_Size() int {
	return xxx_messageInfo_MetricEvent.Size(m)
}
func (m *MetricEvent) XXX_DiscardUnknown() {
	xxx_messageInfo_MetricEvent.DiscardUnknown(m)
}

var xxx_messageInfo_MetricEvent proto.InternalMessageInfo

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

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

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

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

func init() {
	proto.RegisterType((*MetricEvent)(nil), "chromiumos.MetricEvent")
}

func init() { proto.RegisterFile("chromiumos/metrics.proto", fileDescriptor_0b2d2cb8db0bbed5) }

var fileDescriptor_0b2d2cb8db0bbed5 = []byte{
	// 195 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x54, 0xcf, 0xc1, 0x8e, 0x82, 0x30,
	0x10, 0x06, 0xe0, 0x74, 0x61, 0x37, 0xd9, 0xee, 0xad, 0x81, 0x4d, 0x8f, 0xc4, 0x13, 0x27, 0x7a,
	0x40, 0x7d, 0x00, 0x13, 0x8f, 0x5c, 0x38, 0x7a, 0x31, 0x15, 0x6a, 0x6d, 0xc2, 0x74, 0x48, 0x5b,
	0x7c, 0x21, 0x5f, 0xd4, 0xa4, 0x06, 0x85, 0x5b, 0x3b, 0xdf, 0xfc, 0xc9, 0xfc, 0x94, 0x77, 0x37,
	0x87, 0x60, 0x26, 0x40, 0x2f, 0x40, 0x05, 0x67, 0x3a, 0x5f, 0x8d, 0x0e, 0x03, 0x32, 0xfa, 0x91,
	0xcd, 0x83, 0xd0, 0xbf, 0x26, 0xea, 0xf1, 0xae, 0x6c, 0x60, 0x8c, 0xa6, 0x56, 0x82, 0xe2, 0xa4,
	0x20, 0xe5, 0x6f, 0x1b, 0xdf, 0x6c, 0x47, 0xff, 0x83, 0x01, 0xe5, 0x83, 0x84, 0xf1, 0x0c, 0x66,
	0x18, 0x8c, 0x57, 0x1d, 0xda, 0xde, 0xf3, 0xaf, 0x82, 0x94, 0x49, 0x9b, 0xbf, 0xb5, 0x59, 0x20,
	0xab, 0x69, 0xde, 0x4f, 0x4e, 0x06, 0x83, 0x76, 0x9d, 0x4a, 0x0a, 0x52, 0xa6, 0x6d, 0x36, 0xe3,
	0x2a, 0x94, 0xd1, 0x6f, 0x2d, 0x27, 0xad, 0x78, 0x1a, 0x97, 0x5e, 0x9f, 0xc3, 0xfe, 0xb4, 0xd5,
	0x58, 0xcd, 0x67, 0x57, 0xe8, 0xb4, 0x58, 0xb4, 0x33, 0xf6, 0xea, 0xa4, 0x88, 0xdd, 0x84, 0xc6,
	0x85, 0x5c, 0x7e, 0xe2, 0xb0, 0x7e, 0x06, 0x00, 0x00, 0xff, 0xff, 0x60, 0xd9, 0x34, 0xcf, 0x0c,
	0x01, 0x00, 0x00,
}
