PL/SQLベースの通知メソッドの定義

PL/SQLベースの通知メソッドの作成は、次の4つのステップで構成されます。

  1. PL/SQLプロシージャを定義します。
  2. 管理リポジトリ上にPL/SQLプロシージャを作成します。
  3. PL/SQLプロシージャを新規の通知メソッドとして登録します。
  4. 通知メソッドをインシデント・ルールに割り当てます。

例6-9 PL/SQLプロシージャに必要な情報

Name Open trouble ticket
Description Notification method to open a trouble ticket in the event
PLSQL Procedure ticket_sys.ticket_ops.open_ticket

例6-10 PL/SQLスクリプト

-- Assume log_table is created by following DDL
-- CREATE TABLE log_table (message VARCHAR2(4000)) ;
-- Define PL/SQL notification method for Events
CREATE OR REPLACE PROCEDURE log_table_notif_proc(s IN GC$NOTIF_EVENT_MSG)
IS
  l_categories gc$category_string_array;
  l_category_codes gc$category_string_array;
  l_attrs gc$notif_event_attr_array;
  l_ca_obj gc$notif_corrective_action_job;
BEGIN
  INSERT INTO log_table VALUES ('notification_type: ' || s.msg_info.notification_type);
  INSERT INTO log_table VALUES ('repeat_count: ' || s.msg_info.repeat_count);
  INSERT INTO log_table VALUES ('ruleset_name: ' || s.msg_info.ruleset_name);
  INSERT INTO log_table VALUES ('rule_name: ' || s.msg_info.rule_name);
  INSERT INTO log_table VALUES ('rule_owner: ' || s.msg_info.rule_owner);
  INSERT INTO log_table VALUES ('message: ' || s.msg_info.message);
  INSERT INTO log_table VALUES ('message_url: ' || s.msg_info.message_url);
  INSERT INTO log_table VALUES ('event_instance_guid: ' || s.event_payload.event_instance_guid);
  INSERT INTO log_table VALUES ('event_type: ' || s.event_payload.event_type);
  INSERT INTO log_table VALUES ('event_name: ' || s.event_payload.event_name);
  INSERT INTO log_table VALUES ('event_msg: ' || s.event_payload.event_msg);
  INSERT INTO log_table VALUES ('source_obj_type: ' || s.event_payload.source.source_type);
  INSERT INTO log_table VALUES ('source_obj_name: ' || s.event_payload.source.source_name);
  INSERT INTO log_table VALUES ('source_obj_url: ' || s.event_payload.source.source_url);
  INSERT INTO log_table VALUES ('target_name: ' || s.event_payload.target.target_name);
  INSERT INTO log_table VALUES ('target_url: ' || s.event_payload.target.target_url);
  INSERT INTO log_table VALUES ('severity: ' || s.event_payload.severity);  INSERT INTO log_table VALUES ('severity_code: ' || s.event_payload.severity_code);
  INSERT INTO log_table VALUES ('event_reported_date: ' || to_char(s.event_payload.reported_date, 'D MON DD HH24:MI:SS'));

  l_categories := s.event_payload.categories;
  IF l_categories IS NOT NULL
  THEN
    FOR c IN 1..l_categories.COUNT
    LOOP
      INSERT INTO log_table VALUES ('category ' || c || ' - ' || l_categories(c));
    END LOOP;
  END IF;

  l_category_codes := s.event_payload.category_codes;
  IF l_categories IS NOT NULL
  THEN
    FOR c IN 1..l_category_codes.COUNT
    LOOP
      INSERT INTO log_table VALUES ('category_code ' || c || ' - ' || l_category_codes(c));
    END LOOP;
  END IF;

  l_attrs := s.event_payload.event_attrs;
  IF l_attrs IS NOT NULL
  THEN
    FOR c IN 1..l_attrs.COUNT
    LOOP
        INSERT INTO log_table VALUES ('EV.ATTR name=' || l_attrs(c).name || ' value=' || l_attrs(c).value || ' nls_value=' || l_attrs(c).nls_value);    END LOOP;
  END IF;

COMMIT ;
END ;
/

例6-11 表にイベントを記録するPL/SQLスクリプト

