From 98b2b4dbfc7b3feabce3fd7fb1a5d4dc254f484d Mon Sep 17 00:00:00 2001 From: Anderson Queiroz Date: Wed, 27 Sep 2023 18:18:13 +0200 Subject: [PATCH] metricbeat: collect number of threads per process Upgrades elastic-agent-system-metrics to v0.5.0 in order to collect the number of threads per process. --- CHANGELOG.next.asciidoc | 3 +++ NOTICE.txt | 6 +++--- go.mod | 2 ++ go.sum | 4 ++-- libbeat/generator/fields/module_fields_collector.go | 5 +++-- libbeat/tests/system/beat/beat.py | 3 ++- metricbeat/docs/fields.asciidoc | 10 ++++++++++ metricbeat/module/system/fields.go | 2 +- metricbeat/module/system/process/_meta/data.json | 5 +++-- metricbeat/module/system/process/_meta/fields.yml | 8 ++++++-- metricbeat/module/system/process/process.go | 2 +- metricbeat/module/system/process/process_test.go | 6 +++++- metricbeat/module/system/test_system.py | 4 ++-- 13 files changed, 43 insertions(+), 17 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index a8ed9f032c5f..710672e5fb52 100644 --- a/CHANGELOG.next.asciidoc +++ b/CHANGELOG.next.asciidoc @@ -21,6 +21,9 @@ https://github.com/elastic/beats/compare/v8.8.1\...main[Check the HEAD diff] *Metricbeat* + - System module now collects the number of threads per process. +The elastic-agent-system-metrics was updated to v0.5.0 as the number of threads +is collected by it. *Osquerybeat* diff --git a/NOTICE.txt b/NOTICE.txt index bc45b225aef7..32f5d0d165dd 100644 --- a/NOTICE.txt +++ b/NOTICE.txt @@ -13025,12 +13025,12 @@ these terms. -------------------------------------------------------------------------------- -Dependency : github.com/elastic/elastic-agent-system-metrics -Version: v0.6.1 +Dependency : github.com/AndersonQ/elastic-agent-system-metrics +Version: v0.0.0-20230926055627-a33e2d04a748 Licence type (autodetected): Apache-2.0 -------------------------------------------------------------------------------- -Contents of probable licence file $GOMODCACHE/github.com/elastic/elastic-agent-system-metrics@v0.6.1/LICENSE.txt: +Contents of probable licence file $GOMODCACHE/github.com/!anderson!q/elastic-agent-system-metrics@v0.0.0-20230926055627-a33e2d04a748/LICENSE.txt: Apache License Version 2.0, January 2004 diff --git a/go.mod b/go.mod index 4cf3e5c020e9..aace1ca5d5e1 100644 --- a/go.mod +++ b/go.mod @@ -407,3 +407,5 @@ replace ( // Exclude this version because the version has an invalid checksum. exclude github.com/docker/distribution v2.8.0+incompatible + +replace github.com/elastic/elastic-agent-system-metrics => github.com/AndersonQ/elastic-agent-system-metrics v0.0.0-20230929151341-2f28d53433fc diff --git a/go.sum b/go.sum index 371aa1efbb21..b7a595f403ca 100644 --- a/go.sum +++ b/go.sum @@ -79,6 +79,8 @@ gioui.org v0.0.0-20210308172011-57750fc8a0a6/go.mod h1:RSH6KIUZ0p2xy5zHDxgAM4zum git.sr.ht/~sbinet/gg v0.3.1/go.mod h1:KGYtlADtqsqANL9ueOFkWymvzUvLMQllU5Ixo+8v3pc= github.com/99designs/go-keychain v0.0.0-20191008050251-8e49817e8af4/go.mod h1:hN7oaIRCjzsZ2dE+yG5k+rsdt3qcwykqK6HVGcKwsw4= github.com/99designs/keyring v1.2.1/go.mod h1:fc+wB5KTk9wQ9sDx0kFXB3A0MaeGHM9AwRStKOQ5vOA= +github.com/AndersonQ/elastic-agent-system-metrics v0.0.0-20230929151341-2f28d53433fc h1:f7V2y9K6VV+h6jxYB3gkumxLjY+tYXyn5ZKopsEs7N4= +github.com/AndersonQ/elastic-agent-system-metrics v0.0.0-20230929151341-2f28d53433fc/go.mod h1:e2jSj1Fnnyhl21p2g52qhYCyyizX9Lup3z2m/3E9kvg= github.com/Azure/azure-amqp-common-go/v3 v3.2.1 h1:uQyDk81yn5hTP1pW4Za+zHzy97/f4vDz9o1d/exI4j4= github.com/Azure/azure-amqp-common-go/v3 v3.2.1/go.mod h1:O6X1iYHP7s2x7NjUKsXVhkwWrQhxrd+d8/3rRadj4CI= github.com/Azure/azure-event-hubs-go/v3 v3.3.15 h1:2yAik9gS5Qjs4Z6EM1B6d0tfZJ506B/0oA08JlRQxb8= @@ -657,8 +659,6 @@ github.com/elastic/elastic-agent-libs v0.3.15-0.20230913212237-dbdaf18c898b h1:a github.com/elastic/elastic-agent-libs v0.3.15-0.20230913212237-dbdaf18c898b/go.mod h1:mpSfrigixx8x+uMxWKl4LtdlrKIhZbA4yT2eIeIazUQ= github.com/elastic/elastic-agent-shipper-client v0.5.1-0.20230228231646-f04347b666f3 h1:sb+25XJn/JcC9/VL8HX4r4QXSUq4uTNzGS2kxOE7u1U= github.com/elastic/elastic-agent-shipper-client v0.5.1-0.20230228231646-f04347b666f3/go.mod h1:rWarFM7qYxJKsi9WcV6ONcFjH/NA3niDNpTxO+8/GVI= -github.com/elastic/elastic-agent-system-metrics v0.6.1 h1:LCN1lvQTkdUuU/rKlpKyVMDU/G/I8/iZWCaW6K+mo4o= -github.com/elastic/elastic-agent-system-metrics v0.6.1/go.mod h1:Bj8XM/uNKm553blQHkGNEICRLGnVEtw8yttmV5vBngA= github.com/elastic/elastic-transport-go/v8 v8.0.0-20230329154755-1a3c63de0db6/go.mod h1:87Tcz8IVNe6rVSLdBux1o/PEItLtyabHU3naC7IoqKI= github.com/elastic/elastic-transport-go/v8 v8.3.0 h1:DJGxovyQLXGr62e9nDMPSxRyWION0Bh6d9eCFBriiHo= github.com/elastic/elastic-transport-go/v8 v8.3.0/go.mod h1:87Tcz8IVNe6rVSLdBux1o/PEItLtyabHU3naC7IoqKI= diff --git a/libbeat/generator/fields/module_fields_collector.go b/libbeat/generator/fields/module_fields_collector.go index 5c55dea58296..85f917cacf60 100644 --- a/libbeat/generator/fields/module_fields_collector.go +++ b/libbeat/generator/fields/module_fields_collector.go @@ -19,6 +19,7 @@ package fields import ( "io/ioutil" + "os" "path/filepath" ) @@ -30,9 +31,9 @@ var indentByModule = map[string]int{ "protos": 8, } -// GetModules returns a the list of modules for the given modules directory +// GetModules returns a list of modules for the given modules directory func GetModules(modulesDir string) ([]string, error) { - moduleInfos, err := ioutil.ReadDir(modulesDir) + moduleInfos, err := os.ReadDir(modulesDir) if err != nil { return nil, err } diff --git a/libbeat/tests/system/beat/beat.py b/libbeat/tests/system/beat/beat.py index 004c5efbd387..8fe74193b918 100644 --- a/libbeat/tests/system/beat/beat.py +++ b/libbeat/tests/system/beat/beat.py @@ -717,6 +717,7 @@ def extract_fields(doc_list, name): if not os.path.isfile(path): path = os.path.abspath(os.path.dirname( __file__) + "../../../../_meta/fields.common.yml") + with open(path, encoding="utf-8") as f2: content = f2.read() @@ -788,7 +789,7 @@ def output_count(self, pred, output_file=None): def assert_fields_are_documented(self, evt): """ Assert that all keys present in evt are documented in fields.yml. - This reads from the global fields.yml, means `make collect` has to be run before the check. + This reads from the global fields.yml, means `mage fields` has to be run before the check. """ expected_fields, dict_fields, aliases = self.load_fields() flat = self.flatten_object(evt, dict_fields) diff --git a/metricbeat/docs/fields.asciidoc b/metricbeat/docs/fields.asciidoc index 6e7e895a56d4..4134f527591d 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -62020,6 +62020,16 @@ alias to: process.pgid -- +*`system.process.num_threads`*:: ++ +-- +Number of threads in the process + + +type: integer + +-- + *`system.process.cmdline`*:: + -- diff --git a/metricbeat/module/system/fields.go b/metricbeat/module/system/fields.go index 13bc793b2b3f..e53fbea4708d 100644 --- a/metricbeat/module/system/fields.go +++ b/metricbeat/module/system/fields.go @@ -32,5 +32,5 @@ func init() { // AssetSystem returns asset data. // This is the base64 encoded zlib format compressed contents of module/system. func AssetSystem() string { - return "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" + return "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" } diff --git a/metricbeat/module/system/process/_meta/data.json b/metricbeat/module/system/process/_meta/data.json index ed81cf1ec1e7..807d76eb878c 100644 --- a/metricbeat/module/system/process/_meta/data.json +++ b/metricbeat/module/system/process/_meta/data.json @@ -250,10 +250,11 @@ "share": 14946304, "size": 1725992960 }, - "state": "sleeping" + "state": "sleeping", + "num_threads": 42 } }, "user": { "name": "alexk" } -} \ No newline at end of file +} diff --git a/metricbeat/module/system/process/_meta/fields.yml b/metricbeat/module/system/process/_meta/fields.yml index 65d96ee839d0..0ed69326f93f 100644 --- a/metricbeat/module/system/process/_meta/fields.yml +++ b/metricbeat/module/system/process/_meta/fields.yml @@ -24,6 +24,10 @@ type: alias path: process.pgid migration: true + - name: num_threads + type: integer + description: > + Number of threads in the process - name: cmdline type: keyword description: > @@ -345,7 +349,7 @@ - name: stats.user.pct type: scaled_float description: time the cgroup spent in user space, as a percentage of total CPU time - + - name: stats.user.norm.pct type: scaled_float description: time the cgroup spent in user space, as a percentage of total CPU time, normalized by CPU count. @@ -419,7 +423,7 @@ type: long format: bytes description: memory max threshhold - + - name: mem.events type: group description: number of times the controller tripped a given usage level diff --git a/metricbeat/module/system/process/process.go b/metricbeat/module/system/process/process.go index 2274f1846d6d..b67ce137bd9b 100644 --- a/metricbeat/module/system/process/process.go +++ b/metricbeat/module/system/process/process.go @@ -32,7 +32,7 @@ import ( "github.com/elastic/elastic-agent-system-metrics/metric/system/resolve" ) -var debugf = logp.MakeDebug("system.process") +var debugf = logp.NewLogger("system.process").Debugf func init() { mb.Registry.MustAddMetricSet("system", "process", New, diff --git a/metricbeat/module/system/process/process_test.go b/metricbeat/module/system/process/process_test.go index f1a29648477a..d9f57f2e3fee 100644 --- a/metricbeat/module/system/process/process_test.go +++ b/metricbeat/module/system/process/process_test.go @@ -24,6 +24,7 @@ import ( "time" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" mbtest "github.com/elastic/beats/v7/metricbeat/mb/testing" _ "github.com/elastic/beats/v7/metricbeat/module/system" @@ -32,7 +33,9 @@ import ( ) func TestFetch(t *testing.T) { - logp.DevelopmentSetup() + err := logp.DevelopmentSetup() + require.NoError(t, err, "could not set the logger to DevelopmentSetup") + f := mbtest.NewReportingMetricSetV2Error(t, getConfig()) events, errs := mbtest.ReportingFetchV2Error(f) assert.Empty(t, errs) @@ -44,6 +47,7 @@ func TestFetch(t *testing.T) { assert.Empty(t, errs) assert.NotEmpty(t, events) + t.Logf("fetched %d events, showing events[0]:", len(events)) t.Logf("%s/%s event: %+v", f.Module().Name(), f.Name(), events[0].BeatEvent("system", "process").Fields.StringToPrint()) } diff --git a/metricbeat/module/system/test_system.py b/metricbeat/module/system/test_system.py index 9bf15c82444b..039e7299a8a6 100644 --- a/metricbeat/module/system/test_system.py +++ b/metricbeat/module/system/test_system.py @@ -112,7 +112,7 @@ # for some kernel level processes. fd is also part of the system process, but # is not available on all OSes and requires root to read for all processes. # cgroup is only available on linux. -SYSTEM_PROCESS_FIELDS = ["cpu", "memory", "state"] +SYSTEM_PROCESS_FIELDS = ["cpu", "memory", "state", "num_threads"] class Test(metricbeat.BaseTest): @@ -439,7 +439,7 @@ def test_process(self): @unittest.skipUnless(re.match("(?i)linux|darwin|freebsd", sys.platform), "os") def test_process_unix(self): """ - Test system/process output for fields specific of unix systems. + Test system/process output checking it has got all expected fields specific of unix systems and no extra ones. """ self.render_config_template(