/****************************************************************************** * * * Function: get_perf_counter_value_by_name * * * * Purpose: gets average named performance counter value * * * * Parameters: name - [IN] the performance counter name * * value - [OUT] the calculated value * * error - [OUT] the error message * * * * Returns: SUCCEED - the value was retrieved successfully * * FAIL - otherwise * * * * Comments: The value is retrieved from collector (if it has been requested * * before) or directly from Windows performance counters if * * possible. * * * ******************************************************************************/ int get_perf_counter_value_by_name(const char *name, double *value, char **error) { const char *__function_name = "get_perf_counter_value_by_name"; int ret = FAIL; PERF_COUNTER_DATA *perfs = NULL; char *counterpath = NULL; zabbix_log(LOG_LEVEL_DEBUG, "In %s() name:%s", __function_name, name); LOCK_PERFCOUNTERS; if (SUCCEED != perf_collector_started()) { *error = zbx_strdup(*error, "Performance collector is not started."); goto out; } for (perfs = ppsd.pPerfCounterList; NULL != perfs; perfs = perfs->next) { if (NULL != perfs->name && 0 == strcmp(perfs->name, name)) { if (PERF_COUNTER_ACTIVE != perfs->status) break; /* the counter data is already being collected, return it */ *value = compute_average_value(perfs, perfs->interval); ret = SUCCEED; goto out; } } /* we can retrieve named counter data only if it has been registered before */ if (NULL == perfs) { *error = zbx_dsprintf(*error, "Unknown performance counter name: %s.", name); goto out; } counterpath = zbx_strdup(counterpath, perfs->counterpath); out: UNLOCK_PERFCOUNTERS; if (NULL != counterpath) { /* request counter value directly from Windows performance counters */ if (ERROR_SUCCESS == calculate_counter_value(__function_name, counterpath, value)) ret = SUCCEED; zbx_free(counterpath); } zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret)); return ret; }
/****************************************************************************** * * * Function: get_perf_counter_value_by_path * * * * Purpose: gets average performance counter value * * * * Parameters: counterpath - [IN] the performance counter path * * interval - [IN] the data collection interval in seconds * * value - [OUT] the calculated value * * error - [OUT] the error message * * * * Returns: SUCCEED - the value was retrieved successfully * * FAIL - otherwise * * * * Comments: The value is retrieved from collector (if it has been requested * * before) or directly from Windows performance counters if * * possible. * * * ******************************************************************************/ int get_perf_counter_value_by_path(const char *counterpath, int interval, double *value, char **error) { const char *__function_name = "get_perf_counter_value_by_path"; int ret = FAIL; PERF_COUNTER_DATA *perfs = NULL; zabbix_log(LOG_LEVEL_DEBUG, "In %s() path:%s interval:%d", __function_name, counterpath, interval); LOCK_PERFCOUNTERS; if (SUCCEED != perf_collector_started()) { *error = zbx_strdup(*error, "Performance collector is not started."); goto out; } for (perfs = ppsd.pPerfCounterList; NULL != perfs; perfs = perfs->next) { if (0 == strcmp(perfs->counterpath, counterpath)) { if (perfs->interval < interval) extend_perf_counter_interval(perfs, interval); if (PERF_COUNTER_ACTIVE != perfs->status) break; /* the counter data is already being collected, return it */ *value = compute_average_value(perfs, interval); ret = SUCCEED; goto out; } } /* if the requested counter is not already being monitored - start monitoring */ if (NULL == perfs) perfs = add_perf_counter(NULL, counterpath, interval, error); out: UNLOCK_PERFCOUNTERS; if (SUCCEED != ret && NULL != perfs) { /* request counter value directly from Windows performance counters */ if (ERROR_SUCCESS == calculate_counter_value(__function_name, counterpath, value)) ret = SUCCEED; } zabbix_log(LOG_LEVEL_DEBUG, "End of %s():%s", __function_name, zbx_result_string(ret)); return ret; }
int USER_PERF_COUNTER(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { const char *__function_name = "USER_PERF_COUNTER"; PERF_COUNTER_DATA *perfs = NULL; int ret = SYSINFO_RET_FAIL; double value; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); if (!PERF_COLLECTOR_STARTED(collector)) { zabbix_log(LOG_LEVEL_DEBUG, "Collector is not started!"); return ret; } for (perfs = collector->perfs.pPerfCounterList; NULL != perfs; perfs = perfs->next) { if (NULL != perfs->name && 0 == strcmp(perfs->name, param)) { if (PERF_COUNTER_ACTIVE == perfs->status) { SET_DBL_RESULT(result, compute_average_value(__function_name, perfs, USE_DEFAULT_INTERVAL)); ret = SYSINFO_RET_OK; } break; } } if (SYSINFO_RET_OK != ret && NULL != perfs) { if (ERROR_SUCCESS == calculate_counter_value(__function_name, perfs->counterpath, &value)) { perfs->status = PERF_COUNTER_INITIALIZED; SET_DBL_RESULT(result, value); ret = SYSINFO_RET_OK; } } zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __function_name); return ret; }
int PERF_COUNTER(const char *cmd, const char *param, unsigned flags, AGENT_RESULT *result) { const char *__function_name = "PERF_COUNTER"; char counterpath[PDH_MAX_COUNTER_PATH], tmp[MAX_STRING_LEN]; int ret = SYSINFO_RET_FAIL, interval; double value; PERF_COUNTER_DATA *perfs = NULL; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); if (2 < num_param(param)) goto clean; if (0 != get_param(param, 1, counterpath, sizeof(counterpath)) || '\0' == *counterpath) goto clean; if (0 != get_param(param, 2, tmp, sizeof(tmp)) || '\0' == *tmp) interval = 1; else if (FAIL == is_uint(tmp)) goto clean; else interval = atoi(tmp); if (FAIL == check_counter_path(counterpath)) goto clean; if (1 < interval) { if (!PERF_COLLECTOR_STARTED(collector)) { zabbix_log(LOG_LEVEL_DEBUG, "Collector is not started!"); goto clean; } for (perfs = collector->perfs.pPerfCounterList; NULL != perfs; perfs = perfs->next) { if (0 == strcmp(perfs->counterpath, counterpath) && perfs->interval == interval) { if (PERF_COUNTER_ACTIVE != perfs->status) break; SET_DBL_RESULT(result, compute_average_value(__function_name, perfs, USE_DEFAULT_INTERVAL)); ret = SYSINFO_RET_OK; goto clean; } } if (NULL == perfs && NULL == (perfs = add_perf_counter(NULL, counterpath, interval))) goto clean; } if (ERROR_SUCCESS == calculate_counter_value(__function_name, counterpath, &value)) { if (NULL != perfs) perfs->status = PERF_COUNTER_INITIALIZED; SET_DBL_RESULT(result, value); ret = SYSINFO_RET_OK; } clean: zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __function_name); return ret; }