Add compatibility for Kibana 6.4 and later (#6923)
This commit is contained in:
parent
fb1b29cc20
commit
bc3429ed48
|
@ -42,6 +42,7 @@ with following rules:
|
||||||
|
|
||||||
- kibana
|
- kibana
|
||||||
- status_code: integer (1, 2, 3, 0)
|
- status_code: integer (1, 2, 3, 0)
|
||||||
|
- heap_total_bytes: integer
|
||||||
- heap_max_bytes: integer
|
- heap_max_bytes: integer
|
||||||
- heap_used_bytes: integer
|
- heap_used_bytes: integer
|
||||||
- uptime_ms: integer
|
- uptime_ms: integer
|
||||||
|
@ -52,12 +53,12 @@ with following rules:
|
||||||
|
|
||||||
### Tags
|
### Tags
|
||||||
|
|
||||||
- status (Kibana health: green, yellow, red)
|
|
||||||
- name (Kibana reported name)
|
- name (Kibana reported name)
|
||||||
- uuid (Kibana reported UUID)
|
|
||||||
- version (Kibana version)
|
|
||||||
- source (Kibana server hostname or IP)
|
- source (Kibana server hostname or IP)
|
||||||
|
- status (Kibana health: green, yellow, red)
|
||||||
|
- version (Kibana version)
|
||||||
|
|
||||||
### Example Output
|
### Example Output
|
||||||
|
```
|
||||||
kibana,host=myhost,name=my-kibana,source=localhost:5601,version=6.3.2 concurrent_connections=0i,heap_max_bytes=136478720i,heap_used_bytes=119231088i,response_time_avg_ms=0i,response_time_max_ms=0i,status="green",status_code=1i,uptime_ms=2187428019i 1534864502000000000
|
kibana,host=myhost,name=my-kibana,source=localhost:5601,status=green,version=6.5.4 concurrent_connections=8i,heap_max_bytes=447778816i,heap_total_bytes=447778816i,heap_used_bytes=380603352i,requests_per_sec=1,response_time_avg_ms=57.6,response_time_max_ms=220i,status_code=1i,uptime_ms=6717489805i 1534864502000000000
|
||||||
|
```
|
||||||
|
|
|
@ -4,6 +4,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
"net/http"
|
"net/http"
|
||||||
|
"strconv"
|
||||||
"strings"
|
"strings"
|
||||||
"sync"
|
"sync"
|
||||||
"time"
|
"time"
|
||||||
|
@ -55,6 +56,8 @@ type responseTimes struct {
|
||||||
|
|
||||||
type process struct {
|
type process struct {
|
||||||
Mem mem `json:"mem"`
|
Mem mem `json:"mem"`
|
||||||
|
Memory memory `json:"memory"`
|
||||||
|
UptimeInMillis int64 `json:"uptime_in_millis"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type requests struct {
|
type requests struct {
|
||||||
|
@ -66,6 +69,15 @@ type mem struct {
|
||||||
HeapUsedInBytes int64 `json:"heap_used_in_bytes"`
|
HeapUsedInBytes int64 `json:"heap_used_in_bytes"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type memory struct {
|
||||||
|
Heap heap `json:"heap"`
|
||||||
|
}
|
||||||
|
|
||||||
|
type heap struct {
|
||||||
|
TotalInBytes int64 `json:"total_in_bytes"`
|
||||||
|
UsedInBytes int64 `json:"used_in_bytes"`
|
||||||
|
}
|
||||||
|
|
||||||
const sampleConfig = `
|
const sampleConfig = `
|
||||||
## specify a list of one or more Kibana servers
|
## specify a list of one or more Kibana servers
|
||||||
servers = ["http://localhost:5601"]
|
servers = ["http://localhost:5601"]
|
||||||
|
@ -187,15 +199,37 @@ func (k *Kibana) gatherKibanaStatus(baseUrl string, acc telegraf.Accumulator) er
|
||||||
tags["status"] = kibanaStatus.Status.Overall.State
|
tags["status"] = kibanaStatus.Status.Overall.State
|
||||||
|
|
||||||
fields["status_code"] = mapHealthStatusToCode(kibanaStatus.Status.Overall.State)
|
fields["status_code"] = mapHealthStatusToCode(kibanaStatus.Status.Overall.State)
|
||||||
|
|
||||||
fields["uptime_ms"] = kibanaStatus.Metrics.UptimeInMillis
|
|
||||||
fields["concurrent_connections"] = kibanaStatus.Metrics.ConcurrentConnections
|
fields["concurrent_connections"] = kibanaStatus.Metrics.ConcurrentConnections
|
||||||
fields["heap_max_bytes"] = kibanaStatus.Metrics.Process.Mem.HeapMaxInBytes
|
|
||||||
fields["heap_used_bytes"] = kibanaStatus.Metrics.Process.Mem.HeapUsedInBytes
|
|
||||||
fields["response_time_avg_ms"] = kibanaStatus.Metrics.ResponseTimes.AvgInMillis
|
fields["response_time_avg_ms"] = kibanaStatus.Metrics.ResponseTimes.AvgInMillis
|
||||||
fields["response_time_max_ms"] = kibanaStatus.Metrics.ResponseTimes.MaxInMillis
|
fields["response_time_max_ms"] = kibanaStatus.Metrics.ResponseTimes.MaxInMillis
|
||||||
fields["requests_per_sec"] = float64(kibanaStatus.Metrics.Requests.Total) / float64(kibanaStatus.Metrics.CollectionIntervalInMilles) * 1000
|
fields["requests_per_sec"] = float64(kibanaStatus.Metrics.Requests.Total) / float64(kibanaStatus.Metrics.CollectionIntervalInMilles) * 1000
|
||||||
|
|
||||||
|
versionArray := strings.Split(kibanaStatus.Version.Number, ".")
|
||||||
|
arrayElement := 1
|
||||||
|
|
||||||
|
if len(versionArray) > 1 {
|
||||||
|
arrayElement = 2
|
||||||
|
}
|
||||||
|
versionNumber, err := strconv.ParseFloat(strings.Join(versionArray[:arrayElement], "."), 64)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
// Same value will be assigned to both the metrics [heap_max_bytes and heap_total_bytes ]
|
||||||
|
// Which keeps the code backward compatible
|
||||||
|
if versionNumber >= 6.4 {
|
||||||
|
fields["uptime_ms"] = kibanaStatus.Metrics.Process.UptimeInMillis
|
||||||
|
fields["heap_max_bytes"] = kibanaStatus.Metrics.Process.Memory.Heap.TotalInBytes
|
||||||
|
fields["heap_total_bytes"] = kibanaStatus.Metrics.Process.Memory.Heap.TotalInBytes
|
||||||
|
fields["heap_used_bytes"] = kibanaStatus.Metrics.Process.Memory.Heap.UsedInBytes
|
||||||
|
} else {
|
||||||
|
fields["uptime_ms"] = kibanaStatus.Metrics.UptimeInMillis
|
||||||
|
fields["heap_max_bytes"] = kibanaStatus.Metrics.Process.Mem.HeapMaxInBytes
|
||||||
|
fields["heap_total_bytes"] = kibanaStatus.Metrics.Process.Mem.HeapMaxInBytes
|
||||||
|
fields["heap_used_bytes"] = kibanaStatus.Metrics.Process.Mem.HeapUsedInBytes
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
acc.AddFields("kibana", fields, tags)
|
acc.AddFields("kibana", fields, tags)
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
|
|
|
@ -9,7 +9,7 @@ import (
|
||||||
"github.com/influxdata/telegraf/testutil"
|
"github.com/influxdata/telegraf/testutil"
|
||||||
)
|
)
|
||||||
|
|
||||||
func defaultTags() map[string]string {
|
func defaultTags6_3() map[string]string {
|
||||||
return map[string]string{
|
return map[string]string{
|
||||||
"name": "my-kibana",
|
"name": "my-kibana",
|
||||||
"source": "example.com:5601",
|
"source": "example.com:5601",
|
||||||
|
@ -18,6 +18,15 @@ func defaultTags() map[string]string {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func defaultTags6_5() map[string]string {
|
||||||
|
return map[string]string{
|
||||||
|
"name": "my-kibana",
|
||||||
|
"source": "example.com:5601",
|
||||||
|
"version": "6.5.4",
|
||||||
|
"status": "green",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
type transportMock struct {
|
type transportMock struct {
|
||||||
statusCode int
|
statusCode int
|
||||||
body string
|
body string
|
||||||
|
@ -41,22 +50,35 @@ func (t *transportMock) RoundTrip(r *http.Request) (*http.Response, error) {
|
||||||
return res, nil
|
return res, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func checkKibanaStatusResult(t *testing.T, acc *testutil.Accumulator) {
|
func checkKibanaStatusResult(version string, t *testing.T, acc *testutil.Accumulator) {
|
||||||
tags := defaultTags()
|
if version == "6.3.2" {
|
||||||
acc.AssertContainsTaggedFields(t, "kibana", kibanaStatusExpected, tags)
|
tags := defaultTags6_3()
|
||||||
|
acc.AssertContainsTaggedFields(t, "kibana", kibanaStatusExpected6_3, tags)
|
||||||
|
} else {
|
||||||
|
tags := defaultTags6_5()
|
||||||
|
acc.AssertContainsTaggedFields(t, "kibana", kibanaStatusExpected6_5, tags)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func TestGather(t *testing.T) {
|
func TestGather(t *testing.T) {
|
||||||
ks := newKibanahWithClient()
|
ks := newKibanahWithClient()
|
||||||
ks.Servers = []string{"http://example.com:5601"}
|
ks.Servers = []string{"http://example.com:5601"}
|
||||||
ks.client.Transport = newTransportMock(http.StatusOK, kibanaStatusResponse)
|
// Unit test for Kibana version < 6.5
|
||||||
|
ks.client.Transport = newTransportMock(http.StatusOK, kibanaStatusResponse6_3)
|
||||||
var acc testutil.Accumulator
|
var acc1 testutil.Accumulator
|
||||||
if err := acc.GatherError(ks.Gather); err != nil {
|
if err := acc1.GatherError(ks.Gather); err != nil {
|
||||||
t.Fatal(err)
|
t.Fatal(err)
|
||||||
}
|
}
|
||||||
|
checkKibanaStatusResult(defaultTags6_3()["version"], t, &acc1)
|
||||||
|
|
||||||
|
//Unit test for Kibana version >= 6.5
|
||||||
|
ks.client.Transport = newTransportMock(http.StatusOK, kibanaStatusResponse6_5)
|
||||||
|
var acc2 testutil.Accumulator
|
||||||
|
if err := acc2.GatherError(ks.Gather); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
checkKibanaStatusResult(defaultTags6_5()["version"], t, &acc2)
|
||||||
|
|
||||||
checkKibanaStatusResult(t, &acc)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func newKibanahWithClient() *Kibana {
|
func newKibanahWithClient() *Kibana {
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package kibana
|
package kibana
|
||||||
|
|
||||||
const kibanaStatusResponse = `
|
const kibanaStatusResponse6_3 = `
|
||||||
{
|
{
|
||||||
"name": "my-kibana",
|
"name": "my-kibana",
|
||||||
"uuid": "00000000-0000-0000-0000-000000000000",
|
"uuid": "00000000-0000-0000-0000-000000000000",
|
||||||
|
@ -187,8 +187,9 @@ const kibanaStatusResponse = `
|
||||||
}
|
}
|
||||||
`
|
`
|
||||||
|
|
||||||
var kibanaStatusExpected = map[string]interface{}{
|
var kibanaStatusExpected6_3 = map[string]interface{}{
|
||||||
"status_code": 1,
|
"status_code": 1,
|
||||||
|
"heap_total_bytes": int64(149954560),
|
||||||
"heap_max_bytes": int64(149954560),
|
"heap_max_bytes": int64(149954560),
|
||||||
"heap_used_bytes": int64(126274392),
|
"heap_used_bytes": int64(126274392),
|
||||||
"uptime_ms": int64(2173595336),
|
"uptime_ms": int64(2173595336),
|
|
@ -0,0 +1,227 @@
|
||||||
|
package kibana
|
||||||
|
|
||||||
|
const kibanaStatusResponse6_5 = `
|
||||||
|
{
|
||||||
|
"name": "my-kibana",
|
||||||
|
"uuid": "00000000-0000-0000-0000-000000000000",
|
||||||
|
"version": {
|
||||||
|
"number": "6.5.4",
|
||||||
|
"build_hash": "53d0c6758ac3fb38a3a1df198c1d4c87765e63f7",
|
||||||
|
"build_number": 17307,
|
||||||
|
"build_snapshot": false
|
||||||
|
},
|
||||||
|
"status": {
|
||||||
|
"overall": {
|
||||||
|
"state": "green",
|
||||||
|
"title": "Green",
|
||||||
|
"nickname": "Looking good",
|
||||||
|
"icon": "success",
|
||||||
|
"since": "2018-07-27T07:37:42.567Z"
|
||||||
|
},
|
||||||
|
"statuses": [{
|
||||||
|
"id": "plugin:kibana@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-27T07:37:42.567Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:elasticsearch@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-28T10:07:04.920Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:xpack_main@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-28T10:07:02.393Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:searchprofiler@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-28T10:07:02.395Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:tilemap@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-28T10:07:02.396Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:watcher@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-28T10:07:02.397Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:license_management@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-27T07:37:42.668Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:index_management@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-28T10:07:02.399Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:timelion@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-27T07:37:42.912Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:logtrail@0.1.29",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-27T07:37:42.919Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:monitoring@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-27T07:37:42.922Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:grokdebugger@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-28T10:07:02.400Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:dashboard_mode@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-27T07:37:42.928Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:logstash@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-28T10:07:02.401Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:apm@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-27T07:37:42.950Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:console@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-27T07:37:42.958Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:console_extensions@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-27T07:37:42.961Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:metrics@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-27T07:37:42.965Z"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"id": "plugin:reporting@6.5.4",
|
||||||
|
"state": "green",
|
||||||
|
"icon": "success",
|
||||||
|
"message": "Ready",
|
||||||
|
"since": "2018-07-28T10:07:02.402Z"
|
||||||
|
}]
|
||||||
|
},
|
||||||
|
"metrics": {
|
||||||
|
"last_updated": "2020-01-15T09:40:17.733Z",
|
||||||
|
"collection_interval_in_millis": 5000,
|
||||||
|
"process": {
|
||||||
|
"memory": {
|
||||||
|
"heap": {
|
||||||
|
"total_in_bytes": 149954560,
|
||||||
|
"used_in_bytes": 126274392,
|
||||||
|
"size_limit": 1501560832
|
||||||
|
},
|
||||||
|
"resident_set_size_in_bytes": 286650368
|
||||||
|
},
|
||||||
|
"event_loop_delay": 0.5314235687255859,
|
||||||
|
"pid": 6,
|
||||||
|
"uptime_in_millis": 2173595336
|
||||||
|
},
|
||||||
|
"os": {
|
||||||
|
"load": {
|
||||||
|
"1m": 2.66015625,
|
||||||
|
"5m": 2.8173828125,
|
||||||
|
"15m": 2.51025390625
|
||||||
|
},
|
||||||
|
"memory": {
|
||||||
|
"total_in_bytes": 404355756032,
|
||||||
|
"free_in_bytes": 294494244864,
|
||||||
|
"used_in_bytes": 109861511168
|
||||||
|
},
|
||||||
|
"uptime_in_millis": 8220745000,
|
||||||
|
"cgroup": {
|
||||||
|
"cpuacct": {
|
||||||
|
"control_group": "/",
|
||||||
|
"usage_nanos": 1086527218898
|
||||||
|
},
|
||||||
|
"cpu": {
|
||||||
|
"control_group": "/",
|
||||||
|
"cfs_period_micros": 100000,
|
||||||
|
"cfs_quota_micros": -1,
|
||||||
|
"stat": {
|
||||||
|
"number_of_elapsed_periods": 0,
|
||||||
|
"number_of_times_throttled": 0,
|
||||||
|
"time_throttled_nanos": 0
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"response_times": {
|
||||||
|
"avg_in_millis": 12.5,
|
||||||
|
"max_in_millis": 123
|
||||||
|
},
|
||||||
|
"requests": {
|
||||||
|
"total": 2,
|
||||||
|
"disconnects": 0,
|
||||||
|
"status_codes": {
|
||||||
|
"200": 1,
|
||||||
|
"304": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"concurrent_connections": 10
|
||||||
|
}
|
||||||
|
}
|
||||||
|
`
|
||||||
|
|
||||||
|
var kibanaStatusExpected6_5 = map[string]interface{}{
|
||||||
|
"status_code": 1,
|
||||||
|
"heap_total_bytes": int64(149954560),
|
||||||
|
"heap_max_bytes": int64(149954560),
|
||||||
|
"heap_used_bytes": int64(126274392),
|
||||||
|
"uptime_ms": int64(2173595336),
|
||||||
|
"response_time_avg_ms": float64(12.5),
|
||||||
|
"response_time_max_ms": int64(123),
|
||||||
|
"concurrent_connections": int64(10),
|
||||||
|
"requests_per_sec": float64(0.4),
|
||||||
|
}
|
Loading…
Reference in New Issue