Salesforce.com Monitoring

 

Benefits

  • SalesForce.com User Experience Monitoring, Insights and Automation, real-time, 24x7 (via germainAPM’s Browser Extension)

  • SalesForce.com Application Performance Monitoring, Insights and Automation, real-time, 24x7 (via germainAPM’s Engine)

  • SalesForce.com Data Monitoring, Insights and Automation, real-time, 24x7 (via germainAPM’s Engine)

Integrations

Every data and transaction that Salesforce.com has made available to its Client is available to germainAPM, as long as the Client authorizes it. germainAPM integrates with all access points that are offered by SalesForce.com, including:

  • SalesForce.com User Interfaces (via germainAPM’s Browser Extension)

  • SalesForce.com Rest Apis (via germainAPM’s Engine)

  • SaesForce.com Logs (via germainAPM’s Engine)

Requirements

  • Salesforce "Lightning Experience" must be enabled

  • Salesforce permissions to use "Developer Console" (details here)

  • Salesforce domain configured (details here)

  • Browser incognito or other private browsing modes are not supported

  • Access to "Content Security Policy Trusted Sites" must be enabled

  • germain APM component must be injected on the default page (usually it is "Home Page")

  • germain APM component is supported on the following browsers: Google Chrome 26+, latest Microsoft Edge (Chromium based with Chrome Extension install permission enabled) and latest Mozilla Firefox

  • JavaScript and cookies must be enabled to run germain APM in your browser

  • HTTPS outbound traffic must be allowed from your browser(s) to the germain APM environment

Salesforce.com Real User Experience and Session Replay Monitoring

Deploy/enable germainAPM to ALL SalesForce.com Users (at once)

If you want to monitor all your SalesForce.com users at once, and you don’t want users to be able to enable/disable the monitoring.

As an administrator, you can automatically install (force-install) specific Chrome apps and extensions for users in your organization.

Download the latest Google policy templates - Google Policy Templates

Once downloaded -

  • Navigate to policy_templates\windows\admx

  • Copy the following files into C:\Windows\PolicyDefinitions on your administrative workstation

    • chrome.admx

    • google.admx

  • Navigate to policy_templates\windows\admx\en-US

  • Copy the following files into C:\Windows\PolicyDefinitions\en-US on your administrative workstation

    • chrome.adml

    • google.adml

 

In your Microsoft Windows Group Policy Editor (Computer or User Configuration folder):

  • Go to Administrative Templates  Google  Google Chrome Extensions.

  • Open Extension management settings.

  • Enable the policy and enter its compact JSON data in the text box.
    Note: Enter JSON data as a single line with no line breaks. You can use this third-party JSON compression tool to validate policies and compact them into a single line

    1 2 3 4 5 6 7 { "fkcljfeejffnjajnpjflfammljcmdfnh": { "installation_mode": "force_installed", "update_url": "https://clients2.google.com/service/update2/crx" } }

Note: The id for the extension is provided in the JSON above

 

After you deploy any Chrome extension policy, check user devices to make sure the policy was applied correctly.

  • On a managed Chrome device, browse to chrome://policy.

  • Click Reload policies.

  • Verify that the policy we deployed has been applied

 

Deploy germainAPM but let SalesForce.com Users manually enable it

If you want to let SalesForce.com users decide to enable/disable germainAPM as per their liking.
End-users must install the germainAPM browser extension to enable UI/UX monitoring

germainAPM browser extension configuration

Once configured, refresh the page. Your application is now ready to be monitored

Global Configuration

