Files
wehub-resource-sync 0d3cb498a3
Deploy local.promptfoo.app / Deploy to Cloudflare Pages (push) Waiting to run
Test and Publish Multi-arch Docker Image / test (push) Waiting to run
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-amd64 platform:linux/amd64 runner:ubuntu-latest]) (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / build-docker-and-push-digests (map[digest-suffix:linux-arm64 platform:linux/arm64 runner:ubuntu-24.04-arm]) (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / merge-docker-digests (push) Blocked by required conditions
Test and Publish Multi-arch Docker Image / Attest Multi-arch Image (push) Blocked by required conditions
Validate Renovate Config / Validate Renovate Configuration (push) Waiting to run
CI / Shell Format Check (push) Has been cancelled
CI / Check Ruby (3.4) (push) Has been cancelled
CI / CI Config (push) Has been cancelled
CI / Test on Node ${{ matrix.node }} and ${{ matrix.os }}${{ matrix.shard && format(' (shard {0}/3)', matrix.shard) || '' }} (push) Has been cancelled
CI / Build on Node ${{ matrix.node }} (push) Has been cancelled
CI / Style Check (push) Has been cancelled
CI / Generate Assets (push) Has been cancelled
CI / Check Python (3.14) (push) Has been cancelled
CI / Check Python (3.9) (push) Has been cancelled
CI / Build Docs (push) Has been cancelled
CI / Code Scan Action (push) Has been cancelled
CI / Site tests (push) Has been cancelled
CI / webui tests (push) Has been cancelled
CI / Run Integration Tests (push) Has been cancelled
CI / Run Smoke Tests (push) Has been cancelled
CI / Go Tests (push) Has been cancelled
CI / Share Test (push) Has been cancelled
CI / Redteam (Production API) (push) Has been cancelled
CI / Redteam (Staging API) (push) Has been cancelled
CI / GitHub Actions Lint (push) Has been cancelled
CI / Check Ruby (3.0) (push) Has been cancelled
release-please / release-please (push) Has been cancelled
release-please / build (push) Has been cancelled
release-please / publish-npm (push) Has been cancelled
release-please / publish-npm-backfill (push) Has been cancelled
release-please / docker (push) Has been cancelled
release-please / publish-code-scan-action (push) Has been cancelled
release-please / attest-code-scan-action (push) Has been cancelled
chore: import upstream snapshot with attribution
2026-07-13 13:24:08 +08:00

5.9 KiB

sidebar_label, sidebar_position, title, description
sidebar_label sidebar_position title description
Splunk 78 Integrate Promptfoo with Splunk Send Promptfoo red team findings to Splunk through HTTP Event Collector for SIEM alerting, dashboards, and incident workflows.

Integrate Promptfoo with Splunk

Use Splunk's HTTP Event Collector (HEC) to ingest failed Promptfoo red team results as SIEM events. This works with Splunk Cloud Platform and Splunk Enterprise without a Promptfoo-specific Splunk app.

Overview

The flow is:

  1. Run a Promptfoo red team scan.
  2. Export the latest eval to JSON.
  3. Transform failed red team results into Splunk HEC events.
  4. Search, alert, or dashboard on those events in Splunk.

Prerequisites

  • A working promptfooconfig.yaml red team config.
  • A Splunk HEC token with access to an index for Promptfoo findings, such as security or promptfoo.
  • A HEC endpoint:
    • Splunk Cloud Platform: https://http-inputs-<stack>.splunkcloud.com/services/collector/event
    • Splunk Enterprise: https://<splunk-host>:8088/services/collector/event

Use the /services/collector/event endpoint for JSON events. Splunk's HEC event format supports top-level metadata such as time, host, source, sourcetype, and index.

Export red team results

Run the scan and export the latest eval:

promptfoo redteam run -c promptfooconfig.yaml --no-cache
promptfoo export eval latest -o redteam-results.json

If you already have a specific eval ID, export that instead of latest:

promptfoo export eval <eval-id> -o redteam-results.json

In CI, set PROMPTFOO_PASS_RATE_THRESHOLD=0 on the scan step if you want the pipeline to continue to the Splunk upload even when the scan finds failed tests.

Send findings to Splunk HEC

Use the public promptfoo-to-splunk.mjs transformer gist. It reads redteam-results.json, filters failed red team assertions, maps Promptfoo fields like plugin ID, strategy ID, score, attack prompt, target output, and share URL into a Splunk HEC event, then sends each finding with source: promptfoo and sourcetype: promptfoo:redteam.

After saving the gist as promptfoo-to-splunk.mjs, run it with your Splunk HEC settings:

export SPLUNK_HEC_URL="https://http-inputs-<stack>.splunkcloud.com/services/collector/event"
export SPLUNK_HEC_TOKEN="<hec-token>"
export SPLUNK_INDEX="security"

# Run the transformer on the exported red team results and send findings to Splunk HEC.
node promptfoo-to-splunk.mjs redteam-results.json

For Splunk Enterprise with a self-signed certificate, fix certificate trust rather than disabling TLS verification in CI.

GitHub Actions example

You can run the export and Splunk upload manually, but most teams put this in CI/CD so SIEM data stays current. The same pattern works in any CI/CD system; this example uses GitHub Actions.

name: Promptfoo Red Team to Splunk

on:
  workflow_dispatch:
  schedule:
    - cron: '0 8 * * *'

jobs:
  redteam:
    runs-on: ubuntu-latest

    steps:
      - uses: actions/checkout@v4

      - uses: actions/setup-node@v4
        with:
          node-version: '22'

      - name: Install promptfoo
        run: npm install -g promptfoo

      - name: Run red team scan
        env:
          OPENAI_API_KEY: ${{ secrets.OPENAI_API_KEY }}
          PROMPTFOO_PASS_RATE_THRESHOLD: '0'
        run: promptfoo redteam run -c promptfooconfig.yaml --no-cache

      - name: Export latest eval
        run: promptfoo export eval latest -o redteam-results.json

      - name: Download Splunk transformer
        run: |
          curl -L \
            https://gist.githubusercontent.com/ianw-oai/418470829f7feff8e52a24ad6d028402/raw/promptfoo-to-splunk.mjs \
            -o promptfoo-to-splunk.mjs

      - name: Send findings to Splunk
        env:
          SPLUNK_HEC_URL: ${{ secrets.SPLUNK_HEC_URL }}
          SPLUNK_HEC_TOKEN: ${{ secrets.SPLUNK_HEC_TOKEN }}
          SPLUNK_INDEX: security
        run: node promptfoo-to-splunk.mjs redteam-results.json

Store SPLUNK_HEC_URL, SPLUNK_HEC_TOKEN, and LLM provider API keys as CI secrets.

Search in Splunk

Use the configured sourcetype to find Promptfoo red team findings:

index=security sourcetype="promptfoo:redteam"
| stats count as findings values(strategy_id) as strategies by plugin_id provider severity
| sort - findings

To alert on new high-priority findings:

index=security sourcetype="promptfoo:redteam" severity IN ("high", "critical")
| table _time eval_id provider plugin_id strategy_id score attack_prompt failure_reason shareable_url

Tune severity mapping to your internal policy. The open-source eval export contains per-result pass/fail and score fields; Promptfoo Enterprise findings include vulnerability status and severity that are better suited for long-lived SIEM case management.

Enterprise webhooks

For continuous synchronization from Promptfoo Enterprise, configure webhooks for issue.created and issue.updated, then forward those webhook payloads to Splunk HEC. Webhook payloads include issue ID, plugin ID, status, severity, target ID, provider ID, and change information.

Forward webhook payloads to HEC with metadata like this:

{
  "source": "promptfoo",
  "sourcetype": "promptfoo:redteam:issue",
  "event": {
    "event_type": "promptfoo_redteam_issue",
    "issue": "<Promptfoo webhook issue payload>"
  }
}

Security notes

  • Treat exported red team results as sensitive. Attack prompts and target outputs can contain harmful content or application data.
  • Restrict the Splunk index and HEC token to the teams that need access.
  • Use PROMPTFOO_STRIP_RESPONSE_OUTPUT=true or PROMPTFOO_STRIP_TEST_VARS=true if you need to reduce what leaves the CI environment.