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
}
}
}