-
Notifications
You must be signed in to change notification settings - Fork 1.3k
/
Copy pathrunloop.go
147 lines (125 loc) · 4.17 KB
/
runloop.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
package app
import (
"path"
"time"
"os"
"github.com/DataDog/datadog-agent/cmd/agent/api"
"github.com/DataDog/datadog-agent/cmd/agent/common"
"github.com/DataDog/datadog-agent/pkg/aggregator"
"github.com/DataDog/datadog-agent/pkg/config"
"github.com/DataDog/datadog-agent/pkg/dogstatsd"
"github.com/DataDog/datadog-agent/pkg/forwarder"
"github.com/DataDog/datadog-agent/pkg/metadata"
"github.com/DataDog/datadog-agent/pkg/pidfile"
"github.com/DataDog/datadog-agent/pkg/util"
"github.com/DataDog/datadog-agent/pkg/version"
log "github.com/cihub/seelog"
// register core checks
_ "github.com/DataDog/datadog-agent/pkg/collector/corechecks/embed"
_ "github.com/DataDog/datadog-agent/pkg/collector/corechecks/network"
_ "github.com/DataDog/datadog-agent/pkg/collector/corechecks/system"
// register metadata providers
_ "github.com/DataDog/datadog-agent/pkg/metadata/host"
_ "github.com/DataDog/datadog-agent/pkg/metadata/resources"
)
var (
// flags variables
runForeground bool
pidfilePath string
confdPath string
// ConfFilePath holds the path to the folder containing the configuration
// file, for override from the command line
confFilePath string
)
// run the host metadata collector every 14400 seconds (4 hours)
const hostMetadataCollectorInterval = 14400
// StartAgent Initializes the agent process
func StartAgent() {
if pidfilePath != "" {
err := pidfile.WritePID(pidfilePath)
if err != nil {
panic(err)
}
}
// Global Agent configuration
common.SetupConfig(confFilePath)
// Setup logger
err := config.SetupLogger(config.Datadog.GetString("log_level"), config.Datadog.GetString("log_file"))
if err != nil {
panic(err)
}
hostname, err := util.GetHostname()
if err != nil {
panic(err)
}
// store the computed hostname in the global cache
key := path.Join(util.AgentCachePrefix, "hostname")
util.Cache.Set(key, hostname, util.NoExpiration)
log.Infof("Starting Datadog Agent v%v", version.AgentVersion)
log.Infof("Hostname is: %s", hostname)
// start the cmd HTTP server
api.StartServer()
// setup the forwarder
keysPerDomain, err := config.GetMultipleEndpoints()
if err != nil {
log.Error("Misconfiguration of agent endpoints: ", err)
}
common.Forwarder = forwarder.NewDefaultForwarder(keysPerDomain)
log.Debugf("Starting forwarder")
common.Forwarder.Start()
log.Debugf("Forwarder started")
// setup the aggregator
agg := aggregator.InitAggregator(common.Forwarder, hostname)
agg.AddAgentStartupEvent(version.AgentVersion)
// start dogstatsd
if config.Datadog.GetBool("use_dogstatsd") {
var err error
common.DSD, err = dogstatsd.NewServer(agg.GetChannels())
if err != nil {
log.Errorf("Could not start dogstatsd: %s", err)
}
}
log.Debugf("statsd started")
// create and setup the Autoconfig instance
common.SetupAutoConfig(config.Datadog.GetString("confd_path"))
// setup the metadata collector, this needs a working Python env to function
common.MetadataScheduler = metadata.NewScheduler(common.Forwarder, config.Datadog.GetString("api_key"), hostname)
var C []config.MetadataProviders
err = config.Datadog.UnmarshalKey("metadata_providers", &C)
if err == nil {
log.Debugf("Adding configured providers to the metadata collector")
for _, c := range C {
if c.Name == "host" {
continue
}
intl := c.Interval * time.Second
err = common.MetadataScheduler.AddCollector(c.Name, intl)
if err != nil {
log.Errorf("Unable to add '%s' metadata provider: %v", c.Name, err)
} else {
log.Infof("Scheduled metadata provider '%v' to run every %v", c.Name, intl)
}
}
} else {
log.Errorf("Unable to parse metadata_providers config: %v", err)
}
// always add the host metadata collector, this is not user-configurable by design
err = common.MetadataScheduler.AddCollector("host", hostMetadataCollectorInterval*time.Second)
if err != nil {
panic("Host metadata is supposed to be always available in the catalog!")
}
}
// StopAgent Tears down the agent process
func StopAgent() {
// gracefully shut down any component
if common.DSD != nil {
common.DSD.Stop()
}
common.AC.Stop()
common.MetadataScheduler.Stop()
api.StopServer()
common.Forwarder.Stop()
os.Remove(pidfilePath)
log.Info("See ya!")
log.Flush()
}