-
Notifications
You must be signed in to change notification settings - Fork 5.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Windows Service #1543
Windows Service #1543
Changes from 15 commits
c6a11e9
4f44481
35f5e62
101dbd2
020b2c7
c2a4df3
dd54955
b2b8bd4
ca070cd
2d9477b
1d43fbe
a0b25c6
cea8030
58e5cbb
a57781a
5b11934
f4000a3
73993cc
a22b24a
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,59 +1,6 @@ | ||
github.com/Microsoft/go-winio 9f57cbbcbcb41dea496528872a4f0e37a4f7ae98 | ||
github.com/Shopify/sarama 8aadb476e66ca998f2f6bb3c993e9a2daa3666b9 | ||
github.com/Sirupsen/logrus 219c8cb75c258c552e999735be6df753ffc7afdc | ||
github.com/Microsoft/go-winio ce2922f643c8fd76b46cadc7f404a06282678b34 | ||
github.com/StackExchange/wmi f3e2bae1e0cb5aef83e319133eabfee30013a4a5 | ||
github.com/amir/raidman 53c1b967405155bfc8758557863bf2e14f814687 | ||
github.com/aws/aws-sdk-go 13a12060f716145019378a10e2806c174356b857 | ||
github.com/beorn7/perks 3ac7bf7a47d159a033b107610db8a1b6575507a4 | ||
github.com/cenkalti/backoff 4dc77674aceaabba2c7e3da25d4c823edfb73f99 | ||
github.com/couchbase/go-couchbase cb664315a324d87d19c879d9cc67fda6be8c2ac1 | ||
github.com/couchbase/gomemcached a5ea6356f648fec6ab89add00edd09151455b4b2 | ||
github.com/couchbase/goutils 5823a0cbaaa9008406021dc5daf80125ea30bba6 | ||
github.com/dancannon/gorethink e7cac92ea2bc52638791a021f212145acfedb1fc | ||
github.com/davecgh/go-spew 5215b55f46b2b919f50a1df0eaa5886afe4e3b3d | ||
github.com/docker/engine-api 8924d6900370b4c7e7984be5adc61f50a80d7537 | ||
github.com/docker/go-connections f549a9393d05688dff0992ef3efd8bbe6c628aeb | ||
github.com/docker/go-units 5d2041e26a699eaca682e2ea41c8f891e1060444 | ||
github.com/eapache/go-resiliency b86b1ec0dd4209a588dc1285cdd471e73525c0b3 | ||
github.com/eapache/queue ded5959c0d4e360646dc9e9908cff48666781367 | ||
github.com/eclipse/paho.mqtt.golang 0f7a459f04f13a41b7ed752d47944528d4bf9a86 | ||
github.com/go-ole/go-ole 50055884d646dd9434f16bbb5c9801749b9bafe4 | ||
github.com/go-sql-driver/mysql 1fca743146605a172a266e1654e01e5cd5669bee | ||
github.com/golang/protobuf 552c7b9542c194800fd493123b3798ef0a832032 | ||
github.com/golang/snappy 427fb6fc07997f43afa32f35e850833760e489a7 | ||
github.com/gonuts/go-shellquote e842a11b24c6abfb3dd27af69a17f482e4b483c2 | ||
github.com/gorilla/context 1ea25387ff6f684839d82767c1733ff4d4d15d0a | ||
github.com/gorilla/mux c9e326e2bdec29039a3761c07bece13133863e1e | ||
github.com/hailocab/go-hostpool e80d13ce29ede4452c43dea11e79b9bc8a15b478 | ||
github.com/influxdata/config b79f6829346b8d6e78ba73544b1e1038f1f1c9da | ||
github.com/influxdata/influxdb e3fef5593c21644f2b43af55d6e17e70910b0e48 | ||
github.com/influxdata/toml af4df43894b16e3fd2b788d01bd27ad0776ef2d0 | ||
github.com/klauspost/crc32 19b0b332c9e4516a6370a0456e6182c3b5036720 | ||
github.com/lib/pq e182dc4027e2ded4b19396d638610f2653295f36 | ||
github.com/lxn/win 9a7734ea4db26bc593d52f6a8a957afdad39c5c1 | ||
github.com/matttproud/golang_protobuf_extensions d0c3fe89de86839aecf2e0579c40ba3bb336a453 | ||
github.com/miekg/dns cce6c130cdb92c752850880fd285bea1d64439dd | ||
github.com/mreiferson/go-snappystream 028eae7ab5c4c9e2d1cb4c4ca1e53259bbe7e504 | ||
github.com/naoina/go-stringutil 6b638e95a32d0c1131db0e7fe83775cbea4a0d0b | ||
github.com/nats-io/nats b13fc9d12b0b123ebc374e6b808c6228ae4234a3 | ||
github.com/nats-io/nuid 4f84f5f3b2786224e336af2e13dba0a0a80b76fa | ||
github.com/nsqio/go-nsq 0b80d6f05e15ca1930e0c5e1d540ed627e299980 | ||
github.com/prometheus/client_golang 18acf9993a863f4c4b40612e19cdd243e7c86831 | ||
github.com/prometheus/client_model fa8ad6fec33561be4280a8f0514318c79d7f6cb6 | ||
github.com/prometheus/common e8eabff8812b05acf522b45fdcd725a785188e37 | ||
github.com/prometheus/procfs 406e5b7bfd8201a36e2bb5f7bdae0b03380c2ce8 | ||
github.com/samuel/go-zookeeper 218e9c81c0dd8b3b18172b2bbfad92cc7d6db55f | ||
github.com/shirou/gopsutil 1f32ce1bb380845be7f5d174ac641a2c592c0c42 | ||
github.com/shirou/w32 ada3ba68f000aa1b58580e45c9d308fe0b7fc5c5 | ||
github.com/soniah/gosnmp b1b4f885b12c5dcbd021c5cee1c904110de6db7d | ||
github.com/streadway/amqp b4f3ceab0337f013208d31348b578d83c0064744 | ||
github.com/stretchr/testify 1f4a1643a57e798696635ea4c126e9127adb7d3c | ||
github.com/wvanbergen/kafka 46f9a1cf3f670edec492029fadded9c2d9e18866 | ||
github.com/wvanbergen/kazoo-go 0f768712ae6f76454f987c3356177e138df258f8 | ||
github.com/zensqlmonitor/go-mssqldb ffe5510c6fa5e15e6d983210ab501c815b56b363 | ||
golang.org/x/net 6acef71eb69611914f7a30939ea9f6e194c78172 | ||
golang.org/x/text a71fd10341b064c10f4a81ceac72bcf70f26ea34 | ||
gopkg.in/dancannon/gorethink.v1 7d1af5be49cb5ecc7b177bf387d232050299d6ef | ||
gopkg.in/fatih/pool.v2 cba550ebf9bce999a02e963296d4bc7a486cb715 | ||
gopkg.in/mgo.v2 d90005c5262a3463800497ea5a89aed5fe22c886 | ||
gopkg.in/yaml.v2 a83829b6f1293c91addabc89d0571c246397bbf4 | ||
github.com/go-ole/go-ole be49f7c07711fcb603cff39e1de7c67926dc0ba7 | ||
github.com/lxn/win 950a0e81e7678e63d8e6cd32412bdecb325ccd88 | ||
github.com/shirou/w32 3c9377fc6748f222729a8270fe2775d149a249ad | ||
golang.org/x/sys a646d33e2ee3172a661fc09bca23bb4889a41bc8 |
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -6,6 +6,7 @@ import ( | |
"log" | ||
"os" | ||
"os/signal" | ||
"runtime" | ||
"strings" | ||
"syscall" | ||
|
||
|
@@ -15,6 +16,7 @@ import ( | |
_ "github.com/influxdata/telegraf/plugins/inputs/all" | ||
"github.com/influxdata/telegraf/plugins/outputs" | ||
_ "github.com/influxdata/telegraf/plugins/outputs/all" | ||
"github.com/kardianos/service" | ||
) | ||
|
||
var fDebug = flag.Bool("debug", false, | ||
|
@@ -45,6 +47,8 @@ var fOutputFiltersLegacy = flag.String("outputfilter", "", | |
"filter the outputs to enable, separator is :") | ||
var fConfigDirectoryLegacy = flag.String("configdirectory", "", | ||
"directory containing additional *.conf files") | ||
var fService = flag.String("service", "", | ||
"operate on the service") | ||
|
||
// Telegraf version, populated linker. | ||
// ie, -ldflags "-X main.version=`git describe --always --tags`" | ||
|
@@ -74,6 +78,7 @@ The flags are: | |
-debug print metrics as they're generated to stdout | ||
-quiet run in quiet mode | ||
-version print the version to stdout | ||
-service Control the service, ie, 'telegraf -service install' | ||
|
||
In addition to the -config flag, telegraf will also load the config file from | ||
an environment variable or default location. Precedence is: | ||
|
@@ -100,7 +105,21 @@ Examples: | |
telegraf -config telegraf.conf -input-filter cpu:mem -output-filter influxdb | ||
` | ||
|
||
func main() { | ||
var logger service.Logger | ||
|
||
var stop chan struct{} | ||
|
||
var srvc service.Service | ||
|
||
type program struct{} | ||
|
||
func reloadLoop(stop chan struct{}, s service.Service) { | ||
defer func() { | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. can you explain what this does? (the There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more.
|
||
if service.Interactive() { | ||
os.Exit(0) | ||
} | ||
return | ||
}() | ||
reload := make(chan bool, 1) | ||
reload <- true | ||
for <-reload { | ||
|
@@ -181,6 +200,14 @@ func main() { | |
return | ||
} | ||
|
||
if *fService != "" && runtime.GOOS == "windows" { | ||
err := service.Control(s, *fService) | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
return | ||
} | ||
|
||
// If no other options are specified, load the config file and run. | ||
c := config.NewConfig() | ||
c.OutputFilters = outputFilters | ||
|
@@ -243,14 +270,18 @@ func main() { | |
signals := make(chan os.Signal) | ||
signal.Notify(signals, os.Interrupt, syscall.SIGHUP) | ||
go func() { | ||
sig := <-signals | ||
if sig == os.Interrupt { | ||
close(shutdown) | ||
} | ||
if sig == syscall.SIGHUP { | ||
log.Printf("Reloading Telegraf config\n") | ||
<-reload | ||
reload <- true | ||
select { | ||
case sig := <-signals: | ||
if sig == os.Interrupt { | ||
close(shutdown) | ||
} | ||
if sig == syscall.SIGHUP { | ||
log.Printf("Reloading Telegraf config\n") | ||
<-reload | ||
reload <- true | ||
close(shutdown) | ||
} | ||
case <-stop: | ||
close(shutdown) | ||
} | ||
}() | ||
|
@@ -279,3 +310,47 @@ func usageExit(rc int) { | |
fmt.Println(usage) | ||
os.Exit(rc) | ||
} | ||
|
||
func (p *program) Start(s service.Service) error { | ||
srvc = s | ||
go p.run() | ||
return nil | ||
} | ||
func (p *program) run() { | ||
stop = make(chan struct{}) | ||
reloadLoop(stop, srvc) | ||
} | ||
func (p *program) Stop(s service.Service) error { | ||
close(stop) | ||
return nil | ||
} | ||
|
||
func main() { | ||
if runtime.GOOS == "windows" { | ||
svcConfig := &service.Config{ | ||
Name: "telegraf", | ||
DisplayName: "Telegraf Data Collector Service", | ||
Description: "Collects data using a series of plugins and publishes it to" + | ||
"another series of plugins.", | ||
} | ||
|
||
svcConfig.Arguments = []string{"-config", "C:\\telegraf\\telegraf.conf"} | ||
|
||
prg := &program{} | ||
s, err := service.New(prg, svcConfig) | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
logger, err = s.Logger(nil) | ||
if err != nil { | ||
log.Fatal(err) | ||
} | ||
err = s.Run() | ||
if err != nil { | ||
logger.Error(err) | ||
} | ||
} else { | ||
stop = make(chan struct{}) | ||
reloadLoop(stop, nil) | ||
} | ||
} |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,36 +1,27 @@ | ||
# Running Telegraf as a Windows Service | ||
|
||
If you have tried to install Go binaries as Windows Services with the **sc.exe** | ||
tool you may have seen that the service errors and stops running after a while. | ||
Telegraf natively supports running as a Windows Service. Outlined below is are | ||
the general steps to set it up. | ||
|
||
1. Obtain the telegraf windows distribution | ||
2. Create the directory C:\telegraf (if you install in a different location you | ||
will need to edit `cmd/telegraf/telegraf.go` and change the config file | ||
location and recompile to use your location) | ||
3. Place the executable and the config file into C:\telegraf | ||
4. Run `C:\telegraf\telegraf.exe --service install` as an administrator | ||
5. Edit the configuration file to meet your needs | ||
6. Run `C:\telegraf\telegraf.exe --config C:\telegraf\telegraf.conf --test` to | ||
check that it works | ||
7. Run `net start telegraf` to start collecting data | ||
|
||
## Other supported operations | ||
|
||
Telegraf can manage its own service through the --service flag: | ||
|
||
| Command | Effect | | ||
|------------------------------------|-------------------------------| | ||
| `telegraf.exe --service install` | Install telegraf as a service | | ||
| `telegraf.exe --service uninstall` | Remove the telegraf service | | ||
| `telegraf.exe --service start` | Start the telegraf service | | ||
| `telegraf.exe --service stop` | Stop the telegraf service | | ||
|
||
**NSSM** (the Non-Sucking Service Manager) is a tool that helps you in a | ||
[number of scenarios](http://nssm.cc/scenarios) including running Go binaries | ||
that were not specifically designed to run only in Windows platforms. | ||
|
||
## NSSM Installation via Chocolatey | ||
|
||
You can install [Chocolatey](https://chocolatey.org/) and [NSSM](http://nssm.cc/) | ||
with these commands | ||
|
||
```powershell | ||
iex ((new-object net.webclient).DownloadString('https://chocolatey.org/install.ps1')) | ||
choco install -y nssm | ||
``` | ||
|
||
## Installing Telegraf as a Windows Service with NSSM | ||
|
||
You can download the latest Telegraf Windows binaries (still Experimental at | ||
the moment) from [the Telegraf Github repo](https://github.com/influxdata/telegraf). | ||
|
||
Then you can create a C:\telegraf folder, unzip the binary there and modify the | ||
**telegraf.conf** sample to allocate the metrics you want to send to **InfluxDB**. | ||
|
||
Once you have NSSM installed in your system, the process is quite straightforward. | ||
You only need to type this command in your Windows shell | ||
|
||
```powershell | ||
nssm install Telegraf c:\telegraf\telegraf.exe -config c:\telegraf\telegraf.config | ||
``` | ||
|
||
And now your service will be installed in Windows and you will be able to start and | ||
stop it gracefully |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this should also be in a
if windows {}
conditional (or equivalent behavior). Otherwise we have this flag which will be present, but does nothing on other OSs.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
it'll still show up in the
--help
output though. I would just leave it and put in a(windows only)
blurb in the doc.