103 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			103 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Go
		
	
	
	
| package minecraft
 | |
| 
 | |
| import (
 | |
| 	"github.com/influxdata/telegraf"
 | |
| 	"github.com/influxdata/telegraf/plugins/inputs"
 | |
| )
 | |
| 
 | |
| const sampleConfig = `
 | |
|   ## Address of the Minecraft server.
 | |
|   # server = "localhost"
 | |
| 
 | |
|   ## Server RCON Port.
 | |
|   # port = "25575"
 | |
| 
 | |
|   ## Server RCON Password.
 | |
|   password = ""
 | |
| 
 | |
|   ## Uncomment to remove deprecated metric components.
 | |
|   # tagdrop = ["server"]
 | |
| `
 | |
| 
 | |
| // Client is a client for the Minecraft server.
 | |
| type Client interface {
 | |
| 	// Connect establishes a connection to the server.
 | |
| 	Connect() error
 | |
| 
 | |
| 	// Players returns the players on the scoreboard.
 | |
| 	Players() ([]string, error)
 | |
| 
 | |
| 	// Scores return the objective scores for a player.
 | |
| 	Scores(player string) ([]Score, error)
 | |
| }
 | |
| 
 | |
| // Minecraft is the plugin type.
 | |
| type Minecraft struct {
 | |
| 	Server   string `toml:"server"`
 | |
| 	Port     string `toml:"port"`
 | |
| 	Password string `toml:"password"`
 | |
| 
 | |
| 	client Client
 | |
| }
 | |
| 
 | |
| func (s *Minecraft) Description() string {
 | |
| 	return "Collects scores from a Minecraft server's scoreboard using the RCON protocol"
 | |
| }
 | |
| 
 | |
| func (s *Minecraft) SampleConfig() string {
 | |
| 	return sampleConfig
 | |
| }
 | |
| 
 | |
| func (s *Minecraft) Gather(acc telegraf.Accumulator) error {
 | |
| 	if s.client == nil {
 | |
| 		connector, err := NewConnector(s.Server, s.Port, s.Password)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		client, err := NewClient(connector)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		s.client = client
 | |
| 	}
 | |
| 
 | |
| 	players, err := s.client.Players()
 | |
| 	if err != nil {
 | |
| 		return err
 | |
| 	}
 | |
| 
 | |
| 	for _, player := range players {
 | |
| 		scores, err := s.client.Scores(player)
 | |
| 		if err != nil {
 | |
| 			return err
 | |
| 		}
 | |
| 
 | |
| 		tags := map[string]string{
 | |
| 			"player": player,
 | |
| 			"server": s.Server + ":" + s.Port,
 | |
| 			"source": s.Server,
 | |
| 			"port":   s.Port,
 | |
| 		}
 | |
| 
 | |
| 		var fields = make(map[string]interface{}, len(scores))
 | |
| 		for _, score := range scores {
 | |
| 			fields[score.Name] = score.Value
 | |
| 		}
 | |
| 
 | |
| 		acc.AddFields("minecraft", fields, tags)
 | |
| 	}
 | |
| 
 | |
| 	return nil
 | |
| }
 | |
| 
 | |
| func init() {
 | |
| 	inputs.Add("minecraft", func() telegraf.Input {
 | |
| 		return &Minecraft{
 | |
| 			Server: "localhost",
 | |
| 			Port:   "25575",
 | |
| 		}
 | |
| 	})
 | |
| }
 |