Skip to main content
Skip table of contents

Error Monitoring for Oracle Siebel CRM (Configure)

Features

Guide to configuring the analysis of impactful errors and filtering out the insignificant ones to Siebel CRM Users or Business Processes. Ignore the noise and focus on the issues that are critical to your business! Germain has the ability to help you understand the impact, at scale, of any errors on the end-user or business operations while operating with Oracle Siebel CRM. It helps separate critical errors from benign ones and also identifies the new ones.

This assumes you have already deployed Germain UX - RUM JS and Germain UX - Engine for your Oracle Siebel CRM instance.

siebel error ex.png

Siebel Error Example detected and analyzed by Germain UX

User Error Tagging/Monitoring for Oracle Siebel CRM

Here is how to configure Germain UX’s monitoring identify errors that affect Oracle Siebel CRM users.

  • Configure UX Monitoring Profile
    Germain Workspace > Left Menu > Analytics > UX Monitoring Profiles > Siebel OpenUI

    siebel error.png

    Sample Code:

    CODE
    var settings = germainApm.getDefaultSettings();
    settings.disabledDataGenerators.push('hoverStyles'); // Disable hover-styles monitoring in Siebel due to overhead
    settings.constants.logLevelToEmitAsFacts = 'WARN';
    settings.constants.sessionMarkerEnd = ['Logout', 'Log Out', 'Log Out [Ctrl+Shift+X]'];
    settings.application.metadataProviders['sessionId'] = getSessionId;
    settings.application.metadataProviders['user.name'] = getUsername;
    settings.application.metadataProviders['application.component'] = getSiebelComponent;
    settings.plugins.network.checkExcludedUrlsInRequestDetails = true;
    settings.plugins.network.excludedUrls.push(/WaitForCommand/, /SWEService=Communications/, /SWECmd=InvokeMethod&SWEService=Message\+Bar&SWEMethod=UpdatePrefMsg/, /SWECmd=InvokeMethod&SWEService=SWE\+Command\+Manager&SWEMethod=BatchCanInvoke/, /SWECmd=InvokeMethod.*&SWEMethod=GetProfileAttr.*&SWEIPS=/);
    settings.plugins.network.trackingUrls.push(window.location.origin);
    settings.plugins.network.factProcessor = networkFactProcessor;
    settings.plugins.network.requestAndResponseBodyProcessor = networkRequestAndResponseBodyProcessor;
    settings.plugins.console = {
        methods: ['warn', 'error'],
        eventProcessor: consoleFactProcessor,
        maxLogStringLength: settings.plugins.console.maxLogStringLength
    };
    settings.plugins.click.factProcessor = clickFactProcessor;
    settings.plugins.popup.factProcessor = popupFactProcessor;
    settings.plugins.popup.errorCategorizer = alertIsError;
    settings.application.factProcessor = factProcessor;
    settings.application.refererProcessor = refererProcessor;
    settings.plugins.pageLoad.factProcessor = pageLoadFactProcessor;
    settings.plugins.pageLoad.checkExcludedUrlsInRequestDetails = true;
    settings.plugins.pageLoad.excludedUrls = [
        /\/marker/,
        /BuildErrorMsg/,
        /channelservice/,
        /GetAlarmInstances/,
        /GetAlarms/,
        /getQueue/,
        /ie-preamble/,
        /Ping/,
        /RefreshBusComp/,
        /SWECmd=HTML\+Comm\+Ready/,
        /SWECmd=InvokeMethod.*GetWebSessionInfo/,
        /SWECmd=RunProcess/,
        /SWEMethod=InitDashboardData/,
        /SWEMethod=PopulateDashboardFromCTI/,
        /SWEView=Persistent.*Customer.*Dashboard.*View/
    ];
    settings.plugins.storyBeats.uiHierarchyProvider = uiHierarchyProvider;
    germainApm.eventGenerators.customLogout = customLogout();
    //germainApm.dataGenerators.serviceRequestIntervals = serviceRequestIntervalsDataGenerator;
    settings.plugins.sessionReplay.customAttributeBlacklist = ['aria-activedescendant', 'aria-atomic', 'aria-autocomplete', 'aria-busy', 'aria-checked', 'aria-colcount', 'aria-colindex', 'aria-colspan', 'aria-controls', 'aria-current', 'aria-describedby',
        'aria-details', 'aria-disabled', 'aria-dropeffect', 'aria-errormessage', 'aria-expanded', 'aria-flowto', 'aria-grabbed', 'aria-haspopup', 'aria-hidden', 'aria-invalid', 'aria-keyshortcuts', 'aria-label', 'aria-labelledby', 'aria-level', 'aria-live',
        'aria-modal', 'aria-multiline', 'aria-multiselectable', 'aria-orientation', 'aria-owns', 'aria-placeholder', 'aria-posinset', 'aria-pressed', 'aria-readonly', 'aria-relevant', 'aria-required', 'aria-roledescription', 'aria-rowcount', 'aria-rowindex',
        'aria-rowspan', 'aria-selected', 'aria-setsize', 'aria-sort', 'aria-valuemax', 'aria-valuemin', 'aria-valuenow', 'aria-valuetext', 'role'];
    germainApm.start(settings);
    var SiebelScreen = 'level1';
    var SiebelView = 'level2';
    var SiebelApplet = 'level3';
    var SiebelCommand = 'level4';
    function extractHierarchyDimensionFromNetworkFact(event, page) {
        var isGetRequest = event ? event.method === 'GET' : true;
        var hierarchy = {};
        var queryStringMap = germainApm.utils.parseQueryStringToMap(event ? event.url.search : (page ? page.query : null));
        var requestBodyMap = germainApm.utils.parseQueryStringToMap(event ? event.request : null);
        var applet = isGetRequest ? (queryStringMap['SWEApplet'] || queryStringMap['SWEActiveApplet']) : (requestBodyMap['SWEApplet'] || requestBodyMap['SWEActiveApplet']);
        hierarchy[SiebelApplet] = !applet || applet === 'undefined' ? null : decodeURIComponent(applet).replace(/\+/g, ' ');
        var view = isGetRequest ? (queryStringMap['SWEView'] || queryStringMap['SWEActiveView']) : (requestBodyMap['SWEView'] || requestBodyMap['SWEActiveView']);
        hierarchy[SiebelView] = !view || view === 'undefined' ? null : decodeURIComponent(view).replace(/\+/g, ' ');
        var screen = isGetRequest ? queryStringMap['SWEScreen'] : requestBodyMap['SWEScreen'];
        hierarchy[SiebelScreen] = !screen || screen === 'undefined' ? null : decodeURIComponent(screen).replace(/\+/g, ' ');
        // Note: method is more specific then command so we try to use it first for level4
        var method = isGetRequest ? queryStringMap['SWEMethod'] : requestBodyMap['SWEMethod'];
        var command = isGetRequest ? queryStringMap['SWECmd'] : requestBodyMap['SWECmd'];
        hierarchy[SiebelCommand] = !method || method === 'undefined' ? null : decodeURIComponent(method).replace(/\+/g, ' ');
        if (!hierarchy[SiebelCommand])
            hierarchy[SiebelCommand] = !command || command === 'undefined' ? null : decodeURIComponent(command).replace(/\+/g, ' ');
        return hierarchy;
    }
    function extractHierarchyDimensionFromSiebelApp() {
        var _a, _b;
        try {
            var siebelWindow = window;
            var sApp = siebelWindow.SiebelApp.S_App;
            if (!sApp)
                return undefined;
            var activeView = sApp.GetActiveView();
            if (activeView) {
                var hierarchy = {};
                hierarchy[SiebelView] = activeView.GetViewSummary();
                if (hierarchy[SiebelView])
                    hierarchy[SiebelView] = (_a = hierarchy[SiebelView]) === null || _a === void 0 ? void 0 : _a.replace(/\+/g, ' ');
                if (typeof activeView.GetActiveApplet !== undefined) {
                    var activeApplet = activeView.GetActiveApplet();
                    if (activeApplet) {
                        hierarchy[SiebelApplet] = activeApplet.GetAppletSummary();
                        if (hierarchy[SiebelApplet])
                            hierarchy[SiebelApplet] = (_b = hierarchy[SiebelApplet]) === null || _b === void 0 ? void 0 : _b.replace(/\+/g, ' ');
                    }
                }
                return hierarchy;
            }
        }
        catch (e) { }
        return undefined;
    }
    function getCurrentPage(w) {
        var hierarchy = extractHierarchyDimensionFromSiebelApp();
        var component = w.SiebelApp.S_App ? w.SiebelApp.S_App.GetAppTitle() : undefined;
        var activeTab = germainApm.native.documentQuerySelector(w.document, '.siebui-nav-tabScreen .siebui-active-navtab');
        return {
            comp: component,
            tab: activeTab && activeTab.innerText ? activeTab.innerText.trim() : undefined,
            view: hierarchy ? hierarchy[SiebelView] || undefined : undefined,
            applet: hierarchy ? hierarchy[SiebelApplet] || undefined : undefined
        };
    }
    function convertHierarchyToSiebelDimension(hierarchy) {
        if (!hierarchy)
            return {};
        return {
            screen: hierarchy[SiebelScreen],
            applet: hierarchy[SiebelApplet],
            view: hierarchy[SiebelView],
            command: hierarchy[SiebelCommand]
        };
    }
    function networkFactProcessor(fact, event, settings, fireEvent, submit) {
        if (event.type !== 'request')
            return;
        fact.siebel = convertHierarchyToSiebelDimension(extractHierarchyDimensionFromNetworkFact(event));
        fact.name = fact.siebel.command || null;
    }
    function networkRequestAndResponseBodyProcessor(fact, settings, event) {
        if (fact.http && fact.http.method === 'POST' && fact.requestBody) {
            try {
                fact.requestBody = decodeURIComponent(fact.requestBody);
            }
            catch (e) { }
        }
        if (fact.http && fact.http.query && fact.http.query.indexOf('GetCachedFrame') > -1 && fact.responseBody) {
            if (fact.responseBody.indexOf('>Error Message</td>') > -1) {
                fact.success = false;
            }
        }
    }
    function alertIsError(message, defaultValue) {
        if (typeof message === 'string') {
            if (~message.indexOf('SBL-'))
                return true;
            if (message.match(/(server .* busy or experiencing difficulties)/gm))
                return true;
        }
        return false;
    }
    function refererProcessor(refererUrl) {
        if (!refererUrl)
            return null;
        try {
            var url = new URL(refererUrl);
            return url.origin + url.pathname;
        }
        catch (ex) { }
        return refererUrl;
    }
    function factProcessor(fact) {
        switch (fact.type) {
            case 'Browser:JS Popup':
            case 'Browser:Mouse Click':
            case 'Browser:User Click':
            case 'Browser:JS Console': {
                fact.type = fact.type + ':Siebel';
                break;
            }
            case 'Browser:User Click Cluster': {
                fact.type = 'Browser:User Click:Siebel Cluster';
                break;
            }
        }
        // convert all http requests into Siebel http requests
        if (fact.myClassName === 'OutboundFetchRequest')
            fact.myClassName = fact.myClassName.replace('OutboundFetchRequest', 'SiebelOutboundHttpRequest');
    }
    function getSiebelComponent(window) {
        return new germainApm.native.Promise(function (resolve, reject) {
            var pathname = window.top.location.pathname;
            if (pathname) {
                var items = pathname.split('/').filter(Boolean);
                resolve(items[0]);
            }
            resolve(null);
        });
    }
    function getSessionId(window) {
        return new germainApm.native.Promise(function (resolve, reject) {
            germainApm.utils.waitForProperty(window, 'SiebelApp', function () {
                var counter = 0;
                var maxRetry = 50, retryTimeoutInMillis = 500;
                var intervalId = germainApm.native.setInterval(function () {
                    var session = null;
                    counter++;
                    try {
                        session = (window.SiebelApp.S_App && window.SiebelApp.S_App.GetSessionId()) || null;
                    }
                    catch (err) { }
                    if (!session) {
                        var query = window.top.location.search;
                        var posSn = query.indexOf('_sn=');
                        if (posSn > -1) {
                            var endSn = query.indexOf('&', posSn);
                            session = (endSn === -1) ? query.substring(posSn + 4) : query.substring(posSn + 4, endSn);
                        }
                    }
                    if (session) { // session found
                        germainApm.log('INFO', 'Session ID found: ' + session);
                        germainApm.native.clearInterval(intervalId);
                        resolve(session);
                    }
                    else if (counter >= maxRetry) {
                        germainApm.log('INFO', 'Session ID not found as metadataprovider timed out');
                        germainApm.native.clearInterval(intervalId);
                        resolve(null);
                    }
                }, retryTimeoutInMillis);
            }, function () { return reject(null); }, 20, 500);
        });
    }
    function getUsername(window) {
        return new germainApm.native.Promise(function (resolve, reject) {
            germainApm.utils.waitForProperty(window, 'SiebelApp', function () {
                var counter = 0;
                var maxRetry = 120, retryTimeoutInMillis = 500;
                var intervalId = germainApm.native.setInterval(function () {
                    var username = null;
                    counter++;
                    try {
                        username = (window.SiebelApp.S_App && window.SiebelApp.S_App.GetUserName()) || null;
                    }
                    catch (err) { }
                    if (username) { // username found
                        germainApm.log('INFO', 'Username ID found: ' + username);
                        germainApm.native.clearInterval(intervalId);
                        resolve(username.toLowerCase());
                    }
                    else if (counter >= maxRetry) {
                        germainApm.log('INFO', 'Username not found as metadataprovider timed out.');
                        germainApm.native.clearInterval(intervalId);
                        resolve(null);
                    }
                }, retryTimeoutInMillis);
            }, function () { return reject(null); }, 120, 500);
        });
    }
    // can be used by multiple things, e.g. user click, user change, ...
    function labelProcessor(node) {
        var element = null;
        if (~['A', 'BUTTON', 'INPUT', 'SELECT', 'TEXTAREA'].indexOf(node.nodeName)) {
            element = node;
        }
        else if (node.className && node.hasChildNodes() &&
            (~node.className.indexOf('mceField') || ~node.className.indexOf('edit-cell'))) {
            element = germainApm.native.elementGetElementsByTagName(node, 'input')[0];
        }
        if (element && element.attributes) {
            var namedItem = element.attributes.getNamedItem('aria-label') ||
                element.attributes.getNamedItem('data-display') ||
                element.attributes.getNamedItem('aria-labelledby');
            if (namedItem && namedItem.value) {
                return namedItem.value;
            }
        }
        return undefined;
    }
    function clickFactProcessor(fact, event, fireEvent, settings, exclusion) {
        var target = event.target;
        if (target instanceof Element) {
            switch (target.nodeName) {
                case 'DIV':
                    fact.name = 'div';
                    if (target.className && target.className.trim() === 'mceGridLabel') {
                        fact.name = 'field label';
                        fact.details = germainApm.utils.applyExclusion(exclusion, target.textContent || (target instanceof HTMLElement ? target.innerText : '') || '');
                    }
                    break;
                case 'TD':
                    fact.name = 'cell label';
                    fact.details = germainApm.utils.applyExclusion(exclusion, target.textContent || (target instanceof HTMLElement ? target.innerText : '') || '');
                    break;
            }
            // label lookup
            fact.displayedName = germainApm.utils.applyExclusion(exclusion, labelProcessor(target) || fact.displayedName || '');
            fact.hierarchy = extractHierarchyDimensionFromSiebelApp();
        }
        if (fact.details)
            fact.details = fact.details.trim();
    }
    function consoleFactProcessor(event, fireEvent, settings) {
        var stack = event.stack;
        event.processedAttributes = {};
        if (stack && typeof stack === 'string') {
            if (stack.match(/(TypeError: Unable to get property)/gm)) {
                event.processedAttributes.name = 'TypeError: Unable to get property';
            }
            else if (stack.match(/(TypeError: Object doesn't support property or method)/gm)) {
                event.processedAttributes.name = 'TypeError: Object doesn\'t support property or method';
            }
            else if (stack.match(/(TypeError: Cannot read property)/gm)) {
                event.processedAttributes.name = 'TypeError: Cannot read property';
            }
            else if (stack.match(/(cannot call method)/gm)) {
                event.processedAttributes.name = 'Error: Cannot call method';
            }
            else if (stack.match(/(no such method)/gm)) {
                event.processedAttributes.name = 'Error: No such method';
            }
            else if (stack.match(/(ReferenceError: .* is undefined)/gm)) {
                event.processedAttributes.name = 'ReferenceError: Reference undefined';
            }
            else if (stack.match(/(TypeError: .* is not a function)/gm)) {
                event.processedAttributes.name = 'TypeError: Not a function';
            }
            else if (stack.match(/(TypeError: Cannot read property .* of null)/gm)) {
                event.processedAttributes.name = 'TypeError: Cannot read null property';
            }
            else if (stack.match(/(server .* busy or experiencing difficulties)/gm)) {
                event.processedAttributes.name = 'Error:server busy or experiencing difficulties';
            }
        }
        event.processedAttributes.hierarchy = extractHierarchyDimensionFromSiebelApp();
        event.isError = event.level === 'error';
        return true;
    }
    function popupFactProcessor(fact, event, fireEvent, settings) {
        if (fact.details) {
            if (~fact.details.indexOf('SBL-')) {
                var errorCodes = fact.details.match(/(SBL-\w+-\d+)/gm);
                if (errorCodes)
                    fact.businessObject = errorCodes[0];
                // SBL-EXL-00151 -> Custom Validation error
                if (fact.businessObject === 'SBL-EXL-00151') {
                    fact.displayedName = 'Custom Validation Error';
                }
            }
            else if (fact.details.match(/(server .* busy or experiencing difficulties)/gm)) {
                fact.displayedName = 'Server busy or experiencing difficulties';
            }
        }
        fact.hierarchy = extractHierarchyDimensionFromSiebelApp();
    }
    function pageLoadFactProcessor(userClick, events) {
        function getValue(regex, searchContent) {
            var extracted = null;
            try {
                var match = searchContent.match(regex);
                if (match && match[1]) {
                    extracted = decodeURIComponent(match[1]).replace(/\+/g, ' ');
                }
            }
            catch (e) { }
            return extracted;
        }
        var viewExtractor = /(?:SWEView|SWEActiveView)=(.[^&]*)/;
        var appletExtractor = /(?:SWEApplet|SWEActiveApplet)=(.[^&]*)/;
        var navigate = null, drillDown = null, viewLayout = null, pdq = null, other = null, viewName = null, appletName = null;
        for (var i = 0; i < events.length; i++) {
            var event_1 = events[i].event;
            var page = events[i].page;
            if (event_1.type === 'request') {
                var searchContent = event_1.request || germainApm.utils.getQueryParams(event_1.url) || '';
                if (searchContent && typeof searchContent === 'string') {
                    if (searchContent.match(/SWEMethod=.*?GotoView.*?&/) || searchContent.match(/SWECmd=.*?GotoView.*?&/)) {
                        viewName = getValue(viewExtractor, searchContent);
                        navigate = { name: 'Navigation', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=ExecuteNamedQuery')) {
                        var queryNameString = 'SWEQueryName=';
                        var pdqQueryNameIndex = searchContent.indexOf(queryNameString) + queryNameString.length;
                        var pdqQueryNameIndexEnd = searchContent.indexOf('&', pdqQueryNameIndex);
                        var pdqQueryName = (pdqQueryNameIndexEnd === -1) ? searchContent.substr(pdqQueryNameIndex) : searchContent.substr(pdqQueryNameIndex, pdqQueryNameIndexEnd - pdqQueryNameIndex);
                        pdq = { name: pdqQueryName ? 'PDQ ' + pdqQueryName.replace(/\+/g, ' ') : 'PDQ', event: event_1, page: page };
                        break;
                    }
                    else if (~searchContent.indexOf('SWEMethod=Drilldown')) {
                        appletName = getValue(appletExtractor, searchContent);
                        viewName = getValue(viewExtractor, searchContent);
                        drillDown = { name: 'Drilldown', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWECmd=GetViewLayout') || ~searchContent.indexOf('SWEMethod=GetViewLayout')) {
                        viewName = getValue(viewExtractor, searchContent);
                        viewLayout = { name: viewName || 'Navigation', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=NewRecord')) {
                        other = { name: 'New Record', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=WriteRecord')) {
                        other = { name: 'Save Record', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=AddRecords')) {
                        other = { name: 'Add Record', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=UndoRecord')) {
                        other = { name: 'Undo Record', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=NewQuery')) {
                        other = { name: 'New Query', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=ExecuteQuery')) {
                        other = { name: 'Execute Query', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=GetQuickPickInfo')) {
                        other = { name: 'Select', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=CloseApplet')) {
                        other = { name: 'Close ' + (getValue(/(?:SWEApplet|SWEActiveApplet)=(.[^&]*)/, searchContent) || ''), event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=EditField')) {
                        other = { name: 'Edit Field', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=PickRecord')) {
                        other = { name: 'Select Record', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=PositionOnRow')) {
                        other = { name: 'Select Row', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=Validate')) {
                        other = { name: getValue(/SWEMethod=Validate(.[^&]*)/, searchContent) || 'Validate', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=PrepareAppletMenu')) {
                        other = { name: 'Applet Menu', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=AboutRecord')) {
                        other = { name: 'About Record', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=PostChanges')) {
                        other = { name: 'Update Record', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=AboutView')) {
                        other = { name: 'About View', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=MergeRecords')) {
                        other = { name: 'Merge Records', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEMethod=SelectAll')) {
                        other = { name: 'Select All', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWECmd=Login')) {
                        other = { name: 'Login', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWECmd=Search') || ~searchContent.indexOf('SWEMethod=Search')) {
                        other = { name: 'Search', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWECmd=GetOUISearchLookinValues') || ~searchContent.indexOf('SWEMethod=GetOUISearchLookinValues')) {
                        other = { name: 'Open Search', event: event_1, page: page };
                    }
                    else if (~searchContent.indexOf('SWEService=SWE+Command+Manager&SWEMethod=BatchCanInvoke') && ~searchContent.indexOf('menu')) {
                        other = { name: 'Menu', event: event_1, page: page };
                    }
                }
            }
            else if (event_1.type === 'document ready' && page && page.query) {
                if (~page.query.indexOf('SWECmd=Login')) {
                    other = { name: 'Login', event: null, page: page };
                }
                else if (~page.query.indexOf('SWECmd=Logoff')) {
                    other = { name: 'Logoff', event: null, page: page };
                }
                else if (~page.query.indexOf('SWECmd=Start')) {
                    other = { name: 'Start', event: null, page: page };
                }
            }
            else if (event_1.type === 'native popup opening') {
                if (event_1.dialogType === 'alert' && event_1.message && event_1.message.indexOf('SBL-') > -1) {
                    userClick.success = false;
                }
            }
        }
        if (viewName || appletName) {
            if (navigate) {
                navigate.name = 'Navigation ' + (appletName || viewName);
            }
            else if (drillDown) {
                drillDown.name = 'Drilldown ' + (appletName || viewName);
            }
        }
        // set name & hierarchy & http
        var result = navigate || drillDown || pdq || viewLayout || other;
        if (result) {
            userClick.name = result.name;
            userClick.hierarchy = extractHierarchyDimensionFromNetworkFact(result.event, result.page);
            if (result.page) {
                userClick.page = result.page;
                if (userClick.page && userClick.page.query) {
                    userClick.page.query = userClick.page.query.replace(/\+/g, ' ');
                }
            }
        }
    }
    function customLogout() {
        return {
            emits: ['session end'],
            installer: function (window, settings, fire, services) {
                services.onMonitoringEvent('click', function (event) {
                    if (event.target && germainApm.utils.instanceOf(event.target, HTMLAnchorElement)) {
                        var innerText = event.target.innerText || '';
                        innerText = innerText.trim().replace(/  +/g, ' '); // replace multiple spaces
                        if (innerText && settings.constants.sessionMarkerEnd && ~settings.constants.sessionMarkerEnd.indexOf(innerText)) {
                            fire({ type: 'session end', reason: 'logout' });
                            germainApm.uninstall(true, true);
                        }
                    }
                });
                services.onMonitoringEvent('keyboard command', function (event) {
                    if (event.combinationLabel === 'Shift + Ctrl + X') {
                        fire({ type: 'session end', reason: 'logout' });
                        germainApm.uninstall(true, true);
                    }
                });
                var popupMsg = null;
                services.onMonitoringEvent('native popup opening', function (event) {
                    popupMsg = event.message;
                });
                services.onMonitoringEvent('native popup closed', function (event) {
                    if (popupMsg && popupMsg.indexOf('Your session timed out because you were idle for too long') > -1) {
                        fire({ type: 'session end', reason: 'user inactive' });
                        germainApm.uninstall(true, true);
                    }
                });
                //Your session is going to expire. Please click OK to extend the session.
                return function () { };
            }
        };
    }
    function uiHierarchyProvider() {
        var first = document.querySelector('div[title="First Level View Bar"] li.ui-tabs-active');
        var second = document.querySelector('div[title="Second Level View Bar"] li.ui-tabs-active');
        var hierarchy = [];
        if (first)
            hierarchy.push(first.innerText);
        if (second)
            hierarchy.push(second.innerText);
        if (!hierarchy.length && germainApm.native.documentQuerySelector(window.document, '.siebui-login_body'))
            hierarchy.push('Login');
        return hierarchy;
    }
    function serviceRequestIntervalsDataGenerator(on, submit, settings, services, replay) {
        var stepNames = ['Open', 'Pending', 'Closed', 'Cancelled', 'Exception Handling', 'Quoted', 'In Progress', 'Completed', 'Submitted', 'Approved', 'Revised', 'Rejected', 'Escalated', 'Not Started', 'Submitted for Approval', 'Reviewed with Comments'];
        var endStepNames = ['Closed', 'Canceled', 'Completed', 'Rejected'];
        new germainApm.utils.StaticBusinessProcess('Siebel:SR Interval', on, function (lastKnown) {
            var srAppletNode = germainApm.native.documentQuerySelector(document, '[title="Service Request Form Applet"]');
            var srIdNode = srAppletNode ? srAppletNode.querySelector('input[aria-label="SR #"]') : null;
            var srStatusNode = srAppletNode ? srAppletNode.querySelector('input[aria-label="Status"]') : null;
            var srTypeNode = srAppletNode ? srAppletNode.querySelector('input[aria-label="Type"]') : null;
            var srAreaNode = srAppletNode ? srAppletNode.querySelector('input[aria-label="Area"]') : null;
            var srSubareaNode = srAppletNode ? srAppletNode.querySelector('input[aria-label="Subarea"]') : null;
            var srStatusOnPage = srStatusNode ? srStatusNode.value : null;
            var statusIndex = srStatusOnPage ? stepNames.indexOf(srStatusOnPage) : -1;
            if (srIdNode && srStatusOnPage && ~endStepNames.indexOf(srStatusOnPage) && (!lastKnown.stepName || !~endStepNames.indexOf(lastKnown.stepName))) {
                var endFact = {
                    myClassName: 'UxEvent', type: 'Siebel:Service Request End', timestamp: replay.window.Date.now(),
                    name: null, details: null, sequence: '', success: true,
                    businessObject: srIdNode.value,
                };
                submit({ time: endFact.timestamp, type: 'fact', fact: endFact });
            }
            return {
                stepName: srStatusOnPage,
                stepOrdinal: statusIndex < 0 ? null : statusIndex,
                srId: srIdNode ? srIdNode.value : null,
                srType: srTypeNode ? srTypeNode.value : null,
                srArea: srAreaNode ? srAreaNode.value : null,
                srSubarea: srSubareaNode ? srSubareaNode.value : null,
            };
        }, function (fact, metadata) {
            fact.hierarchy.level1 = metadata.srType || undefined;
            fact.hierarchy.level2 = metadata.srArea || undefined;
            fact.hierarchy.level3 = metadata.srSubarea || undefined;
            fact.businessObject = metadata.srId;
            if (fact.duration === 0)
                fact.duration = .2; // eventDebounce in seconds
            submit({ time: fact.timestamp, type: 'fact', fact: fact });
        }, {
            idleThresholdMillis: 5 * 60 * 1000,
            eventDebounceMillis: 2 * 1000, // 2 seconds
        });
    }
    

Application Error Tagging for Oracle Siebel CRM Object Manager

Here is how to map all Siebel custom error codes to their corresponding display messages visible to your end users. To configure this mapping, please follow the steps below:

  • Extract all of your Siebel Error codes using errmsg.exe Siebel’s utility (available only on Windows platforms). Siebel keeps these codes in the resource catalogs (core.cat, apps.cat, vsia.cat, inst.cat, …) in the %SIEBEL_ROOT%\bin\%language_folder%. Example below shows how to extract these codes from Siebel resource catalog in English language format:

    CODE
    %SIEBEL_ROOT%\bin\errmsg.exe /l ENU enu\core.cat > errors.txt
  • Review errors.txt output file and find all of your custom errors, e.g.

    CODE
    ...
    SBL-GEN-02011 Error parsing Siebel message file header: incorrect facility name
    ...
  • Once all custom error code extracted from the errors.txt file, insert them into SIEBEL_ERROR_CODE_MAPPING table available in your Germain UX Datastore. Example below for MySQL database:

CODE
INSERT INTO SIEBEL_ERROR_CODE_MAPPING (CODE,MESSAGE) VALUES ('SBL-GEN-02011','Error parsing Siebel message file header: incorrect facility name');

Alert and/or Report

Here is how to be alerted immediately when a new error occurs or receive automatic report to help understand error volume, up and down trends.

Visualize & Analyze Siebel Errors

Here is how to build analytics on Errors of Oracle Siebel CRM.

Add a portlet and set it up as following:

  • KPI = “Siebel JavaScript Popup Dialog”
    (or any other KPI you have created in connection with the above error monitoring).

  • Pivot = “Message”

  • Filters = “userError == true”

siebel error con.png

Add “Siebel JavaScript Popup Dialog” KPI on a portlet - Germain UX

This is how the portlet would look like:

siebel error con2.png

Siebel Error portlet - Germain UX

  • Exclude Errors
    If you still need to ignore/exclude some of the errors that show up, set a filter as following:

    image-20240227-165033.png

    Filter in or out specific Siebel errors - Germain UX

Component: Engine

Feature Availability: 2014.1 or later

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.