Multi-fact checks compare values from two different fact sources within a single rule. For example, you can check whether a service’s error rate (from Datadog) stays below a threshold defined in your catalog, or whether the ratio of PagerDuty pages to team headcount is within acceptable limits.
This guide shows how to configure multi-fact checks using the No-Code UI. For YAML-based configuration, see Value Input.
Prerequisites
- At least two fact collectors configured and producing data (e.g., Catalog + PagerDuty, or SonarQube + GitHub)
- Permission to create or edit checks in Soundcheck
Step-by-step guide
1. Create a new check (or edit an existing one)
Navigate to Soundcheck → Checks and click Create Check, or open an existing check and click Edit.
In the Rule section, configure the left-hand side of the comparison:
- Fact: Select the primary fact source and fact name. For example, select the
pagerduty integration and the incidents fact.
- Path: Enter the JSONPath to extract the value you want to compare. For example,
$.total to get the total incident count.
3. Choose an operator
Select the comparison operator from the dropdown. Common operators for multi-fact checks include:
| Operator | Description |
|---|
lessThan | Primary fact value must be less than the comparison fact value |
greaterThan | Primary fact value must be greater than the comparison fact value |
equal | Both fact values must match |
lessThanInclusive | Primary fact value must be less than or equal to the comparison fact value |
greaterThanInclusive | Primary fact value must be greater than or equal to the comparison fact value |
4. Switch to fact-reference mode
Instead of typing a literal value in the Value field, click the Fact button next to the value input. This opens the Fact Explorer dialog, which lets you select a second fact as the comparison value.
Look for the Fact and List buttons next to the Value field in the
condition row. Clicking Fact replaces the text input with a fact-reference
picker.
5. Select the comparison fact
In the Fact Explorer dialog:
- Select an integration — Choose the collector that produces the comparison data (e.g.,
catalog)
- Select a fact — Pick the specific fact (e.g.,
entity_descriptor)
- Enter the path — Provide the JSONPath to extract the comparison value (e.g.,
$.spec.maxIncidents)
- Save — Click Save to set the fact reference as the comparison value
Once saved, the value field displays the selected fact reference:
Fact: catalog:default/entity_descriptor Path: $.spec.maxIncidents
You can clear the fact reference by clicking the ✕ button to return to literal value mode.
6. Save the check
Click Save to create or update the check. Soundcheck will now evaluate this rule by:
- Collecting the primary fact for each applicable entity
- Collecting the comparison fact for each applicable entity
- Extracting the values at the specified paths
- Comparing them using the selected operator
Example: SonarQube coverage vs catalog-defined threshold
This check compares SonarQube code coverage against a minimum threshold defined in the entity’s catalog metadata.
| Field | Value |
|---|
| Fact | sonarqube:default/measures |
| Path | $.component.measures[*].value |
| Operator | greaterThan |
| Value (Fact) | catalog:default/entity_descriptor |
| Value Path | $.metadata.annotations['soundcheck.spotify.com/min-coverage'] |
What it checks: “Is SonarQube code coverage greater than the minimum defined in the entity’s soundcheck.spotify.com/min-coverage annotation?”
Equivalent YAML
- id: coverage-above-threshold
name: Code coverage above threshold
description: Verifies SonarQube coverage exceeds the catalog-defined minimum
rule:
factRef: sonarqube:default/measures
path: $.component.measures[*].value
operator: greaterThan
value:
factRef: catalog:default/entity_descriptor
path: $.metadata.annotations['soundcheck.spotify.com/min-coverage']
For more details on YAML-based multi-fact configuration, see the Value Input documentation.
Example: PagerDuty standards passing count vs catalog-defined minimum
This check verifies that the number of passing PagerDuty service standards meets a minimum defined in the entity’s catalog metadata.
| Field | Value |
|---|
| Fact | pagerduty:default/standards |
| Path | $.score.passing |
| Operator | greaterThanInclusive |
| Value (Fact) | catalog:default/entity_descriptor |
| Value Path | $.metadata.annotations['soundcheck.spotify.com/min-standards'] |
What it checks: “Is the number of passing PagerDuty standards at least the minimum defined in the entity’s soundcheck.spotify.com/min-standards annotation?”
Equivalent YAML
- id: pagerduty-standards-minimum
name: Meets minimum PagerDuty standards
description: Verifies passing PagerDuty standards meet the catalog-defined minimum
rule:
factRef: pagerduty:default/standards
path: $.score.passing
operator: greaterThanInclusive
value:
factRef: catalog:default/entity_descriptor
path: $.metadata.annotations['soundcheck.spotify.com/min-standards']
Tips
- Both facts must be collected for the entities the check applies to. If either fact is missing for an entity, the check result will be “not reported” for that entity.
- Fact paths must resolve to comparable values — typically numbers for numeric operators (
lessThan, greaterThan) or strings for equality operators (equal).
- You can mix literal and fact-reference values across different conditions in the same check. For example, one condition can compare against a literal threshold while another compares against a dynamic fact value.
- The Fact Explorer shows available facts based on your configured collectors. If you don’t see the fact you need, verify that the corresponding collector is configured and has collected data.