From c01bbf2951ccddecab6f868d6515ed7fd283249b Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Mon, 16 Jan 2023 13:16:28 +0100 Subject: [PATCH 01/21] Add support for optional metricsets in xpack mode --- metricbeat/helper/elastic/elastic.go | 29 +++++++++++++++++-- metricbeat/helper/elastic/elastic_test.go | 27 ++++++++++++++--- metricbeat/module/beat/beat.go | 2 +- .../module/elasticsearch/elasticsearch.go | 2 +- metricbeat/module/kibana/kibana.go | 2 +- metricbeat/module/logstash/logstash.go | 2 +- 6 files changed, 53 insertions(+), 11 deletions(-) diff --git a/metricbeat/helper/elastic/elastic.go b/metricbeat/helper/elastic/elastic.go index fa466a5fee1c..c23ca3690205 100644 --- a/metricbeat/helper/elastic/elastic.go +++ b/metricbeat/helper/elastic/elastic.go @@ -138,7 +138,7 @@ func FixTimestampField(m mapstr.M, field string) error { } // NewModule returns a new Elastic stack module with the appropriate metricsets configured. -func NewModule(base *mb.BaseModule, xpackEnabledMetricsets []string, logger *logp.Logger) (*mb.BaseModule, error) { +func NewModule(base *mb.BaseModule, xpackEnabledMetricsets []string, optionalXpackMetricsets []string, logger *logp.Logger) (*mb.BaseModule, error) { moduleName := base.Name() config := struct { @@ -158,8 +158,31 @@ func NewModule(base *mb.BaseModule, xpackEnabledMetricsets []string, logger *log return nil, errors.Wrapf(err, "could not unpack configuration for module %v", moduleName) } - // These metricsets are exactly the ones required if xpack.enabled == true - raw["metricsets"] = xpackEnabledMetricsets + // Ensure all required metricsets are enabled when xpack.enabled == true + cfgdMetricsets, err := raw.GetValue("metricsets") + if err != nil || cfgdMetricsets == nil || len(cfgdMetricsets.([]interface{})) == 0 { + raw["metricsets"] = xpackEnabledMetricsets + } else { + // Allow some optional metricsets to be enabled when xpack.enabled == true + cfgdMetricsetsSlice := cfgdMetricsets.([]interface{}) + metricsets := xpackEnabledMetricsets + + for _, cfgdMs := range cfgdMetricsetsSlice { + found := false + for _, optMs := range optionalXpackMetricsets { + if cfgdMs == optMs { + found = true + break + } + } + + if found { + metricsets = append(metricsets, cfgdMs.(string)) + } + } + + raw["metricsets"] = metricsets + } newConfig, err := conf.NewConfigFrom(raw) if err != nil { diff --git a/metricbeat/helper/elastic/elastic_test.go b/metricbeat/helper/elastic/elastic_test.go index a7cc38a5680e..be5529928029 100644 --- a/metricbeat/helper/elastic/elastic_test.go +++ b/metricbeat/helper/elastic/elastic_test.go @@ -157,11 +157,14 @@ func TestConfigureModule(t *testing.T) { require.NoError(t, err) err = mockRegistry.AddMetricSet(moduleName, "baz", mockMetricSetFactory) require.NoError(t, err) + err = mockRegistry.AddMetricSet(moduleName, "thud", mockMetricSetFactory) + require.NoError(t, err) tests := map[string]struct { - initConfig metricSetConfig - xpackEnabledMetricsets []string - newConfig metricSetConfig + initConfig metricSetConfig + xpackEnabledMetricsets []string + optionalXpackMetricsets []string + newConfig metricSetConfig }{ "no_xpack_enabled": { metricSetConfig{ @@ -169,6 +172,7 @@ func TestConfigureModule(t *testing.T) { MetricSets: []string{"foo", "bar"}, }, []string{"baz", "qux", "foo"}, + []string{}, metricSetConfig{ Module: moduleName, MetricSets: []string{"foo", "bar"}, @@ -181,12 +185,27 @@ func TestConfigureModule(t *testing.T) { MetricSets: []string{"foo", "bar"}, }, []string{"baz", "qux", "foo"}, + []string{}, metricSetConfig{ Module: moduleName, XPackEnabled: true, MetricSets: []string{"baz", "qux", "foo"}, }, }, + "xpack_enabled_with_optional": { + metricSetConfig{ + Module: moduleName, + XPackEnabled: true, + MetricSets: []string{"foo", "bar", "thud"}, + }, + []string{"baz", "qux", "foo"}, + []string{"bar"}, + metricSetConfig{ + Module: moduleName, + XPackEnabled: true, + MetricSets: []string{"baz", "qux", "foo", "bar"}, // include optional, exclude others + }, + }, } for name, test := range tests { @@ -200,7 +219,7 @@ func TestConfigureModule(t *testing.T) { require.Fail(t, "expecting module to be base module") } - newM, err := NewModule(bm, test.xpackEnabledMetricsets, logp.L()) + newM, err := NewModule(bm, test.xpackEnabledMetricsets, test.optionalXpackMetricsets, logp.L()) require.NoError(t, err) var newConfig metricSetConfig diff --git a/metricbeat/module/beat/beat.go b/metricbeat/module/beat/beat.go index c58e33974454..138e2d99750b 100644 --- a/metricbeat/module/beat/beat.go +++ b/metricbeat/module/beat/beat.go @@ -41,7 +41,7 @@ var metricSets = []string{"state", "stats"} // NewModule creates a new module func NewModule(base mb.BaseModule) (mb.Module, error) { - return elastic.NewModule(&base, metricSets, logp.NewLogger(ModuleName)) + return elastic.NewModule(&base, metricSets, []string{}, logp.NewLogger(ModuleName)) } // ModuleName is the name of this module. diff --git a/metricbeat/module/elasticsearch/elasticsearch.go b/metricbeat/module/elasticsearch/elasticsearch.go index cd7dc0ec47ed..56e2d5bedf87 100644 --- a/metricbeat/module/elasticsearch/elasticsearch.go +++ b/metricbeat/module/elasticsearch/elasticsearch.go @@ -56,7 +56,7 @@ func NewModule(base mb.BaseModule) (mb.Module, error) { "node_stats", "shard", } - return elastic.NewModule(&base, xpackEnabledMetricSets, logp.NewLogger(ModuleName)) + return elastic.NewModule(&base, xpackEnabledMetricSets, []string{}, logp.NewLogger(ModuleName)) } var ( diff --git a/metricbeat/module/kibana/kibana.go b/metricbeat/module/kibana/kibana.go index 781a0fccfda9..9a3fa60b12e8 100644 --- a/metricbeat/module/kibana/kibana.go +++ b/metricbeat/module/kibana/kibana.go @@ -92,7 +92,7 @@ func NewModule(base mb.BaseModule) (mb.Module, error) { xpackEnabledMetricSets := []string{ "stats", "cluster_rules", "node_rules", "cluster_actions", "node_actions", } - return elastic.NewModule(&base, xpackEnabledMetricSets, logp.NewLogger(ModuleName)) + return elastic.NewModule(&base, xpackEnabledMetricSets, []string{}, logp.NewLogger(ModuleName)) } // GetVersion returns the version of the Kibana instance diff --git a/metricbeat/module/logstash/logstash.go b/metricbeat/module/logstash/logstash.go index 6008b8d947ad..8623bcd9a803 100644 --- a/metricbeat/module/logstash/logstash.go +++ b/metricbeat/module/logstash/logstash.go @@ -40,7 +40,7 @@ func init() { // NewModule creates a new module func NewModule(base mb.BaseModule) (mb.Module, error) { - return elastic.NewModule(&base, []string{"node", "node_stats"}, logp.NewLogger(ModuleName)) + return elastic.NewModule(&base, []string{"node", "node_stats"}, []string{}, logp.NewLogger(ModuleName)) } // ModuleName is the name of this module. From afd63ff88a8f2c41cc135c69ec26dcbea75d0d46 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Fri, 20 Jan 2023 12:37:04 +0100 Subject: [PATCH 02/21] Simplify metricset loop --- metricbeat/helper/elastic/elastic.go | 33 +++++++++++++--------------- 1 file changed, 15 insertions(+), 18 deletions(-) diff --git a/metricbeat/helper/elastic/elastic.go b/metricbeat/helper/elastic/elastic.go index c23ca3690205..39a4d342e601 100644 --- a/metricbeat/helper/elastic/elastic.go +++ b/metricbeat/helper/elastic/elastic.go @@ -22,6 +22,7 @@ import ( "strings" "github.com/pkg/errors" + "golang.org/x/exp/slices" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" @@ -158,32 +159,28 @@ func NewModule(base *mb.BaseModule, xpackEnabledMetricsets []string, optionalXpa return nil, errors.Wrapf(err, "could not unpack configuration for module %v", moduleName) } - // Ensure all required metricsets are enabled when xpack.enabled == true + // Ensure all required metricsets are enabled when xpack.enabled == true, and add any additional which are optional cfgdMetricsets, err := raw.GetValue("metricsets") - if err != nil || cfgdMetricsets == nil || len(cfgdMetricsets.([]interface{})) == 0 { - raw["metricsets"] = xpackEnabledMetricsets - } else { - // Allow some optional metricsets to be enabled when xpack.enabled == true + metricsets := xpackEnabledMetricsets + if err == nil && cfgdMetricsets != nil { + // Type cast the metricsets to a slice of strings cfgdMetricsetsSlice := cfgdMetricsets.([]interface{}) - metricsets := xpackEnabledMetricsets - - for _, cfgdMs := range cfgdMetricsetsSlice { - found := false - for _, optMs := range optionalXpackMetricsets { - if cfgdMs == optMs { - found = true - break - } - } + cfgdMetricsetsStrings := make([]string, len(cfgdMetricsetsSlice)) + for i := range cfgdMetricsetsSlice { + cfgdMetricsetsStrings[i] = cfgdMetricsetsSlice[i].(string) + } - if found { - metricsets = append(metricsets, cfgdMs.(string)) + // Add any optional metricsets which are not already configured + for _, cfgdMs := range cfgdMetricsetsStrings { + if slices.Contains(optionalXpackMetricsets, cfgdMs) { + metricsets = append(metricsets, cfgdMs) } } - raw["metricsets"] = metricsets } + raw["metricsets"] = metricsets + newConfig, err := conf.NewConfigFrom(raw) if err != nil { return nil, errors.Wrapf(err, "could not create new configuration for module %v", moduleName) From 60b85e37ccf00aa3f38801ab468a12a62531d5e0 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Tue, 24 Jan 2023 10:19:38 +0100 Subject: [PATCH 03/21] go mod tidy --- go.mod | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/go.mod b/go.mod index de23281476a2..80d7028b648b 100644 --- a/go.mod +++ b/go.mod @@ -209,6 +209,7 @@ require ( go.elastic.co/apm/module/apmhttp/v2 v2.0.0 go.elastic.co/apm/v2 v2.0.0 go.mongodb.org/mongo-driver v1.5.1 + golang.org/x/exp v0.0.0-20220921023135-46d9e7742f1e gopkg.in/natefinch/lumberjack.v2 v2.0.0 ) @@ -330,7 +331,6 @@ require ( github.com/yusufpapurcu/wmi v1.2.2 // indirect go.elastic.co/fastjson v1.1.0 // indirect go.opencensus.io v0.23.0 // indirect - golang.org/x/exp v0.0.0-20220921023135-46d9e7742f1e // indirect golang.org/x/term v0.2.0 // indirect golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect google.golang.org/appengine v1.6.7 // indirect From b086da76c89cd3cc75f0bf35b2ba7fb07558caee Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Tue, 24 Jan 2023 10:23:42 +0100 Subject: [PATCH 04/21] Remove dependency on exp/slices --- go.mod | 2 +- metricbeat/helper/elastic/elastic.go | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/go.mod b/go.mod index 80d7028b648b..de23281476a2 100644 --- a/go.mod +++ b/go.mod @@ -209,7 +209,6 @@ require ( go.elastic.co/apm/module/apmhttp/v2 v2.0.0 go.elastic.co/apm/v2 v2.0.0 go.mongodb.org/mongo-driver v1.5.1 - golang.org/x/exp v0.0.0-20220921023135-46d9e7742f1e gopkg.in/natefinch/lumberjack.v2 v2.0.0 ) @@ -331,6 +330,7 @@ require ( github.com/yusufpapurcu/wmi v1.2.2 // indirect go.elastic.co/fastjson v1.1.0 // indirect go.opencensus.io v0.23.0 // indirect + golang.org/x/exp v0.0.0-20220921023135-46d9e7742f1e // indirect golang.org/x/term v0.2.0 // indirect golang.org/x/xerrors v0.0.0-20220609144429-65e65417b02f // indirect google.golang.org/appengine v1.6.7 // indirect diff --git a/metricbeat/helper/elastic/elastic.go b/metricbeat/helper/elastic/elastic.go index 39a4d342e601..3000270f4f5e 100644 --- a/metricbeat/helper/elastic/elastic.go +++ b/metricbeat/helper/elastic/elastic.go @@ -22,7 +22,6 @@ import ( "strings" "github.com/pkg/errors" - "golang.org/x/exp/slices" "github.com/elastic/elastic-agent-libs/logp" "github.com/elastic/elastic-agent-libs/mapstr" @@ -172,7 +171,15 @@ func NewModule(base *mb.BaseModule, xpackEnabledMetricsets []string, optionalXpa // Add any optional metricsets which are not already configured for _, cfgdMs := range cfgdMetricsetsStrings { - if slices.Contains(optionalXpackMetricsets, cfgdMs) { + found := false + for _, ms := range optionalXpackMetricsets { + if ms == cfgdMs { + found = true + break + } + } + + if found { metricsets = append(metricsets, cfgdMs) } } From 570637a2cac66339c2a20e84bbd2c4ccd4d30f1b Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Sat, 10 Dec 2022 01:29:46 +0100 Subject: [PATCH 05/21] Add elasticsearch.ingest metricset --- .../docs/modules/elasticsearch.asciidoc | 4 + .../modules/elasticsearch/ingest.asciidoc | 28 +++++ metricbeat/docs/modules_list.asciidoc | 3 +- metricbeat/include/list_common.go | 1 + .../elasticsearch/_meta/config.reference.yml | 1 + .../module/elasticsearch/_meta/fields.yml | 4 + .../module/elasticsearch/elasticsearch.go | 1 + metricbeat/module/elasticsearch/fields.go | 2 +- .../elasticsearch/ingest/_meta/data.json | 19 +++ .../elasticsearch/ingest/_meta/docs.asciidoc | 1 + .../elasticsearch/ingest/_meta/fields.yml | 17 +++ .../module/elasticsearch/ingest/data.go | 112 ++++++++++++++++++ .../module/elasticsearch/ingest/ingest.go | 93 +++++++++++++++ 13 files changed, 284 insertions(+), 2 deletions(-) create mode 100644 metricbeat/docs/modules/elasticsearch/ingest.asciidoc create mode 100644 metricbeat/module/elasticsearch/ingest/_meta/data.json create mode 100644 metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc create mode 100644 metricbeat/module/elasticsearch/ingest/_meta/fields.yml create mode 100644 metricbeat/module/elasticsearch/ingest/data.go create mode 100644 metricbeat/module/elasticsearch/ingest/ingest.go diff --git a/metricbeat/docs/modules/elasticsearch.asciidoc b/metricbeat/docs/modules/elasticsearch.asciidoc index 01ec3860fb8d..7c2fff02a6f0 100644 --- a/metricbeat/docs/modules/elasticsearch.asciidoc +++ b/metricbeat/docs/modules/elasticsearch.asciidoc @@ -97,6 +97,8 @@ The following metricsets are available: * <> +* <> + * <> * <> @@ -119,6 +121,8 @@ include::elasticsearch/index_recovery.asciidoc[] include::elasticsearch/index_summary.asciidoc[] +include::elasticsearch/ingest.asciidoc[] + include::elasticsearch/ml_job.asciidoc[] include::elasticsearch/node.asciidoc[] diff --git a/metricbeat/docs/modules/elasticsearch/ingest.asciidoc b/metricbeat/docs/modules/elasticsearch/ingest.asciidoc new file mode 100644 index 000000000000..6224ac5f159c --- /dev/null +++ b/metricbeat/docs/modules/elasticsearch/ingest.asciidoc @@ -0,0 +1,28 @@ +//// +This file is generated! See scripts/mage/docs_collector.go +//// +:edit_url: https://github.com/elastic/beats/edit/main/metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc + + +[[metricbeat-metricset-elasticsearch-ingest]] +=== Elasticsearch ingest metricset + +beta[] + +include::../../../module/elasticsearch/ingest/_meta/docs.asciidoc[] + + +:edit_url: + +==== Fields + +For a description of each field in the metricset, see the +<> section. + +Here is an example document generated by this metricset: + +[source,json] +---- +include::../../../module/elasticsearch/ingest/_meta/data.json[] +---- +:edit_url!: \ No newline at end of file diff --git a/metricbeat/docs/modules_list.asciidoc b/metricbeat/docs/modules_list.asciidoc index ebe106a93b6b..b585a3f7ebc3 100644 --- a/metricbeat/docs/modules_list.asciidoc +++ b/metricbeat/docs/modules_list.asciidoc @@ -98,12 +98,13 @@ This file is generated! See scripts/mage/docs_collector.go |<> |image:./images/icon-no.png[No prebuilt dashboards] | .1+| .1+| |<> |<> |image:./images/icon-no.png[No prebuilt dashboards] | -.11+| .11+| |<> +.12+| .12+| |<> |<> |<> |<> |<> |<> +|<> beta[] |<> |<> |<> diff --git a/metricbeat/include/list_common.go b/metricbeat/include/list_common.go index 8dc7a9862541..4676f270eb50 100644 --- a/metricbeat/include/list_common.go +++ b/metricbeat/include/list_common.go @@ -59,6 +59,7 @@ import ( _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/index" _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/index_recovery" _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/index_summary" + _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/ingest" _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/ml_job" _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/node" _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/node_stats" diff --git a/metricbeat/module/elasticsearch/_meta/config.reference.yml b/metricbeat/module/elasticsearch/_meta/config.reference.yml index 61599fa2ae29..7557e1a23284 100644 --- a/metricbeat/module/elasticsearch/_meta/config.reference.yml +++ b/metricbeat/module/elasticsearch/_meta/config.reference.yml @@ -5,6 +5,7 @@ #- index #- index_recovery #- index_summary + #- ingest #- shard #- ml_job period: 10s diff --git a/metricbeat/module/elasticsearch/_meta/fields.yml b/metricbeat/module/elasticsearch/_meta/fields.yml index 0f334325a1ca..2e3ac171d39f 100644 --- a/metricbeat/module/elasticsearch/_meta/fields.yml +++ b/metricbeat/module/elasticsearch/_meta/fields.yml @@ -676,6 +676,10 @@ type: keyword description: > Node name. + - name: roles + type: keyword + description: > + Node roles. - name: master type: boolean description: > diff --git a/metricbeat/module/elasticsearch/elasticsearch.go b/metricbeat/module/elasticsearch/elasticsearch.go index 56e2d5bedf87..4410ed8290c9 100644 --- a/metricbeat/module/elasticsearch/elasticsearch.go +++ b/metricbeat/module/elasticsearch/elasticsearch.go @@ -49,6 +49,7 @@ func NewModule(base mb.BaseModule) (mb.Module, error) { "ccr", "enrich", "cluster_stats", + "ingest", "index", "index_recovery", "index_summary", diff --git a/metricbeat/module/elasticsearch/fields.go b/metricbeat/module/elasticsearch/fields.go index 6100e3bf7cfa..13ff3cd2a730 100644 --- a/metricbeat/module/elasticsearch/fields.go +++ b/metricbeat/module/elasticsearch/fields.go @@ -32,5 +32,5 @@ func init() { // AssetElasticsearch returns asset data. // This is the base64 encoded zlib format compressed contents of module/elasticsearch. func AssetElasticsearch() string { - return "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" + return "eJzsXU+P3Dpyv/tTED7tAraAvfqQDbDZTRzgPTzkeXMJAi1bqu6mLYkyRbVn8ukDkZKakvhXojQ93vHpvZnRr35V/FcsFosf0Td4/oSgwA0nWQOYZdd3CHHCC/iE3v9V/fn7dwjl0GSM1JzQ6hP6l3cIITT5G1TSvC3gHUIMCsANfEIX/A6hBjgn1aX5hP7nfdMU7z+g91fO6/f/2/3uShlPM1qdyeUTOuOi6b4/Eyjy5pMQ8RFVuIRPiFQ5PKUMMnoD9ix+hRB/rjspjLZ1/xP1U/Xz5opZ3iQNx4ynnJSQkiotSVGQZvzbAQ8XBKs/rTG/zuyUCDrJQEfBTcrGLJzWu8juYQfRo1iOs29pwzFvgu2F6zI507bKVzHMirbhwBIhOxE8kiXiIOup7n6fZSyBCp8KiCfTjLyUjW+YFN0f7SB9ij3ILkgGVQPhfZlj3q7rOlOaPYFkBjjI6WAjShnhJsMiWPuakRKPM0AYMSExmSOodl2nsMSdfj+ZuDaM8w5lAVrRfB3T7sOELMeB2hZrdK/a8gRs0rx9L1g5AZEqJxkse7n6re77CQPaVnzyG5NiJuWmPbnnlHDKcaGV2M/0yz+II7iHn+ql9okI9opOXvBKlm0xSP16K7XS5sxN7FWsEj+lbW1cY93qhKj09VYmd4Hqwr+gBWVyBVynbQN5x+z0zGFnYlBS9iykJp3URC9ywbBT6HCCJX5S+OkmkPBVUkhKr7i5xlnQOSQayEHaDVhDaBVN1Bzv3sGFSVbP/zpZOszJmpi2LYnklHHpbcwgo3s2CtDozZASGo7L+p0JWsK+/9fxL99ru6PC3IShp9Z/NipLW5aBanb/zr26QUzr/8TLCAYcvx7ndHqS637S/Vegvcqi+2purjvkmTLIcMOb/v/VBStIghlouutc7cFMHD9PF09v/Kn3SzYu9A2nDJKG/B+Y5vqwBV+qMXJLXPgDj5xmOs9gq3gD7Kg9XEqo+B6SLdCDdAZnBs1VdjZzOGA7F29Bdx+AXQbvNt2vc3iKmQwjUl2i+YhyTOu8XLtuvvoNhBOboBmZ+A6ri5Vd4rhoXhnlvIBDGbqEjuRmlg2fB7+3wJ7TDGdX6P3R6P1ekEyCBA3sBPMcc7wvtwAx9znsewsNP8JygaIOmcsks8B5bOd5f7BW4Jy/jycgyfh6Aa9khpdKPdLsrmf0KDP7jJ2PwLuH1h9GLXms6Q9y9t2nP/Q/somY0djX3lM+PqaWHms0Y3NgZZP2E3XUSNJUzd7R9hM3bp8oqfiB7Dzl2QLWEdno4ZXNWHrDRQsH2idA5j2ud2j/8hM3WU7zVI6R40iGib37l0+QpyfC0wb4cWTDxKrTSnqDjFN28OziLXUWC05LXB/HNETo1D35wQgHdhzTIKnK+cQx7OaCJuHALGMpbjlNz7Qo6I+VgUF5VprSc3rGpOjGrUQzHXl6hb8zlijMEomcTJFNB4dzPgxKyiGdnL+k/UYsKj2rICfbps0yaJpzW+xhwR7dz4Tyj4AlowVxvt1ioyVGc+FcIaD2ynU9UZwnp2vPdjKWjHovsgDQZOurNvMGc2hhxnQawDmwdH2+RSdDgiRTkHkrb5QxGk0vpdfjUtATLtLsCtk34UZu1ckMOJNc4qe0ge9pRbeK1CAtbBlPz9Gubk1H6RF0HcVatO0+GuYDyDdb14o2yKQtbziuclJdYs9HCvR8UjIxEOv9ThQEtoGDlHtqz+du0aiBYd65SfOtUBgLFTQZQX0YmKJhG+R3kLPsDk03r+uuFTalKUz7uh5wIXnI/o0n2oi4kC2gIaJoE+DkREIONhF62ZDk28m9R3HlKNOkFisS++URniDbRbqCr01yvntjkWebO7JtsjnS81LljsO/EbK3d7I7oKfYbjbgEKF7WzAHsWKe2aaoBmLam+XsFrkLyzXC3m9jr1FKx7UtUX3PjS2977qq5Mm2oaI5rNw3nJf0Qo5dzRmmawLOY3K9LTpgTF3qU4q6xipLzJ7vufqGjEl7pGHak6MQkgGKUDL37l3O0uUjWdvI6EVMHYHNNjsTOhlL2w1tP67SIdpQkXbp0P6Zj80GbXujKUuW6QgDOUN0arwA52l8lmI1jUxVTtrxucpZewPZmPcoxPFCtI5tSzYwaeNtyfGmxJh74Eh8t/zJEVQiZ0JqxDuSIfdKvnCdcnuy1yQ36C5a+K0U9ryQlYzEcF1zcBueiRHKcIIcZrZFDlq0/uGRLRag6zx5bfX6rWToPaiqyxzC1cpOkuoeVF1d4t96L3iXhKJI43WRsrN+hrNnOq3is2p+2y27yETEWzVrKoyfkYMSZUKJ3cHX9nm0IcUjlO0EPwbhwJSEUL4qfAy68RlGIOWbIRVKTeDGIOidhRfKUALHoBiayBXKdIIfg3BgflQoXxU+Ft29eEYhGJbEFUpTQV9DdrwTObk6H76xv2QRF+aikN1jn5hVkVuDHyZsF75GBd3x8Pyfo72/3srkkiV3myS0yJM7vjWagzzCTwbaTo80Fn+tg+pLfiD+TNtF3GGK8eitKjR41e260GBVyyruULQJxacahYe6Q2GLWY0JP70WfFz1O0IIWapyhDKqgWWwZl+0JFRnvtuiyTniJIfQp/CAHZNuC1hndRutHxYU5ym+AcOXeajEDmwDVwX8aT5mhn+OtqNNktVt0vO7JEYc16jNdOw3eAJ1izNLL9piq7bBF0grXNGVJy2d0QSBpKeZCMjEeHLjMxCX3S2Ottm5Sb+3lOO0JBmLonKSnZtEYCbtGpXRZI+E7SdSMZbve7o3FLjuJztC8w2r4NQg3c+SGXbUdfyugSgskw5ReZNDu06DGXZUDYT7MUJbh9968gp342B0EZ+GZfYZk7TijBaprW97G6Df+vlg+g7KgpSE21yUNQQFqNFXCaEnJ/DI9OQUHkpvjEYxmkHzOA7HameuV0QMq3A3jl9F2kVN6baaGqe2+BbNFt9baHVel8MSii5JxycROJuC/gy+Qsa1k3YomQFq9anKBfRZAi9k4QvwhzFwx2WzfefXe17cwvKm4qPYeKg/vdHK8c9kt5r5fvD5EHbuf7vZ0OK465HsLJPbHsXMkk2wlWcJdiszqVNcbFtudQUBzUgmNOTOCLOD2oAX4MYEBeS1MTHf5R5SeU1lzyy7osD0td2Z6vJA9smf187DdkgbLPJOR0GRbLgsfOPRzp4pPDtydBWN/gnGoa5AleYC+wQieAodyutWuiqq3+D5B51Uttc8YzL8mz5n0uMKKYlRqiakHUEmyc0SZRXluHIFplaqttJ0yAJF5suziayDcPfvV5oD+vxvWjmz5o8hadryqjBGC8OKu16awNSLkxW6tfJOlBaAqzB5nxvEryDaVvyHxBf//2c9gYJm36auynYKAyjqH2dBtBpp/XnZ/bNl5Yh5P7TI/AujTfNxGF8M6oJk4moFml/bmb5eNPyzdXFjfQtk7RbWO5X3Tws6WwPGUJ+jqIAHhKYAyP0rUnG4KPqYfRGxjkZzSOZ3nZ3aLD42XFUOAlpcGLV+begXOE/hKYNadzdIolSi8QyfL66Com2e3ngfdRefQnNbWSdCa3W0sPxKoDHzVdx+/fn1VOpg/HzKaoeFWvwi3tBwXwOzN4OhCEi4ekoNqmja7TgYrOWxnBbQIYYUBfMWMJsCH9AU+iVe1FGK1g90gW3kcF2R25fr/v2KS0D03DM2SLr7s5qqSxbbBDH5BT+Rsi1R03WZKoP+AL4jN47SwdXs2c5fP5uytVWospDWNuhQa+M1NenA2dGo2hJwVguFsRlbsWs4IQz9IPxKZEvauVmrpcRneBcneUGO/jBsOSD/Y+dZU8F6NK3U58xo6d8vRfCqIVUGab8VWOE3e2n2hZTwAZEKlc0HJCRO2Xfi0Rl4doWFErGHVRDxfxcy0F0GEneruuE/Nf3jT1XefE2VvjxI30PCxqJdASjm8lsBIPZqSFYoXeDMneZhiyH00YPtEQO9SdyhgvkTpWY1TAzQLLa3eCLPTQYtIlPz9+jCMFz9w/W99o06N4T6+SIX0juYp/aJtkF/uDCA6gN6hm60fkAM8j/qY3rz5zqRtSknMn/tPhUSiYjhJl7tProgjbXUjXFMKt+7Cvc4MfSj2DIdTPT/0tFX5kphym55Gka6Qao2jOov9r6+S6CPUJALORXgTUBTSGGN+A7GW+byeVX7Xse801GXRPObpw6V5kma7ssZK+CsVyucQdFlyRzkPzY1kW4Jt3q8OkvZOEeb/pjPt9/pXJf5COxN5tEd5RPGQT3SyeZ34Tyb7eteCUWRHHvFLauXEuCVBOi1tLO0nsXM7sSQPWj1L6q76Y1riF/Zli1d9BcBjLqpAJ0pU0TqIy2Tx/inBPx9q/FE+6km7DnNO8fEnF7gHLha18TunIxjfvp4v+tDRWIWL30X12Vypm1ldsz0Z4d3hKcaZ99kbf7B54iA1R84eiONzVoxki3fkw7YQvxVIETYQcATZG23SUtrWpAsXoFHzTk68nbFOW7mvcfOxsbIkkOgwjr8AgMld4Rs7MTiYuwmiAxXGRSm3uvqv8qcjhlUPO1UWh7ahlHSnNiqAOarKPaLW8o8wrjtMrHjMEA5DmirilSXpMLaEIwVbZKzKlwo7TDRsHAlbNxXZJlAM5xPoD4cKSVaRq44sO8+Bb3jEZ8Zv2Lez2DDnRfKGnTFNxg59cE9kRgimrCtDQkw8pAm+hF11jKmv/yy1Wf5i0RWQ2z3o9Nen9FYZrdqhZMYGjw20/JrJ9PRQPBiNQcIX6UyBniZoO0YrVeS54sAvXmKtO4s1vfEDbuBFa738KkmihU9grVPxtznrrNYUubiJ6o/QOKy8zA7OM3YkdxkrtsYR3HPGo4BFoAbyWylkT1hroRb67d4wpSkadbiTNv0NbXBAxnP/eC0J5CxYnLI9zkUoL9A5HVKpi1uiaJ0ghjN5SxbFgDmW7AtADK0xl4g24BqeAHIvsUVAyC9yyEGYAbVKA3ADazPGYAcVnAvADi0BqoD+r4We7/nH4gITxxY1YFGgy6BXYaNpnNh8cB7iLtJnp11q/OlIvrXareA2nYY673htevhqoB/TrNWrH1ITb8y75rXL7br6ElJwTT9nJMzZSXm/b2NHbQZ9Ol4DPlugninhRBq1mAf3zTYM/WKzNp3Bl4QdsfW79zY7tR6TIbzw6wYE+wd02alty2jDeaBdj2x199X5Xzsuk+K4iq653TkO3UvF6NSOYg+Pcvs5d4ilgkd7bv32mPPsWGsrTauXBfHutovsifaYUu449Y48nYIHbLr3m1zGHc/+88bmX7bEEYypKZ8HopiRD/fI0B1fLvEhovaMkJf58uMQWhr+U36X8IgozeY1Cd9gaPZuEXuzmRZEMOOaENVkc3lMJFHuovq4AqrG8vuenYEBp0jF6EzbVhdlnksKIqpRxNFGtLSVrGcC9eLyhasVSfey6G/zGdyyGs4rdd+iRlf96khgSA8lUimVQ+z1aQ6ELJnmm5II5gJ7ZBs+QT6vMdVFWm+sBYQmSUz62U3fPkYwAad/2vQVuAarMxw1RR03oTrZ2zzvOqZ6rk+P6ZfmqtU9HJ/jHtKJ7sAT4RJasp4ivOcLW/1ewxtCRSzRNUXASkzs4wjRoq90kZfx3ez4A4Z9UZBf8hoW+ToBOjzb+MPKRN/1PEx3E/rScZNElJJTlOF9OOMtiyDCA3dA8Vs6N8FpL2he7FxG1oVHKOhe5JxG1olac4JuwEj527DHdMVFZe9U7/3oj2mqSCIqaPfl0F8WT8/ft7d20ljzJPGNVWH3PFqb1XWHDJ6vqIbz8quKO+CmNebinubdusRwHGxtRhlm8xli72gjgqdWpnFeW/Q5+Edy0mIsgBZjekA2z2gqFTmiNB9rFNhAI7xXlP0Nl7dMnM0fLtExbJZ0QL3lpa0O703Z+HNWXDy/6dwFtzP4NkieVOwyRncKudjqeObH/PmxwTp+yr9mAfwPO7D7gINT2pSQ0Eq95MDYyDkBNw3FGIMcf0gRZ7Nq+rt4w9tuLHkqOLrEcvK6lZXqt0To4HiHAgxZukVyVd6cjaqZbUsC13j+592R4z8/r0i31tAZYG+0pM59mss1bdK6H/Sk4TUSztTBhlueP8OVUhJgbGNaA4yQSRaZx9Sg/VlbHwC9znmWCbfxnzg6oYLksvqPBvGY19EAfKUQUZZvgZr1u6/DZCyxhvcli6saplEVUW7eq09+/1yVYuRSv0aUW8XAeFXYAiLxGhSXTomII2OaPdz8f+i2oQ8kKgoRydANWYN5JoTn8Vs4fXmjEWB2ff7l+f0e+ClR9U357JMn7mDu6aK//4Ffa7O1K/MnEtrl+YehAZSWgOgxXwha/iRyvLk8N57sv8AXKOOwWQb1ung3oH51jU8RIcSP61XoaLVyzfFr7T6GKE5Bl1eskVGVfxbZbbWJDs8xHQewFGHDbmo8y2Npp2Zt9dR/n2s1IjwibYcAc6u/Ul6hbD+TbRt7p/YXUTzIOy5Ly987T9mEq25HFMAiHHfYsFQojFBtVhdLbdbFGFIX959z75lv77MbHhFdA1pr3Hprjw7mcMMufGvha8SA5O1wTfedzz01AeeusWk24gM5yqPe+LzQOckr+2EZDh8CjgM2XpwtupgTAj1IDde8d5lPXI0mVN15Gy6406cIh7spJumNxT11GlynrP7Bf0jusJRxQaO0GX/O5wxOrVyHXTz03h7XtO/3712LSYeyvtc17/Pssp154Nlq5eLDxYt7qQfLFPWFDhY6OSm/MGy1fvuLyD6aJnKJfydJStB8U6SiKVGCwHsFAEc4A3XQ7dPoUeN4sy+huS0NZWxv4vRXS6bN2pNaREvsEOLfaxuf5koiuW9i5/8gp98ysXUgL89DOffAH/zJZ0+krEF8dLP4o73po4l/nd5sGDdez7TdqcN2yM14dt4eRsvccZL07IbuVHzu8ZvQ+blOL8NmaOJm4aM6uJdsiSjRSF3RzHdvAHWlqry0pXXN0QDxdL8k+mo7STneL1iv/P4LVVn5ljjC3YxKswtrpb76ewxwP9GCkDNc8OhtIjxNt5hgT4GmxLvQ2S53j+OInCMItJ0nnEzlbC5f1v5xzil9rxigcJuHIj34PeBFjHbCNijAeLNdVnd7tITCorzFN8uyZ+W70WrMq64OKfnguKlOUaKJh4RFq66xVnGk7bBF0i2VvXT29LN1MV2IuPcJN9bynGiTYH3ZIxmNwucSDbqPvRVgVDguoE8rYERmrsHg6c+aJa0ptwJ3EuEIsHYdzzhpyeS+3cjWnFGi9TVrq5U7SlqQUpLau86TDk012POU16zuk2WQWlLMNonCM2v3eqR1pTGu9q1W26hfEw0gs/O4Ctk3DG8PLzPC5gTlH4qRXWVqX5SVffNd3gsXYV79/OqOs/MSmsGTdOy2Bf79vHwZMp5ktHyRCrI04xSlpMKi8fOcZWnfYHOw47axS52ECrbZX1B6fWSD1VXNfoL6DwRf6jiDOqCZPgFdB4kH9zODzLK7sP++JYfZL+Qygc3/CAWF4fF5mRfO1Cg2Nfs9CjQaEd5Ly2pQbzVnnLcqO6/fiW0xF//oQP8h9j4YVI1CKP+F6j7hYqkHsKsuRvXAOMpZTnMzzeNFnK+Bd5BoiXkfW9HKCNcX707XN5vOrjRsRWlaLWSNpS2TdDfKEPwhMu66BRq+ccS1/U8D34SfCBVKv1D35Lu7mv6pBRXDQTsooeKCuZbuqQA6DvPpj62W7F2fiUNIo24eOFRuF3efoll/EmNBMHEXjM+Zj2QL+KmCebgI5tBQTO5tIsbvFXcot7XvtCzuP0iuswP3AxCIUdnRks/YlErsXvRQp85umLZgeAJZxw1uAQkctURv+JKa7xuaUAZLWvMyYkUhD+jumU1bUwn4nISSmeVKdCmTZimFV0mU6J07cLWy4//PwAA//+qGNN1" } diff --git a/metricbeat/module/elasticsearch/ingest/_meta/data.json b/metricbeat/module/elasticsearch/ingest/_meta/data.json new file mode 100644 index 000000000000..21b8c47385c9 --- /dev/null +++ b/metricbeat/module/elasticsearch/ingest/_meta/data.json @@ -0,0 +1,19 @@ +{ + "@timestamp":"2016-05-23T08:05:34.853Z", + "beat":{ + "hostname":"beathost", + "name":"beathost" + }, + "metricset":{ + "host":"localhost", + "module":"elasticsearch", + "name":"ingest", + "rtt":44269 + }, + "elasticsearch":{ + "ingest":{ + "example": "ingest" + } + }, + "type":"metricsets" +} diff --git a/metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc b/metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc new file mode 100644 index 000000000000..4eb3c4e06532 --- /dev/null +++ b/metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc @@ -0,0 +1 @@ +This is the ingest metricset of the module elasticsearch. diff --git a/metricbeat/module/elasticsearch/ingest/_meta/fields.yml b/metricbeat/module/elasticsearch/ingest/_meta/fields.yml new file mode 100644 index 000000000000..5c07c1a0e9a1 --- /dev/null +++ b/metricbeat/module/elasticsearch/ingest/_meta/fields.yml @@ -0,0 +1,17 @@ +- name: ingest.pipeline + type: group + release: beta + fields: + - name: name + type: wildcard + - name: total + type: group + fields: + - name: count + type: long + - name: failed + type: long + - name: total_cpu_time + type: long + - name: self_cpu_time + type: long diff --git a/metricbeat/module/elasticsearch/ingest/data.go b/metricbeat/module/elasticsearch/ingest/data.go new file mode 100644 index 000000000000..831452c636ce --- /dev/null +++ b/metricbeat/module/elasticsearch/ingest/data.go @@ -0,0 +1,112 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package ingest + +import ( + "encoding/json" + + "github.com/pkg/errors" + + "github.com/elastic/beats/v7/metricbeat/helper" + "github.com/elastic/beats/v7/metricbeat/mb" + "github.com/elastic/beats/v7/metricbeat/module/elasticsearch" + "github.com/elastic/elastic-agent-libs/mapstr" +) + +type Stats struct { + ClusterName string `json:"cluster_name"` + Nodes map[string]NodeStats `json:"nodes"` +} + +type NodeStats struct { + Name string `json:"name"` + Roles []string `json:"roles"` + Ingest NodeIngestStats `json:"ingest"` +} + +type NodeIngestStats struct { + Total IngestStat `json:"total"` + Pipelines map[string]PipelineStat `json:"pipelines"` +} + +type IngestStat struct { + Count int `json:"count"` + TimeInMillis int `json:"time_in_millis"` + Failed int `json:"failed"` +} + +type PipelineStat struct { + IngestStat + Processors []map[string]struct { + Type string `json:"type"` + Stats IngestStat `json:"stats"` + } `json:"processors"` +} + +func eventsMapping(r mb.ReporterV2, httpClient *helper.HTTP, info elasticsearch.Info, content []byte, isXpack bool) error { + var nodeIngestStats Stats + if err := json.Unmarshal(content, &nodeIngestStats); err != nil { + return errors.Wrap(err, "failure parsing Node Ingest Stats API response") + } + + for nodeId, nodeStats := range nodeIngestStats.Nodes { + if nodeStats.Ingest.Total.Count == 0 && nodeStats.Ingest.Total.Failed == 0 && nodeStats.Ingest.Total.TimeInMillis == 0 { + continue + } + + for pipelineId, pipelineStats := range nodeStats.Ingest.Pipelines { + if pipelineStats.Count == 0 && pipelineStats.Failed == 0 && pipelineStats.TimeInMillis == 0 { + continue + } + + event := mb.Event{ + ModuleFields: mapstr.M{}, + } + // Common fields + // TODO: make more complete with Node Info API - cluster.id + event.ModuleFields.Put("cluster.name", nodeIngestStats.ClusterName) + event.ModuleFields.Put("node.id", nodeId) + event.ModuleFields.Put("node.name", nodeStats.Name) + event.ModuleFields.Put("node.roles", nodeStats.Roles) + + // Pipeline fields + event.ModuleFields.Put("ingest.pipeline.name", pipelineId) + event.ModuleFields.Put("ingest.pipeline.total.count", pipelineStats.Count) + event.ModuleFields.Put("ingest.pipeline.total.failed", pipelineStats.Failed) + event.ModuleFields.Put("ingest.pipeline.total.total_cpu_time", pipelineStats.TimeInMillis) + + selfCpuTime := pipelineStats.TimeInMillis + for _, processorObj := range pipelineStats.Processors { + // processorObj has a single key with the processor type + for pType, processorStats := range processorObj { + if pType == "pipeline" { + selfCpuTime -= processorStats.Stats.TimeInMillis + + // TODO: add events for processors + } + break + } + } + + event.ModuleFields.Put("ingest.pipeline.total.self_cpu_time", selfCpuTime) + r.Event(event) + } + } + + return nil +} diff --git a/metricbeat/module/elasticsearch/ingest/ingest.go b/metricbeat/module/elasticsearch/ingest/ingest.go new file mode 100644 index 000000000000..5cda618763f4 --- /dev/null +++ b/metricbeat/module/elasticsearch/ingest/ingest.go @@ -0,0 +1,93 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package ingest + +import ( + "net/url" + + "github.com/pkg/errors" + + "github.com/elastic/beats/v7/libbeat/common/cfgwarn" + "github.com/elastic/beats/v7/metricbeat/mb" + "github.com/elastic/beats/v7/metricbeat/module/elasticsearch" +) + +// init registers the MetricSet with the central registry as soon as the program +// starts. The New function will be called later to instantiate an instance of +// the MetricSet for each host defined in the module's configuration. After the +// MetricSet has been created then Fetch will begin to be called periodically. +func init() { + mb.Registry.MustAddMetricSet(elasticsearch.ModuleName, "ingest", New, + mb.WithHostParser(elasticsearch.HostParser), + mb.DefaultMetricSet(), + ) +} + +const ( + statsPath = "/_nodes/stats/ingest" +) + +// MetricSet type defines all fields of the MetricSet +type MetricSet struct { + *elasticsearch.MetricSet +} + +// New creates a new instance of the MetricSet. New is responsible for unpacking +// any MetricSet specific configuration options if there are any. +func New(base mb.BaseMetricSet) (mb.MetricSet, error) { + cfgwarn.Beta("The elasticsearch ingest metricset is beta.") + ms, err := elasticsearch.NewMetricSet(base, statsPath) + if err != nil { + return nil, err + } + + return &MetricSet{MetricSet: ms}, nil +} + +// Fetch methods implements the data gathering and data conversion to the right +// format. It publishes the event which is then forwarded to the output. In case +// of an error set the Error field of mb.Event or simply call report.Error(). +func (m *MetricSet) Fetch(report mb.ReporterV2) error { + shouldSkip, err := m.ShouldSkipFetch() + if err != nil { + return err + } + if shouldSkip { + return nil + } + + uri, err := url.Parse(m.GetURI()) + if err != nil { + return err + } + + uri.Path = statsPath + m.HTTP.SetURI(uri.String()) + + content, err := m.HTTP.FetchContent() + if err != nil { + return err + } + + info, err := elasticsearch.GetInfo(m.HTTP, m.HostData().SanitizedURI) + if err != nil { + return errors.Wrap(err, "failed to get info from Elasticsearch") + } + + return eventsMapping(report, m.HTTP, *info, content, m.XPackEnabled) +} From ed0762aa6ba3a38a0d004a6029fb78c507c183a1 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Wed, 14 Dec 2022 20:02:36 +0100 Subject: [PATCH 06/21] Add processor level metrics with sampling --- metricbeat/docs/fields.asciidoc | 83 +++++++++++++++++++ .../docs/modules/elasticsearch.asciidoc | 2 + .../modules/elasticsearch/ingest.asciidoc | 1 + metricbeat/metricbeat.reference.yml | 2 + .../elasticsearch/_meta/config.reference.yml | 1 + metricbeat/module/elasticsearch/fields.go | 2 +- .../elasticsearch/ingest/_meta/fields.yml | 14 ++++ .../module/elasticsearch/ingest/data.go | 56 ++++++++++--- .../module/elasticsearch/ingest/ingest.go | 54 ++++++++++-- 9 files changed, 193 insertions(+), 22 deletions(-) diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index 46a0f32e6396..2a439e41479b 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -29995,6 +29995,16 @@ type: keyword Node name. +type: keyword + +-- + +*`elasticsearch.node.roles`*:: ++ +-- +Node roles. + + type: keyword -- @@ -31677,6 +31687,79 @@ type: long -- + +*`elasticsearch.ingest.pipeline.name`*:: ++ +-- +type: wildcard + +-- + + +*`elasticsearch.ingest.pipeline.total.count`*:: ++ +-- +type: long + +-- + +*`elasticsearch.ingest.pipeline.total.failed`*:: ++ +-- +type: long + +-- + +*`elasticsearch.ingest.pipeline.total.total_cpu_time`*:: ++ +-- +type: long + +-- + +*`elasticsearch.ingest.pipeline.total.self_cpu_time`*:: ++ +-- +type: long + +-- + + +*`elasticsearch.ingest.pipeline.processor.type`*:: ++ +-- +type: keyword + +-- + +*`elasticsearch.ingest.pipeline.processor.order_index`*:: ++ +-- +type: long + +-- + +*`elasticsearch.ingest.pipeline.processor.count`*:: ++ +-- +type: long + +-- + +*`elasticsearch.ingest.pipeline.processor.failed`*:: ++ +-- +type: long + +-- + +*`elasticsearch.ingest.pipeline.processor.total_cpu_time`*:: ++ +-- +type: long + +-- + [float] === ml.job diff --git a/metricbeat/docs/modules/elasticsearch.asciidoc b/metricbeat/docs/modules/elasticsearch.asciidoc index 7c2fff02a6f0..fcb2e955e218 100644 --- a/metricbeat/docs/modules/elasticsearch.asciidoc +++ b/metricbeat/docs/modules/elasticsearch.asciidoc @@ -64,6 +64,7 @@ metricbeat.modules: #- index #- index_recovery #- index_summary + #- ingest #- shard #- ml_job period: 10s @@ -73,6 +74,7 @@ metricbeat.modules: #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true + #ingest.processor_sample_rate: 0.25 #xpack.enabled: false #scope: node ---- diff --git a/metricbeat/docs/modules/elasticsearch/ingest.asciidoc b/metricbeat/docs/modules/elasticsearch/ingest.asciidoc index 6224ac5f159c..a42c18705892 100644 --- a/metricbeat/docs/modules/elasticsearch/ingest.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/ingest.asciidoc @@ -11,6 +11,7 @@ beta[] include::../../../module/elasticsearch/ingest/_meta/docs.asciidoc[] +This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/metricbeat/metricbeat.reference.yml b/metricbeat/metricbeat.reference.yml index 21be41101b47..0b5bf1edcc6d 100644 --- a/metricbeat/metricbeat.reference.yml +++ b/metricbeat/metricbeat.reference.yml @@ -275,6 +275,7 @@ metricbeat.modules: #- index #- index_recovery #- index_summary + #- ingest #- shard #- ml_job period: 10s @@ -284,6 +285,7 @@ metricbeat.modules: #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true + #ingest.processor_sample_rate: 0.25 #xpack.enabled: false #scope: node diff --git a/metricbeat/module/elasticsearch/_meta/config.reference.yml b/metricbeat/module/elasticsearch/_meta/config.reference.yml index 7557e1a23284..a932a37f3130 100644 --- a/metricbeat/module/elasticsearch/_meta/config.reference.yml +++ b/metricbeat/module/elasticsearch/_meta/config.reference.yml @@ -15,5 +15,6 @@ #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true + #ingest.processor_sample_rate: 0.25 #xpack.enabled: false #scope: node diff --git a/metricbeat/module/elasticsearch/fields.go b/metricbeat/module/elasticsearch/fields.go index 13ff3cd2a730..2983b368b644 100644 --- a/metricbeat/module/elasticsearch/fields.go +++ b/metricbeat/module/elasticsearch/fields.go @@ -32,5 +32,5 @@ func init() { // AssetElasticsearch returns asset data. // This is the base64 encoded zlib format compressed contents of module/elasticsearch. func AssetElasticsearch() string { - return "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" + return "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" } diff --git a/metricbeat/module/elasticsearch/ingest/_meta/fields.yml b/metricbeat/module/elasticsearch/ingest/_meta/fields.yml index 5c07c1a0e9a1..f999c9d934d7 100644 --- a/metricbeat/module/elasticsearch/ingest/_meta/fields.yml +++ b/metricbeat/module/elasticsearch/ingest/_meta/fields.yml @@ -1,3 +1,4 @@ +# TODO: add descriptions to each field - name: ingest.pipeline type: group release: beta @@ -15,3 +16,16 @@ type: long - name: self_cpu_time type: long + - name: processor + type: group + fields: + - name: type + type: keyword + - name: order_index + type: long + - name: count + type: long + - name: failed + type: long + - name: total_cpu_time + type: long diff --git a/metricbeat/module/elasticsearch/ingest/data.go b/metricbeat/module/elasticsearch/ingest/data.go index 831452c636ce..ad63e2906fb1 100644 --- a/metricbeat/module/elasticsearch/ingest/data.go +++ b/metricbeat/module/elasticsearch/ingest/data.go @@ -22,7 +22,6 @@ import ( "github.com/pkg/errors" - "github.com/elastic/beats/v7/metricbeat/helper" "github.com/elastic/beats/v7/metricbeat/mb" "github.com/elastic/beats/v7/metricbeat/module/elasticsearch" "github.com/elastic/elastic-agent-libs/mapstr" @@ -58,47 +57,68 @@ type PipelineStat struct { } `json:"processors"` } -func eventsMapping(r mb.ReporterV2, httpClient *helper.HTTP, info elasticsearch.Info, content []byte, isXpack bool) error { +func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isXpack bool, sampleProcessors bool) error { var nodeIngestStats Stats if err := json.Unmarshal(content, &nodeIngestStats); err != nil { return errors.Wrap(err, "failure parsing Node Ingest Stats API response") } for nodeId, nodeStats := range nodeIngestStats.Nodes { + // If there are no ingest stats on this node, don't create any events if nodeStats.Ingest.Total.Count == 0 && nodeStats.Ingest.Total.Failed == 0 && nodeStats.Ingest.Total.TimeInMillis == 0 { continue } for pipelineId, pipelineStats := range nodeStats.Ingest.Pipelines { + // If there are no metrics on this node for this pipeline, don't create any events if pipelineStats.Count == 0 && pipelineStats.Failed == 0 && pipelineStats.TimeInMillis == 0 { continue } + // Create the overall pipeline event event := mb.Event{ ModuleFields: mapstr.M{}, } + // Common fields - // TODO: make more complete with Node Info API - cluster.id - event.ModuleFields.Put("cluster.name", nodeIngestStats.ClusterName) - event.ModuleFields.Put("node.id", nodeId) - event.ModuleFields.Put("node.name", nodeStats.Name) - event.ModuleFields.Put("node.roles", nodeStats.Roles) - - // Pipeline fields - event.ModuleFields.Put("ingest.pipeline.name", pipelineId) + addCommonFields(&event, &info, nodeId, &nodeStats, pipelineId) + + // Pipeline metrics event.ModuleFields.Put("ingest.pipeline.total.count", pipelineStats.Count) event.ModuleFields.Put("ingest.pipeline.total.failed", pipelineStats.Failed) event.ModuleFields.Put("ingest.pipeline.total.total_cpu_time", pipelineStats.TimeInMillis) + // Self time subtracts any processor pipelines selfCpuTime := pipelineStats.TimeInMillis - for _, processorObj := range pipelineStats.Processors { - // processorObj has a single key with the processor type + for pIdx, processorObj := range pipelineStats.Processors { for pType, processorStats := range processorObj { if pType == "pipeline" { selfCpuTime -= processorStats.Stats.TimeInMillis + } + + // Skip when this fetch should not sample processors + if !sampleProcessors { + continue + } - // TODO: add events for processors + // Create the processor event + processorEvent := mb.Event{ + ModuleFields: mapstr.M{}, } + + // Common fields + addCommonFields(&processorEvent, &info, nodeId, &nodeStats, pipelineId) + + // Processor metrics + processorEvent.ModuleFields.Put("ingest.pipeline.processor.order_index", pIdx) + processorEvent.ModuleFields.Put("ingest.pipeline.processor.type", pType) + processorEvent.ModuleFields.Put("ingest.pipeline.processor.count", processorStats.Stats.Count) + processorEvent.ModuleFields.Put("ingest.pipeline.processor.failed", processorStats.Stats.Failed) + processorEvent.ModuleFields.Put("ingest.pipeline.processor.total_cpu_time", processorStats.Stats.TimeInMillis) + r.Event(processorEvent) + + // processorObj has a single key with the processor type, so break early + // Any other format would not be expected and would likely break dashboards break } } @@ -110,3 +130,13 @@ func eventsMapping(r mb.ReporterV2, httpClient *helper.HTTP, info elasticsearch. return nil } + +func addCommonFields(event *mb.Event, info *elasticsearch.Info, nodeId string, nodeStats *NodeStats, pipelineId string) { + event.ModuleFields.Put("cluster.id", info.ClusterID) + event.ModuleFields.Put("cluster.name", info.ClusterName) + event.ModuleFields.Put("node.id", nodeId) + event.ModuleFields.Put("node.name", nodeStats.Name) + event.ModuleFields.Put("node.roles", nodeStats.Roles) + + event.ModuleFields.Put("ingest.pipeline.name", pipelineId) +} \ No newline at end of file diff --git a/metricbeat/module/elasticsearch/ingest/ingest.go b/metricbeat/module/elasticsearch/ingest/ingest.go index 5cda618763f4..ab43719ee91a 100644 --- a/metricbeat/module/elasticsearch/ingest/ingest.go +++ b/metricbeat/module/elasticsearch/ingest/ingest.go @@ -18,6 +18,7 @@ package ingest import ( + "math" "net/url" "github.com/pkg/errors" @@ -39,30 +40,60 @@ func init() { } const ( - statsPath = "/_nodes/stats/ingest" + statsPathCluster = "/_nodes/stats/ingest" + statsPathNode = "/_nodes/_local/stats/ingest" ) -// MetricSet type defines all fields of the MetricSet -type MetricSet struct { +// IngestMetricSet type defines all fields of the IngestMetricSet +type IngestMetricSet struct { *elasticsearch.MetricSet + + // fetchCounter counts the number of times the Fetch method has been called. + // Used for sampling + fetchCounter int + + // Rate at which processor level events should be sampled + sampleProcessorsEveryN int } // New creates a new instance of the MetricSet. New is responsible for unpacking // any MetricSet specific configuration options if there are any. func New(base mb.BaseMetricSet) (mb.MetricSet, error) { cfgwarn.Beta("The elasticsearch ingest metricset is beta.") - ms, err := elasticsearch.NewMetricSet(base, statsPath) + ms, err := elasticsearch.NewMetricSet(base, statsPathCluster) if err != nil { return nil, err } - return &MetricSet{MetricSet: ms}, nil + config := struct { + ProcessorSampleRate float64 `config:"ingest.processor_sample_rate"` + }{ + ProcessorSampleRate: 0.25, + } + if err := base.Module().UnpackConfig(&config); err != nil { + return nil, err + } + + var sampleProcessorsEveryN int + if config.ProcessorSampleRate == 0 { + sampleProcessorsEveryN = 0 + } else { + sampleProcessorsEveryN = int(math.Round(1.0 / math.Min(1.0, config.ProcessorSampleRate))) + } + + base.Logger().Debugf("Sampling ingest processor stats every %d fetches", sampleProcessorsEveryN) + + return &IngestMetricSet{ + MetricSet: ms, + fetchCounter: 0, + sampleProcessorsEveryN: sampleProcessorsEveryN, + }, nil } // Fetch methods implements the data gathering and data conversion to the right // format. It publishes the event which is then forwarded to the output. In case // of an error set the Error field of mb.Event or simply call report.Error(). -func (m *MetricSet) Fetch(report mb.ReporterV2) error { +func (m *IngestMetricSet) Fetch(report mb.ReporterV2) error { shouldSkip, err := m.ShouldSkipFetch() if err != nil { return err @@ -76,7 +107,11 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { return err } - uri.Path = statsPath + if m.Scope == elasticsearch.ScopeCluster { + uri.Path = statsPathCluster + } else { + uri.Path = statsPathNode + } m.HTTP.SetURI(uri.String()) content, err := m.HTTP.FetchContent() @@ -89,5 +124,8 @@ func (m *MetricSet) Fetch(report mb.ReporterV2) error { return errors.Wrap(err, "failed to get info from Elasticsearch") } - return eventsMapping(report, m.HTTP, *info, content, m.XPackEnabled) + m.fetchCounter++ // It's fine if this overflows, it's only used for modulo + sampleProcessors := m.fetchCounter % m.sampleProcessorsEveryN == 0 + m.Logger().Debugf("Sampling ingest processor stats: %v", sampleProcessors) + return eventsMapping(report, *info, content, m.XPackEnabled, sampleProcessors) } From a0880397cb0ade287b9a8417f3906b3a96025f10 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Wed, 14 Dec 2022 20:04:28 +0100 Subject: [PATCH 07/21] mage fmt --- metricbeat/module/elasticsearch/ingest/data.go | 2 +- metricbeat/module/elasticsearch/ingest/ingest.go | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/metricbeat/module/elasticsearch/ingest/data.go b/metricbeat/module/elasticsearch/ingest/data.go index ad63e2906fb1..5d2fee4fe18c 100644 --- a/metricbeat/module/elasticsearch/ingest/data.go +++ b/metricbeat/module/elasticsearch/ingest/data.go @@ -139,4 +139,4 @@ func addCommonFields(event *mb.Event, info *elasticsearch.Info, nodeId string, n event.ModuleFields.Put("node.roles", nodeStats.Roles) event.ModuleFields.Put("ingest.pipeline.name", pipelineId) -} \ No newline at end of file +} diff --git a/metricbeat/module/elasticsearch/ingest/ingest.go b/metricbeat/module/elasticsearch/ingest/ingest.go index ab43719ee91a..f5023df444ce 100644 --- a/metricbeat/module/elasticsearch/ingest/ingest.go +++ b/metricbeat/module/elasticsearch/ingest/ingest.go @@ -41,7 +41,7 @@ func init() { const ( statsPathCluster = "/_nodes/stats/ingest" - statsPathNode = "/_nodes/_local/stats/ingest" + statsPathNode = "/_nodes/_local/stats/ingest" ) // IngestMetricSet type defines all fields of the IngestMetricSet @@ -84,8 +84,8 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { base.Logger().Debugf("Sampling ingest processor stats every %d fetches", sampleProcessorsEveryN) return &IngestMetricSet{ - MetricSet: ms, - fetchCounter: 0, + MetricSet: ms, + fetchCounter: 0, sampleProcessorsEveryN: sampleProcessorsEveryN, }, nil } @@ -125,7 +125,7 @@ func (m *IngestMetricSet) Fetch(report mb.ReporterV2) error { } m.fetchCounter++ // It's fine if this overflows, it's only used for modulo - sampleProcessors := m.fetchCounter % m.sampleProcessorsEveryN == 0 + sampleProcessors := m.fetchCounter%m.sampleProcessorsEveryN == 0 m.Logger().Debugf("Sampling ingest processor stats: %v", sampleProcessors) return eventsMapping(report, *info, content, m.XPackEnabled, sampleProcessors) } From 3e2c253174950b5905e33806aa75613254c57805 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Mon, 16 Jan 2023 12:34:57 +0100 Subject: [PATCH 08/21] Add unit tests for event mapper --- metricbeat/docs/fields.asciidoc | 7 + metricbeat/module/elasticsearch/fields.go | 2 +- .../elasticsearch/ingest/_meta/fields.yml | 2 + .../ingest/_meta/test/stats.json | 94 +++++++++++ .../module/elasticsearch/ingest/data.go | 35 ++-- .../module/elasticsearch/ingest/data_test.go | 151 ++++++++++++++++++ 6 files changed, 274 insertions(+), 17 deletions(-) create mode 100644 metricbeat/module/elasticsearch/ingest/_meta/test/stats.json create mode 100644 metricbeat/module/elasticsearch/ingest/data_test.go diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index 2a439e41479b..d542f01d6b1e 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -31732,6 +31732,13 @@ type: keyword -- +*`elasticsearch.ingest.pipeline.processor.type_tag`*:: ++ +-- +type: keyword + +-- + *`elasticsearch.ingest.pipeline.processor.order_index`*:: + -- diff --git a/metricbeat/module/elasticsearch/fields.go b/metricbeat/module/elasticsearch/fields.go index 2983b368b644..e581c95a2ba9 100644 --- a/metricbeat/module/elasticsearch/fields.go +++ b/metricbeat/module/elasticsearch/fields.go @@ -32,5 +32,5 @@ func init() { // AssetElasticsearch returns asset data. // This is the base64 encoded zlib format compressed contents of module/elasticsearch. func AssetElasticsearch() string { - return "eJzsXUuP3Tpy3vtXEF7NALaA2XqRCTCZSRzgXlzkerIJAg1bqnMObUmUKardnV8fiNSDkviUKPVpT3t1b3frq6+Kr2KxWPyIvsHzJwQFbjjJGsAsu71DiBNewCf0/q/qz9+/QyiHJmOk5oRWn9C/vEMIodnfoJLmbQHvEGJQAG7gE7ridwg1wDmprs0n9D/vm6Z4/wG9v3Fev//f7nc3ynia0epCrp/QBRdN9/2FQJE3n4SIj6jCJXxCpMrhKWWQ0Udgz+JXCPHnupPCaFv3P1E/VT9vbpjlTdJwzHjKSQkpqdKSFAVpxr8d8HBBsPrTGvPbwk6JoJMMdBTcpGzMwml9iOwedhA9iuU4+5Y2HPMm2F64LpMLbat8E8OsaBsOLBGyE8EjWSMOsp7q7vdZxhKo8EMB8WSakdey8SMmRfdHB0ifYw+yC5JB1UB4X+aYt9u6zpxmTyBZAA5yOtiIUka42bAI1r5mpMTjDBBGTEhMlgiqXbcpLHHn388mrh3jvENZgVY038a0+zAh63GgtsUW3au2fAA2a96+F2ycgEiVkwzWvVz9Vvf9jAFtKz77jUkxk3LzntxzSjjluNBK7Gf69R/EEdzDz/VS+0QEe0UnL3gl67YYpH59LLXSlsxN7FWsEj+lbW1cY93qhKj09bFMJoHqwr+iBWVyA1ynbQN5x+zhmcPBxKCk7FlITTqpiV7kimGn0OkES/yk8NNNIOGrpJCU3nBzi7Ogc0g0kIO0R2ANoVU0UUu8qYMLk2ye/3WydJizNTFtWxLJKePS21hARvdsFKDRmyElNByX9TsTtIR9/6/jX77XdkeFuQlDT63/bFSWtiwD1ez+nXtzg5jW/5mXEQw4fj3O6fRBrvtJ91+B9iqL7quluSbIC2WQ4YY3/f+rC1aQBDPQfNe52YOZOX6eLp7e+HPvl+xc6BtOGSQN+T8wzfVhC75UY+SWuPAHHjnNdJ7BXvEG2FF7uJZQ8SMkW6AH6QwuDJqb7GzmcMB+Lt6CJh+AXQfvNj2uc3iKmQ0jUl2j+YhyTOu8XLtuvvoNhBOboAWZ+A6ri5Vd4rho3hjlvIBTGbqEjuQWlg2fB7+3wJ7TDGc36P3R6P1ekEyCBA3sBPMcc3wstwAx0xz2vYWGn2G5QFGnzGWSWeA8dvC8P1grcM4/xhOQZHy9gFcyw0ul7ml21zO6l5l9wc5H4OSh9YdRax5b+oOcfY/pD/2PbCIWNI6195yPj6mlxxrN2BxY2aT9RB01kjRXs3e0/cSN2ydKKn4iO095toB1RDZ6eGUzlj7iooUT7RMgc4rrndq//MTNltM8lWPkPJJhYif/8gny9IHwtAF+Htkwseq0kj5Cxik7eXbxlrqIBaclrs9jGiJ07p78YIQDO49pkFTlfOIcdktBs3BglrEUt5ymF1oU9MfGwKA8K03pJb1gUnTjVqKZjjy9wt8ZSxRmiURO5simg8MlHwYl5ZDOzl/SfiMWlZ5VkJNt02YZNM2lLY6wYI/uZ0L5R8CS0YI432+x0RKjuXCuEFB75baeKM6T061nOxlLRr1XWQBotvVVm3mHObQwYzoN4BxYuj3fopMhQZI5yLKVd8oYjaaX0utxLegDLtLsBtk34Ubu1ckMuJBc4qe0ge9pRfeK1CCtbBlPz9Gubk1H6RF0HcVatO0+GuYDyHdb14o2yKQtbziuclJdY89HCvRyUjIxEOv9QRQEtoGDlPvQXi7dolEDw7xzk5ZboTAWKmgygvowMEXDdsjvIBfZHZpuXtddK+xKU5j3dT3gSvKQ/RtPtBFxJVtAQ0TRJsDZiYQcbCL0siPJt5M7RXHlKNOkFisS++URniA7RLqCr01ynryxyLPNhGybbM70vFS54/BvhOz9nWwC9BTbzQYcInRvC+YgVswz+xTVQMx7s5zdIndhuUbY+23sNUrpuLYlqu+5saX3XVeVPNs2VDSHjfuGy5peyLGrOcN0S8B5TK63RQeMqUt9SlHXWGWJ2fOUq2/ImLRHGuY9OQohGaAIJTN173KRLh/J2kZGL2LqCGz22ZnQ2Vjab2j7cZUO0YaKtEuH9s98bDZo2xtNWbJMRxjIGaJT4wU4T+OzFKtpZKpy0o7PVc7aO8jGvEchjheidWxbsoFJG29LjjclxtwDR+K75U/OoBI5E1Ij3pEMeVTyheuU25O9JrlBd9HCb6Ww54VsZCSG65aD2/BMjFCGM+Qws61y0KL1D49ssQBdl8lrm9dvJUPvTlVd5xBuVnaWVHen6uoS/7Z7wYckFEUar6uUne0znD3TaROfTfPbYdlFJiLeqllTYfyMHJQoE0psAt/a59GOFI9QtjP8GIQDUxJC+arwMejGZxiBlG+GVCg1gRuDoHcWXihDCRyDYmgiVyjTGX4MwoH5UaF8VfhYdI/iGYVgWBJXKE0FfQvZ8U7k7Op8+Mb+mkVcmItCdo9jYlZFbg1+mLBd+BoVdMfDy3+O9v76WCbXLJlsktAiTyZ8azQHeYSfDLSdHmks/loH1Zf8QPyZtqu4wxzj3ltVaPCq23WlwaaWVdyhaBOKTzUKD3WHwhaLGhN+eq34uOp3hBCyVOUIZVQDy2DLvmhNqM58t0Wzc8RZDqFP4QE7Jt0XsM7qNlo/LCjOU/wIDF+XoRI7sA1cFfCn5ZgZ/jnajjZJVrdJz++aGHFcozbTsd/hCdQtziy9aI+t2gZfIa1wRTeetHRGEwSSnmYiIBPjyY3PQFx3tzjaZpcm/d5SjtOSZCyKykl2aRKBmbRbVEazPRK2n0jFWL6ndG8ocN1PdoTmO1bBuUG6nyUL7Kjr+KSBKCyTDlF5k0O7TYMFdlQNhPsxQluH33byCnfjYHQRn4dljhmTtOKMFqmtb3sboN/6+WD6DsqClITbXJQtBAWo0VcJoScn8Mj05BQeSm+MRjGaQXM/DsdmZ65XRAyrcDeO30TaRU3pvpoaD23xLZotvrfQ6rwuhyUUXZKOTyJwdgX9GXyFjGsn7VAyA9TmU5Ur6LMEXsjCV+B3Y+COy277Lq/3vLiF5U3Fe7HxUH96p5Xjn8nuNfN08HkXdu5/u9vQ4rjrnuwsk9vuxcySTbCVFwl2GzOpU1zsW251BQHNSCY05M4Is4PagFfgxgQF5LUxMd/lHlJ5TWXPLLuiwPS1w5nq8kCOyZ/XzsN2SBss8k5HQZFsuC5849HOnik8B3J0FY3+CcahrkCV5gL7DCJ4Ch3K61a6Kqrf4PkHnVW21zxjMvybP2fS4wopiVGqJqQdQSbJzRJlFeW4cgWmVqq20nTIAkWWy7OJrINw9+9XmgP6/G9aOYvmjyFp3vKqMEYLw4q7XZrA1IuTFbq18h4oLQBXYfI+N4jfQLSt+A+JL/7/z3oCBc2+zV2V/RQGUNQ/zoJoNdL687r7Z+vKEct+aJH5F0ab5uMwvhjUBcnE1Qq0vLYzf71o+Gfr4sb6FsjaLax3KqdPC7pYA8ZQn6OogAeEpgDI9BWpOFwVfcy+iFhHozkky7vOTm1WHxuuKgcBrS6MWr829Aucp/CUQa27GyRRKtF4hs9XV0HRPk9vvI96iE+hua2sE6G1OlpZfiPQmPkqbr/+/HoqdTB+PmW1w0ItfhFvaLivgdmbwVAEJFw9pQZVNO0OHAzW8lhOC+gQQ4qCeQtYTIF3aAr9Ei/qKEXrB7rANnK4rsjty3X/fsUlIHrpGRskTf6spuqSxTZBTH7BT6RsS9R0XabKoD+A78iNo3RwNXu2y9fP5mxtFaospLUNOtTaeE1NOnB2NKq2BJzVQmFsxlbsGk4IQz8IvxHZknZu1mop8RlO4iQvyNEfhi0H5H/sPGsqWI+mlfpcGC39+6UIXjWkyiDttwIb/GYvzb6QEj4gUqGy+YCExDn7Tjy6AM9usFIi9rAKIv7vQgaaZCBxt6ob/nPT3/9U5c3XVOnLg/QUEjYW7QpAMZffCgCxV0OyQukCZ+40D1sMoY8e7I8Y6E3iDhUsnyg1q2FigBaxvdUTeW4yaBWZWr5HF4bh6h+u77Vv1Lkh1M9XuZDewTy1T7QN+sOVAVQf0DN0o/UDYpD/UR/TWz7XiaxNOZP5a/epkEhEDDfxavfRBWmspW6MY1L53lW4x4mhH8WW6WCm/5eOvjJXClN2y9Mw0g1StWFUf7HT+i6BPkJBruShAG8CmkIKW8R3MN4y18+r2vc65p2OuiSa3zx1qLRM0nRfztgAZ71a4QyKrkvmIP+xqYl0S7jN49VZysY52vTHfL79Tue6LEdgbzKP7iifMA7qkU42vwvn2Wxf90ooiuTYK25ZvZQAryRAr7WdpfUsZnYnhhxBq39R3U1vXEP8yrbs6aK/CGDUTQXoQpkiUh9pmT3GPyfg71uNJ9pPNWHPad45Jub0AufA1bomdudkHPPzx/tdHyoSs3jpu7gukwttK7Njpj87nBCeapx9k7X5B58jAlZ/4OiNNDZrxUi2fk86YAvxV4EQYQcBT5C13SYtrWlBsngFHjXn6MjbFee4WfYeOxsbI0sOgQrr8AsMlNwRsrETi4uxuyAyXGVQmHqvq/8qczpmUPG0U2l9aBtGSXNiqwKYr6LYL24p8wjjtsvEjsMA5TigrSpSXZMKa0MwVrRZzqpwobTDRMPClbAxrcgygWY4n0B9OFJKtIxccWDffQp6xyM+M37DvJ/BhjsvlDXohh9h5NQH90RiiGjCtjYkwMhDmuhH1FnLmP7yy16f5S8SWQ2xTUenvT6jscxu1QYnMTR4bKbl106mo4HgxWoJEL5KZQzwOkHbMVpvJM9XAXrzFGndWWzviTt2Axtc7+FTTRQregTrmIy5z11nsaTMxU9Uv4PEZedhdnCasSO5yVy3MY7injUcAywAjySzlUb2hLkRbq3f4glTkqbZijNv09fUBndkPPeD055AxorJId/nUID+ApHXKZm2uCWK0gliNJezbFkAmG/BtgDI0Bp7gWwDquEFIPsWVwyA9C6HGIAZVKM0ADewPmcAcljBvQDg0BqoDuhpLfZ+zz8QEZ44sKoDjQZdArsOG03nwuKBdxd3kzw7617nS0X0r9VuAbXtMLZ7w1vXw00B/5xmrVj7kJp+Zd41b19st9GTkoJp+jknF8pKzPt7GwdoM+jT8Rjy3QTxTgsh1KzBMb5psGfqFZm17wy8IOyOrd+5sd2p9ZgMl4dZMSbYCdNmpbctow3mjnY9sdffV+V8HLpPiuIquud05Dt1rxejUjmIfniW2cu9RSwTOjp273XEnmPHWNtsXLkujnW1X2RPdMCW8MCtceTtEDpl133Y5jDufvafNzL9tiGMZEhN+TwUxYh+vkeA6vjxGhsuassIfZ0vMwahbeU3638Jg4w+wqw+6QsczcYtcnch64IYdkQbqopsLoeJPNJdVAdXWN1YdtezIzDoHLkInWnH6rLOY0FRTD2aKNKQlraK5Vy4XlS2YG068V4P/XU+k0New2m99UvM+LZPDQkE4alEMq16mK1m1YGQPdN0RxrBQmiHZMsn0Oc9bqpI84W1gMgimVkvu+HrxwB26Pxfg7YC12BlhqumoMsm3D5jm+dVz1TP7fkx/dJcpaKX+2NMKZ3sCjwRJqkp4ynOc7a+1e8xtCVQzBJVXwSkzMwyjhgp9kYbfR3f3YI7ZNQbBf0ho22RowdAn38bf0iZ+KOOj+F+Wk8ybpKQSnKeKqQfZ7RlGURo6B4oZkP/LiDtDd2LjdvQquAYDd2TjNvQKklzTtgjMHLpNtwxXVFx2Tv1ey/aY5oKgpg7+n0ZxJf18+Pn3b2dNMY8adxSdcgdr/ZWZcsho+cruvGs7Iryroh5val4tGn3HgGcF1uLUbbJXLbYC+qs0KmVWZz3Bn0e3rGchCgLkNWYDrDDA4pKZY4I3cc6FQbgGO81RW/jzS2zRMOP16hYNita4N7Skg6n9+YsvDkLTv7/FM6C+xk8WyRvDjY7g9vkfKx1fPNj3vyYIH1fpR9zB57HNOyu0PCkJjUUpHI/OTAGQh6A+4ZCjCGuH6TIs2VVvWP8oR03lhxVfD1iWVnd6kq1e2I0UFw2QEyBqP7OeTRbak6ekPf5BWU5MG3o0dMcr6glx2TJIvlKH5xjy+K0lIVuDPonHUQMwP+9It9bQGWBvtIHcwjeWDFxk9D/pA8SUi/tQhlkuOH9c2AhlR3GNqI5yDydaONkyNDWVxPyOT/JMccyBzrmO2OPuCC5LJK0YzD18wrkKYOMsnwL1qLdfxsgZak9eFzvJFTLJKoqWidi6xH8l5taE1bq14iyxwgIvwFDWOSnk+raMQFpdES7n4v/F0U/5LlQRTl6AFRj1kCuOXhbzRZeT/9YFFh8f3yVVL93dnpUfXOuqyWaO7hrqvjvX9Dn6kL9qv25tHZp7kFoIKU1AFrNF7KUIqksLz8fvTX+D8A16hjMdsOdDu6NsG95yVN0KPHTdhUqWr18U/xKq48RmmPQ5SVbZFTFv1UWa01ywHtYlwEcddiQi3Lr0mjamXl/Oevfx4KZCD/QliPA2a1PaKgQ1j9Nt8/9E5u8eP6/NQXphasvxMxlNlfFCgAxbjosGEpQLKgkrqvlDgvmDFnkVjVjhE72hE3WCSaviK4h+zgu3Y1HWEuY4YrCa+GrhCJlifad105PPXyDp24x6TYiw/HW/R683dFx1Ws7qBrOAAPOpPaeX246nxRCPciNN+0PWY8cTeZUHTmb7ryDv4jna+mu6Q1FPfybHasdXifhjK5wVs2HM3Q5/iptjE6t3Mrd/ULhkdUSpivwrsXEQ3mfqgnTLKvcOj9ZtnrH+2TRojTAyTJlaYeThc4KFpwsWy078AKiz5ap1EI4WLISFO8kiVhqtBDAQRHAAd5wS3f/FHrWKM7sa0hOW9NrApMY3R2/ZaPWlBbxAju0OMbq9geioljeuwbNL/jJp2pPDfjb3XD+DfA3X9LpPRlbEC/9LO549utc4n+XBwvWveczbQ/asN1TE76Nl7fxEme8NC17JI+rDDL0NmTugPPbkDmbuGnIqC7eNUsyWhRydxTTzRtgbakqL10Af0c0UCzNP5mO2k5yidcrjjuP31P8Z4k1PiQYo9Df6oa/n84eA/xvpADUPDccSosYb+OdFuhjsOv+Q4gs1zPUUQSOUUSaLjNu5hJ2928r/xin1J43XVDYxQ/xLP8x0CJmGwF7NEC8uS6r20N6QkFxnuLHa/Kn9bPdqowbLi7ppaB4bY6RoolHhIWrbnGW8aRt8BWSvcUV9bZ0M3Wxncm4NMn3lnKcaFPgPRmjxc0CJ5KNug99VSAUuG4gT2tghObuweCpD1okrSlXM48SoUgw9h1P+PmJ5PHdiFac0SJ1tasrVXuOWpDSktq7DVMOze2Yy5TXrG6TdVDaEoz2CULzW7d6pDWl8W7YHZZbKN90jeCzM/gKGXcMLw/v8wrmBKWfSlH7Lb2fStVj8x3uS1fh3v28qi4zs9KaQdO0LPbFvmM8PJlynmS0fCAV5GlGKctJhcWb87jK075O6mlH7WIXOwiV7bK9rvd2yaeqqxr9BXSeiT9VcQZ1QTL8AjoPkk9u5zsZZdOwP7/lB9kvpPLJDT+IxcVpsTnZ104UKPY1B73NNNpR3ktLahBP5qccN6r7r18JLfHXf+gA/yE2fphUDcKo/wXqfqEiqYcwW+7GNcB4KspSaB2E8NvjnwUkWkNOeztCGeH6Iurh8n7TwY2OragIrJW0o8Jwgv5GGYInXNZFp1DLP5a4rpd58LPgA6lS6R/6VtZ3X9MnpbhqIGBXPVQUkt/TJQVA33l29bHDaubzG2kQacTFC4/6+fL2Syzjz2okCCb20v0x64F8ETdNMAcf2QwKmsmlXdzgreLWVr/19bbF7RfRZX7gZhAKObowWvoRi1oQ34sW+szRDcsOBE8446jBJSCRq474DVda43VLA8poWWNOHkhB+DOqW1bTxnQiLiehdFGZAu3ahGla0WUyJUrXrmy9/vj/AwAA//9Bdivd" + return "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" } diff --git a/metricbeat/module/elasticsearch/ingest/_meta/fields.yml b/metricbeat/module/elasticsearch/ingest/_meta/fields.yml index f999c9d934d7..eb76a08d1349 100644 --- a/metricbeat/module/elasticsearch/ingest/_meta/fields.yml +++ b/metricbeat/module/elasticsearch/ingest/_meta/fields.yml @@ -21,6 +21,8 @@ fields: - name: type type: keyword + - name: type_tag + type: keyword - name: order_index type: long - name: count diff --git a/metricbeat/module/elasticsearch/ingest/_meta/test/stats.json b/metricbeat/module/elasticsearch/ingest/_meta/test/stats.json new file mode 100644 index 000000000000..11e250bfcccd --- /dev/null +++ b/metricbeat/module/elasticsearch/ingest/_meta/test/stats.json @@ -0,0 +1,94 @@ +{ + "_nodes": { + "total": 10, + "successful": 10, + "failed": 0 + }, + "cluster_name": "helloworld", + "nodes": { + "dYf4_OtUSG6-A06WCui3Ug": { + "timestamp": 1673866037740, + "name": "instance-0000000022", + "transport_address": "10.43.0.27:19883", + "host": "10.43.0.27", + "ip": "10.43.0.27:19883", + "roles": [ + "ingest", + "remote_cluster_client" + ], + "ingest": { + "total": { + "count": 288234496, + "time_in_millis": 15451943, + "current": 0, + "failed": 100 + }, + "pipelines": { + "pipeline1": { + "count": 19271022, + "time_in_millis": 823888, + "current": 0, + "failed": 100, + "processors": [ + { + "set:tag1": { + "type": "set", + "stats": { + "count": 19271022, + "time_in_millis": 256275, + "current": 0, + "failed": 100 + } + } + }, + { + "geoip:tag2": { + "type": "geoip", + "stats": { + "count": 19271022, + "time_in_millis": 189232, + "current": 0, + "failed": 0 + } + } + }, + { + "rename:tag3": { + "type": "rename", + "stats": { + "count": 19271022, + "time_in_millis": 12492, + "current": 0, + "failed": 0 + } + } + }, + { + "compound:CompoundProcessor-remove": { + "type": "conditional", + "stats": { + "count": 0, + "time_in_millis": 0, + "current": 0, + "failed": 0 + } + } + }, + { + "pipeline:pipeline2": { + "type": "pipeline", + "stats": { + "count": 19271022, + "time_in_millis": 4607, + "current": 0, + "failed": 0 + } + } + } + ] + } + } + } + } + } +} \ No newline at end of file diff --git a/metricbeat/module/elasticsearch/ingest/data.go b/metricbeat/module/elasticsearch/ingest/data.go index 5d2fee4fe18c..1a94fe1e4479 100644 --- a/metricbeat/module/elasticsearch/ingest/data.go +++ b/metricbeat/module/elasticsearch/ingest/data.go @@ -77,44 +77,47 @@ func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isX // Create the overall pipeline event event := mb.Event{ - ModuleFields: mapstr.M{}, + ModuleFields: mapstr.M{}, + MetricSetFields: mapstr.M{}, } // Common fields addCommonFields(&event, &info, nodeId, &nodeStats, pipelineId) // Pipeline metrics - event.ModuleFields.Put("ingest.pipeline.total.count", pipelineStats.Count) - event.ModuleFields.Put("ingest.pipeline.total.failed", pipelineStats.Failed) - event.ModuleFields.Put("ingest.pipeline.total.total_cpu_time", pipelineStats.TimeInMillis) + event.MetricSetFields.Put("pipeline.total.count", pipelineStats.Count) + event.MetricSetFields.Put("pipeline.total.failed", pipelineStats.Failed) + event.MetricSetFields.Put("pipeline.total.total_cpu_time", pipelineStats.TimeInMillis) // Self time subtracts any processor pipelines selfCpuTime := pipelineStats.TimeInMillis for pIdx, processorObj := range pipelineStats.Processors { - for pType, processorStats := range processorObj { - if pType == "pipeline" { + for pTypeTag, processorStats := range processorObj { + if processorStats.Type == "pipeline" { selfCpuTime -= processorStats.Stats.TimeInMillis } - // Skip when this fetch should not sample processors + // Skip creating the processor-level event when this fetch should not sample processors if !sampleProcessors { continue } - // Create the processor event + // Create a processor event processorEvent := mb.Event{ - ModuleFields: mapstr.M{}, + ModuleFields: mapstr.M{}, + MetricSetFields: mapstr.M{}, } // Common fields addCommonFields(&processorEvent, &info, nodeId, &nodeStats, pipelineId) // Processor metrics - processorEvent.ModuleFields.Put("ingest.pipeline.processor.order_index", pIdx) - processorEvent.ModuleFields.Put("ingest.pipeline.processor.type", pType) - processorEvent.ModuleFields.Put("ingest.pipeline.processor.count", processorStats.Stats.Count) - processorEvent.ModuleFields.Put("ingest.pipeline.processor.failed", processorStats.Stats.Failed) - processorEvent.ModuleFields.Put("ingest.pipeline.processor.total_cpu_time", processorStats.Stats.TimeInMillis) + processorEvent.MetricSetFields.Put("pipeline.processor.order_index", pIdx) + processorEvent.MetricSetFields.Put("pipeline.processor.type", processorStats.Type) + processorEvent.MetricSetFields.Put("pipeline.processor.type_tag", pTypeTag) + processorEvent.MetricSetFields.Put("pipeline.processor.count", processorStats.Stats.Count) + processorEvent.MetricSetFields.Put("pipeline.processor.failed", processorStats.Stats.Failed) + processorEvent.MetricSetFields.Put("pipeline.processor.total_cpu_time", processorStats.Stats.TimeInMillis) r.Event(processorEvent) // processorObj has a single key with the processor type, so break early @@ -123,7 +126,7 @@ func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isX } } - event.ModuleFields.Put("ingest.pipeline.total.self_cpu_time", selfCpuTime) + event.MetricSetFields.Put("pipeline.total.self_cpu_time", selfCpuTime) r.Event(event) } } @@ -138,5 +141,5 @@ func addCommonFields(event *mb.Event, info *elasticsearch.Info, nodeId string, n event.ModuleFields.Put("node.name", nodeStats.Name) event.ModuleFields.Put("node.roles", nodeStats.Roles) - event.ModuleFields.Put("ingest.pipeline.name", pipelineId) + event.MetricSetFields.Put("pipeline.name", pipelineId) } diff --git a/metricbeat/module/elasticsearch/ingest/data_test.go b/metricbeat/module/elasticsearch/ingest/data_test.go new file mode 100644 index 000000000000..b8ef8fc72a0c --- /dev/null +++ b/metricbeat/module/elasticsearch/ingest/data_test.go @@ -0,0 +1,151 @@ +// Licensed to Elasticsearch B.V. under one or more contributor +// license agreements. See the NOTICE file distributed with +// this work for additional information regarding copyright +// ownership. Elasticsearch B.V. licenses this file to you under +// the Apache License, Version 2.0 (the "License"); you may +// not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package ingest + +import ( + "io/ioutil" + "net/http" + "net/http/httptest" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/elastic/beats/v7/metricbeat/mb" + mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" + "github.com/elastic/beats/v7/metricbeat/module/elasticsearch" +) + +func createEsMuxer() *http.ServeMux { + mux := http.NewServeMux() + // mux.Handle("") + + return mux +} + +func TestData(t *testing.T) { + mux := createEsMuxer() + server := httptest.NewServer(mux) + defer server.Close() + + ms := mbtest.NewReportingMetricSetV2Error(t, getConfig(server.URL)) + err := mbtest.WriteEventsReporterV2Error(ms, t, "") + require.NoError(t, err) +} + +func TestMapper(t *testing.T) { + reporter := &mbtest.CapturingReporterV2{} + + info := elasticsearch.Info{ + ClusterID: "1234", + ClusterName: "helloworld", + } + + ingestData, err := ioutil.ReadFile("./_meta/test/stats.json") + require.NoError(t, err) + + err = eventsMapping(reporter, info, ingestData, true, true) + require.NoError(t, err) + require.Equal(t, 0, len(reporter.GetErrors())) + + // 1 pipeline, 5 processors + allEvents := reporter.GetEvents() + var pipelineEvents []mb.Event + var processorEvents []mb.Event + + for _, event := range allEvents { + if val, _ := event.MetricSetFields.GetValue("pipeline.processor"); val != nil { + processorEvents = append(processorEvents, event) + } else { + pipelineEvents = append(pipelineEvents, event) + } + } + + require.Equal(t, 6, len(allEvents)) + + t.Run("Test pipeline events", func(t *testing.T) { + require.Equal(t, 1, len(pipelineEvents)) + ev := pipelineEvents[0] + + requireMetricSetFields(t, ev, "pipeline.name", "pipeline1") + requireMetricSetFields(t, ev, "pipeline.total.count", 19271022) + requireMetricSetFields(t, ev, "pipeline.total.failed", 100) + requireMetricSetFields(t, ev, "pipeline.total.total_cpu_time", 823888) + requireMetricSetFields(t, ev, "pipeline.total.self_cpu_time", 823888-4607) // subtract out pipeline processor + }) + + t.Run("Test processor events", func(t *testing.T) { + require.Equal(t, 5, len(processorEvents)) + ev := processorEvents[0] + + // There's no special handling for different processors, so just test the first one + requireMetricSetFields(t, ev, "pipeline.name", "pipeline1") + requireMetricSetFields(t, ev, "pipeline.processor.order_index", 0) + requireMetricSetFields(t, ev, "pipeline.processor.type", "set") + requireMetricSetFields(t, ev, "pipeline.processor.type_tag", "set:tag1") + requireMetricSetFields(t, ev, "pipeline.processor.count", 19271022) + requireMetricSetFields(t, ev, "pipeline.processor.failed", 100) + requireMetricSetFields(t, ev, "pipeline.processor.total_cpu_time", 256275) + }) +} + +func TestSampling(t *testing.T) { + reporter := &mbtest.CapturingReporterV2{} + + info := elasticsearch.Info{ + ClusterID: "1234", + ClusterName: "helloworld", + } + + ingestData, err := ioutil.ReadFile("./_meta/test/stats.json") + require.NoError(t, err) + + err = eventsMapping(reporter, info, ingestData, true, false) // set sampling to false + require.NoError(t, err) + require.Equal(t, 0, len(reporter.GetErrors())) + + // 1 pipeline, 0 processors + allEvents := reporter.GetEvents() + var pipelineEvents []mb.Event + var processorEvents []mb.Event + + for _, event := range allEvents { + if val, _ := event.MetricSetFields.GetValue("pipeline.processor"); val != nil { + processorEvents = append(processorEvents, event) + } else { + pipelineEvents = append(pipelineEvents, event) + } + } + + require.Equal(t, 1, len(allEvents)) + require.Equal(t, 1, len(pipelineEvents)) + require.Equal(t, 0, len(processorEvents)) +} + +func getConfig(host string) map[string]interface{} { + return map[string]interface{}{ + "module": elasticsearch.ModuleName, + "metricsets": []string{"ingest"}, + "hosts": []string{host}, + } +} + +func requireMetricSetFields(t *testing.T, event mb.Event, fieldName string, expected interface{}) { + val, err := event.MetricSetFields.GetValue(fieldName) + require.NoError(t, err) + require.Equal(t, expected, val) +} From 00342d365e495ad6940b08ca4ccbb0a4b6bdbd69 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Mon, 16 Jan 2023 14:05:53 +0100 Subject: [PATCH 09/21] Remame pipeline time fields --- metricbeat/docs/fields.asciidoc | 6 +++--- metricbeat/module/elasticsearch/fields.go | 2 +- metricbeat/module/elasticsearch/ingest/_meta/fields.yml | 6 +++--- metricbeat/module/elasticsearch/ingest/data.go | 6 +++--- metricbeat/module/elasticsearch/ingest/data_test.go | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index d542f01d6b1e..a64c8f9daced 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -31710,14 +31710,14 @@ type: long -- -*`elasticsearch.ingest.pipeline.total.total_cpu_time`*:: +*`elasticsearch.ingest.pipeline.total.total_time`*:: + -- type: long -- -*`elasticsearch.ingest.pipeline.total.self_cpu_time`*:: +*`elasticsearch.ingest.pipeline.total.self_time`*:: + -- type: long @@ -31760,7 +31760,7 @@ type: long -- -*`elasticsearch.ingest.pipeline.processor.total_cpu_time`*:: +*`elasticsearch.ingest.pipeline.processor.total_time`*:: + -- type: long diff --git a/metricbeat/module/elasticsearch/fields.go b/metricbeat/module/elasticsearch/fields.go index e581c95a2ba9..4d328115a936 100644 --- a/metricbeat/module/elasticsearch/fields.go +++ b/metricbeat/module/elasticsearch/fields.go @@ -32,5 +32,5 @@ func init() { // AssetElasticsearch returns asset data. // This is the base64 encoded zlib format compressed contents of module/elasticsearch. func AssetElasticsearch() string { - return "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" + return "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" } diff --git a/metricbeat/module/elasticsearch/ingest/_meta/fields.yml b/metricbeat/module/elasticsearch/ingest/_meta/fields.yml index eb76a08d1349..83a5f696f9e4 100644 --- a/metricbeat/module/elasticsearch/ingest/_meta/fields.yml +++ b/metricbeat/module/elasticsearch/ingest/_meta/fields.yml @@ -12,9 +12,9 @@ type: long - name: failed type: long - - name: total_cpu_time + - name: total_time type: long - - name: self_cpu_time + - name: self_time type: long - name: processor type: group @@ -29,5 +29,5 @@ type: long - name: failed type: long - - name: total_cpu_time + - name: total_time type: long diff --git a/metricbeat/module/elasticsearch/ingest/data.go b/metricbeat/module/elasticsearch/ingest/data.go index 1a94fe1e4479..23b70103335f 100644 --- a/metricbeat/module/elasticsearch/ingest/data.go +++ b/metricbeat/module/elasticsearch/ingest/data.go @@ -87,7 +87,7 @@ func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isX // Pipeline metrics event.MetricSetFields.Put("pipeline.total.count", pipelineStats.Count) event.MetricSetFields.Put("pipeline.total.failed", pipelineStats.Failed) - event.MetricSetFields.Put("pipeline.total.total_cpu_time", pipelineStats.TimeInMillis) + event.MetricSetFields.Put("pipeline.total.total_time", pipelineStats.TimeInMillis) // Self time subtracts any processor pipelines selfCpuTime := pipelineStats.TimeInMillis @@ -117,7 +117,7 @@ func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isX processorEvent.MetricSetFields.Put("pipeline.processor.type_tag", pTypeTag) processorEvent.MetricSetFields.Put("pipeline.processor.count", processorStats.Stats.Count) processorEvent.MetricSetFields.Put("pipeline.processor.failed", processorStats.Stats.Failed) - processorEvent.MetricSetFields.Put("pipeline.processor.total_cpu_time", processorStats.Stats.TimeInMillis) + processorEvent.MetricSetFields.Put("pipeline.processor.total_time", processorStats.Stats.TimeInMillis) r.Event(processorEvent) // processorObj has a single key with the processor type, so break early @@ -126,7 +126,7 @@ func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isX } } - event.MetricSetFields.Put("pipeline.total.self_cpu_time", selfCpuTime) + event.MetricSetFields.Put("pipeline.total.self_time", selfCpuTime) r.Event(event) } } diff --git a/metricbeat/module/elasticsearch/ingest/data_test.go b/metricbeat/module/elasticsearch/ingest/data_test.go index b8ef8fc72a0c..25529c900960 100644 --- a/metricbeat/module/elasticsearch/ingest/data_test.go +++ b/metricbeat/module/elasticsearch/ingest/data_test.go @@ -84,8 +84,8 @@ func TestMapper(t *testing.T) { requireMetricSetFields(t, ev, "pipeline.name", "pipeline1") requireMetricSetFields(t, ev, "pipeline.total.count", 19271022) requireMetricSetFields(t, ev, "pipeline.total.failed", 100) - requireMetricSetFields(t, ev, "pipeline.total.total_cpu_time", 823888) - requireMetricSetFields(t, ev, "pipeline.total.self_cpu_time", 823888-4607) // subtract out pipeline processor + requireMetricSetFields(t, ev, "pipeline.total.total_time", 823888) + requireMetricSetFields(t, ev, "pipeline.total.self_time", 823888-4607) // subtract out pipeline processor }) t.Run("Test processor events", func(t *testing.T) { @@ -99,7 +99,7 @@ func TestMapper(t *testing.T) { requireMetricSetFields(t, ev, "pipeline.processor.type_tag", "set:tag1") requireMetricSetFields(t, ev, "pipeline.processor.count", 19271022) requireMetricSetFields(t, ev, "pipeline.processor.failed", 100) - requireMetricSetFields(t, ev, "pipeline.processor.total_cpu_time", 256275) + requireMetricSetFields(t, ev, "pipeline.processor.total_time", 256275) }) } From fd056fdba09e6f8e1832b3aab74da3d550003b91 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Mon, 16 Jan 2023 14:07:35 +0100 Subject: [PATCH 10/21] Make ingest metricset optional in xpack mode --- metricbeat/module/elasticsearch/elasticsearch.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/metricbeat/module/elasticsearch/elasticsearch.go b/metricbeat/module/elasticsearch/elasticsearch.go index 4410ed8290c9..305c45e1b851 100644 --- a/metricbeat/module/elasticsearch/elasticsearch.go +++ b/metricbeat/module/elasticsearch/elasticsearch.go @@ -49,7 +49,6 @@ func NewModule(base mb.BaseModule) (mb.Module, error) { "ccr", "enrich", "cluster_stats", - "ingest", "index", "index_recovery", "index_summary", @@ -57,7 +56,8 @@ func NewModule(base mb.BaseModule) (mb.Module, error) { "node_stats", "shard", } - return elastic.NewModule(&base, xpackEnabledMetricSets, []string{}, logp.NewLogger(ModuleName)) + optionalXpackMetricsets := []string{"ingest"} + return elastic.NewModule(&base, xpackEnabledMetricSets, optionalXpackMetricsets, logp.NewLogger(ModuleName)) } var ( From 9783b058615126dc3e1becd7e5c81adab4044011 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Mon, 16 Jan 2023 14:25:40 +0100 Subject: [PATCH 11/21] Update x-pack metricbeat reference yml --- x-pack/metricbeat/metricbeat.reference.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/x-pack/metricbeat/metricbeat.reference.yml b/x-pack/metricbeat/metricbeat.reference.yml index e6931fbb3094..1c8380d9b4ac 100644 --- a/x-pack/metricbeat/metricbeat.reference.yml +++ b/x-pack/metricbeat/metricbeat.reference.yml @@ -512,6 +512,7 @@ metricbeat.modules: #- index #- index_recovery #- index_summary + #- ingest #- shard #- ml_job period: 10s @@ -521,6 +522,7 @@ metricbeat.modules: #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true + #ingest.processor_sample_rate: 0.25 #xpack.enabled: false #scope: node From 399be7827d5cfd62678346a0b7a6c552004b0566 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Mon, 16 Jan 2023 14:55:51 +0100 Subject: [PATCH 12/21] Update changelog and docs --- CHANGELOG.next.asciidoc | 1 + .../elasticsearch/ingest/_meta/docs.asciidoc | 21 +++++++++++++++++++ .../elasticsearch/ingest/_meta/fields.yml | 14 ++++++++++++- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index 2b0a0d448648..85179520749c 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -190,6 +190,7 @@ https://github.com/elastic/beats/compare/v8.2.0\...main[Check the HEAD diff] - Add GCP Redis regions support {pull}33728[33728] - Add namespace metadata to all namespaced kubernetes resources. {pull}33763[33763] - Changed cloudwatch module to call ListMetrics API only once per region, instead of per AWS namespace {pull}34055[34055] +- Add beta ingest metricset to Elasticsearch module for ingest pipeline monitoring {pull}34012[34012] *Packetbeat* diff --git a/metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc b/metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc index 4eb3c4e06532..0067cf9cd4ce 100644 --- a/metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc +++ b/metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc @@ -1 +1,22 @@ This is the ingest metricset of the module elasticsearch. + +Collects metrics on ingest pipeline executions, with processor-level granularity. + +[float] +=== Processor-level metrics sampling + +Processor-level metrics can produce a high volume of data, so the default behavior is to collect those metrics less +frequently than the `period` for pipeline-level metrics, by applying a sampling strategy. By default, the +processor-level metrics will be collected during 25% of the time. This can be configured with the +`ingest.processor_sample_rate` setting: + +[float] +=== Configuration example +[source,yaml] +---- +- module: elasticsearch + period: 10s + metricsets: + - ingest + ingest.processor_sample_rate: 0.1 # decrease to 10% of fetches +---- diff --git a/metricbeat/module/elasticsearch/ingest/_meta/fields.yml b/metricbeat/module/elasticsearch/ingest/_meta/fields.yml index 83a5f696f9e4..653cd15e51e9 100644 --- a/metricbeat/module/elasticsearch/ingest/_meta/fields.yml +++ b/metricbeat/module/elasticsearch/ingest/_meta/fields.yml @@ -1,33 +1,45 @@ -# TODO: add descriptions to each field - name: ingest.pipeline type: group release: beta + description: Runtime metrics on ingest pipeline execution fields: - name: name type: wildcard + description: Name / id of the ingest pipeline - name: total type: group + description: Metrics on the total ingest pipeline execution, including all processors. fields: - name: count type: long + description: Number of documents processed by this pipeline - name: failed type: long + description: Number of documented failed to process by this pipeline - name: total_time type: long + description: Total time spent processing documents through this pipeline, inclusive of other pipelines called - name: self_time type: long + description: Time spent processing documents through this pipeline, exclusive of other pipelines called - name: processor type: group fields: - name: type type: keyword + description: The type of ingest processor - name: type_tag type: keyword + description: The type and the tag for this processor in the format ":" - name: order_index type: long + description: The order this processor appears in the pipeline definition - name: count type: long + description: Number of documents processed by this processor - name: failed type: long + description: Number of documented failed to process by this processor - name: total_time type: long + description: Total time spent processing documents through this processor From 111a3b00b7d7d5b9d8d9183d3008de6b23459655 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Tue, 17 Jan 2023 11:19:47 +0100 Subject: [PATCH 13/21] Update fields --- metricbeat/docs/fields.asciidoc | 32 +++++++++++++++++++++++ metricbeat/module/elasticsearch/fields.go | 2 +- 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index a64c8f9daced..d32d7bf8b7e7 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -31687,18 +31687,32 @@ type: long -- +[float] +=== ingest.pipeline + +Runtime metrics on ingest pipeline execution + *`elasticsearch.ingest.pipeline.name`*:: + -- +Name / id of the ingest pipeline + type: wildcard -- +[float] +=== total + +Metrics on the total ingest pipeline execution, including all processors. + *`elasticsearch.ingest.pipeline.total.count`*:: + -- +Number of documents processed by this pipeline + type: long -- @@ -31706,6 +31720,8 @@ type: long *`elasticsearch.ingest.pipeline.total.failed`*:: + -- +Number of documented failed to process by this pipeline + type: long -- @@ -31713,6 +31729,8 @@ type: long *`elasticsearch.ingest.pipeline.total.total_time`*:: + -- +Total time spent processing documents through this pipeline, inclusive of other pipelines called + type: long -- @@ -31720,6 +31738,8 @@ type: long *`elasticsearch.ingest.pipeline.total.self_time`*:: + -- +Time spent processing documents through this pipeline, exclusive of other pipelines called + type: long -- @@ -31728,6 +31748,8 @@ type: long *`elasticsearch.ingest.pipeline.processor.type`*:: + -- +The type of ingest processor + type: keyword -- @@ -31735,6 +31757,8 @@ type: keyword *`elasticsearch.ingest.pipeline.processor.type_tag`*:: + -- +The type and the tag for this processor in the format ":" + type: keyword -- @@ -31742,6 +31766,8 @@ type: keyword *`elasticsearch.ingest.pipeline.processor.order_index`*:: + -- +The order this processor appears in the pipeline definition + type: long -- @@ -31749,6 +31775,8 @@ type: long *`elasticsearch.ingest.pipeline.processor.count`*:: + -- +Number of documents processed by this processor + type: long -- @@ -31756,6 +31784,8 @@ type: long *`elasticsearch.ingest.pipeline.processor.failed`*:: + -- +Number of documented failed to process by this processor + type: long -- @@ -31763,6 +31793,8 @@ type: long *`elasticsearch.ingest.pipeline.processor.total_time`*:: + -- +Total time spent processing documents through this processor + type: long -- diff --git a/metricbeat/module/elasticsearch/fields.go b/metricbeat/module/elasticsearch/fields.go index 4d328115a936..7e18da0c9798 100644 --- a/metricbeat/module/elasticsearch/fields.go +++ b/metricbeat/module/elasticsearch/fields.go @@ -32,5 +32,5 @@ func init() { // AssetElasticsearch returns asset data. // This is the base64 encoded zlib format compressed contents of module/elasticsearch. func AssetElasticsearch() string { - return "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" + return "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" } From 682f01f7a598f70ef3d9b12a5c2785c50ccfe0fa Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Thu, 19 Jan 2023 19:07:53 +0100 Subject: [PATCH 14/21] Rename metricset to ingest_pipeline --- metricbeat/docs/fields.asciidoc | 24 +++++++-------- .../docs/modules/elasticsearch.asciidoc | 8 ++--- ...gest.asciidoc => ingest_pipeline.asciidoc} | 10 +++---- metricbeat/docs/modules_list.asciidoc | 2 +- metricbeat/include/list_common.go | 2 +- metricbeat/metricbeat.reference.yml | 4 +-- .../elasticsearch/_meta/config.reference.yml | 4 +-- .../module/elasticsearch/elasticsearch.go | 2 +- metricbeat/module/elasticsearch/fields.go | 2 +- .../_meta/data.json | 4 +-- .../_meta/docs.asciidoc | 2 +- .../_meta/fields.yml | 2 +- .../_meta/test/stats.json | 0 .../{ingest => ingest_pipeline}/data.go | 24 +++++++-------- .../{ingest => ingest_pipeline}/data_test.go | 30 +++++++++---------- .../ingest_pipeline.go} | 10 +++---- 16 files changed, 65 insertions(+), 65 deletions(-) rename metricbeat/docs/modules/elasticsearch/{ingest.asciidoc => ingest_pipeline.asciidoc} (61%) rename metricbeat/module/elasticsearch/{ingest => ingest_pipeline}/_meta/data.json (84%) rename metricbeat/module/elasticsearch/{ingest => ingest_pipeline}/_meta/docs.asciidoc (91%) rename metricbeat/module/elasticsearch/{ingest => ingest_pipeline}/_meta/fields.yml (98%) rename metricbeat/module/elasticsearch/{ingest => ingest_pipeline}/_meta/test/stats.json (100%) rename metricbeat/module/elasticsearch/{ingest => ingest_pipeline}/data.go (81%) rename metricbeat/module/elasticsearch/{ingest => ingest_pipeline}/data_test.go (78%) rename metricbeat/module/elasticsearch/{ingest/ingest.go => ingest_pipeline/ingest_pipeline.go} (91%) diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index d32d7bf8b7e7..a0b8abcf0b25 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -31688,12 +31688,12 @@ type: long -- [float] -=== ingest.pipeline +=== ingest_pipeline Runtime metrics on ingest pipeline execution -*`elasticsearch.ingest.pipeline.name`*:: +*`elasticsearch.ingest_pipeline.name`*:: + -- Name / id of the ingest pipeline @@ -31708,7 +31708,7 @@ type: wildcard Metrics on the total ingest pipeline execution, including all processors. -*`elasticsearch.ingest.pipeline.total.count`*:: +*`elasticsearch.ingest_pipeline.total.count`*:: + -- Number of documents processed by this pipeline @@ -31717,7 +31717,7 @@ type: long -- -*`elasticsearch.ingest.pipeline.total.failed`*:: +*`elasticsearch.ingest_pipeline.total.failed`*:: + -- Number of documented failed to process by this pipeline @@ -31726,7 +31726,7 @@ type: long -- -*`elasticsearch.ingest.pipeline.total.total_time`*:: +*`elasticsearch.ingest_pipeline.total.total_time`*:: + -- Total time spent processing documents through this pipeline, inclusive of other pipelines called @@ -31735,7 +31735,7 @@ type: long -- -*`elasticsearch.ingest.pipeline.total.self_time`*:: +*`elasticsearch.ingest_pipeline.total.self_time`*:: + -- Time spent processing documents through this pipeline, exclusive of other pipelines called @@ -31745,7 +31745,7 @@ type: long -- -*`elasticsearch.ingest.pipeline.processor.type`*:: +*`elasticsearch.ingest_pipeline.processor.type`*:: + -- The type of ingest processor @@ -31754,7 +31754,7 @@ type: keyword -- -*`elasticsearch.ingest.pipeline.processor.type_tag`*:: +*`elasticsearch.ingest_pipeline.processor.type_tag`*:: + -- The type and the tag for this processor in the format ":" @@ -31763,7 +31763,7 @@ type: keyword -- -*`elasticsearch.ingest.pipeline.processor.order_index`*:: +*`elasticsearch.ingest_pipeline.processor.order_index`*:: + -- The order this processor appears in the pipeline definition @@ -31772,7 +31772,7 @@ type: long -- -*`elasticsearch.ingest.pipeline.processor.count`*:: +*`elasticsearch.ingest_pipeline.processor.count`*:: + -- Number of documents processed by this processor @@ -31781,7 +31781,7 @@ type: long -- -*`elasticsearch.ingest.pipeline.processor.failed`*:: +*`elasticsearch.ingest_pipeline.processor.failed`*:: + -- Number of documented failed to process by this processor @@ -31790,7 +31790,7 @@ type: long -- -*`elasticsearch.ingest.pipeline.processor.total_time`*:: +*`elasticsearch.ingest_pipeline.processor.total_time`*:: + -- Total time spent processing documents through this processor diff --git a/metricbeat/docs/modules/elasticsearch.asciidoc b/metricbeat/docs/modules/elasticsearch.asciidoc index fcb2e955e218..54ddd22a7627 100644 --- a/metricbeat/docs/modules/elasticsearch.asciidoc +++ b/metricbeat/docs/modules/elasticsearch.asciidoc @@ -64,7 +64,7 @@ metricbeat.modules: #- index #- index_recovery #- index_summary - #- ingest + #- ingest_pipeline #- shard #- ml_job period: 10s @@ -74,7 +74,7 @@ metricbeat.modules: #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true - #ingest.processor_sample_rate: 0.25 + #ingest_pipeline.processor_sample_rate: 0.25 #xpack.enabled: false #scope: node ---- @@ -99,7 +99,7 @@ The following metricsets are available: * <> -* <> +* <> * <> @@ -123,7 +123,7 @@ include::elasticsearch/index_recovery.asciidoc[] include::elasticsearch/index_summary.asciidoc[] -include::elasticsearch/ingest.asciidoc[] +include::elasticsearch/ingest_pipeline.asciidoc[] include::elasticsearch/ml_job.asciidoc[] diff --git a/metricbeat/docs/modules/elasticsearch/ingest.asciidoc b/metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc similarity index 61% rename from metricbeat/docs/modules/elasticsearch/ingest.asciidoc rename to metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc index a42c18705892..5088de41340d 100644 --- a/metricbeat/docs/modules/elasticsearch/ingest.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc @@ -1,15 +1,15 @@ //// This file is generated! See scripts/mage/docs_collector.go //// -:edit_url: https://github.com/elastic/beats/edit/main/metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc +:edit_url: https://github.com/elastic/beats/edit/main/metricbeat/module/elasticsearch/ingest_pipeline/_meta/docs.asciidoc -[[metricbeat-metricset-elasticsearch-ingest]] -=== Elasticsearch ingest metricset +[[metricbeat-metricset-elasticsearch-ingest_pipeline]] +=== Elasticsearch ingest_pipeline metricset beta[] -include::../../../module/elasticsearch/ingest/_meta/docs.asciidoc[] +include::../../../module/elasticsearch/ingest_pipeline/_meta/docs.asciidoc[] This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. @@ -24,6 +24,6 @@ Here is an example document generated by this metricset: [source,json] ---- -include::../../../module/elasticsearch/ingest/_meta/data.json[] +include::../../../module/elasticsearch/ingest_pipeline/_meta/data.json[] ---- :edit_url!: \ No newline at end of file diff --git a/metricbeat/docs/modules_list.asciidoc b/metricbeat/docs/modules_list.asciidoc index b585a3f7ebc3..69db5da4a7ab 100644 --- a/metricbeat/docs/modules_list.asciidoc +++ b/metricbeat/docs/modules_list.asciidoc @@ -104,7 +104,7 @@ This file is generated! See scripts/mage/docs_collector.go |<> |<> |<> -|<> beta[] +|<> beta[] |<> |<> |<> diff --git a/metricbeat/include/list_common.go b/metricbeat/include/list_common.go index 4676f270eb50..434d2d7fc72c 100644 --- a/metricbeat/include/list_common.go +++ b/metricbeat/include/list_common.go @@ -59,7 +59,7 @@ import ( _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/index" _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/index_recovery" _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/index_summary" - _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/ingest" + _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/ingest_pipeline" _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/ml_job" _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/node" _ "github.com/elastic/beats/v7/metricbeat/module/elasticsearch/node_stats" diff --git a/metricbeat/metricbeat.reference.yml b/metricbeat/metricbeat.reference.yml index 0b5bf1edcc6d..d04774809f5c 100644 --- a/metricbeat/metricbeat.reference.yml +++ b/metricbeat/metricbeat.reference.yml @@ -275,7 +275,7 @@ metricbeat.modules: #- index #- index_recovery #- index_summary - #- ingest + #- ingest_pipeline #- shard #- ml_job period: 10s @@ -285,7 +285,7 @@ metricbeat.modules: #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true - #ingest.processor_sample_rate: 0.25 + #ingest_pipeline.processor_sample_rate: 0.25 #xpack.enabled: false #scope: node diff --git a/metricbeat/module/elasticsearch/_meta/config.reference.yml b/metricbeat/module/elasticsearch/_meta/config.reference.yml index a932a37f3130..199d28a0aeae 100644 --- a/metricbeat/module/elasticsearch/_meta/config.reference.yml +++ b/metricbeat/module/elasticsearch/_meta/config.reference.yml @@ -5,7 +5,7 @@ #- index #- index_recovery #- index_summary - #- ingest + #- ingest_pipeline #- shard #- ml_job period: 10s @@ -15,6 +15,6 @@ #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true - #ingest.processor_sample_rate: 0.25 + #ingest_pipeline.processor_sample_rate: 0.25 #xpack.enabled: false #scope: node diff --git a/metricbeat/module/elasticsearch/elasticsearch.go b/metricbeat/module/elasticsearch/elasticsearch.go index 305c45e1b851..e6e4e8fc8bbf 100644 --- a/metricbeat/module/elasticsearch/elasticsearch.go +++ b/metricbeat/module/elasticsearch/elasticsearch.go @@ -56,7 +56,7 @@ func NewModule(base mb.BaseModule) (mb.Module, error) { "node_stats", "shard", } - optionalXpackMetricsets := []string{"ingest"} + optionalXpackMetricsets := []string{"ingest_pipeline"} return elastic.NewModule(&base, xpackEnabledMetricSets, optionalXpackMetricsets, logp.NewLogger(ModuleName)) } diff --git a/metricbeat/module/elasticsearch/fields.go b/metricbeat/module/elasticsearch/fields.go index 7e18da0c9798..f6a24a08d89c 100644 --- a/metricbeat/module/elasticsearch/fields.go +++ b/metricbeat/module/elasticsearch/fields.go @@ -32,5 +32,5 @@ func init() { // AssetElasticsearch returns asset data. // This is the base64 encoded zlib format compressed contents of module/elasticsearch. func AssetElasticsearch() string { - return "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" + return "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" } diff --git a/metricbeat/module/elasticsearch/ingest/_meta/data.json b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/data.json similarity index 84% rename from metricbeat/module/elasticsearch/ingest/_meta/data.json rename to metricbeat/module/elasticsearch/ingest_pipeline/_meta/data.json index 21b8c47385c9..c1d1933668af 100644 --- a/metricbeat/module/elasticsearch/ingest/_meta/data.json +++ b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/data.json @@ -7,11 +7,11 @@ "metricset":{ "host":"localhost", "module":"elasticsearch", - "name":"ingest", + "name":"ingest_pipeline", "rtt":44269 }, "elasticsearch":{ - "ingest":{ + "ingest_pipeline":{ "example": "ingest" } }, diff --git a/metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/docs.asciidoc similarity index 91% rename from metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc rename to metricbeat/module/elasticsearch/ingest_pipeline/_meta/docs.asciidoc index 0067cf9cd4ce..c387a6ee0855 100644 --- a/metricbeat/module/elasticsearch/ingest/_meta/docs.asciidoc +++ b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/docs.asciidoc @@ -1,4 +1,4 @@ -This is the ingest metricset of the module elasticsearch. +This is the ingest_pipeline metricset of the module elasticsearch. Collects metrics on ingest pipeline executions, with processor-level granularity. diff --git a/metricbeat/module/elasticsearch/ingest/_meta/fields.yml b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/fields.yml similarity index 98% rename from metricbeat/module/elasticsearch/ingest/_meta/fields.yml rename to metricbeat/module/elasticsearch/ingest_pipeline/_meta/fields.yml index 653cd15e51e9..7a89620a06bb 100644 --- a/metricbeat/module/elasticsearch/ingest/_meta/fields.yml +++ b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/fields.yml @@ -1,4 +1,4 @@ -- name: ingest.pipeline +- name: ingest_pipeline type: group release: beta description: Runtime metrics on ingest pipeline execution diff --git a/metricbeat/module/elasticsearch/ingest/_meta/test/stats.json b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/test/stats.json similarity index 100% rename from metricbeat/module/elasticsearch/ingest/_meta/test/stats.json rename to metricbeat/module/elasticsearch/ingest_pipeline/_meta/test/stats.json diff --git a/metricbeat/module/elasticsearch/ingest/data.go b/metricbeat/module/elasticsearch/ingest_pipeline/data.go similarity index 81% rename from metricbeat/module/elasticsearch/ingest/data.go rename to metricbeat/module/elasticsearch/ingest_pipeline/data.go index 23b70103335f..2134131123e6 100644 --- a/metricbeat/module/elasticsearch/ingest/data.go +++ b/metricbeat/module/elasticsearch/ingest_pipeline/data.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package ingest +package ingest_pipeline import ( "encoding/json" @@ -85,9 +85,9 @@ func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isX addCommonFields(&event, &info, nodeId, &nodeStats, pipelineId) // Pipeline metrics - event.MetricSetFields.Put("pipeline.total.count", pipelineStats.Count) - event.MetricSetFields.Put("pipeline.total.failed", pipelineStats.Failed) - event.MetricSetFields.Put("pipeline.total.total_time", pipelineStats.TimeInMillis) + event.MetricSetFields.Put("total.count", pipelineStats.Count) + event.MetricSetFields.Put("total.failed", pipelineStats.Failed) + event.MetricSetFields.Put("total.total_time", pipelineStats.TimeInMillis) // Self time subtracts any processor pipelines selfCpuTime := pipelineStats.TimeInMillis @@ -112,12 +112,12 @@ func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isX addCommonFields(&processorEvent, &info, nodeId, &nodeStats, pipelineId) // Processor metrics - processorEvent.MetricSetFields.Put("pipeline.processor.order_index", pIdx) - processorEvent.MetricSetFields.Put("pipeline.processor.type", processorStats.Type) - processorEvent.MetricSetFields.Put("pipeline.processor.type_tag", pTypeTag) - processorEvent.MetricSetFields.Put("pipeline.processor.count", processorStats.Stats.Count) - processorEvent.MetricSetFields.Put("pipeline.processor.failed", processorStats.Stats.Failed) - processorEvent.MetricSetFields.Put("pipeline.processor.total_time", processorStats.Stats.TimeInMillis) + processorEvent.MetricSetFields.Put("processor.order_index", pIdx) + processorEvent.MetricSetFields.Put("processor.type", processorStats.Type) + processorEvent.MetricSetFields.Put("processor.type_tag", pTypeTag) + processorEvent.MetricSetFields.Put("processor.count", processorStats.Stats.Count) + processorEvent.MetricSetFields.Put("processor.failed", processorStats.Stats.Failed) + processorEvent.MetricSetFields.Put("processor.total_time", processorStats.Stats.TimeInMillis) r.Event(processorEvent) // processorObj has a single key with the processor type, so break early @@ -126,7 +126,7 @@ func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isX } } - event.MetricSetFields.Put("pipeline.total.self_time", selfCpuTime) + event.MetricSetFields.Put("total.self_time", selfCpuTime) r.Event(event) } } @@ -141,5 +141,5 @@ func addCommonFields(event *mb.Event, info *elasticsearch.Info, nodeId string, n event.ModuleFields.Put("node.name", nodeStats.Name) event.ModuleFields.Put("node.roles", nodeStats.Roles) - event.MetricSetFields.Put("pipeline.name", pipelineId) + event.MetricSetFields.Put("name", pipelineId) } diff --git a/metricbeat/module/elasticsearch/ingest/data_test.go b/metricbeat/module/elasticsearch/ingest_pipeline/data_test.go similarity index 78% rename from metricbeat/module/elasticsearch/ingest/data_test.go rename to metricbeat/module/elasticsearch/ingest_pipeline/data_test.go index 25529c900960..22dc51a6247b 100644 --- a/metricbeat/module/elasticsearch/ingest/data_test.go +++ b/metricbeat/module/elasticsearch/ingest_pipeline/data_test.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package ingest +package ingest_pipeline import ( "io/ioutil" @@ -68,7 +68,7 @@ func TestMapper(t *testing.T) { var processorEvents []mb.Event for _, event := range allEvents { - if val, _ := event.MetricSetFields.GetValue("pipeline.processor"); val != nil { + if val, _ := event.MetricSetFields.GetValue("processor"); val != nil { processorEvents = append(processorEvents, event) } else { pipelineEvents = append(pipelineEvents, event) @@ -81,11 +81,11 @@ func TestMapper(t *testing.T) { require.Equal(t, 1, len(pipelineEvents)) ev := pipelineEvents[0] - requireMetricSetFields(t, ev, "pipeline.name", "pipeline1") - requireMetricSetFields(t, ev, "pipeline.total.count", 19271022) - requireMetricSetFields(t, ev, "pipeline.total.failed", 100) - requireMetricSetFields(t, ev, "pipeline.total.total_time", 823888) - requireMetricSetFields(t, ev, "pipeline.total.self_time", 823888-4607) // subtract out pipeline processor + requireMetricSetFields(t, ev, "name", "pipeline1") + requireMetricSetFields(t, ev, "total.count", 19271022) + requireMetricSetFields(t, ev, "total.failed", 100) + requireMetricSetFields(t, ev, "total.total_time", 823888) + requireMetricSetFields(t, ev, "total.self_time", 823888-4607) // subtract out pipeline processor }) t.Run("Test processor events", func(t *testing.T) { @@ -93,13 +93,13 @@ func TestMapper(t *testing.T) { ev := processorEvents[0] // There's no special handling for different processors, so just test the first one - requireMetricSetFields(t, ev, "pipeline.name", "pipeline1") - requireMetricSetFields(t, ev, "pipeline.processor.order_index", 0) - requireMetricSetFields(t, ev, "pipeline.processor.type", "set") - requireMetricSetFields(t, ev, "pipeline.processor.type_tag", "set:tag1") - requireMetricSetFields(t, ev, "pipeline.processor.count", 19271022) - requireMetricSetFields(t, ev, "pipeline.processor.failed", 100) - requireMetricSetFields(t, ev, "pipeline.processor.total_time", 256275) + requireMetricSetFields(t, ev, "name", "pipeline1") + requireMetricSetFields(t, ev, "processor.order_index", 0) + requireMetricSetFields(t, ev, "processor.type", "set") + requireMetricSetFields(t, ev, "processor.type_tag", "set:tag1") + requireMetricSetFields(t, ev, "processor.count", 19271022) + requireMetricSetFields(t, ev, "processor.failed", 100) + requireMetricSetFields(t, ev, "processor.total_time", 256275) }) } @@ -124,7 +124,7 @@ func TestSampling(t *testing.T) { var processorEvents []mb.Event for _, event := range allEvents { - if val, _ := event.MetricSetFields.GetValue("pipeline.processor"); val != nil { + if val, _ := event.MetricSetFields.GetValue("processor"); val != nil { processorEvents = append(processorEvents, event) } else { pipelineEvents = append(pipelineEvents, event) diff --git a/metricbeat/module/elasticsearch/ingest/ingest.go b/metricbeat/module/elasticsearch/ingest_pipeline/ingest_pipeline.go similarity index 91% rename from metricbeat/module/elasticsearch/ingest/ingest.go rename to metricbeat/module/elasticsearch/ingest_pipeline/ingest_pipeline.go index f5023df444ce..7dd8da62104c 100644 --- a/metricbeat/module/elasticsearch/ingest/ingest.go +++ b/metricbeat/module/elasticsearch/ingest_pipeline/ingest_pipeline.go @@ -15,7 +15,7 @@ // specific language governing permissions and limitations // under the License. -package ingest +package ingest_pipeline import ( "math" @@ -33,7 +33,7 @@ import ( // the MetricSet for each host defined in the module's configuration. After the // MetricSet has been created then Fetch will begin to be called periodically. func init() { - mb.Registry.MustAddMetricSet(elasticsearch.ModuleName, "ingest", New, + mb.Registry.MustAddMetricSet(elasticsearch.ModuleName, "ingest_pipeline", New, mb.WithHostParser(elasticsearch.HostParser), mb.DefaultMetricSet(), ) @@ -66,7 +66,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { } config := struct { - ProcessorSampleRate float64 `config:"ingest.processor_sample_rate"` + ProcessorSampleRate float64 `config:"ingest_pipeline.processor_sample_rate"` }{ ProcessorSampleRate: 0.25, } @@ -81,7 +81,7 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { sampleProcessorsEveryN = int(math.Round(1.0 / math.Min(1.0, config.ProcessorSampleRate))) } - base.Logger().Debugf("Sampling ingest processor stats every %d fetches", sampleProcessorsEveryN) + base.Logger().Debugf("Sampling ingest_pipeline processor stats every %d fetches", sampleProcessorsEveryN) return &IngestMetricSet{ MetricSet: ms, @@ -126,6 +126,6 @@ func (m *IngestMetricSet) Fetch(report mb.ReporterV2) error { m.fetchCounter++ // It's fine if this overflows, it's only used for modulo sampleProcessors := m.fetchCounter%m.sampleProcessorsEveryN == 0 - m.Logger().Debugf("Sampling ingest processor stats: %v", sampleProcessors) + m.Logger().Debugf("Sampling ingest_pipeline processor stats: %v", sampleProcessors) return eventsMapping(report, *info, content, m.XPackEnabled, sampleProcessors) } From 60fae09b003ed78bce3b66d504533728b49acef3 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Thu, 19 Jan 2023 20:14:21 +0100 Subject: [PATCH 15/21] Rename time fields to match node_stats metricset --- metricbeat/docs/fields.asciidoc | 6 +++--- metricbeat/module/elasticsearch/fields.go | 2 +- .../module/elasticsearch/ingest_pipeline/_meta/fields.yml | 6 +++--- metricbeat/module/elasticsearch/ingest_pipeline/data.go | 6 +++--- .../module/elasticsearch/ingest_pipeline/data_test.go | 6 +++--- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index a0b8abcf0b25..78b23f63b6f1 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -31726,7 +31726,7 @@ type: long -- -*`elasticsearch.ingest_pipeline.total.total_time`*:: +*`elasticsearch.ingest_pipeline.total.time.total.ms`*:: + -- Total time spent processing documents through this pipeline, inclusive of other pipelines called @@ -31735,7 +31735,7 @@ type: long -- -*`elasticsearch.ingest_pipeline.total.self_time`*:: +*`elasticsearch.ingest_pipeline.total.time.self.ms`*:: + -- Time spent processing documents through this pipeline, exclusive of other pipelines called @@ -31790,7 +31790,7 @@ type: long -- -*`elasticsearch.ingest_pipeline.processor.total_time`*:: +*`elasticsearch.ingest_pipeline.processor.time.total.ms`*:: + -- Total time spent processing documents through this processor diff --git a/metricbeat/module/elasticsearch/fields.go b/metricbeat/module/elasticsearch/fields.go index f6a24a08d89c..f37471351dc3 100644 --- a/metricbeat/module/elasticsearch/fields.go +++ b/metricbeat/module/elasticsearch/fields.go @@ -32,5 +32,5 @@ func init() { // AssetElasticsearch returns asset data. // This is the base64 encoded zlib format compressed contents of module/elasticsearch. func AssetElasticsearch() string { - return "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" + return "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" } diff --git a/metricbeat/module/elasticsearch/ingest_pipeline/_meta/fields.yml b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/fields.yml index 7a89620a06bb..1dd24b79c59d 100644 --- a/metricbeat/module/elasticsearch/ingest_pipeline/_meta/fields.yml +++ b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/fields.yml @@ -16,10 +16,10 @@ - name: failed type: long description: Number of documented failed to process by this pipeline - - name: total_time + - name: time.total.ms type: long description: Total time spent processing documents through this pipeline, inclusive of other pipelines called - - name: self_time + - name: time.self.ms type: long description: Time spent processing documents through this pipeline, exclusive of other pipelines called - name: processor @@ -40,6 +40,6 @@ - name: failed type: long description: Number of documented failed to process by this processor - - name: total_time + - name: time.total.ms type: long description: Total time spent processing documents through this processor diff --git a/metricbeat/module/elasticsearch/ingest_pipeline/data.go b/metricbeat/module/elasticsearch/ingest_pipeline/data.go index 2134131123e6..8cdb90ecf1dc 100644 --- a/metricbeat/module/elasticsearch/ingest_pipeline/data.go +++ b/metricbeat/module/elasticsearch/ingest_pipeline/data.go @@ -87,7 +87,7 @@ func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isX // Pipeline metrics event.MetricSetFields.Put("total.count", pipelineStats.Count) event.MetricSetFields.Put("total.failed", pipelineStats.Failed) - event.MetricSetFields.Put("total.total_time", pipelineStats.TimeInMillis) + event.MetricSetFields.Put("total.time.total.ms", pipelineStats.TimeInMillis) // Self time subtracts any processor pipelines selfCpuTime := pipelineStats.TimeInMillis @@ -117,7 +117,7 @@ func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isX processorEvent.MetricSetFields.Put("processor.type_tag", pTypeTag) processorEvent.MetricSetFields.Put("processor.count", processorStats.Stats.Count) processorEvent.MetricSetFields.Put("processor.failed", processorStats.Stats.Failed) - processorEvent.MetricSetFields.Put("processor.total_time", processorStats.Stats.TimeInMillis) + processorEvent.MetricSetFields.Put("processor.time.total.ms", processorStats.Stats.TimeInMillis) r.Event(processorEvent) // processorObj has a single key with the processor type, so break early @@ -126,7 +126,7 @@ func eventsMapping(r mb.ReporterV2, info elasticsearch.Info, content []byte, isX } } - event.MetricSetFields.Put("total.self_time", selfCpuTime) + event.MetricSetFields.Put("total.time.self.ms", selfCpuTime) r.Event(event) } } diff --git a/metricbeat/module/elasticsearch/ingest_pipeline/data_test.go b/metricbeat/module/elasticsearch/ingest_pipeline/data_test.go index 22dc51a6247b..c7758914b53b 100644 --- a/metricbeat/module/elasticsearch/ingest_pipeline/data_test.go +++ b/metricbeat/module/elasticsearch/ingest_pipeline/data_test.go @@ -84,8 +84,8 @@ func TestMapper(t *testing.T) { requireMetricSetFields(t, ev, "name", "pipeline1") requireMetricSetFields(t, ev, "total.count", 19271022) requireMetricSetFields(t, ev, "total.failed", 100) - requireMetricSetFields(t, ev, "total.total_time", 823888) - requireMetricSetFields(t, ev, "total.self_time", 823888-4607) // subtract out pipeline processor + requireMetricSetFields(t, ev, "total.time.total.ms", 823888) + requireMetricSetFields(t, ev, "total.time.self.ms", 823888-4607) // subtract out pipeline processor }) t.Run("Test processor events", func(t *testing.T) { @@ -99,7 +99,7 @@ func TestMapper(t *testing.T) { requireMetricSetFields(t, ev, "processor.type_tag", "set:tag1") requireMetricSetFields(t, ev, "processor.count", 19271022) requireMetricSetFields(t, ev, "processor.failed", 100) - requireMetricSetFields(t, ev, "processor.total_time", 256275) + requireMetricSetFields(t, ev, "processor.time.total.ms", 256275) }) } From e223a2098a3eebf362df66f5eae748712f621317 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Thu, 19 Jan 2023 20:14:35 +0100 Subject: [PATCH 16/21] Add example event --- .../ingest_pipeline/_meta/data.json | 67 +++++++++++++++---- 1 file changed, 53 insertions(+), 14 deletions(-) diff --git a/metricbeat/module/elasticsearch/ingest_pipeline/_meta/data.json b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/data.json index c1d1933668af..5ed8fb303c75 100644 --- a/metricbeat/module/elasticsearch/ingest_pipeline/_meta/data.json +++ b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/data.json @@ -1,19 +1,58 @@ { - "@timestamp":"2016-05-23T08:05:34.853Z", - "beat":{ - "hostname":"beathost", - "name":"beathost" + "@timestamp": "2023-01-19T19:08:28.770Z", + "elasticsearch": { + "cluster": { + "id": "XXXX", + "name": "my-cluster" }, - "metricset":{ - "host":"localhost", - "module":"elasticsearch", - "name":"ingest_pipeline", - "rtt":44269 + "node": { + "name": "instance-0000000022", + "roles": [ + "ingest", + "remote_cluster_client" + ], + "id": "ZZZZZ" }, - "elasticsearch":{ - "ingest_pipeline":{ - "example": "ingest" + "ingest_pipeline": { + "name": "my-pipeline", + "total": { + "count": 64, + "failed": 0, + "time": { + "total": { + "ms": 39 + }, + "self": { + "ms": 39 + } } - }, - "type":"metricsets" + } + } + }, + "ecs": { + "version": "8.0.0" + }, + "host": { + "name": "myhost.local" + }, + "agent": { + "type": "metricbeat", + "version": "8.7.0", + "ephemeral_id": "80fe51b6-57df-46d1-9240-20424df6d675", + "id": "faab8154-7ceb-470f-b2ca-0aee636951c3", + "name": "myhost.local" + }, + "event": { + "dataset": "elasticsearch.ingest_pipeline", + "module": "elasticsearch", + "duration": 558169708 + }, + "metricset": { + "period": 10000, + "name": "ingest_pipeline" + }, + "service": { + "address": "https://localhost:9200", + "type": "elasticsearch" + } } From a13b2b78f64abe2e97644b78d67716614f52f165 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Thu, 19 Jan 2023 20:14:44 +0100 Subject: [PATCH 17/21] Fix docs mentioning host module --- metricbeat/docs/modules/elasticsearch/index.asciidoc | 2 +- metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc | 2 +- metricbeat/docs/modules/elasticsearch/node.asciidoc | 2 +- metricbeat/docs/modules/elasticsearch/node_stats.asciidoc | 2 +- metricbeat/docs/modules/elasticsearch/pending_tasks.asciidoc | 2 +- metricbeat/docs/modules/elasticsearch/shard.asciidoc | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/metricbeat/docs/modules/elasticsearch/index.asciidoc b/metricbeat/docs/modules/elasticsearch/index.asciidoc index 65e1c9f92704..b7c6e128ea8f 100644 --- a/metricbeat/docs/modules/elasticsearch/index.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/index.asciidoc @@ -9,7 +9,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../module/elasticsearch/index/_meta/docs.asciidoc[] -This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc b/metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc index 5088de41340d..d0b2040d97e2 100644 --- a/metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc @@ -11,7 +11,7 @@ beta[] include::../../../module/elasticsearch/ingest_pipeline/_meta/docs.asciidoc[] -This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/metricbeat/docs/modules/elasticsearch/node.asciidoc b/metricbeat/docs/modules/elasticsearch/node.asciidoc index 43872df08a26..172f9c5a260f 100644 --- a/metricbeat/docs/modules/elasticsearch/node.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/node.asciidoc @@ -9,7 +9,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../module/elasticsearch/node/_meta/docs.asciidoc[] -This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/metricbeat/docs/modules/elasticsearch/node_stats.asciidoc b/metricbeat/docs/modules/elasticsearch/node_stats.asciidoc index 0fef326660a5..5db0ce45f092 100644 --- a/metricbeat/docs/modules/elasticsearch/node_stats.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/node_stats.asciidoc @@ -9,7 +9,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../module/elasticsearch/node_stats/_meta/docs.asciidoc[] -This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/metricbeat/docs/modules/elasticsearch/pending_tasks.asciidoc b/metricbeat/docs/modules/elasticsearch/pending_tasks.asciidoc index 02785ca629c0..0b76e3772f87 100644 --- a/metricbeat/docs/modules/elasticsearch/pending_tasks.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/pending_tasks.asciidoc @@ -9,7 +9,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../module/elasticsearch/pending_tasks/_meta/docs.asciidoc[] -This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/metricbeat/docs/modules/elasticsearch/shard.asciidoc b/metricbeat/docs/modules/elasticsearch/shard.asciidoc index cca4d8f581b0..16d1d132258c 100644 --- a/metricbeat/docs/modules/elasticsearch/shard.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/shard.asciidoc @@ -9,7 +9,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../module/elasticsearch/shard/_meta/docs.asciidoc[] -This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. :edit_url: From 35931c48cf3af63374c8d229d67a46ee618e5397 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Thu, 19 Jan 2023 20:37:00 +0100 Subject: [PATCH 18/21] Update docs and fields --- metricbeat/docs/modules/elasticsearch/index.asciidoc | 2 +- .../docs/modules/elasticsearch/ingest_pipeline.asciidoc | 2 +- metricbeat/docs/modules/elasticsearch/node.asciidoc | 2 +- metricbeat/docs/modules/elasticsearch/node_stats.asciidoc | 2 +- metricbeat/docs/modules/elasticsearch/pending_tasks.asciidoc | 2 +- metricbeat/docs/modules/elasticsearch/shard.asciidoc | 2 +- x-pack/metricbeat/metricbeat.reference.yml | 4 ++-- 7 files changed, 8 insertions(+), 8 deletions(-) diff --git a/metricbeat/docs/modules/elasticsearch/index.asciidoc b/metricbeat/docs/modules/elasticsearch/index.asciidoc index b7c6e128ea8f..65e1c9f92704 100644 --- a/metricbeat/docs/modules/elasticsearch/index.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/index.asciidoc @@ -9,7 +9,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../module/elasticsearch/index/_meta/docs.asciidoc[] -This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc b/metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc index d0b2040d97e2..5088de41340d 100644 --- a/metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/ingest_pipeline.asciidoc @@ -11,7 +11,7 @@ beta[] include::../../../module/elasticsearch/ingest_pipeline/_meta/docs.asciidoc[] -This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/metricbeat/docs/modules/elasticsearch/node.asciidoc b/metricbeat/docs/modules/elasticsearch/node.asciidoc index 172f9c5a260f..43872df08a26 100644 --- a/metricbeat/docs/modules/elasticsearch/node.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/node.asciidoc @@ -9,7 +9,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../module/elasticsearch/node/_meta/docs.asciidoc[] -This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/metricbeat/docs/modules/elasticsearch/node_stats.asciidoc b/metricbeat/docs/modules/elasticsearch/node_stats.asciidoc index 5db0ce45f092..0fef326660a5 100644 --- a/metricbeat/docs/modules/elasticsearch/node_stats.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/node_stats.asciidoc @@ -9,7 +9,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../module/elasticsearch/node_stats/_meta/docs.asciidoc[] -This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/metricbeat/docs/modules/elasticsearch/pending_tasks.asciidoc b/metricbeat/docs/modules/elasticsearch/pending_tasks.asciidoc index 0b76e3772f87..02785ca629c0 100644 --- a/metricbeat/docs/modules/elasticsearch/pending_tasks.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/pending_tasks.asciidoc @@ -9,7 +9,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../module/elasticsearch/pending_tasks/_meta/docs.asciidoc[] -This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/metricbeat/docs/modules/elasticsearch/shard.asciidoc b/metricbeat/docs/modules/elasticsearch/shard.asciidoc index 16d1d132258c..cca4d8f581b0 100644 --- a/metricbeat/docs/modules/elasticsearch/shard.asciidoc +++ b/metricbeat/docs/modules/elasticsearch/shard.asciidoc @@ -9,7 +9,7 @@ This file is generated! See scripts/mage/docs_collector.go include::../../../module/elasticsearch/shard/_meta/docs.asciidoc[] -This is a default metricset. If the elasticsearch module is unconfigured, this metricset is enabled by default. +This is a default metricset. If the host module is unconfigured, this metricset is enabled by default. :edit_url: diff --git a/x-pack/metricbeat/metricbeat.reference.yml b/x-pack/metricbeat/metricbeat.reference.yml index 1c8380d9b4ac..90cd46f423fb 100644 --- a/x-pack/metricbeat/metricbeat.reference.yml +++ b/x-pack/metricbeat/metricbeat.reference.yml @@ -512,7 +512,7 @@ metricbeat.modules: #- index #- index_recovery #- index_summary - #- ingest + #- ingest_pipeline #- shard #- ml_job period: 10s @@ -522,7 +522,7 @@ metricbeat.modules: #ssl.certificate_authorities: ["/etc/pki/root/ca.pem"] #index_recovery.active_only: true - #ingest.processor_sample_rate: 0.25 + #ingest_pipeline.processor_sample_rate: 0.25 #xpack.enabled: false #scope: node From d09de60ef14576c611700ddd16435e7c93d12285 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Fri, 20 Jan 2023 12:27:25 +0100 Subject: [PATCH 19/21] Remove useless unit test --- .../ingest_pipeline/data_test.go | 27 ------------------- 1 file changed, 27 deletions(-) diff --git a/metricbeat/module/elasticsearch/ingest_pipeline/data_test.go b/metricbeat/module/elasticsearch/ingest_pipeline/data_test.go index c7758914b53b..5ae9ad6def5b 100644 --- a/metricbeat/module/elasticsearch/ingest_pipeline/data_test.go +++ b/metricbeat/module/elasticsearch/ingest_pipeline/data_test.go @@ -19,8 +19,6 @@ package ingest_pipeline import ( "io/ioutil" - "net/http" - "net/http/httptest" "testing" "github.com/stretchr/testify/require" @@ -30,23 +28,6 @@ import ( "github.com/elastic/beats/v7/metricbeat/module/elasticsearch" ) -func createEsMuxer() *http.ServeMux { - mux := http.NewServeMux() - // mux.Handle("") - - return mux -} - -func TestData(t *testing.T) { - mux := createEsMuxer() - server := httptest.NewServer(mux) - defer server.Close() - - ms := mbtest.NewReportingMetricSetV2Error(t, getConfig(server.URL)) - err := mbtest.WriteEventsReporterV2Error(ms, t, "") - require.NoError(t, err) -} - func TestMapper(t *testing.T) { reporter := &mbtest.CapturingReporterV2{} @@ -136,14 +117,6 @@ func TestSampling(t *testing.T) { require.Equal(t, 0, len(processorEvents)) } -func getConfig(host string) map[string]interface{} { - return map[string]interface{}{ - "module": elasticsearch.ModuleName, - "metricsets": []string{"ingest"}, - "hosts": []string{host}, - } -} - func requireMetricSetFields(t *testing.T, event mb.Event, fieldName string, expected interface{}) { val, err := event.MetricSetFields.GetValue(fieldName) require.NoError(t, err) From ed09ca673e6eafc9b38ad6242b07fc7c4c0b0765 Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:36:12 +0100 Subject: [PATCH 20/21] Use realistic cluster and node ids --- .../module/elasticsearch/ingest_pipeline/_meta/data.json | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/metricbeat/module/elasticsearch/ingest_pipeline/_meta/data.json b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/data.json index 5ed8fb303c75..4b7b1296da4f 100644 --- a/metricbeat/module/elasticsearch/ingest_pipeline/_meta/data.json +++ b/metricbeat/module/elasticsearch/ingest_pipeline/_meta/data.json @@ -2,16 +2,16 @@ "@timestamp": "2023-01-19T19:08:28.770Z", "elasticsearch": { "cluster": { - "id": "XXXX", + "id": "WocBBA0QRma0sGpdQ7vLfQ", "name": "my-cluster" }, "node": { - "name": "instance-0000000022", + "name": "27fb1c2fd783", "roles": [ "ingest", "remote_cluster_client" ], - "id": "ZZZZZ" + "id": "f5i3v9hMT_q__q6B9WOo5A" }, "ingest_pipeline": { "name": "my-pipeline", From 3f8dbed6893d952b3993c2b59f45bf46c0721fdd Mon Sep 17 00:00:00 2001 From: Josh Dover <1813008+joshdover@users.noreply.github.com> Date: Fri, 27 Jan 2023 14:36:23 +0100 Subject: [PATCH 21/21] Remove ShouldSkipFetch call --- .../elasticsearch/ingest_pipeline/ingest_pipeline.go | 8 -------- 1 file changed, 8 deletions(-) diff --git a/metricbeat/module/elasticsearch/ingest_pipeline/ingest_pipeline.go b/metricbeat/module/elasticsearch/ingest_pipeline/ingest_pipeline.go index 7dd8da62104c..5612c0def41b 100644 --- a/metricbeat/module/elasticsearch/ingest_pipeline/ingest_pipeline.go +++ b/metricbeat/module/elasticsearch/ingest_pipeline/ingest_pipeline.go @@ -94,14 +94,6 @@ func New(base mb.BaseMetricSet) (mb.MetricSet, error) { // format. It publishes the event which is then forwarded to the output. In case // of an error set the Error field of mb.Event or simply call report.Error(). func (m *IngestMetricSet) Fetch(report mb.ReporterV2) error { - shouldSkip, err := m.ShouldSkipFetch() - if err != nil { - return err - } - if shouldSkip { - return nil - } - uri, err := url.Parse(m.GetURI()) if err != nil { return err