// ConsumerGroupHeartbeat is a part of KIP-848; there are a lot of details
// to this request so documentation is left to the KIP itself.
ConsumerGroupHeartbeatRequest => key 68, max version 0, flexible v0+
  // The group ID.
  Group: string
  // The member ID generated by the coordinator. This must be kept during
  // the entire lifetime of the member.
  MemberID: string
  // The current member epoch; 0 to join the group, -1 to leave, -2 to
  // indicate that the static member will rejoin.
  MemberEpoch: int32
  // Instance ID of the member; null if not provided or if unchanging.
  InstanceID: nullable-string
  // The rack ID of the member; null if not provided or if unchanging.
  RackID: nullable-string
  // RebalanceTimeoutMillis is how long the coordinator will wait on a member
  // to revoke its partitions. -1 if unchanging.
  RebalanceTimeoutMillis: int32(-1)
  // Subscribed topics; null if unchanging.
  SubscribedTopicNames: nullable[string]
  // The server side assignor to use; null if unchanging.
  ServerAssignor: nullable-string
  // Topic partitions owned by the member; null if unchanging.
  Topics: nullable[=>]
    // The topic ID.
    TopicID: uuid
    // The partitions.
    Partitions: [int32]

// ConsumerGroupHeartbeatResponse is returned from a ConsumerGroupHeartbeatRequest.
ConsumerGroupHeartbeatResponse =>
  ThrottleMillis
  // ErrorCode is the error for this response.
  //
  // Supported errors:
  // - GROUP_AUTHORIZATION_FAILED (version 0+)
  // - NOT_COORDINATOR (version 0+)
  // - COORDINATOR_NOT_AVAILABLE (version 0+)
  // - COORDINATOR_LOAD_IN_PROGRESS (version 0+)
  // - INVALID_REQUEST (version 0+)
  // - UNKNOWN_MEMBER_ID (version 0+)
  // - FENCED_MEMBER_EPOCH (version 0+)
  // - UNSUPPORTED_ASSIGNOR (version 0+)
  // - UNRELEASED_INSTANCE_ID (version 0+)
  // - GROUP_MAX_SIZE_REACHED (version 0+)
  ErrorCode: int16
  // A supplementary message if this errored.
  ErrorMessage: nullable-string
  // The member ID generated by the coordinator; provided when joining
  // with MemberEpoch=0.
  MemberID: nullable-string
  // The member epoch.
  MemberEpoch: int32
  // The heartbeat interval, in milliseconds.
  HeartbeatIntervalMillis: int32
  // The assignment; null if not provided.
  Assignment: nullable=>
    // The topics partitions that can be used immediately.
    Topics: [=>]
      TopicID: uuid
      Partitions: [int32]
