Hi @sakib , Short answer: yes, this is normal, and no, that row is not one host. 1. Why a squashed row can be 100+ GB Squashing isn't a rounding artifact — it's an aggregation. The license manager tracks usage per (host, source, sourcetype, index) tuple. When the number of distinct tuples in a reporting interval exceeds squash_threshold (default 2000 in server.conf [license]), Splunk drops the h (host) and s (source) values and keeps only st (sourcetype) and idx (index). So that blank-host row is the sum of every host that got squashed for that sourcetype/index. If you have a few thousand forwarders, or syslog data where each device IP becomes its own host, 100+ GB/day collapsing into one squashed row is entirely expected. The volume is real; the attribution is what's lost. Two consequences worth knowing: Your total license usage is still accurate. Squashing only affects breakdown, never the billed total. Your query hides useful detail. You're grouping by h, s, st but not idx. Add the index — it survives squashing and is your best lead: index=_internal source=*license_usage.log* type=Usage
| stats sum(b) as bytes by idx, st, h
| eval gb=round(bytes/1024/1024/1024,2)
| sort - gb To confirm squashing is actually happening and see how much is affected: index=_internal source=*license_usage.log* type=Usage
| eval squashed=if(h="","squashed","attributed")
| stats sum(b) as bytes by squashed
| eval gb=round(bytes/1024/1024/1024,2) Also check for the warning on the license manager: index=_internal source=*splunkd.log* squash 2. Finding the real hosts Since idx and st survive, use them to narrow, then attribute from the raw data instead of the license log. Option A — metrics.log (fast, approximate) index=_internal source=*metrics.log* group=per_host_thruput
| stats sum(kb) as kb by series
| eval gb=round(kb/1024/1024,2)
| sort - gb Caveat: metrics.log reports only the top 10 series per interval and lumps the rest into other. Great for spotting a dominant talker, unreliable for a long tail. Run it per indexer (by host, series) since each indexer reports its own. Option B — measure raw bytes directly (accurate, expensive) Take the idx and st from the squashed row and run over a short window: index=<the_index> sourcetype=<the_sourcetype> earliest=-1h latest=now
| eval raw_len=len(_raw)
| stats sum(raw_len) as bytes, count as events by host
| eval gb=round(bytes/1024/1024/1024,3), avg_size=round(bytes/events)
| sort - gb One hour, then multiply by 24. Run it off-peak — it scans raw data. The avg_size column often reveals the culprit immediately (a misconfigured input producing huge events, or a debug-level source). Option C — tstats for a fast ranking (event counts, not bytes) | tstats count where index=<the_index> by host, sourcetype
| sort - count Doesn't give bytes, but it's near-instant and usually points straight at the offender. Combine with Option B on just the top few hosts. Option D — stop the squashing On the license manager, server.conf: [license]
squash_threshold = 5000 Restart required. This costs memory on the license manager (it holds all those tuples), so raise it deliberately rather than to an arbitrary large number. Splunk's own guidance is to keep it as low as you can live with. Useful as a temporary measure while you investigate, then put it back. Practical tip Squashing that appears suddenly, alongside a usage spike, is itself a clue: it usually means a new source started creating many distinct hosts — syslog with per-device hosts, a Kubernetes/container input where each pod becomes a host, or host_segment/host_regex misconfigured so every file path yields a new host value. Comparing distinct host counts before and after the spike often finds it faster than chasing bytes: index=_internal source=*license_usage.log* type=Usage earliest=-14d
| timechart span=1d dc(h) as distinct_hosts, sum(b) as bytes If distinct_hosts jumped on the same day as the volume, that's your answer. Hit Karma, if you found the your answer.
... View more