Beispiel #1
0
/*
 * 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;
}
Beispiel #2
0
/*
 * 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;
}