Like Prometheus, but for logs.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 
loki/clients/pkg/promtail/wal/reader.go

61 lines
1.4 KiB

package wal
import (
"fmt"
"github.com/prometheus/common/model"
"github.com/grafana/loki/v3/clients/pkg/promtail/api"
"github.com/grafana/loki/v3/pkg/ingester/wal"
"github.com/grafana/loki/v3/pkg/util"
walUtils "github.com/grafana/loki/v3/pkg/util/wal"
)
// ReadWAL will read all entries in the WAL located under dir. Mainly used for testing
func ReadWAL(dir string) ([]api.Entry, error) {
reader, closeFn, err := walUtils.NewWalReader(dir, -1)
if err != nil {
return nil, err
}
defer func() { closeFn.Close() }()
seenSeries := make(map[uint64]model.LabelSet)
seenEntries := []api.Entry{}
for reader.Next() {
var walRec = wal.Record{}
bytes := reader.Record()
err = wal.DecodeRecord(bytes, &walRec)
if err != nil {
return nil, fmt.Errorf("error decoding wal record: %w", err)
}
// first read series
for _, series := range walRec.Series {
if _, ok := seenSeries[uint64(series.Ref)]; !ok {
seenSeries[uint64(series.Ref)] = util.MapToModelLabelSet(series.Labels.Map())
}
}
for _, entries := range walRec.RefEntries {
for _, entry := range entries.Entries {
labels, ok := seenSeries[uint64(entries.Ref)]
if !ok {
return nil, fmt.Errorf("found entry without matching series")
}
seenEntries = append(seenEntries, api.Entry{
Labels: labels,
Entry: entry,
})
}
}
// reset entry
walRec.Series = walRec.Series[:]
walRec.RefEntries = walRec.RefEntries[:]
}
return seenEntries, nil
}