telegraf/plugins/processors/s2geo/s2geo.go

68 lines
1.3 KiB
Go
Raw Normal View History

//go:generate ../../../tools/readme_config_includer/generator
package s2geo
2020-03-11 06:39:06 +08:00
import (
_ "embed"
2020-03-11 06:39:06 +08:00
"fmt"
2020-03-11 06:39:06 +08:00
"github.com/golang/geo/s2"
2020-03-11 06:39:06 +08:00
"github.com/influxdata/telegraf"
"github.com/influxdata/telegraf/plugins/processors"
)
//go:embed sample.conf
var sampleConfig string
2020-03-11 06:39:06 +08:00
type Geo struct {
LatField string `toml:"lat_field"`
LonField string `toml:"lon_field"`
TagKey string `toml:"tag_key"`
CellLevel int `toml:"cell_level"`
}
func (*Geo) SampleConfig() string {
return sampleConfig
}
2020-03-11 06:39:06 +08:00
func (g *Geo) Init() error {
if g.CellLevel < 0 || g.CellLevel > 30 {
return fmt.Errorf("invalid cell level %d", g.CellLevel)
}
return nil
}
func (g *Geo) Apply(in ...telegraf.Metric) []telegraf.Metric {
for _, point := range in {
var latOk, lonOk bool
var lat, lon float64
for _, field := range point.FieldList() {
switch field.Key {
case g.LatField:
lat, latOk = field.Value.(float64)
case g.LonField:
lon, lonOk = field.Value.(float64)
}
}
if latOk && lonOk {
cellID := s2.CellIDFromLatLng(s2.LatLngFromDegrees(lat, lon))
if cellID.IsValid() {
value := cellID.Parent(g.CellLevel).ToToken()
point.AddTag(g.TagKey, value)
}
}
}
return in
}
func init() {
processors.Add("s2geo", func() telegraf.Processor {
return &Geo{
LatField: "lat",
LonField: "lon",
TagKey: "s2_cell_id",
CellLevel: 9,
}
})
}