Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/component/loki/source/windowsevent/component_windows.go
5330 views
1
package windowsevent
2
3
import (
4
"context"
5
"os"
6
"path"
7
"sync"
8
9
"github.com/grafana/agent/component"
10
"github.com/grafana/agent/component/common/loki"
11
"github.com/grafana/loki/clients/pkg/promtail/api"
12
"github.com/grafana/loki/clients/pkg/promtail/scrapeconfig"
13
"github.com/grafana/loki/clients/pkg/promtail/targets/windows"
14
)
15
16
func init() {
17
component.Register(component.Registration{
18
Name: "loki.source.windowsevent",
19
Args: Arguments{},
20
21
Build: func(opts component.Options, args component.Arguments) (component.Component, error) {
22
return New(opts, args.(Arguments))
23
},
24
})
25
}
26
27
var (
28
_ component.Component = (*Component)(nil)
29
)
30
31
// Component implements the loki.source.windowsevent component.
32
type Component struct {
33
opts component.Options
34
35
mut sync.RWMutex
36
args Arguments
37
target *windows.Target
38
handle *handler
39
receivers []loki.LogsReceiver
40
}
41
42
type handler struct {
43
handler chan api.Entry
44
}
45
46
func (h *handler) Chan() chan<- api.Entry {
47
return h.handler
48
}
49
50
func (h *handler) Stop() {
51
// This is a noop.
52
}
53
54
// New creates a new loki.source.windowsevent component.
55
func New(o component.Options, args Arguments) (*Component, error) {
56
57
c := &Component{
58
opts: o,
59
receivers: args.ForwardTo,
60
handle: &handler{handler: make(chan api.Entry)},
61
args: args,
62
}
63
64
// Call to Update() to start readers and set receivers once at the start.
65
if err := c.Update(args); err != nil {
66
return nil, err
67
}
68
return c, nil
69
}
70
71
// Run implements component.Component.
72
func (c *Component) Run(ctx context.Context) error {
73
defer func() {
74
c.mut.Lock()
75
defer c.mut.Unlock()
76
if c.target != nil {
77
_ = c.target.Stop()
78
}
79
}()
80
for {
81
select {
82
case <-ctx.Done():
83
return nil
84
case entry := <-c.handle.handler:
85
c.mut.RLock()
86
lokiEntry := loki.Entry{
87
Labels: entry.Labels,
88
Entry: entry.Entry,
89
}
90
for _, receiver := range c.receivers {
91
receiver <- lokiEntry
92
}
93
c.mut.RUnlock()
94
}
95
}
96
97
}
98
99
// Update implements component.Component.
100
func (c *Component) Update(args component.Arguments) error {
101
newArgs := args.(Arguments)
102
103
c.mut.Lock()
104
defer c.mut.Unlock()
105
106
// If no bookmark specified create one in the datapath.
107
if newArgs.BookmarkPath == "" {
108
newArgs.BookmarkPath = path.Join(c.opts.DataPath, "bookmark.xml")
109
}
110
111
// Create the bookmark file and parent folders if they don't exist.
112
_, err := os.Stat(newArgs.BookmarkPath)
113
if os.IsNotExist(err) {
114
err := os.MkdirAll(path.Dir(newArgs.BookmarkPath), 644)
115
if err != nil {
116
return err
117
}
118
f, err := os.Create(newArgs.BookmarkPath)
119
if err != nil {
120
return err
121
}
122
_ = f.Close()
123
}
124
125
winTarget, err := windows.New(c.opts.Logger, c.handle, nil, convertConfig(newArgs))
126
if err != nil {
127
return err
128
}
129
// Stop the original target.
130
if c.target != nil {
131
err := c.target.Stop()
132
if err != nil {
133
return err
134
}
135
}
136
c.target = winTarget
137
138
c.args = newArgs
139
c.receivers = newArgs.ForwardTo
140
return nil
141
}
142
143
func convertConfig(arg Arguments) *scrapeconfig.WindowsEventsTargetConfig {
144
return &scrapeconfig.WindowsEventsTargetConfig{
145
Locale: uint32(arg.Locale),
146
EventlogName: arg.EventLogName,
147
Query: arg.XPathQuery,
148
UseIncomingTimestamp: arg.UseIncomingTimestamp,
149
BookmarkPath: arg.BookmarkPath,
150
PollInterval: arg.PollInterval,
151
ExcludeEventData: arg.ExcludeEventData,
152
ExcludeEventMessage: false,
153
ExcludeUserData: arg.ExcludeUserdata,
154
}
155
}
156
157