Actions for task and sensors
The action for a task or sensor is an SQL statement or routine that performs one or more operations.
SQL statements are useful if the action consists of a single operation. A stored procedure or a user-defined routine written in C or Java™ is useful if the action consists of multiple operations. The action is stored in the tk_execute column of the ph_task table.
You have a great deal of flexibility when you create an action.
Possible types of operations include:
- Perform a DML operation. You can use a sensor to insert or update data in a table. You can use a task to delete older data from a table.
- Perform an administrative operation. You can use a task to run an SQL administration API function to administer the database server. For example, you can create a task to take checkpoints every two minutes.
- Perform an operation based on a threshold. You can use a threshold from the ph_threshold table to determine if a task action must be run. For example, you can create a task that adds a shared memory segment if the amount of available shared memory falls below a threshold value.
- Create an alert to report an operation or warn of a potential problem. For example, you can create a task to terminate idle users that inserts a row into the ph_alert table when a user session is terminated. You can also create a task to monitor backups and insert a warning into the ph_alert table when a backup has not occurred.
Use the following variables in your task or sensor action:
- $DATA_TASK_ID: Use to indicate the current task or sensor. This variable corresponds to the value of the tk_id field in the ph_task table.
- $DATA_SEQ_ID: Use to indicate the current execution of the task or sensor. This variable corresponds to the value of the tk_sequence field in the ph_task table and the run_task_sequence field in the ph_run table.
Examples
The following action is an SQL
statement that the built-in mon_command_history task uses to
remove older rows from the command_history table.
DELETE FROM command_history
WHERE cmd_exec_time < (
SELECT CURRENT - value::INTERVAL DAY to SECOND
FROM ph_threshold
WHERE name = 'COMMAND HISTORY RETENTION' )
The following
example is an SQL statement that the built-in mon_vps sensor
uses to add data to the mon_vps result table:
INSERT INTO mon_vps
SELECT $DATA_SEQ_ID, vpid, num_ready,
class, usecs_user, usecs_sys
FROM sysmaster:sysvplst
The following example is
a stored procedure that terminates user sessions that are idle for
longer than a value set by a threshold, and then adds an alert to
the ph_alert table.
/*
**************************************************************
* Create a function that will find all users that have
* been idle for the specified time. Call the SQL admin API to
* terminate those users. Create an alert to track which
* users have been terminated.
**************************************************************
*/
CREATE FUNCTION idle_timeout( task_id INT, task_seq INT)
RETURNING INTEGER
DEFINE time_allowed INTEGER;
DEFINE sys_hostname CHAR(16);
DEFINE sys_username CHAR(257);
DEFINE sys_sid INTEGER;
DEFINE rc INTEGER;
{*** Get the maximum amount of time to be idle ***}
SELECT value::integer
INTO time_allowed
FROM ph_threshold
WHERE name = "IDLE TIMEOUT";
{*** Find all users who are idle longer than the threshold ***}
FOREACH SELECT admin("onmode","z",A.sid), A.username, A.sid, hostname
INTO rc, sys_username, sys_sid, sys_hostname
FROM sysmaster:sysrstcb A , sysmaster:systcblst B,
sysmaster:sysscblst C
WHERE A.tid = B.tid
AND C.sid = A.sid
AND lower(name) in ("sqlexec")
AND CURRENT - DBINFO("utc_to_datetime",last_run_time) > time_allowed UNITS MINUTE
AND lower(A.username) NOT IN( "informix", "root")
{*** If a user is successfully terminated, log ***}
{*** the information into the alert table. ***}
IF rc > 0 THEN
INSERT INTO ph_alert
(
ID, alert_task_id,alert_task_seq,
alert_type, alert_color,
alert_state,
alert_object_type, alert_object_name,
alert_message,
alert_action
) VALUES (
0,task_id, task_seq,
"INFO", "GREEN",
"ADDRESSED",
"USER","TIMEOUT",
"User "||TRIM(sys_username)||"@"||TRIM(sys_hostname)||
" sid("||sys_sid||")"||
" terminated due to idle timeout.",
NULL
);
END IF
END FOREACH;
RETURN 0;
END FUNCTION;