Double Feature: OmniStudio Logging + Loosely-Coupled Dependency Support
This release is a fun one - with one new Apex class, 2 great enhancements have been added to Nebula Logger
- It's now even easier for ISVs, consultants, and package developers to optionally leverage Nebula Logger when its available in your customers' orgs
- OmniStudio logging is now provided out of the box
Many thanks to @tscottdev for originally opening #371, as well as providing a very helpful sample implementation... and then waiting 2 years for me to finally be convinced that adding a Callable
implementation is a great enhancement 😅
Thanks as well to all of the feedback & interest people have provided about adding support for OmniStudio logging, and to @jamessimone for the help with setting up a usable OmniStudio scratch org for testing
Core Unlocked Package Changes
New Support for Using Nebula Logger as a Loosely-Coupled Dependency
Resolved #371 by introducing a new CallableLogger
Apex class that implements Apex's Callable interface - see the new wiki page for full docs.
This class provides dynamic access to Nebula Logger's core features - ISVs, consultants, and package developers can use this to optionally leverage Nebula Logger in a customer's org when it's available, without requiring a package dependency. For example, this sample code can be executed in any Salesforce org - and when Nebula Logger is available, 2 log entries will be saved.
// Dynamically create a instance Nebula Logger's Callable Apex class (if it's available)
Type nebulaLoggerCallableType = Type.forName('Nebula', 'CallableLogger') ?? Type.forName('CallableLogger');
Callable nebulaLoggerCallable = (Callable) nebulaLoggerCallableType?.newInstance();
if (nebulaLoggerCallable == null) {
return;
}
// Example action: Add a basic "hello, world!" INFO entry
Map<String, Object> infoEntryInput = new Map<String, Object>{
'loggingLevel' => System.LoggingLevel.INFO,
'message' => 'hello, world!'
};
nebulaLoggerCallable.call('newEntry', infoEntryInput);
// Example action: Add an ERROR entry with an Apex exception
Exception someException = new DmlException('oops');
Map<String, Object> errorEntryInput = new Map<String, Object>{
'exception' => someException,
'loggingLevel' => LoggingLevel.ERROR,
'message' => 'An unexpected exception was thrown'
};
nebulaLoggerCallable.call('newEntry', errorEntryInput);
// Example: Save any pending log entries
nebulaLoggerCallable.call('saveLog', null);
New Support for OmniStudio Logging
Resolved #644 by adding support for logging in OmniStudio, using the new CallableLogger
Apex class - see the new wiki page for full docs. The included CallableLogger
Apex class can be used in 2 places within OmniStudio:
-
OmniIntegrationProcedure
metadata
Once you've added logging in OmniStudio, any log entries generated in OmniStudio can be seen using the LogEntry__c
object's included list view AllOmniStudioLogEntries
Slack Plugin Package Changes
Fixed #764 by correcting the logic used in SlackLoggerPlugin
to format text fields containing line breaks
Thanks to @kacrouse for reporting this issue & providing the fix 🥳
Documentation Changes
Started rewriting & consolidating all documentation to live just in the wiki. Currently, content is split across the wiki, README.md
, and the GitHub Pages site
README.md
has been updated to link to wiki pages (instead of putting all content directly intoREADME.md
)- Eventually most of the content current in
README.md
will be removed/moved to the wiki
Pipeline Changes
- Renamed all of the scratch definition files (again 😅 )
- Updated
build.yml
so that 2 additional scratch orgs (6 total) are used for automated testing in the pipeline- "Advanced" scratch org (formerly called the 'dev' scratch org) - existing scratch org, but was not previously used by the pipeline
- "OmniStudio" scratch org - new scratch definition file, used to validate that queries on
OmniProcess
work correctly, and to validate that sampleOmniScript
andOmniIntegrationProcedure
metadata that leverageCallableLogger
can successfully be deployed
Installation Info
Core Unlocked Package - no namespace
- SF CLI:
sf package install --wait 20 --security-type AdminsOnly --package 04t5Y0000015oTdQAI
- SFDX CLI:
sfdx package install --apex-compile package --wait 20 --security-type AdminsOnly --package 04t5Y0000015oTdQAI
- Sandbox: https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015oTdQAI
- Production: https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015oTdQAI
Slack Unlocked Package Plugin - no namespace
- SF CLI:
sf package install --wait 20 --security-type AdminsOnly --package 04t5Y0000015oTTQAY
- SFDX CLI:
sfdx package install --apex-compile package --wait 20 --security-type AdminsOnly --package 04t5Y0000015oTTQAY
- Sandbox: https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015oTTQAY
- Production: https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015oTTQAY