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.
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 OpenUISample Code:
CODEvar 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 intoSIEBEL_ERROR_CODE_MAPPING
table available in your Germain UX Datastore. Example below for MySQL database:
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:
KPIs (any catching errors such as):
”Siebel JavaScript Popup Dialog” (primarily)
“Browser Event”
”Javascript Console Event”
”Outbound Http Request”
(or any other KPI you have created in conjunction to monitoring errors).
Measures:
“Count”, “Count Unique User”, etc
Pivots:
”Name” or ”Message”
(depending on the KPI)
Filters:
”User Error” = “true” or “userError” = “true “
(depending the version of GermainUX you are on)
This is how the portlet would look like:
Exclude Errors
If you still need to ignore/exclude some of the errors that show up, set a filter as following:
Critical Siebel error codes to monitor (may not apply to all environments)
SBL-SVR-01042
SBL-SRM-00016
SBL-OSD-00034,
SBL-GDB-00001
SBL-NET-01205
Component: Engine
Feature Availability: 2014.1 or later