Skip to content

Commit 9484c4b

Browse files
authored
LogHandler.loadOrganizationLimits() System.OrgLimits optimisation (#802)
* Updated LogHandler class to cache the Apex call to System.OrgLimits.getMap() to reduce CPU usage * Added some comments + updated some existing variable names & class name to include 'serializable' to provide a little more context on why there is a custom class for org limits
1 parent 6608157 commit 9484c4b

8 files changed

Lines changed: 39 additions & 34 deletions

File tree

README.md

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55

66
The most robust observability solution for Salesforce experts. Built 100% natively on the platform, and designed to work seamlessly with Apex, Lightning Components, Flow, OmniStudio, and integrations.
77

8-
## Unlocked Package - v4.15.0
8+
## Unlocked Package - v4.15.1
99

10-
[![Install Unlocked Package in a Sandbox](./images/btn-install-unlocked-package-sandbox.png)](https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015odKQAQ)
11-
[![Install Unlocked Package in Production](./images/btn-install-unlocked-package-production.png)](https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015odKQAQ)
10+
[![Install Unlocked Package in a Sandbox](./images/btn-install-unlocked-package-sandbox.png)](https://test.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015ohhQAA)
11+
[![Install Unlocked Package in Production](./images/btn-install-unlocked-package-production.png)](https://login.salesforce.com/packaging/installPackage.apexp?p0=04t5Y0000015ohhQAA)
1212
[![View Documentation](./images/btn-view-documentation.png)](https://github.com/jongpie/NebulaLogger/wiki)
1313

14-
`sf package install --wait 20 --security-type AdminsOnly --package 04t5Y0000015odKQAQ`
14+
`sf package install --wait 20 --security-type AdminsOnly --package 04t5Y0000015ohhQAA`
1515

1616
---
1717

nebula-logger/core/main/log-management/classes/LogHandler.cls

Lines changed: 18 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
public without sharing class LogHandler extends LoggerSObjectHandler {
1212
private static final Map<String, LogStatus__mdt> MOCK_LOG_STATUS_TO_STATUS = new Map<String, LogStatus__mdt>();
1313

14-
private static final List<OrganizationLimit> ORGANIZATION_LIMITS {
14+
private static final List<SerializableOrganizationLimit> ORGANIZATION_LIMITS {
1515
get {
1616
if (ORGANIZATION_LIMITS == null) {
1717
ORGANIZATION_LIMITS = loadOrganizationLimits();
@@ -40,7 +40,7 @@ public without sharing class LogHandler extends LoggerSObjectHandler {
4040
this.loggerScenariosById = queryLoggerScenarios(this.logs);
4141

4242
this.setClosedStatusFields();
43-
this.setOrganizationLimits();
43+
this.setSerializableOrganizationLimits();
4444
// The log OwnerId field should support being manually changed, so only auto-set it on insert
4545
this.setOwnerId();
4646
this.setParentLog();
@@ -87,7 +87,7 @@ public without sharing class LogHandler extends LoggerSObjectHandler {
8787
}
8888
}
8989

90-
private void setOrganizationLimits() {
90+
private void setSerializableOrganizationLimits() {
9191
if (LoggerParameter.STORE_ORGANIZATION_LIMITS == false) {
9292
return;
9393
}
@@ -285,21 +285,22 @@ public without sharing class LogHandler extends LoggerSObjectHandler {
285285
return logStatusNameToStatus;
286286
}
287287

288-
private static List<OrganizationLimit> loadOrganizationLimits() {
289-
List<OrganizationLimit> organizationLimits = new List<OrganizationLimit>();
288+
private static List<SerializableOrganizationLimit> loadOrganizationLimits() {
289+
List<SerializableOrganizationLimit> serializableOrganizationLimits = new List<SerializableOrganizationLimit>();
290+
Map<String, System.OrgLimit> systemOrgLimits = System.OrgLimits.getMap();
290291

291-
List<String> systemOrgLimitNames = new List<String>(System.OrgLimits.getMap().keySet());
292+
List<String> systemOrgLimitNames = new List<String>(systemOrgLimits.keySet());
292293
systemOrgLimitNames.sort();
293294
for (String systemOrgLimitName : systemOrgLimitNames) {
294-
System.OrgLimit systemOrgLimit = System.OrgLimits.getMap().get(systemOrgLimitName);
295-
OrganizationLimit organizationLimit = new OrganizationLimit();
296-
organizationLimit.Name = systemOrgLimit.getName();
297-
organizationLimit.Used = systemOrgLimit.getValue();
298-
organizationLimit.Max = systemOrgLimit.getLimit();
299-
organizationLimits.add(organizationLimit);
295+
System.OrgLimit systemOrgLimit = systemOrgLimits.get(systemOrgLimitName);
296+
SerializableOrganizationLimit serializableOrganizationLimit = new SerializableOrganizationLimit();
297+
serializableOrganizationLimit.Name = systemOrgLimit.getName();
298+
serializableOrganizationLimit.Used = systemOrgLimit.getValue();
299+
serializableOrganizationLimit.Max = systemOrgLimit.getLimit();
300+
serializableOrganizationLimits.add(serializableOrganizationLimit);
300301
}
301302

302-
return organizationLimits;
303+
return serializableOrganizationLimits;
303304
}
304305

305306
private static Map<Id, LoggerScenario__c> queryLoggerScenarios(List<Log__c> logs) {
@@ -344,9 +345,12 @@ public without sharing class LogHandler extends LoggerSObjectHandler {
344345
MOCK_LOG_STATUS_TO_STATUS.put(logStatus.MasterLabel, logStatus);
345346
}
346347

348+
// The class System.OrgLimit isn't serializable, so this DTO is used instead
349+
// so that the serialized string can be stored in Log__c.OrganizationLimits__c.
350+
// The JSON data is then displayed on the Log__c page using a custom LWC.
347351
@SuppressWarnings('PMD.ApexDoc')
348352
@TestVisible
349-
private class OrganizationLimit {
353+
private class SerializableOrganizationLimit {
350354
public String Name { get; set; }
351355
public Integer Used { get; set; }
352356
public Integer Max { get; set; }

nebula-logger/core/main/logger-engine/classes/Logger.cls

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
global with sharing class Logger {
1616
// There's no reliable way to get the version number dynamically in Apex
1717
@TestVisible
18-
private static final String CURRENT_VERSION_NUMBER = 'v4.15.0';
18+
private static final String CURRENT_VERSION_NUMBER = 'v4.15.1';
1919
private static final System.LoggingLevel FALLBACK_LOGGING_LEVEL = System.LoggingLevel.DEBUG;
2020
private static final List<LogEntryEventBuilder> LOG_ENTRIES_BUFFER = new List<LogEntryEventBuilder>();
2121
private static final String MISSING_SCENARIO_ERROR_MESSAGE = 'No logger scenario specified. A scenario is required for logging in this org.';

nebula-logger/core/main/logger-engine/lwc/logger/loggerService.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ import LoggerServiceTaskQueue from './loggerServiceTaskQueue';
1010
import getSettings from '@salesforce/apex/ComponentLogger.getSettings';
1111
import saveComponentLogEntries from '@salesforce/apex/ComponentLogger.saveComponentLogEntries';
1212

13-
const CURRENT_VERSION_NUMBER = 'v4.15.0';
13+
const CURRENT_VERSION_NUMBER = 'v4.15.1';
1414

1515
const CONSOLE_OUTPUT_CONFIG = {
1616
messagePrefix: `%c Nebula Logger ${CURRENT_VERSION_NUMBER} `,

nebula-logger/core/tests/log-management/classes/LogHandler_Tests.cls

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -183,24 +183,24 @@ private class LogHandler_Tests {
183183
);
184184
log = [SELECT Id, HasOrganizationLimits__c, OrganizationLimits__c FROM Log__c WHERE Id = :log.Id];
185185
System.Assert.isTrue(log.HasOrganizationLimits__c);
186-
Map<String, LogHandler.OrganizationLimit> limitNameToExpectedOrganizationLimits = new Map<String, LogHandler.OrganizationLimit>();
186+
Map<String, LogHandler.SerializableOrganizationLimit> limitNameToExpectedOrganizationLimits = new Map<String, LogHandler.SerializableOrganizationLimit>();
187187
List<String> sortedSystemOrgLimitNames = new List<String>(System.OrgLimits.getMap().keySet());
188188
sortedSystemOrgLimitNames.sort();
189189
for (String systemOrgLimitName : sortedSystemOrgLimitNames) {
190190
System.OrgLimit systemOrgLimit = System.OrgLimits.getMap().get(systemOrgLimitName);
191-
LogHandler.OrganizationLimit organizationLimit = new LogHandler.OrganizationLimit();
191+
LogHandler.SerializableOrganizationLimit organizationLimit = new LogHandler.SerializableOrganizationLimit();
192192
organizationLimit.Name = systemOrgLimit.getName();
193193
organizationLimit.Used = systemOrgLimit.getValue();
194194
organizationLimit.Max = systemOrgLimit.getLimit();
195195
limitNameToExpectedOrganizationLimits.put(organizationLimit.Name, organizationLimit);
196196
}
197-
List<LogHandler.OrganizationLimit> returnedOrganizationLimits = (List<LogHandler.OrganizationLimit>) System.JSON.deserialize(
197+
List<LogHandler.SerializableOrganizationLimit> returnedOrganizationLimits = (List<LogHandler.SerializableOrganizationLimit>) System.JSON.deserialize(
198198
log.OrganizationLimits__c,
199-
List<LogHandler.OrganizationLimit>.class
199+
List<LogHandler.SerializableOrganizationLimit>.class
200200
);
201201
System.Assert.areEqual(limitNameToExpectedOrganizationLimits.size(), returnedOrganizationLimits.size());
202-
for (LogHandler.OrganizationLimit returnedOrganizationLimit : returnedOrganizationLimits) {
203-
LogHandler.OrganizationLimit expectedOrganizationLimit = limitNameToExpectedOrganizationLimits.get(returnedOrganizationLimit.Name);
202+
for (LogHandler.SerializableOrganizationLimit returnedOrganizationLimit : returnedOrganizationLimits) {
203+
LogHandler.SerializableOrganizationLimit expectedOrganizationLimit = limitNameToExpectedOrganizationLimits.get(returnedOrganizationLimit.Name);
204204
// Some limits are recalculated, even during a single transaction,
205205
// so ensure that the expected limit's Used value is at least higher than the returned limit's Used value
206206
System.Assert.isTrue(expectedOrganizationLimit.Used >= returnedOrganizationLimit.Used);

nebula-logger/managed-package/sfdx-project.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
"postInstallScript": "LoggerInstallHandler",
1212
"scopeProfiles": true,
1313
"ancestorVersion": "HIGHEST",
14-
"versionNumber": "4.15.0.NEXT",
15-
"versionName": "Winter '25 Release",
16-
"versionDescription": "View the v4.15.0 milestone in GitHub for the list of changes - https://github.com/jongpie/NebulaLogger/milestone/15?closed=1",
17-
"releaseNotesUrl": "https://github.com/jongpie/NebulaLogger/releases/tag/v4.15.0"
14+
"versionNumber": "4.16.0.NEXT",
15+
"versionName": "Spring '25 Release",
16+
"versionDescription": "View the v4.16.0 milestone in GitHub for the list of changes - https://github.com/jongpie/NebulaLogger/milestone/16?closed=1",
17+
"releaseNotesUrl": "https://github.com/jongpie/NebulaLogger/releases/tag/v4.16.0"
1818
}
1919
],
2020
"packageAliases": {

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "nebula-logger",
3-
"version": "4.15.0",
3+
"version": "4.15.1",
44
"description": "The most robust logger for Salesforce. Works with Apex, Lightning Components, Flow, Process Builder & Integrations. Designed for Salesforce admins, developers & architects.",
55
"author": "Jonathan Gillespie",
66
"license": "MIT",

sfdx-project.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,9 +9,9 @@
99
"path": "./nebula-logger/core",
1010
"definitionFile": "./config/scratch-orgs/base-scratch-def.json",
1111
"scopeProfiles": true,
12-
"versionNumber": "4.15.0.NEXT",
13-
"versionName": "Winter '25 Release",
14-
"versionDescription": "Updated all metadata to API v62.0, replaced compact layouts with new dynamic highlights components in all flexipages",
12+
"versionNumber": "4.15.1.NEXT",
13+
"versionName": "System.OrgLimits Optimisations",
14+
"versionDescription": "Updated LogHandler class to cache the Apex call to System.OrgLimits.getMap() to reduce CPU usage",
1515
"releaseNotesUrl": "https://github.com/jongpie/NebulaLogger/releases",
1616
"unpackagedMetadata": {
1717
"path": "./nebula-logger/extra-tests"
@@ -204,6 +204,7 @@
204204
"Nebula Logger - Core@4.14.17-improved-javascript-console-output": "04t5Y0000015ocRQAQ",
205205
"Nebula Logger - Core@4.14.18-added-setrecord()-overload-for-list<id>-and-set<id>-parameters": "04t5Y0000015ocbQAA",
206206
"Nebula Logger - Core@4.15.0-winter-'25-release": "04t5Y0000015odKQAQ",
207+
"Nebula Logger - Core@4.15.1-system.orglimits-optimisations": "04t5Y0000015ohhQAA",
207208
"Nebula Logger - Core Plugin - Async Failure Additions": "0Ho5Y000000blO4SAI",
208209
"Nebula Logger - Core Plugin - Async Failure Additions@1.0.0": "04t5Y0000015lhiQAA",
209210
"Nebula Logger - Core Plugin - Async Failure Additions@1.0.1": "04t5Y0000015lhsQAA",

0 commit comments

Comments
 (0)