CSP Configuration

  • Go to "Setup"

  • Go to "CSP Trusted Sites" page

  • Add the following 4 trusted sites:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 Trusted Site Name = GermainAPM Trusted Site URL = Url of your germain APM root domain (e.g. https://abc.cloud.germainapm.com; ask germain Team how to find it if not sure) Active = true Context = All CSP Directives = Select All --- Trusted Site Name = SalesforceDomain Trusted Site URL = Url of your Salesforce domain (e.g. https://mycompanyname.my.salesforce.com; ask germain Team how to find it if not sure) Active = true Context = All CSP Directives = Select All --- Trusted Site Name = SalesforceLightningDomain Trusted Site URL = Similar to SalesforceDomain url but replace "my.salesforce.com" by "lightning.force.com" (e.g. https://mycompanyname.lightning.force.com; ask germain Team how to find it if not sure) Active = true Context = All CSP Directives = Select All --- Trusted Site Name = SalesforceContentDomain Trusted Site URL = Url of your Salesforce content domain (ask germain Team how to find it) Active = true Context = All CSP Directives = Select All
  • Configuration example:

Salesforce Lightning Configuration

Create germain APM Component

  • Go to "Setup"

  • Go to "Visualforce Components" page

  • Click on "Developer Console"

  • Create new "Lightning Component" from the "File" / "New" menu:

    • Name: "GermainAPMComponent"

    • Content:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 <aura:component implements="flexipage:availableForAllPageTypes" access="global"> <aura:handler name="init" value="{!this}" action="{!c.doInit}" /> <aura:method name="uxInstalled" action="{!c.uxInstalled}" access="PUBLIC" /> <aura:attribute name="currentUser" type="User" default="{'sObjecttype': 'User'}"/> <p class="slds-hide"> <span id="germain-apm-profile-email"> {!v.currentUser.Email} </span> <span id="germain-apm-profile-id"> {!v.currentUser.Id} </span> </p> <p aura:id="container" class="slds-hide"> <lightning:card title="germain APM" iconName="custom:custom11"> <div class="slds-grid slds-grid_vertical slds-align_absolute-center" aura:id="install"> <div class="slds-button slds-button_brand"> <p class="slds-p-around_small slds-text-heading_medium"> <lightning:formattedUrl aura:id="extensionUrl" value="" label="germain APM" target="_blank" /> </p> </div> <div> <lightning:formattedUrl value="https://germainapm.atlassian.net/wiki/spaces/germainAPM/pages/151289888/Salesforce.com+Monitoring" label="Documentation" target="_blank" /> </div> </div> </lightning:card> </p> </aura:component>
  • Create new controller for this component (ctrl+shift+2 or click "CONTROLLER" in the right-hand side menu):

    • Name: "GermainAPMComponentController"

    • Content:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 ({ doInit: function (component, event, helper) { // get user info and set it back for SFDC UI component.set("v.currentUser", $A.get("$SObjectType.CurrentUser")); // get other info var container = component.find('container'); var extensionUrl = component.find('extensionUrl'); var browserType = helper.getBrowserType(); // check if extension exists window.postMessage({type: 'germainapm.ping'}, '*'); if (browserType === 'CHROME' || browserType === 'EDGE' || browserType === 'FIREFOX') { // supported browser check // function to execute if extension doesnt exist var timeout = setTimeout(function () { window.postMessage({type: 'germainapm.notInstalled'}, '*'); // for SFDC classic $A.util.removeClass(container, 'slds-hide'); extensionUrl.set('v.value', browserType === 'FIREFOX' ? helper.EXT_IDS.FIREFOX : helper.EXT_IDS.CHROME); }, 2000); // listen if extension exists window.addEventListener('message', function (event) { if (event && event.data) { const msg = event.data; if(msg.type === 'germainapm.pong'){ clearTimeout(timeout); window.postMessage({type: 'germainapm.install', url: helper.GERMAIN_APM_URL, website: { url: window.location.origin, appName: helper.APP_NAME, profileName: helper.PROFILE_NAME, disableRemove: true}}, '*'); } else if(msg.type === 'germainapm.extinstalled'){ window.postMessage({type: 'germainapm.install', url: helper.GERMAIN_APM_URL, website: { url: window.location.origin, appName: helper.APP_NAME, profileName: helper.PROFILE_NAME, disableRemove: true}}, '*'); $A.util.addClass(container, 'slds-hide'); } } }, true); } }, uxInstalled: function (component, event, helper) { parent.postMessage({type: 'germainapm.dom.remove', selector: 'iframe[title="GermainApmPage"]'}, '*'); parent.postMessage({type: 'germainapm.install', url: helper.GERMAIN_APM_URL, website: { url: document.referrer || window.location.origin, appName: helper.APP_NAME, profileName: helper.PROFILE_NAME, disableRemove: true}}, '*'); } });
  • Create new helper for this component (ctrl+shift+3 or click "HELPER" in the right-hand side menu):

    • Name: "GermainAPMComponentController"

    • Content: 

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 ({ GERMAIN_APM_URL: 'YOUR_GERMAIN_APM_HOST', //e.g. https://germainapm.mydomain.com APP_NAME: 'Salesforce', PROFILE_NAME: 'Salesforce', EXT_IDS: { CHROME: 'https://chrome.google.com/webstore/detail/user-monitoring-for-webap/fkcljfeejffnjajnpjflfammljcmdfnh', FIREFOX: 'https://addons.mozilla.org/pl/firefox/addon/user-monitoring-for-webapp/' }, getBrowserType: function () { var browser = JSON.parse(JSON.stringify($A.get('$Browser'))); if (browser.isWEBKIT) { return 'CHROME'; } else if (browser.isFIREFOX) { return 'FIREFOX'; } else { var ua = window.navigator.userAgent.toLowerCase(); if (ua.indexOf('edg') > -1 && ua.indexOf('edge') === -1) { return 'EDGE'; } } return null; }, });
  • Replace with your germain APM URL (ask germain Team how to find it if not sure)

  • Create new "Lightning Application" from the "File" / "New" menu:

    • Name: "GermainAPMApplication"

    • Content: 

1 2 3 <aura:application access="global" extends="ltng:outApp" > <aura:dependency resource="YOUR_SALESFORCE_NAMESPACE:GermainAPMComponent"/> </aura:application>
  • Replace YOUR_SALESFORCE_NAMESPACE with your unique namespace (details here)

Install germain APM Component

  • Go to your "Home Page" or any other default page on your Salesforce environment

  • Click "Edit Page" from the "Setup" menu

  • Add "GermainAPMComponent", from "Lightning Component" / "Custom" menu, to your page somewhere at the top

  • Save your changes and activate them ("Activate") for all profiles

  • Clear your browser cache and refresh your page

  • Your page should contain now germain APM Component, similar to this:

Salesforce Classic Configuration

Complete first all steps from “Salesforce Lightning” / “Configuration Create germain APM Component” (see above)

Create germain APM Component

  • Go to "Setup"

  • Go to "Visualforce Pages" page

  • Create new "Visualforce Page":

    • Name: "GermainAPMPage"

    • Enabled “Available for Lightning Experience, Experience Builder sites, and the mobile app“

    • Content:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 <apex:page > <apex:includeLightning /> <div id="lightning" /> <script> $Lightning.use("germainapm:germainApmApplication", function () { $Lightning.createComponent("germainapm:germainAPM", {}, "lightning", function (component) { // create component var createComponentId = setTimeout(function () { var elements = component.getElements(); if (elements && elements.length === 2) { var container = elements[1]; container.removeAttribute('class'); var header = container.getElementsByClassName('slds-card__header slds-grid'); if (header && header[0]) header[0].remove(); } }, 1000); // listen for messages window.addEventListener('message', function (event) { if (event && event.data) { if (event.data.type === 'germainapm.pong') { clearTimeout(createComponentId); component.uxInstalled(); } } }); // check if extensio exists parent.postMessage({type: 'germainapm.ping'}, '*'); }); }); </script> </apex:page>

Install germain APM Component

  • Go to "Setup"

  • Go to "Home Page Components" page

  • Click “New” in “Custom Components” section

    • Name: “GermainApmCustomComponent”

    • Type: “Visualforce Area“

    • Component Position: “Narrow Left”

    • Visualforce Page: select “GermainAPMPage”

    • Height: 130

  • Go to “Home Page Layouts” page

  • Edit “Home”

  • Enabled “GermainApmCustomComponent” in “Select Narrow Components to Show” section

  • Arrange “GermainApmCustomComponent” and put it as first item in “Narrow (Left) Column”

  • Save your changes

  • Clear your browser cache and refresh your page

  • Your page should contain now germain APM Component, similar to this:

Chrome and Edge Extension

From Salesforce

  • Configure Salesforce germain APM Component first (guide above)

  • Follow steps below (“From Chrome Web Store”)

From Chrome Web Store

Firefox Extension

From Salesforce

  • Configure Salesforce germain APM Component first (guide above)

  • Follow steps below (“From Firefox Browser Add-Ons”)

From Firefox Browser Add-Ons

SalesForce.com Data Monitoring

  • Monitoring allows to collect data changes executed by your Salesforce end users

  • Available for the following object operations:

    • CREATE (new record)

    • UPDATE (updated record)

    • DELETE (deleted record)

    • UNDELETE (undeleted record)

  • Supported only in Salesforce Lightning Experience (Spring '19 or above)

  • Available for standard and custom objects - details here

  • Salesforce License allocations apply - details here.

germainAPM Engine Configuration

You will need to configure a germainAPM Engine and use the HTTP/S component. Please contact us for details.

Creating new engine from inside germainAPM
  • Go to “APM State”

  • Click on the node where you want to deploy the engine

  • Under the “Engines” sub-section, click the add/plus button to add a new engine

  • Provide a name for the engine and click next

  • You may wish to review or change the Java parameters

  • Click Finish to deploy the engine

Deploy REST API Monitor on germainAPM Engine
  • Click the engine you have just created

  • Find the “Components” sub-section, click the add/plus button to add a new component

  • Select “HTTP Scenario Component Deployment“ from the down-down list

  • Fill in the required information -

    • Server - this is the salesforce endpoint

    • Credentials - username and password for REST API

    • Application Name - Salesforce

    • Component Type - select “Salesforce REST API Monitoring”

    • Protocol - change to HTTPS

    • Port - change to 443

    • Provide Monitor Name → Salesforce REST API Monitoring

    • Set a schedule to run every hour at 00 minutes

  • Click Finish

This will deploy the Salesforce REST API Monitor and it will begin collecting data

SalesForce.com Application Monitoring

OAuth App Configuration

  • Go to "Setup"

  • Go to "Apps" / “App Manager“ page

  • Click on “New Connected App” to create new app

    • Connected App Name: “germainAPMOAuth“

    • Contact Email: your email

    • Enable “Enable OAuth Settings”

    • Callback Url: “https://YOUR_GERMAIN_APM_HOST/germainapm/callback

    • Selected OAuth Scopes: “Full Access (full)”

    • Disable “Require Secret for Web Server Flow

    • Disable “Require Secret for Refresh Token Flow“

    • Save your changes

germainAPM Engine Configuration

You will need to configure a germainAPM Engine and use the HTTP/S component. Please contact us for details.

Creating new engine from inside germainAPM
  • Go to “APM State”

  • Click on the node where you want to deploy the engine

  • Under the “Engines” sub-section, click the add/plus button to add a new engine

  • Provide a name for the engine and click next

  • You may wish to review or change the Java parameters

  • Click Finish to deploy the engine

Deploy HTTP Log Monitor on germainAPM Engine
  • Click the engine you have just created

  • Find the “Components” sub-section, click the add/plus button to add a new component

  • Select “HTTP Log Monitor Deployment“ from the down-down list

  • Fill in the required information -

  • Server - this is the salesforce endpoint

  • Credentials - username and password for Salesforce access

  • Application Name - Salesforce

  • Component Type - select “Salesforce Event Log Monitoring”

  • Protocol - change to HTTPS

  • Port - change to 443

  • Set Login Host to “login.salesforce.com

  • Set path to the location where Salesforce log files(CSV) will be stored

  • Click Finish

This will deploy the Salesforce Event Log Monitor and it will begin collecting data

Deploy Log Directory Monitor on germainAPM Engine
  • On the same engine add another component

  • Select “Directory Monitor Deployment“ from the down-down list

  • Fill in the required information -

    • Component Type - select “Salesforce Log Directory Monitoring” from the drop-down list

    • Path - choose the same path used in the previous component “HTTP Log Monitor“

    • Monitored Server - choose the Salesforce server

    • Set Monitor Name to “Salesforce Directory Monitor”

  • Click Finish

Once deployed, this component will start to process all the Salesforce log files

Deploy Log Parser on germainAPM Engine
  • On the same engine add another component

  • Select “Parser Deployment“ from the down-down list

  • Fill in the required information -

    • Component Type - select “Salesforce Log Parser” from the drop-down list

    • Monitored Application - Choose Salesforce

    • Click Next

    • Set Monitor Name to “Salesforce Log Parser”

  • Click Finish

This component will start to parse all the Salesforce Log Files

 

Metrics/KPI for SaleForce.com

  • Application side

    • Actions Custom Apex

    • Actions Custom Flow

    • Actions Custom External Service

    • Apex Callout Event Type

    • Apex Execution Event Type

    • Apex Trigger Event Type

    • API Event Type

    • Aura Request Event Type

    • External OData Callout Event Type

    • Javascript Code Execution

    • Metadata API Operation Event Type

    • Queued Execution Event Type

    • Report Event Type

    • Report Export Event Type

    • REST API Event Type

    • URI Event Type

    • Visualforce Request Event Type

  • Business Process side

    • Process Step/Milestone performance

    • Dropoff

    • Status

    • Process Approvals

    • Process Rules

  • Data side

    • Records (amount of opportunities, accounts, leads, contacts, …)

    • Data Change (new record, update, deletion, undelete)

  • UX side

    • Connected users

    • User Type (Classic, Lightning)

    • Login/Logout event

    • Page Performance

    • Switch To Lightning

    • Switch To Classic

    • User Behavior

    • User Click

    • User Errors (oobt and Custom Errors - app or developer errors e.g. “Sorry or interrupt”, warnings, errors, asserts thrown into browser console by apex, views, developers, …)

    • User Session/Replay

  • Need something else? email us: support@germainapm.com

Automation for SalesForce.com

  • Alert - any alert you need for any SFDC User (any/customizable)

  • Auto-update of Data (any/customizable)

  • Synthetic Transaction for all SFDC (proactive detection of user issue, integration check, etc)

  • etc