Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aos
GitHub Repository: aos/grafana-agent
Path: blob/main/cmd/grafana-agent-service/main_windows.go
4094 views
1
package main
2
3
import (
4
"context"
5
"fmt"
6
"os"
7
"sync"
8
9
"github.com/go-kit/log"
10
"github.com/go-kit/log/level"
11
"golang.org/x/sys/windows/svc"
12
)
13
14
const serviceName = "Grafana Agent Flow"
15
16
func main() {
17
logger, err := newLogger()
18
if err != nil {
19
// Ideally the logger never fails to be created, since if it does, there's
20
// nowhere to send the failure to.
21
fmt.Fprintln(os.Stderr, err)
22
os.Exit(1)
23
}
24
25
managerConfig, err := loadConfig()
26
if err != nil {
27
level.Error(logger).Log("msg", "failed to run service", "err", err)
28
os.Exit(1)
29
}
30
31
cfg := serviceManagerConfig{
32
Path: managerConfig.ServicePath,
33
Args: managerConfig.Args,
34
Dir: managerConfig.WorkingDirectory,
35
36
// Send logs directly to the event logger.
37
Stdout: logger,
38
Stderr: logger,
39
}
40
41
as := &agentService{logger: logger, cfg: cfg}
42
if err := svc.Run(serviceName, as); err != nil {
43
level.Error(logger).Log("msg", "failed to run service", "err", err)
44
os.Exit(1)
45
}
46
}
47
48
type agentService struct {
49
logger log.Logger
50
cfg serviceManagerConfig
51
}
52
53
const cmdsAccepted = svc.AcceptStop | svc.AcceptShutdown
54
55
func (as *agentService) Execute(args []string, r <-chan svc.ChangeRequest, s chan<- svc.Status) (svcSpecificEC bool, exitCode uint32) {
56
defer func() {
57
s <- svc.Status{State: svc.Stopped}
58
}()
59
60
var workers sync.WaitGroup
61
defer workers.Wait()
62
63
ctx, cancel := context.WithCancel(context.Background())
64
defer cancel()
65
66
s <- svc.Status{State: svc.StartPending}
67
68
// Run the serviceManager.
69
{
70
sm := newServiceManager(as.logger, as.cfg)
71
72
workers.Add(1)
73
go func() {
74
// In case the service manager exits on its own, we cancel our context to
75
// signal to the parent goroutine to exit.
76
defer cancel()
77
defer workers.Done()
78
sm.Run(ctx)
79
}()
80
}
81
82
s <- svc.Status{State: svc.Running, Accepts: cmdsAccepted}
83
defer func() {
84
s <- svc.Status{State: svc.StopPending}
85
}()
86
87
for {
88
select {
89
case <-ctx.Done():
90
// Our managed service exited; shut down the service.
91
return false, 0
92
case req := <-r:
93
switch req.Cmd {
94
case svc.Interrogate:
95
s <- req.CurrentStatus
96
case svc.Pause, svc.Continue:
97
// no-op
98
default:
99
// Every other command should terminate the service.
100
return false, 0
101
}
102
}
103
}
104
}
105
106