feat(inputs.procstat): Add child level tag (#16105)

Co-authored-by: Thomas Casteleyn <thomas.casteleyn@me.com>
This commit is contained in:
tguenneguez 2025-03-07 01:13:36 +01:00 committed by GitHub
parent b2d81f056b
commit fc6bf15944
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
4 changed files with 31 additions and 1 deletions

View File

@ -77,6 +77,8 @@ See the [CONFIGURATION.md][CONFIGURATION.md] for more details.
## dest -- destination address of the process socket (non-unix sockets)
## dest_port -- destination port of the process socket (non-unix sockets)
## name -- name of the process socket (unix sockets only)
## Available for procstat_lookup:
## level -- level of the process filtering
# tag_with = []
## Properties to collect
@ -176,6 +178,8 @@ Below are an example set of tags and fields:
- cgroup_full (when cgroup or systemd_unit is used with glob)
- supervisor_unit (when defined)
- win_service (when defined)
- parent_pid (for child processes)
- child_level (for child processes)
- fields:
- child_major_faults (int)
- child_minor_faults (int)

View File

@ -202,9 +202,11 @@ func (f *filter) applyFilter() ([]processGroup, error) {
tags[k] = v
}
tags["parent_pid"] = strconv.FormatInt(int64(p.Pid), 10)
children = append(children, processGroup{
processes: c,
tags: tags,
level: depth + 1,
})
}
}

View File

@ -76,6 +76,7 @@ type pidsTags struct {
type processGroup struct {
processes []*gopsprocess.Process
tags map[string]string
level int
}
func (*Procstat) SampleConfig() string {
@ -98,7 +99,7 @@ func (p *Procstat) Init() error {
p.cfg.tagging = make(map[string]bool, len(p.TagWith))
for _, tag := range p.TagWith {
switch tag {
case "cmdline", "pid", "ppid", "status", "user":
case "cmdline", "pid", "ppid", "status", "user", "child_level", "parent_pid", "level":
case "protocol", "state", "src", "src_port", "dest", "dest_port", "name": // socket only
if !slices.Contains(p.Properties, "sockets") {
return fmt.Errorf("socket tagging option %q specified without sockets enabled", tag)
@ -349,6 +350,7 @@ func (p *Procstat) gatherNew(acc telegraf.Accumulator) error {
var count int
for _, g := range groups {
count += len(g.processes)
level := strconv.Itoa(g.level)
for _, gp := range g.processes {
// Skip over non-running processes
if running, err := gp.IsRunning(); err != nil || !running {
@ -375,6 +377,9 @@ func (p *Procstat) gatherNew(acc telegraf.Accumulator) error {
process.setTag("process_name", p.ProcessName)
}
tags["filter"] = f.Name
if p.cfg.tagging["level"] {
tags["level"] = level
}
process = &proc{
Process: gp,
@ -394,6 +399,23 @@ func (p *Procstat) gatherNew(acc telegraf.Accumulator) error {
acc.AddMetric(m)
}
}
if p.cfg.tagging["level"] {
// Add lookup statistics-metric
acc.AddFields(
"procstat_lookup",
map[string]interface{}{
"pid_count": len(g.processes),
"running": len(running),
"result_code": 0,
"level": g.level,
},
map[string]string{
"filter": f.Name,
"result": "success",
},
now,
)
}
}
// Add lookup statistics-metric

View File

@ -48,6 +48,8 @@
## dest -- destination address of the process socket (non-unix sockets)
## dest_port -- destination port of the process socket (non-unix sockets)
## name -- name of the process socket (unix sockets only)
## Available for procstat_lookup:
## level -- level of the process filtering
# tag_with = []
## Properties to collect