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/pkg/pattern/iter/iterator.go

105 lines
2.0 KiB

package iter
import (
iter "github.com/grafana/loki/v3/pkg/iter/v2"
"github.com/grafana/loki/v3/pkg/logproto"
)
type Iterator interface {
iter.CloseIterator[logproto.PatternSample]
Pattern() string
Level() string
}
func NewSlice(pattern, lvl string, s []logproto.PatternSample) *PatternIter {
return &PatternIter{
CloseIterator: iter.WithClose(iter.NewSliceIter(s), nil),
pattern: pattern,
level: lvl,
}
}
func NewEmpty(pattern string) *PatternIter {
return &PatternIter{
CloseIterator: iter.WithClose(iter.NewEmptyIter[logproto.PatternSample](), nil),
pattern: pattern,
}
}
type PatternIter struct {
iter.CloseIterator[logproto.PatternSample]
pattern string
level string
}
func (s *PatternIter) Pattern() string {
return s.pattern
}
func (s *PatternIter) Level() string {
return s.level
}
type nonOverlappingIterator struct {
iterators []Iterator
curr Iterator
pattern string
level string
}
// NewNonOverlappingIterator gives a chained iterator over a list of iterators.
func NewNonOverlappingIterator(pattern, lvl string, iterators []Iterator) Iterator {
return &nonOverlappingIterator{
iterators: iterators,
pattern: pattern,
level: lvl,
}
}
func (i *nonOverlappingIterator) Next() bool {
for i.curr == nil || !i.curr.Next() {
if len(i.iterators) == 0 {
if i.curr != nil {
i.curr.Close()
}
return false
}
if i.curr != nil {
i.curr.Close()
}
i.curr, i.iterators = i.iterators[0], i.iterators[1:]
}
return true
}
func (i *nonOverlappingIterator) At() logproto.PatternSample {
return i.curr.At()
}
func (i *nonOverlappingIterator) Pattern() string {
return i.pattern
}
func (i *nonOverlappingIterator) Level() string {
return i.level
}
func (i *nonOverlappingIterator) Err() error {
if i.curr != nil {
return i.curr.Err()
}
return nil
}
func (i *nonOverlappingIterator) Close() error {
if i.curr != nil {
i.curr.Close()
}
for _, iter := range i.iterators {
iter.Close()
}
i.iterators = nil
return nil
}