package echo
import (
"context"
"sync"
"github.com/go-kit/log/level"
"github.com/grafana/agent/component"
"github.com/grafana/agent/component/common/loki"
)
func init() {
component.Register(component.Registration{
Name: "loki.echo",
Args: Arguments{},
Exports: Exports{},
Build: func(opts component.Options, args component.Arguments) (component.Component, error) {
return New(opts, args.(Arguments))
},
})
}
type Arguments struct{}
type Exports struct {
Receiver loki.LogsReceiver `river:"receiver,attr"`
}
var DefaultArguments = Arguments{}
func (arg *Arguments) UnmarshalRiver(f func(interface{}) error) error {
*arg = DefaultArguments
type args Arguments
return f((*args)(arg))
}
var (
_ component.Component = (*Component)(nil)
)
type Component struct {
opts component.Options
mut sync.RWMutex
args Arguments
receiver loki.LogsReceiver
}
func New(o component.Options, args Arguments) (*Component, error) {
ch := make(chan loki.Entry)
c := &Component{
opts: o,
receiver: ch,
}
if err := c.Update(args); err != nil {
return nil, err
}
o.OnStateChange(Exports{Receiver: c.receiver})
return c, nil
}
func (c *Component) Run(ctx context.Context) error {
for {
select {
case <-ctx.Done():
return nil
case entry := <-c.receiver:
level.Info(c.opts.Logger).Log("receiver", c.opts.ID, "entry", entry.Line, "labels", entry.Labels.String())
}
}
}
func (c *Component) Update(args component.Arguments) error {
newArgs := args.(Arguments)
c.mut.Lock()
defer c.mut.Unlock()
c.args = newArgs
return nil
}