github.com/netdata/go.d.plugin@v0.58.1/modules/phpfpm/collect.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package phpfpm
     4  
     5  import (
     6  	"math"
     7  
     8  	"github.com/netdata/go.d.plugin/pkg/stm"
     9  )
    10  
    11  func (p *Phpfpm) collect() (map[string]int64, error) {
    12  	st, err := p.client.getStatus()
    13  	if err != nil {
    14  		return nil, err
    15  	}
    16  
    17  	mx := stm.ToMap(st)
    18  	if !hasIdleProcesses(st.Processes) {
    19  		return mx, nil
    20  	}
    21  
    22  	calcIdleProcessesRequestsDuration(mx, st.Processes)
    23  	calcIdleProcessesLastRequestCPU(mx, st.Processes)
    24  	calcIdleProcessesLastRequestMemory(mx, st.Processes)
    25  	return mx, nil
    26  }
    27  
    28  func calcIdleProcessesRequestsDuration(mx map[string]int64, processes []proc) {
    29  	statProcesses(mx, processes, "ReqDur", func(p proc) int64 { return int64(p.Duration) })
    30  }
    31  
    32  func calcIdleProcessesLastRequestCPU(mx map[string]int64, processes []proc) {
    33  	statProcesses(mx, processes, "ReqCpu", func(p proc) int64 { return int64(p.CPU) })
    34  }
    35  
    36  func calcIdleProcessesLastRequestMemory(mx map[string]int64, processes []proc) {
    37  	statProcesses(mx, processes, "ReqMem", func(p proc) int64 { return p.Memory })
    38  }
    39  
    40  func hasIdleProcesses(processes []proc) bool {
    41  	for _, p := range processes {
    42  		if p.State == "Idle" {
    43  			return true
    44  		}
    45  	}
    46  	return false
    47  }
    48  
    49  type accessor func(p proc) int64
    50  
    51  func statProcesses(m map[string]int64, processes []proc, met string, acc accessor) {
    52  	var sum, count, min, max int64
    53  	for _, proc := range processes {
    54  		if proc.State != "Idle" {
    55  			continue
    56  		}
    57  
    58  		val := acc(proc)
    59  		sum += val
    60  		count += 1
    61  		if count == 1 {
    62  			min, max = val, val
    63  			continue
    64  		}
    65  		min = int64(math.Min(float64(min), float64(val)))
    66  		max = int64(math.Max(float64(max), float64(val)))
    67  	}
    68  
    69  	m["min"+met] = min
    70  	m["max"+met] = max
    71  	m["avg"+met] = sum / count
    72  }