From 4553ffa598a38602cf77dd29465b33f55dc3fcdb Mon Sep 17 00:00:00 2001 From: Mathieu GOULIN Date: Sat, 5 Dec 2020 22:23:50 +0100 Subject: [PATCH] ..F.....S. [ZBXNEXT-6382] Create for webscenario step an item with response body --- include/common.h | 1 + src/zabbix_server/httppoller/httptest.c | 23 +++++++++++-------- .../classes/api/managers/CHttpTestManager.php | 20 ++++++++++++++-- ui/include/defines.inc.php | 1 + 4 files changed, 34 insertions(+), 11 deletions(-) diff --git a/include/common.h b/include/common.h index e97323cddd..34056fa16a 100644 --- a/include/common.h +++ b/include/common.h @@ -745,6 +745,7 @@ const char *zbx_item_logtype_string(unsigned char logtype); #define ZBX_HTTPITEM_TYPE_SPEED 2 #define ZBX_HTTPITEM_TYPE_LASTSTEP 3 #define ZBX_HTTPITEM_TYPE_LASTERROR 4 +#define ZBX_HTTPITEM_TYPE_BODY 5 /* proxy_history flags */ #define PROXY_HISTORY_FLAG_META 0x01 diff --git a/src/zabbix_server/httppoller/httptest.c b/src/zabbix_server/httppoller/httptest.c index a344d82166..fff07951b8 100644 --- a/src/zabbix_server/httppoller/httptest.c +++ b/src/zabbix_server/httppoller/httptest.c @@ -259,14 +259,14 @@ static void httppairs_free(zbx_vector_ptr_pair_t *pairs) } #ifdef HAVE_LIBCURL -static void process_step_data(zbx_uint64_t httpstepid, zbx_httpstat_t *stat, zbx_timespec_t *ts) +static void process_step_data(zbx_uint64_t httpstepid, zbx_httpstat_t *stat, zbx_timespec_t *ts, zbx_httppage_t *page) { DB_RESULT result; DB_ROW row; - unsigned char types[3]; - DC_ITEM items[3]; - zbx_uint64_t itemids[3]; - int errcodes[3]; + unsigned char types[4]; + DC_ITEM items[4]; + zbx_uint64_t itemids[4]; + int errcodes[4]; size_t i, num = 0; AGENT_RESULT value; @@ -277,14 +277,14 @@ static void process_step_data(zbx_uint64_t httpstepid, zbx_httpstat_t *stat, zbx while (NULL != (row = DBfetch(result))) { - if (3 == num) + if (3 < num) { THIS_SHOULD_NEVER_HAPPEN; break; } if (ZBX_HTTPITEM_TYPE_RSPCODE != (types[num] = (unsigned char)atoi(row[0])) && - ZBX_HTTPITEM_TYPE_TIME != types[num] && ZBX_HTTPITEM_TYPE_SPEED != types[num]) + ZBX_HTTPITEM_TYPE_TIME != types[num] && ZBX_HTTPITEM_TYPE_SPEED != types[num] && ZBX_HTTPITEM_TYPE_BODY != types[num]) { THIS_SHOULD_NEVER_HAPPEN; continue; @@ -329,13 +329,18 @@ static void process_step_data(zbx_uint64_t httpstepid, zbx_httpstat_t *stat, zbx case ZBX_HTTPITEM_TYPE_SPEED: SET_DBL_RESULT(&value, stat->speed_download); break; + case ZBX_HTTPITEM_TYPE_BODY: + SET_TEXT_RESULT(&value, page->data); + break; } items[i].state = ITEM_STATE_NORMAL; zbx_preprocess_item_value(items[i].itemid, items[i].value_type, 0, &value, ts, items[i].state, NULL); + if(ZBX_HTTPITEM_TYPE_BODY != types[i]) { + free_result(&value); + } - free_result(&value); } DCconfig_clean_items(items, errcodes, num); @@ -966,7 +971,7 @@ static void process_httptest(DC_HOST *host, zbx_httptest_t *httptest) zbx_free(var_err_str); zbx_timespec(&ts); - process_step_data(db_httpstep.httpstepid, &stat, &ts); + process_step_data(db_httpstep.httpstepid, &stat, &ts, &page); zbx_free(page.data); } diff --git a/ui/include/classes/api/managers/CHttpTestManager.php b/ui/include/classes/api/managers/CHttpTestManager.php index 1585e9ae13..654177ca1f 100644 --- a/ui/include/classes/api/managers/CHttpTestManager.php +++ b/ui/include/classes/api/managers/CHttpTestManager.php @@ -1001,6 +1001,13 @@ class CHttpTestManager { 'units' => 's', 'httpstepitemtype' => HTTPSTEP_ITEM_TYPE_TIME ], + [ + 'name' => $this->getStepName(HTTPSTEP_ITEM_TYPE_BODY, $http_test['name'], $webstep['name']), + 'key_' => $this->getStepKey(HTTPSTEP_ITEM_TYPE_BODY, $http_test['name'], $webstep['name']), + 'value_type' => ITEM_VALUE_TYPE_TEXT, + 'units' => '', + 'httpstepitemtype' => HTTPSTEP_ITEM_TYPE_BODY + ], [ 'name' => $this->getStepName(HTTPSTEP_ITEM_TYPE_RSPCODE, $http_test['name'], $webstep['name']), 'key_' => $this->getStepKey(HTTPSTEP_ITEM_TYPE_RSPCODE, $http_test['name'], $webstep['name']), @@ -1029,8 +1036,13 @@ class CHttpTestManager { $item['hostid'] = $http_test['hostid']; $item['delay'] = $delay; $item['type'] = ITEM_TYPE_HTTPTEST; - $item['history'] = self::ITEM_HISTORY; - $item['trends'] = self::ITEM_TRENDS; + if($item['httpstepitemtype'] == HTTPSTEP_ITEM_TYPE_BODY) { + $item['history'] = 0; + $item['trends'] = 0; + } else { + $item['history'] = self::ITEM_HISTORY; + $item['trends'] = self::ITEM_TRENDS; + } $item['status'] = (HTTPTEST_STATUS_ACTIVE == $status) ? ITEM_STATUS_ACTIVE : ITEM_STATUS_DISABLED; if (isset($parent_step_items[$item['key_']])) { @@ -1325,6 +1337,8 @@ class CHttpTestManager { return 'web.test.in['.quoteItemKeyParam($test_name).','.quoteItemKeyParam($step_name).',bps]'; case HTTPSTEP_ITEM_TYPE_TIME: return 'web.test.time['.quoteItemKeyParam($test_name).','.quoteItemKeyParam($step_name).',resp]'; + case HTTPSTEP_ITEM_TYPE_BODY: + return 'web.test.body['.quoteItemKeyParam($test_name).','.quoteItemKeyParam($step_name).']'; case HTTPSTEP_ITEM_TYPE_RSPCODE: return 'web.test.rspcode['.quoteItemKeyParam($test_name).','.quoteItemKeyParam($step_name).']'; } @@ -1347,6 +1361,8 @@ class CHttpTestManager { return 'Download speed for step "'.$step_name.'" of scenario "'.$test_name.'".'; case HTTPSTEP_ITEM_TYPE_TIME: return 'Response time for step "'.$step_name.'" of scenario "'.$test_name.'".'; + case HTTPSTEP_ITEM_TYPE_BODY: + return 'Response body for step "'.$step_name.'" of scenario "'.$test_name.'".'; case HTTPSTEP_ITEM_TYPE_RSPCODE: return 'Response code for step "'.$step_name.'" of scenario "'.$test_name.'".'; } diff --git a/ui/include/defines.inc.php b/ui/include/defines.inc.php index 49fe737f61..66bac64f04 100644 --- a/ui/include/defines.inc.php +++ b/ui/include/defines.inc.php @@ -938,6 +938,7 @@ define('HTTPSTEP_ITEM_TYPE_TIME', 1); define('HTTPSTEP_ITEM_TYPE_IN', 2); define('HTTPSTEP_ITEM_TYPE_LASTSTEP', 3); define('HTTPSTEP_ITEM_TYPE_LASTERROR', 4); +define('HTTPSTEP_ITEM_TYPE_BODY', 5); define('HTTPTEST_STEP_RETRIEVE_MODE_CONTENT', 0); define('HTTPTEST_STEP_RETRIEVE_MODE_HEADERS', 1); -- 2.18.4