summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorhugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2003-03-29 11:23:57 +0000
committerhugetoad <hugetoad@97f52cf1-0a1b-0410-bd0e-c28be96e8082>2003-03-29 11:23:57 +0000
commit1602ec066a9d52c9ec0365f234da6e76030975d4 (patch)
treeeef01dc211152aaf67dd96c22aeaf05fa5296706 /src
parentfc390fec510bdfb947145f911c817b4df9bccec7 (diff)
downloadzabbix-1602ec066a9d52c9ec0365f234da6e76030975d4.tar.gz
zabbix-1602ec066a9d52c9ec0365f234da6e76030975d4.tar.xz
zabbix-1602ec066a9d52c9ec0365f234da6e76030975d4.zip
- added support for disk_read_opsX[*],disk_write_opsX[*],disk_read_blksX[*],
disk_write_blksX[*] (Alexei) git-svn-id: svn://svn.zabbix.com/trunk@729 97f52cf1-0a1b-0410-bd0e-c28be96e8082
Diffstat (limited to 'src')
-rw-r--r--src/zabbix_agent/diskdevices.c252
-rw-r--r--src/zabbix_agent/diskdevices.h2
-rw-r--r--src/zabbix_agent/stats.c3
-rw-r--r--src/zabbix_agent/sysinfo.c138
-rw-r--r--src/zabbix_agent/sysinfo.h12
5 files changed, 335 insertions, 72 deletions
diff --git a/src/zabbix_agent/diskdevices.c b/src/zabbix_agent/diskdevices.c
index ee4c764c..fa3d8f22 100644
--- a/src/zabbix_agent/diskdevices.c
+++ b/src/zabbix_agent/diskdevices.c
@@ -50,6 +50,8 @@
/* Required for getpwuid */
#include <pwd.h>
+#include <dirent.h>
+
#include "common.h"
#include "sysinfo.h"
#include "security.h"
@@ -61,6 +63,104 @@
DISKDEVICE diskdevices[MAX_DISKDEVICES];
+int get_device_name(char *device,int major,int minor)
+{
+ DIR *dir;
+ struct dirent *entries;
+ struct stat buf;
+ char filename[1204];
+
+ dir=opendir("/dev");
+ while((entries=readdir(dir))!=NULL)
+ {
+ strncpy(filename,"/dev/",1024);
+ strncat(filename,entries->d_name,1024);
+
+ if(stat(filename,&buf)==0)
+ {
+/* printf("%s %d %d\n",filename,major(buf.st_rdev),minor(buf.st_rdev));*/
+ if(S_ISBLK(buf.st_mode)&&(major==major(buf.st_rdev))&&(minor==minor(buf.st_rdev)))
+ {
+ strcpy(device,entries->d_name);
+/* printf("%s [%d %d] %d %d\n",filename,major, minor, major(buf.st_rdev),minor(buf.st_rdev));*/
+ closedir(dir);
+ return 0;
+ }
+ }
+ }
+ closedir(dir);
+ return 1;
+}
+
+void init_stats_diskdevices()
+{
+ FILE *file;
+ char *s,*s2;
+ char line[1024+1];
+ char device[1024+1];
+ int i,j;
+ int major,minor;
+ int noinfo;
+ int read_io_ops;
+ int blks_read;
+ int write_io_ops;
+ int blks_write;
+
+ for(i=0;i<MAX_DISKDEVICES;i++)
+ {
+ diskdevices[i].device=0;
+ for(j=0;j<60*15;j++)
+ {
+ diskdevices[i].clock[j]=0;
+ }
+ }
+
+ file=fopen("/proc/stat","r");
+ if(NULL == file)
+ {
+ fprintf(stderr, "Cannot open [%s] [%m]\n","/proc/stat");
+ return;
+ }
+ i=0;
+ while(fgets(line,1024,file) != NULL)
+ {
+ if( (s=strstr(line,"disk_io:")) == NULL)
+ continue;
+
+ s=line;
+
+ for(;;)
+ {
+ if( (s=strchr(s,' ')) == NULL)
+ break;
+ s++;
+ if( (s2=strchr(s,')')) == NULL)
+ break;
+ if( (s2=strchr(s2+1,')')) == NULL)
+ break;
+ s2++;
+
+ strncpy(device,s,s2-s);
+ device[s2-s]=0;
+ sscanf(device,"(%d,%d):(%d,%d,%d,%d,%d)",&major,&minor,&noinfo,&read_io_ops,&blks_read,&write_io_ops,&blks_write);
+/* printf("Major:[%d] Minor:[%d] read_io_ops[%d]\n",major,minor,read_io_ops);*/
+
+ if(get_device_name(device,major,minor)==0)
+ {
+/* printf("Device:%s\n",device);*/
+ diskdevices[i].device=strdup(device);
+ diskdevices[i].major=major;
+ diskdevices[i].minor=minor;
+ i++;
+ }
+ s=s2;
+ }
+ }
+
+ fclose(file);
+}
+
+/*
void init_stats_diskdevices()
{
FILE *file;
@@ -106,6 +206,7 @@ void init_stats_diskdevices()
fclose(file);
}
+*/
void report_stats_diskdevices(FILE *file, int now)
{
@@ -193,85 +294,110 @@ void report_stats_diskdevices(FILE *file, int now)
if((read_io_ops[0]!=0)&&(read_io_ops[1]!=0))
{
- fprintf(file,"netloadout1[%s] %f\n", diskdevices[i].device, (float)((read_io_ops[0]-read_io_ops[1])/(now-time1)));
+ fprintf(file,"disk_read_ops1[%s] %f\n", diskdevices[i].device, (float)((read_io_ops[0]-read_io_ops[1])/(now-time1)));
}
else
{
- fprintf(file,"netloadout1[%s] 0\n", diskdevices[i].device);
+ fprintf(file,"disk_read_ops1[%s] 0\n", diskdevices[i].device);
}
if((read_io_ops[0]!=0)&&(read_io_ops[2]!=0))
{
- fprintf(file,"netloadout5[%s] %f\n", diskdevices[i].device, (float)((read_io_ops[0]-read_io_ops[2])/(now-time5)));
+ fprintf(file,"disk_read_ops5[%s] %f\n", diskdevices[i].device, (float)((read_io_ops[0]-read_io_ops[2])/(now-time5)));
}
else
{
- fprintf(file,"netloadout5[%s] 0\n", diskdevices[i].device);
+ fprintf(file,"disk_read_ops5[%s] 0\n", diskdevices[i].device);
}
if((read_io_ops[0]!=0)&&(read_io_ops[3]!=0))
{
- fprintf(file,"netloadout15[%s] %f\n", diskdevices[i].device, (float)((read_io_ops[0]-read_io_ops[3])/(now-time15)));
+ fprintf(file,"disk_read_ops15[%s] %f\n", diskdevices[i].device, (float)((read_io_ops[0]-read_io_ops[3])/(now-time15)));
}
else
{
- fprintf(file,"netloadout15[%s] 0\n", diskdevices[i].device);
+ fprintf(file,"disk_read_ops15[%s] 0\n", diskdevices[i].device);
+ }
+
+ if((blks_read[0]!=0)&&(blks_read[1]!=0))
+ {
+ fprintf(file,"disk_read_blks1[%s] %f\n", diskdevices[i].device, (float)((blks_read[0]-blks_read[1])/(now-time1)));
+ }
+ else
+ {
+ fprintf(file,"disk_read_blks1[%s] 0\n", diskdevices[i].device);
+ }
+ if((blks_read[0]!=0)&&(blks_read[2]!=0))
+ {
+ fprintf(file,"disk_read_blks5[%s] %f\n", diskdevices[i].device, (float)((blks_read[0]-blks_read[2])/(now-time5)));
+ }
+ else
+ {
+ fprintf(file,"disk_read_blks5[%s] 0\n", diskdevices[i].device);
+ }
+ if((blks_read[0]!=0)&&(blks_read[3]!=0))
+ {
+ fprintf(file,"disk_read_blks15[%s] %f\n", diskdevices[i].device, (float)((blks_read[0]-blks_read[3])/(now-time15)));
+ }
+ else
+ {
+ fprintf(file,"disk_read_blks15[%s] 0\n", diskdevices[i].device);
}
if((write_io_ops[0]!=0)&&(write_io_ops[1]!=0))
{
- fprintf(file,"netloadout1[%s] %f\n", diskdevices[i].device, (float)((write_io_ops[0]-write_io_ops[1])/(now-time1)));
+ fprintf(file,"disk_write_ops1[%s] %f\n", diskdevices[i].device, (float)((write_io_ops[0]-write_io_ops[1])/(now-time1)));
}
else
{
- fprintf(file,"netloadout1[%s] 0\n", diskdevices[i].device);
+ fprintf(file,"disk_write_ops1[%s] 0\n", diskdevices[i].device);
}
if((write_io_ops[0]!=0)&&(write_io_ops[2]!=0))
{
- fprintf(file,"netloadout5[%s] %f\n", diskdevices[i].device, (float)((write_io_ops[0]-write_io_ops[2])/(now-time5)));
+ fprintf(file,"disk_write_ops5[%s] %f\n", diskdevices[i].device, (float)((write_io_ops[0]-write_io_ops[2])/(now-time5)));
}
else
{
- fprintf(file,"netloadout5[%s] 0\n", diskdevices[i].device);
+ fprintf(file,"disk_write_ops5[%s] 0\n", diskdevices[i].device);
}
if((write_io_ops[0]!=0)&&(write_io_ops[3]!=0))
{
- fprintf(file,"netloadout15[%s] %f\n", diskdevices[i].device, (float)((write_io_ops[0]-write_io_ops[3])/(now-time15)));
+ fprintf(file,"disk_write_ops15[%s] %f\n", diskdevices[i].device, (float)((write_io_ops[0]-write_io_ops[3])/(now-time15)));
}
else
{
- fprintf(file,"netloadout15[%s] 0\n", diskdevices[i].device);
+ fprintf(file,"disk_write_ops15[%s] 0\n", diskdevices[i].device);
}
-/*
- if((received!=0)&&(received1!=0))
+ if((blks_write[0]!=0)&&(blks_write[1]!=0))
{
- fprintf(file,"netloadin1[%s] %f\n", diskdevices[i].interface, (float)((received-received1)/(now-time1)));
+ fprintf(file,"disk_write_blks1[%s] %f\n", diskdevices[i].device, (float)((blks_write[0]-blks_write[1])/(now-time1)));
}
else
{
- fprintf(file,"netloadin1[%s] 0\n", diskdevices[i].interface);
+ fprintf(file,"disk_write_blks1[%s] 0\n", diskdevices[i].device);
}
- if((received!=0)&&(received5!=0))
+ if((blks_write[0]!=0)&&(blks_write[2]!=0))
{
- fprintf(file,"netloadin5[%s] %f\n", diskdevices[i].interface, (float)((received-received5)/(now-time5)));
+ fprintf(file,"disk_write_blks5[%s] %f\n", diskdevices[i].device, (float)((blks_write[0]-blks_write[2])/(now-time5)));
}
else
{
- fprintf(file,"netloadin5[%s] 0\n", diskdevices[i].interface);
+ fprintf(file,"disk_write_blks5[%s] 0\n", diskdevices[i].device);
}
- if((received!=0)&&(received15!=0))
+ if((blks_write[0]!=0)&&(blks_write[3]!=0))
{
- fprintf(file,"netloadin15[%s] %f\n", diskdevices[i].interface, (float)((received-received15)/(now-time15)));
+ fprintf(file,"disk_write_blks15[%s] %f\n", diskdevices[i].device, (float)((blks_write[0]-blks_write[3])/(now-time15)));
}
else
{
- fprintf(file,"netloadin15[%s] 0\n", diskdevices[i].interface);
- }*/
+ fprintf(file,"disk_write_blks15[%s] 0\n", diskdevices[i].device);
+ }
+
}
}
-void add_values_diskdevices(int now,char *device,float read_io_ops,float write_io_ops)
+void add_values_diskdevices(int now,int major,int minor,float read_io_ops,float blks_read,float write_io_ops,float blks_write)
{
int i,j;
@@ -279,7 +405,7 @@ void add_values_diskdevices(int now,char *device,float read_io_ops,float write_i
for(i=0;i<MAX_DISKDEVICES;i++)
{
- if(0 == strcmp(diskdevices[i].device,device))
+ if((diskdevices[i].major==major)&&(diskdevices[i].minor==minor))
{
for(j=0;j<15*60;j++)
{
@@ -287,7 +413,9 @@ void add_values_diskdevices(int now,char *device,float read_io_ops,float write_i
{
diskdevices[i].clock[j]=now;
diskdevices[i].read_io_ops[j]=read_io_ops;
+ diskdevices[i].blks_read[j]=blks_read;
diskdevices[i].write_io_ops[j]=write_io_ops;
+ diskdevices[i].blks_write[j]=blks_write;
break;
}
}
@@ -300,13 +428,17 @@ void collect_stats_diskdevices(FILE *outfile)
{
FILE *file;
- char *s;
+ char *s,*s2;
char line[MAX_STRING_LEN+1];
- int i,j;
- int i1,j1;
- char interface[MAX_STRING_LEN+1];
+ int i;
+ char device[MAX_STRING_LEN+1];
int now;
- float received,sent;
+ int major,minor;
+ int noinfo;
+ int read_io_ops;
+ int blks_read;
+ int write_io_ops;
+ int blks_write;
/* Must be static */
static int initialised=0;
@@ -319,51 +451,41 @@ void collect_stats_diskdevices(FILE *outfile)
now=time(NULL);
- file=fopen("/proc/net/dev","r");
+ file=fopen("/proc/stat","r");
if(NULL == file)
{
- fprintf(stderr, "Cannot open config file [%s] [%m]\n","/proc/net/dev");
+ fprintf(stderr, "Cannot open [%s] [%m]\n","/proc/stat");
return;
}
-
-
i=0;
- while(fgets(line,MAX_STRING_LEN,file) != NULL)
+ while(fgets(line,1024,file) != NULL)
{
- if( (s=strstr(line,":")) == NULL)
+ if( (s=strstr(line,"disk_io:")) == NULL)
continue;
- strncpy(interface,line,s-line);
- interface[s-line]=0;
- j1=0;
- for(i1=0;i1<strlen(interface);i1++)
- {
- if(interface[i1]!=' ')
- {
- interface[j1++]=interface[i1];
- }
- }
- interface[j1]=0;
- s=strtok(line,":");
- j=0;
-/* printf("Interface [%s]\n",interface);*/
- while(s)
+
+ s=line;
+
+ for(;;)
{
- s = strtok(NULL," ");
- if(j==0)
- {
-/* printf("Received [%s]\n",s);*/
- received=atof(s);
- }
- else if(j==8)
- {
-/* printf("Sent [%s]\n",s);*/
- sent=atof(s);
- add_values_diskdevices(now,interface,sent,received);
- }
- j++;
+ if( (s=strchr(s,' ')) == NULL)
+ break;
+ s++;
+ if( (s2=strchr(s,')')) == NULL)
+ break;
+ if( (s2=strchr(s2+1,')')) == NULL)
+ break;
+ s2++;
+
+ strncpy(device,s,s2-s);
+ device[s2-s]=0;
+ sscanf(device,"(%d,%d):(%d,%d,%d,%d,%d)",&major,&minor,&noinfo,&read_io_ops,&blks_read,&write_io_ops,&blks_write);
+/* printf("Major:[%d] Minor:[%d] read_io_ops[%d]\n",major,minor,read_io_ops);*/
+ add_values_diskdevices(now,major,minor,read_io_ops,blks_read,write_io_ops,blks_write);
+
+ s=s2;
}
- i++;
}
+
fclose(file);
report_stats_diskdevices(outfile, now);
diff --git a/src/zabbix_agent/diskdevices.h b/src/zabbix_agent/diskdevices.h
index bc483fdd..65e89a13 100644
--- a/src/zabbix_agent/diskdevices.h
+++ b/src/zabbix_agent/diskdevices.h
@@ -26,6 +26,8 @@
DISKDEVICE
{
char *device;
+ int major;
+ int minor;
int clock[60*15];
float read_io_ops[60*15];
float blks_read[60*15];
diff --git a/src/zabbix_agent/stats.c b/src/zabbix_agent/stats.c
index 1b1ea775..3edb5bbc 100644
--- a/src/zabbix_agent/stats.c
+++ b/src/zabbix_agent/stats.c
@@ -77,7 +77,10 @@ void collect_statistics()
}
else
{
+ /* Here is list of functions to call periodically */
collect_stats_interfaces(file);
+ collect_stats_diskdevices(file);
+
fclose(file);
rename("/tmp/zabbix_agentd.tmp2","/tmp/zabbix_agentd.tmp");
}
diff --git a/src/zabbix_agent/sysinfo.c b/src/zabbix_agent/sysinfo.c
index dbbd0a36..f20b5aa5 100644
--- a/src/zabbix_agent/sysinfo.c
+++ b/src/zabbix_agent/sysinfo.c
@@ -142,6 +142,22 @@ COMMAND commands[AGENT_MAX_USER_COMMANDS]=
{"netloadout5[*]" ,NETLOADOUT5, 0, "lo"},
{"netloadout15[*]" ,NETLOADOUT15, 0, "lo"},
+ {"disk_read_ops1[*]" ,DISKREADOPS1, 0, "hda"},
+ {"disk_read_ops5[*]" ,DISKREADOPS5, 0, "hda"},
+ {"disk_read_ops15[*]" ,DISKREADOPS15, 0, "hda"},
+
+ {"disk_read_blks1[*]" ,DISKREADBLKS1, 0, "hda"},
+ {"disk_read_blks5[*]" ,DISKREADBLKS5, 0, "hda"},
+ {"disk_read_blks15[*]" ,DISKREADBLKS15, 0, "hda"},
+
+ {"disk_write_ops1[*]" ,DISKWRITEOPS1, 0, "hda"},
+ {"disk_write_ops5[*]" ,DISKWRITEOPS5, 0, "hda"},
+ {"disk_write_ops15[*]" ,DISKWRITEOPS15, 0, "hda"},
+
+ {"disk_write_blks1[*]" ,DISKWRITEBLKS1, 0, "hda"},
+ {"disk_write_blks5[*]" ,DISKWRITEBLKS5, 0, "hda"},
+ {"disk_write_blks15[*]" ,DISKWRITEBLKS15, 0, "hda"},
+
{"swap[free]" ,SWAPFREE, 0, 0},
{"swap[total]" ,SWAPTOTAL, 0, 0},
@@ -687,7 +703,7 @@ double PROCCNT(const char * procname)
#endif
}
-double get_netstat(const char *key)
+double get_stat(const char *key)
{
FILE *f;
char line[MAX_STRING_LEN+1];
@@ -715,13 +731,121 @@ double get_netstat(const char *key)
return FAIL;
}
+double DISKREADOPS1(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_read_ops1[%s]",device);
+
+ return get_stat(key);
+}
+
+double DISKREADOPS5(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_read_ops5[%s]",device);
+
+ return get_stat(key);
+}
+
+double DISKREADOPS15(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_read_ops15[%s]",device);
+
+ return get_stat(key);
+}
+
+double DISKREADBLKS1(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_read_blks1[%s]",device);
+
+ return get_stat(key);
+}
+
+double DISKREADBLKS5(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_read_blks5[%s]",device);
+
+ return get_stat(key);
+}
+
+double DISKREADBLKS15(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_read_blks15[%s]",device);
+
+ return get_stat(key);
+}
+
+double DISKWRITEOPS1(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_write_ops1[%s]",device);
+
+ return get_stat(key);
+}
+
+double DISKWRITEOPS5(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_write_ops5[%s]",device);
+
+ return get_stat(key);
+}
+
+double DISKWRITEOPS15(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_write_ops15[%s]",device);
+
+ return get_stat(key);
+}
+
+double DISKWRITEBLKS1(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_write_blks1[%s]",device);
+
+ return get_stat(key);
+}
+
+double DISKWRITEBLKS5(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_write_blks5[%s]",device);
+
+ return get_stat(key);
+}
+
+double DISKWRITEBLKS15(char *device)
+{
+ char key[MAX_STRING_LEN+1];
+
+ sprintf(key,"disk_write_blks15[%s]",device);
+
+ return get_stat(key);
+}
+
double NETLOADIN1(char *interface)
{
char key[MAX_STRING_LEN+1];
sprintf(key,"netloadin1[%s]",interface);
- return get_netstat(key);
+ return get_stat(key);
}
double NETLOADIN5(char *interface)
@@ -730,7 +854,7 @@ double NETLOADIN5(char *interface)
sprintf(key,"netloadin5[%s]",interface);
- return get_netstat(key);
+ return get_stat(key);
}
double NETLOADIN15(char *interface)
@@ -739,7 +863,7 @@ double NETLOADIN15(char *interface)
sprintf(key,"netloadin15[%s]",interface);
- return get_netstat(key);
+ return get_stat(key);
}
double NETLOADOUT1(char *interface)
@@ -748,7 +872,7 @@ double NETLOADOUT1(char *interface)
sprintf(key,"netloadout1[%s]",interface);
- return get_netstat(key);
+ return get_stat(key);
}
double NETLOADOUT5(char *interface)
@@ -757,7 +881,7 @@ double NETLOADOUT5(char *interface)
sprintf(key,"netloadout5[%s]",interface);
- return get_netstat(key);
+ return get_stat(key);
}
double NETLOADOUT15(char *interface)
@@ -766,7 +890,7 @@ double NETLOADOUT15(char *interface)
sprintf(key,"netloadout15[%s]",interface);
- return get_netstat(key);
+ return get_stat(key);
}
diff --git a/src/zabbix_agent/sysinfo.h b/src/zabbix_agent/sysinfo.h
index 72e65cb5..4976e8fd 100644
--- a/src/zabbix_agent/sysinfo.h
+++ b/src/zabbix_agent/sysinfo.h
@@ -51,6 +51,18 @@ double NETLOADIN15(char *interface);
double NETLOADOUT1(char *interface);
double NETLOADOUT5(char *interface);
double NETLOADOUT15(char *interface);
+double DISKREADOPS1(char *device);
+double DISKREADOPS5(char *device);
+double DISKREADOPS15(char *device);
+double DISKREADBLKS1(char *device);
+double DISKREADBLKS5(char *device);
+double DISKREADBLKS15(char *device);
+double DISKWRITEOPS1(char *device);
+double DISKWRITEOPS5(char *device);
+double DISKWRITEOPS15(char *device);
+double DISKWRITEBLKS1(char *device);
+double DISKWRITEBLKS5(char *device);
+double DISKWRITEBLKS15(char *device);
double PING(void);
double SHAREDMEM(void);
double TOTALMEM(void);