From 18e0a6702da1d65790ffaf04aee76ff969172ff7 Mon Sep 17 00:00:00 2001 From: Anderson Queiroz Date: Tue, 26 Sep 2023 08:12:26 +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 ++-- .../fields/module_fields_collector.go | 5 ++-- libbeat/tests/system/beat/beat.py | 3 ++- metricbeat/docs/fields.asciidoc | 24 +++++++++++++++++++ metricbeat/module/system/_meta/fields.yml | 5 ++++ metricbeat/module/system/fields.go | 2 +- .../module/system/process/_meta/fields.yml | 10 ++++++-- metricbeat/module/system/process/process.go | 2 +- .../module/system/process/process_test.go | 6 ++++- 12 files changed, 59 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.next.asciidoc b/CHANGELOG.next.asciidoc index c63a2234573d..1a8a0b63dc95 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 2d20996227d8..44e1d2ad4c20 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-20230913120026-c3fa121ad082 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-20230913120026-c3fa121ad082/LICENSE.txt: Apache License Version 2.0, January 2004 diff --git a/go.mod b/go.mod index cfbc0ddeb938..c80487ec33cb 100644 --- a/go.mod +++ b/go.mod @@ -406,3 +406,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-20230926055627-a33e2d04a748 diff --git a/go.sum b/go.sum index 93222d899eea..a98c21a05d1f 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-20230926055627-a33e2d04a748 h1:ELaKTbNHnjuAlRnJlGR4RY0AwymrENsA9NAqySBYRs8= +github.com/AndersonQ/elastic-agent-system-metrics v0.0.0-20230926055627-a33e2d04a748/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.13 h1:qFiBWeBfjsBId+i31rggyW2ZjzA9qBR github.com/elastic/elastic-agent-libs v0.3.13/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..4194ccf3af8d 100644 --- a/metricbeat/docs/fields.asciidoc +++ b/metricbeat/docs/fields.asciidoc @@ -60655,6 +60655,18 @@ format: percent -- +*`process.num_threads`*:: ++ +-- +The number of threads in the process. + + +type: integer + +format: number + +-- + [float] === system @@ -62020,6 +62032,18 @@ alias to: process.pgid -- +*`system.process.num_threads`*:: ++ +-- +Number of threads in the process + + +type: alias + +alias to: process.num_threads + +-- + *`system.process.cmdline`*:: + -- diff --git a/metricbeat/module/system/_meta/fields.yml b/metricbeat/module/system/_meta/fields.yml index 64a867077bdd..a721e2a67b03 100644 --- a/metricbeat/module/system/_meta/fields.yml +++ b/metricbeat/module/system/_meta/fields.yml @@ -30,6 +30,11 @@ format: percent description: > The percentage of memory the process occupied in main memory (RAM). + - name: num_threads + type: integer + format: number + description: > + The number of threads in the process. - name: system type: group description: > diff --git a/metricbeat/module/system/fields.go b/metricbeat/module/system/fields.go index 13bc793b2b3f..751ef87f1234 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/fields.yml b/metricbeat/module/system/process/_meta/fields.yml index 65d96ee839d0..e9e20f1b57bd 100644 --- a/metricbeat/module/system/process/_meta/fields.yml +++ b/metricbeat/module/system/process/_meta/fields.yml @@ -24,6 +24,12 @@ type: alias path: process.pgid migration: true + - name: num_threads + type: alias + description: > + Number of threads in the process + path: process.num_threads + migration: true - name: cmdline type: keyword description: > @@ -345,7 +351,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 +425,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()) }