diff --git a/src/libs/zbxsysinfo/linux/cpu.c b/src/libs/zbxsysinfo/linux/cpu.c index 67dd157..cdf4952 100644 --- a/src/libs/zbxsysinfo/linux/cpu.c +++ b/src/libs/zbxsysinfo/linux/cpu.c @@ -125,6 +125,36 @@ int SYSTEM_CPU_UTIL(const char *cmd, const char *param, unsigned flags, AGENT_RE else if (ZBX_AVG5 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].system5) else if (ZBX_AVG15 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].system15) } + else if( 0 == strcmp(type,"interrupt")) + { + if (ZBX_AVG1 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].interrupt1) + else if (ZBX_AVG5 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].interrupt5) + else if (ZBX_AVG15 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].interrupt15) + } + else if( 0 == strcmp(type,"wait")) + { + if(ZBX_AVG1 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].iowait1) + else if(ZBX_AVG5 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].iowait5) + else if(ZBX_AVG15 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].iowait15) + } + else if( 0 == strcmp(type,"irq")) + { + if(ZBX_AVG1 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].irq1) + else if(ZBX_AVG5 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].irq5) + else if(ZBX_AVG15 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].irq15) + } + else if( 0 == strcmp(type,"softirq")) + { + if(ZBX_AVG1 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].softirq1) + else if(ZBX_AVG5 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].softirq5) + else if(ZBX_AVG5 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].softirq15) + } + else if( 0 == strcmp(type,"steal")) + { + if(ZBX_AVG1 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].steal1) + else if(ZBX_AVG1 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].steal5) + else if(ZBX_AVG1 == mode) SET_DBL_RESULT(result, collector->cpus.cpu[cpu_num].steal15) + } else return SYSINFO_RET_FAIL; diff --git a/src/zabbix_agent/cpustat.c b/src/zabbix_agent/cpustat.c index 2dd2103..cccf1d2 100644 --- a/src/zabbix_agent/cpustat.c +++ b/src/zabbix_agent/cpustat.c @@ -184,7 +184,10 @@ static int get_cpustat( zbx_uint64_t *cpu_nice, zbx_uint64_t *cpu_idle, zbx_uint64_t *cpu_interrupt, - zbx_uint64_t *cpu_iowait + zbx_uint64_t *cpu_iowait, + zbx_uint64_t *cpu_irq, + zbx_uint64_t *cpu_softirq, + zbx_uint64_t *cpu_steal ) { #if defined(HAVE_PROC_STAT) @@ -235,6 +238,9 @@ static int get_cpustat( *cpu_user = *cpu_system = *cpu_nice = *cpu_idle = -1; *cpu_interrupt = 0; *cpu_iowait = 0; + *cpu_irq = 0; + *cpu_softirq = 0; + *cpu_steal = 0; zbx_snprintf(cpu_name, sizeof(cpu_name), "cpu%c ", cpuid > 0 ? '0' + (cpuid - 1) : ' '); @@ -242,7 +248,8 @@ static int get_cpustat( { if(strstr(line, cpu_name) == NULL) continue; - sscanf(line, "%*s " ZBX_FS_UI64 " " ZBX_FS_UI64 " " ZBX_FS_UI64 " " ZBX_FS_UI64, cpu_user, cpu_nice, cpu_system, cpu_idle); + sscanf(line, "%*s " ZBX_FS_UI64 " " ZBX_FS_UI64 " " ZBX_FS_UI64 " " ZBX_FS_UI64 " " ZBX_FS_UI64 " " ZBX_FS_UI64 " " ZBX_FS_UI64 " " ZBX_FS_UI64, + cpu_user, cpu_nice, cpu_system, cpu_idle, cpu_iowait, cpu_irq, cpu_softirq, cpu_steal); break; } zbx_fclose(file); @@ -389,7 +396,10 @@ static void apply_cpustat( zbx_uint64_t cpu_nice, zbx_uint64_t cpu_idle, zbx_uint64_t cpu_interrupt, - zbx_uint64_t cpu_iowait + zbx_uint64_t cpu_iowait, + zbx_uint64_t cpu_irq, + zbx_uint64_t cpu_softirq, + zbx_uint64_t cpu_steal ) { register int i = 0; @@ -401,6 +411,9 @@ static void apply_cpustat( idle = 0, idle1 = 0, idle5 = 0, idle15 = 0, interrupt = 0, interrupt1 = 0, interrupt5 = 0, interrupt15 = 0, iowait = 0, iowait1 = 0, iowait5 = 0, iowait15 = 0, + irq = 0, irq1 = 0, irq5 = 0, irq15 = 0, + softirq = 0, softirq1 = 0, softirq5 = 0, softirq15 = 0, + steal = 0, steal1 = 0, steal5 = 0, steal15 = 0, all = 0, all1 = 0, all5 = 0, all15 = 0; ZBX_SINGLE_CPU_STAT_DATA @@ -418,8 +431,11 @@ static void apply_cpustat( curr_cpu->h_idle[i] = idle = cpu_idle; curr_cpu->h_interrupt[i] = interrupt = cpu_interrupt; curr_cpu->h_iowait[i] = iowait = cpu_iowait; + curr_cpu->h_irq[i] = irq = cpu_irq; + curr_cpu->h_softirq[i] = softirq = cpu_softirq; + curr_cpu->h_steal[i] = steal = cpu_steal; - all = cpu_user + cpu_system + cpu_nice + cpu_idle + cpu_interrupt + cpu_iowait; + all = cpu_user + cpu_system + cpu_nice + cpu_idle + cpu_interrupt + cpu_iowait + cpu_irq + cpu_softirq + cpu_steal; break; } @@ -440,8 +456,11 @@ static void apply_cpustat( idle ## t = curr_cpu->h_idle[i]; \ interrupt ## t = curr_cpu->h_interrupt[i]; \ iowait ## t = curr_cpu->h_iowait[i]; \ + irq ## t = curr_cpu->h_irq[i]; \ + softirq ## t = curr_cpu->h_softirq[i]; \ + steal ## t = curr_cpu->h_steal[i]; \ all ## t = user ## t + system ## t + nice ## t + idle ## t + \ - interrupt ## t + iowait ## t; \ + interrupt ## t + iowait ## t + irq ## t + softirq ## t + steal ## t; \ } SAVE_CPU_CLOCK_FOR(1); @@ -483,6 +502,18 @@ static void apply_cpustat( CALC_CPU_LOAD(iowait, 1); CALC_CPU_LOAD(iowait, 5); CALC_CPU_LOAD(iowait, 15); + + CALC_CPU_LOAD(irq, 1); + CALC_CPU_LOAD(irq, 5); + CALC_CPU_LOAD(irq, 15); + + CALC_CPU_LOAD(softirq, 1); + CALC_CPU_LOAD(softirq, 5); + CALC_CPU_LOAD(softirq, 15); + + CALC_CPU_LOAD(steal, 1); + CALC_CPU_LOAD(steal, 5); + CALC_CPU_LOAD(steal, 15); } #endif /* not _WINDOWS */ @@ -602,14 +633,14 @@ void collect_cpustat(ZBX_CPUS_STAT_DATA *pcpus) register int i = 0; int now = 0; - zbx_uint64_t cpu_user, cpu_nice, cpu_system, cpu_idle, cpu_interrupt, cpu_iowait; + zbx_uint64_t cpu_user, cpu_nice, cpu_system, cpu_idle, cpu_interrupt, cpu_iowait, cpu_irq, cpu_softirq, cpu_steal; for ( i = 0; i <= pcpus->count; i++ ) { - if(0 != get_cpustat(i, &now, &cpu_user, &cpu_system, &cpu_nice, &cpu_idle, &cpu_interrupt, &cpu_iowait)) + if(0 != get_cpustat(i, &now, &cpu_user, &cpu_system, &cpu_nice, &cpu_idle, &cpu_interrupt, &cpu_iowait, &cpu_irq, &cpu_softirq, &cpu_steal)) continue; - apply_cpustat(pcpus, i, now, cpu_user, cpu_system, cpu_nice, cpu_idle, cpu_interrupt, cpu_iowait); + apply_cpustat(pcpus, i, now, cpu_user, cpu_system, cpu_nice, cpu_idle, cpu_interrupt, cpu_iowait, cpu_irq, cpu_softirq, cpu_steal); } #endif /* _WINDOWS */ diff --git a/src/zabbix_agent/cpustat.h b/src/zabbix_agent/cpustat.h index 9551707..412e0d3 100644 --- a/src/zabbix_agent/cpustat.h +++ b/src/zabbix_agent/cpustat.h @@ -72,6 +72,9 @@ zbx_uint64_t h_idle[MAX_CPU_HISTORY]; zbx_uint64_t h_interrupt[MAX_CPU_HISTORY]; zbx_uint64_t h_iowait[MAX_CPU_HISTORY]; + zbx_uint64_t h_irq[MAX_CPU_HISTORY]; + zbx_uint64_t h_softirq[MAX_CPU_HISTORY]; + zbx_uint64_t h_steal[MAX_CPU_HISTORY]; /* public */ double user1; @@ -92,6 +95,15 @@ double iowait1; double iowait5; double iowait15; + double irq1; + double irq5; + double irq15; + double softirq1; + double softirq5; + double softirq15; + double steal1; + double steal5; + double steal15; } ZBX_SINGLE_CPU_STAT_DATA;