Rem drv: Rem Rem $Header: emcore/source/oracle/sysman/emdrep/sql/core/latest/metric/metric_pkgbody.sql /st_emcore_10.2.0.4.2db11.2/1 2008/09/26 14:26:37 jsadras Exp $ Rem Rem metric_pkgbody.sql Rem Rem Copyright (c) 2004, 2008, Oracle and/or its affiliates. All rights reserved. Rem Rem NAME Rem metric_pkgbody.sql - Rem Rem DESCRIPTION Rem Rem Rem NOTES Rem Rem Rem MODIFIED (MM/DD/YY) Rem jsadras 09/23/08 - Bug:7426027, add dbms_assert calls Rem neearora 07/16/06 - Backport neearora_bug-5108394 from main Rem pmodi 04/27/06 - Bug:3900473 Use function to get default Rem retention window for metric data deletion Rem pmodi 07/07/06 - Backport pmodi_bug-3900473 from main Rem pmodi 12/09/05 - Backport jsadras_bug-4727968 from main Rem neearora 04/23/06 - Bug 5108394. Adding function Rem is_server_gen_alert_metric Rem jsadras 11/17/05 - handle dup_val_on_index on Rem mgmt_snapshot_metric_map Rem rpinnama 09/30/05 - Rem jsadras 09/12/05 - add keys_from_mult_colls Rem gan 09/07/05 - bug 4594233, 4595131 Rem rpinnama 09/01/05 - Add copy_metric Rem rpinnama 08/31/05 - Change the type_meta_ver default for Rem delete_metric Rem rpinnama 08/31/05 - Delete threshold, collection and violation data Rem on deleting metric Rem mfidanbo 08/29/05 - close all current severities after inserting the Rem information violation Rem rmarripa 08/18/05 - Rem pmodi 08/04/05 - Bug:4525814 - Exclude partioned tables while Rem deleting metric data Rem mfidanbo 08/02/05 - dont delete sev history and composite keys Rem gan 07/18/05 - add metric metadata callback Rem jsadras 05/09/05 - Bug:4321899 Rem rkpandey 06/20/05 - Moved upsert_metric to EM_REGISTRY Rem gsbhatia 07/01/05 - New repmgr header impl Rem pmodi 06/17/05 - Using EM_CHECK for exec call and Correcting Rem comments Rem pmodi 06/09/05 - Bug:4406767 - Changing call back singnature Rem rpinnama 05/17/05 - Support is_renderable column in mgmt_metrics Rem rpinnama 05/27/05 - Fix 4399189 : Get more attributes for metric Rem jsadras 05/02/05 - is long running support Rem jsadras 05/09/05 - Bug:4321899 Rem pmodi 04/19/05 - upsert_metric added Rem pmodi 04/06/05 - API for remove key value Rem rpinnama 03/03/05 - Make the column label default NULL Rem rpinnama 02/25/05 - Bug 3924067: Add non_thresholded_alerts and Rem keyonly_thresholds columns Rem rpinnama 02/11/05 - Fix 4164974: Handle the duplicate metric additions Rem rpinnama 01/10/05 - Add trace statements in tgttype callback Rem rpinnama 01/06/05 - Procedures to handle mgmt_metric_versions Rem rpinnama 01/06/05 - Add target type addition callback Rem jsadras 12/10/04 - store_metric Rem jsadras 10/19/04 - metric_timing Rem gan 09/14/04 - add remote parameter Rem rpinnama 08/30/04 - Add get_key_columns() function Rem rpinnama 08/19/04 - Add has_push, has_pull attributes Rem rpinnama 08/18/04 - Add is_test_metric Rem rpinnama 08/12/04 - Add update_* API Rem rpinnama 08/05/04 - Populate eval_func Rem rpinnama 08/03/04 - Add category class and category API Rem rpinnama 07/28/04 - Rem rpinnama 07/26/04 - rpinnama_add_policy_api Rem rpinnama 07/23/04 - Created Rem CREATE OR REPLACE PACKAGE BODY em_metric AS PROCEDURE add_metric_row( p_metric_guid IN RAW, p_target_type IN VARCHAR2, p_metric_name IN VARCHAR2, p_metric_column IN VARCHAR2 DEFAULT ' ', p_type_meta_ver IN VARCHAR2 DEFAULT '1.0', p_category_prop_1 IN VARCHAR2 DEFAULT ' ', p_category_prop_2 IN VARCHAR2 DEFAULT ' ', p_category_prop_3 IN VARCHAR2 DEFAULT ' ', p_category_prop_4 IN VARCHAR2 DEFAULT ' ', p_category_prop_5 IN VARCHAR2 DEFAULT ' ', p_metric_type IN NUMBER DEFAULT 0, p_usage_type IN NUMBER DEFAULT 0, p_metric_label IN VARCHAR2 DEFAULT NULL, p_metric_label_nlsid IN VARCHAR2 DEFAULT NULL, p_column_label IN VARCHAR2 DEFAULT NULL, p_column_label_nlsid IN VARCHAR2 DEFAULT NULL, p_key_column IN VARCHAR2 DEFAULT NULL, p_key_order IN NUMBER DEFAULT 0, p_num_keys IN NUMBER DEFAULT 0, p_description IN VARCHAR2 DEFAULT ' ', p_description_nlsid IN VARCHAR2 DEFAULT NULL, p_unit IN VARCHAR2 DEFAULT ' ', p_unit_nlsid IN VARCHAR2 DEFAULT NULL, p_short_name IN VARCHAR2 DEFAULT NULL, p_short_name_nlsid IN VARCHAR2 DEFAULT NULL, p_is_for_summary IN NUMBER DEFAULT 0, p_keys_from_mult_colls IN NUMBER DEFAULT 0, p_statefull IN NUMBER DEFAULT 1, p_is_repository IN NUMBER DEFAULT 0, p_author IN VARCHAR2 DEFAULT 'ORACLE', p_source_type IN NUMBER DEFAULT NULL, p_source IN VARCHAR2 DEFAULT NULL, p_is_transposed IN NUMBER DEFAULT 0, p_is_test_metric IN NUMBER DEFAULT 0, p_has_push IN NUMBER DEFAULT 0, p_has_pull IN NUMBER DEFAULT 0, p_remote IN NUMBER DEFAULT 0, p_non_thresholded_alerts IN NUMBER DEFAULT 0, p_keyonly_thresholds IN NUMBER DEFAULT 0, p_is_long_running IN NUMBER DEFAULT 0, p_is_renderable IN NUMBER DEFAULT 1) IS BEGIN INSERT INTO MGMT_METRICS (metric_guid, target_type, metric_name, metric_column, type_meta_ver, category_prop_1, category_prop_2, category_prop_3, category_prop_4, category_prop_5, metric_type, usage_type, key_column, key_order, num_keys, column_label, column_label_nlsid, metric_label, metric_label_nlsid, description, description_nlsid, unit, unit_nlsid, short_name, short_name_nlsid, is_for_summary, keys_from_mult_colls, statefull, is_repository, author, source_type, source, eval_func, is_transposed, is_test_metric, has_push, has_pull, remote, non_thresholded_alerts, keyonly_thresholds, is_long_running, is_renderable) VALUES (p_metric_guid, p_target_type, p_metric_name, p_metric_column, p_type_meta_ver, p_category_prop_1, p_category_prop_2, p_category_prop_3, p_category_prop_4, p_category_prop_5, p_metric_type, p_usage_type, p_key_column, p_key_order, p_num_keys, p_column_label, p_column_label_nlsid, p_metric_label, p_metric_label_nlsid, p_description, p_description_nlsid, p_unit, p_unit_nlsid, p_short_name, p_short_name_nlsid, p_is_for_summary, p_keys_from_mult_colls, p_statefull, p_is_repository, p_author, p_source_type, p_source, SUBSTR(p_source, 1, 255), p_is_transposed, p_is_test_metric, p_has_push, p_has_pull, p_remote, p_non_thresholded_alerts, p_keyonly_thresholds, p_is_long_running, p_is_renderable); END add_metric_row; PROCEDURE update_metric_row( p_metric_guid IN RAW, p_target_type IN VARCHAR2, p_metric_name IN VARCHAR2, p_metric_column IN VARCHAR2 DEFAULT ' ', p_type_meta_ver IN VARCHAR2 DEFAULT '1.0', p_category_prop_1 IN VARCHAR2 DEFAULT ' ', p_category_prop_2 IN VARCHAR2 DEFAULT ' ', p_category_prop_3 IN VARCHAR2 DEFAULT ' ', p_category_prop_4 IN VARCHAR2 DEFAULT ' ', p_category_prop_5 IN VARCHAR2 DEFAULT ' ', p_metric_type IN NUMBER DEFAULT NULL, p_usage_type IN NUMBER DEFAULT NULL, p_metric_label IN VARCHAR2 DEFAULT NULL, p_metric_label_nlsid IN VARCHAR2 DEFAULT NULL, p_column_label IN VARCHAR2 DEFAULT NULL, p_column_label_nlsid IN VARCHAR2 DEFAULT NULL, p_key_column IN VARCHAR2 DEFAULT NULL, p_key_order IN NUMBER DEFAULT NULL, p_num_keys IN NUMBER DEFAULT NULL, p_description IN VARCHAR2 DEFAULT NULL, p_description_nlsid IN VARCHAR2 DEFAULT NULL, p_unit IN VARCHAR2 DEFAULT NULL, p_unit_nlsid IN VARCHAR2 DEFAULT NULL, p_short_name IN VARCHAR2 DEFAULT NULL, p_short_name_nlsid IN VARCHAR2 DEFAULT NULL, p_is_for_summary IN NUMBER DEFAULT NULL, p_keys_from_mult_colls IN NUMBER DEFAULT NULL, p_statefull IN NUMBER DEFAULT NULL, p_is_repository IN NUMBER DEFAULT NULL, p_author IN VARCHAR2 DEFAULT NULL, p_source_type IN NUMBER DEFAULT NULL, p_source IN VARCHAR2 DEFAULT NULL, p_is_transposed IN NUMBER DEFAULT NULL, p_is_test_metric IN NUMBER DEFAULT NULL, p_has_push IN NUMBER DEFAULT NULL, p_has_pull IN NUMBER DEFAULT NULL, p_remote IN NUMBER DEFAULT NULL, p_non_thresholded_alerts IN NUMBER DEFAULT NULL, p_keyonly_thresholds IN NUMBER DEFAULT NULL, p_is_long_running IN NUMBER DEFAULT NULL, p_is_renderable IN NUMBER DEFAULT NULL) IS BEGIN UPDATE MGMT_METRICS SET metric_type = NVL(p_metric_type, metric_type), usage_type = NVL(p_usage_type, usage_type), metric_label = NVL(p_metric_label, metric_label), metric_label_nlsid = NVL(p_metric_label_nlsid, metric_label_nlsid), column_label = NVL(p_column_label, column_label), column_label_nlsid = NVL(p_column_label_nlsid, column_label_nlsid), key_order = NVL(p_key_order, key_order), num_keys = NVL(p_num_keys, num_keys), description = NVL(p_description, description), description_nlsid = NVL(p_description_nlsid, description_nlsid), unit = NVL(p_unit, unit), unit_nlsid = NVL(p_unit_nlsid, unit_nlsid), short_name = NVL(p_short_name, short_name), short_name_nlsid = NVL(p_short_name_nlsid, short_name_nlsid), is_repository = NVL(p_is_repository, is_repository), author = NVL(p_author, author), source_type = NVL(p_source_type, source_type), source = NVL(p_source, source), keys_from_mult_colls = NVL(p_keys_from_mult_colls, keys_from_mult_colls), is_for_summary = NVL(p_is_for_summary, is_for_summary), statefull = NVL(p_statefull, statefull), is_transposed = NVL(p_is_transposed, is_transposed), is_test_metric = NVL(p_is_test_metric, is_test_metric), has_push = NVL(p_has_push, has_push), has_pull = NVL(p_has_pull, has_pull), remote = NVL(p_remote, remote), non_thresholded_alerts = NVL(p_non_thresholded_alerts, non_thresholded_alerts), keyonly_thresholds = NVL(p_keyonly_thresholds, keyonly_thresholds), is_long_running = NVL(p_is_long_running, is_long_running), is_renderable = NVL(p_is_renderable, is_renderable) WHERE target_type = p_target_type AND metric_name = p_metric_name AND metric_column = p_metric_column AND type_meta_ver = p_type_meta_ver AND category_prop_1 = p_category_prop_1 AND category_prop_2 = p_category_prop_2 AND category_prop_3 = p_category_prop_3 AND category_prop_4 = p_category_prop_4 AND category_prop_5 = p_category_prop_5; END update_metric_row; PROCEDURE remove_metric_row( p_metric_guid IN RAW, p_type_meta_ver IN VARCHAR2 DEFAULT NULL) IS BEGIN DELETE FROM mgmt_metrics WHERE metric_guid = p_metric_guid AND type_meta_ver = NVL(p_type_meta_ver, type_meta_ver); END remove_metric_row; -- Internal procedure to expand the boundaries (start and end) -- for metric versioning. If the new start is lower than the old start -- then the start value will be decreased. If the new end is higher than -- the old end, then the end will be increased. PROCEDURE expand_metric_version_row( p_target_type IN VARCHAR2, p_metric_name IN VARCHAR2, p_start_type_meta_ver IN VARCHAR2 DEFAULT '1.0', p_end_type_meta_ver IN VARCHAR2 DEFAULT NULL) IS l_min_ver mgmt_metric_versions.start_type_meta_ver%type; l_max_ver mgmt_metric_versions.end_type_meta_ver%type; BEGIN SELECT start_type_meta_ver, end_type_meta_ver INTO l_min_ver, l_max_ver FROM mgmt_metric_versions WHERE target_type = p_target_type AND metric_name = p_metric_name; IF (l_min_ver IS NOT NULL AND em_target.compare_type_meta_vers(p_start_type_meta_ver, l_min_ver)<0) THEN l_min_ver := p_start_type_meta_ver; END IF; IF (l_max_ver IS NOT NULL AND em_target.compare_type_meta_vers(l_max_ver, p_end_type_meta_ver)<0) THEN l_max_ver := p_end_type_meta_ver; END IF; update_metric_version_row(p_target_type, p_metric_name, l_min_ver, l_max_ver); END expand_metric_version_row; -- Adds a row to the metric versions table (MGMT_METRIC_VERSIONS) -- The default values used here are the defaults specified for the table PROCEDURE add_metric_version_row( p_target_type IN VARCHAR2, p_metric_name IN VARCHAR2, p_start_type_meta_ver IN VARCHAR2 DEFAULT '1.0', p_end_type_meta_ver IN VARCHAR2 DEFAULT NULL) IS BEGIN INSERT INTO mgmt_metric_versions (target_type, metric_name, start_type_meta_ver, end_type_meta_ver) VALUES (p_target_type, p_metric_name, p_start_type_meta_ver, p_end_type_meta_ver); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN BEGIN expand_metric_version_row(p_target_type, p_metric_name, p_start_type_meta_ver, p_end_type_meta_ver); END; END add_metric_version_row; PROCEDURE update_metric_version_row( p_target_type IN VARCHAR2, p_metric_name IN VARCHAR2, p_start_type_meta_ver IN VARCHAR2 DEFAULT NULL, p_end_type_meta_ver IN VARCHAR2 DEFAULT NULL) IS BEGIN UPDATE mgmt_metric_versions SET start_type_meta_ver = NVL(p_start_type_meta_ver, start_type_meta_ver), end_type_meta_ver = NVL(p_end_type_meta_ver, end_type_meta_ver) WHERE target_type = p_target_type AND metric_name = p_metric_name; END update_metric_version_row; -- Deletes a row in the metric versions table (MGMT_METRIC_VERSIONS) -- Deletes using the primary key target type, metric name PROCEDURE remove_metric_version_row( p_target_type IN VARCHAR2, p_metric_name IN VARCHAR2) IS BEGIN DELETE FROM mgmt_metric_versions WHERE target_type = p_target_type AND metric_name = p_metric_name; END remove_metric_version_row; PROCEDURE get_metric_info(p_metric_guid IN RAW, p_metric_info OUT NOCOPY METRIC_INFO_REC ) IS l_proc_name CONSTANT VARCHAR2(30) := 'get_metric_info' ; BEGIN IF EMDW_LOG.P_IS_INFO_SET THEN EMDW_LOG.INFO(l_proc_name||'Enter ', G_MODULE_NAME) ; END IF ; p_metric_info.key_cols := mgmt_short_string_array() ; p_metric_info.metric_cols := mgmt_namevalue_array() ; FOR metric_rec IN ( SELECT DISTINCT m.metric_guid, m.metric_type, m.metric_name, m.num_keys, m.is_repository, m.is_transposed, m.source_type, m.key_order, m.metric_column,keys_from_mult_colls FROM MGMT_METRICS m WHERE (target_type,m.metric_name,type_meta_ver) = (SELECT target_type,metric_name,MAX(type_meta_ver) FROM mgmt_metrics WHERE metric_guid = p_metric_guid GROUP BY target_type,metric_name ) ORDER BY decode(metric_column,' ',1,2), decode(key_order,0,1,0) , key_order, metric_column) LOOP IF metric_rec.metric_column = ' ' THEN p_metric_info.metric_name := metric_rec.metric_name ; p_metric_info.metric_guid := metric_rec.metric_guid ; p_metric_info.num_keys := metric_rec.num_keys ; p_metric_info.metric_type := metric_rec.metric_type ; p_metric_info.is_repository := metric_rec.is_repository ; p_metric_info.is_transposed := metric_rec.is_transposed ; p_metric_info.source_type := metric_rec.source_type; p_metric_info.keys_from_mult_colls := metric_rec.keys_from_mult_colls ; ELSE p_metric_info.metric_cols.extend(1) ; p_metric_info.metric_cols(p_metric_info.metric_cols.count) := mgmt_namevalue_obj.new( metric_rec.metric_column, metric_rec.metric_type) ; IF metric_rec.key_order > 0 THEN p_metric_info.key_cols.extend(1) ; p_metric_info.key_cols(p_metric_info.key_cols.count) := metric_rec.metric_column ; END IF; END IF; END LOOP; END get_metric_info; PROCEDURE get_metric_info_for_target( p_metric_guid IN RAW, p_target_guid IN RAW, p_metric_info OUT NOCOPY METRIC_INFO_REC) IS l_proc_name CONSTANT VARCHAR2(30) := 'get_metric_info_for_target' ; BEGIN IF EMDW_LOG.P_IS_INFO_SET THEN EMDW_LOG.INFO(l_proc_name||'Enter ' || ' target_guid =[' || p_target_guid || ']' || ' metric_guid =[' || p_metric_guid || ']', G_MODULE_NAME) ; END IF ; p_metric_info.key_cols := mgmt_short_string_array() ; p_metric_info.metric_cols := mgmt_namevalue_array() ; FOR metric_rec IN ( SELECT m.metric_guid, m.metric_type, m.metric_name, m.num_keys, m.is_repository, m.is_transposed, m.source_type, m.key_order, m.metric_column,m.keys_from_mult_colls FROM MGMT_METRICS m, mgmt_targets t WHERE m.metric_name = (SELECT distinct(metric_name) FROM mgmt_metrics WHERE metric_guid = p_metric_guid) AND t.target_guid = p_target_guid AND m.target_type = t.target_type AND m.type_meta_ver = t.type_meta_ver AND (m.category_prop_1 = t.category_prop_1 OR m.category_prop_1 = ' ') AND (m.category_prop_2 = t.category_prop_2 OR m.category_prop_2 = ' ') AND (m.category_prop_3 = t.category_prop_3 OR m.category_prop_3 = ' ') AND (m.category_prop_4 = t.category_prop_4 OR m.category_prop_4 = ' ') AND (m.category_prop_5 = t.category_prop_5 OR m.category_prop_5 = ' ') ORDER BY decode(metric_column,' ',1,2), decode(key_order,0,1,0) , key_order, metric_column) LOOP IF metric_rec.metric_column = ' ' THEN p_metric_info.metric_name := metric_rec.metric_name ; p_metric_info.metric_guid := metric_rec.metric_guid ; p_metric_info.num_keys := metric_rec.num_keys ; p_metric_info.metric_type := metric_rec.metric_type ; p_metric_info.is_repository := metric_rec.is_repository ; p_metric_info.is_transposed := metric_rec.is_transposed ; p_metric_info.source_type := metric_rec.source_type; p_metric_info.keys_from_mult_colls := metric_rec.keys_from_mult_colls ; ELSE p_metric_info.metric_cols.extend(1) ; p_metric_info.metric_cols(p_metric_info.metric_cols.count) := mgmt_namevalue_obj.new( metric_rec.metric_column,metric_rec.metric_type) ; IF metric_rec.key_order > 0 THEN p_metric_info.key_cols.extend(1) ; p_metric_info.key_cols(p_metric_info.key_cols.count) := metric_rec.metric_column ; END IF; END IF; END LOOP; IF EMDW_LOG.P_IS_INFO_SET THEN EMDW_LOG.INFO(l_proc_name||' Exit ' || ' target_guid =[' || p_target_guid || ']' || ' metric_guid =[' || p_metric_guid || ']' || ' metric name =[' || p_metric_info.metric_name || ']' || ' metric type =[' || p_metric_info.metric_type || ']' || ' num keys =[' || p_metric_info.num_keys || ']', G_MODULE_NAME) ; END IF ; END get_metric_info_for_target; PROCEDURE add_category_class( p_class_name IN VARCHAR2, p_class_name_nlsid IN VARCHAR2 DEFAULT NULL) IS BEGIN UPDATE mgmt_category_classes SET class_name_nlsid = p_class_name_nlsid WHERE class_name = p_class_name; IF (SQL%ROWCOUNT = 0) THEN INSERT INTO mgmt_category_classes (class_name, class_name_nlsid) VALUES (p_class_name, p_class_name_nlsid); END IF; END add_category_class; PROCEDURE remove_category_class( p_class_name IN VARCHAR2) IS BEGIN DELETE FROM mgmt_category_classes WHERE class_name = p_class_name; END remove_category_class; PROCEDURE add_category( p_class_name IN VARCHAR2, p_category_name IN VARCHAR2, p_category_name_nlsid IN VARCHAR2 DEFAULT NULL) IS BEGIN UPDATE mgmt_categories SET category_name_nlsid = p_category_name_nlsid WHERE class_name = p_class_name AND category_name = p_category_name; IF (SQL%ROWCOUNT = 0) THEN INSERT INTO mgmt_categories (class_name, category_name, category_name_nlsid) VALUES (p_class_name, p_category_name, p_category_name_nlsid); END IF; END add_category; PROCEDURE add_categories( p_class_name IN VARCHAR2, p_category_def_list IN MGMT_CATEGORY_DEF_ARRAY DEFAULT NULL) IS BEGIN IF ( (p_category_def_list IS NOT NULL) AND (p_category_def_list.COUNT > 0) ) THEN FOR i IN p_category_def_list.FIRST..p_category_def_list.LAST LOOP add_category(p_class_name, p_category_def_list(i).category_name, p_category_def_list(i).category_name_nlsid); END LOOP; END IF; END add_categories; PROCEDURE remove_category( p_class_name IN VARCHAR2, p_category_name IN VARCHAR2 DEFAULT NULL) IS BEGIN DELETE FROM mgmt_categories WHERE class_name = p_class_name AND category_name = NVL(p_category_name, category_name); END remove_category; PROCEDURE add_object_category( p_object_guid IN RAW, p_object_type IN NUMBER, p_target_type IN VARCHAR2 DEFAULT NULL, p_type_meta_ver IN VARCHAR2 DEFAULT '1.0', p_category_class IN VARCHAR2 DEFAULT NULL, p_category_name IN VARCHAR2 DEFAULT NULL) IS BEGIN UPDATE mgmt_category_map SET category_name = p_category_name WHERE target_type = p_target_type AND type_meta_ver = p_type_meta_ver AND object_guid = p_object_guid AND class_name = p_category_class; IF (SQL%ROWCOUNT = 0) THEN INSERT INTO mgmt_category_map (target_type, type_meta_ver, object_type, object_guid, class_name, category_name) VALUES (p_target_type, p_type_meta_ver, p_object_type, p_object_guid, p_category_class, p_category_name); END IF; END add_object_category; PROCEDURE add_object_categories( p_object_guid IN RAW, p_object_type IN NUMBER, p_target_type IN VARCHAR2 DEFAULT NULL, p_type_meta_ver IN VARCHAR2 DEFAULT '1.0', p_category_list IN MGMT_CATEGORY_ARRAY DEFAULT NULL) IS BEGIN IF ( (p_category_list IS NOT NULL) AND (p_category_list.COUNT > 0)) THEN FOR i IN p_category_list.FIRST..p_category_list.LAST LOOP add_object_category(p_object_guid, p_object_type, p_target_type, p_type_meta_ver, p_category_list(i).class_name, p_category_list(i).category_name); END LOOP; END IF; END add_object_categories; PROCEDURE remove_object_category( p_object_guid IN RAW, p_object_type IN NUMBER, p_target_type IN VARCHAR2 DEFAULT NULL, p_type_meta_ver IN VARCHAR2 DEFAULT '1.0', p_category_class IN VARCHAR2 DEFAULT NULL) IS BEGIN DELETE FROM mgmt_category_map WHERE target_type = p_target_type AND type_meta_ver = p_type_meta_ver AND object_guid = p_object_guid AND class_name = p_category_class; END remove_object_category; PROCEDURE remove_object_categories( p_object_guid IN RAW, p_object_type IN NUMBER, p_target_type IN VARCHAR2 DEFAULT NULL, p_type_meta_ver IN VARCHAR2 DEFAULT '1.0', p_category_list IN MGMT_CATEGORY_ARRAY DEFAULT NULL) IS BEGIN IF ( (p_category_list IS NOT NULL) AND (p_category_list.COUNT > 0)) THEN FOR i IN p_category_list.FIRST..p_category_list.LAST LOOP remove_object_category(p_object_guid, p_object_type, p_target_type, p_type_meta_ver, p_category_list(i).class_name); END LOOP; ELSE -- Delete all categorization details DELETE FROM mgmt_category_map WHERE target_type = p_target_type AND type_meta_ver = p_type_meta_ver AND object_guid = p_object_guid; END IF; END remove_object_categories; -- Metric-Snapshot Map PROCEDURE add_metric_snapshot_assoc( p_metric_guid IN RAW, p_snapshot_target_type IN VARCHAR2, p_snapshot_name IN VARCHAR2, p_store_metric IN NUMBER DEFAULT MGMT_GLOBAL.G_FALSE ) IS l_store_metric NUMBER ; BEGIN -- any non-zero value for p_store_metric is TRUE IF p_store_metric = 0 THEN l_store_metric := 0 ; ELSE l_store_metric := 1 ; END IF ; INSERT INTO mgmt_snapshot_metric_map (snapshot_target_type, snapshot_name, metric_guid,store_metric) VALUES (p_snapshot_target_type, p_snapshot_name, p_metric_guid,l_store_metric); END add_metric_snapshot_assoc; PROCEDURE add_metric_snapshot_assoc( p_metric_guid IN RAW, p_snapshot IN MGMT_SNAPSHOT_OBJ) IS BEGIN add_metric_snapshot_assoc(p_metric_guid, p_snapshot.target_type, p_snapshot.snapshot_name, p_snapshot.store_metric); END add_metric_snapshot_assoc; PROCEDURE add_metric_snapshot_assocs( p_metric_guid IN RAW, p_snapshot_name_list IN MGMT_SNAPSHOT_ARRAY) IS BEGIN IF ( (p_snapshot_name_list IS NOT NULL) AND (p_snapshot_name_list.COUNT > 0) ) THEN FOR snap_ctr IN p_snapshot_name_list.FIRST..p_snapshot_name_list.LAST LOOP BEGIN add_metric_snapshot_assoc(p_metric_guid, p_snapshot_name_list(snap_ctr)); EXCEPTION -- Ignore duplicate metrics in snapshot WHEN DUP_VAL_ON_INDEX THEN NULL ; END ; END LOOP; END IF; END add_metric_snapshot_assocs; PROCEDURE remove_metric_snapshot_assoc( p_metric_guid IN RAW, p_snapshot_target_type IN VARCHAR2, p_snapshot_name IN VARCHAR2) IS BEGIN DELETE FROM mgmt_snapshot_metric_map WHERE metric_guid = p_metric_guid AND snapshot_target_type = p_snapshot_target_type AND snapshot_name = p_snapshot_name; END remove_metric_snapshot_assoc; PROCEDURE remove_metric_snapshot_assocs( p_metric_guid IN RAW, p_snapshot_name_list IN MGMT_SNAPSHOT_ARRAY DEFAULT NULL) IS l_snapshot MGMT_SNAPSHOT_OBJ; BEGIN IF ( (p_snapshot_name_list IS NOT NULL) AND (p_snapshot_name_list.COUNT > 0) ) THEN FOR snap_ctr IN p_snapshot_name_list.FIRST..p_snapshot_name_list.LAST LOOP l_snapshot := p_snapshot_name_list(snap_ctr); remove_metric_snapshot_assoc(p_metric_guid, l_snapshot.target_type, l_snapshot.snapshot_name); END LOOP; ELSE DELETE FROM mgmt_snapshot_metric_map WHERE metric_guid = p_metric_guid; END IF; END remove_metric_snapshot_assocs; PROCEDURE delete_metric_data(p_target_type IN VARCHAR2, p_metric_name IN VARCHAR2, p_type_meta_ver IN VARCHAR2 DEFAULT NULL) IS l_metric_guid mgmt_metrics.metric_guid%TYPE; l_metric_guid_list MGMT_TARGET_GUID_ARRAY; l_proc_name CONSTANT VARCHAR2(30) := 'delete_metric_data' ; l_delete_stmt VARCHAR2(4000); l_counter INTEGER :=0; BEGIN --TO DO : Implement delete metric exception table to exclude tables -- for deletion of metric data. IF EMDW_LOG.P_IS_DEBUG_SET THEN EMDW_LOG.DEBUG(l_proc_name || ' Enter ttype = ' || p_target_type || ' (metric_name = ' || p_metric_name || ')' || ' (meta_ver = ' || p_type_meta_ver || ')', G_MODULE_NAME) ; END IF ; -- Get the list of metric guids SELECT DISTINCT metric_guid BULK COLLECT INTO l_metric_guid_list FROM mgmt_metrics WHERE target_type = p_target_type AND metric_name = p_metric_name AND type_meta_ver = NVL(p_type_meta_ver, type_meta_ver); IF EMDW_LOG.P_IS_DEBUG_SET THEN EMDW_LOG.DEBUG(l_proc_name || ' Metric guid list COUNT ' || l_metric_guid_list.COUNT, G_MODULE_NAME) ; END IF ; -- Delete target metric thresholds FOR assoc_rec IN (SELECT object_guid, object_type, policy_guid FROM mgmt_policy_assoc WHERE object_guid IN (SELECT target_guid FROM MGMT_TARGETS WHERE target_type = p_target_type AND type_meta_ver = NVL(p_type_meta_ver, type_meta_ver)) AND policy_guid IN (SELECT * FROM TABLE(CAST(l_metric_guid_list AS MGMT_TARGET_GUID_ARRAY))) AND object_type = MGMT_GLOBAL.G_OBJECT_TYPE_TARGET ORDER BY object_guid, policy_guid) LOOP -- Remove object-policy associations, and decrement ctr for any CA assoc. EM_POLICY.remove_object_policy_assoc( p_object_guid => assoc_rec.object_guid, p_policy_guid => assoc_rec.policy_guid, p_coll_name => NULL, -- Remove all collections p_remove_ca_assoc => MGMT_GLOBAL.G_TRUE); -- Remove policy eval details IF (assoc_rec.object_type = MGMT_GLOBAL.G_OBJECT_TYPE_TARGET) THEN EM_POLICY.remove_policy_eval_details( p_target_guid => assoc_rec.object_guid, p_policy_guid => assoc_rec.policy_guid); END IF; END LOOP; IF EMDW_LOG.P_IS_DEBUG_SET THEN EMDW_LOG.DEBUG(l_proc_name || ' Removed associations ', G_MODULE_NAME) ; END IF ; -- Get all tables that have both target_guid and metric_guid/policy_guid FOR crec IN ( SELECT o.name table_name, tgc.name target_column_name, mgc.name metric_column_name FROM sys.obj$ o, sys.tab$ t, sys.col$ tgc, sys.col$ mgc WHERE o.owner# = userenv('SCHEMAID') AND tgc.name like ('%TARGET_GUID%') AND tgc.obj# = o.obj# AND ( mgc.name like ('%METRIC_GUID%') OR mgc.name like ('%POLICY_GUID%') ) AND o.name NOT IN ('MGMT_METRICS_RAW', 'MGMT_METRICS_1HOUR', 'MGMT_METRICS_1DAY' ) AND mgc.obj# = o.obj# AND o.name like ('MGMT_%') AND o.obj# = t.obj# AND bitand(t.property, 1) = 0 AND bitand(tgc.property,32) = 0 AND bitand(tgc.property,512) = 0 AND bitand(mgc.property,32) = 0 AND bitand(mgc.property,512) = 0 ORDER BY o.name) LOOP l_delete_stmt := 'DELETE FROM ' || DBMS_ASSERT.ENQUOTE_NAME(crec.table_name,FALSE) || ' WHERE ' || DBMS_ASSERT.ENQUOTE_NAME(crec.target_column_name,FALSE) || ' IN (SELECT target_guid FROM MGMT_TARGETS WHERE target_type = :1 AND type_meta_ver = NVL(:2, type_meta_ver)) ' || ' AND ' || DBMS_ASSERT.ENQUOTE_NAME(crec.metric_column_name,FALSE) || ' IN (SELECT DISTINCT metric_guid FROM MGMT_METRICS WHERE target_type = :3 AND metric_name = :4 AND type_meta_ver = NVL(:5, type_meta_ver)) AND ROWNUM <= ' || mgmt_global.MAX_COMMIT; IF EMDW_LOG.P_IS_INFO_SET THEN EMDW_LOG.INFO(l_proc_name||' SQL ' || l_delete_stmt, G_MODULE_NAME) ; END IF ; LOOP EXECUTE IMMEDIATE l_delete_stmt USING p_target_type, p_type_meta_ver, p_target_type, p_metric_name, p_type_meta_ver; l_counter := SQL%ROWCOUNT; COMMIT; IF l_counter < mgmt_global.MAX_COMMIT THEN EXIT; END IF; END LOOP; END LOOP; IF EMDW_LOG.P_IS_DEBUG_SET THEN EMDW_LOG.DEBUG(l_proc_name || ' Exit ttype = ' || p_target_type || ' (metric_name = ' || p_metric_name || ')' || ' (meta_ver = ' || p_type_meta_ver || ')', G_MODULE_NAME) ; END IF ; END delete_metric_data; PROCEDURE copy_metric(p_target_type IN VARCHAR2, p_metric_name IN VARCHAR2, p_from_type_meta_ver IN VARCHAR2, p_to_type_meta_ver IN VARCHAR2) IS l_proc_name CONSTANT VARCHAR2(64) := 'em_metric.copy_metric ' ; BEGIN IF EMDW_LOG.P_IS_INFO_SET THEN EMDW_LOG.INFO(l_proc_name||' Copying metric ' || p_metric_name || ' to version ' || p_to_type_meta_ver, G_MODULE_NAME) ; END IF ; -- NOTE: -- Cannot use INSERT INTO SELECT FROM as it is raising a 4091 mutating table error on -- mgmt_metrics table. FOR met_rec IN (SELECT metric_guid, target_type, metric_name, metric_column, p_to_type_meta_ver, category_prop_1, category_prop_2, category_prop_3, category_prop_4, category_prop_5, metric_type, usage_type, metric_label, metric_label_nlsid, column_label, column_label_nlsid, key_column, key_order, num_keys, description, description_nlsid, unit, unit_nlsid, short_name, short_name_nlsid, is_for_summary, keys_from_mult_colls, statefull, is_repository, author, source_type, source, eval_func, is_transposed, is_test_metric, has_push, has_pull, remote, non_thresholded_alerts, keyonly_thresholds, is_long_running, is_renderable FROM mgmt_metrics WHERE target_type = p_target_type AND metric_name = p_metric_name AND type_meta_ver = p_from_type_meta_ver ORDER BY metric_column) LOOP BEGIN add_metric_row( p_metric_guid => met_rec.metric_guid, p_target_type => met_rec.target_type, p_metric_name => met_rec.metric_name, p_metric_column => met_rec.metric_column, p_type_meta_ver => p_to_type_meta_ver, p_category_prop_1 => met_rec.category_prop_1, p_category_prop_2 => met_rec.category_prop_2, p_category_prop_3 => met_rec.category_prop_3, p_category_prop_4 => met_rec.category_prop_4, p_category_prop_5 => met_rec.category_prop_5, p_metric_type => met_rec.metric_type, p_usage_type => met_rec.usage_type, p_metric_label => met_rec.metric_label, p_metric_label_nlsid => met_rec.metric_label_nlsid, p_column_label => met_rec.column_label, p_column_label_nlsid => met_rec.column_label_nlsid, p_key_column => met_rec.key_column, p_key_order => met_rec.key_order, p_num_keys => met_rec.num_keys, p_description => met_rec.description, p_description_nlsid => met_rec.description_nlsid, p_unit => met_rec.unit, p_unit_nlsid => met_rec.unit_nlsid, p_short_name => met_rec.short_name, p_short_name_nlsid => met_rec.short_name_nlsid, p_is_for_summary => met_rec.is_for_summary, p_keys_from_mult_colls => met_rec.keys_from_mult_colls, p_statefull => met_rec.statefull, p_is_repository => met_rec.is_repository, p_author => met_rec.author, p_source_type => met_rec.source_type, p_source => met_rec.source, p_is_transposed => met_rec.is_transposed, p_is_test_metric => met_rec.is_test_metric, p_has_push => met_rec.has_push, p_has_pull => met_rec.has_pull, p_remote => met_rec.remote, p_non_thresholded_alerts => met_rec.non_thresholded_alerts, p_keyonly_thresholds => met_rec.keyonly_thresholds, p_is_long_running => met_rec.is_long_running, p_is_renderable => met_rec.is_renderable); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN -- NOTE : As the condition for start_type_meta_ver is <= and not < -- there could be a chance for a PK violation. So ignore any such errors IF EMDW_LOG.P_IS_INFO_SET THEN EMDW_LOG.INFO(l_proc_name||' PK error while adding metric ' || ' target type = ' || met_rec.target_type || ' metric_name = ' || met_rec.metric_name || ' metric_column = ' || met_rec.metric_column || ' from version ' || p_from_type_meta_ver || ' to version ' || p_to_type_meta_ver, G_MODULE_NAME) ; END IF ; END; END LOOP; /** INSERT INTO MGMT_METRICS (metric_guid, target_type, metric_name, metric_column, type_meta_ver, category_prop_1, category_prop_2, category_prop_3, category_prop_4, category_prop_5, metric_type, usage_type, key_column, key_order, num_keys, column_label, column_label_nlsid, metric_label, metric_label_nlsid, description, description_nlsid, unit, unit_nlsid, short_name, short_name_nlsid, is_for_summary, keys_from_mult_colls, statefull, is_repository, author, source_type, source, eval_func, is_transposed, is_test_metric, has_push, has_pull, remote) SELECT metric_guid, target_type, metric_name, metric_column, p_type_meta_ver, category_prop_1, category_prop_2, category_prop_3, category_prop_4, category_prop_5, metric_type, usage_type, key_column, key_order, num_keys, column_label, column_label_nlsid, metric_label, metric_label_nlsid, description, description_nlsid, unit, unit_nlsid, short_name, short_name_nlsid, is_for_summary, keys_from_mult_colls, statefull, is_repository, author, source_type, source, eval_func, is_transposed, is_test_metric, has_push, has_pull, remote FROM mgmt_metrics WHERE target_type = p_target_type AND metric_name = l_metric_names(l_ctr) AND type_meta_ver = l_start_meta_vers(l_ctr) ORDER BY metric_column; **/ END copy_metric; PROCEDURE copy_metric_category_map(p_target_type IN VARCHAR2, p_metric_name IN VARCHAR2, p_start_version IN VARCHAR2, p_to_version IN VARCHAR2) AS l_proc_name VARCHAR2(64) := 'copy_metric_category_map'; BEGIN IF EMDW_LOG.P_IS_INFO_SET THEN EMDW_LOG.INFO(l_proc_name||' Enter ' || p_target_type || ', ' || p_metric_name || ', ' || p_start_version || ', ' || p_to_version, G_MODULE_NAME) ; END IF ; FOR rec IN (SELECT p.class_name, p.category_name, p.object_guid FROM mgmt_category_map p, mgmt_metrics m WHERE p.target_type = p_target_type AND p.type_meta_ver = p_start_version AND p.object_type = 1 AND p.object_guid = m.metric_guid AND p.target_type = m.target_type AND p.type_meta_ver = m.type_meta_ver AND m.metric_name = p_metric_name ) LOOP add_object_category( p_object_guid => rec.object_guid, p_object_type => 1, p_target_type => p_target_type, p_type_meta_ver => p_to_version, p_category_class => rec.class_name, p_category_name => rec.category_name); END LOOP; IF emdw_log.p_is_info_set THEN emdw_log.info(l_proc_name || ' Exit.', G_MODULE_NAME); END IF; END copy_metric_category_map; -- Callback to handle the addition of new target type version PROCEDURE handle_tgttype_addition(p_target_type IN VARCHAR2, p_type_meta_ver IN VARCHAR2) IS l_metric_names MGMT_SHORT_STRING_TABLE; l_start_meta_vers MGMT_SHORT_STRING_TABLE; l_proc_name CONSTANT VARCHAR2(64) := 'em_metric.handle_tgttype_addition' ; BEGIN IF EMDW_LOG.P_IS_INFO_SET THEN EMDW_LOG.INFO(l_proc_name||'Enter ' || p_target_type || ', ' || p_type_meta_ver, G_MODULE_NAME) ; END IF ; -- Get the list of metrics that have to be added SELECT metric_name, start_type_meta_ver BULK COLLECT INTO l_metric_names, l_start_meta_vers FROM mgmt_metric_versions WHERE target_type = p_target_type AND (em_target.compare_type_meta_vers(start_type_meta_ver, p_type_meta_ver) <= 0) AND ( (end_type_meta_ver IS NULL) OR (em_target.compare_type_meta_vers(p_type_meta_ver, end_type_meta_ver) <= 0) ); IF ( (l_metric_names IS NOT NULL) AND (l_metric_names.COUNT > 0) ) THEN FOR l_ctr IN l_metric_names.FIRST..l_metric_names.LAST LOOP IF EMDW_LOG.P_IS_INFO_SET THEN EMDW_LOG.INFO(l_proc_name||' Adding metric ' || l_metric_names(l_ctr) || ' to version ' || p_type_meta_ver, G_MODULE_NAME) ; END IF ; copy_metric(p_target_type => p_target_type, p_metric_name => l_metric_names(l_ctr), p_from_type_meta_ver => l_start_meta_vers(l_ctr), p_to_type_meta_ver => p_type_meta_ver); copy_metric_category_map(p_target_type => p_target_type, p_metric_name => l_metric_names(l_ctr), p_start_version => l_start_meta_vers(l_ctr), p_to_version => p_type_meta_ver); END LOOP; END IF; END handle_tgttype_addition; PROCEDURE set_repo_timing( p_target_type IN VARCHAR2, p_metric_name IN VARCHAR2, p_enabled IN NUMBER DEFAULT MGMT_GLOBAL.G_FALSE) IS BEGIN em_check.check_range(p_value=>p_enabled, p_min_value=>0, p_max_value=>1, p_param_name=>' p_enabled ') ; UPDATE mgmt_metrics SET repo_timing_enabled = p_enabled WHERE target_type = p_target_type AND metric_name = p_metric_name ; IF SQL%NOTFOUND THEN raise_application_error(MGMT_GLOBAL.NO_SUCH_METRIC_ERR, MGMT_GLOBAL.NO_SUCH_METRIC_ERR_M) ; END IF ; END set_repo_timing ; -- Internal procedure to delete data for metric key-value in synchronous mode. -- One should include a API call if data needs to be deleted in synchronous mode. -- All registred call back wwould be executed in asynchronous mode PROCEDURE metric_keyval_deletion_sync ( p_target_guid IN mgmt_targets.target_guid%TYPE, p_metric_guids IN SMP_EMD_STRING_ARRAY, p_key_value IN mgmt_metrics_raw.key_value%TYPE ) IS l_metric_guids mgmt_guid_array := mgmt_guid_array(); l_lock_target_guids mgmt_guid_array := mgmt_guid_array(); BEGIN l_metric_guids.extend(p_metric_guids.COUNT); FOR i IN 1..p_metric_guids.count LOOP l_metric_guids(i) := mgmt_guid_obj(hextoraw(p_metric_guids(i)), ' '); END LOOP; SELECT mgmt_guid_obj(target_guid, ' ') BULK COLLECT INTO l_lock_target_guids FROM mgmt_current_metrics WHERE target_guid = p_target_guid AND key_value = p_key_value AND metric_guid IN (SELECT guid FROM TABLE(CAST(l_metric_guids as mgmt_guid_array)) ) ORDER BY metric_guid FOR UPDATE; FOR m IN 1..l_metric_guids.count LOOP -- Delete from mgmt_current_metrics DELETE FROM mgmt_current_metrics WHERE target_guid = p_target_guid AND metric_guid = l_metric_guids(m).guid AND key_value = p_key_value ; -- Since we dont delete violation history, insert a dummy row which gives the user -- the info that the key value has been removed at this point in time. /* BEGIN EM_SEVERITY.insert_violation ( p_target_guid => p_target_guid, p_policy_guid => l_metric_guids(m).guid, p_collection_timestamp => mgmt_target.sysdate_target(p_target_guid), p_key_value => p_key_value, p_violation_level => MGMT_GLOBAL.G_SEVERITY_INFORMATIONAL, p_message => 'This key value has been removed from system. All previous violations are obsolete.' ); EXCEPTION WHEN MGMT_GLOBAL.DUPLICATE_RECORD THEN IF EMDW_LOG.P_IS_DEBUG_SET THEN EMDW_LOG.DEBUG('Encountered a duplicate info severity while deleting key_value: '|| p_key_value || '. Skipping insertion.',G_MODULE_NAME) ; END IF; END; */ -- Delete from mgmt_current_violation EM_SEVERITY.del_keyval_curr_violation ( p_target_guid => p_target_guid, p_metric_guid => l_metric_guids(m).guid, p_key_value => p_key_value ) ; END LOOP; END metric_keyval_deletion_sync ; -- -- PROCEDURE: del_keyval_metrics_raw / del_keyval_metrics_1hour / del_keyval_metrics_1day -- -- PURPOSE -- Internal procedure to delete data from mgmt_metrics_raw/mgmt_metrics_1hour/mgmt_metrics_1day -- table based on a key-value of a metric. -- -- IN Parameters: -- p_target_guid - Target for which data need to be deleted -- -- p_metric_guid - Metric for which data need to be deleted -- -- p_key_value - Key value of metric for which data need to be removed -- -- p_from_timestamp - From time of time range for which key value data need to be deleted. Default NULL -- -- p_to_timestamp - To time of time range for which key value data need to be deleted. Default NULL -- -- p_batchsize - Number fo record to be deleted in one go. Default is MGMT_GLOBAL.MAX_COMMIT, -- -- p_interval - Time intervalk for which partiotion is maintained. -- Default is 1/24 day for mgmt_metrics_raw and mgmt_metrics_1hour -- Default is 1 day for mgmt_metrics_1day -- PROCEDURE del_keyval_metrics_raw ( p_target_guid IN mgmt_targets.target_guid%TYPE, p_metric_guid IN mgmt_metrics.metric_guid%TYPE, p_key_value IN mgmt_metrics_raw.key_value%TYPE, p_from_timestamp IN mgmt_metrics_raw.collection_timestamp%TYPE DEFAULT NULL, p_to_timestamp IN mgmt_metrics_raw.collection_timestamp%TYPE DEFAULT NULL, p_batchsize IN NUMBER DEFAULT MGMT_GLOBAL.MAX_COMMIT, p_interval IN NUMBER DEFAULT 1/24 ) IS l_start_date DATE; l_end_date DATE; l_curr_date DATE; l_to_curr_date DATE; l_counter NUMBER; BEGIN IF p_from_timestamp IS NULL THEN l_start_date := TRUNC(SYSDATE - (EMD_LOADER.get_raw_retention_window + 1)); ELSE l_start_date := p_from_timestamp; END IF; IF p_to_timestamp IS NULL THEN l_end_date := TRUNC(SYSDATE + 1/12, 'HH24'); ELSE l_end_date := p_to_timestamp; END IF; l_curr_date := l_start_date; WHILE (l_curr_date <= l_end_date) LOOP IF l_end_date < l_curr_date + p_interval THEN l_to_curr_date := l_end_date ; ELSE l_to_curr_date := l_curr_date + p_interval; END IF; LOOP DELETE FROM mgmt_metrics_raw WHERE target_guid = p_target_guid AND metric_guid = p_metric_guid AND key_value = p_key_value AND collection_timestamp >= l_curr_date AND collection_timestamp < l_to_curr_date AND ROWNUM <= MGMT_GLOBAL.MAX_COMMIT; l_counter := SQL%ROWCOUNT; COMMIT; IF l_counter < MGMT_GLOBAL.MAX_COMMIT THEN EXIT; END IF; END LOOP; --endless loop l_curr_date := l_curr_date + p_interval; END LOOP; --While loop -- Delete data from overflow segments. IF p_from_timestamp IS NULL THEN -- This loop will delete data from the lower range LOOP DELETE FROM MGMT_METRICS_RAW WHERE target_guid = p_target_guid AND metric_guid = p_metric_guid AND key_value = p_key_value AND collection_timestamp < l_start_date AND ROWNUM <= mgmt_global.MAX_COMMIT; l_counter := SQL%ROWCOUNT; COMMIT; IF l_counter < mgmt_global.MAX_COMMIT THEN EXIT; END IF; END LOOP; END IF; IF p_to_timestamp IS NULL THEN -- This loop will delete data from the upper range LOOP DELETE FROM MGMT_METRICS_RAW WHERE target_guid = p_target_guid AND metric_guid = p_metric_guid AND key_value = p_key_value AND collection_timestamp > l_end_date AND ROWNUM <= mgmt_global.MAX_COMMIT; l_counter := SQL%ROWCOUNT; COMMIT; IF l_counter < mgmt_global.MAX_COMMIT THEN EXIT; END IF; END LOOP; END IF; END del_keyval_metrics_raw; -- Internal procedure to remove data from mgmt_metric_1hour PROCEDURE del_keyval_metrics_1hour ( p_target_guid IN mgmt_targets.target_guid%TYPE, p_metric_guid IN mgmt_metrics.metric_guid%TYPE, p_key_value IN mgmt_metrics_raw.key_value%TYPE, p_from_timestamp IN mgmt_metrics_raw.collection_timestamp%TYPE DEFAULT NULL, p_to_timestamp IN mgmt_metrics_raw.collection_timestamp%TYPE DEFAULT NULL, p_batchsize IN NUMBER DEFAULT MGMT_GLOBAL.MAX_COMMIT, p_interval IN NUMBER DEFAULT 1/24 ) IS l_start_date DATE; l_end_date DATE; l_curr_date DATE; l_to_curr_date DATE; l_counter NUMBER; BEGIN IF p_from_timestamp IS NULL THEN l_start_date := TRUNC(SYSDATE - (EMD_LOADER.get_1hour_retention_window + 1)); ELSE l_start_date := p_from_timestamp; END IF; IF p_to_timestamp IS NULL THEN l_end_date := TRUNC(SYSDATE + 2); ELSE l_end_date := p_to_timestamp; END IF; l_curr_date := l_start_date; WHILE (l_curr_date <= l_end_date) LOOP IF l_end_date < l_curr_date + p_interval THEN l_to_curr_date := l_end_date ; ELSE l_to_curr_date := l_curr_date + p_interval; END IF; LOOP DELETE FROM mgmt_metrics_1hour WHERE target_guid = p_target_guid AND metric_guid = p_metric_guid AND key_value = p_key_value AND rollup_timestamp >= l_curr_date AND rollup_timestamp < l_to_curr_date AND ROWNUM <= mgmt_global.MAX_COMMIT; l_counter := SQL%ROWCOUNT; COMMIT; IF l_counter < mgmt_global.MAX_COMMIT THEN EXIT; END IF; END LOOP; --endless loop l_curr_date := l_curr_date + p_interval; END LOOP; --While loop END del_keyval_metrics_1hour; -- Internal procedure to remove data from mgmt_metric_1day PROCEDURE del_keyval_metrics_1day ( p_target_guid IN mgmt_targets.target_guid%TYPE, p_metric_guid IN mgmt_metrics.metric_guid%TYPE, p_key_value IN mgmt_metrics_raw.key_value%TYPE, p_from_timestamp IN mgmt_metrics_raw.collection_timestamp%TYPE DEFAULT NULL, p_to_timestamp IN mgmt_metrics_raw.collection_timestamp%TYPE DEFAULT NULL, p_batchsize IN NUMBER DEFAULT MGMT_GLOBAL.MAX_COMMIT, p_interval IN NUMBER DEFAULT 1 ) IS l_start_date DATE; l_end_date DATE; l_curr_date DATE; l_to_curr_date DATE; l_counter NUMBER; BEGIN IF p_from_timestamp IS NULL THEN l_start_date := TRUNC(SYSDATE - (EMD_LOADER.get_1day_retention_window + 1)); ELSE l_start_date := p_from_timestamp; END IF; IF p_to_timestamp IS NULL THEN l_end_date := TRUNC(SYSDATE + 2); ELSE l_end_date := p_to_timestamp; END IF; l_curr_date := l_start_date; WHILE (l_curr_date <= l_end_date) LOOP IF l_end_date < l_curr_date + p_interval THEN l_to_curr_date := l_end_date ; ELSE l_to_curr_date := l_curr_date + p_interval; END IF; LOOP DELETE FROM mgmt_metrics_1day WHERE target_guid = p_target_guid AND metric_guid = p_metric_guid AND key_value = p_key_value AND rollup_timestamp >= l_curr_date AND rollup_timestamp < l_to_curr_date AND ROWNUM <= mgmt_global.MAX_COMMIT; l_counter := SQL%ROWCOUNT; COMMIT; IF l_counter < mgmt_global.MAX_COMMIT THEN EXIT; END IF; END LOOP; --endless loop l_curr_date := l_curr_date + p_interval; END LOOP; --While loop END del_keyval_metrics_1day; -- Ascynchronous callback for metric key-val deletion -- This callback is only for framework related table data deletion in asynchronus mode. -- If table is not a framework related then please register a separate callback. PROCEDURE handle_metric_keyval_deletion ( p_target_guid IN mgmt_targets.target_guid%TYPE, p_metric_guid IN mgmt_metrics.metric_guid%TYPE, p_key_value IN mgmt_metrics_raw.key_value%TYPE ) IS l_counter NUMBER; BEGIN IF EMDW_LOG.P_IS_DEBUG_SET THEN EMDW_LOG.DEBUG('handle_metric_keyval_deletion:Enter',G_MODULE_NAME) ; END IF; del_keyval_metrics_raw ( p_target_guid => p_target_guid, p_metric_guid => p_metric_guid, p_key_value => p_key_value ); del_keyval_metrics_1hour ( p_target_guid => p_target_guid, p_metric_guid => p_metric_guid, p_key_value => p_key_value ); del_keyval_metrics_1day ( p_target_guid => p_target_guid, p_metric_guid => p_metric_guid, p_key_value => p_key_value ); -- Delete from MGMT_METRIC_THRESHOLDS/policy tables EM_POLICY.del_keyval_policy ( p_target_guid => p_target_guid, p_metric_guid => p_metric_guid, p_key_value => p_key_value ); -- Delete from MGMT_STRING_METRIC_HISTORY LOOP DELETE FROM mgmt_string_metric_history WHERE target_guid = p_target_guid AND metric_guid = p_metric_guid AND key_value = p_key_value AND ROWNUM <= mgmt_global.MAX_COMMIT; l_counter := SQL%ROWCOUNT; COMMIT; IF l_counter < mgmt_global.MAX_COMMIT THEN EXIT; END IF; END LOOP; IF EMDW_LOG.P_IS_DEBUG_SET THEN EMDW_LOG.DEBUG('handle_metric_keyval_deletion:Exit',G_MODULE_NAME) ; END IF; END handle_metric_keyval_deletion ; PROCEDURE exec_cbk_metric_keyval ( p_target_guid IN mgmt_targets.target_guid%TYPE, p_metric_guids IN SMP_EMD_STRING_ARRAY, p_key_value IN mgmt_metrics_raw.key_value%TYPE ) IS l_task_param MGMT_NAMEVALUE_ARRAY := MGMT_NAMEVALUE_ARRAY() ; l_task_id NUMBER ; BEGIN -- NOT NULL checks EM_CHECK.check_not_null(p_target_guid, 'p_target_guid'); EM_CHECK.check_not_null(p_key_value, 'p_key_value'); IF p_metric_guids IS NULL OR p_metric_guids.count = 0 THEN IF (EMDW_LOG.p_is_error_set)THEN EMDW_LOG.error('Invalid parameter', G_MODULE_NAME); END IF; raise_application_error(MGMT_GLOBAL.invalid_params_err, 'Invalid parameter'); END IF; -- Synchronous deletion metric_keyval_deletion_sync ( p_target_guid => p_target_guid, p_metric_guids => p_metric_guids, p_key_value => p_key_value ); -- Asynchronous deletion FOR m IN 1..p_metric_guids.count LOOP l_task_id := NULL; l_task_param := MGMT_NAMEVALUE_ARRAY( mgmt_namevalue_obj.new('p_target_guid', p_target_guid), mgmt_namevalue_obj.new('p_metric_guid', p_metric_guids(m)), mgmt_namevalue_obj.new('p_key_value', p_key_value) ) ; l_task_id := EM_TASK.create_task ( p_coll_schedule => MGMT_COLL_SCHEDULE_OBJ.one_time(SYSDATE), p_task_type => EM_TASK.G_TASK_TYPE_ADHOC, p_task_proc => 'EM_METRIC.TASK_EXEC_CBK_METRIC_KEYVAL', p_context => l_task_param, p_task_class => EM_TASK.G_TASK_CLASS_LONG_RUNNING ) ; END LOOP; END exec_cbk_metric_keyval ; PROCEDURE task_exec_cbk_metric_keyval ( p_context IN MGMT_NAMEVALUE_ARRAY ) IS l_current_user mgmt_targets.owner%TYPE := MGMT_USER.get_current_em_user() ; l_target_guid mgmt_targets.target_guid%TYPE; l_metric_guid mgmt_metrics.metric_guid%TYPE; l_key_value mgmt_metrics_raw.key_value%TYPE; BEGIN IF EMDW_LOG.P_IS_DEBUG_SET THEN EMDW_LOG.DEBUG('Task_exec_cbk_metric_keyval:Enter',G_MODULE_NAME) ; END IF; IF p_context IS NULL or p_context.count != 3 THEN IF (EMDW_LOG.p_is_error_set)THEN EMDW_LOG.error('Invalid parameter', G_MODULE_NAME); END IF; raise_application_error(MGMT_GLOBAL.invalid_params_err, 'Invalid parameter'); END IF; FOR p IN 1..p_context.count LOOP IF UPPER(p_context(p).name) = 'P_TARGET_GUID' THEN l_target_guid := p_context(p).value ; ELSIF UPPER(p_context(p).name) = 'P_METRIC_GUID' THEN l_metric_guid := p_context(p).value ; ELSIF UPPER(p_context(p).name) = 'P_KEY_VALUE' THEN l_key_value := p_context(p).value ; ELSE IF (EMDW_LOG.p_is_error_set)THEN EMDW_LOG.error('Invalid parameter', G_MODULE_NAME); END IF; raise_application_error(MGMT_GLOBAL.invalid_params_err, 'Invalid parameter'); END IF; END LOOP; -- Execute callback FOR callback IN (SELECT callback_name FROM mgmt_callbacks WHERE callback_type = MGMT_GLOBAL.G_METRIC_KEYVAL_DEL_CALLBACK ORDER BY eval_order ) LOOP BEGIN -- Enter super-user mode. This is necessary because some callbacks -- involves making calls to the security system that only super-users -- are allowed to make SETEMUSERCONTEXT(MGMT_USER.GET_REPOSITORY_OWNER, MGMT_USER.OP_SET_IDENTIFIER); EXECUTE IMMEDIATE 'BEGIN ' || EM_CHECK.qualified_sql_name(callback.callback_name) || '(:1, :2, :3); END; ' USING l_target_guid, l_metric_guid, l_key_value ; EXCEPTION -- Ignore exceptions so that main transaction is not affected; we do not -- treat callback exceptions on par with repository exceptions. In other -- words, we will not let some callback mess up repository operations. WHEN OTHERS THEN -- Revert back to being the same user as we entered SETEMUSERCONTEXT(l_current_user, MGMT_USER.OP_SET_IDENTIFIER); IF (EMDW_LOG.p_is_error_set)THEN EMDW_LOG.error('Error executing callback : '||sqlerrm , G_MODULE_NAME); END IF; END; END LOOP; --of callback -- Revert back to being the same user as we entered SETEMUSERCONTEXT(l_current_user, MGMT_USER.OP_SET_IDENTIFIER); IF EMDW_LOG.P_IS_DEBUG_SET THEN EMDW_LOG.DEBUG('Task_exec_cbk_metric_keyval:Exit',G_MODULE_NAME) ; END IF; END task_exec_cbk_metric_keyval; -- Any callback added would be deleted in Asynchronus mode PROCEDURE add_metric_keyval_callback ( p_callback_name IN VARCHAR2, p_callback_eval_order IN NUMBER DEFAULT 0 ) IS l_arg_type_list MGMT_SHORT_STRING_ARRAY; l_err_msg VARCHAR2(4096); BEGIN -- NOT NULL checks EM_CHECK.check_not_null(p_callback_name, 'p_callback_name'); l_arg_type_list := MGMT_SHORT_STRING_ARRAY('RAW','RAW','VARCHAR2'); IF (EM_CHECK.is_valid_signature(p_callback_name, l_arg_type_list, l_err_msg) = FALSE) THEN raise_application_error(MGMT_GLOBAL.INVALID_PARAMS_ERR, 'Invalid callback ' || p_callback_name || ' . Error = ' || l_err_msg); END IF; BEGIN INSERT INTO mgmt_callbacks (callback_type, callback_name, selector_1, selector_2, selector_3, eval_order) VALUES (MGMT_GLOBAL.G_METRIC_KEYVAL_DEL_CALLBACK, UPPER(p_callback_name), ' ', ' ', ' ', p_callback_eval_order); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN IF (emdw_log.p_is_error_set)THEN emdw_log.error('Callback '|| p_callback_name||' already exists', G_MODULE_NAME); END IF; raise_application_error(mgmt_global.invalid_params_err, 'callback already exist'); END; END add_metric_keyval_callback; PROCEDURE del_metric_keyval_callback ( p_callback_name IN VARCHAR2 ) IS BEGIN -- NOT NULL checks EM_CHECK.check_not_null(p_callback_name, 'p_callback_name'); DELETE FROM mgmt_callbacks WHERE callback_type = MGMT_GLOBAL.G_METRIC_KEYVAL_DEL_CALLBACK AND callback_name = UPPER(p_callback_name) ; END del_metric_keyval_callback ; PROCEDURE add_metric_metadata_reg_cb(p_callback_name IN VARCHAR2, p_target_type IN VARCHAR2 DEFAULT ' ') AS l_arg_type_list mgmt_short_string_array; l_err_msg VARCHAR2(4096); BEGIN EM_CHECK.check_not_null(p_callback_name, 'p_callback_name'); l_arg_type_list := MGMT_SHORT_STRING_ARRAY('VARCHAR2', 'VARCHAR2'); IF (EM_CHECK.is_valid_signature(p_callback_name, l_arg_type_list, l_err_msg) = FALSE) THEN raise_application_error(MGMT_GLOBAL.INVALID_PARAMS_ERR, 'Invalid callback ' || p_callback_name || ' . Error = ' || l_err_msg); END IF; BEGIN INSERT INTO mgmt_callbacks (callback_type, callback_name, selector_1, selector_2, selector_3) VALUES (MGMT_GLOBAL.G_METRIC_METADATA_REG_CALLBACK, UPPER(p_callback_name), NVL(p_target_type, ' '), ' ', ' '); EXCEPTION WHEN DUP_VAL_ON_INDEX THEN -- Ignore duplicate callback registrations.. NULL; END; END add_metric_metadata_reg_cb; PROCEDURE del_metric_metadata_reg_cb(p_callback_name IN VARCHAR2, p_target_type IN VARCHAR2 DEFAULT ' ') AS l_target_type mgmt_targets.target_type%TYPE; BEGIN EM_CHECK.check_not_null(p_callback_name, 'p_callback_name'); l_target_type := NVL(p_target_type, ' '); DELETE FROM mgmt_callbacks WHERE callback_type = MGMT_GLOBAL.G_METRIC_METADATA_REG_CALLBACK AND callback_name = UPPER(p_callback_name) AND selector_1 = l_target_type; END del_metric_metadata_reg_cb; PROCEDURE exec_metric_metadata_reg_cb(p_target_type IN VARCHAR2, p_type_meta_ver IN VARCHAR2) AS BEGIN FOR cbs IN (SELECT callback_name FROM mgmt_callbacks WHERE callback_type = mgmt_global.G_METRIC_METADATA_REG_CALLBACK AND (selector_1 = p_target_type OR selector_1 = ' ') ORDER BY callback_name ) LOOP BEGIN EXECUTE IMMEDIATE 'BEGIN ' || EM_CHECK.qualified_sql_name(cbs.callback_name) || '(:1, :2); END;' USING EM_CHECK.NOOP(p_target_type), p_type_meta_ver; EXCEPTION WHEN OTHERS THEN mgmt_log.log_error(v_module_name_in => 'LOADER', v_error_code_in => 0, v_error_msg_in => 'In exec_metric_metadata_reg_cb ' || ' Error while calling callback ' || cbs.callback_name || ' with target type ' || p_target_type || ' type meta ver ' || p_type_meta_ver || 'Error msg is ' || SUBSTR(SQLERRM, 1, 2000)); END; END LOOP; END exec_metric_metadata_reg_cb; FUNCTION is_server_gen_alert_metric ( p_metric_guid IN mgmt_metrics.metric_guid%TYPE, p_target_guid IN mgmt_targets.target_guid%TYPE ) RETURN BOOLEAN IS server_gen_alert_metric BOOLEAN := false; l_has_pull NUMBER; BEGIN BEGIN SELECT distinct(m.has_push) INTO l_has_pull FROM mgmt_targets t, mgmt_metrics m WHERE t.target_guid = p_target_guid AND m.metric_guid = p_metric_guid AND m.type_meta_ver = t.type_meta_ver AND (m.category_prop_1 = t.category_prop_1 OR m.category_prop_1 = ' ') AND (m.category_prop_2 = t.category_prop_2 OR m.category_prop_2 = ' ') AND (m.category_prop_3 = t.category_prop_3 OR m.category_prop_3 = ' ') AND (m.category_prop_4 = t.category_prop_4 OR m.category_prop_4 = ' ') AND (m.category_prop_5 = t.category_prop_5 OR m.category_prop_5 = ' '); IF(l_has_pull = 1) THEN server_gen_alert_metric := true; ELSE server_gen_alert_metric := false; END IF; EXCEPTION WHEN OTHERS THEN server_gen_alert_metric := false; END; RETURN server_gen_alert_metric; END is_server_gen_alert_metric; END em_metric; / show errors