code: def _make_range_request(self):
      try:
          # Yes we read to the end... memory blow up is possible. We can improve by specifying length param
          return self._blob_client.download_as_bytes(start=self._pos)
      except NotFound:
          return None
      except ClientError as e:
          # be silent on range errors - it means log did not advance
          if e.code != 416:
              print(
                  "Failed to tail log from step (status code = %d)"
                  % (e.code,)
              )
          return None
      except Exception as e:
          print("Failed to tail log from step (%s)" % type(e))
          return None
  
file_path: metaflow/metaflow/plugins/gcp/gs_tail.py
imports: from io import BytesIO
  from google.cloud.exceptions import NotFound, ClientError
  from metaflow.exception import MetaflowException
  from metaflow.plugins.gcp.gs_storage_client_factory import get_gs_storage_client
  from metaflow.plugins.gcp.gs_utils import parse_gs_full_path
label_desc: Use image node_id 3 for calling the GSTail obj's underlying member method code with example usage: obj._make_range_request() and returns: self, None, None, None