closes #1289 Signed-off-by: François de Metz <francois@stormz.me> Signed-off-by: Cyril Duez <cyril@stormz.me> Rename internals struct. Signed-off-by: François de Metz <francois@stormz.me> Signed-off-by: Cyril Duez <cyril@stormz.me> Update changelog. Signed-off-by: François de Metz <francois@stormz.me> Signed-off-by: Cyril Duez <cyril@stormz.me> Update READMEs and CHANGELOG. Signed-off-by: François de Metz <francois@stormz.me> Signed-off-by: Cyril Duez <cyril@stormz.me> Update SampleConfig. Update the config format. Update telegraf config. Update the webhooks README. Update changelog. Update the changelog with an upgrade path. Update default ports. Fix indent. Check for nil value on AvailableWebhooks. Check for CanInterface.
100 lines
2.0 KiB
Go
100 lines
2.0 KiB
Go
package webhooks
|
|
|
|
import (
|
|
"fmt"
|
|
"log"
|
|
"net/http"
|
|
"reflect"
|
|
|
|
"github.com/gorilla/mux"
|
|
"github.com/influxdata/telegraf"
|
|
"github.com/influxdata/telegraf/plugins/inputs"
|
|
|
|
"github.com/influxdata/telegraf/plugins/inputs/webhooks/github"
|
|
"github.com/influxdata/telegraf/plugins/inputs/webhooks/rollbar"
|
|
)
|
|
|
|
type Webhook interface {
|
|
Register(router *mux.Router, acc telegraf.Accumulator)
|
|
}
|
|
|
|
func init() {
|
|
inputs.Add("webhooks", func() telegraf.Input { return NewWebhooks() })
|
|
}
|
|
|
|
type Webhooks struct {
|
|
ServiceAddress string
|
|
|
|
Github *github.GithubWebhook
|
|
Rollbar *rollbar.RollbarWebhook
|
|
}
|
|
|
|
func NewWebhooks() *Webhooks {
|
|
return &Webhooks{}
|
|
}
|
|
|
|
func (wb *Webhooks) SampleConfig() string {
|
|
return `
|
|
## Address and port to host Webhook listener on
|
|
service_address = ":1619"
|
|
|
|
[inputs.webhooks.github]
|
|
path = "/github"
|
|
|
|
[inputs.webhooks.rollbar]
|
|
path = "/rollbar"
|
|
`
|
|
}
|
|
|
|
func (wb *Webhooks) Description() string {
|
|
return "A Webhooks Event collector"
|
|
}
|
|
|
|
func (wb *Webhooks) Gather(_ telegraf.Accumulator) error {
|
|
return nil
|
|
}
|
|
|
|
func (wb *Webhooks) Listen(acc telegraf.Accumulator) {
|
|
r := mux.NewRouter()
|
|
|
|
for _, webhook := range wb.AvailableWebhooks() {
|
|
webhook.Register(r, acc)
|
|
}
|
|
|
|
err := http.ListenAndServe(fmt.Sprintf("%s", wb.ServiceAddress), r)
|
|
if err != nil {
|
|
log.Printf("Error starting server: %v", err)
|
|
}
|
|
}
|
|
|
|
// Looks for fields which implement Webhook interface
|
|
func (wb *Webhooks) AvailableWebhooks() []Webhook {
|
|
webhooks := make([]Webhook, 0)
|
|
s := reflect.ValueOf(wb).Elem()
|
|
for i := 0; i < s.NumField(); i++ {
|
|
f := s.Field(i)
|
|
|
|
if !f.CanInterface() {
|
|
continue
|
|
}
|
|
|
|
if wbPlugin, ok := f.Interface().(Webhook); ok {
|
|
if !reflect.ValueOf(wbPlugin).IsNil() {
|
|
webhooks = append(webhooks, wbPlugin)
|
|
}
|
|
}
|
|
}
|
|
|
|
return webhooks
|
|
}
|
|
|
|
func (wb *Webhooks) Start(acc telegraf.Accumulator) error {
|
|
go wb.Listen(acc)
|
|
log.Printf("Started the webhooks service on %s\n", wb.ServiceAddress)
|
|
return nil
|
|
}
|
|
|
|
func (rb *Webhooks) Stop() {
|
|
log.Println("Stopping the Webhooks service")
|
|
}
|