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
|
||||
- status_code: integer (1, 2, 3, 0)
|
||||
- heap_total_bytes: integer
|
||||
- heap_max_bytes: integer
|
||||
- heap_used_bytes: integer
|
||||
- uptime_ms: integer
|
||||
|
@ -52,12 +53,12 @@ with following rules:
|
|||
|
||||
### Tags
|
||||
|
||||
- status (Kibana health: green, yellow, red)
|
||||
- name (Kibana reported name)
|
||||
- uuid (Kibana reported UUID)
|
||||
- version (Kibana version)
|
||||
- source (Kibana server hostname or IP)
|
||||
- status (Kibana health: green, yellow, red)
|
||||
- version (Kibana version)
|
||||
|
||||
### 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"
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"strings"
|
||||
"sync"
|
||||
"time"
|
||||
|
@ -55,6 +56,8 @@ type responseTimes struct {
|
|||
|
||||
type process struct {
|
||||
Mem mem `json:"mem"`
|
||||
Memory memory `json:"memory"`
|
||||
UptimeInMillis int64 `json:"uptime_in_millis"`
|
||||
}
|
||||
|
||||
type requests struct {
|
||||
|
@ -66,6 +69,15 @@ type mem struct {
|
|||
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 = `
|
||||
## specify a list of one or more Kibana servers
|
||||
servers = ["http://localhost:5601"]
|
||||
|
@ -187,15 +199,37 @@ func (k *Kibana) gatherKibanaStatus(baseUrl string, acc telegraf.Accumulator) er
|
|||
tags["status"] = 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["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_max_ms"] = kibanaStatus.Metrics.ResponseTimes.MaxInMillis
|
||||
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)
|
||||
|
||||
return nil
|
||||
|
|
|
@ -9,7 +9,7 @@ import (
|
|||
"github.com/influxdata/telegraf/testutil"
|
||||
)
|
||||
|
||||
func defaultTags() map[string]string {
|
||||
func defaultTags6_3() map[string]string {
|
||||
return map[string]string{
|
||||
"name": "my-kibana",
|
||||
"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 {
|
||||
statusCode int
|
||||
body string
|
||||
|
@ -41,22 +50,35 @@ func (t *transportMock) RoundTrip(r *http.Request) (*http.Response, error) {
|
|||
return res, nil
|
||||
}
|
||||
|
||||
func checkKibanaStatusResult(t *testing.T, acc *testutil.Accumulator) {
|
||||
tags := defaultTags()
|
||||
acc.AssertContainsTaggedFields(t, "kibana", kibanaStatusExpected, tags)
|
||||
func checkKibanaStatusResult(version string, t *testing.T, acc *testutil.Accumulator) {
|
||||
if version == "6.3.2" {
|
||||
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) {
|
||||
ks := newKibanahWithClient()
|
||||
ks.Servers = []string{"http://example.com:5601"}
|
||||
ks.client.Transport = newTransportMock(http.StatusOK, kibanaStatusResponse)
|
||||
|
||||
var acc testutil.Accumulator
|
||||
if err := acc.GatherError(ks.Gather); err != nil {
|
||||
// Unit test for Kibana version < 6.5
|
||||
ks.client.Transport = newTransportMock(http.StatusOK, kibanaStatusResponse6_3)
|
||||
var acc1 testutil.Accumulator
|
||||
if err := acc1.GatherError(ks.Gather); err != nil {
|
||||
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 {
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
package kibana
|
||||
|
||||
const kibanaStatusResponse = `
|
||||
const kibanaStatusResponse6_3 = `
|
||||
{
|
||||
"name": "my-kibana",
|
||||
"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,
|
||||
"heap_total_bytes": int64(149954560),
|
||||
"heap_max_bytes": int64(149954560),
|
||||
"heap_used_bytes": int64(126274392),
|
||||
"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