CREATE TABLE event_log (
  notification_type      VARCHAR2(32),
  repeat_count           NUMBER,
  ruleset_name           VARCHAR2(256),
  rule_owner             VARCHAR2(256),
  rule_name              VARCHAR2(256),
  message                VARCHAR2(4000),
  message_url            VARCHAR2(4000),
  event_instance_guid    RAW(16),
  event_type             VARCHAR2(20),
  event_name             VARCHAR2(512),
  event_msg              VARCHAR2(4000),
  categories             VARCHAR2(4000),
  source_obj_type        VARCHAR2(120),
  source_obj_name        VARCHAR2(256),
  source_obj_url         VARCHAR2(4000),
  severity               VARCHAR2(128),
  severity_code          VARCHAR2(32),
  target_name            VARCHAR2(256),
  target_type            VARCHAR2(128),
  target_url             VARCHAR2(4000),
  host_name              VARCHAR2(256),
  timezone               VARCHAR2(64),
  occured                DATE,
  ca_guid                RAW(16),
  ca_name                VARCHAR2(128),
  ca_owner               VARCHAR2(256),
  ca_type                VARCHAR2(256),
  ca_status              VARCHAR2(64),
  ca_status_code         NUMBER,
  ca_job_step_output     VARCHAR2(4000),
  ca_execution_guid      RAW(16),
  ca_stage_change_guid   RAW(16)
)
;

CREATE OR REPLACE PROCEDURE log_event(s IN GC$NOTIF_EVENT_MSG)
IS
   l_categories gc$category_string_array;
   l_ca_obj gc$notif_corrective_action_job;
   l_categories_new VARCHAR2(1000);
BEGIN
    -- save event categories
   l_categories := s.event_payload.categories;
        IF l_categories IS NOT NULL
   THEN
     FOR c IN 1..l_categories.COUNT
     LOOP
       l_categories_new := (l_categories_new|| c || ' - ' || l_categories(c)||',');
     END LOOP;
   END IF;

   -- save event message
   IF s.msg_info.notification_type = 'NOTIF_CA' AND s.event_payload.corrective_action IS NOT NULL
   THEN
     l_ca_obj := s.event_payload.corrective_action;
      INSERT INTO event_log (notification_type, repeat_count, ruleset_name, rule_name, rule_owner, message, message_url, event_instance_guid, event_type, event_name, event_msg, categories, source_obj_type, source_obj_name, source_obj_url, severity, severity_code, target_name, target_type, target_url, host_name, timezone, occured, ca_guid, ca_name, ca_owner, ca_type, ca_status, ca_status_code, ca_job_step_output, ca_execution_guid, ca_stage_change_guid)
      VALUES (s.msg_info.notification_type, s.msg_info.repeat_count, s.msg_info.ruleset_name, s.msg_info.rule_name,s.msg_info.rule_owner, s.msg_info.message, s.msg_info.message_url, s.event_payload.event_instance_guid, s.event_payload.event_type, s.event_payload.event_name, s.event_payload.event_msg, l_categories_new, s.event_payload.source.source_type, s.event_payload.source.source_name, s.event_payload.source.source_url, s.event_payload.severity, s.event_payload.severity_code, s.event_payload.target.target_name, s.event_payload.target.target_type, s.event_payload.target.target_url, s.event_payload.target.host_name, s.event_payload.target.target_timezone, s.event_payload.occurrence_date, l_ca_obj.JOB_GUID, l_ca_obj.JOB_NAME, l_ca_obj.JOB_OWNER, l_ca_obj.JOB_TYPE, l_ca_obj.JOB_STATUS, l_ca_obj.JOB_STATUS_CODE, l_ca_obj.JOB_STEP_OUTPUT, l_ca_obj.JOB_EXECUTION_GUID, l_ca_obj.JOB_STATE_CHANGE_GUID);   ELSE
      INSERT INTO event_log (notification_type, repeat_count, ruleset_name, rule_name, rule_owner, message, message_url, event_instance_guid, event_type, event_name, event_msg, categories, source_obj_type, source_obj_name, source_obj_url, severity, severity_code, target_name, target_type, target_url, host_name, timezone, occured, ca_guid, ca_name, ca_owner, ca_type, ca_status, ca_status_code, ca_job_step_output, ca_execution_guid, ca_stage_change_guid)
      VALUES (s.msg_info.notification_type, s.msg_info.repeat_count, s.msg_info.ruleset_name, s.msg_info.rule_name, s.msg_info.rule_owner, s.msg_info.message, s.msg_info.message_url, s.event_payload.event_instance_guid, s.event_payload.event_type, s.event_payload.event_name, s.event_payload.event_msg, l_categories_new, s.event_payload.source.source_type, s.event_payload.source.source_name, s.event_payload.source.source_url, s.event_payload.severity, s.event_payload.severity_code, s.event_payload.target.target_name, s.event_payload.target.target_type, s.event_payload.target.target_url, s.event_payload.target.host_name, s.event_payload.target.target_timezone, s.event_payload.occurrence_date, null,null,null,null,null,null,null,null,null);
   END IF;
   COMMIT;
