What's Changed
New Features:
- Breadcrumbs: Record a trail of events leading up to an error via
recordBreadcrumb()andclearBreadcrumbs(). Breadcrumbs are automatically included in subsequentsend()/sendAsync()calls with timestamp, level, type, category, message, className, methodName, lineNumber, and customData fields (#46). - onBeforeSend hook: Register a callback via constructor or
setOnBeforeSend()to inspect, mutate, or cancel payloads before sending. Returnfalseto cancel, return a modified struct to mutate, or throw to proceed with the original payload. - Ignore exceptions list: Skip specific exception types via
ignoreExceptionsconstructor argument orsetIgnoreExceptions(). Case-insensitive matching (e.g.["MissingInclude", "AbortException"]). - Wildcard content filter keys:
RaygunContentFilternow supports glob-style*wildcards in filter patterns (e.g."pass*"matchespassword,passphrase,passCode). Exact-match filters continue to work as before. - Payload size enforcement: Payloads exceeding 128KB are automatically reduced by progressively stripping expendable fields (rawData, userCustomData, CGI data, headers, form). Form field values are truncated to 256 characters.
- Configurable API endpoint: Set a custom Raygun API endpoint via
RaygunSettings.apiEndpoint(default:https://api.raygun.com/entries). - HTTP timeout: All API requests now have a configurable timeout via
RaygunSettings.httpTimeout(default: 10 seconds). - Automatic retry: Failed HTTP requests are retried with configurable
RaygunSettings.maxRetries(default: 2) andRaygunSettings.retryDelay(default: 1 second). SetmaxRetries=0to disable. - Additional environment fields:
processorCount,locale, andutcOffsetare now captured in every error report. - Sample API key configuration: Samples now load the Raygun API key automatically from
samples/.env.json(gitignored) or theRAYGUN_API_KEYenvironment variable — no more manual copy-paste into each file.
Bug Fixes:
- Fixed settings not propagating to RaygunRequestMessage and RaygunResponseMessage
- Fixed empty stackTrace when Java stack trace is empty but CFML tag context is available
- Fixed case-sensitive exception type checks (e.g. "database" vs "Database")
- Fixed unsafe CGI scope access in RaygunRequestMessage and RaygunMessageDetails
- Fixed sync/async HTTP error handling inconsistency in RaygunClient
- Fixed thread name typo in async sending
- Fixed typed property defaults (
default=""on non-string typed properties) - Added
isNull()guards ongetSettings()/getContentFilter()to prevent NPE on strict engines
Code Quality:
- Centralized all magic strings and constants in
RaygunConfig(API endpoint, log file name, content types, HTTP methods, size limits, timeout/retry defaults) - Replaced
isClosure()withisCustomFunction()for cross-engine compatibility - 170+ test specs (up from 70), covering all components
- Added Lucee 6.2, 7.0, and 7.1 to test matrix (11 engines total)