// Code generated by protoc-gen-go. DO NOT EDIT.
// source: profiling/proto/service.proto

package proto

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

// EnableRequest defines the fields in a /Profiling/Enable method request to
// toggle profiling on and off within a gRPC program.
type EnableRequest struct {
	// Setting this to true will enable profiling. Setting this to false will
	// disable profiling.
	Enabled              bool     `protobuf:"varint,1,opt,name=enabled,proto3" json:"enabled,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

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

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

var xxx_messageInfo_EnableRequest proto.InternalMessageInfo

func (m *EnableRequest) GetEnabled() bool {
	if m != nil {
		return m.Enabled
	}
	return false
}

// EnableResponse defines the fields in a /Profiling/Enable method response.
type EnableResponse struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *EnableResponse) Reset()         { *m = EnableResponse{} }
func (m *EnableResponse) String() string { return proto.CompactTextString(m) }
func (*EnableResponse) ProtoMessage()    {}
func (*EnableResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_e1ab2aa17b47c6fb, []int{1}
}

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

var xxx_messageInfo_EnableResponse proto.InternalMessageInfo

// GetStreamStatsRequest defines the fields in a /Profiling/GetStreamStats
// method request to retrieve stream-level stats in a gRPC client/server.
type GetStreamStatsRequest struct {
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetStreamStatsRequest) Reset()         { *m = GetStreamStatsRequest{} }
func (m *GetStreamStatsRequest) String() string { return proto.CompactTextString(m) }
func (*GetStreamStatsRequest) ProtoMessage()    {}
func (*GetStreamStatsRequest) Descriptor() ([]byte, []int) {
	return fileDescriptor_e1ab2aa17b47c6fb, []int{2}
}

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

var xxx_messageInfo_GetStreamStatsRequest proto.InternalMessageInfo

// GetStreamStatsResponse defines the fields in a /Profiling/GetStreamStats
// method response.
type GetStreamStatsResponse struct {
	StreamStats          []*Stat  `protobuf:"bytes,1,rep,name=stream_stats,json=streamStats,proto3" json:"stream_stats,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *GetStreamStatsResponse) Reset()         { *m = GetStreamStatsResponse{} }
func (m *GetStreamStatsResponse) String() string { return proto.CompactTextString(m) }
func (*GetStreamStatsResponse) ProtoMessage()    {}
func (*GetStreamStatsResponse) Descriptor() ([]byte, []int) {
	return fileDescriptor_e1ab2aa17b47c6fb, []int{3}
}

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

var xxx_messageInfo_GetStreamStatsResponse proto.InternalMessageInfo

func (m *GetStreamStatsResponse) GetStreamStats() []*Stat {
	if m != nil {
		return m.StreamStats
	}
	return nil
}

// A Timer measures the start and end of execution of a component within
// gRPC that's being profiled. It includes a tag and some additional metadata
// to identify itself.
type Timer struct {
	// tags is a comma-separated list of strings used to tag a timer.
	Tags string `protobuf:"bytes,1,opt,name=tags,proto3" json:"tags,omitempty"`
	// begin_sec and begin_nsec are the start epoch second and nanosecond,
	// respectively, of the component profiled by this timer in UTC. begin_nsec
	// must be a non-negative integer.
	BeginSec  int64 `protobuf:"varint,2,opt,name=begin_sec,json=beginSec,proto3" json:"begin_sec,omitempty"`
	BeginNsec int32 `protobuf:"varint,3,opt,name=begin_nsec,json=beginNsec,proto3" json:"begin_nsec,omitempty"`
	// end_sec and end_nsec are the end epoch second and nanosecond,
	// respectively, of the component profiled by this timer in UTC. end_nsec
	// must be a non-negative integer.
	EndSec  int64 `protobuf:"varint,4,opt,name=end_sec,json=endSec,proto3" json:"end_sec,omitempty"`
	EndNsec int32 `protobuf:"varint,5,opt,name=end_nsec,json=endNsec,proto3" json:"end_nsec,omitempty"`
	// go_id is the goroutine ID of the component being profiled.
	GoId                 int64    `protobuf:"varint,6,opt,name=go_id,json=goId,proto3" json:"go_id,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Timer) Reset()         { *m = Timer{} }
func (m *Timer) String() string { return proto.CompactTextString(m) }
func (*Timer) ProtoMessage()    {}
func (*Timer) Descriptor() ([]byte, []int) {
	return fileDescriptor_e1ab2aa17b47c6fb, []int{4}
}

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

var xxx_messageInfo_Timer proto.InternalMessageInfo

func (m *Timer) GetTags() string {
	if m != nil {
		return m.Tags
	}
	return ""
}

func (m *Timer) GetBeginSec() int64 {
	if m != nil {
		return m.BeginSec
	}
	return 0
}

func (m *Timer) GetBeginNsec() int32 {
	if m != nil {
		return m.BeginNsec
	}
	return 0
}

func (m *Timer) GetEndSec() int64 {
	if m != nil {
		return m.EndSec
	}
	return 0
}

func (m *Timer) GetEndNsec() int32 {
	if m != nil {
		return m.EndNsec
	}
	return 0
}

func (m *Timer) GetGoId() int64 {
	if m != nil {
		return m.GoId
	}
	return 0
}

// A Stat is a collection of Timers along with some additional
// metadata to tag and identify itself.
type Stat struct {
	// tags is a comma-separated list of strings used to categorize a stat.
	Tags string `protobuf:"bytes,1,opt,name=tags,proto3" json:"tags,omitempty"`
	// timers is an array of Timers, each representing a different
	// (but possibly overlapping) component within this stat.
	Timers []*Timer `protobuf:"bytes,2,rep,name=timers,proto3" json:"timers,omitempty"`
	// metadata is an array of bytes used to uniquely identify a stat with an
	// undefined encoding format. For example, the Stats returned by the
	// /Profiling/GetStreamStats service use the metadata field to encode the
	// connection ID and the stream ID of each query.
	Metadata             []byte   `protobuf:"bytes,3,opt,name=metadata,proto3" json:"metadata,omitempty"`
	XXX_NoUnkeyedLiteral struct{} `json:"-"`
	XXX_unrecognized     []byte   `json:"-"`
	XXX_sizecache        int32    `json:"-"`
}

func (m *Stat) Reset()         { *m = Stat{} }
func (m *Stat) String() string { return proto.CompactTextString(m) }
func (*Stat) ProtoMessage()    {}
func (*Stat) Descriptor() ([]byte, []int) {
	return fileDescriptor_e1ab2aa17b47c6fb, []int{5}
}

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

var xxx_messageInfo_Stat proto.InternalMessageInfo

func (m *Stat) GetTags() string {
	if m != nil {
		return m.Tags
	}
	return ""
}

func (m *Stat) GetTimers() []*Timer {
	if m != nil {
		return m.Timers
	}
	return nil
}

func (m *Stat) GetMetadata() []byte {
	if m != nil {
		return m.Metadata
	}
	return nil
}

func init() {
	proto.RegisterType((*EnableRequest)(nil), "grpc.go.profiling.v1alpha.EnableRequest")
	proto.RegisterType((*EnableResponse)(nil), "grpc.go.profiling.v1alpha.EnableResponse")
	proto.RegisterType((*GetStreamStatsRequest)(nil), "grpc.go.profiling.v1alpha.GetStreamStatsRequest")
	proto.RegisterType((*GetStreamStatsResponse)(nil), "grpc.go.profiling.v1alpha.GetStreamStatsResponse")
	proto.RegisterType((*Timer)(nil), "grpc.go.profiling.v1alpha.Timer")
	proto.RegisterType((*Stat)(nil), "grpc.go.profiling.v1alpha.Stat")
}

func init() { proto.RegisterFile("profiling/proto/service.proto", fileDescriptor_e1ab2aa17b47c6fb) }

var fileDescriptor_e1ab2aa17b47c6fb = []byte{
	// 392 bytes of a gzipped FileDescriptorProto
	0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x92, 0x41, 0xab, 0xd3, 0x40,
	0x10, 0xc7, 0xc9, 0x6b, 0x12, 0xd3, 0x79, 0xcf, 0x87, 0xac, 0xe8, 0xcb, 0xab, 0x14, 0x43, 0x0e,
	0x92, 0x5e, 0x36, 0xb6, 0x5e, 0x3c, 0x17, 0x44, 0xbc, 0x88, 0x6c, 0x3d, 0x89, 0x52, 0xb6, 0xc9,
	0xb8, 0x06, 0xd2, 0x6c, 0xcc, 0x6e, 0xfb, 0x79, 0xfc, 0x6a, 0x7e, 0x13, 0xd9, 0x49, 0x5b, 0x69,
	0xa9, 0xc5, 0x77, 0x4a, 0x66, 0xe6, 0xff, 0x9b, 0xfd, 0x0f, 0x33, 0x30, 0x6e, 0x3b, 0xfd, 0xbd,
	0xaa, 0xab, 0x46, 0xe5, 0x6d, 0xa7, 0xad, 0xce, 0x0d, 0x76, 0xdb, 0xaa, 0x40, 0x4e, 0x11, 0xbb,
	0x57, 0x5d, 0x5b, 0x70, 0xa5, 0xf9, 0x41, 0xc6, 0xb7, 0x53, 0x59, 0xb7, 0x3f, 0x64, 0x3a, 0x81,
	0xc7, 0xef, 0x1a, 0xb9, 0xaa, 0x51, 0xe0, 0xcf, 0x0d, 0x1a, 0xcb, 0x62, 0x78, 0x84, 0x94, 0x28,
	0x63, 0x2f, 0xf1, 0xb2, 0x48, 0xec, 0xc3, 0xf4, 0x09, 0xdc, 0xee, 0xa5, 0xa6, 0xd5, 0x8d, 0xc1,
	0xf4, 0x0e, 0x9e, 0xbd, 0x47, 0xbb, 0xb0, 0x1d, 0xca, 0xf5, 0xc2, 0x4a, 0x6b, 0x76, 0x4d, 0xd2,
	0xaf, 0xf0, 0xfc, 0xb4, 0xd0, 0x23, 0x6c, 0x0e, 0x37, 0x86, 0xd2, 0x4b, 0xe3, 0xf2, 0xb1, 0x97,
	0x0c, 0xb2, 0xeb, 0xd9, 0x4b, 0xfe, 0x4f, 0x87, 0xdc, 0xf1, 0xe2, 0xda, 0xfc, 0xed, 0x95, 0xfe,
	0xf2, 0x20, 0xf8, 0x5c, 0xad, 0xb1, 0x63, 0x0c, 0x7c, 0x2b, 0x95, 0x21, 0xa7, 0x43, 0x41, 0xff,
	0xec, 0x05, 0x0c, 0x57, 0xa8, 0xaa, 0x66, 0x69, 0xb0, 0x88, 0xaf, 0x12, 0x2f, 0x1b, 0x88, 0x88,
	0x12, 0x0b, 0x2c, 0xd8, 0x18, 0xa0, 0x2f, 0x36, 0xae, 0x3a, 0x48, 0xbc, 0x2c, 0x10, 0xbd, 0xfc,
	0xa3, 0xc1, 0x82, 0xdd, 0xb9, 0xe1, 0x4b, 0x22, 0x7d, 0x22, 0x43, 0x6c, 0x4a, 0xc7, 0xdd, 0x43,
	0xe4, 0x0a, 0x44, 0x05, 0x44, 0x39, 0x21, 0x31, 0x4f, 0x21, 0x50, 0x7a, 0x59, 0x95, 0x71, 0x48,
	0x84, 0xaf, 0xf4, 0x87, 0x32, 0x6d, 0xc1, 0x77, 0x5e, 0xcf, 0x1a, 0x7c, 0x0b, 0xa1, 0x75, 0xee,
	0x4d, 0x7c, 0x45, 0xc3, 0x27, 0x17, 0x86, 0xa7, 0x31, 0xc5, 0x4e, 0xcf, 0x46, 0x10, 0xad, 0xd1,
	0xca, 0x52, 0x5a, 0x49, 0xde, 0x6f, 0xc4, 0x21, 0x9e, 0xfd, 0xf6, 0x60, 0xf8, 0x69, 0xcf, 0xb3,
	0x6f, 0x10, 0xf6, 0xbb, 0x62, 0xd9, 0x85, 0xee, 0x47, 0x9b, 0x1f, 0x4d, 0xfe, 0x43, 0xb9, 0xdb,
	0xe2, 0x06, 0x6e, 0x8f, 0xf7, 0xcb, 0x5e, 0x5f, 0x80, 0xcf, 0xde, 0xc8, 0x68, 0xfa, 0x00, 0xa2,
	0x7f, 0x76, 0x9e, 0x7d, 0x79, 0xa5, 0xb4, 0x56, 0x35, 0x72, 0xa5, 0x6b, 0xd9, 0x28, 0xae, 0x3b,
	0x95, 0xbb, 0x2e, 0xf9, 0xc9, 0xfd, 0xaf, 0x42, 0xfa, 0xbc, 0xf9, 0x13, 0x00, 0x00, 0xff, 0xff,
	0x5d, 0x47, 0x09, 0xa9, 0x19, 0x03, 0x00, 0x00,
}