END log_event;
/

例6-12 表にインシデントを記録するPL/SQLスクリプト

CREATE TABLE incident_log ( 
  notification_type      VARCHAR2(32), 
  repeat_count           NUMBER, 
  ruleset_name           VARCHAR2(256), 
  rule_owner             VARCHAR2(256), 
  rule_name              VARCHAR2(256), 
  message                VARCHAR2(4000), 
  message_url            VARCHAR2(4000), 
  incident_id            VARCHAR2(128), 
  ticket_url             VARCHAR2(4000), 
  assoc_event_cnt        NUMBER, 
  severity               VARCHAR2(128), 
  severity_code          VARCHAR2(32), 
  priority               VARCHAR2(128), 
  priority_code          VARCHAR2(32), 
  status                 VARCHAR2(32), 
  categories             VARCHAR2(1000), 
  target_name            VARCHAR2(256), 
  target_type            VARCHAR2(128), 
  host_name              VARCHAR2(256), 
  timezone               VARCHAR2(64), 
  occured                DATE 
) 
; 
   CREATE OR REPLACE PROCEDURE log_incident(s IN GC$NOTIF_INCIDENT_MSG) 
IS 
   l_src_info_array GC$NOTIF_SOURCE_INFO_ARRAY; 
   l_src_info  GC$NOTIF_SOURCE_INFO; 
   l_categories gc$category_string_array; 
   l_target_obj GC$NOTIF_TARGET; 
   l_target_name VARCHAR2(256); 
   l_target_type VARCHAR2(256); 
   l_target_timezone VARCHAR2(256); 
   l_hostname VARCHAR2(256); 
   l_categories_new VARCHAR2(1000); 
BEGIN 
     -- Save Incident categories 
  IF l_categories IS NOT NULL 
   THEN 
     FOR c IN 1..l_categories.COUNT 
     LOOP 
       l_categories_new := (l_categories_new|| c || ' - ' || l_categories(c)||','); 
     END LOOP; 
   END IF; 

   -- GET target info 
   l_src_info_array := s.incident_payload.incident_attrs.source_info_arr; 
   IF l_src_info_array IS NOT NULL 
   THEN 
     FOR I IN 1..l_src_info_array.COUNT 
     LOOP 
       IF l_src_info_array(I).TARGET IS NOT NULL 
       THEN 
         l_target_name := l_src_info_array(I).TARGET.TARGET_NAME; 
         l_target_type := l_src_info_array(I).TARGET.TARGET_TYPE; 
         l_target_timezone := l_src_info_array(I).TARGET.TARGET_TIMEZONE; 
         l_hostname := l_src_info_array(I).TARGET.HOST_NAME; 
      END IF; 
     END LOOP; 
   END IF; 

   -- save Incident notification message    INSERT INTO incident_log(notification_type, repeat_count, ruleset_name, rule_owner, rule_name, message, message_url, incident_id, ticket_url, assoc_event_cnt, severity, severity_code, priority, priority_code, status, categories, target_name, target_type, host_name, timezone, occured) 
   VALUES (s.msg_info.notification_type, s.msg_info.repeat_count, s.msg_info.ruleset_name, s.msg_info.rule_owner, s.msg_info.rule_name, s.msg_info.message, s.msg_info.message_url, s.incident_payload.incident_attrs.id, s.incident_payload.ticket_url, s.incident_payload.assoc_event_count, s.incident_payload.incident_attrs.severity, s.incident_payload.incident_attrs.severity_code, s.incident_payload.incident_attrs.priority, s.incident_payload.incident_attrs.priority_code, s.incident_payload.incident_attrs.STATUS, l_categories_new, l_target_name, l_target_type, l_hostname,l_target_timezone, s.incident_payload.incident_attrs.creation_date); 
   COMMIT; 
