Skip to content

Splunk SPL compatibility

Signalith's query language is pipe-based, like Splunk's SPL, so most searches an SPL user writes run as they are. This page lists what is supported, what works differently and what is missing, so you know before you type.

Signalith is an independent project. It is not affiliated with, endorsed by or sponsored by Splunk or Cisco. Splunk and SPL are trademarks or registered trademarks of Splunk LLC, a Cisco company, in the United States and other countries; they are named here only to describe compatibility.

What "94%" means

Signalith runs every search from Splunk's open security_content detections, baselines and dashboards (2,223 searches) in its tests. 2,089 of them (94.0%) are accepted: they parse and run without an error. That number does not prove they give the same rows as in Splunk.

A second test checks results. It runs 122 searches over a fixed set of events and compares the rows with the ones Splunk gives. It covers stats over missing values, multivalue fields, search and where, sorting, time snapping, dedup, top, eventstats, streamstats, join and transaction. Every difference it found has been fixed or is listed under Works differently.

Commands

Every command below is supported. Notes on how some of them work differently follow the lists.

  • Search and filter: search, where, regex, dedup, head, tail, uniq, from, multisearch, union, set, format, return
  • Statistics: stats, eventstats, streamstats, timechart, chart, top, rare, tstats, bin, bucket, fieldsummary, contingency, concurrency, trendline, predict, outlier, anomalydetection, correlate, kmeans, cluster, geostats, eventcount, timewrap, makecontinuous
  • Fields: eval, rex, extract, xmlkv, xpath, spath, fromjson, rename, table, fields, fillnull, filldown, convert, fieldformat, replace, strcat, rangemap, foreach, setfields, addinfo, accum, delta, autoregress, iplocation, highlight, abstract
  • Multivalue: mvexpand, makemv, nomv, mvcombine
  • Reshape: sort, reverse, transpose, xyseries, untable, addtotals, addcoltotals, gauge
  • Combine: append, appendpipe, join, transaction, map
  • Lookups and threat intel: lookup, inputlookup, outputlookup, enrich, intel, threatmatch
  • Generate: makeresults

Works differently

What In Signalith
Plain where comparisons where user="bob" ignores case, as a search term does, so it can run in OpenSearch. Splunk's where is case-sensitive. As soon as the condition uses a function or arithmetic it is case-sensitive, as in Splunk
A bare name on the right of where Right after the search, only a field a data model names is read as a field; other names are compared as text. Use a single-quoted name, as in where a > 'b', to always compare two fields
timechart Must come before other commands that change the results, such as eval or stats; it runs in OpenSearch
stats over many groups Up to 50,000 groups are counted exactly; past that OpenSearch ranks them and the result says so
dc(), median(), perc95() Estimated by OpenSearch on large data; exact when stats runs in Signalith
values() Up to 100 values when stats runs in OpenSearch, 10,000 in Signalith; a result that leaves values out is marked truncated
stats sum(bytes*), values(*) as * Supported in stats and eventstats, which then run in Signalith over at most search.max_events events. timechart, chart, streamstats, tstats and by refuse * field names
streamstats Takes count, dc, sum, avg, min, max, range, first and last; time_window=, reset_on_change= and global= are missing
Commands that need every event (eval before stats, dedup, transaction and so on) Run in Signalith over at most search.max_events events. A result that saw fewer events than matched is marked sampled
Time zone The Search page uses your browser's time zone; detections and dashboards use UTC
strftime %Q (milliseconds) is missing

Missing

appendcols, multikv, erex, collect, loadjob, savedsearch, rest, metadata, selfjoin, gentimes, inputcsv, outputcsv, mstats, sistats and the other summary indexing commands, and search macros (`macro`). Signalith has its own summary indexes and saved searches.

Stats functions

Supported in stats, eventstats, timechart and chart: count, dc (distinct_count), sum, avg (mean), min, max, median, perc1 to perc99 (p95 too), stdev, stdevp, var, varp, sumsq, range, mode, values, list, first, last, earliest, latest, and any of them over eval(...).

Missing: estdc, exactperc, upperperc, earliest_time, latest_time, rate, per_second, per_minute, per_hour and per_day.

Eval functions

  • Conditions and tests: if, case, coalesce, nullif, null, true, false, validate, isnull, isnotnull, isnum, isint, isstr, isbool, typeof, in, like, match, cidrmatch
  • Text: len, lower, upper, substr, replace, trim, ltrim, rtrim, urldecode, printf, split, md5, sha1, sha256, sha512
  • Numbers: abs, ceil, ceiling, floor, round, sqrt, pow, exp, ln, log, min, max, pi, random, exact, sin, cos, tan, asin, acos, atan, atan2, sinh, cosh, tanh, asinh, acosh, atanh, hypot, bit_and, bit_or, bit_xor, bit_not, bit_shift_left, bit_shift_right
  • Conversion: tonumber, tostring, ipmask
  • Multivalue: mvappend, mvcount, mvdedup, mvfilter, mvfind, mvindex, mvjoin, mvmap, mvrange, mvsort, mvzip
  • JSON: spath, json_extract, json_keys, json_valid, json_array_to_mv, json_object, json_array
  • Time: now, time, strftime, strptime, relative_time

Missing: searchmatch, sigfig, lookup, json_set, json_append, json_extend, mv_to_json_array and tojson.

Time modifiers

earliest= and latest= take what Splunk takes: relative times such as -24h or -7d@d, chained ones such as @d-1h, snaps to @s, @m, @h, @d, @w (Sunday, or @w0 to @w6), @mon, @q and @y, now, epoch seconds, and dates such as 2026-10-01 or 10/01/2026:00:00:00. A time that cannot be read is an error, not an empty result.

See the query language for how each command and function works.