101 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Go
		
	
	
	
| package teamspeak
 | |
| 
 | |
| import (
 | |
| 	"github.com/multiplay/go-ts3"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf"
 | |
| 	"github.com/influxdata/telegraf/plugins/inputs"
 | |
| 	"strconv"
 | |
| )
 | |
| 
 | |
| type Teamspeak struct {
 | |
| 	Server         string
 | |
| 	Username       string
 | |
| 	Password       string
 | |
| 	VirtualServers []int `toml:"virtual_servers"`
 | |
| 
 | |
| 	client    *ts3.Client
 | |
| 	connected bool
 | |
| }
 | |
| 
 | |
| func (ts *Teamspeak) Description() string {
 | |
| 	return "Reads metrics from a Teamspeak 3 Server via ServerQuery"
 | |
| }
 | |
| 
 | |
| const sampleConfig = `
 | |
|   ## Server address for Teamspeak 3 ServerQuery
 | |
|   # server = "127.0.0.1:10011"
 | |
|   ## Username for ServerQuery
 | |
|   username = "serverqueryuser"
 | |
|   ## Password for ServerQuery
 | |
|   password = "secret"
 | |
|   ## Array of virtual servers
 | |
|   # virtual_servers = [1]
 | |
| `
 | |
| 
 | |
| func (ts *Teamspeak) SampleConfig() string {
 | |
| 	return sampleConfig
 | |
| }
 | |
| 
 | |
| func (ts *Teamspeak) Gather(acc telegraf.Accumulator) error {
 | |
| 	var err error
 | |
| 
 | |
| 	if !ts.connected {
 | |
| 		ts.client, err = ts3.NewClient(ts.Server)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		err = ts.client.Login(ts.Username, ts.Password)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		ts.connected = true
 | |
| 	}
 | |
| 
 | |
| 	for _, vserver := range ts.VirtualServers {
 | |
| 		ts.client.Use(vserver)
 | |
| 
 | |
| 		sm, err := ts.client.Server.Info()
 | |
| 		if err != nil {
 | |
| 			ts.connected = false
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		sc, err := ts.client.Server.ServerConnectionInfo()
 | |
| 		if err != nil {
 | |
| 			ts.connected = false
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		tags := map[string]string{
 | |
| 			"virtual_server": strconv.Itoa(sm.ID),
 | |
| 			"name":           sm.Name,
 | |
| 		}
 | |
| 
 | |
| 		fields := map[string]interface{}{
 | |
| 			"uptime":                 sm.Uptime,
 | |
| 			"clients_online":         sm.ClientsOnline,
 | |
| 			"total_ping":             sm.TotalPing,
 | |
| 			"total_packet_loss":      sm.TotalPacketLossTotal,
 | |
| 			"packets_sent_total":     sc.PacketsSentTotal,
 | |
| 			"packets_received_total": sc.PacketsReceivedTotal,
 | |
| 			"bytes_sent_total":       sc.BytesSentTotal,
 | |
| 			"bytes_received_total":   sc.BytesReceivedTotal,
 | |
| 		}
 | |
| 
 | |
| 		acc.AddFields("teamspeak", fields, tags)
 | |
| 	}
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func init() {
 | |
| 	inputs.Add("teamspeak", func() telegraf.Input {
 | |
| 		return &Teamspeak{
 | |
| 			Server:         "127.0.0.1:10011",
 | |
| 			VirtualServers: []int{1},
 | |
| 		}
 | |
| 	})
 | |
| }
 |