Skip to main content
Skip table of contents

Crash Monitoring for Oracle Siebel CRM (Configure)

Features

Here are details on how to configure Germain UX so it detects and analyzes the cause of a Siebel CRM Object Manager crash.

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

Siebel OM Crash Analysis (Configure)

Germain is preconfigure to correlate and analyze the siebel enterprise, log, FDR and Core files that are produced as a result of a Siebel Object Manager crash.

Parser for Siebel OM Crash file (Core Dump)

  • Germain Workspace > Left Menu > Wizards > Parser

Parser for Siebel OM Crash file - Germain UX

  • Select the Germain Monitoring Node ( UX ) and Engine (DefaultEngine) , Click Next

  • Fill the details as

    • Component Type: Siebel Crash Parser (Windows/Unix as applicable)

    • Monitored Application: Siebel (or change if application name changed)

    • Monitored Application Component: None (or change if needed)

    • Number of instances: 1

  • Click Next, Verify the details and click Submi

Parser for Siebel FDR file (Flight Data Recorder)

  • Germain Workspace > Left Menu > Wizards > Parser

Parser for Siebel FDR file - Germain UX

  • Select the Germain Monitoring Node ( UX ) and Engine (DefaultEngine) , Click Next

  • Fill the details as-

    • Component Type: Siebel 8.x FDR Parser (or "Siebel 7.x FDR Parser" if Siebel 7.x)

    • Monitored Application: Siebel (or change if application name changed)

    • Monitored Application Component: None (or change if needed)

    • Number of instances: 1                            

  • Click Next, Verify the details and click Submit

Siebel OM Crash Categorization (Configure)

Germain now distinguishes the Siebel Object Manager crashes that are “new” from the ones that are already “known” and recurring.

Siebel Object Manager Crash Analyzed by Germain UX

new vs known om crash - Germain UX

Siebel Object Manager Crash Trend Reported by Germain UX

The following Siebel files are automatically analyzed by Germain UX:

  • Siebel Error:

    Siebel Object Manager Error detected by Germain UX

  • Siebel FDR file:

    Siebel FDR/Flight Data Recorder detected and analyzed by Germain UX

  • Siebel Core file:

    Siebel Core File detected and analyzed by Germain UX

Germain Workspace > left menu > Analytics > Categorization > Search for “Siebel Component Crash” or contact us if it isn't there.

Categorization of siebel crash - Germain UX

CODE
importClass(com.germainsoftware.data.Checksum);
importClass(com.germainsoftware.apm.storage.categorization.siebel.SiebelCoreCrashParserUtils);

var errorCodesWithoutCoreCrash = {
    'SBL-SMI-00062': true,  // Internal: No more process (multithreaded server) slots available
    'SBL-SVR-09127': true,  // Internal: Fail to initialize the shared memory resource for the process
};

try {
    var supportingFactIdentifiers = fact.details ? fact.details.split('|') : [];
    var coreCrash;
    var knownErrorCode;
    for (var i=0; i<supportingFactIdentifiers.length; i++) {
        var identifier = supportingFactIdentifiers[i].split(';');
        var factClassName = identifier[0];
        var factId = identifier[1];
        var factType = identifier[2];

        if (factType === 'Siebel:Enterprise Crash') {
            var errorCode = identifier[3];
            if (errorCode && (errorCodesWithoutCoreCrash[errorCode] || errorCode.indexOf('SBL-GEN-') === 0)) {
                knownErrorCode = errorCode;
            }
        } else if (factType === 'Siebel:Core Crash') {
            coreCrash = queryService.findById(factClassName, factId);
        }
    }

    if (knownErrorCode) {
        // If this crash is caused by an error that is known to not generate a Core Crash,
        // perform matching based only on error code, since this is all we have
        log.debug('FactID: {} - Categorizing based on Error code', fact.id, knownErrorCode);
        result.exactMatch = Checksum.calculate(knownErrorCode);
        result.fuzzyMatch = '';
    } else if (coreCrash) { 
        // If we have a Core Crash, use that to determine similarity of crashes
        log.debug('FactID: {} - Categorizing based on Core Crash', fact.id);
        var uninformativeFunctions = [
            { fileName: '/app/siebel/siebsrvr/lib/libsslcosd.so', method: '+0x7185' },
            { fileName: '/app/siebel/siebsrvr/lib/libsslcosd.so', method: '+0x797e' },
            { fileName: '/app/siebel/siebsrvr/lib/libsscdo90.so', method: '_ZN15CSSOraSqlCursorD1Ev+0x3f' },
            { fileName: '/app/siebel/siebsrvr/lib/libsscdo90.so', method: '_ZN15CSSOraSqlCursorD0Ev+0x22' },
            { fileName: '/app/siebel/siebsrvr/lib/libsscfdm.so', method: '_ZN16CSSLockSqlCursorD2Ev+0x77' },
            { fileName: '/app/siebel/siebsrvr/lib/libsscfdm.so', method: '_ZN16CSSLockSqlCursorD0Ev+0x22' },
        ];
        var ignore = {};
        uninformativeFunctions.forEach(function(f) { ignore[stackElementId(f, false)] = true; });

        // Remove recursion in the stack trace, and any generic functions that are not distinctive
        var stacktrace = SiebelCoreCrashParserUtils.parse(coreCrash.details);
        stacktrace = SiebelCoreCrashParserUtils.removeRecursion(stacktrace);
        stacktrace = stacktrace.filter(function(s) {
            return s.fileName && s.method
                && s.fileName.indexOf('/app/siebel/') === 0
                && !ignore[stackElementId(s, false)];
        });

        // Categorize stacktraces based on:
        // 1. Exact match of top 5 function calls
        // 2. Fuzzy matching of top 10 function calls (including location)
        var stacktraceId = stacktrace
            .map(function(s) { return stackElementId(s, false); })
            .slice(0, 5)
            .join('|');
        result.exactMatch = Checksum.calculate(stacktraceId);
        result.fuzzyMatch = stacktrace
            .map(function(s) { return stackElementId(s, true); })
            .slice(0, 10)
            .join('|');
    }
} catch (error) {
    log.error('Error during categorization: {}', error.message);
}

function stackElementId(element, includeLocation) {
    if (includeLocation) {
        return element.fileName + ';' + element.method + ';' + element.location;
    }
    return element.fileName + ';' + element.method;
}

In the above configuration, the categorization will consider facts from the 'Siebel Component Crash' KPI for categorization (other facts will be ignored). Facts are categorized by passing them through the Javascript script configured, this script performs some analysis of the fact (in this case, analyzes the crash stack trace and error code) to produce two values; an exact match and a fuzzy match. The exact match must match for facts to be considered in the same category, the fuzzy match must match within the configured match threshold (based on a string distance function) to be considered the same category.

KPIs

Please go here to see KPIs for Siebel Errors.

Dashboards

A number of dashboards are preconfigured for Siebel CRM, here are just a few main ones, but there might be more.

  • Go to Germain Workspace > Left Menu > Dashboards > All

  • Search for any “Siebel…” dashboards, such as:
    Siebel User Experience
    Siebel Availability

  • Search for portlets called “…Crash…” or create them or we can help.

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.