Skip to content

Diff rules ​

Diff rules decide which differences don't count: whatever you configure is skipped, everything else is compared strictly. Handling differences one by one in Review differences only covers one run; turning fields that always change (timestamps, random IDs, serial numbers) into rules stops the false alarms on every future replay.

This page covers the console. The same rules can be written as YAML and kept in Git: see Policy YAML reference.

Where to configure ​

Application rulesGlobal defaults
Open fromConfig → Diff rulesView global → on the application rules page
Applies toThe current applicationEvery application
Rule typesIgnore by path, ignore by condition (CEL), dependency types, and Per-endpoint rules that apply to some endpoints only; other types via YAMLAll six types, one tab each

Diff rules of an application

The application page shows how many global default rules there are; View global → opens them. Several common global rules are built in, for example ignoring a difference when both values are UUIDs, both are IP addresses, or both are timestamps within the tolerance.

Change application rules with Edit at the top right and click Save when you're done, or switch to YAML and edit it directly. On the global default rules page, the Ignore by path (fast) and Array matching tabs need Save config after you add or change something (Add alone doesn't save it); Ignore by condition (CEL) and Dependency types save as soon as you add.

Global default rules

Ignore fields by path ​

The most common rule: stop comparing a field. Good for timestamps, trace IDs and random tokens; the field and everything under it drop out of the comparison.

On the Ignore by path (fast) tab, enter the path under Ignored fields (skipped on replay) and click Add. Write the path as data.traceId or as a JSON Pointer, /data/traceId; * matches one level and ** any number of levels, as in /data/*/updatedAt.

Include paths (whitelist)

The same tab has Include paths (whitelist). Once filled, only those paths are compared and everything else is ignored — the opposite of ignored fields. Usually left empty, meaning everything is compared.

Ignoring a field by path

Ignore a whole dependency type ​

A coarse switch: differences in one kind of downstream call don't count at all, for example every Redis call, or one particular database operation.

On the Dependency types tab, enter the type (such as Redis, Database, Dubbo, HttpClient) and, if needed, the specific dependency name; with no name, the whole type is ignored.

In replay results, calls ignored this way are marked Category ignored and aren't compared field by field.

Ignoring a dependency type

Ignore by condition (CEL) ​

The most flexible: write a condition that every difference is checked against; when it holds, the difference doesn't count. Use it when a path or field name isn't enough, such as "ignore when both values are timestamps".

On the Ignore by condition (CEL) tab, click Add rule, optionally name it, and write the condition — or pick one From template. Available functions lists every function.

Common variables: left, right (recorded and replayed value), path, pointer (field path), fieldName, category, time_tolerance_ms. Common functions: isUUID, isIP, isTimestamp, toTimestamp, toNumber.

For example:

  • Both values are timestamps: isTimestamp(left) && isTimestamp(right)
  • A generated request ID: fieldName == "requestId" && isUUID(right)

Adding a CEL ignore rule

Tabs that don't take effect yet ​

The global default rules page also has Transforms and Decompression tabs, meant for normalizing values and decoding Base64- or Gzip-encoded fields before comparison. In the current version these rules have no effect once saved: comparison finds no handler for them, skips them and compares the original values. Don't rely on them.

When array order varies ​

Arrays are compared by index by default. If the element order differs between recording and replay, you get a pile of false differences about missing and extra elements.

On the Array matching tab, enter the array path, pick a strategy and click Add unordered config:

StrategyWhen to use
By indexDefault; compares position by position
By primary keyPairs elements by a key field, such as orderId; works even when the order changes

In YAML these are BY_INDEX and BY_KEY. The LCS algorithm option in the console has no effect in the current version and behaves like by index.

Configuring array matching

Rules for some endpoints only ​

The rules above apply to every endpoint of the application. For rules that should apply to some endpoints only, add them under Per-endpoint in the application rules: enter the endpoints to match (an exact name, or a pattern such as /api/order/*) and configure that group's own rules.

Where rules added in the diff view go ​

When you ignore a field while reviewing differences, every scope except Only this case writes a diff rule:

Chosen in the diff viewWritten as
By pathAn ignore-by-path rule
By field name (every field with that name)A CEL rule matching that field name

With the scope set to the current endpoint or to a dependency call, the rule goes under Per-endpoint; with Whole app, into the app-wide rules.

Next ​

Rules set here apply from the next replay. To judge a finished replay by the new rules, replay again; you can only recompare on the spot when you add or remove rules from that replay's diff view. What still fails is worth a proper look.

To manage diff rules in Git, see Manage policies in Git and Policy YAML reference.

Capture Sessions · Review Steps · Improve what matters