END log_incident; 
/

例6-13 表に問題を記録するPL/SQLスクリプト

CREATE TABLE problem_log ( 
  notification_type      VARCHAR2(32), 
  repeat_count           NUMBER, 
  ruleset_name           VARCHAR2(256), 
  rule_owner             VARCHAR2(256), 
  rule_name              VARCHAR2(256), 
  message                VARCHAR2(4000), 
  message_url            VARCHAR2(4000), 
  problem_key            VARCHAR2(850), 
  assoc_incident_cnt     NUMBER, 
  problem_id             NUMBER, 
  owner                  VARCHAR2(256), 
  severity               VARCHAR2(128), 
  severity_code          VARCHAR2(32), 
  priority               VARCHAR2(128), 
  priority_code          VARCHAR2(32), 
  status                 VARCHAR2(32), 
  categories             VARCHAR2(1000), 
  target_name            VARCHAR2(256), 
  target_type            VARCHAR2(128), 
  host_name              VARCHAR2(256),   timezone               VARCHAR2(64), 
  occured                DATE 
) 
; 
     CREATE OR REPLACE PROCEDURE log_problem(s IN GC$NOTIF_PROBLEM_MSG) 
IS 
   l_src_info_array GC$NOTIF_SOURCE_INFO_ARRAY; 
   l_src_info  GC$NOTIF_SOURCE_INFO; 
   l_categories gc$category_string_array; 
   l_target_obj GC$NOTIF_TARGET; 
   l_target_name VARCHAR2(256); 
   l_target_type VARCHAR2(256); 
   l_target_timezone VARCHAR2(256); 
   l_hostname VARCHAR2(256); 
   l_categories_new VARCHAR2(1000); 
BEGIN 
     -- Save Problem categories 
  l_categories := s.problem_payload.problem_attrs.categories; 
  IF l_categories IS NOT NULL 
   THEN 
     FOR c IN 1..l_categories.COUNT 
     LOOP 
       l_categories_new := (l_categories_new|| c || ' - ' || l_categories(c)||','); 
     END LOOP; 
   END IF; 

   -- GET target info 
   l_src_info_array := s.problem_payload.problem_attrs.source_info_arr; 
   IF l_src_info_array IS NOT NULL 
   THEN 
     FOR I IN 1..l_src_info_array.COUNT 
     LOOP 
       IF l_src_info_array(I).TARGET IS NOT NULL 
       THEN 
         l_target_name := l_src_info_array(I).TARGET.TARGET_NAME; 
         l_target_type := l_src_info_array(I).TARGET.TARGET_TYPE; 
         l_target_timezone := l_src_info_array(I).TARGET.TARGET_TIMEZONE; 
         l_hostname := l_src_info_array(I).TARGET.HOST_NAME; 
      END IF; 
     END LOOP; 
   END IF; 

  -- save Problem notification message 
   INSERT INTO problem_log(notification_type, repeat_count, ruleset_name, rule_owner, rule_name, message, message_url, problem_key, assoc_incident_cnt, problem_id, owner,  severity, severity_code, priority, priority_code, status, categories, target_name, target_type, host_name, timezone, occured) 
   VALUES (s.msg_info.notification_type, s.msg_info.repeat_count, s.msg_info.ruleset_name, s.msg_info.rule_owner, s.msg_info.rule_name, s.msg_info.message, s.msg_info.message_url, s.problem_payload.problem_key,            s.problem_payload.ASSOC_INCIDENT_COUNT, s.problem_payload.problem_attrs.id,            s.problem_payload.problem_attrs.owner, s.problem_payload.problem_attrs.severity,            s.problem_payload.problem_attrs.severity_code, s.problem_payload.problem_attrs.PRIORITY, s.problem_payload.problem_attrs.PRIORITY_CODE, s.problem_payload.problem_attrs.status, l_categories_new, l_target_name, l_target_type, l_hostname,l_target_timezone, s.problem_payload.problem_attrs.CREATION_DATE); 
   COMMIT; 
