Skip to content

Webhook Actions

Actions for integration with external systems via HTTP webhooks.

WebhookAction

A general-purpose webhook action that can send requests to any HTTP endpoint.

Configuration (WebhookConfig)

Property Type Default Description
url str "" Webhook URL (required)
method str "POST" HTTP method: GET, POST, PUT, PATCH, DELETE
headers dict[str, str] {} Additional HTTP headers
auth_type str "none" Authentication type: none, basic, bearer, api_key
auth_credentials dict[str, str] {} Authentication credentials
payload_template dict \| None None Custom payload template
include_full_result bool True Include full result in payload
ssl_verify bool True SSL certificate verification
success_codes list[int] [200, 201, 202, 204] HTTP status codes considered successful
notify_on str "always" Execution condition

Basic Usage

from truthound.checkpoint.actions import WebhookAction

# Basic POST request
action = WebhookAction(
    url="https://api.example.com/data-quality/events",
    notify_on="failure",
)

# PUT request
action = WebhookAction(
    url="https://api.example.com/status",
    method="PUT",
    notify_on="always",
)

Authentication Configuration

Bearer Token Authentication

action = WebhookAction(
    url="https://api.example.com/webhook",
    auth_type="bearer",
    auth_credentials={
        "token": "${API_TOKEN}",  # Environment variable reference
    },
)

Basic Authentication

action = WebhookAction(
    url="https://api.example.com/webhook",
    auth_type="basic",
    auth_credentials={
        "username": "user",
        "password": "${API_PASSWORD}",
    },
)

API Key Authentication

action = WebhookAction(
    url="https://api.example.com/webhook",
    auth_type="api_key",
    auth_credentials={
        "header": "X-API-Key",  # Header name (default: "X-API-Key")
        "key": "${API_KEY}",
    },
)

Custom Headers

action = WebhookAction(
    url="https://api.example.com/webhook",
    headers={
        "X-Custom-Header": "custom-value",
        "X-Request-ID": "${REQUEST_ID}",
        "Accept": "application/json",
    },
)

Custom Payload

Use payload_template to customize the payload. Placeholders are supported.

action = WebhookAction(
    url="https://api.example.com/webhook",
    payload_template={
        "event_type": "data_quality_check",
        "checkpoint": "${checkpoint}",
        "status": "${status}",
        "run_id": "${run_id}",
        "timestamp": "${run_time}",
        "metrics": {
            "total_issues": "${total_issues}",
            "critical": "${critical_issues}",
            "high": "${high_issues}",
            "pass_rate": "${pass_rate}",
        },
        "custom_field": "custom_value",
    },
)

Supported Placeholders

Placeholder Description
${checkpoint} Checkpoint name
${run_id} Execution ID
${status} Result status
${run_time} Execution time (ISO 8601)
${data_asset} Data asset name
${total_issues} Total issue count
${critical_issues} Critical issue count
${high_issues} High issue count
${medium_issues} Medium issue count
${low_issues} Low issue count
${pass_rate} Pass rate

Default Payload

Default payload when payload_template is not specified:

{
  "event": "validation_completed",
  "checkpoint": "daily_data_validation",
  "run_id": "20240115_120000",
  "status": "failure",
  "run_time": "2024-01-15T12:00:00",
  "data_asset": "users.csv",
  "summary": {
    "total_issues": 150,
    "critical_issues": 5,
    "high_issues": 25,
    "medium_issues": 70,
    "low_issues": 50,
    "pass_rate": 0.85
  },
  "full_result": { ... }  // When include_full_result=True
}

Disable SSL Verification

For self-signed certificates on internal networks:

action = WebhookAction(
    url="https://internal.example.com/webhook",
    ssl_verify=False,  # Warning: Not recommended for security reasons
)

Custom Success Codes

action = WebhookAction(
    url="https://api.example.com/webhook",
    success_codes=[200, 201, 202, 204, 302],  # Treat 302 redirect as success
)

Retry Configuration

action = WebhookAction(
    url="https://api.example.com/webhook",
    timeout_seconds=30,    # Request timeout
    retry_count=3,         # Maximum 3 retries on failure
    retry_delay_seconds=2, # 2-second interval between retries
)

GitHubAction

Action for integration with GitHub Actions. Configures Job Summary, Annotations, and Outputs.

Configuration

Property Type Default Description
token str "" GitHub Token (uses environment variable if not provided)
repo str "" Repository (owner/repo)
check_name str "Truthound" Check Run name
step_summary bool True Write Job Summary
set_output bool True Set workflow outputs
annotations bool True Output error/warning annotations
notify_on str "always" Execution condition

Usage Example

from truthound.checkpoint.actions import GitHubAction

action = GitHubAction(
    token="${GITHUB_TOKEN}",
    repo="owner/repo",
    step_summary=True,
    set_output=True,
    annotations=True,
)

Usage in GitHub Actions Workflow

- name: Run Data Quality Check
  run: truthound checkpoint run my_check --config config.yaml
  env:
    GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

- name: Use Outputs
  run: |
    echo "Status: ${{ steps.dq-check.outputs.status }}"
    echo "Issues: ${{ steps.dq-check.outputs.total_issues }}"

YAML Configuration Example

actions:
  # Basic webhook
  - type: webhook
    url: https://api.example.com/data-quality/events
    method: POST
    notify_on: failure

  # Authentication configuration
  - type: webhook
    url: https://api.example.com/webhook
    method: POST
    auth_type: bearer
    auth_credentials:
      token: ${API_TOKEN}
    headers:
      X-Custom-Header: custom-value
    notify_on: always

  # Custom payload
  - type: webhook
    url: https://api.example.com/webhook
    payload_template:
      event: data_quality
      checkpoint: "${checkpoint}"
      status: "${status}"
      issues: "${total_issues}"
    include_full_result: false
    notify_on: failure_or_error

  # GitHub Actions integration
  - type: github
    step_summary: true
    set_output: true
    annotations: true
    notify_on: always