Datadog dogstatsd middleware plugin for Caddy.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

111 lines
2.5 KiB

package caddydogstatsd
import (
"fmt"
"strconv"
"strings"
"github.com/datadog/datadog-go/statsd"
"github.com/caddyserver/caddy"
"github.com/caddyserver/caddy/caddyhttp/httpserver"
)
func init() {
// register our plugin with Caddy
caddy.RegisterPlugin("dogstatsd", caddy.Plugin{
ServerType: "http",
Action: setup,
})
}
func setup(c *caddy.Controller) error {
for c.Next() {
// only parse if the initial directive is "dogstatsd"
if c.Val() != "dogstatsd" {
continue
}
// default config values
var namespace = ""
var host = "127.0.0.1:8125"
var globalTags = []string{}
var sampleRate = 1.0
// if we have a block, then parse that
// e.g.
// dogstatsd {
// host 127.0.0.1:8125
// }
for c.NextBlock() {
// each line if of the format `{key} {arg} [{arg}...]`
var key string
key = c.Val()
var args []string
args = c.RemainingArgs()
// we expect every directive to have at least 1 argument
if len(args) == 0 {
return c.ArgErr()
}
// parse directives
switch key {
case "host":
host = args[0]
case "samplerate":
var err error
sampleRate, err = strconv.ParseFloat(args[0], 64)
if err != nil {
return c.SyntaxErr(fmt.Sprintf("expected float for \"samplerate\", instead found \"%s\"", args[0]))
}
case "namespace":
namespace = args[0]
if !strings.HasSuffix(namespace, ".") {
namespace += "."
}
case "tags":
globalTags = args
default:
return c.SyntaxErr(fmt.Sprintf("expected one of \"host\", \"samplerate\", \"namespace\", \"tags\", instead found \"%s\"", key))
}
}
// handle non-block configuration
// e.g.
// dogstatsd [{host:port} [{samplerate}]]
if c.NextArg() {
var args []string
args = c.RemainingArgs()
if len(args) > 0 {
host = args[0]
}
if len(args) > 1 {
var err error
sampleRate, err = strconv.ParseFloat(args[1], 64)
if err != nil {
return c.SyntaxErr(fmt.Sprintf("expected float for \"samplerate\", instead found \"%s\"", args[1]))
}
}
}
// add our middleware
var cfg *httpserver.SiteConfig
cfg = httpserver.GetConfig(c)
cfg.AddMiddleware(func(next httpserver.Handler) httpserver.Handler {
var client *statsd.Client
var err error
client, err = statsd.New(host)
if err == nil {
client.Namespace = namespace
client.Tags = globalTags
}
return dogstatsdHandler{
Client: client,
SampleRate: sampleRate,
Next: next,
}
})
}
return nil
}