305 lines
7.4 KiB
Go
305 lines
7.4 KiB
Go
|
package icinga2
|
||
|
|
||
|
import (
|
||
|
"net/http"
|
||
|
"net/http/httptest"
|
||
|
"net/url"
|
||
|
"testing"
|
||
|
"time"
|
||
|
|
||
|
"github.com/stretchr/testify/require"
|
||
|
|
||
|
"github.com/influxdata/telegraf/config"
|
||
|
"github.com/influxdata/telegraf/testutil"
|
||
|
)
|
||
|
|
||
|
func TestIcinga2Default(t *testing.T) {
|
||
|
// This test should succeed with the default initialization.
|
||
|
icinga2 := &Icinga2{
|
||
|
Server: "https://localhost:5665",
|
||
|
Objects: []string{"services"},
|
||
|
ResponseTimeout: config.Duration(time.Second * 5),
|
||
|
}
|
||
|
require.NoError(t, icinga2.Init())
|
||
|
|
||
|
require.Equal(t, config.Duration(5*time.Second), icinga2.ResponseTimeout)
|
||
|
require.Equal(t, "https://localhost:5665", icinga2.Server)
|
||
|
require.Equal(t, []string{"services"}, icinga2.Objects)
|
||
|
}
|
||
|
|
||
|
func TestIcinga2DeprecatedHostConfig(t *testing.T) {
|
||
|
icinga2 := &Icinga2{
|
||
|
ObjectType: "hosts", // deprecated
|
||
|
}
|
||
|
require.NoError(t, icinga2.Init())
|
||
|
|
||
|
require.Equal(t, []string{"hosts"}, icinga2.Objects)
|
||
|
}
|
||
|
|
||
|
func TestIcinga2DeprecatedServicesConfig(t *testing.T) {
|
||
|
icinga2 := &Icinga2{
|
||
|
ObjectType: "services", // deprecated
|
||
|
}
|
||
|
require.NoError(t, icinga2.Init())
|
||
|
|
||
|
require.Equal(t, []string{"services"}, icinga2.Objects)
|
||
|
}
|
||
|
|
||
|
const icinga2ServiceResponse = `{
|
||
|
"results": [
|
||
|
{
|
||
|
"attrs": {
|
||
|
"check_command": "check-bgp-juniper-netconf",
|
||
|
"display_name": "eq-par.dc2.fr",
|
||
|
"host_name": "someserverfqdn.net",
|
||
|
"name": "ef017af8-c684-4f3f-bb20-0dfe9fcd3dbe",
|
||
|
"state": 0
|
||
|
},
|
||
|
"joins": {},
|
||
|
"meta": {},
|
||
|
"name": "eq-par.dc2.fr!ef017af8-c684-4f3f-bb20-0dfe9fcd3dbe",
|
||
|
"type": "Service"
|
||
|
}
|
||
|
]
|
||
|
}`
|
||
|
|
||
|
func TestGatherServicesStatus(t *testing.T) {
|
||
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
if r.URL.Path == "/v1/objects/services" {
|
||
|
w.WriteHeader(http.StatusOK)
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
if _, err := w.Write([]byte(icinga2ServiceResponse)); err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
t.Error(err)
|
||
|
return
|
||
|
}
|
||
|
} else {
|
||
|
w.WriteHeader(http.StatusNotFound)
|
||
|
t.Logf("Req: %s %s\n", r.Host, r.URL.Path)
|
||
|
}
|
||
|
}))
|
||
|
defer ts.Close()
|
||
|
|
||
|
var icinga2 = &Icinga2{
|
||
|
Server: ts.URL,
|
||
|
Objects: []string{"services"},
|
||
|
}
|
||
|
require.NoError(t, icinga2.Init())
|
||
|
var acc testutil.Accumulator
|
||
|
err := icinga2.Gather(&acc)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
requestURL, err := url.Parse(ts.URL)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
expectedFields := map[string]interface{}{
|
||
|
"name": "ef017af8-c684-4f3f-bb20-0dfe9fcd3dbe",
|
||
|
"state_code": int64(0),
|
||
|
}
|
||
|
|
||
|
expectedTags := map[string]string{
|
||
|
"display_name": "eq-par.dc2.fr",
|
||
|
"check_command": "check-bgp-juniper-netconf",
|
||
|
"state": "ok",
|
||
|
"source": "someserverfqdn.net",
|
||
|
"server": requestURL.Hostname(),
|
||
|
"port": requestURL.Port(),
|
||
|
"scheme": "http",
|
||
|
}
|
||
|
|
||
|
acc.AssertContainsTaggedFields(t, "icinga2_services", expectedFields, expectedTags)
|
||
|
}
|
||
|
|
||
|
const icinga2HostResponse = `{
|
||
|
"results": [
|
||
|
{
|
||
|
"attrs": {
|
||
|
"address": "192.168.1.1",
|
||
|
"check_command": "ping",
|
||
|
"display_name": "apache",
|
||
|
"name": "webserver",
|
||
|
"state": 2.0
|
||
|
},
|
||
|
"joins": {},
|
||
|
"meta": {},
|
||
|
"name": "webserver",
|
||
|
"type": "Host"
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
`
|
||
|
|
||
|
func TestGatherHostsStatus(t *testing.T) {
|
||
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
if r.URL.Path == "/v1/objects/hosts" {
|
||
|
w.WriteHeader(http.StatusOK)
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
if _, err := w.Write([]byte(icinga2HostResponse)); err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
t.Error(err)
|
||
|
return
|
||
|
}
|
||
|
} else {
|
||
|
w.WriteHeader(http.StatusNotFound)
|
||
|
t.Logf("Req: %s %s\n", r.Host, r.URL.Path)
|
||
|
}
|
||
|
}))
|
||
|
defer ts.Close()
|
||
|
|
||
|
var icinga2 = &Icinga2{
|
||
|
Server: ts.URL,
|
||
|
Objects: []string{"hosts"},
|
||
|
}
|
||
|
require.NoError(t, icinga2.Init())
|
||
|
|
||
|
requestURL, err := url.Parse(ts.URL)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
var acc testutil.Accumulator
|
||
|
err = icinga2.Gather(&acc)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
expectedFields := map[string]interface{}{
|
||
|
"name": "webserver",
|
||
|
"state_code": int64(2),
|
||
|
}
|
||
|
|
||
|
expectedTags := map[string]string{
|
||
|
"display_name": "apache",
|
||
|
"check_command": "ping",
|
||
|
"state": "critical",
|
||
|
"source": "webserver",
|
||
|
"server": requestURL.Hostname(),
|
||
|
"port": requestURL.Port(),
|
||
|
"scheme": "http",
|
||
|
}
|
||
|
|
||
|
acc.AssertContainsTaggedFields(t, "icinga2_hosts", expectedFields, expectedTags)
|
||
|
}
|
||
|
|
||
|
const icinga2StatusCIB = `{
|
||
|
"results": [
|
||
|
{
|
||
|
"name": "CIB",
|
||
|
"perfdata": [],
|
||
|
"status": {
|
||
|
"active_host_checks": 3.6,
|
||
|
"avg_latency": 2.187678621145969e-06,
|
||
|
"max_latency": 0.001603841781616211
|
||
|
}
|
||
|
}
|
||
|
]
|
||
|
}`
|
||
|
|
||
|
func TestGatherStatusCIB(t *testing.T) {
|
||
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
if r.URL.Path == "/v1/status/CIB" {
|
||
|
w.WriteHeader(http.StatusOK)
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
if _, err := w.Write([]byte(icinga2StatusCIB)); err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
t.Error(err)
|
||
|
return
|
||
|
}
|
||
|
} else {
|
||
|
w.WriteHeader(http.StatusNotFound)
|
||
|
t.Logf("Req: %s %s\n", r.Host, r.URL.Path)
|
||
|
}
|
||
|
}))
|
||
|
defer ts.Close()
|
||
|
|
||
|
var icinga2 = &Icinga2{
|
||
|
Server: ts.URL,
|
||
|
Status: []string{"CIB"},
|
||
|
}
|
||
|
require.NoError(t, icinga2.Init())
|
||
|
|
||
|
var acc testutil.Accumulator
|
||
|
err := icinga2.Gather(&acc)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
expectedFields := map[string]interface{}{
|
||
|
"active_host_checks": float64(3.6),
|
||
|
"avg_latency": float64(2.187678621145969e-06),
|
||
|
"max_latency": float64(0.001603841781616211),
|
||
|
}
|
||
|
|
||
|
expectedTags := map[string]string{
|
||
|
"component": "CIB",
|
||
|
}
|
||
|
|
||
|
acc.AssertContainsTaggedFields(t, "icinga2_status", expectedFields, expectedTags)
|
||
|
}
|
||
|
|
||
|
const icinga2StatusPgsql = `{
|
||
|
"results": [
|
||
|
{
|
||
|
"name": "IdoPgsqlConnection",
|
||
|
"perfdata": [
|
||
|
{
|
||
|
"counter": false,
|
||
|
"crit": null,
|
||
|
"label": "idopgsqlconnection_ido-pgsql_queries_rate",
|
||
|
"max": null,
|
||
|
"min": null,
|
||
|
"type": "PerfdataValue",
|
||
|
"unit": "",
|
||
|
"value": 649.8666666666667,
|
||
|
"warn": null
|
||
|
},
|
||
|
{
|
||
|
"counter": false,
|
||
|
"crit": null,
|
||
|
"label": "idopgsqlconnection_ido-pgsql_query_queue_item_rate",
|
||
|
"max": null,
|
||
|
"min": null,
|
||
|
"type": "PerfdataValue",
|
||
|
"unit": "",
|
||
|
"value": 1295.1166666666666,
|
||
|
"warn": null
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
]
|
||
|
}
|
||
|
`
|
||
|
|
||
|
func TestGatherStatusPgsql(t *testing.T) {
|
||
|
ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
||
|
if r.URL.Path == "/v1/status/IdoPgsqlConnection" {
|
||
|
w.WriteHeader(http.StatusOK)
|
||
|
w.Header().Set("Content-Type", "application/json")
|
||
|
if _, err := w.Write([]byte(icinga2StatusPgsql)); err != nil {
|
||
|
w.WriteHeader(http.StatusInternalServerError)
|
||
|
t.Error(err)
|
||
|
return
|
||
|
}
|
||
|
} else {
|
||
|
w.WriteHeader(http.StatusNotFound)
|
||
|
t.Logf("Req: %s %s\n", r.Host, r.URL.Path)
|
||
|
}
|
||
|
}))
|
||
|
defer ts.Close()
|
||
|
|
||
|
var icinga2 = &Icinga2{
|
||
|
Server: ts.URL,
|
||
|
Status: []string{"IdoPgsqlConnection"},
|
||
|
}
|
||
|
require.NoError(t, icinga2.Init())
|
||
|
|
||
|
var acc testutil.Accumulator
|
||
|
err := icinga2.Gather(&acc)
|
||
|
require.NoError(t, err)
|
||
|
|
||
|
expectedFields := map[string]interface{}{
|
||
|
"pgsql_queries_rate": float64(649.8666666666667),
|
||
|
"pgsql_query_queue_item_rate": float64(1295.1166666666666),
|
||
|
}
|
||
|
|
||
|
expectedTags := map[string]string{
|
||
|
"component": "IdoPgsqlConnection",
|
||
|
}
|
||
|
|
||
|
acc.AssertContainsTaggedFields(t, "icinga2_status", expectedFields, expectedTags)
|
||
|
}
|