333 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			333 lines
		
	
	
		
			7.5 KiB
		
	
	
	
		
			Go
		
	
	
	
| package beanstalkd_test
 | |
| 
 | |
| import (
 | |
| 	"io"
 | |
| 	"net"
 | |
| 	"net/textproto"
 | |
| 	"testing"
 | |
| 
 | |
| 	"github.com/influxdata/telegraf/plugins/inputs/beanstalkd"
 | |
| 	"github.com/influxdata/telegraf/testutil"
 | |
| 	"github.com/stretchr/testify/require"
 | |
| )
 | |
| 
 | |
| func TestBeanstalkd(t *testing.T) {
 | |
| 	type tubeStats struct {
 | |
| 		name   string
 | |
| 		fields map[string]interface{}
 | |
| 	}
 | |
| 
 | |
| 	tests := []struct {
 | |
| 		name             string
 | |
| 		tubesConfig      []string
 | |
| 		expectedTubes    []tubeStats
 | |
| 		notExpectedTubes []tubeStats
 | |
| 	}{
 | |
| 		{
 | |
| 			name:        "All tubes stats",
 | |
| 			tubesConfig: []string{},
 | |
| 			expectedTubes: []tubeStats{
 | |
| 				{name: "default", fields: defaultTubeFields},
 | |
| 				{name: "test", fields: testTubeFields},
 | |
| 			},
 | |
| 			notExpectedTubes: []tubeStats{},
 | |
| 		},
 | |
| 		{
 | |
| 			name:        "Specified tubes stats",
 | |
| 			tubesConfig: []string{"test"},
 | |
| 			expectedTubes: []tubeStats{
 | |
| 				{name: "test", fields: testTubeFields},
 | |
| 			},
 | |
| 			notExpectedTubes: []tubeStats{
 | |
| 				{name: "default", fields: defaultTubeFields},
 | |
| 			},
 | |
| 		},
 | |
| 		{
 | |
| 			name:          "Unknown tube stats",
 | |
| 			tubesConfig:   []string{"unknown"},
 | |
| 			expectedTubes: []tubeStats{},
 | |
| 			notExpectedTubes: []tubeStats{
 | |
| 				{name: "default", fields: defaultTubeFields},
 | |
| 				{name: "test", fields: testTubeFields},
 | |
| 			},
 | |
| 		},
 | |
| 	}
 | |
| 
 | |
| 	for _, test := range tests {
 | |
| 		t.Run(test.name, func(t *testing.T) {
 | |
| 			server, err := startTestServer(t)
 | |
| 			if err != nil {
 | |
| 				t.Fatalf("Unable to create test server")
 | |
| 			}
 | |
| 			defer server.Close()
 | |
| 
 | |
| 			serverAddress := server.Addr().String()
 | |
| 			plugin := beanstalkd.Beanstalkd{
 | |
| 				Server: serverAddress,
 | |
| 				Tubes:  test.tubesConfig,
 | |
| 			}
 | |
| 
 | |
| 			var acc testutil.Accumulator
 | |
| 			require.NoError(t, acc.GatherError(plugin.Gather))
 | |
| 
 | |
| 			acc.AssertContainsTaggedFields(t, "beanstalkd_overview",
 | |
| 				overviewFields,
 | |
| 				getOverviewTags(serverAddress),
 | |
| 			)
 | |
| 
 | |
| 			for _, expectedTube := range test.expectedTubes {
 | |
| 				acc.AssertContainsTaggedFields(t, "beanstalkd_tube",
 | |
| 					expectedTube.fields,
 | |
| 					getTubeTags(serverAddress, expectedTube.name),
 | |
| 				)
 | |
| 			}
 | |
| 
 | |
| 			for _, notExpectedTube := range test.notExpectedTubes {
 | |
| 				acc.AssertDoesNotContainsTaggedFields(t, "beanstalkd_tube",
 | |
| 					notExpectedTube.fields,
 | |
| 					getTubeTags(serverAddress, notExpectedTube.name),
 | |
| 				)
 | |
| 			}
 | |
| 		})
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func startTestServer(t *testing.T) (net.Listener, error) {
 | |
| 	server, err := net.Listen("tcp", "localhost:0")
 | |
| 	if err != nil {
 | |
| 		return nil, err
 | |
| 	}
 | |
| 
 | |
| 	go func() {
 | |
| 		defer server.Close()
 | |
| 
 | |
| 		connection, err := server.Accept()
 | |
| 		if err != nil {
 | |
| 			t.Log("Test server: failed to accept connection. Error: ", err)
 | |
| 			return
 | |
| 		}
 | |
| 
 | |
| 		tp := textproto.NewConn(connection)
 | |
| 		defer tp.Close()
 | |
| 
 | |
| 		sendSuccessResponse := func(body string) {
 | |
| 			tp.PrintfLine("OK %d\r\n%s", len(body), body)
 | |
| 		}
 | |
| 
 | |
| 		for {
 | |
| 			cmd, err := tp.ReadLine()
 | |
| 			if err == io.EOF {
 | |
| 				return
 | |
| 			} else if err != nil {
 | |
| 				t.Log("Test server: failed read command. Error: ", err)
 | |
| 				return
 | |
| 			}
 | |
| 
 | |
| 			switch cmd {
 | |
| 			case "list-tubes":
 | |
| 				sendSuccessResponse(listTubesResponse)
 | |
| 			case "stats":
 | |
| 				sendSuccessResponse(statsResponse)
 | |
| 			case "stats-tube default":
 | |
| 				sendSuccessResponse(statsTubeDefaultResponse)
 | |
| 			case "stats-tube test":
 | |
| 				sendSuccessResponse(statsTubeTestResponse)
 | |
| 			case "stats-tube unknown":
 | |
| 				tp.PrintfLine("NOT_FOUND")
 | |
| 			default:
 | |
| 				t.Log("Test server: unknown command")
 | |
| 			}
 | |
| 		}
 | |
| 	}()
 | |
| 
 | |
| 	return server, nil
 | |
| }
 | |
| 
 | |
| const (
 | |
| 	listTubesResponse = `---
 | |
| - default
 | |
| - test
 | |
| `
 | |
| 	statsResponse = `---
 | |
| current-jobs-urgent: 5
 | |
| current-jobs-ready: 5
 | |
| current-jobs-reserved: 0
 | |
| current-jobs-delayed: 1
 | |
| current-jobs-buried: 0
 | |
| cmd-put: 6
 | |
| cmd-peek: 0
 | |
| cmd-peek-ready: 1
 | |
| cmd-peek-delayed: 0
 | |
| cmd-peek-buried: 0
 | |
| cmd-reserve: 0
 | |
| cmd-reserve-with-timeout: 1
 | |
| cmd-delete: 1
 | |
| cmd-release: 0
 | |
| cmd-use: 2
 | |
| cmd-watch: 0
 | |
| cmd-ignore: 0
 | |
| cmd-bury: 1
 | |
| cmd-kick: 1
 | |
| cmd-touch: 0
 | |
| cmd-stats: 1
 | |
| cmd-stats-job: 0
 | |
| cmd-stats-tube: 2
 | |
| cmd-list-tubes: 1
 | |
| cmd-list-tube-used: 0
 | |
| cmd-list-tubes-watched: 0
 | |
| cmd-pause-tube: 0
 | |
| job-timeouts: 0
 | |
| total-jobs: 6
 | |
| max-job-size: 65535
 | |
| current-tubes: 2
 | |
| current-connections: 2
 | |
| current-producers: 1
 | |
| current-workers: 1
 | |
| current-waiting: 0
 | |
| total-connections: 2
 | |
| pid: 6
 | |
| version: 1.10
 | |
| rusage-utime: 0.000000
 | |
| rusage-stime: 0.000000
 | |
| uptime: 20
 | |
| binlog-oldest-index: 0
 | |
| binlog-current-index: 0
 | |
| binlog-records-migrated: 0
 | |
| binlog-records-written: 0
 | |
| binlog-max-size: 10485760
 | |
| id: bba7546657efdd4c
 | |
| hostname: 2873efd3e88c
 | |
| `
 | |
| 	statsTubeDefaultResponse = `---
 | |
| name: default
 | |
| current-jobs-urgent: 0
 | |
| current-jobs-ready: 0
 | |
| current-jobs-reserved: 0
 | |
| current-jobs-delayed: 0
 | |
| current-jobs-buried: 0
 | |
| total-jobs: 0
 | |
| current-using: 2
 | |
| current-watching: 2
 | |
| current-waiting: 0
 | |
| cmd-delete: 0
 | |
| cmd-pause-tube: 0
 | |
| pause: 0
 | |
| pause-time-left: 0
 | |
| `
 | |
| 	statsTubeTestResponse = `---
 | |
| name: test
 | |
| current-jobs-urgent: 5
 | |
| current-jobs-ready: 5
 | |
| current-jobs-reserved: 0
 | |
| current-jobs-delayed: 1
 | |
| current-jobs-buried: 0
 | |
| total-jobs: 6
 | |
| current-using: 0
 | |
| current-watching: 0
 | |
| current-waiting: 0
 | |
| cmd-delete: 0
 | |
| cmd-pause-tube: 0
 | |
| pause: 0
 | |
| pause-time-left: 0
 | |
| `
 | |
| )
 | |
| 
 | |
| var (
 | |
| 	// Default tube without stats
 | |
| 	defaultTubeFields = map[string]interface{}{
 | |
| 		"cmd_delete":            0,
 | |
| 		"cmd_pause_tube":        0,
 | |
| 		"current_jobs_buried":   0,
 | |
| 		"current_jobs_delayed":  0,
 | |
| 		"current_jobs_ready":    0,
 | |
| 		"current_jobs_reserved": 0,
 | |
| 		"current_jobs_urgent":   0,
 | |
| 		"current_using":         2,
 | |
| 		"current_waiting":       0,
 | |
| 		"current_watching":      2,
 | |
| 		"pause":                 0,
 | |
| 		"pause_time_left":       0,
 | |
| 		"total_jobs":            0,
 | |
| 	}
 | |
| 	// Test tube with stats
 | |
| 	testTubeFields = map[string]interface{}{
 | |
| 		"cmd_delete":            0,
 | |
| 		"cmd_pause_tube":        0,
 | |
| 		"current_jobs_buried":   0,
 | |
| 		"current_jobs_delayed":  1,
 | |
| 		"current_jobs_ready":    5,
 | |
| 		"current_jobs_reserved": 0,
 | |
| 		"current_jobs_urgent":   5,
 | |
| 		"current_using":         0,
 | |
| 		"current_waiting":       0,
 | |
| 		"current_watching":      0,
 | |
| 		"pause":                 0,
 | |
| 		"pause_time_left":       0,
 | |
| 		"total_jobs":            6,
 | |
| 	}
 | |
| 	// Server stats
 | |
| 	overviewFields = map[string]interface{}{
 | |
| 		"binlog_current_index":     0,
 | |
| 		"binlog_max_size":          10485760,
 | |
| 		"binlog_oldest_index":      0,
 | |
| 		"binlog_records_migrated":  0,
 | |
| 		"binlog_records_written":   0,
 | |
| 		"cmd_bury":                 1,
 | |
| 		"cmd_delete":               1,
 | |
| 		"cmd_ignore":               0,
 | |
| 		"cmd_kick":                 1,
 | |
| 		"cmd_list_tube_used":       0,
 | |
| 		"cmd_list_tubes":           1,
 | |
| 		"cmd_list_tubes_watched":   0,
 | |
| 		"cmd_pause_tube":           0,
 | |
| 		"cmd_peek":                 0,
 | |
| 		"cmd_peek_buried":          0,
 | |
| 		"cmd_peek_delayed":         0,
 | |
| 		"cmd_peek_ready":           1,
 | |
| 		"cmd_put":                  6,
 | |
| 		"cmd_release":              0,
 | |
| 		"cmd_reserve":              0,
 | |
| 		"cmd_reserve_with_timeout": 1,
 | |
| 		"cmd_stats":                1,
 | |
| 		"cmd_stats_job":            0,
 | |
| 		"cmd_stats_tube":           2,
 | |
| 		"cmd_touch":                0,
 | |
| 		"cmd_use":                  2,
 | |
| 		"cmd_watch":                0,
 | |
| 		"current_connections":      2,
 | |
| 		"current_jobs_buried":      0,
 | |
| 		"current_jobs_delayed":     1,
 | |
| 		"current_jobs_ready":       5,
 | |
| 		"current_jobs_reserved":    0,
 | |
| 		"current_jobs_urgent":      5,
 | |
| 		"current_producers":        1,
 | |
| 		"current_tubes":            2,
 | |
| 		"current_waiting":          0,
 | |
| 		"current_workers":          1,
 | |
| 		"job_timeouts":             0,
 | |
| 		"max_job_size":             65535,
 | |
| 		"pid":                      6,
 | |
| 		"rusage_stime":             0.0,
 | |
| 		"rusage_utime":             0.0,
 | |
| 		"total_connections":        2,
 | |
| 		"total_jobs":               6,
 | |
| 		"uptime":                   20,
 | |
| 	}
 | |
| )
 | |
| 
 | |
| func getOverviewTags(server string) map[string]string {
 | |
| 	return map[string]string{
 | |
| 		"hostname": "2873efd3e88c",
 | |
| 		"id":       "bba7546657efdd4c",
 | |
| 		"server":   server,
 | |
| 		"version":  "1.10",
 | |
| 	}
 | |
| }
 | |
| 
 | |
| func getTubeTags(server string, tube string) map[string]string {
 | |
| 	return map[string]string{
 | |
| 		"name":   tube,
 | |
| 		"server": server,
 | |
| 	}
 | |
| }
 |