Migration from Splunk
This guide helps Splunk users move to CSIRT-Pro. It maps familiar SPL concepts to their PRQL equivalents, compares the architectural building blocks, and lays out a practical migration workflow.
Concept Mapping
Most Splunk concepts have a direct counterpart in CSIRT-Pro. The largest difference is the query language: SPL becomes PRQL.
| Splunk Concept | CSIRT-Pro Equivalent | Notes |
|---|---|---|
| Index | Pipeline | Each Pipeline maps to its own log store |
| Source / Sourcetype | Pipeline name + parse settings | Parse rules are per-pipeline |
| Search (SPL) | Search (PRQL) | Pipelined syntax, different keywords |
| Dashboard | Dashboard | 12-column grid layout, PDF export |
| Alert | Playbook trigger + Case | Playbooks open cases on detection |
| Saved Search | Saved Visualization | Query and chart config are persisted |
| Lookup Table | Pipeline (reference data) | Ingest reference data as a pipeline |
| App / Add-on | Integration | Enable from the integration catalog |
| Heavy Forwarder | High-performance ingestion API | High-throughput REST endpoint |
| Universal Forwarder | API client / log shipper | Any HTTP-capable agent works |
| Knowledge Objects | Pipeline parse settings | Regex and field-name extraction |
| Role-Based Access | Organization + SharedAccess | Multi-tenant with cross-org sharing |
| Phantom (SOAR) | Playbook | Visual flow editor with Python/JS nodes |
| Enterprise Security | Built-in (UEBA, threat intelligence, cases) | No separate product required |
SPL to PRQL Mapping
Basic Search
Time Range
Time Range Selector
In the CSIRT-Pro UI, you usually set the time range with the time picker rather than in the query itself.
Wildcard / Partial Match
Field Selection
Sorting
Limiting Results
Aggregation: Count by Field
Aggregation: Sum
Aggregation: Average
Multiple Conditions
Operator Reference
| SPL Operator | PRQL Equivalent | Example |
|---|---|---|
search / implicit |
from + filter |
from \pipeline` filter field == "value"` |
where |
filter |
filter status >= 400 |
fields |
select |
select {field1, field2} |
sort |
sort |
sort {-__time} |
head / tail |
take |
take 100 |
stats count |
aggregate {count = count this} |
See examples above |
stats sum() |
aggregate {total = sum field} |
See examples above |
stats avg() |
aggregate {avg = avg field} |
See examples above |
stats min() |
aggregate {min = min field} |
|
stats max() |
aggregate {max = max field} |
|
by |
group {field} (...) |
Wraps the aggregation |
eval |
derive |
derive {new_field = field1 + field2} |
rex / regex |
filter ~= |
filter message ~= "pattern" |
dedup |
group + take 1 |
Group then take the first row |
table |
select |
Same effect |
rename |
select {new_name = old_name} |
Rename via select |
A Note on Query Performance
CSIRT-Pro stores raw events in a single messages column and extracts fields at query time (schema-on-read).
This keeps ingestion fast and parse rules flexible, which is the same model Splunk uses.
The trade-off shows up in different query shapes.
Point lookups against the primary key are fast, typically well under a second.
Large GROUP BY aggregations scan the messages column, so on the order of a hundred million rows they take tens of seconds.
Plan migrated dashboards and scheduled detections with this profile in mind, and prefer time-bounded queries for heavy aggregations.1
Data Migration Workflow
Phase 1: Set Up Pipelines
- Map each Splunk index to a CSIRT-Pro Pipeline.
- Configure parse settings to match your existing
props.conf/transforms.confrules. - Use AI Parse Generation to draft rules faster: paste a sample log line and the assistant suggests a regex and field names. You review and apply the result.
Phase 2: Parallel Ingestion
- Configure your log sources to send data to both Splunk and CSIRT-Pro at the same time.
- Confirm that data appears correctly in the CSIRT-Pro Search screen.
- Compare record counts between the two systems.
Phase 3: Historical Data Import
- Export historical data from Splunk using
| outputcsvor the REST API. - Convert it to JSON or NDJSON.
- Upload it to CSIRT-Pro with the batch ingestion API:
curl -X POST "https://<domain>/api/v2/ingest/batch" \
-H "Content-Type: application/json" \
-H "X-API-Key: <api_key>" \
-d '{
"pipeline_id": "<pipeline_id>",
"records": [ ... ]
}'
Phase 4: Migrate Dashboards and Alerts
- Recreate Splunk dashboards in CSIRT-Pro by converting SPL queries to PRQL with the mapping table above.
- Convert Splunk alerts to CSIRT-Pro Playbooks with schedule triggers.
- Migrate Phantom playbooks to CSIRT-Pro visual Playbooks with Python/JS nodes.
Phase 5: Cutover
- Redirect all log sources to CSIRT-Pro only.
- Decommission the Splunk forwarders.
- Keep Splunk in read-only mode until the CSIRT-Pro retention window covers your compliance requirements.
Common Questions
Can I use Sigma rules?
Yes. CSIRT-Pro provides a Sigma rule conversion endpoint that translates Sigma YAML rules into PRQL queries.
What about saved searches and reports?
Convert your SPL saved searches to PRQL and save them as Visualizations in CSIRT-Pro. Saved Visualizations can be placed on Dashboards.
How does licensing differ?
CSIRT-Pro uses predictable pricing rather than volume-based (GB/day) licensing. This removes the cost pressure that discourages broad log collection.
-
Measured on roughly 110M rows: compression about 9.3x, point lookups 0.2 to 1 second, and large aggregations a median of about 23 seconds. The fair comparison is schema-on-read against schema-on-read (CSIRT-Pro against Splunk), not against typed-column engines. ↩