Path: blob/main/component/loki/source/windowsevent/component_windows.go
5330 views
package windowsevent12import (3"context"4"os"5"path"6"sync"78"github.com/grafana/agent/component"9"github.com/grafana/agent/component/common/loki"10"github.com/grafana/loki/clients/pkg/promtail/api"11"github.com/grafana/loki/clients/pkg/promtail/scrapeconfig"12"github.com/grafana/loki/clients/pkg/promtail/targets/windows"13)1415func init() {16component.Register(component.Registration{17Name: "loki.source.windowsevent",18Args: Arguments{},1920Build: func(opts component.Options, args component.Arguments) (component.Component, error) {21return New(opts, args.(Arguments))22},23})24}2526var (27_ component.Component = (*Component)(nil)28)2930// Component implements the loki.source.windowsevent component.31type Component struct {32opts component.Options3334mut sync.RWMutex35args Arguments36target *windows.Target37handle *handler38receivers []loki.LogsReceiver39}4041type handler struct {42handler chan api.Entry43}4445func (h *handler) Chan() chan<- api.Entry {46return h.handler47}4849func (h *handler) Stop() {50// This is a noop.51}5253// New creates a new loki.source.windowsevent component.54func New(o component.Options, args Arguments) (*Component, error) {5556c := &Component{57opts: o,58receivers: args.ForwardTo,59handle: &handler{handler: make(chan api.Entry)},60args: args,61}6263// Call to Update() to start readers and set receivers once at the start.64if err := c.Update(args); err != nil {65return nil, err66}67return c, nil68}6970// Run implements component.Component.71func (c *Component) Run(ctx context.Context) error {72defer func() {73c.mut.Lock()74defer c.mut.Unlock()75if c.target != nil {76_ = c.target.Stop()77}78}()79for {80select {81case <-ctx.Done():82return nil83case entry := <-c.handle.handler:84c.mut.RLock()85lokiEntry := loki.Entry{86Labels: entry.Labels,87Entry: entry.Entry,88}89for _, receiver := range c.receivers {90receiver <- lokiEntry91}92c.mut.RUnlock()93}94}9596}9798// Update implements component.Component.99func (c *Component) Update(args component.Arguments) error {100newArgs := args.(Arguments)101102c.mut.Lock()103defer c.mut.Unlock()104105// If no bookmark specified create one in the datapath.106if newArgs.BookmarkPath == "" {107newArgs.BookmarkPath = path.Join(c.opts.DataPath, "bookmark.xml")108}109110// Create the bookmark file and parent folders if they don't exist.111_, err := os.Stat(newArgs.BookmarkPath)112if os.IsNotExist(err) {113err := os.MkdirAll(path.Dir(newArgs.BookmarkPath), 644)114if err != nil {115return err116}117f, err := os.Create(newArgs.BookmarkPath)118if err != nil {119return err120}121_ = f.Close()122}123124winTarget, err := windows.New(c.opts.Logger, c.handle, nil, convertConfig(newArgs))125if err != nil {126return err127}128// Stop the original target.129if c.target != nil {130err := c.target.Stop()131if err != nil {132return err133}134}135c.target = winTarget136137c.args = newArgs138c.receivers = newArgs.ForwardTo139return nil140}141142func convertConfig(arg Arguments) *scrapeconfig.WindowsEventsTargetConfig {143return &scrapeconfig.WindowsEventsTargetConfig{144Locale: uint32(arg.Locale),145EventlogName: arg.EventLogName,146Query: arg.XPathQuery,147UseIncomingTimestamp: arg.UseIncomingTimestamp,148BookmarkPath: arg.BookmarkPath,149PollInterval: arg.PollInterval,150ExcludeEventData: arg.ExcludeEventData,151ExcludeEventMessage: false,152ExcludeUserData: arg.ExcludeUserdata,153}154}155156157