nagios插件之监控呼叫量(pro*c访问oracle)
2014-02-18 09:51
369 查看
PRO*C是Oracle提供的应用程序专用开发工具,它以C语言为宿主语言,能在C程序中嵌入SQL语句,进行数据库操作。
将.pc文件转文.c文件
proc MODE=ORACLE UNSAFE_NULL=YES check_oracle.pc
编译.c文件
gcc -L /home/oracle/product/OraHome/lib -l clntsh -o check_oracle check_oracle.c
vi check_oracle.pc
将.pc文件转文.c文件
proc MODE=ORACLE UNSAFE_NULL=YES check_oracle.pc
编译.c文件
gcc -L /home/oracle/product/OraHome/lib -l clntsh -o check_oracle check_oracle.c
vi check_oracle.pc
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <time.h> #include "/home/oracle/product/OraHome/precomp/public/sqlca.h" #define OK 0 #define WARNING 1 #define CRITICAL 2 #define UNKNOWN 3 #define LEN 1023 #define AVGTALK_LEN 64 EXEC SQL INCLUDE SQLCA; time_t timestamp; struct tm *tp; char date_start[LEN]; char date_end[LEN]; /* struct avg_talk_t { char ICall_Chinese[AVGTALK_LEN]; char ICall_English[AVGTALK_LEN]; char RemoteService[AVGTALK_LEN]; }; */ void sql_error(char *msg) { printf("\n%s,%ld,%s\n", msg,sqlca.sqlcode,(char *)sqlca.sqlerrm.sqlerrmc); EXEC SQL ROLLBACK RELEASE; exit(-1); } int before_x_minute_range(int minutes) { int hour,minute; int minute_a,minute_b; int start,end; time_t time_tmp; hour=tp->tm_hour; minute=tp->tm_min; minute_a=minute/10; minute_b=minute%10; if(minutes==5) { if(minute<10) { if(hour==0 && minute<5) { // printf("======\n"); // return 0; time_tmp=timestamp-86400; tp=localtime(&time_tmp); hour=23; start=55; end=59; } else if(minute_b<5) { // start=minute_a-5; // end=minute_a; hour=hour-1; start=55; end=59; } else if(minute_b>=5) { start=minute_a*10; end=minute_a*10+4; } } else { if(minute_b<5) { start=minute_a*10-5; end=minute_a*10-1; } else if(minute_b>=5) { start=minute_a*10; end=minute_a*10+4; } } } else if(minutes==10) { if(hour==0 && minute<10) { // printf("1111111111111\n"); // printf("======\n"); // return 0; time_tmp=timestamp-86400; tp=localtime(&time_tmp); hour=23; start=50; end=59; } else if(minute_a==0) { // printf("222222222222\n"); hour=hour-1; start=50; end=59; } else if(minute_a>=1) { // printf("333333333333333\n"); start=minute_a*10-10; end=minute_a*10-1; } } else if(minutes==30) { if(hour==0 && minute<30) { // printf("1111111111111\n"); // printf("======\n"); // return 0; time_tmp=timestamp-86400; tp=localtime(&time_tmp); hour=23; start=30; end=59; } else if(minute_a<3) { // printf("222222222222\n"); hour=hour-1; start=30; end=59; } else if(minute_a>=3) { // printf("333333333333333\n"); /* // old algorithm before 30 minute start=minute_a*10-30; end=minute_a*10-1; */ start=0; end=29; } } else if(minutes==60) { if(hour>0) { hour=hour-1; start=0; end=59; } else { time_tmp=timestamp-86400; tp=localtime(&time_tmp); hour=23; start=0; end=59; } } // printf("date=%s,start=%d,end=%d\n",date,start,end); sprintf(date_start,"%d-%02d-%02d %02d-%02d-00",1900+tp->tm_year,(1+tp->tm_mon),tp->tm_mday,hour,start); sprintf(date_end,"%d-%02d-%02d %02d-%02d-59",1900+tp->tm_year,(1+tp->tm_mon),tp->tm_mday,hour,end); // printf("date_start=%s\n",date_start); // printf("date_end=%s\n",date_end); return 0; } int main(void) { int ret; // set env setenv("ORACLE_BASE","/home/oracle",0); setenv("ORACLE_HOME","/home/oracle/product/OraHome",0); setenv("ORACLE_SID","bmwdata",0); setenv("ORACLE_TERM","vt100",0); setenv("PATH","$ORACLE_HOME/bin:$HOME/bin:$ORACLE_HOME/bin:$ORACLE_HOME/Apache/Apache/bin:$PATH:/usr/bin:/usr/sbin",0); setenv("LD_LIBRARY_PATH","$ORACLE_HOME/lib:/lib:/usr/lib:/usr/local/lib",0); setenv("CLASSPATH","$ORACLE_HOME/JRE:$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib:$ORACLE_HOME/network/jlib:CLASSPATH",0); setenv("ORA_NLS33","$ORACLE_HOME/nls/admin/data",0); /* */ // EXEC SQL WHENEVER SQLERROR DO sql_error("ORACLE ERROR: "); EXEC SQL BEGIN DECLARE SECTION; char conn_db[LEN]="cc_prod/cc_prod@bmwdata"; int icall_all=0; int icall_all_data_voice=0; int icall_all_data_only=0; int icall_all_voice_only=0; int icall_chinese_all=0; int icall_chinese_data_voice=0; int icall_chinese_data_only=0; int icall_chinese_voice_only=0; int icall_english_all=0; int icall_english_data_voice=0; int icall_english_data_only=0; int icall_english_voice_only=0; int remote_service=0; int before_5_minute_call_count=0; int before_30_minute_call_count=0; int before_60_minute_call_count=0; // int before_10_minute_talk; // float before_10_minute_i_chinese_talk; // float before_30_minute_i_chinese_talk; int before_5_minute_i_chinese_talk_avg=0; int before_5_minute_i_english_talk_avg=0; int before_30_minute_i_chinese_talk_avg=0; int before_30_minute_i_english_talk_avg=0; int before_60_minute_i_chinese_talk_avg=0; int before_60_minute_i_english_talk_avg=0; char date[LEN]; // struct avg_talk_t avg_talk; int exitstatus=OK; char *exit_status[4]={"OK","WARNING","CRITICAL","UNKNOWN"}; char status_information[LEN]; char performance_data[LEN]; EXEC SQL END DECLARE SECTION; EXEC SQL CONNECT :conn_db; if(sqlca.sqlcode!=0) { printf("%s",sqlca.sqlerrm.sqlerrmc); return -1; } timestamp=time(NULL); tp=localtime(×tamp); sprintf(date,"%d-%02d-%02d",1900+tp->tm_year,(1+tp->tm_mon),tp->tm_mday); // printf("date=%s\n",date); /* if(sqlca.sqlcode==0) { printf("Connect oracle success...\n"); } else { printf("%s",sqlca.sqlerrm.sqlerrmc); return -1; } */ //------------------------------------------------------ //icall_all EXEC SQL SELECT count(*) INTO :icall_all FROM calldata t where to_char(time_eventdata_request,'yyyy-mm-dd')=:date and servicetype='I-Call'; //icall_all_have_data_voice EXEC SQL SELECT count(*) INTO :icall_all_data_voice FROM calldata t where to_char(time_eventdata_request,'yyyy-mm-dd')=:date and servicetype='I-Call' and callfrom is not null; //icall_all_data_only EXEC SQL SELECT count(*) INTO :icall_all_data_only FROM calldata t where to_char(time_eventdata_request,'yyyy-mm-dd')=:date and servicetype='I-Call' and callfrom is null; //icall_all_voice_only EXEC SQL SELECT count(*) INTO :icall_all_voice_only FROM calldata t where to_char(time_callstart,'yyyy-mm-dd')=:date and servicetype='I-Call' and time_eventdata_request is null; //----------------------------------------------------- //icall_chinese EXEC SQL SELECT count(*) INTO :icall_chinese_all FROM calldata t where to_char(time_eventdata_request,'yyyy-mm-dd')=:date and queueid='ICall_Chinese'; //icall_chinese_have_data_voice EXEC SQL SELECT count(*) INTO :icall_chinese_data_voice FROM calldata t where to_char(time_eventdata_request,'yyyy-mm-dd')=:date and queueid='ICall_Chinese' and callfrom is not null; //icall_chinese_data_only EXEC SQL SELECT count(*) INTO :icall_chinese_data_only FROM calldata t where to_char(time_eventdata_request,'yyyy-mm-dd')=:date and queueid='ICall_Chinese' and callfrom is null; //icall_chinese_voice_only EXEC SQL SELECT count(*) INTO :icall_chinese_voice_only FROM calldata t where to_char(time_callstart,'yyyy-mm-dd')=:date and queueid='ICall_Chinese' and time_eventdata_request is null; //----------------------------------------------------- //icall_english EXEC SQL SELECT count(*) INTO :icall_english_all FROM calldata t where to_char(time_eventdata_request,'yyyy-mm-dd')=:date and queueid='ICall_English'; //icall_english_have_data_voice EXEC SQL SELECT count(*) INTO :icall_english_data_voice FROM calldata t where to_char(time_eventdata_request,'yyyy-mm-dd')=:date and queueid='ICall_English' and callfrom is not null; //icall_english_data_only EXEC SQL SELECT count(*) INTO :icall_english_data_only FROM calldata t where to_char(time_eventdata_request,'yyyy-mm-dd')=:date and queueid='ICall_English' and callfrom is null; //icall_english_voice_only EXEC SQL SELECT count(*) INTO :icall_english_voice_only FROM calldata t where to_char(time_callstart,'yyyy-mm-dd')=:date and queueid='ICall_English' and time_eventdata_request is null; //---------------------------------------------------- //remote_service EXEC SQL SELECT count(*) INTO :remote_service FROM calldata t where to_char(time_callstart,'yyyy-mm-dd')=:date and servicetype='RemoteService'; /* //printf printf("icall_all=%d\n",icall_all); printf("icall_all_data_voice=%d\n",icall_all_data_voice); printf("icall_all_data_only=%d\n",icall_all_data_only); printf("icall_all_voice_only=%d\n",icall_all_voice_only); printf("icall_chinese_all=%d\n",icall_chinese_all); printf("icall_chinese_data_voice=%d\n",icall_chinese_data_voice); printf("icall_chinese_data_only=%d\n",icall_chinese_data_only); printf("icall_chinese_voice_only=%d\n",icall_chinese_voice_only); printf("icall_english_all=%d\n",icall_english_all); printf("icall_english_data_voice=%d\n",icall_english_data_voice); printf("icall_english_data_only=%d\n",icall_english_data_only); printf("icall_english_voice_only=%d\n",icall_english_voice_only); printf("remote_service=%d\n",remote_service); // */ //before_5_minute_call_count ret=before_x_minute_range(5); EXEC SQL SELECT count(*) INTO :before_5_minute_call_count FROM calldata where to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')>=:date_start and to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')<=:date_end; // printf("before_5_minute_call_count=%d\n\n",before_5_minute_call_count); //before_5_minute_icall_talk_avg_chinese EXEC SQL SELECT sum((time_callend-time_callconnect)*24*3600)/count(*) INTO :before_5_minute_i_chinese_talk_avg from calldata t where to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')>=:date_start and to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')<=:date_end and queueid='ICall_Chinese'; //is not null group by queueid; // printf("10 avg ok.\n"); // printf("before_5_minute_i_chinese_talk=%d\n\n",before_5_minute_i_chinese_talk_avg); //before_5_minute_icall_talk_avg_english EXEC SQL SELECT sum((time_callend-time_callconnect)*24*3600)/count(*) INTO :before_5_minute_i_english_talk_avg from calldata t where to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')>=:date_start and to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')<=:date_end and queueid='ICall_English'; //is not null group by queueid; // printf("10 avg ok.\n"); // printf("before_5_minute_i_english_talk=%d\n\n",before_5_minute_i_english_talk_avg); //------------------------ //before_30_minute_call_count ret=before_x_minute_range(30); EXEC SQL SELECT count(*) INTO :before_30_minute_call_count FROM calldata where to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')>=:date_start and to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')<=:date_end; // printf("before_30_minute_call_count=%d\n\n",before_30_minute_call_count); //before_30_minute_talk_avg_chinese EXEC SQL SELECT sum((time_callend-time_callconnect)*24*3600)/count(*) INTO :before_30_minute_i_chinese_talk_avg from calldata t where to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')>=:date_start and to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')<=:date_end and queueid='ICall_Chinese'; //is not null group by queueid; // printf("30 avg ok.\n"); // printf("before_30_minute_i_chinese_talk=%d\n\n",before_30_minute_i_chinese_talk_avg); //before_30_minute_talk_avg_english EXEC SQL SELECT sum((time_callend-time_callconnect)*24*3600)/count(*) INTO :before_30_minute_i_english_talk_avg from calldata t where to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')>=:date_start and to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')<=:date_end and queueid='ICall_English'; //is not null group by queueid; // printf("30 avg ok.\n"); // printf("before_30_minute_i_english_talk=%d\n\n",before_30_minute_i_english_talk_avg); //------------------------ //-------------------------------------- //before_60_minute_call_count ret=before_x_minute_range(60); EXEC SQL SELECT count(*) INTO :before_60_minute_call_count FROM calldata where to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')>=:date_start and to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')<=:date_end; // printf("before_60_minute_call_count=%d\n\n",before_60_minute_call_count); //before_60_minute_talk_avg_chinese EXEC SQL SELECT sum((time_callend-time_callconnect)*24*3600)/count(*) INTO :before_60_minute_i_chinese_talk_avg from calldata t where to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')>=:date_start and to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')<=:date_end and queueid='ICall_Chinese'; //is not null group by queueid; // printf("60 avg ok.\n"); // printf("before_60_minute_i_chinese_talk=%d\n\n",before_60_minute_i_chinese_talk_avg); //before_60_minute_talk_avg_english EXEC SQL SELECT sum((time_callend-time_callconnect)*24*3600)/count(*) INTO :before_60_minute_i_english_talk_avg from calldata t where to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')>=:date_start and to_char(time_callstart,'yyyy-mm-dd hh24-mi-ss')<=:date_end and queueid='ICall_English'; //is not null group by queueid; // printf("60 avg ok.\n"); // printf("before_60_minute_i_english_talk=%d\n\n",before_60_minute_i_english_talk_avg); //--------------------------------------------- sprintf(status_information,"current icall_all=%d, icall_all_data_voice=%d, icall_all_data_only=%d, icall_all_voice_only=%d, icall_chinese_all=%d,icall_chinese_data_voice=%d, icall_chinese_data_only=%d, icall_chinese_voice_only=%d, icall_english_all=%d, icall_english_data_voice=%d, icall_english_data_only=%d, icall_english_voice_only=%d, remote_service=%d, 5_minute_before_call_count=%d, 30_minute_before_call_count=%d, 60_minute_before_call_count=%d, 5_minute_i_cn_talk_avg=%d, 5_minute_i_en_talk_avg=%d, 30_minute_i_cn_talk_avg=%d, 30_minute_i_en_talk_avg=%d, 60_minute_i_cn_talk_avg=%d, 60_minute_i_en_talk_avg=%d", icall_all,icall_all_data_voice,icall_all_data_only,icall_all_voice_only, icall_chinese_all,icall_chinese_data_voice,icall_chinese_data_only,icall_chinese_voice_only, icall_english_all,icall_english_data_voice,icall_english_data_only,icall_english_voice_only, remote_service, before_5_minute_call_count,before_30_minute_call_count,before_60_minute_call_count, before_5_minute_i_chinese_talk_avg,before_5_minute_i_english_talk_avg,before_30_minute_i_chinese_talk_avg,before_30_minute_i_english_talk_avg,before_60_minute_i_chinese_talk_avg,before_60_minute_i_english_talk_avg); sprintf(performance_data,"icall_all=%d;;;; icall_all_data_voice=%d;;;; icall_chinese_data_only=%d;;;; icall_chinese_voice_only=%d;;;; icall_chinese_all=%d;;;; icall_chinese_data_voice=%d;;;; icall_chinese_data_only=%d;;;; icall_chinese_voice_only=%d;;;; icall_english_all=%d;;;; icall_english_data_voice=%d;;;; icall_english_data_only=%d;;;; icall_english_voice_only=%d;;;; remote_service=%d;;;; before_5_minute_call_count=%d;;;; before_30_minute_call_count=%d;;;; before_60_minute_call_count=%d;;;; before_5_minute_cn_talk_avg=%d;;;; before_5_minute_en_talk_avg=%d;;;; before_30_minute_cn_talk_avg=%d;;;; before_30_minute_en_talk_avg=%d;;;; before_60_minute_cn_talk_avg=%d;;;; before_60_minute_en_talk_avg=%d;;;;", icall_all,icall_all_data_voice,icall_chinese_data_only,icall_chinese_voice_only, icall_chinese_all,icall_chinese_data_voice,icall_chinese_data_only,icall_chinese_voice_only, icall_english_all,icall_english_data_voice,icall_english_data_only,icall_english_voice_only, remote_service, before_5_minute_call_count,before_30_minute_call_count,before_60_minute_call_count, before_5_minute_i_chinese_talk_avg,before_5_minute_i_english_talk_avg,before_30_minute_i_chinese_talk_avg,before_30_minute_i_english_talk_avg,before_60_minute_i_chinese_talk_avg,before_60_minute_i_english_talk_avg); printf("%s: %s | %s\n",exit_status[exitstatus],status_information,performance_data); return exitstatus; }
相关文章推荐
- nagios监控插件 nagios_oracle_health+check_linux_stats.pl
- 关于nagios系统下使用shell脚本自定义监控插件的编写
- nagios插件之监控AES日志文件--检查ERROR
- nagios插件之监控M1KB语音网关通话数
- nagios全攻略(三)----使用插件监控更多信息
- MongoDB nagios check_mongodb插件监控
- Nagios 自定义插件与安装使用之监控dead datanodes
- nagios插件之监控mqa线程数
- Nagios监控mfs运行状态插件脚本
- nagios 监控内存-增加新插件方法
- Nagios插件、被动及分布式监控
- nagios插件之监控单个tomcat线程数
- 配置nagios监控oracle,check_oracle_health
- 开发Nagios监控passwd文件插件
- nagios插件之登陆防火墙实现session监控
- nagios插件之监控日志中index增长情况
- nagios插件之监控获取driverID
- nagios 监控流量插件check_traffic
- Centreon+Nagios实战第九篇——利用nrpe插件监控本机
- nagios插件 监控分区变化的脚本