194 lines
6.1 KiB
Go
194 lines
6.1 KiB
Go
package jolokia2_proxy_test
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io"
|
|
"net/http"
|
|
"net/http/httptest"
|
|
"testing"
|
|
|
|
"github.com/influxdata/toml"
|
|
"github.com/influxdata/toml/ast"
|
|
"github.com/stretchr/testify/require"
|
|
|
|
"github.com/influxdata/telegraf"
|
|
common "github.com/influxdata/telegraf/plugins/common/jolokia2"
|
|
"github.com/influxdata/telegraf/plugins/inputs/jolokia2_proxy"
|
|
"github.com/influxdata/telegraf/testutil"
|
|
)
|
|
|
|
func TestJolokia2_ProxyTargets(t *testing.T) {
|
|
config := `
|
|
[jolokia2_proxy]
|
|
url = "%s"
|
|
|
|
[[jolokia2_proxy.target]]
|
|
url = "service:jmx:rmi:///jndi/rmi://target1:9010/jmxrmi"
|
|
|
|
[[jolokia2_proxy.target]]
|
|
url = "service:jmx:rmi:///jndi/rmi://target2:9010/jmxrmi"
|
|
|
|
[[jolokia2_proxy.metric]]
|
|
name = "hello"
|
|
mbean = "hello:foo=bar"`
|
|
|
|
response := `[{
|
|
"request": {
|
|
"type": "read",
|
|
"mbean": "hello:foo=bar",
|
|
"target": {
|
|
"url": "service:jmx:rmi:///jndi/rmi://target1:9010/jmxrmi"
|
|
}
|
|
},
|
|
"value": 123,
|
|
"status": 200
|
|
}, {
|
|
"request": {
|
|
"type": "read",
|
|
"mbean": "hello:foo=bar",
|
|
"target": {
|
|
"url": "service:jmx:rmi:///jndi/rmi://target2:9010/jmxrmi"
|
|
}
|
|
},
|
|
"value": 456,
|
|
"status": 200
|
|
}]`
|
|
|
|
server := setupServer(response)
|
|
defer server.Close()
|
|
plugin := setupPlugin(t, fmt.Sprintf(config, server.URL))
|
|
|
|
var acc testutil.Accumulator
|
|
require.NoError(t, plugin.Gather(&acc))
|
|
|
|
acc.AssertContainsTaggedFields(t, "hello", map[string]interface{}{
|
|
"value": 123.0,
|
|
}, map[string]string{
|
|
"jolokia_proxy_url": server.URL,
|
|
"jolokia_agent_url": "service:jmx:rmi:///jndi/rmi://target1:9010/jmxrmi",
|
|
})
|
|
acc.AssertContainsTaggedFields(t, "hello", map[string]interface{}{
|
|
"value": 456.0,
|
|
}, map[string]string{
|
|
"jolokia_proxy_url": server.URL,
|
|
"jolokia_agent_url": "service:jmx:rmi:///jndi/rmi://target2:9010/jmxrmi",
|
|
})
|
|
}
|
|
|
|
func TestJolokia2_ClientProxyAuthRequest(t *testing.T) {
|
|
var requests []map[string]interface{}
|
|
|
|
var username string
|
|
var password string
|
|
server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
|
|
username, password, _ = r.BasicAuth()
|
|
|
|
body, err := io.ReadAll(r.Body)
|
|
if err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
t.Error(err)
|
|
return
|
|
}
|
|
|
|
if err := json.Unmarshal(body, &requests); err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
t.Error(err)
|
|
return
|
|
}
|
|
|
|
w.WriteHeader(http.StatusOK)
|
|
if _, err = fmt.Fprintf(w, "[]"); err != nil {
|
|
w.WriteHeader(http.StatusInternalServerError)
|
|
t.Error(err)
|
|
return
|
|
}
|
|
}))
|
|
defer server.Close()
|
|
|
|
plugin := setupPlugin(t, fmt.Sprintf(`
|
|
[jolokia2_proxy]
|
|
url = "%s/jolokia"
|
|
username = "sally"
|
|
password = "seashore"
|
|
|
|
[[jolokia2_proxy.target]]
|
|
url = "service:jmx:rmi:///jndi/rmi://target:9010/jmxrmi"
|
|
username = "jack"
|
|
password = "benimble"
|
|
|
|
[[jolokia2_proxy.metric]]
|
|
name = "hello"
|
|
mbean = "hello:foo=bar"
|
|
`, server.URL))
|
|
|
|
var acc testutil.Accumulator
|
|
require.NoError(t, plugin.Gather(&acc))
|
|
require.EqualValuesf(t, "sally", username, "Expected to post with username %s, but was %s", "sally", username)
|
|
require.EqualValuesf(t, "seashore", password, "Expected to post with password %s, but was %s", "seashore", password)
|
|
require.NotEmpty(t, requests, "Expected to post a request body, but was empty.")
|
|
|
|
request := requests[0]
|
|
expected := "hello:foo=bar"
|
|
require.EqualValuesf(t, expected, request["mbean"], "Expected to query mbean %s, but was %s", expected, request["mbean"])
|
|
|
|
target, ok := request["target"].(map[string]interface{})
|
|
require.True(t, ok, "Expected a proxy target, but was empty.")
|
|
|
|
expected = "service:jmx:rmi:///jndi/rmi://target:9010/jmxrmi"
|
|
require.Equalf(t, expected, target["url"], "Expected proxy target url %s, but was %s", expected, target["url"])
|
|
expected = "jack"
|
|
require.Equalf(t, expected, target["user"], "Expected proxy target username %s, but was %s", expected, target["user"])
|
|
expected = "benimble"
|
|
require.Equalf(t, expected, target["password"], "Expected proxy target username %s, but was %s", expected, target["password"])
|
|
}
|
|
|
|
func TestFillFields(t *testing.T) {
|
|
complexPoint := map[string]interface{}{"Value": []interface{}{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}}
|
|
scalarPoint := []interface{}{0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
|
|
|
|
results := map[string]interface{}{}
|
|
common.NewPointBuilder(common.Metric{Name: "test", Mbean: "complex"}, []string{"this", "that"}, "/").FillFields("", complexPoint, results)
|
|
require.Equal(t, map[string]interface{}{}, results)
|
|
|
|
results = map[string]interface{}{}
|
|
common.NewPointBuilder(common.Metric{Name: "test", Mbean: "scalar"}, []string{"this", "that"}, "/").FillFields("", scalarPoint, results)
|
|
require.Equal(t, map[string]interface{}{}, results)
|
|
}
|
|
|
|
func setupServer(resp string) *httptest.Server {
|
|
return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, _ *http.Request) {
|
|
w.WriteHeader(http.StatusOK)
|
|
fmt.Fprintln(w, resp)
|
|
}))
|
|
}
|
|
|
|
func setupPlugin(t *testing.T, conf string) telegraf.Input {
|
|
table, err := toml.Parse([]byte(conf))
|
|
if err != nil {
|
|
t.Fatalf("Unable to parse config! %v", err)
|
|
}
|
|
|
|
for name := range table.Fields {
|
|
object := table.Fields[name]
|
|
if name == "jolokia2_proxy" {
|
|
plugin := jolokia2_proxy.JolokiaProxy{
|
|
DefaultFieldSeparator: ".",
|
|
}
|
|
|
|
if err := toml.UnmarshalTable(object.(*ast.Table), &plugin); err != nil {
|
|
t.Fatalf("Unable to parse jolokia_proxy plugin config! %v", err)
|
|
}
|
|
|
|
return &plugin
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|