159 lines
5.6 KiB
Go
159 lines
5.6 KiB
Go
package mesos
|
|
|
|
import (
|
|
"encoding/json"
|
|
"math/rand"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"os"
|
|
"reflect"
|
|
"testing"
|
|
|
|
"github.com/influxdata/telegraf/testutil"
|
|
)
|
|
|
|
var mesosMetrics map[string]interface{}
|
|
var ts *httptest.Server
|
|
|
|
func generateMetrics() {
|
|
mesosMetrics = make(map[string]interface{})
|
|
|
|
metricNames := []string{"master/cpus_percent", "master/cpus_used", "master/cpus_total",
|
|
"master/cpus_revocable_percent", "master/cpus_revocable_total", "master/cpus_revocable_used",
|
|
"master/disk_percent", "master/disk_used", "master/disk_total", "master/disk_revocable_percent",
|
|
"master/disk_revocable_total", "master/disk_revocable_used", "master/mem_percent",
|
|
"master/mem_used", "master/mem_total", "master/mem_revocable_percent", "master/mem_revocable_total",
|
|
"master/mem_revocable_used", "master/elected", "master/uptime_secs", "system/cpus_total",
|
|
"system/load_15min", "system/load_5min", "system/load_1min", "system/mem_free_bytes",
|
|
"system/mem_total_bytes", "master/slave_registrations", "master/slave_removals",
|
|
"master/slave_reregistrations", "master/slave_shutdowns_scheduled", "master/slave_shutdowns_canceled",
|
|
"master/slave_shutdowns_completed", "master/slaves_active", "master/slaves_connected",
|
|
"master/slaves_disconnected", "master/slaves_inactive", "master/frameworks_active",
|
|
"master/frameworks_connected", "master/frameworks_disconnected", "master/frameworks_inactive",
|
|
"master/outstanding_offers", "master/tasks_error", "master/tasks_failed", "master/tasks_finished",
|
|
"master/tasks_killed", "master/tasks_lost", "master/tasks_running", "master/tasks_staging",
|
|
"master/tasks_starting", "master/invalid_executor_to_framework_messages", "master/invalid_framework_to_executor_messages",
|
|
"master/invalid_status_update_acknowledgements", "master/invalid_status_updates",
|
|
"master/dropped_messages", "master/messages_authenticate", "master/messages_deactivate_framework",
|
|
"master/messages_decline_offers", "master/messages_executor_to_framework", "master/messages_exited_executor",
|
|
"master/messages_framework_to_executor", "master/messages_kill_task", "master/messages_launch_tasks",
|
|
"master/messages_reconcile_tasks", "master/messages_register_framework", "master/messages_register_slave",
|
|
"master/messages_reregister_framework", "master/messages_reregister_slave", "master/messages_resource_request",
|
|
"master/messages_revive_offers", "master/messages_status_update", "master/messages_status_update_acknowledgement",
|
|
"master/messages_unregister_framework", "master/messages_unregister_slave", "master/messages_update_slave",
|
|
"master/recovery_slave_removals", "master/slave_removals/reason_registered", "master/slave_removals/reason_unhealthy",
|
|
"master/slave_removals/reason_unregistered", "master/valid_framework_to_executor_messages", "master/valid_status_update_acknowledgements",
|
|
"master/valid_status_updates", "master/task_lost/source_master/reason_invalid_offers",
|
|
"master/task_lost/source_master/reason_slave_removed", "master/task_lost/source_slave/reason_executor_terminated",
|
|
"master/valid_executor_to_framework_messages", "master/event_queue_dispatches",
|
|
"master/event_queue_http_requests", "master/event_queue_messages", "registrar/state_fetch_ms",
|
|
"registrar/state_store_ms", "registrar/state_store_ms/max", "registrar/state_store_ms/min",
|
|
"registrar/state_store_ms/p50", "registrar/state_store_ms/p90", "registrar/state_store_ms/p95",
|
|
"registrar/state_store_ms/p99", "registrar/state_store_ms/p999", "registrar/state_store_ms/p9999"}
|
|
|
|
for _, k := range metricNames {
|
|
mesosMetrics[k] = rand.Float64()
|
|
}
|
|
}
|
|
|
|
func TestMain(m *testing.M) {
|
|
generateMetrics()
|
|
r := http.NewServeMux()
|
|
r.HandleFunc("/metrics/snapshot", func(w http.ResponseWriter, r *http.Request) {
|
|
w.WriteHeader(http.StatusOK)
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(mesosMetrics)
|
|
})
|
|
ts = httptest.NewServer(r)
|
|
rc := m.Run()
|
|
ts.Close()
|
|
os.Exit(rc)
|
|
}
|
|
|
|
func TestMesosMaster(t *testing.T) {
|
|
var acc testutil.Accumulator
|
|
|
|
m := Mesos{
|
|
Masters: []string{ts.Listener.Addr().String()},
|
|
Timeout: 10,
|
|
}
|
|
|
|
err := m.Gather(&acc)
|
|
|
|
if err != nil {
|
|
t.Errorf(err.Error())
|
|
}
|
|
|
|
acc.AssertContainsFields(t, "mesos", mesosMetrics)
|
|
}
|
|
|
|
func TestRemoveGroup(t *testing.T) {
|
|
generateMetrics()
|
|
|
|
m := Mesos{
|
|
MasterCols: []string{
|
|
"resources", "master", "registrar",
|
|
},
|
|
}
|
|
b := []string{
|
|
"system", "slaves", "frameworks",
|
|
"messages", "evqueue",
|
|
}
|
|
|
|
m.removeGroup(&mesosMetrics)
|
|
|
|
for _, v := range b {
|
|
for _, x := range masterBlocks(v) {
|
|
if _, ok := mesosMetrics[x]; ok {
|
|
t.Errorf("Found key %s, it should be gone.", x)
|
|
}
|
|
}
|
|
}
|
|
for _, v := range m.MasterCols {
|
|
for _, x := range masterBlocks(v) {
|
|
if _, ok := mesosMetrics[x]; !ok {
|
|
t.Errorf("Didn't find key %s, it should present.", x)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
func TestMasterBlocks(t *testing.T) {
|
|
a := "wrong_key"
|
|
expect := []string{}
|
|
got := masterBlocks(a)
|
|
|
|
if !reflect.DeepEqual(got, expect) {
|
|
t.Errorf("Expected empty string slice, got: %v", got)
|
|
}
|
|
}
|
|
|
|
func TestSampleConfig(t *testing.T) {
|
|
expect := `
|
|
# Timeout, in ms.
|
|
timeout = 100
|
|
# A list of Mesos masters. e.g. master1:5050, master2:5080, etc.
|
|
# The port can be skipped if using the default (5050)
|
|
# Default value is localhost:5050.
|
|
masters = ["localhost:5050"]
|
|
# Metrics groups to be collected.
|
|
# Default, all enabled.
|
|
master_collections = ["resources","master","system","slaves","frameworks","messages","evqueue","registrar"]
|
|
`
|
|
|
|
got := new(Mesos).SampleConfig()
|
|
|
|
if expect != got {
|
|
t.Errorf("Got %s", got)
|
|
}
|
|
}
|
|
|
|
func TestDescription(t *testing.T) {
|
|
expect := "Telegraf plugin for gathering metrics from N Mesos masters"
|
|
got := new(Mesos).Description()
|
|
|
|
if expect != got {
|
|
t.Errorf("Got %s", got)
|
|
}
|
|
}
|