Use json omitzero for struct-typed fields in cgroup structs#288
Merged
orestisfl merged 1 commit intoelastic:mainfrom Feb 26, 2026
Merged
Conversation
encoding/json's omitempty is silently ignored on struct fields — zero-valued structs are always serialized regardless of the tag. Go 1.24's omitzero fixes this by checking IsZero() or the zero value. No downstream production code is affected (consumers use struct tags via go-structform, not json tags), but this corrects a latent bug if these types are ever json.Marshal'd directly.
Member
|
@orestisfl have you tried to use a local |
Contributor
Author
|
@rdner testded it locally |
rdner
approved these changes
Feb 25, 2026
orestisfl
added a commit
to orestisfl/elastic-agent-system-metrics
that referenced
this pull request
Feb 26, 2026
The CFS, UsOpt, and opt.Uint fields added on this branch used omitempty, which is silently ignored for structs by encoding/json. Switch to omitzero (Go 1.24) consistent with the fix in elastic#288. Refactor omitzero_test.go to table-driven style with exact key equality via assert.Equal instead of Contains/NotContains.
This was referenced Feb 26, 2026
orestisfl
added a commit
to elastic/beats
that referenced
this pull request
Mar 11, 2026
…v2 CPU CFS data (#49098) Bumps the elastic-agent-system-metrics dependency to [v0.14.3](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.3), [v0.14.2](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.2) also included. ### What's Changed * Add Zswap Metrics by @orestisfl in elastic/elastic-agent-system-metrics#279 * PULL_REQUEST_TEMPLATE: Remove reference to non-existant CHANGELOG.md by @orestisfl in elastic/elastic-agent-system-metrics#286 * fix: remove shared context timeout from matrix tests by @orestisfl in elastic/elastic-agent-system-metrics#285 * Enable modernize linter and apply suggestions by @orestisfl in elastic/elastic-agent-system-metrics#287 * Use json omitzero for struct-typed fields in cgroup structs by @orestisfl in elastic/elastic-agent-system-metrics#288 * [cgv2] Add CPU CFS quota, period, and weight metrics by @orestisfl in elastic/elastic-agent-system-metrics#281 * Add missing zswap debug metrics by @orestisfl in elastic/elastic-agent-system-metrics#289 ## Disruptive User Impact None. New features. ## How to test this PR locally 1. Build metricbeat from the branch: ```bash cd metricbeat mage build ``` 2. Create a test config file `metricbeat.test.yml`: ```yaml metricbeat.modules: - module: system period: 5s metricsets: - memory - process process.include_top_n: by_cpu: 5 by_memory: 5 output.console: pretty: true logging.level: debug ``` 3. Run metricbeat: ```bash ./metricbeat -e -c metricbeat.test.yml ``` 4. Verify zswap memory metrics appear in the output (requires Linux with zswap enabled -- check with `cat /sys/module/zswap/parameters/enabled`): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "memory") | .system.memory.zswap' ``` Expected output (values will vary): ```json { "compressed": 950353920, "uncompressed": 3813502976 } ``` 5. To also verify the `zswap.debug.*` fields (requires debugfs access), grant the binary the `cap_dac_read_search` capability: ```bash sudo setcap cap_dac_read_search=+ep metricbeat ``` Then re-run. Expected output with debug fields: ```json { "compressed": 950353920, "uncompressed": 3813502976, "debug": { "decompress_fail": 0, "pool_limit_hit": 0, "pool_total_size": 950353920, "reject_alloc_fail": 0, "reject_compress_fail": 0, "reject_compress_poor": 0, "reject_kmemcache_fail": 0, "reject_reclaim_fail": 0, "stored_incompressible_pages": 16779, "stored_pages": 931031, "written_back_pages": 29111 } } ``` 6. Verify `cfs.weight` appears in process cgroup metrics (requires cgroupsv2): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "process") | .system.process.cgroup.cpu.cfs.weight // empty' ``` 7. Run unit tests: ```bash cd metricbeat go test ./module/system/... ```
mergify bot
pushed a commit
to elastic/beats
that referenced
this pull request
Mar 11, 2026
…v2 CPU CFS data (#49098) Bumps the elastic-agent-system-metrics dependency to [v0.14.3](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.3), [v0.14.2](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.2) also included. ### What's Changed * Add Zswap Metrics by @orestisfl in elastic/elastic-agent-system-metrics#279 * PULL_REQUEST_TEMPLATE: Remove reference to non-existant CHANGELOG.md by @orestisfl in elastic/elastic-agent-system-metrics#286 * fix: remove shared context timeout from matrix tests by @orestisfl in elastic/elastic-agent-system-metrics#285 * Enable modernize linter and apply suggestions by @orestisfl in elastic/elastic-agent-system-metrics#287 * Use json omitzero for struct-typed fields in cgroup structs by @orestisfl in elastic/elastic-agent-system-metrics#288 * [cgv2] Add CPU CFS quota, period, and weight metrics by @orestisfl in elastic/elastic-agent-system-metrics#281 * Add missing zswap debug metrics by @orestisfl in elastic/elastic-agent-system-metrics#289 ## Disruptive User Impact None. New features. ## How to test this PR locally 1. Build metricbeat from the branch: ```bash cd metricbeat mage build ``` 2. Create a test config file `metricbeat.test.yml`: ```yaml metricbeat.modules: - module: system period: 5s metricsets: - memory - process process.include_top_n: by_cpu: 5 by_memory: 5 output.console: pretty: true logging.level: debug ``` 3. Run metricbeat: ```bash ./metricbeat -e -c metricbeat.test.yml ``` 4. Verify zswap memory metrics appear in the output (requires Linux with zswap enabled -- check with `cat /sys/module/zswap/parameters/enabled`): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "memory") | .system.memory.zswap' ``` Expected output (values will vary): ```json { "compressed": 950353920, "uncompressed": 3813502976 } ``` 5. To also verify the `zswap.debug.*` fields (requires debugfs access), grant the binary the `cap_dac_read_search` capability: ```bash sudo setcap cap_dac_read_search=+ep metricbeat ``` Then re-run. Expected output with debug fields: ```json { "compressed": 950353920, "uncompressed": 3813502976, "debug": { "decompress_fail": 0, "pool_limit_hit": 0, "pool_total_size": 950353920, "reject_alloc_fail": 0, "reject_compress_fail": 0, "reject_compress_poor": 0, "reject_kmemcache_fail": 0, "reject_reclaim_fail": 0, "stored_incompressible_pages": 16779, "stored_pages": 931031, "written_back_pages": 29111 } } ``` 6. Verify `cfs.weight` appears in process cgroup metrics (requires cgroupsv2): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "process") | .system.process.cgroup.cpu.cfs.weight // empty' ``` 7. Run unit tests: ```bash cd metricbeat go test ./module/system/... ``` (cherry picked from commit eeabffa) # Conflicts: # metricbeat/module/system/fields.go
5 tasks
mergify bot
pushed a commit
to elastic/beats
that referenced
this pull request
Mar 11, 2026
…v2 CPU CFS data (#49098) Bumps the elastic-agent-system-metrics dependency to [v0.14.3](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.3), [v0.14.2](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.2) also included. ### What's Changed * Add Zswap Metrics by @orestisfl in elastic/elastic-agent-system-metrics#279 * PULL_REQUEST_TEMPLATE: Remove reference to non-existant CHANGELOG.md by @orestisfl in elastic/elastic-agent-system-metrics#286 * fix: remove shared context timeout from matrix tests by @orestisfl in elastic/elastic-agent-system-metrics#285 * Enable modernize linter and apply suggestions by @orestisfl in elastic/elastic-agent-system-metrics#287 * Use json omitzero for struct-typed fields in cgroup structs by @orestisfl in elastic/elastic-agent-system-metrics#288 * [cgv2] Add CPU CFS quota, period, and weight metrics by @orestisfl in elastic/elastic-agent-system-metrics#281 * Add missing zswap debug metrics by @orestisfl in elastic/elastic-agent-system-metrics#289 ## Disruptive User Impact None. New features. ## How to test this PR locally 1. Build metricbeat from the branch: ```bash cd metricbeat mage build ``` 2. Create a test config file `metricbeat.test.yml`: ```yaml metricbeat.modules: - module: system period: 5s metricsets: - memory - process process.include_top_n: by_cpu: 5 by_memory: 5 output.console: pretty: true logging.level: debug ``` 3. Run metricbeat: ```bash ./metricbeat -e -c metricbeat.test.yml ``` 4. Verify zswap memory metrics appear in the output (requires Linux with zswap enabled -- check with `cat /sys/module/zswap/parameters/enabled`): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "memory") | .system.memory.zswap' ``` Expected output (values will vary): ```json { "compressed": 950353920, "uncompressed": 3813502976 } ``` 5. To also verify the `zswap.debug.*` fields (requires debugfs access), grant the binary the `cap_dac_read_search` capability: ```bash sudo setcap cap_dac_read_search=+ep metricbeat ``` Then re-run. Expected output with debug fields: ```json { "compressed": 950353920, "uncompressed": 3813502976, "debug": { "decompress_fail": 0, "pool_limit_hit": 0, "pool_total_size": 950353920, "reject_alloc_fail": 0, "reject_compress_fail": 0, "reject_compress_poor": 0, "reject_kmemcache_fail": 0, "reject_reclaim_fail": 0, "stored_incompressible_pages": 16779, "stored_pages": 931031, "written_back_pages": 29111 } } ``` 6. Verify `cfs.weight` appears in process cgroup metrics (requires cgroupsv2): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "process") | .system.process.cgroup.cpu.cfs.weight // empty' ``` 7. Run unit tests: ```bash cd metricbeat go test ./module/system/... ``` (cherry picked from commit eeabffa)
5 tasks
mergify bot
pushed a commit
to elastic/beats
that referenced
this pull request
Mar 11, 2026
…v2 CPU CFS data (#49098) Bumps the elastic-agent-system-metrics dependency to [v0.14.3](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.3), [v0.14.2](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.2) also included. ### What's Changed * Add Zswap Metrics by @orestisfl in elastic/elastic-agent-system-metrics#279 * PULL_REQUEST_TEMPLATE: Remove reference to non-existant CHANGELOG.md by @orestisfl in elastic/elastic-agent-system-metrics#286 * fix: remove shared context timeout from matrix tests by @orestisfl in elastic/elastic-agent-system-metrics#285 * Enable modernize linter and apply suggestions by @orestisfl in elastic/elastic-agent-system-metrics#287 * Use json omitzero for struct-typed fields in cgroup structs by @orestisfl in elastic/elastic-agent-system-metrics#288 * [cgv2] Add CPU CFS quota, period, and weight metrics by @orestisfl in elastic/elastic-agent-system-metrics#281 * Add missing zswap debug metrics by @orestisfl in elastic/elastic-agent-system-metrics#289 ## Disruptive User Impact None. New features. ## How to test this PR locally 1. Build metricbeat from the branch: ```bash cd metricbeat mage build ``` 2. Create a test config file `metricbeat.test.yml`: ```yaml metricbeat.modules: - module: system period: 5s metricsets: - memory - process process.include_top_n: by_cpu: 5 by_memory: 5 output.console: pretty: true logging.level: debug ``` 3. Run metricbeat: ```bash ./metricbeat -e -c metricbeat.test.yml ``` 4. Verify zswap memory metrics appear in the output (requires Linux with zswap enabled -- check with `cat /sys/module/zswap/parameters/enabled`): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "memory") | .system.memory.zswap' ``` Expected output (values will vary): ```json { "compressed": 950353920, "uncompressed": 3813502976 } ``` 5. To also verify the `zswap.debug.*` fields (requires debugfs access), grant the binary the `cap_dac_read_search` capability: ```bash sudo setcap cap_dac_read_search=+ep metricbeat ``` Then re-run. Expected output with debug fields: ```json { "compressed": 950353920, "uncompressed": 3813502976, "debug": { "decompress_fail": 0, "pool_limit_hit": 0, "pool_total_size": 950353920, "reject_alloc_fail": 0, "reject_compress_fail": 0, "reject_compress_poor": 0, "reject_kmemcache_fail": 0, "reject_reclaim_fail": 0, "stored_incompressible_pages": 16779, "stored_pages": 931031, "written_back_pages": 29111 } } ``` 6. Verify `cfs.weight` appears in process cgroup metrics (requires cgroupsv2): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "process") | .system.process.cgroup.cpu.cfs.weight // empty' ``` 7. Run unit tests: ```bash cd metricbeat go test ./module/system/... ``` (cherry picked from commit eeabffa)
5 tasks
orestisfl
added a commit
to elastic/beats
that referenced
this pull request
Mar 11, 2026
…v2 CPU CFS data (#49098) (#49399) Bumps the elastic-agent-system-metrics dependency to [v0.14.3](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.3), [v0.14.2](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.2) also included. ### What's Changed * Add Zswap Metrics by @orestisfl in elastic/elastic-agent-system-metrics#279 * PULL_REQUEST_TEMPLATE: Remove reference to non-existant CHANGELOG.md by @orestisfl in elastic/elastic-agent-system-metrics#286 * fix: remove shared context timeout from matrix tests by @orestisfl in elastic/elastic-agent-system-metrics#285 * Enable modernize linter and apply suggestions by @orestisfl in elastic/elastic-agent-system-metrics#287 * Use json omitzero for struct-typed fields in cgroup structs by @orestisfl in elastic/elastic-agent-system-metrics#288 * [cgv2] Add CPU CFS quota, period, and weight metrics by @orestisfl in elastic/elastic-agent-system-metrics#281 * Add missing zswap debug metrics by @orestisfl in elastic/elastic-agent-system-metrics#289 ## Disruptive User Impact None. New features. ## How to test this PR locally 1. Build metricbeat from the branch: ```bash cd metricbeat mage build ``` 2. Create a test config file `metricbeat.test.yml`: ```yaml metricbeat.modules: - module: system period: 5s metricsets: - memory - process process.include_top_n: by_cpu: 5 by_memory: 5 output.console: pretty: true logging.level: debug ``` 3. Run metricbeat: ```bash ./metricbeat -e -c metricbeat.test.yml ``` 4. Verify zswap memory metrics appear in the output (requires Linux with zswap enabled -- check with `cat /sys/module/zswap/parameters/enabled`): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "memory") | .system.memory.zswap' ``` Expected output (values will vary): ```json { "compressed": 950353920, "uncompressed": 3813502976 } ``` 5. To also verify the `zswap.debug.*` fields (requires debugfs access), grant the binary the `cap_dac_read_search` capability: ```bash sudo setcap cap_dac_read_search=+ep metricbeat ``` Then re-run. Expected output with debug fields: ```json { "compressed": 950353920, "uncompressed": 3813502976, "debug": { "decompress_fail": 0, "pool_limit_hit": 0, "pool_total_size": 950353920, "reject_alloc_fail": 0, "reject_compress_fail": 0, "reject_compress_poor": 0, "reject_kmemcache_fail": 0, "reject_reclaim_fail": 0, "stored_incompressible_pages": 16779, "stored_pages": 931031, "written_back_pages": 29111 } } ``` 6. Verify `cfs.weight` appears in process cgroup metrics (requires cgroupsv2): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "process") | .system.process.cgroup.cpu.cfs.weight // empty' ``` 7. Run unit tests: ```bash cd metricbeat go test ./module/system/... ``` (cherry picked from commit eeabffa) Co-authored-by: Orestis Floros <orestis.floros@elastic.co>
orestisfl
added a commit
to elastic/beats
that referenced
this pull request
Mar 11, 2026
…v2 CPU CFS data (#49098) (#49400) Bumps the elastic-agent-system-metrics dependency to [v0.14.3](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.3), [v0.14.2](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.2) also included. ### What's Changed * Add Zswap Metrics by @orestisfl in elastic/elastic-agent-system-metrics#279 * PULL_REQUEST_TEMPLATE: Remove reference to non-existant CHANGELOG.md by @orestisfl in elastic/elastic-agent-system-metrics#286 * fix: remove shared context timeout from matrix tests by @orestisfl in elastic/elastic-agent-system-metrics#285 * Enable modernize linter and apply suggestions by @orestisfl in elastic/elastic-agent-system-metrics#287 * Use json omitzero for struct-typed fields in cgroup structs by @orestisfl in elastic/elastic-agent-system-metrics#288 * [cgv2] Add CPU CFS quota, period, and weight metrics by @orestisfl in elastic/elastic-agent-system-metrics#281 * Add missing zswap debug metrics by @orestisfl in elastic/elastic-agent-system-metrics#289 ## Disruptive User Impact None. New features. ## How to test this PR locally 1. Build metricbeat from the branch: ```bash cd metricbeat mage build ``` 2. Create a test config file `metricbeat.test.yml`: ```yaml metricbeat.modules: - module: system period: 5s metricsets: - memory - process process.include_top_n: by_cpu: 5 by_memory: 5 output.console: pretty: true logging.level: debug ``` 3. Run metricbeat: ```bash ./metricbeat -e -c metricbeat.test.yml ``` 4. Verify zswap memory metrics appear in the output (requires Linux with zswap enabled -- check with `cat /sys/module/zswap/parameters/enabled`): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "memory") | .system.memory.zswap' ``` Expected output (values will vary): ```json { "compressed": 950353920, "uncompressed": 3813502976 } ``` 5. To also verify the `zswap.debug.*` fields (requires debugfs access), grant the binary the `cap_dac_read_search` capability: ```bash sudo setcap cap_dac_read_search=+ep metricbeat ``` Then re-run. Expected output with debug fields: ```json { "compressed": 950353920, "uncompressed": 3813502976, "debug": { "decompress_fail": 0, "pool_limit_hit": 0, "pool_total_size": 950353920, "reject_alloc_fail": 0, "reject_compress_fail": 0, "reject_compress_poor": 0, "reject_kmemcache_fail": 0, "reject_reclaim_fail": 0, "stored_incompressible_pages": 16779, "stored_pages": 931031, "written_back_pages": 29111 } } ``` 6. Verify `cfs.weight` appears in process cgroup metrics (requires cgroupsv2): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "process") | .system.process.cgroup.cpu.cfs.weight // empty' ``` 7. Run unit tests: ```bash cd metricbeat go test ./module/system/... ``` (cherry picked from commit eeabffa) Co-authored-by: Orestis Floros <orestis.floros@elastic.co>
orestisfl
added a commit
to elastic/beats
that referenced
this pull request
Mar 11, 2026
…s for zswap and cgroups v2 CPU CFS data (#49398) * [Metricbeat] Bump elastic-agent-system-metrics for zswap and cgroups v2 CPU CFS data (#49098) Bumps the elastic-agent-system-metrics dependency to [v0.14.3](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.3), [v0.14.2](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.2) also included. ### What's Changed * Add Zswap Metrics by @orestisfl in elastic/elastic-agent-system-metrics#279 * PULL_REQUEST_TEMPLATE: Remove reference to non-existant CHANGELOG.md by @orestisfl in elastic/elastic-agent-system-metrics#286 * fix: remove shared context timeout from matrix tests by @orestisfl in elastic/elastic-agent-system-metrics#285 * Enable modernize linter and apply suggestions by @orestisfl in elastic/elastic-agent-system-metrics#287 * Use json omitzero for struct-typed fields in cgroup structs by @orestisfl in elastic/elastic-agent-system-metrics#288 * [cgv2] Add CPU CFS quota, period, and weight metrics by @orestisfl in elastic/elastic-agent-system-metrics#281 * Add missing zswap debug metrics by @orestisfl in elastic/elastic-agent-system-metrics#289 ## Disruptive User Impact None. New features. ## How to test this PR locally 1. Build metricbeat from the branch: ```bash cd metricbeat mage build ``` 2. Create a test config file `metricbeat.test.yml`: ```yaml metricbeat.modules: - module: system period: 5s metricsets: - memory - process process.include_top_n: by_cpu: 5 by_memory: 5 output.console: pretty: true logging.level: debug ``` 3. Run metricbeat: ```bash ./metricbeat -e -c metricbeat.test.yml ``` 4. Verify zswap memory metrics appear in the output (requires Linux with zswap enabled -- check with `cat /sys/module/zswap/parameters/enabled`): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "memory") | .system.memory.zswap' ``` Expected output (values will vary): ```json { "compressed": 950353920, "uncompressed": 3813502976 } ``` 5. To also verify the `zswap.debug.*` fields (requires debugfs access), grant the binary the `cap_dac_read_search` capability: ```bash sudo setcap cap_dac_read_search=+ep metricbeat ``` Then re-run. Expected output with debug fields: ```json { "compressed": 950353920, "uncompressed": 3813502976, "debug": { "decompress_fail": 0, "pool_limit_hit": 0, "pool_total_size": 950353920, "reject_alloc_fail": 0, "reject_compress_fail": 0, "reject_compress_poor": 0, "reject_kmemcache_fail": 0, "reject_reclaim_fail": 0, "stored_incompressible_pages": 16779, "stored_pages": 931031, "written_back_pages": 29111 } } ``` 6. Verify `cfs.weight` appears in process cgroup metrics (requires cgroupsv2): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "process") | .system.process.cgroup.cpu.cfs.weight // empty' ``` 7. Run unit tests: ```bash cd metricbeat go test ./module/system/... ``` (cherry picked from commit eeabffa) # Conflicts: # metricbeat/module/system/fields.go * Resolve cherry-pick conflict by regenerating fields.go The auto-generated metricbeat/module/system/fields.go had merge conflict markers from the backport cherry-pick. Regenerated using `mage fields` based on the successfully merged _meta/fields.yml files. --------- Co-authored-by: Orestis Floros <orestis.floros@elastic.co>
strawgate
pushed a commit
to elastic/beats
that referenced
this pull request
Mar 11, 2026
…v2 CPU CFS data (#49098) Bumps the elastic-agent-system-metrics dependency to [v0.14.3](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.3), [v0.14.2](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.2) also included. ### What's Changed * Add Zswap Metrics by @orestisfl in elastic/elastic-agent-system-metrics#279 * PULL_REQUEST_TEMPLATE: Remove reference to non-existant CHANGELOG.md by @orestisfl in elastic/elastic-agent-system-metrics#286 * fix: remove shared context timeout from matrix tests by @orestisfl in elastic/elastic-agent-system-metrics#285 * Enable modernize linter and apply suggestions by @orestisfl in elastic/elastic-agent-system-metrics#287 * Use json omitzero for struct-typed fields in cgroup structs by @orestisfl in elastic/elastic-agent-system-metrics#288 * [cgv2] Add CPU CFS quota, period, and weight metrics by @orestisfl in elastic/elastic-agent-system-metrics#281 * Add missing zswap debug metrics by @orestisfl in elastic/elastic-agent-system-metrics#289 ## Disruptive User Impact None. New features. ## How to test this PR locally 1. Build metricbeat from the branch: ```bash cd metricbeat mage build ``` 2. Create a test config file `metricbeat.test.yml`: ```yaml metricbeat.modules: - module: system period: 5s metricsets: - memory - process process.include_top_n: by_cpu: 5 by_memory: 5 output.console: pretty: true logging.level: debug ``` 3. Run metricbeat: ```bash ./metricbeat -e -c metricbeat.test.yml ``` 4. Verify zswap memory metrics appear in the output (requires Linux with zswap enabled -- check with `cat /sys/module/zswap/parameters/enabled`): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "memory") | .system.memory.zswap' ``` Expected output (values will vary): ```json { "compressed": 950353920, "uncompressed": 3813502976 } ``` 5. To also verify the `zswap.debug.*` fields (requires debugfs access), grant the binary the `cap_dac_read_search` capability: ```bash sudo setcap cap_dac_read_search=+ep metricbeat ``` Then re-run. Expected output with debug fields: ```json { "compressed": 950353920, "uncompressed": 3813502976, "debug": { "decompress_fail": 0, "pool_limit_hit": 0, "pool_total_size": 950353920, "reject_alloc_fail": 0, "reject_compress_fail": 0, "reject_compress_poor": 0, "reject_kmemcache_fail": 0, "reject_reclaim_fail": 0, "stored_incompressible_pages": 16779, "stored_pages": 931031, "written_back_pages": 29111 } } ``` 6. Verify `cfs.weight` appears in process cgroup metrics (requires cgroupsv2): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "process") | .system.process.cgroup.cpu.cfs.weight // empty' ``` 7. Run unit tests: ```bash cd metricbeat go test ./module/system/... ```
belimawr
pushed a commit
to belimawr/beats
that referenced
this pull request
Mar 12, 2026
…v2 CPU CFS data (elastic#49098) Bumps the elastic-agent-system-metrics dependency to [v0.14.3](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.3), [v0.14.2](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.2) also included. ### What's Changed * Add Zswap Metrics by @orestisfl in elastic/elastic-agent-system-metrics#279 * PULL_REQUEST_TEMPLATE: Remove reference to non-existant CHANGELOG.md by @orestisfl in elastic/elastic-agent-system-metrics#286 * fix: remove shared context timeout from matrix tests by @orestisfl in elastic/elastic-agent-system-metrics#285 * Enable modernize linter and apply suggestions by @orestisfl in elastic/elastic-agent-system-metrics#287 * Use json omitzero for struct-typed fields in cgroup structs by @orestisfl in elastic/elastic-agent-system-metrics#288 * [cgv2] Add CPU CFS quota, period, and weight metrics by @orestisfl in elastic/elastic-agent-system-metrics#281 * Add missing zswap debug metrics by @orestisfl in elastic/elastic-agent-system-metrics#289 ## Disruptive User Impact None. New features. ## How to test this PR locally 1. Build metricbeat from the branch: ```bash cd metricbeat mage build ``` 2. Create a test config file `metricbeat.test.yml`: ```yaml metricbeat.modules: - module: system period: 5s metricsets: - memory - process process.include_top_n: by_cpu: 5 by_memory: 5 output.console: pretty: true logging.level: debug ``` 3. Run metricbeat: ```bash ./metricbeat -e -c metricbeat.test.yml ``` 4. Verify zswap memory metrics appear in the output (requires Linux with zswap enabled -- check with `cat /sys/module/zswap/parameters/enabled`): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "memory") | .system.memory.zswap' ``` Expected output (values will vary): ```json { "compressed": 950353920, "uncompressed": 3813502976 } ``` 5. To also verify the `zswap.debug.*` fields (requires debugfs access), grant the binary the `cap_dac_read_search` capability: ```bash sudo setcap cap_dac_read_search=+ep metricbeat ``` Then re-run. Expected output with debug fields: ```json { "compressed": 950353920, "uncompressed": 3813502976, "debug": { "decompress_fail": 0, "pool_limit_hit": 0, "pool_total_size": 950353920, "reject_alloc_fail": 0, "reject_compress_fail": 0, "reject_compress_poor": 0, "reject_kmemcache_fail": 0, "reject_reclaim_fail": 0, "stored_incompressible_pages": 16779, "stored_pages": 931031, "written_back_pages": 29111 } } ``` 6. Verify `cfs.weight` appears in process cgroup metrics (requires cgroupsv2): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "process") | .system.process.cgroup.cpu.cfs.weight // empty' ``` 7. Run unit tests: ```bash cd metricbeat go test ./module/system/... ```
belimawr
pushed a commit
to belimawr/beats
that referenced
this pull request
Mar 12, 2026
…v2 CPU CFS data (elastic#49098) Bumps the elastic-agent-system-metrics dependency to [v0.14.3](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.3), [v0.14.2](https://github.com/elastic/elastic-agent-system-metrics/releases/tag/v0.14.2) also included. ### What's Changed * Add Zswap Metrics by @orestisfl in elastic/elastic-agent-system-metrics#279 * PULL_REQUEST_TEMPLATE: Remove reference to non-existant CHANGELOG.md by @orestisfl in elastic/elastic-agent-system-metrics#286 * fix: remove shared context timeout from matrix tests by @orestisfl in elastic/elastic-agent-system-metrics#285 * Enable modernize linter and apply suggestions by @orestisfl in elastic/elastic-agent-system-metrics#287 * Use json omitzero for struct-typed fields in cgroup structs by @orestisfl in elastic/elastic-agent-system-metrics#288 * [cgv2] Add CPU CFS quota, period, and weight metrics by @orestisfl in elastic/elastic-agent-system-metrics#281 * Add missing zswap debug metrics by @orestisfl in elastic/elastic-agent-system-metrics#289 ## Disruptive User Impact None. New features. ## How to test this PR locally 1. Build metricbeat from the branch: ```bash cd metricbeat mage build ``` 2. Create a test config file `metricbeat.test.yml`: ```yaml metricbeat.modules: - module: system period: 5s metricsets: - memory - process process.include_top_n: by_cpu: 5 by_memory: 5 output.console: pretty: true logging.level: debug ``` 3. Run metricbeat: ```bash ./metricbeat -e -c metricbeat.test.yml ``` 4. Verify zswap memory metrics appear in the output (requires Linux with zswap enabled -- check with `cat /sys/module/zswap/parameters/enabled`): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "memory") | .system.memory.zswap' ``` Expected output (values will vary): ```json { "compressed": 950353920, "uncompressed": 3813502976 } ``` 5. To also verify the `zswap.debug.*` fields (requires debugfs access), grant the binary the `cap_dac_read_search` capability: ```bash sudo setcap cap_dac_read_search=+ep metricbeat ``` Then re-run. Expected output with debug fields: ```json { "compressed": 950353920, "uncompressed": 3813502976, "debug": { "decompress_fail": 0, "pool_limit_hit": 0, "pool_total_size": 950353920, "reject_alloc_fail": 0, "reject_compress_fail": 0, "reject_compress_poor": 0, "reject_kmemcache_fail": 0, "reject_reclaim_fail": 0, "stored_incompressible_pages": 16779, "stored_pages": 931031, "written_back_pages": 29111 } } ``` 6. Verify `cfs.weight` appears in process cgroup metrics (requires cgroupsv2): ```bash ./metricbeat -e -c metricbeat.test.yml 2>/dev/null | jq 'select(.metricset.name == "process") | .system.process.cgroup.cpu.cfs.weight // empty' ``` 7. Run unit tests: ```bash cd metricbeat go test ./module/system/... ```
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What does this PR do?
encoding/json's omitempty is silently ignored on struct fields — zero-valued structs are always serialized regardless of the tag. Go 1.24's omitzero fixes this by checking IsZero() or the zero value.
Why is it important?
No downstream production code is affected (consumers use struct tags via go-structform, not json tags), but this corrects a latent bug if these types are ever json.Marshal'd directly.
Checklist
Related issues