END log_problem; 
/

ステップ1: PL/SQLプロシージャの定義

受け取られる通知のタイプに応じて、プロシージャには次のうち1つのシグネチャを含める必要があります。

イベントの場合:

PROCEDURE event_proc(event_msg IN gc$notif_event_msg)

インシデントの場合:

PROCEDURE incident_proc(incident_msg IN gc$notif_incident_msg)

問題の場合:

PROCEDURE problem_proc(problem_msg IN gc$notif_problem_msg)

ノート:

ユーザーがインシデント・ルールの作成または編集時に通知メソッドを選択するには、スーパー管理者権限を持つ管理者が、PL/SQLプロシージャに基づく通知メソッドをあらかじめ構成しておく必要があります。

特定タイプの情報をスクリプトまたはPL/SQLプロシージャに渡す方法の詳細は、次の各項を参照してください。

PL/SQLプロシージャへの情報の受渡し

修正処理ステータス変更情報の受渡し

ジョブ実行ステータス情報の受渡し

ステップ2: 管理リポジトリ上でのPL/SQLプロシージャの作成

次の指定プロシージャの1つを使用して、リポジトリ・データベースでPL/SQLプロシージャを作成します。

PROCEDURE event_proc(event_msg IN gc$notif_event_msg)

PROCEDURE incident_proc(incident_msg IN gc$notif_incident_msg)

PROCEDURE problem_proc(problem_msg IN gc$notif_problem_msg)

PL/SQLプロシージャは、(SYSMANなどの)リポジトリ所有者のデータベース・アカウントを使用してリポジトリ・データベース上に作成する必要があります。

プロシージャの実行時にエラーが発生した場合、エラー・コード-20000を使用するユーザー定義例外を返すことによって、通知システムでプロシージャへの通知の送信を再試行できます。このプロシージャは、最初は1分後に再試行され、その後は2分後、3分後と、パージされるポイントである1日後までこの再試行が続行されます。

ステップ3: PL/SQLプロシージャを新規の通知メソッドとして登録

スーパー管理者としてログインします。「設定」メニューから、「通知」「通知メソッド」の順に選択して、通知メソッド・ページにアクセスします。このページから、PL/SQLプロシージャに基づく新規の通知を定義できます。「PL/SQLプロシージャを使用した通知の送信」を参照してください。

スキーマ所有者、パッケージ名およびプロシージャ名を含む完全修飾名を必ず使用してください。プロシージャはリポジトリ所有者によって実行されるため、リポジトリ所有者にプロシージャの実行権限があります。

PL/SQLプロシージャに基づく通知メソッドを作成します。メソッドの定義には次の情報が必要です。

  • 名前

  • 説明

  • PL/SQLプロシージャ

完全修飾プロシージャ名(OWNER.PKGNAME.PROCNAMEなど)を入力し、管理リポジトリの所有者がプロシージャの実行権限を持つようにする必要があります。

例6-9に、必要な情報の例を示します。

図6-1に、Enterprise Manager UIからPL/SQLベースの通知メソッドを追加する方法を示します。

図6-1 PL/SQLプロシージャの追加


PL/SQLプロシージャの追加

ステップ4: 通知メソッドのインシデント・ルールへの割当て。

既存のルールを編集(または新規のインシデント・ルールを作成)できます。「設定」メニューから、「インシデント」「インシデント・ルール」の順に選択します。インシデント・ルール・ページが表示されます。ここから、拡張通知メソッドに見つかった新しいPL/SQLプロシージャを指定するアクションをルールに追加できます。

Enterprise Manager環境には複数のPL/SQLベースのメソッドが構成されている場合があります。

インシデント、イベントおよび問題情報をPL/SQLプロシージャに渡す方法の詳細は、「PL/SQLプロシージャへの情報の受渡し」を参照してください。