Skip to main content
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.

2. Configure the primary fact

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:
OperatorDescription
lessThanPrimary fact value must be less than the comparison fact value
greaterThanPrimary fact value must be greater than the comparison fact value
equalBoth fact values must match
lessThanInclusivePrimary fact value must be less than or equal to the comparison fact value
greaterThanInclusivePrimary 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.
Condition row showing the Fact and List buttons next to the Value field

5. Select the comparison fact

In the Fact Explorer dialog:
  1. Select an integration — Choose the collector that produces the comparison data (e.g., catalog)
  2. Select a fact — Pick the specific fact (e.g., entity_descriptor)
  3. Enter the path — Provide the JSONPath to extract the comparison value (e.g., $.spec.maxIncidents)
  4. Save — Click Save to set the fact reference as the comparison value
Fact Explorer dialog with catalog integration and entity_descriptor fact selected, showing a JSONPath of $.spec.maxIncidents
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:
  1. Collecting the primary fact for each applicable entity
  2. Collecting the comparison fact for each applicable entity
  3. Extracting the values at the specified paths
  4. 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.
FieldValue
Factsonarqube:default/measures
Path$.component.measures[*].value
OperatorgreaterThan
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.
FieldValue
Factpagerduty:default/standards
Path$.score.passing
OperatorgreaterThanInclusive
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.