func()

in core/log/metric/reader.go [136:175]


func (r *defaultMetricLogReader) readMetricsInOneFileByEndTime(filename string, offset uint64, beginMs uint64, endMs uint64, resource string, prevSize uint32) ([]*base.MetricItem, bool, error) {
	beginSec := beginMs / 1000
	endSec := endMs / 1000
	file, err := openFileAndSeekTo(filename, offset)
	if err != nil {
		return nil, false, err
	}
	defer file.Close()

	bufReader := bufio.NewReaderSize(file, 8192)
	items := make([]*base.MetricItem, 0, 1024)
	for {
		line, err := readLine(bufReader)
		if err != nil {
			if err == io.EOF {
				return items, true, nil
			}
			return nil, false, errors.Wrap(err, "error when reading lines from file")
		}
		item, err := base.MetricItemFromFatString(line)
		if err != nil {
			logging.Error(err, "Invalid line of metric file in defaultMetricLogReader.readMetricsInOneFileByEndTime()", "fileLine", line)
			continue
		}
		tsSec := item.Timestamp / 1000
		// currentSecond should in [beginSec, endSec]
		if tsSec < beginSec || tsSec > endSec {
			return items, false, nil
		}

		// empty resource name indicates "fetch all"
		if resource == "" || resource == item.Resource {
			items = append(items, item)
		}
		// Max items limit to avoid infinite reading
		if len(items)+int(prevSize) >= maxItemAmount {
			return items, false, nil
		}
	}
}