/* * build_activity_clause takes agent request parameters for an item key which * targets the pg_stat_actity table and creates an SQL clause to filter * results. * * This function should be reused for all items which query the pg_stat_activity * table. * * request is the agent request containing the user parameters. * buf is the character buffer to which the clause is written. * params is a pointer to a PGparams type which stores query parameters. * has_clause determines if the the clause starts with "WITH" or "AND". * * Returns non-zero on success. */ static int build_activity_clause(const AGENT_REQUEST *request, char *buf, PGparams *params, int has_clause) { const char *__function_name = "build_activity_clause"; // Function name for log file int i = 0; char *param = NULL; char *clause = (0 < has_clause ? PG_AND : PG_WHERE); int pgi = 0; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); // iterate over the available parameters for(i = 0; i < 4; i++) { param = get_rparam(request, PARAM_FIRST + i); if(!strisnull(param)) { switch(i) { case 0: // <database> *params = param_append(*params, param); if(is_oid(param)) zbx_snprintf(buf, MAX_CLAUSE_LEN, " %s datid = $%i", clause, ++pgi); else zbx_snprintf(buf, MAX_CLAUSE_LEN, " %s datname = $%i", clause, ++pgi); break; case 1: // <user> *params = param_append(*params, param); if(is_oid(param)) zbx_snprintf(buf, MAX_CLAUSE_LEN, " %s usesysid = $%i", clause, ++pgi); else zbx_snprintf(buf, MAX_CLAUSE_LEN, " %s usename = $%i", clause, ++pgi); break; case 2: // <client> *params = param_append(*params, param); if(is_valid_ip(param)) zbx_snprintf(buf, MAX_CLAUSE_LEN, " %s client_addr = $%i::inet", clause, ++pgi); else // requires v9.1+ zbx_snprintf(buf, MAX_CLAUSE_LEN, " %s client_hostname = $%i", clause, ++pgi); break; case 3: // <waiting> if(0 == strncmp("true\0", param, 5)) { zbx_snprintf(buf, MAX_CLAUSE_LEN, " %s waiting = TRUE", clause); } else if(0 == strncmp("false\0", param, 6)) { zbx_snprintf(buf, MAX_CLAUSE_LEN, " %s waiting = FALSE", clause); } else { zabbix_log(LOG_LEVEL_ERR, "Unsupported parameter value: \"%s\" in %s", param, request->key); return 0; } break; } buf += strlen(buf); clause = PG_AND; } } zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __function_name); return 1; }
/* * Custom key pg.backends.count * * Returns statistics for connected backends (remote clients) * * Parameters: * 0: connection string * 1: connection database * 2: filter by database oid name * 3: filter by user OID or name * 4: filter by hostname or IP address of the connected host * 5: return only waiting backends * * Returns: u */ int PG_BACKENDS_COUNT(AGENT_REQUEST *request, AGENT_RESULT *result) { int ret = SYSINFO_RET_FAIL; // Request result code const char *__function_name = "PG_BACKENDS_COUNT"; // Function name for log file char query[MAX_QUERY_LEN]; char *p = &query[0]; int i = 0; char *param = NULL; char *clause = PG_WHERE; PGparams pgparams = NULL; int pgi = 0; zabbix_log(LOG_LEVEL_DEBUG, "In %s()", __function_name); // Build the sql query memset(query, 0, MAX_QUERY_LEN); zbx_strlcpy(p, PGSQL_GET_BACKENDS, MAX_QUERY_LEN); p += strlen(p); // iterate over the available parameters for(i = 0; i < 4; i++) { param = get_rparam(request, PARAM_FIRST + i); if(!strisnull(param)) { switch(i) { case 0: // <database> pgparams = param_append(pgparams, param); if(is_oid(param)) zbx_snprintf(p, MAX_CLAUSE_LEN, " %s datid=$%i", clause, ++pgi); else zbx_snprintf(p, MAX_CLAUSE_LEN, " %s datname=$%i", clause, ++pgi); break; case 1: // <user> pgparams = param_append(pgparams, param); if(is_oid(param)) zbx_snprintf(p, MAX_CLAUSE_LEN, " %s usesysid=$%i", clause, ++pgi); else zbx_snprintf(p, MAX_CLAUSE_LEN, " %s usename=$%i", clause, ++pgi); break; case 2: // <client> pgparams = param_append(pgparams, param); if(is_valid_ip(param)) zbx_snprintf(p, MAX_CLAUSE_LEN, " %s client_addr = $%i::inet", clause, ++pgi); else // requires v9.1+ zbx_snprintf(p, MAX_CLAUSE_LEN, " %s client_hostname=$%i", clause, ++pgi); break; case 3: // <waiting> if(0 == strncmp("true", param, 4)) { zbx_snprintf(p, MAX_CLAUSE_LEN, " %s waiting=TRUE", clause); } else if(0 == strncmp("false", param, 5)) { zbx_snprintf(p, MAX_CLAUSE_LEN, " %s waiting=FALSE", clause); } else { zabbix_log(LOG_LEVEL_ERR, "Unsupported 'Waiting' parameter: %s in %s()", param, __function_name); goto out; } break; } p += strlen(p); clause = PG_AND; } } ret = pg_get_int(request, result, query, pgparams); out: zabbix_log(LOG_LEVEL_DEBUG, "End of %s()", __function_name); return ret; }