16  Notifications and Observability

A validation only helps if someone finds out about the results. When a check fails on a scheduled run at three in the morning, a report saved to a folder does not help anyone. When validation runs unattended, a person or a system needs to be told when something goes wrong. This chapter covers sending results out of the validation process, whether as a message in a chat channel, as metrics in a monitoring system, or as a custom alert for whatever tools you already use.

These notifications are sent through the actions from Chapter 13, so you already know when they run. A step action runs when an individual check reaches a threshold, which suits an urgent alert about one check. A final action runs once after the whole plan and sees the complete results, which suits a summary of the run. Pointblank includes two ready-made notifiers, one for Slack and one for OpenTelemetry, and you can write your own for anything else. We use game_revenue for the examples that run.

game_revenue = pb.load_dataset(dataset="game_revenue", tbl_type="polars")

The most common place to send notifications is a chat channel, so we start with Slack.

16.1 Slack notifications

The send_slack_notification() function creates an action that posts to a Slack channel through an incoming webhook. Before you connect it to a plan, it helps to see what the messages will look like. If you call it with debug=True and no webhook, it prints sample messages instead of sending anything, so you can check them without a real channel.

pb.send_slack_notification(debug=True)

=== Step Notification Preview ===
*Data Validation Alert*
• Type: col_vals_gt
• Level: critical
• Step: 1
• Column: column_name
• Time: 2026-10-09 23:30:43.656441

=== Summary Notification Preview ===
*Data Validation Summary*
• Highest Severity: critical
• Total Steps: 5
• Failed Steps: 2
• Time: 2026-10-09 23:30:43.656444

The preview shows the two kinds of messages the notifier sends. The step message describes a single failing check, with its type, severity level, step number, column, and time. The summary message describes the whole run, with the highest severity, the number of steps, and how many steps failed. The values here are made-up samples, such as column_name for the column. Both messages use default templates, and you can replace either one. The summary_msg= and step_msg= arguments take template strings with placeholders in braces, which are filled in when the message is sent. Here is a custom summary template.

pb.send_slack_notification(
    debug=True,
    summary_msg="Validation of {tbl_name}: {highest_severity} ({n_failing_steps} of {n_steps} steps failed)",
)

=== Step Notification Preview ===
*Data Validation Alert*
• Type: col_vals_gt
• Level: critical
• Step: 1
• Column: column_name
• Time: 2026-10-09 23:30:43.663888

=== Summary Notification Preview ===
Validation of example_table: critical (2 of 5 steps failed)

16.2 Exporting to OpenTelemetry

16.3 Building your own notifier

Slack and OpenTelemetry are the two built-in notifiers, but you can send results anywhere with a final action of your own. Inside the action, get_validation_summary() returns a dictionary describing the run, and you use its values to decide what to send and where. To start, this action just prints a few of the summary’s keys so we can see what it contains.

16.4 Summary