See my answers here for background:
https://answers.splunk.com/answers/567851/how-can-i-compare-mvfields-and-get-a-diff.html
https://answers.splunk.com/answers/734599/how-to-compare-the-same-search-from-the-previous-d.html
Start with this to create 2 fields with your data:
index=YouShouldAlwaysSpecifyAnIndex AND (source=service1.log OR source=service2.log) earliest=-4h latest=now()
| rex field=_raw "trackingId\":\s\"(?<trackingId>[\w-]+)\""
| eval ProducerTrackingID = if(source=="service1.log, trackingId, null())
| eval ConsumerTrackingID = if(source=="service1.log, null() trackingId)
| stats values(*TrackingID) AS *TrackingID
For run anywhere, try this:
| makeresults
| eval ProducerTrackingID="123 456 789", ConsumerTrackingID="456 789"
| makemv ProducerTrackingID
| makemv ConsumerTrackingID
Then you can EITHER do this:
| streamstats count AS _serial
| multireport
[| mvexpand ProducerTrackingID
| where ConsumerTrackingID!=ProducerTrackingID
| rename ProducerTrackingID AS ProducerTrackingID_only]
[| mvexpand ConsumerTrackingID
| where ConsumerTrackingID!=ProducerTrackingID
| rename ConsumerTrackingID AS ConsumerTrackingID_only]
| stats values(*) AS * BY _serial
OR this:
| nomv ConsumerTrackingID
| nomv ProducerTrackingID
| rex field=ConsumerTrackingID mode=sed "s/[\r\n\s]+/;/g"
| rex field=ProducerTrackingID mode=sed "s/[\r\n\s]+/;/g"
| eval setdiff = split(replace(replace(replace(replace(mvjoin(mvsort(mvappend(split(replace(ConsumerTrackingID, "(;|$)", "#1;"), ";"), split(replace(ProducerTrackingID, "(;|$)", "#0;"), ";"))), ";"), ";(\w+)#0\;\1#1", ""), ";\w+#1", ""), "#0", ""), ";(?!\w)|^;", ""), ";")
... View more