# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: log_request_lite.proto

from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)




DESCRIPTOR = _descriptor.FileDescriptor(
  name='log_request_lite.proto',
  package='crit_event.proto',
  serialized_pb='\n\x16log_request_lite.proto\x12\x10\x63rit_event.proto\"\xf0\x01\n\x0eLogRequestLite\x12\x17\n\x0frequest_time_ms\x18\x04 \x01(\x03\x12\x17\n\x0flog_source_name\x18\x06 \x01(\t\x12@\n\tlog_event\x18\x03 \x03(\x0b\x32-.crit_event.proto.LogRequestLite.LogEventLite\x1aj\n\x0cLogEventLite\x12\x15\n\revent_time_ms\x18\x01 \x01(\x03\x12\x12\n\nevent_code\x18\x0b \x01(\x05\x12\x15\n\revent_flow_id\x18\x0c \x01(\x05\x12\x18\n\x10source_extension\x18\x06 \x01(\x0c')




_LOGREQUESTLITE_LOGEVENTLITE = _descriptor.Descriptor(
  name='LogEventLite',
  full_name='crit_event.proto.LogRequestLite.LogEventLite',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='event_time_ms', full_name='crit_event.proto.LogRequestLite.LogEventLite.event_time_ms', index=0,
      number=1, type=3, cpp_type=2, label=1,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    _descriptor.FieldDescriptor(
      name='event_code', full_name='crit_event.proto.LogRequestLite.LogEventLite.event_code', index=1,
      number=11, type=5, cpp_type=1, label=1,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    _descriptor.FieldDescriptor(
      name='event_flow_id', full_name='crit_event.proto.LogRequestLite.LogEventLite.event_flow_id', index=2,
      number=12, type=5, cpp_type=1, label=1,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    _descriptor.FieldDescriptor(
      name='source_extension', full_name='crit_event.proto.LogRequestLite.LogEventLite.source_extension', index=3,
      number=6, type=12, cpp_type=9, label=1,
      has_default_value=False, default_value="",
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
  ],
  extensions=[
  ],
  nested_types=[],
  enum_types=[
  ],
  options=None,
  is_extendable=False,
  extension_ranges=[],
  serialized_start=179,
  serialized_end=285,
)

_LOGREQUESTLITE = _descriptor.Descriptor(
  name='LogRequestLite',
  full_name='crit_event.proto.LogRequestLite',
  filename=None,
  file=DESCRIPTOR,
  containing_type=None,
  fields=[
    _descriptor.FieldDescriptor(
      name='request_time_ms', full_name='crit_event.proto.LogRequestLite.request_time_ms', index=0,
      number=4, type=3, cpp_type=2, label=1,
      has_default_value=False, default_value=0,
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    _descriptor.FieldDescriptor(
      name='log_source_name', full_name='crit_event.proto.LogRequestLite.log_source_name', index=1,
      number=6, type=9, cpp_type=9, label=1,
      has_default_value=False, default_value=unicode("", "utf-8"),
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
    _descriptor.FieldDescriptor(
      name='log_event', full_name='crit_event.proto.LogRequestLite.log_event', index=2,
      number=3, type=11, cpp_type=10, label=3,
      has_default_value=False, default_value=[],
      message_type=None, enum_type=None, containing_type=None,
      is_extension=False, extension_scope=None,
      options=None),
  ],
  extensions=[
  ],
  nested_types=[_LOGREQUESTLITE_LOGEVENTLITE, ],
  enum_types=[
  ],
  options=None,
  is_extendable=False,
  extension_ranges=[],
  serialized_start=45,
  serialized_end=285,
)

_LOGREQUESTLITE_LOGEVENTLITE.containing_type = _LOGREQUESTLITE;
_LOGREQUESTLITE.fields_by_name['log_event'].message_type = _LOGREQUESTLITE_LOGEVENTLITE
DESCRIPTOR.message_types_by_name['LogRequestLite'] = _LOGREQUESTLITE

class LogRequestLite(_message.Message):
  __metaclass__ = _reflection.GeneratedProtocolMessageType

  class LogEventLite(_message.Message):
    __metaclass__ = _reflection.GeneratedProtocolMessageType
    DESCRIPTOR = _LOGREQUESTLITE_LOGEVENTLITE

    # @@protoc_insertion_point(class_scope:crit_event.proto.LogRequestLite.LogEventLite)
  DESCRIPTOR = _LOGREQUESTLITE

  # @@protoc_insertion_point(class_scope:crit_event.proto.LogRequestLite)


# @@protoc_insertion_point(module_scope)
