diff options
author | alex <alex@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2007-01-28 16:49:45 +0000 |
---|---|---|
committer | alex <alex@97f52cf1-0a1b-0410-bd0e-c28be96e8082> | 2007-01-28 16:49:45 +0000 |
commit | 87ac8e26cafed175dce5fc9ef7d912340b086446 (patch) | |
tree | 92fe94e44d09507eefad42ba8bd6f2eee9e629ef | |
parent | 28a45c82804542055ec4a44ca9f8fe79a6b7c2d5 (diff) | |
download | zabbix-87ac8e26cafed175dce5fc9ef7d912340b086446.tar.gz zabbix-87ac8e26cafed175dce5fc9ef7d912340b086446.tar.xz zabbix-87ac8e26cafed175dce5fc9ef7d912340b086446.zip |
- changed type of items.prevorgvalue to preserve data precision (Alexei)
git-svn-id: svn://svn.zabbix.com/trunk@3767 97f52cf1-0a1b-0410-bd0e-c28be96e8082
-rw-r--r-- | ChangeLog | 1 | ||||
-rw-r--r-- | create/schema/schema.sql | 2 | ||||
-rw-r--r-- | include/db.h | 12 | ||||
-rw-r--r-- | src/libs/zbxdbhigh/db.c | 55 | ||||
-rw-r--r-- | src/zabbix_agent/active.c | 2 | ||||
-rw-r--r-- | src/zabbix_server/evalfunc.c | 151 | ||||
-rw-r--r-- | src/zabbix_server/functions.c | 281 | ||||
-rw-r--r-- | src/zabbix_server/poller/poller.c | 9 | ||||
-rw-r--r-- | src/zabbix_server/timer/timer.c | 4 | ||||
-rw-r--r-- | upgrades/dbpatches/1.3/mysql/changed_tables.sql | 2 |
10 files changed, 372 insertions, 147 deletions
@@ -1,5 +1,6 @@ Changes for 1.3.3: + - changed type of items.prevorgvalue to preserve data precision (Alexei) - added possibility of hostname using (Eugene) - new communication library and protocol (Alexei) - developed configuration interface of http monitoring (Eugene) diff --git a/create/schema/schema.sql b/create/schema/schema.sql index 748cf44c..ff8fc8a8 100644 --- a/create/schema/schema.sql +++ b/create/schema/schema.sql @@ -394,7 +394,7 @@ FIELD |trapper_hosts |t_varchar(255) |'' |NOT NULL |ZBX_SYNC FIELD |units |t_varchar(10) |'' |NOT NULL |ZBX_SYNC FIELD |multiplier |t_integer |'0' |NOT NULL |ZBX_SYNC FIELD |delta |t_integer |'0' |NOT NULL |ZBX_SYNC -FIELD |prevorgvalue |t_double(16,4) | |NULL |0 +FIELD |prevorgvalue |t_varchar(255) | |NULL |0 FIELD |snmpv3_securityname|t_varchar(64)|'' |NOT NULL |ZBX_SYNC FIELD |snmpv3_securitylevel|t_integer |'0' |NOT NULL |ZBX_SYNC FIELD |snmpv3_authpassphrase|t_varchar(64)|'' |NOT NULL |ZBX_SYNC diff --git a/include/db.h b/include/db.h index 9745eaab..802281f8 100644 --- a/include/db.h +++ b/include/db.h @@ -251,14 +251,18 @@ DB_ITEM int delay; int history; int trends; - double prevorgvalue; + char *prevorgvalue_str; + double prevorgvalue_dbl; + zbx_uint64_t prevorgvalue_uint64; int prevorgvalue_null; - double lastvalue; - int lastclock; char *lastvalue_str; + double lastvalue_dbl; + zbx_uint64_t lastvalue_uint64; + int lastclock; int lastvalue_null; - double prevvalue; char *prevvalue_str; + double prevvalue_dbl; + zbx_uint64_t prevvalue_uint64; int prevvalue_null; time_t lastcheck; time_t nextcheck; diff --git a/src/libs/zbxdbhigh/db.c b/src/libs/zbxdbhigh/db.c index e6a1986c..a7f3acfc 100644 --- a/src/libs/zbxdbhigh/db.c +++ b/src/libs/zbxdbhigh/db.c @@ -378,10 +378,12 @@ lbl_exec: } #endif - zbx_free(sql); gettimeofday(&tv, NULL); - zabbix_log( LOG_LEVEL_WARNING, "Query processed in %f seconds", (float)(tv.tv_usec-msec)/1000000 ); + if((float)(tv.tv_usec-msec)/1000000 > 0.03) + zabbix_log( LOG_LEVEL_WARNING, "%f sec, query %s", (float)(tv.tv_usec-msec)/1000000, sql ); + + zbx_free(sql); return ret; } @@ -610,10 +612,11 @@ lbl_get_table: } #endif - zbx_free(sql); - gettimeofday(&tv, NULL); - zabbix_log( LOG_LEVEL_WARNING, "Query processed in %f seconds", (float)(tv.tv_usec-msec)/1000000 ); + if((float)(tv.tv_usec-msec)/1000000 > 0.03) + zabbix_log( LOG_LEVEL_WARNING, "%f sec, query %s", (float)(tv.tv_usec-msec)/1000000, sql ); + + zbx_free(sql); return result; } @@ -2022,6 +2025,8 @@ void DBget_item_from_db(DB_ITEM *item,DB_ROW row) item->useip=atoi(row[10]); item->ip=row[11]; item->history=atoi(row[12]); + item->value_type=atoi(row[17]); + s=row[13]; if(DBis_null(s)==SUCCEED) { @@ -2030,8 +2035,17 @@ void DBget_item_from_db(DB_ITEM *item,DB_ROW row) else { item->lastvalue_null=0; - item->lastvalue_str=s; - item->lastvalue=atof(s); + switch(item->value_type) { + case ITEM_VALUE_TYPE_FLOAT: + item->lastvalue_dbl=atof(s); + break; + case ITEM_VALUE_TYPE_UINT64: + ZBX_STR2UINT64(item->lastvalue_uint64,s); + break; + default: + item->lastvalue_str=s; + break; + } } s=row[14]; if(DBis_null(s)==SUCCEED) @@ -2041,13 +2055,20 @@ void DBget_item_from_db(DB_ITEM *item,DB_ROW row) else { item->prevvalue_null=0; - item->prevvalue_str=s; - item->prevvalue=atof(s); + switch(item->value_type) { + case ITEM_VALUE_TYPE_FLOAT: + item->prevvalue_dbl=atof(s); + break; + case ITEM_VALUE_TYPE_UINT64: + ZBX_STR2UINT64(item->prevvalue_uint64,s); + break; + default: + item->prevvalue_str=s; + break; + } } -/* item->hostid=atoi(row[15]); */ ZBX_STR2UINT64(item->hostid, row[15]); item->host_status=atoi(row[16]); - item->value_type=atoi(row[17]); item->host_errors_from=atoi(row[18]); item->snmp_port=atoi(row[19]); @@ -2061,7 +2082,17 @@ void DBget_item_from_db(DB_ITEM *item,DB_ROW row) else { item->prevorgvalue_null=0; - item->prevorgvalue=atof(s); + switch(item->value_type) { + case ITEM_VALUE_TYPE_FLOAT: + item->prevorgvalue_dbl=atof(s); + break; + case ITEM_VALUE_TYPE_UINT64: + ZBX_STR2UINT64(item->prevorgvalue_uint64,s); + break; + default: + item->prevorgvalue_str=s; + break; + } } s=row[22]; if(DBis_null(s)==SUCCEED) diff --git a/src/zabbix_agent/active.c b/src/zabbix_agent/active.c index cbbfb8b8..04cd3bde 100644 --- a/src/zabbix_agent/active.c +++ b/src/zabbix_agent/active.c @@ -362,8 +362,6 @@ static int send_value(char *server,unsigned short port,char *host, char *key,cha struct hostent *hp; - unsigned int addr; - zabbix_log( LOG_LEVEL_DEBUG, "In send_value('%s',%u,'%s','%s','%s','%s','%s','%s')", server, port, host, key, lastlogsize, timestamp, source, severity); diff --git a/src/zabbix_server/evalfunc.c b/src/zabbix_server/evalfunc.c index 3f386a5e..98cf0339 100644 --- a/src/zabbix_server/evalfunc.c +++ b/src/zabbix_server/evalfunc.c @@ -845,7 +845,19 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter) } else { - if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64)) + switch (item->value_type) { + case ITEM_VALUE_TYPE_FLOAT: + zbx_snprintf(value,MAX_STRING_LEN,"%f",item->lastvalue_dbl); + del_zeroes(value); + break; + case ITEM_VALUE_TYPE_UINT64: + zbx_snprintf(value,MAX_STRING_LEN,ZBX_FS_UI64,item->lastvalue_uint64); + break; + default: + strcpy(value,item->lastvalue_str); + break; + } +/* if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64)) { zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 1"); zbx_snprintf(value,MAX_STRING_LEN,"%f",item->lastvalue); @@ -854,11 +866,10 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter) } else { -/* *value=strdup(item->lastvalue_str);*/ zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 3 [%s] [%s]",value,item->lastvalue_str); strcpy(value,item->lastvalue_str); zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() 4"); - } + }*/ } } else if(strcmp(function,"prev")==0) @@ -869,7 +880,19 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter) } else { - if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64)) + switch (item->value_type) { + case ITEM_VALUE_TYPE_FLOAT: + zbx_snprintf(value,MAX_STRING_LEN,"%f",item->prevvalue_dbl); + del_zeroes(value); + break; + case ITEM_VALUE_TYPE_UINT64: + zbx_snprintf(value,MAX_STRING_LEN,ZBX_FS_UI64,item->prevvalue_dbl); + break; + default: + strcpy(value,item->prevvalue_str); + break; + } +/* if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64)) { zbx_snprintf(value,MAX_STRING_LEN,"%f",item->prevvalue); del_zeroes(value); @@ -877,7 +900,7 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter) else { strcpy(value,item->prevvalue_str); - } + }*/ } } else if(strcmp(function,"min")==0) @@ -952,7 +975,27 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter) } else { - if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64)) + switch (item->value_type) { + case ITEM_VALUE_TYPE_FLOAT: + zbx_snprintf(value,MAX_STRING_LEN,"%f", + (double)abs(item->lastvalue_dbl-item->prevvalue_dbl)); + del_zeroes(value); + break; + case ITEM_VALUE_TYPE_UINT64: + zbx_snprintf(value,MAX_STRING_LEN,ZBX_FS_UI64, labs(item->lastvalue_uint64-item->prevvalue_uint64)); + break; + default: + if(strcmp(item->lastvalue_str, item->prevvalue_str) == 0) + { + strcpy(value,"0"); + } + else + { + strcpy(value,"1"); + } + break; + } +/* if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64)) { zbx_snprintf(value,MAX_STRING_LEN,"%f",(float)abs(item->lastvalue-item->prevvalue)); del_zeroes(value); @@ -967,7 +1010,7 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter) { strcpy(value,"1"); } - } + }*/ } } else if(strcmp(function,"change")==0) @@ -978,7 +1021,27 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter) } else { - if(item->value_type==ITEM_VALUE_TYPE_FLOAT) + switch (item->value_type) { + case ITEM_VALUE_TYPE_FLOAT: + zbx_snprintf(value,MAX_STRING_LEN,"%f", + item->lastvalue_dbl-item->prevvalue_dbl); + del_zeroes(value); + break; + case ITEM_VALUE_TYPE_UINT64: + zbx_snprintf(value,MAX_STRING_LEN,ZBX_FS_UI64, item->lastvalue_uint64-item->prevvalue_uint64); + break; + default: + if(strcmp(item->lastvalue_str, item->prevvalue_str) == 0) + { + strcpy(value,"0"); + } + else + { + strcpy(value,"1"); + } + break; + } +/* if(item->value_type==ITEM_VALUE_TYPE_FLOAT) { zbx_snprintf(value,MAX_STRING_LEN,"%f",item->lastvalue-item->prevvalue); del_zeroes(value); @@ -993,19 +1056,50 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter) { strcpy(value,"1"); } - } + }*/ } } else if(strcmp(function,"diff")==0) { - zabbix_log( LOG_LEVEL_DEBUG, "Evaluating diff [%s] [%s]",item->lastvalue_str,item->prevvalue_str); if((item->lastvalue_null==1)||(item->prevvalue_null==1)) { ret = FAIL; } else { - if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64)) + switch (item->value_type) { + case ITEM_VALUE_TYPE_FLOAT: + if(cmp_double(item->lastvalue_dbl, item->prevvalue_dbl) == 0) + { + strcpy(value,"0"); + } + else + { + strcpy(value,"2"); + } + break; + case ITEM_VALUE_TYPE_UINT64: + if(item->lastvalue_dbl == item->prevvalue_dbl) + { + strcpy(value,"1"); + } + else + { + strcpy(value,"0"); + } + break; + default: + if(strcmp(item->lastvalue_str, item->prevvalue_str) == 0) + { + strcpy(value,"0"); + } + else + { + strcpy(value,"1"); + } + break; + } +/* if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) || (item->value_type==ITEM_VALUE_TYPE_UINT64)) { if(cmp_double(item->lastvalue, item->prevvalue) == 0) { @@ -1026,7 +1120,7 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter) { strcpy(value,"1"); } - } + }*/ } } else if(strcmp(function,"str")==0) @@ -1083,15 +1177,30 @@ int evaluate_FUNCTION(char *value,DB_ITEM *item,char *function,char *parameter) } else { - zabbix_log( LOG_LEVEL_DEBUG, "In evaluate_FUNCTION() fuzzytime [%s] [%s]",value,item->lastvalue); - - if((item->lastvalue>=fuzlow)&&(item->lastvalue<=fuzhig)) - { - strcpy(value,"1"); - } - else - { - strcpy(value,"0"); + switch (item->value_type) { + case ITEM_VALUE_TYPE_FLOAT: + if((item->lastvalue_dbl>=fuzlow)&&(item->lastvalue_dbl<=fuzhig)) + { + strcpy(value,"1"); + } + else + { + strcpy(value,"0"); + } + break; + case ITEM_VALUE_TYPE_UINT64: + if((item->lastvalue_uint64>=fuzlow)&&(item->lastvalue_uint64<=fuzhig)) + { + strcpy(value,"1"); + } + else + { + strcpy(value,"0"); + } + break; + default: + ret = FAIL; + break; } } } diff --git a/src/zabbix_server/functions.c b/src/zabbix_server/functions.c index 3c4fbb3b..24c1f7a9 100644 --- a/src/zabbix_server/functions.c +++ b/src/zabbix_server/functions.c @@ -420,8 +420,6 @@ int process_data(zbx_sock_t *sock,char *server,char *key,char *value,char *lastl init_result(&agent); -/* zbx_snprintf(sql,sizeof(sql),"select i.itemid,i.key_,h.host,h.port,i.delay,i.description,i.nextcheck,i.type,i.snmp_community,i.snmp_oid,h.useip,h.ip,i.history,i.lastvalue,i.prevvalue,i.value_type,i.trapper_hosts,i.delta,i.units,i.multiplier,i.formula,i.logtimefmt from items i,hosts h where h.status=%d and h.hostid=i.hostid and h.host='%s' and i.key_='%s' and i.status=%d and i.type in (%d,%d)", HOST_STATUS_MONITORED, server, key, ITEM_STATUS_ACTIVE, ITEM_TYPE_TRAPPER, ITEM_TYPE_ZABBIX_ACTIVE);*/ - DBescape_string(server, server_esc, MAX_STRING_LEN); DBescape_string(key, key_esc, MAX_STRING_LEN); @@ -556,27 +554,26 @@ static int add_history(DB_ITEM *item, AGENT_RESULT *value, int now) /* Delta as speed of change */ else if(item->delta == ITEM_STORE_SPEED_PER_SECOND) { - zabbix_log( LOG_LEVEL_DEBUG, "ITEM_STORE_SPEED_PER_SECOND(%s,%f,%f)", item->key, item->prevorgvalue, value->dbl); /* Save delta */ if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) && (value->type & AR_DOUBLE)) { - if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value->dbl)) + if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= value->dbl)) { - DBadd_history(item->itemid, (value->dbl - item->prevorgvalue)/(now-item->lastclock), now); + DBadd_history(item->itemid, (value->dbl - item->prevorgvalue_dbl)/(now-item->lastclock), now); } } else if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) && (value->type & AR_UINT64)) { - if((item->prevorgvalue_null == 0) && ((zbx_uint64_t)item->prevorgvalue <= (double)value->ui64)) + if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= (double)value->ui64)) { - DBadd_history(item->itemid, ((double)value->ui64 - (zbx_uint64_t)item->prevorgvalue)/(now-item->lastclock), now); + DBadd_history(item->itemid, ((double)value->ui64 - item->prevorgvalue_dbl)/(now-item->lastclock), now); } } else if((item->value_type==ITEM_VALUE_TYPE_UINT64) && (value->type & AR_UINT64)) { - if((item->prevorgvalue_null == 0) && ((zbx_uint64_t)item->prevorgvalue <= value->ui64)) + if((item->prevorgvalue_null == 0) && (item->prevorgvalue_uint64 <= value->ui64)) { - DBadd_history_uint(item->itemid, (zbx_uint64_t)(value->ui64 - (zbx_uint64_t)item->prevorgvalue)/(now-item->lastclock), now); + DBadd_history_uint(item->itemid, (zbx_uint64_t)(value->ui64 - item->prevorgvalue_uint64)/(now-item->lastclock), now); } } } @@ -586,23 +583,23 @@ static int add_history(DB_ITEM *item, AGENT_RESULT *value, int now) /* Save delta */ if((item->value_type==ITEM_VALUE_TYPE_FLOAT) && (value->type & AR_DOUBLE)) { - if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value->dbl) ) + if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= value->dbl) ) { - DBadd_history(item->itemid, (value->dbl - item->prevorgvalue), now); + DBadd_history(item->itemid, (value->dbl - item->prevorgvalue_dbl), now); } } else if((item->value_type==ITEM_VALUE_TYPE_FLOAT) && (value->type & AR_UINT64)) { - if((item->prevorgvalue_null == 0) && ((zbx_uint64_t)item->prevorgvalue <= (double)value->ui64) ) + if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= (double)value->ui64) ) { - DBadd_history(item->itemid, ((double)value->ui64 - (zbx_uint64_t)item->prevorgvalue), now); + DBadd_history(item->itemid, ((double)value->ui64 - item->prevorgvalue_dbl), now); } } else if((item->value_type==ITEM_VALUE_TYPE_UINT64) && (value->type & AR_UINT64)) { - if((item->prevorgvalue_null == 0) && ((zbx_uint64_t)item->prevorgvalue <= value->ui64) ) + if((item->prevorgvalue_null == 0) && (item->prevorgvalue_uint64 <= value->ui64) ) { - DBadd_history_uint(item->itemid, (value->ui64 - (zbx_uint64_t)item->prevorgvalue), now); + DBadd_history_uint(item->itemid, value->ui64 - item->prevorgvalue_uint64, now); } } } @@ -659,26 +656,22 @@ static int add_history(DB_ITEM *item, AGENT_RESULT *value, int now) ******************************************************************************/ static int update_item(DB_ITEM *item, AGENT_RESULT *value, time_t now) { - char value_esc[MAX_STRING_LEN]; - char value_str[MAX_STRING_LEN]; - double value_double; + char value_esc[MAX_STRING_LEN]; + char value_str[MAX_STRING_LEN]; int ret = SUCCEED; zabbix_log( LOG_LEVEL_DEBUG, "In update_item()"); value_str[0] = '\0'; value_esc[0] = '\0'; - value_double = 0; if(value->type & AR_UINT64) { zbx_snprintf(value_str, sizeof(value_str),ZBX_FS_UI64, value->ui64); - value_double = (double)value->ui64; } if(value->type & AR_DOUBLE) { zbx_snprintf(value_str,sizeof(value_str),"%f", value->dbl); - value_double = value->dbl; } if(value->type & AR_STRING) { @@ -691,98 +684,192 @@ static int update_item(DB_ITEM *item, AGENT_RESULT *value, time_t now) if(item->delta == ITEM_STORE_AS_IS) { -/* if((item->prevvalue_null == 1) || (strcmp(value_str,item->lastvalue_str) != 0) || (strcmp(item->prevvalue_str,item->lastvalue_str) != 0) )*/ -/* Fixed crash when lastvalue == NULL */ - if((value->type & AR_TEXT) == 0 && ((item->prevvalue_null == 1) || (item->lastvalue_null == 1) || - (strcmp(value_str,item->lastvalue_str) != 0) || - (strcmp(item->prevvalue_str,item->lastvalue_str) != 0))) - { - DBescape_string(value_str,value_esc,MAX_STRING_LEN); -/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='%s',lastclock=%d where itemid=%d",now+item->delay,value_esc,now,item->itemid);*/ - DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='%s',lastclock=%d where itemid=" ZBX_FS_UI64, - calculate_item_nextcheck(item->itemid, item->type, item->delay, item->delay_flex, now), - value_esc, - (int)now, - item->itemid); - - item->prevvalue=item->lastvalue; - item->lastvalue=value_double; - item->prevvalue_str=item->lastvalue_str; - /* Risky !!!*/ - item->lastvalue_str=value_str; - item->prevvalue_null=item->lastvalue_null; - item->lastvalue_null=0; - } - else - { -/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,lastclock=%d where itemid=%d",now+item->delay,now,item->itemid);*/ - DBexecute("update items set nextcheck=%d,lastclock=%d where itemid=" ZBX_FS_UI64, - calculate_item_nextcheck(item->itemid, item->type, item->delay, item->delay_flex, now), - (int)now, - item->itemid); + switch(value->type) { + case AR_DOUBLE: + DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay, item->delay_flex, now), + value->dbl, + (int)now, + item->itemid); + break; + case AR_UINT64: + DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='" ZBX_FS_UI64 "',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay, item->delay_flex, now), + value->ui64, + (int)now, + item->itemid); + break; + case AR_STRING: + DBescape_string(value_str,value_esc,MAX_STRING_LEN); + DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,lastvalue='%s',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay, item->delay_flex, now), + value_esc, + (int)now, + item->itemid); + break; + default: + break; } } /* Logic for delta as speed of change */ else if(item->delta == ITEM_STORE_SPEED_PER_SECOND) { - if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value_double) ) + if((value->type & AR_DOUBLE) && (item->value_type == ITEM_VALUE_TYPE_FLOAT)) + { + if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= value->dbl) ) + { + DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='%f',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), + value->dbl, + (value->dbl - item->prevorgvalue_dbl)/(now-item->lastclock), + (int)now, + item->itemid); + } + else + { + DBexecute("update items set nextcheck=%d,prevorgvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), + value->dbl, + (int)now, + item->itemid); + } + } + else if((value->type & AR_DOUBLE) && (item->value_type == ITEM_VALUE_TYPE_UINT64)) { -/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue=%f,lastvalue='%f',lastclock=%d where itemid=%d",now+item->delay,value_double,(value_double - item->prevorgvalue)/(now-item->lastclock),now,item->itemid);*/ - DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue=%f,lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, - calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), - value_double, - (value_double - item->prevorgvalue)/(now-item->lastclock), - (int)now, - item->itemid); + if((item->prevorgvalue_null == 0) && ((double)item->prevorgvalue_uint64 <= value->dbl) ) + { + DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='%f',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), + value->dbl, + (value->dbl - (double)(item->prevorgvalue_uint64))/(now-item->lastclock), + (int)now, + item->itemid); + } + else + { + DBexecute("update items set nextcheck=%d,prevorgvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), + value->dbl, + (int)now, + item->itemid); + } } - else + else if((value->type & AR_UINT64) && (item->value_type == ITEM_VALUE_TYPE_UINT64)) { -/* snprintf(sql,sizeof(sql)-1,"update items set nextcheck=%d,prevorgvalue=%f,lastclock=%d where itemid=%d",now+item->delay,value_double,now,item->itemid);*/ - DBexecute("update items set nextcheck=%d,prevorgvalue=%f,lastclock=%d where itemid=" ZBX_FS_UI64, - calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), - value_double, - (int)now, - item->itemid); + if((item->prevorgvalue_null == 0) && (item->prevorgvalue_uint64 <= value->ui64) ) + { + DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='" ZBX_FS_UI64 "',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), + value->ui64, + ((double)(value->ui64 - item->prevorgvalue_uint64))/(now-item->lastclock), + (int)now, + item->itemid); + } + else + { + DBexecute("update items set nextcheck=%d,prevorgvalue='" ZBX_FS_UI64 "',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), + value->ui64, + (int)now, + item->itemid); + } } - - item->prevvalue=item->lastvalue; - item->lastvalue=(value_double - item->prevorgvalue)/(now-item->lastclock); - item->prevvalue_str=item->lastvalue_str; - /* Risky !!!*/ - item->lastvalue_str=value_str; - item->prevvalue_null=item->lastvalue_null; - item->lastvalue_null=0; } /* Real delta: simple difference between values */ else if(item->delta == ITEM_STORE_SIMPLE_CHANGE) { - if((item->prevorgvalue_null == 0) && (item->prevorgvalue <= value_double) ) + if((value->type & AR_DOUBLE) && (item->value_type == ITEM_VALUE_TYPE_FLOAT)) { - DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue=%f,lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, - calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), - value_double, - (value_double - item->prevorgvalue), - (int)now, - item->itemid); + if((item->prevorgvalue_null == 0) && (item->prevorgvalue_dbl <= value->dbl)) + { + DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='%f',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), + value->dbl, + (value->dbl - item->prevorgvalue_dbl), + (int)now, + item->itemid); + } + else + { + DBexecute("update items set nextcheck=%d,prevorgvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex, now), + value->dbl, + (int)now, + item->itemid); + } } - else + else if((value->type & AR_DOUBLE) && (item->value_type == ITEM_VALUE_TYPE_UINT64)) { - DBexecute("update items set nextcheck=%d,prevorgvalue=%f,lastclock=%d where itemid=" ZBX_FS_UI64, - calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex, now), - value_double, - (int)now, - item->itemid); + if((item->prevorgvalue_null == 0) && ((double)item->prevorgvalue_uint64 <= value->dbl)) + { + DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='%f',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), + value->dbl, + (value->dbl - (double)item->prevorgvalue_uint64), + (int)now, + item->itemid); + } + else + { + DBexecute("update items set nextcheck=%d,prevorgvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex, now), + value->dbl, + (int)now, + item->itemid); + } + } + else if((value->type & AR_UINT64) && (item->value_type == ITEM_VALUE_TYPE_UINT64)) + { + if((item->prevorgvalue_null == 0) && (item->prevorgvalue_uint64 <= value->ui64)) + { + DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='" ZBX_FS_UI64 "',lastvalue='" ZBX_FS_UI64 "',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), + value->ui64, + (value->ui64 - item->prevorgvalue_uint64), + (int)now, + item->itemid); + } + else + { + DBexecute("update items set nextcheck=%d,prevorgvalue='" ZBX_FS_UI64 "',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex, now), + value->ui64, + (int)now, + item->itemid); + } + } + else if((value->type & AR_UINT64) && (item->value_type == ITEM_VALUE_TYPE_FLOAT)) + { + if((item->prevorgvalue_null == 0) && (item->prevorgvalue_uint64 <= value->ui64)) + { + DBexecute("update items set nextcheck=%d,prevvalue=lastvalue,prevorgvalue='" ZBX_FS_UI64 "',lastvalue='%f',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex,now), + value->ui64, + ((double)value->ui64 - item->prevorgvalue_uint64), + (int)now, + item->itemid); + } + else + { + DBexecute("update items set nextcheck=%d,prevorgvalue='" ZBX_FS_UI64 "',lastclock=%d where itemid=" ZBX_FS_UI64, + calculate_item_nextcheck(item->itemid, item->type, item->delay,item->delay_flex, now), + value->ui64, + (int)now, + item->itemid); + } } - - item->prevvalue=item->lastvalue; - item->lastvalue=(value_double - item->prevorgvalue); - item->prevvalue_str=item->lastvalue_str; - /* Risky !!!*/ - item->lastvalue_str=value_str; - item->prevvalue_null=item->lastvalue_null; - item->lastvalue_null=0; } + item->prevvalue_str=item->lastvalue_str; + item->prevvalue_dbl=item->lastvalue_dbl; + item->prevvalue_uint64=item->lastvalue_uint64; + item->prevvalue_null=item->lastvalue_null; + + item->lastvalue_uint64=value->ui64; + item->lastvalue_dbl=value->dbl; + item->lastvalue_str=value->str; + item->lastvalue_null=0; + /* Update item status if required */ if(item->status == ITEM_STATUS_NOTSUPPORTED) { @@ -816,8 +903,6 @@ static int update_item(DB_ITEM *item, AGENT_RESULT *value, time_t now) void process_new_value(DB_ITEM *item, AGENT_RESULT *value) { time_t now; -/* char value_str[MAX_STRING_LEN]; - double value_double;*/ double multiplier; char *e; @@ -825,10 +910,6 @@ void process_new_value(DB_ITEM *item, AGENT_RESULT *value) now = time(NULL); -/* strscpy(value_str, value);*/ - -/* value_double=strtod(value_str,&e);*/ - if(item->multiplier == ITEM_MULTIPLIER_USE) { if( (item->value_type==ITEM_VALUE_TYPE_FLOAT) && (value->type & AR_DOUBLE)) diff --git a/src/zabbix_server/poller/poller.c b/src/zabbix_server/poller/poller.c index 9ad08bec..479f36d0 100644 --- a/src/zabbix_server/poller/poller.c +++ b/src/zabbix_server/poller/poller.c @@ -171,6 +171,8 @@ static void update_key_status(zbx_uint64_t hostid,int host_status) DB_RESULT result; DB_ROW row; + int update; + zabbix_log(LOG_LEVEL_DEBUG, "In update_key_status(" ZBX_FS_UI64 ",%d)", hostid,host_status); @@ -184,8 +186,11 @@ static void update_key_status(zbx_uint64_t hostid,int host_status) DBget_item_from_db(&item,row); /* Do not process new value for status, if previous status is the same */ - zabbix_log( LOG_LEVEL_DEBUG, "item.lastvalue[%f] new host status[%d]",item.lastvalue,host_status); - if( (item.lastvalue_null==1) || (cmp_double(item.lastvalue, (double)host_status) == 1)) + update = (item.lastvalue_null==1); + update = update || ((item.value_type == ITEM_VALUE_TYPE_FLOAT) &&(cmp_double(item.lastvalue_dbl, (double)host_status) == 1)); + update = update || ((item.value_type == ITEM_VALUE_TYPE_UINT64) &&(item.lastvalue_uint64 == host_status)); + + if(update) { init_result(&agent); SET_UI64_RESULT(&agent, host_status); diff --git a/src/zabbix_server/timer/timer.c b/src/zabbix_server/timer/timer.c index a5ff96db..b2847a9b 100644 --- a/src/zabbix_server/timer/timer.c +++ b/src/zabbix_server/timer/timer.c @@ -96,10 +96,6 @@ void main_timer_loop() { DBget_item_from_db(&item,row); -/* Update triggers will update value for NODATA */ -/* zbx_snprintf(sql,sizeof(sql),"update functions set lastvalue='1' where itemid=%d and function='%s' and parameter='%s'" , itemid, function, parameter ); - DBexecute(sql);*/ - DBbegin(); update_functions(&item); update_triggers(item.itemid); diff --git a/upgrades/dbpatches/1.3/mysql/changed_tables.sql b/upgrades/dbpatches/1.3/mysql/changed_tables.sql index 734fbeec..d2070f34 100644 --- a/upgrades/dbpatches/1.3/mysql/changed_tables.sql +++ b/upgrades/dbpatches/1.3/mysql/changed_tables.sql @@ -289,7 +289,7 @@ CREATE TABLE items_tmp ( units varchar(10) DEFAULT '' NOT NULL, multiplier integer DEFAULT '0' NOT NULL, delta integer DEFAULT '0' NOT NULL, - prevorgvalue double(16,4) NULL, + prevorgvalue varchar(255) NULL, snmpv3_securityname varchar(64) DEFAULT '' NOT NULL, snmpv3_securitylevel integer DEFAULT '0' NOT NULL, snmpv3_authpassphrase varchar(64) DEFAULT '' NOT NULL, |