Compact Receiver
Compact specific patterns' events into a template+values tuple, without redeploying the engine.
The compact receiver makes a per-event decision whether to emit via encode() (the pattern's template hash plus extracted variable values, typically 20–40× smaller than the original line) or preserve fullText. The decision is keyed by pattern identity (the same symbolMessage the Reporter attributes cost to), so an operator targets compaction at the same patterns surfaced in cost analysis.
Entries live in a CSV cap-file, typically committed to a git repo and edited by PR. The file is hot-reloaded on in-place writes; a merged PR takes effect within ~10 seconds, no pod restart.
Per-pattern caps
A cap-file declares, for each pattern, whether its events are compacted or preserved. Patterns not listed fall back to compactReceiverDefault.
File format, CSV with a header row, keyed by the fields named in compactReceiverFieldNames joined with _ (default: [symbolMessage]):
fieldSet, the event fields named bycompactReceiverFieldNamesjoined with_. With the default[symbolMessage]this is the symbolMessage value for the pattern.value,truecompacts viaencode();falseexplicitly preservesfullTextfor this pattern (beats the default).untilEpochSec, optional Unix-epoch (seconds) expiry. Past it the entry self-heals and the pattern falls back tocompactReceiverDefault.reason, optional free-text for audit. Must not contain commas (would break CSV parsing).
Example (with compactReceiverDefault: false):
fieldSet,value
payment_retry_gateway_timeout,true:1745856000:OPS-5123 spike
auth_audit_trail,false:1745856000:compliance keep verbose
The engine hot-reloads on in-place file writes (the gitops pattern); Kubernetes ConfigMap mounts don't reload because the CM swap is a symlink rename, not an in-place write.
Default policy
compactReceiverDefault sets the fallback decision when no cap-file entry matches:
false(default), preservefullText. Cap-file entries opt specific patterns into compaction. Right when most traffic is already high-signal.true, compact viaencode(). Cap-file entries opt specific patterns out of compaction (e.g. audit/compliance patterns that must stay verbose). Right when most traffic is low-signal machinery and only a few patterns need full-text fidelity.
Flipping the default is a policy decision that affects every event and requires a pod rollout. Cap-file edits handle per-pattern exceptions without restart.
Wiring
compactReceiver:
fieldNames: [symbolMessage] # fields joined to form the lookup key
default: false # fallback when no entry matches
lookup:
file: $=path("data/caps") + "/compact-cap.csv"
retain: $=parseDuration("10m")
- Setting
lookup.fileenables the per-pattern compaction path; leaving it unset preserves the pre-compact behavior (receive-only emitsfullText;receiverOptimize=truecompacts every event).
Tune these values in this config block, not via container environment variables. Any compactReceiver: key set here resolves to a launch argument at engine init and shadows a same-named env var, so env-only overrides are silently ignored. Edit the config (via a gitops PR) to change a value at runtime.
Config Files
To configure the compact receiver module, Edit these files.
Below is the default configuration from: compact/config.yaml.
ewogICJ0eXBlIiA6ICJvYmplY3QiLAogICJwcm9wZXJ0aWVzIiA6IHsKICAgICJpbmNsdWRlIiA6IHsKICAgICAgInR5cGUiIDogInN0cmluZyIKICAgIH0sCiAgICAidGVueCIgOiB7CiAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICB9LAogICAgImNvbXBhY3RSZWNlaXZlciIgOiB7CiAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogZmFsc2UsCiAgICAgICJwcm9wZXJ0aWVzIiA6IHsKICAgICAgICAibG9va3VwIiA6IHsKICAgICAgICAgICJ0eXBlIiA6ICJvYmplY3QiLAogICAgICAgICAgImFkZGl0aW9uYWxQcm9wZXJ0aWVzIiA6IGZhbHNlLAogICAgICAgICAgInByb3BlcnRpZXMiIDogewogICAgICAgICAgICAiZmlsZSIgOiB7CiAgICAgICAgICAgICAgInR5cGUiIDogWwogICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJQYXRoIG9yIFVSTCB0byBhIHBlci1wYXR0ZXJuIGNvbXBhY3QgZGVjaXNpb25zIGNhcC1maWxlXG5cblBvaW50cyB0aGUgZW5naW5lIGF0IGEgY2FwLWZpbGUgd2hvc2UgZW50cmllcyBkZWNpZGUgd2hldGhlciBlYWNoIHBhdHRlcm4ncyBldmVudHMgYXJlIGNvbXBhY3RlZCB2aWEgYGVuY29kZSgpYCBvciBwcmVzZXJ2ZWQgYXMgYGZ1bGxUZXh0YC4gUGF0dGVybnMgbm90IGxpc3RlZCBmYWxsIGJhY2sgdG8gYGNvbXBhY3RSZWNlaXZlckRlZmF1bHRgLiAgVGhlIGxvb2t1cCBrZXkgaXMgdGhlIGV2ZW50IGZpZWxkcyBuYW1lZCBieSBgY29tcGFjdFJlY2VpdmVyRmllbGROYW1lc2Agam9pbmVkIHdpdGggYF9gIChkZWZhdWx0cyB0byBgW3N5bWJvbE1lc3NhZ2VdYCksIG1hdGNoaW5nIHRoZSBzYW1lIHBhdHRlcm4gaWRlbnRpdHkgdGhlIFJlcG9ydGVyIGF0dHJpYnV0ZXMgY29zdCB0by4gICoqRmlsZSBmb3JtYXQqKiAoQ1NWOyBoZWFkZXIgcm93ICsgb25lIGNvbW1hLXNlcGFyYXRlZCBlbnRyeSBwZXIgcm93KTogIGBgYCBmaWVsZFNldCx2YWx1ZSA8ZmllbGRTZXQ+LDx0cnVlfGZhbHNlPls6PHVudGlsRXBvY2hTZWM+XVs6PHJlYXNvbj5dIGBgYCAgLSBgZmllbGRTZXRgIOKAlCB0aGUgZXZlbnQgZmllbGRzIG5hbWVkIGJ5IGBjb21wYWN0UmVjZWl2ZXJGaWVsZE5hbWVzYCAgIGpvaW5lZCB3aXRoIGBfYC4gV2l0aCB0aGUgZGVmYXVsdCBgW3N5bWJvbE1lc3NhZ2VdYCB0aGlzIGlzIHRoZSAgIHN5bWJvbE1lc3NhZ2UgdmFsdWUgZm9yIHRoZSBwYXR0ZXJuLiAtIGB2YWx1ZWAg4oCUIGB0cnVlYCAoY29tcGFjdCB2aWEgYGVuY29kZSgpYCkgb3IgYGZhbHNlYCAoZXhwbGljaXRseSAgIHByZXNlcnZlIGBmdWxsVGV4dGAgZm9yIHRoaXMgcGF0dGVybiwgYmVhdGluZyB0aGUgZGVmYXVsdCkuIC0gYHVudGlsRXBvY2hTZWNgIOKAlCBvcHRpb25hbCBVbml4LWVwb2NoIChzZWNvbmRzKSBleHBpcnkuIFBhc3QgaXQgdGhlICAgZW50cnkgYmVjb21lcyBhIG5vLW9wIGFuZCB0aGUgcGF0dGVybiBmYWxscyBiYWNrIHRvICAgYGNvbXBhY3RSZWNlaXZlckRlZmF1bHRgLiAtIGByZWFzb25gIOKAlCBvcHRpb25hbCBmcmVlLXRleHQgZm9yIGF1ZGl0LiBNdXN0IG5vdCBjb250YWluIGNvbW1hcyAgICh3b3VsZCBicmVhayBDU1YgcGFyc2luZykuICAqKkV4YW1wbGUqKjogIGBgYCBmaWVsZFNldCx2YWx1ZSBwYXltZW50X3JldHJ5X2dhdGV3YXlfdGltZW91dCx0cnVlOjE3NDU4NTYwMDA6T1BTLTUxMjMgc3Bpa2UgYXV0aF9hdWRpdF90cmFpbCxmYWxzZToxNzQ1ODU2MDAwOmNvbXBsaWFuY2Uga2VlcCB2ZXJib3NlIGBgYCAgVGhlIGZpbGUgaXMgaG90LXJlbG9hZGVkIG9uIGluLXBsYWNlIHdyaXRlcyAodGhlIGdpdG9wcyBwYXR0ZXJuKTsgYSBLdWJlcm5ldGVzIGBDb25maWdNYXBgIG1vdW50IHdvbid0IHJlbG9hZCBiZWNhdXNlIHRoZSBDTSBzd2FwIGlzIGEgc3ltbGluayByZW5hbWUsIG5vdCBhbiBpbi1wbGFjZSB3cml0ZS4iCiAgICAgICAgICAgIH0sCiAgICAgICAgICAgICJyZXRhaW4iIDogewogICAgICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgICAgICJudW1iZXIiLAogICAgICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICAgICAibnVsbCIKICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJSZXRlbnRpb24gcGVyaW9kIGZvciB0aGUgcGVyLXBhdHRlcm4gY2FwLWZpbGUgYmVmb3JlIGl0IGlzIGNvbnNpZGVyZWQgc3RhbGVcblxuRGVmaW5lcyB0aGUgcmV0ZW50aW9uIHBlcmlvZCAoaW4gbWlsbGlzZWNvbmRzKSBmb3IgdGhlIGNhcC1maWxlIChgY29tcGFjdFJlY2VpdmVyTG9va3VwRmlsZWApLiBJZiB0aGUgZmlsZSdzIGxhc3QgbW9kaWZpZWQgdGltZSBpcyBvbGRlciB0aGFuIHRoaXMgcGVyaW9kLCBhIHdhcm5pbmcgaXMgbG9nZ2VkLiBUaGUgY2FwIGVudHJpZXMgY29udGludWUgdG8gYXBwbHk7IHRoZSBzdGFsZW5lc3MgY2hlY2sgaXMgYWR2aXNvcnkgc28gb3BlcmF0b3JzIG5vdGljZSB3aGVuIGFuIGF1dG9tYXRlZCB0b29saW5nIHBpcGVsaW5lIGhhcyBzdG9wcGVkIHVwZGF0aW5nIHRoZSBmaWxlLiAgKipWYWxpZGF0aW9uKio6IG11c3QgYmUgZ3JlYXRlciB0aGFuIDYwMDAwbXMgKDEgbWludXRlKS4gKEFjY2VwdHMgbnVtYmVyIG9yIHN0cmluZyB3aXRoICQ9IHByZWZpeCBmb3IgcnVudGltZSBldmFsdWF0aW9uKSAoRGVmYXVsdDogMzAwMDAwKSIsCiAgICAgICAgICAgICAgImRlZmF1bHQiIDogMzAwMDAwCiAgICAgICAgICAgIH0KICAgICAgICAgIH0KICAgICAgICB9LAogICAgICAgICJmaWVsZE5hbWVzIiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgImFycmF5IiwKICAgICAgICAgICAgInN0cmluZyIsCiAgICAgICAgICAgICJudWxsIgogICAgICAgICAgXSwKICAgICAgICAgICJtYXJrZG93bkRlc2NyaXB0aW9uIiA6ICJFdmVudCBmaWVsZHMgam9pbmVkIHRvIGZvcm0gZWFjaCBldmVudCdzIGNhcC1maWxlIGxvb2t1cCBrZXlcblxuRGVmaW5lcyB0aGUgbGlzdCBvZiBUZW5YT2JqZWN0IGZpZWxkIG5hbWVzIGpvaW5lZCB3aXRoIGBfYCB0byBmb3JtIGVhY2ggZXZlbnQncyBsb29rdXAga2V5IGludG8gdGhlIGNhcC1maWxlLiBNYXRjaGVzIHRoZSByYXRlIHJlY2VpdmVyJ3MgYHJhdGVSZWNlaXZlckZpZWxkTmFtZXNgLCBzbyBhIGNhcC1maWxlIGVudHJ5IHRhcmdldHMgdGhlIHNhbWUgcGF0dGVybiBpZGVudGl0eSB0aGUgUmVwb3J0ZXIgYXR0cmlidXRlcyBjb3N0IHRvLiAgKipEZWZhdWx0Kio6IGBbc3ltYm9sTWVzc2FnZV1gIOKAlCB0aGUgc3ltYm9sTWVzc2FnZSBmaWVsZCwgd2hpY2ggaXMgdGhlIHN0YWJsZSBwYXR0ZXJuIGlkZW50aXR5IHByb2R1Y2VkIGJ5IHRoZSBlbmdpbmUncyBjbGFzc2lmaWVyLiAgTXVsdGktZGltZW5zaW9uYWwgY29tcGFjdGlvbiAoZS5nLiwgY29tcGFjdCBhIHBhdHRlcm4gb25seSBmb3IgYSBzcGVjaWZpYyB0ZW5hbnQpOiAgYGBgeWFtbCBjb21wYWN0UmVjZWl2ZXJGaWVsZE5hbWVzOiAgIC0gc3ltYm9sTWVzc2FnZSAgIC0gdGVuYW50SWQgYGBgICBDaGFuZ2luZyB0aGlzIGZpZWxkIHNldCByZXF1aXJlcyBhbiBlbmdpbmUgcmVzdGFydC4gKERlZmF1bHQ6IFtcInN5bWJvbE1lc3NhZ2VcIl0pIiwKICAgICAgICAgICJpdGVtcyIgOiB7CiAgICAgICAgICAgICJ0eXBlIiA6ICJzdHJpbmciCiAgICAgICAgICB9LAogICAgICAgICAgImRlZmF1bHQiIDogWwogICAgICAgICAgICAic3ltYm9sTWVzc2FnZSIKICAgICAgICAgIF0KICAgICAgICB9LAogICAgICAgICJkZWZhdWx0IiA6IHsKICAgICAgICAgICJ0eXBlIiA6IFsKICAgICAgICAgICAgImJvb2xlYW4iLAogICAgICAgICAgICAic3RyaW5nIiwKICAgICAgICAgICAgIm51bGwiCiAgICAgICAgICBdLAogICAgICAgICAgIm1hcmtkb3duRGVzY3JpcHRpb24iIDogIkZhbGxiYWNrIGNvbXBhY3Rpb24gZGVjaXNpb24gd2hlbiBubyBjYXAtZmlsZSBlbnRyeSBhcHBsaWVzXG5cbkNvbnRyb2xzIHRoZSBmYWxsYmFjayBkZWNpc2lvbiB3aGVuIG5vIGNhcC1maWxlIGlzIGxvYWRlZCwgbm8gZW50cnkgbWF0Y2hlcyBhbiBldmVudCdzIHBhdHRlcm4sIG9yIGEgbWF0Y2hpbmcgZW50cnkgaGFzIGV4cGlyZWQuICAtIGBmYWxzZWAgKGRlZmF1bHQpIOKAlCBwcmVzZXJ2ZSBgZnVsbFRleHRgLiBDYXAtZmlsZSBlbnRyaWVzIG9wdCAgIHNwZWNpZmljIHBhdHRlcm5zIElOVE8gY29tcGFjdGlvbi4gLSBgdHJ1ZWAg4oCUIGNvbXBhY3QgdmlhIGBlbmNvZGUoKWAuIENhcC1maWxlIGVudHJpZXMgb3B0IHNwZWNpZmljICAgcGF0dGVybnMgT1VUIChlLmcuLCBhdWRpdC9jb21wbGlhbmNlIHBhdHRlcm5zIHRoYXQgbXVzdCBzdGF5ICAgdmVyYm9zZSkuICBGbGlwcGluZyB0aGlzIHZhbHVlIGlzIGEgcG9saWN5LWxldmVsIGRlY2lzaW9uIChhZmZlY3RzIGV2ZXJ5IGV2ZW50KSwgbm90IGEgY2FwLWZpbGUgZWRpdC4gQ2hhbmdpbmcgaXQgcmVxdWlyZXMgYSBwb2Qgcm9sbG91dC4gVGhlIGNhcC1maWxlIGhhbmRsZXMgcGVyLXBhdHRlcm4gb3ZlcnJpZGVzIHdpdGhvdXQgcmVzdGFydC4gKEFjY2VwdHMgYm9vbGVhbiBvciBzdHJpbmcgd2l0aCAkPSBwcmVmaXggZm9yIHJ1bnRpbWUgZXZhbHVhdGlvbikiCiAgICAgICAgfQogICAgICB9CiAgICB9CiAgfSwKICAiYWRkaXRpb25hbFByb3BlcnRpZXMiIDogdHJ1ZQp9
# 🔟❎ 'run' compact receiver configuration
# Per-pattern compaction decision via a declarative cap-file.
# The forwarder output stream emits encode() for listed patterns and
# fullText for everyone else (or vice versa via per-pattern opt-out).
# To learn more see https://doc.log10x.com/run/receive/compact/
# Set the 10x pipeline to 'run'
tenx: run
# =============================== Dependencies ================================
include: run/modules/receive/compact
# ============================ Compact Options ================================
compactReceiver:
# 'fieldNames' defines the TenXObject fields joined with underscores to form
# each event's lookup key. Defaults to [symbolMessage], matching the rate
# receiver's rateReceiverFieldNames so MCP-authored entries address the same
# pattern_hash the Reporter attributes cost to.
fieldNames:
- symbolMessage
# 'default' is the fallback when no cap-file entry matches the event's
# pattern. `false` (default) preserves fullText; `true` compacts via
# encode(). The cap-file's per-pattern decision overrides this per event.
default: false
lookup:
# 'file' specifies the per-pattern cap-file path. Hot-reloaded on in-place
# writes (the gitops pattern); Kubernetes ConfigMap mounts won't reload.
# Comment out to disable the cap-file (every event follows 'default' above).
# file: $=path("data/sample/compact") + "/compact-cap.csv"
# 'retain' specifies the period before the file is marked as stale.
retain: $=parseDuration("10m")
Options
Specify the options below to configure the compact receiver:
| Name | Description |
|---|---|
| compactReceiverLookupFile | Path or URL to a per-pattern compact decisions cap-file |
| compactReceiverLookupRetain | Retention period for the per-pattern cap-file before it is considered stale |
| compactReceiverFieldNames | Event fields joined to form each event's cap-file lookup key |
| compactReceiverDefault | Fallback compaction decision when no cap-file entry applies |
compactReceiverLookupFile
Path or URL to a per-pattern compact decisions cap-file.
| Type | Default |
|---|---|
| String | "" |
Points the engine at a cap-file whose entries decide whether each
pattern's events are compacted via encode() or preserved as
fullText. Patterns not listed fall back to compactReceiverDefault.
The lookup key is the event fields named by compactReceiverFieldNames
joined with _ (defaults to [symbolMessage]), matching the same
pattern identity the Reporter attributes cost to.
File format (CSV; header row + one comma-separated entry per row):
fieldSet, the event fields named bycompactReceiverFieldNamesjoined with_. With the default[symbolMessage]this is the symbolMessage value for the pattern.value,true(compact viaencode()) orfalse(explicitly preservefullTextfor this pattern, beating the default).untilEpochSec, optional Unix-epoch (seconds) expiry. Past it the entry becomes a no-op and the pattern falls back tocompactReceiverDefault.reason, optional free-text for audit. Must not contain commas (would break CSV parsing).
Example:
fieldSet,value
payment_retry_gateway_timeout,true:1745856000:OPS-5123 spike
auth_audit_trail,false:1745856000:compliance keep verbose
The file is hot-reloaded on in-place writes (the gitops pattern); a
Kubernetes ConfigMap mount won't reload because the CM swap is a
symlink rename, not an in-place write.
compactReceiverLookupRetain
Retention period for the per-pattern cap-file before it is considered stale.
| Type | Default |
|---|---|
| Number | 300000 |
Defines the retention period (in milliseconds) for the cap-file
(compactReceiverLookupFile). If the file's last modified time is
older than this period, a warning is logged. The cap entries continue
to apply; the staleness check is advisory so operators notice when an
automated tooling pipeline has stopped updating the file.
Validation: must be greater than 60000ms (1 minute).
compactReceiverFieldNames
Event fields joined to form each event's cap-file lookup key.
| Type | Default |
|---|---|
| List | [symbolMessage] |
Defines the list of TenXObject field names joined with _ to form
each event's lookup key into the cap-file. Matches the rate receiver's
rateReceiverFieldNames, so a cap-file entry targets the same pattern
identity the Reporter attributes cost to.
Default: [symbolMessage], the symbolMessage field, which is the
stable pattern identity produced by the engine's classifier.
Multi-dimensional compaction (e.g., compact a pattern only for a specific tenant):
Changing this field set requires an engine restart.
compactReceiverDefault
Fallback compaction decision when no cap-file entry applies.
| Type | Default |
|---|---|
| Boolean | false |
Controls the fallback decision when no cap-file is loaded, no entry matches an event's pattern, or a matching entry has expired.
false(default), preservefullText. Cap-file entries opt specific patterns INTO compaction.true, compact viaencode(). Cap-file entries opt specific patterns OUT (e.g., audit/compliance patterns that must stay verbose).
Flipping this value is a policy-level decision (affects every event), not a cap-file edit. Changing it requires a pod rollout. The cap-file handles per-pattern overrides without restart.
This module is defined in compact/module.yaml.