User Activity Monitoring — reference¶
This page is the reference companion of User Activity Monitoring: the tenant model and the search head tiers, every report and its schedule, the knowledge-object catalogs, the historical backfill, the indexed evidence, identity and classification, privileged users, the catalogue of built-in policies, custom policies, the findings lifecycle and Finding groups, notifications and communications, the UAM AI Agent, Collection health and the Configuration Guardian check, every setting, the roles and licence, the REST endpoints, the upgrades and the troubleshooting table.
For the task-oriented guide (creating a tenant, reading the workspace tab by tab, triaging a finding), read User Activity Monitoring. The concepts User Activity Monitoring shares with the other findings tenants — Finding groups, triage, assignment, notifications, findings actions, Webhook accounts and the AI Agents — are explained once in Findings, Finding groups and findings actions. For a narrated end-to-end walkthrough, read the User Activity Monitoring white paper.
The tenant model¶
User Activity Monitoring (UAM) is a dedicated tenant type, created from the User Activity Monitoring card of the tenant creation wizard:
A tenant is either an entity tenant (DSM, DHM, MHM, FLX, FQM, WLK, VOL) or a UAM tenant, never both. Creation refuses a mix (
uam_tenant_must_be_dedicated), the Manage components menu is disabled on a UAM card, replica trackers are refused and the add / remove component endpoints answeruam_tenant_is_dedicated.There are no entities: no decision maker, no impact score, no green / orange / red state, no stateful alerting, no priority / SLA / logical group. The unit of work is the finding, triaged as a Finding group.
A UAM tenant watches one indexing layer seen through one to ten search head tiers: the accounts (human, service or system) and their search activity, their resource cost (CPU, peak memory, share of the environment) and their knowledge objects; the saved searches and the other knowledge objects of each tier; and the policies — sixteen built in, plus the custom policies you write — that raise findings about them.
Evidence lives in indexes, state in the KV store. Collection runs in scheduled searches, never in a REST handler.
The tenant identifier of a UAM tenant is short — lowercase letters, digits and hyphens, up to 20 characters — because it keys the per-tenant collections and reports.
The Virtual Tenants card shows the open and high / critical findings and the collection problems; a double-click opens a read-only overview. Tenant Home opens the UAM workspace (tabs Findings, Users, Privileged users, Activity, Scheduled searches, Policies, Audit changes, Collection health, AI Agent and Settings, described in User Activity Monitoring).
Note
What UAM claims, and what it does not. An account is the principal reported by Splunk in the audit records — not a verified person. Distinct search ids are a launch-count proxy. Collection is bounded by time only and resumable: nothing is dropped to fit a row count, and what a run cannot finish continues at the next run. Coverage still depends on what the sources retain and what the collection accounts can see: gaps and partial coverage are recorded and shown (receipts, Collection health), never hidden. There is no machine learning: the daily CPU deviation rule compares against a percentile baseline.
Per-tenant storage¶
KV collection |
Content |
|---|---|
|
The configuration, the checkpoints, the latest receipt and the lock of every job, the capacity, the detection records, the notification outbox, the user notification state and the private contact store. |
|
The policy inventory: one row per saved search, user, role and CSV lookup file, per
tier, with |
|
The published knowledge-object catalogs and their definitions (administrator access only, no lookup). |
|
One row per finding, with its investigation state and its Finding group. |
|
One row per Finding group (automatic or manual). |
|
Custom policy definitions (drafts, published revisions) and their execution state. |
|
Findings actions definitions and automation rules. |
The settings, inventory and findings collections each have an administrative lookup
trackme_uam_<kind>_tenant_<tid>. Two global collections serve every UAM tenant:
kv_trackme_uam_agent_decisions (the UAM AI Agent decision log, 90-day retention) and
kv_trackme_uam_custom_execution (custom policy execution slots).
Search head tiers and the route account¶
One indexing layer, one to ten search head tiers:
Data |
Lives on |
Collected |
|---|---|---|
Saved searches, users, roles, lookup files and the other knowledge objects |
each search head tier |
once per tier, from the Splunk REST API |
|
the indexing layer (every tier forwards its internal indexes there) |
once per tenant, through the route account |
Search head tiers (
tiers) — 1 to 10 unique names:local(the search head TrackMe runs on) and / or TrackMe remote accounts (see Remote Splunk deployments), one account per tier. Every selected tier must feed the same indexing layer; that invariant is the administrator’s responsibility. The wizard tests every remote tier and waits until each is reachable.Route account for indexing-layer searches (
account) — the tier through which activity, resources, capacity and the audit lookups are read:localwhen selected, else the first tier. It must be one of the tiers.A user present on several tiers is one account (roles united, tiers listed); a saved search belongs to its tier. Each tier has its own reports, locks and receipts, so a slow tier never starves another and a skipped tier is visible on its own.
Typical shapes: on Splunk Cloud, TrackMe on the ad hoc search head (
local) plus a remote account for a premium-app search head; on Splunk Enterprise, any number of remote accounts over the same indexers; for central monitoring, remote accounts only.A search head that keeps its internal indexes local (no forwarding of
_audit/_introspection) hides its searches, logins and resource usage from the tenant — the forwarding prerequisite applies to every signal alike.
Activity scope (advanced)¶
The tiers select REST connections for the inventory; they do not restrict which events
are read in a shared indexing layer, so a search head that is not a tier still contributes
activity, classification evidence and resource cost. Activity scope (search_head_scope,
wizard and Settings) restricts the activity to search head hostnames:
includeandexclude— up to 20 hostname patterns each (1 to 253 characters), matched case-insensitively on the whole hostname;*matches any characters,?one character, everything else is literal. No SPL, no regular expression.Both empty (the default): every origin. An empty include list means every origin except the exclusions. Exclusions win.
Include every member of a cluster. Excluding only the cluster members does not exclude a management node that also runs searches; to isolate one search head tier completely, include its hostnames.
The scope applies to the live collection and to the backfill: audit records, logins, automation evidence, resource records (indexer samples are mapped back to the search head of their search; an ambiguous mapping is excluded and reported as incomplete coverage), completion CPU and the capacity’s search head part. A change starts a new scope.
The scope is written into the base searches, so the indexers return only what can be in scope instead of every search head’s events. The audit, login and automation reads filter on
host(indexed metadata, matched case-insensitively); the resource and capacity reads keep the in-scope search heads’ samples and the indexer processes of their searches (remote_<search head>origins), so the capacity lists the indexers that serve the scope. The base-search terms always select at least what the exact rule keeps. An exact name or a name ending in*is the filter itself. An include holding?or an inner*is written on its literal prefix (team-*.example.net→team-*; an include without one, such as*.example.net, leaves the includes out of the base search), an exclude of that kind is not written in the base search, and the exact rule is applied after the base search, so nothing in scope is ever skipped. Patterns written as exact names or with a trailing*filter the most at the source. A tenant without a scope runs the same searches as before.It is a monitoring rule, not an access-control boundary: nothing is deleted from the source indexes.
Reports and schedules¶
Provisioning creates every report of the tenant and schedules them at once. Each report runs
| trackmeuamtracker tenant_id=<tid> job=<job> (or its own command) as the tenant
owner, with its own lock, its receipt (the outcome of the latest run, kept in KV
and indexed as trackme:uam:receipt) and its entry in the tenant’s operational status.
Report |
Schedule |
Does |
|---|---|---|
|
|
The audit trail from a durable ingestion checkpoint through the route account, the delayed recounts and re-reads of its ranges; CSV writer hints. |
|
|
The CPU and memory of every search, window by window from its own checkpoint, their re-reads, and the hourly search capacity. Unscheduled while resource collection is off. |
|
|
The Splunk Web logins and the automated searches of the audit trail, up to where the audit activity has read, for the human and service account detection. |
|
|
The indexes each audited search names, from its own checkpoint in the audit trail, resolved through the published catalogs of the search’s tier; the indexers’ confirmations on distributed deployments. See Data usage. |
|
|
Evaluates the built-in policies, writes findings and Finding groups, expires temporary dismissals, delivers operator and user notifications, runs the automation rules. |
|
|
Summarises the published catalogs of the tier for the policies run (reads no source). |
|
hourly wake ( |
Lists every saved search of the tier when due: every Catalog collection every hours (24) inside the off-peak window (01:00 for 5 hours, search head local time). A tier’s first listing runs at the next hourly wake, whatever the window. A listing longer than its budget continues at the next wake its window allows. |
|
15-minute wake |
Users (with the email address for user notifications) and roles, read every Users and roles every minutes (60). |
|
15-minute wake |
CSV lookup file metadata (size, owner, modification time; never the contents), read every 15 minutes. |
|
hourly wake, each at its own minute |
The ten other knowledge-object families, on the catalog cadence, in the off-peak window. |
|
|
The history before the live start, bucket by bucket; retires itself when done. |
|
the policy’s own cron |
One per enabled, published custom policy. |
|
hourly, at a minute derived from the tenant |
The UAM AI Agent’s scheduled triage; created unscheduled, scheduled only when AI is available and the tenant enables it. |
The per-tier catalog reports are named trackme_uam_kos_<dataset>_tracker_tenant_<tid>_tier_<tier>.
The tracker schedules are fixed; the cadences inside them (Catalog collection every, Users
and roles every, the listing window) are settings.
Run budgets¶
Time is the only bound of a run: what a run cannot read in its time continues at the next run through its checkpoint, never cut to fit a row count. Every budget defaults to its tracker’s interval less 30 seconds, the margin covering the run’s own writes before the next scheduled run:
Tracker |
Setting (key) |
Default |
|---|---|---|
Audit activity |
Audit activity max seconds per run ( |
270 s (30–900) |
Resource usage |
Resource usage max seconds per run ( |
270 s (30–900) |
Account signals |
Account signals max seconds per run ( |
870 s (30–900) |
Data usage |
Run budget in Settings → Data usage ( |
870 s (30–14,000) |
Saved-search listing and catalogs |
Full listing budget ( |
3,570 s (300–14,000) |
Historical backfill |
Backfill max seconds per run ( |
3,570 s (600–3,570) |
No skipped runs. The scheduler may dispatch a run up to five minutes late, and it skips a
run whose previous run is still going. A scheduled run’s budget is therefore capped to end
30 seconds before the tracker’s next scheduled run; a run dispatched so late that less than
15 seconds would remain records a skip (dispatched_after_schedule_cutoff) instead of
starting. The receipt records the budget applied (run_budget: the seconds, whether they
were capped and by how much the dispatch was late), and the tracker’s Duration in Collection
health explains a cap.
Each indexing-layer tracker keeps a share of its own budget for its re-reads, recounts or capacity refresh only when some are due; nothing is shared between trackers, so a slow resource read never takes time from the audit trail, and the other way round.
Collect now, Run now and manual collection¶
Collect now (workspace status strip) runs every tier’s inventory summary, then the audit activity, the resource usage and the account signals, then the policies, and every tier’s full saved-search listing. The other catalog families record a request their reports pick up at their next wake.
Run now / List now (Collection health) dispatches one tracker.
With Scheduled trackers off, nothing runs on a schedule: collection only happens on request. Scheduled collection requires a tenant owner (
scheduled_collection_requires_tenant_owner).A scheduled run never blocks the workspace. A Collect now refused because a run holds the lock (
uam_job_running_or_recovery_required) is explained, not reported as an error.
Locks and recovery¶
One run per tracker at a time. Locks carry the local server GUID and the search id and are never stolen by age alone:
A lock at least five minutes old whose search job has provably stopped on the same search head is recovered automatically at the next acquisition.
Recover stopped run (Collection health,
POST recover) does the same on demand.Locks held by another cluster member, locks without a search id and configuration locks without job ownership are never recovered automatically: verify the originating process on its search head.
The tenant lifecycle (delete, enable, disable, RBAC) has its own guard bound to the process that holds it, so a request whose process died never blocks the tenant for good.
Knowledge-object catalogs¶
The inventory is read from the Splunk REST API only — no _internal or _audit
search is used to discover objects or changes. Each dataset of each tier is its own scheduled
traversal:
Family (account view tab) |
Datasets |
Cadence |
|---|---|---|
Saved searches & alerts |
Every saved search (reports and alerts), with owner, app, sharing, cron, dispatch bounds, enablement and the definition. |
Catalog collection every (24 h), off-peak |
Users and roles |
Users (with their email address, kept in a private store) and roles. |
Users and roles every (60 min) |
Lookups |
CSV lookup files (metadata only), lookup definitions, automatic lookups. |
Files every 15 min; the others on the catalog cadence |
Dashboards |
Dashboards and views. |
Catalog cadence |
Macros |
Macros. |
Catalog cadence |
Event types |
Event types. |
Catalog cadence |
Fields |
Field extractions, field transforms, field aliases, calculated fields. |
Catalog cadence |
Tags |
Tag assignments. |
Catalog cadence |
Every traversal is paged (Inventory page size) and bounded by time (Full listing budget), never by a record count, and publishes a complete generation or nothing. A traversal that does not finish within its budget continues at the next run of its tracker, from where it stopped, in a staging generation, and is published once complete; until then the previous catalog stays in use and keeps the policies complete. Collection health shows such a run as collected with Listing continues next run; Listing made no progress, Listing restarted (access refused) and No page read in time are the warnings, and a listing carried over for more than seven days starts over. A failed traversal keeps the last good catalog. Only one traversal runs at a time per tenant and tier; a busy report waits for its next wake.
Definitions — saved search SPL, macro bodies, event type searches, dashboard source, field expressions, lookup configuration, tag assignments — are kept up to 256 KiB per object in the administrator-only knowledge collection, from an explicit attribute list (never credentials, never CSV contents). They are not executed, indexed or copied to the policy inventory. Older generations (other than the current and the previous one) are deleted after 30 minutes.
CSV lookup sizes before Splunk 10.4. The lookup file listing gives no size before Splunk 10.4 (Splunk 10.4 and later report it, with no extra access); UAM then reads the size and modification time of each CSV lookup file listed without one through
admin/file-explorer, one lookups directory at a time (the path only locates the file and is never stored). The tier’s collection account must be allowed to read that endpoint, which by default onlyadminandsplunk-system-rolecan: a least-privilege account cannot retrieve CSV lookup sizes before Splunk 10.4. A refusal is reported aslookup_size_access_denied(Lookup sizes refused), never as a partial listing.Each saved search, user, role and lookup file is diffed against its previous row: a new row is
added, changed fieldschanged(withchanged_fields), a classification change alonereclassified, a row seen again after removalreappeared; a row absent from a complete traversal is markedpresent=false— never deleted. A partial traversal marks nothing removed. Each change is indexed astrackme:uam:inventory.The catalogs reflect what the tier’s account can see: coverage of private objects depends on its permissions. A traversal is not an atomic snapshot.
Where they appear: the account view’s owner catalogs (Saved searches & alerts, Dashboards, Macros, Event types, Fields, Lookups, Tags), Search knowledge objects on the Users tab (across every owner), the saved search view, and Collection health → Trackers (family Knowledge object catalogs). Tenant administrators only.
Activity¶
The Audit activity tracker reads the _audit trail from a durable ingestion-time
checkpoint. Time is the only bound of a run: nothing is cut to fit a row count, and what a
run cannot read in its time continues at the next run.
It loads the checkpoint, or initialises it at now − window on the first run or when the environment changed (
checkpoint_reseton the receipt).It reads ranges of up to Activity window (300 s) from the cursor, less the part of the Activity overlap still owed, until it catches up (now − 10 s) or its budget (Audit activity max seconds per run, 270 s) is spent. Both audit formats are evidence: the legacy
Audit:[…]key=value line and the structured JSON record. The rows are normalised and correlated by search id.A busy range is split, never cut. A range holding more audit lines than one read returns, or that Splunk finalized, truncated or reported with dropped results, is halved, down to one second, and a one-second range is read whole, streamed in ingestion order.
A range cut by the run’s budget resumes at the next run after the last line it wrote (
resume_next_run); near the live edge it is read again from its first line instead, so a line indexed a moment late is not missed.A failing range is held and retried, never skipped (
window_held): it is retried at once within the run, then at the next runs, and halved after three failures to isolate the failing span. A range held for 15 minutes is a Collection health problem.Indexers that do not answer. A range read while some search peers did not answer keeps what the others returned and is listed to be read again once every peer answers (
window_reread_pending), with a back-off of 5 minutes up to an hour. The re-read writes only the lines missing the first time.Late lines are recounted. About ten minutes after a range is closed, it is counted again with the same search; more lines than were written lists the range for a re-read (
window_recount_mismatch).The overlap and a ledger of what was written make sure nothing is written twice, resumed, retried and re-read ranges included. The checkpoint is persisted after every range.
Splunk’s search messages are recorded, never interpreted: only a clear failure (a failed or cancelled job, a broken read) discards a search. Evidence-quality diagnostics (
normalization_gap,locator_conflict,invalid_event_envelope,unsupported_source_contract) are recorded but never block.
The same run records the CSV lookup writes it saw (probable writer hints for the CSV policy). The resource usage, the capacity and the login and automation scans are trackers of their own (below).
Account signals¶
The Account signals tracker (every 15 minutes, Account signals max seconds per run, 870
s) scans the audit trail for Splunk Web logins and automation evidence (searches run by
the scheduler, the REST API, acceleration), the signals behind the human and service
detection (see Data usage). Each scan has its own cursor
and trails the audit activity’s cursor without ever holding it; the login scan takes up to
half of the budget, the automation scan the rest. A scan range that cannot be read is listed
to be read again, like an audit range. Before the first audit activity run, the tracker waits
(account_signals_wait_for_activity).
Source contract. The audit source contract is the format, never the Splunk version: a
line that parses as the legacy key=value grammar or the structured JSON is evidence. The
qualified families are Splunk Enterprise 9.4, 10.4 and 10.6 and Splunk Cloud 10.5; any other
version is read all the same and only adds the soft diagnostic source_version_unqualified. With
Source version assumption on (the default), emitters whose version could not be verified
are parsed under the connected head’s version and labelled assumed.
Resource usage and CPU accounting¶
With Collect search resource usage on (the default), the Resource usage tracker (every
5 minutes, two minutes after the audit activity, Resource usage max seconds per run, 270 s)
reads the resource records window by window from its own checkpoint and writes one
trackme:uam:resource record per search and account: CPU seconds, the part spent on the
indexers, peak memory, elapsed time, node count, and Splunk’s own search type, provenance,
mode and label. Its reads are paged and resumable like the audit’s: every search of a window
is kept, a window read while peers did not answer is collected again and replaces the earlier
collection, and the policies never count a replaced collection. With resource collection off,
the report is unscheduled and not assessed.
CPU follows Splunk’s own accounting where it exists, decided per window and per tier (search head, indexers) from the data:
Splunk Cloud 10.5 accounts CPU at search completion (the audit
cpu_timeon the search head, the indexers’ completion lines). A tier with a completion figure counts its CPU once, at completion.A tier without one keeps the CPU integrated from the
_introspectionper-process samples (Splunk Enterprise 10.4).Every record carries
cpu_source(completion,head_completion,peer_completionorintrospection). Real-time searches always use sampled CPU.Peak memory reads not measured for a search no introspection sample caught (short searches in pooled processes on Splunk Cloud).
The capacity — the cores and memory of the search hosts, the nodes that ran a meaningful share of the search processes (a utility node running its own few searches is listed but kept out of the basis) — is refreshed at most hourly by the Resource usage tracker and drives the automatic budgets of the resource policies. With an activity scope, it counts the search heads in scope and the indexers that serve them. A failed refresh keeps the previous record.
Policies run¶
Every 15 minutes the policies job:
reads the present inventory rows of every tier under the inventory lock (a long inventory publication makes it wait up to 90 seconds, then fail with
inventory_publication_in_progressand retry at its next schedule) and evaluates the inventory policies with the completeness of each tier’s catalogs;aggregates the indexed audit and resource records of the Activity policy window (15 minutes) and evaluates the activity and resource policies per account. The window ends where the collected evidence ends — the audit activity cursor, and the resource cursor when a resource policy is enabled — never at the current time, and never starts before the collected history. Consecutive windows always touch (with less than a whole window of new evidence, the window reaches back into what was already evaluated), so no minute is skipped; a run evaluates a further window only for a whole window of new evidence. Every aggregation is read whole; one Splunk reports as partial (missing peers, truncated output) is refused, and its window is evaluated again;
reconciles the findings and the Finding groups under the findings lock (see Findings and Finding groups), expires temporary dismissals, publishes the counts the card reads and writes one
trackme:uam:findingevent per transition;delivers the operator notifications and the user notifications, and runs the automation rules (fail-open: a delivery failure never fails the run).
The receipt stores one evaluation per policy (enabled, state, evaluated / matched /
excluded / unknown / not applicable counts, readiness, thresholds source) and its bounded
insight (see Policy insight and preview). Completeness is per family: inventory
findings are marked not observed only when every tier’s catalogs are complete, audit findings
when the activity window was complete, resource findings when the resource coverage is
complete on top. A rule whose aggregation failed is incomplete and neither creates nor
clears anything. There is no findings limit: every match opens a finding. A very large live
investigation queue (more than 50,000 findings one run can change) raises the Collection
health warning findings_working_set_large; nothing is refused.
Bank holidays. A UAM tenant takes one effect of the bank holiday calendars, Suppress new alerts (Hold new findings). While a holiday of the
tenant’s calendars applies and the effect is on, the policies set to hold
(policies.<policy id>.hold_on_bank_holidays, defaults in The built-in policy
catalogue) open no new finding:
The run reads the holidays once, only when an enabled policy holds: the holidays that overlap the evaluated activity window, then the tenant’s calendars and effect. The outcome is
holding,off(a holiday applies but the tenant does not hold) orunavailable(the calendars could not be read: nothing is held, a warning is logged).An inventory policy holds while a holiday is active at the time of the run (it judges the configuration as it is now). An activity or resource policy holds when a holiday overlaps its activity window: a burst on the last evening of a holiday is a holiday burst, even when the run comes after midnight.
A match of a held policy whose finding does not exist, or is not observed (resolved, dismissed, or not seen by the previous run), is skipped before the capacity check: no finding, no Finding group, no transition, no
trackme:uam:findingevent, no operator notification, no findings action, and no findings capacity used. The direct user notifications leave its state untouched: a held match is neither a detection nor a step towards a recovery.A finding already observed is evaluated as on any other day (updated, escalated, no longer observed); expiries and housekeeping are unchanged. A held match never makes the run incomplete, and the first run after the holiday opens what was held.
When the outcome is not “no holiday”, the receipt carries bank_holidays: state,
names (up to five holidays), held (the matches held) and policies (the enabled
policies set to hold). Each evaluation that held carries its own held count, and the
findings counters carry held while the run holds. The policy_evaluation endpoint
returns the run’s bank_holidays.
Historical backfill¶
The backfill report collects the audit and resource evidence of the configured range before the live activity start (Backfill days: none — the wizard’s preset —, 7, 14, 30, 60 or 90 days in the wizard, 0–90 in Settings), through the route account. Evidence in an index cannot be taken back, so the backfill never collects a span twice, and nothing is skipped:
The plan ends exactly where the live activity started and waits until the first audit activity and resource usage runs have set that point (
backfill_waits_for_first_activity_run,backfill_waits_for_first_resources_run, normal receipts).Fixed buckets (Backfill bucket, 5 minutes by default) are walked backwards, newest history first, one audit read and one resource read each, with the live collection’s reads: a busy bucket is split, down to a few seconds read whole.
A failing bucket is deferred, never skipped. Before any bucket succeeded in a run, a failure stops the run (a source that is down costs one attempt per hour, and the run is reported failed). Once one succeeded, the deferred buckets get their next attempt and the run goes on past a failure; three failures in a row stop it (
backfill_source_failing). A bucket that keeps failing is halved to isolate the failing span.A bucket cut by the end of its run resumes at the next run after the last line it wrote; a run stops at Backfill max seconds per run (3,570 s). A bucket read while some peers did not answer is listed to be read again, like a live range.
Retention edges come from the sources: the plan stops at the oldest
_auditand_introspectiondata (retention_reached). The introspection retention is usually shorter (about two weeks), so the resource history may end earlier than the audit history.Re-plans carry the coverage forward: a changed range or bucket size, or Plan again, starts a new plan where the previous one stopped; a range already covered completes at once. A complete or cancelled plan un-schedules the report;
backfill_days = 0disables it.The backfill also scans each bucket for Splunk Web logins and automation evidence, so the people and services already active when the tenant was created are classified without waiting. It does not record CSV writer hints, and the inventory is never backfilled.
Controls in Collection health → Trackers, on the expanded Backfill row: Pause (after the current bucket, progress kept), Resume, Cancel (retires the report; collected buckets stay indexed), Plan again, and Run now. The receipt carries the buckets done / split / retried / deferred / resumed, the events written, the progress (percent, estimated end from the measured rate) and the plan status. An existing tenant keeps its bucket size: set Backfill bucket (s) to 300 to move it to 5-minute buckets; the plan is rebuilt and the coverage already collected carried forward.
Receipts and diagnostics¶
A receipt is value-free: counts, statuses, diagnostic codes and window bounds — never an account name, a search text or a credential. Collection health renders the latest receipt of every job and the last seven days of runs from the indexed receipts, each diagnostic explained. A completed run with zero observations is a successful run: absence of activity is not a failure. A completed run is not a lossless-ingestion guarantee — the receipt says what was covered.
The evidence¶
Evidence events are written to the dedicated trackme_uam_events.log under
$SPLUNK_HOME/var/log/splunk (UAM writes one line per search, so it never shares the
state-events file of the other components) and routed by TrackMe’s ingest evaluation to the
target index of their family.
Sourcetype |
Family |
One record per |
Main content |
|---|---|---|---|
|
evidence |
Search and window |
The account and app, the search id, type and status, the run metrics, the time
bounds (the |
|
evidence |
Search and window |
The search’s resource usage: CPU seconds (search head and indexers) with their source, peak memory, elapsed time, nodes and samples. |
|
evidence |
Inventory change |
The object’s fields, the change (added, changed, removed, reappeared, reclassified) and the fields that changed. |
|
evidence |
Index reference and batch |
One fact per joint key (tier, account, app, origin, path, index, sourcetype, read or write, named or unresolved) and audit batch, with its counters and up to five sample search ids. See Data usage. |
|
search text |
Reported search |
The SPL, written only while Store SPL search is on. |
|
findings |
Finding transition |
The finding with its evidence and investigation state. |
|
receipts |
Tracker run |
The outcome of the run. |
Observation fields.
accountandaccount_source,app,sid,search_type,category,outcome,search_status,metrics(total_run_time,event_count,result_count,scan_count,exec_time),time_bounds(search_et/search_ltas text) andgranted_time; use_timefor the event time. The same sourcetype also carries onerest_accesssummary per account and batch (REST job access counted per kind:job_poll,job_lookup,job_dispatch,stream,remote,other) and thedenied REST:lines (security evidence).Correlated executions are not indexed: the Activity tab, the account views, the REST API (
activitywithkind=execution) and the AI Agent correlate each search from its audit records when they read it (start and completion observed, ambiguity, the accounts, apps and search types reported). Thetrackme:uam:executionevents of earlier versions stay searchable until they age out, and are read too.Resource fields.
account,sid,app,search_type,provenance,mode,label,cpu_seconds,peer_cpu_seconds,cpu_source,peak_mem_mb,elapsed,nodes,samples,roles,window.Inventory fields. Additions, reappearances and removals carry the whole object; a
changedorreclassifiedevent carries only the changed fields, new (object.<field>) and earlier (previous.<field>), plus the owner.Data usage facts carry
key(the JSON list of their dimensions) and the counterssearches,index_searches,index_completed,late_searchesandmatched_events, written as the indexed fieldsuam_data_key,uam_data_refs,uam_data_n,uam_data_ndone,uam_data_lateanduam_data_events, plusuam_data_index,uam_data_sourcetypeanduam_data_label(the saved search that ran). A map over 30 days is onetstatsover these fields, never a read of raw events.Finding transitions carry the evidence only when the policies run changes it (
new,updated,reobserved); every decision field stays.Every event carries
tenant_id(an indexed field) andenvironment_id; the audit and resource records also carry the indexed dimensionsuam_kind,uam_environment,uam_account,uam_sid,uam_appanduam_status, so the per-account and timeline reads run throughtstats. These index-time settings take effect after the splunkd restart of the app installation, on the instances that parse the UAM log; until then, and for older evidence, the readers fall back to slower raw searches.No field is written that nothing reads, while the fields with investigative value stay.
Default indexes: the tenant’s summary index for evidence, search text and receipts, its notable index for findings. Each family can be pointed at another index in Settings → Indexes.
One compact record per search and window: the grant folds into the completion (
granted_time), REST job access is summarised per account rather than written line by line, null keys are dropped.Searches, dashboards, alerts or custom policies of your own that read
sourcetype=trackme:uam:executionreturn nothing for activity collected since 2.4.21: rewrite them onsourcetype=trackme:uam:observation(one record per search and window, withsid,outcome,granted_time,category,search_statusand the account fields).
Store SPL search and Fetch SPL¶
Store SPL search (
store_search_text) is off by default. When on, the SPL of every reported search is indexed as its owntrackme:uam:search_textrecord in the search text index. Audit search text can carry literals and secrets: point the search text index at an index restricted to the people allowed to read it before you switch this on.Fetch SPL (account view, Activity tab, saved search view) shows the SPL of one search. It reads the stored
trackme:uam:search_textrecord (or older evidence that carried the SPL inline) as the calling user; otherwise it reads the environment’s_auditrecord live through the route account, as the calling user, and stores nothing. When the text cannot be shown, a reason says why:not_in_audit,account_access_denied(your roles are not granted the route’s remote account),access_denied(the environment refused you),account_resolution_failed,authentication_failed,transport_error,search_incomplete,deadline_exhaustedoraudit_lookup_failed.
The saved search view¶
Opened from a saved search finding, the Scheduled searches tab or an account’s owned
searches, the saved search view shows the inventory definition of the saved search on its
tier, its runs (CPU, run time, peak memory, a CPU chart and the 50 latest runs), its findings
and its change history. Fetch definition reads the current definition live from the
saved search’s own tier, as the calling user (reasons such as not_found,
account_access_denied, access_denied or tier_not_configured explain a refusal);
nothing is stored. Runs are matched on name, app and owner (a nobody-owned saved search
runs as splunk-system-user); a run of the same saved search by another account is left
out.
Licence impact¶
The evidence is indexed data and counts against the Splunk licence like any TrackMe summary event. Its volume follows the search activity of the monitored environment — one compact record per search and window, one resource record per search and window, the inventory changes, one receipt per run. No row count caps it: UAM collects everything in scope. To reduce it, restrict the Activity scope to the search heads you need to monitor, switch off Collect search resource usage (the resource policies then stay learning), keep Store SPL search off, and size Backfill days with the retention of your sources in mind.
Data usage¶
The Data usage tab (Data usage) answers which indexes are read, by whom and through which path. This section describes the collection behind it and the rules its views follow.
The collection. The trackme_uam_data_usage_tracker_tenant_<tid> report (4-59/15 * *
* *) has its own checkpoint in the audit trail, its own budget (870 s by default), lock,
receipt and Collection health entry. It reads the audit trail through the same bounded,
resumable reader as Audit activity, and writes no activity records. What a run cannot finish in
its time continues at the next run; a batch whose extraction or writes failed is held and read
again, never acknowledged.
Resolution. Each search is parsed for the indexes and sourcetypes it names: literal
index=andsourcetype=terms,INlists, macros (with their arguments), event types, data models (their root constraints) and saved searches (savedsearch/loadjob), resolved through the published catalogs of the search’s own tier, with Splunk’s private / shared precedence. Wildcards stay patterns. A negated term never makes a read. A late field filter (after the first command) is a reference, not a source read. Acollectdestination is a write reference. So is the target index of a saved search’s summary indexing or Log event alert action, read from the published saved search catalog (inheritedalert_actions.confdefaults included; an empty target meanssummaryormain) and recorded on each run on the pathsummary_indexorlog_event. Custom alert actions are never inferred.Unresolved scope. What cannot be resolved is counted, not dropped: the search is recorded as scope unresolved with its reasons (a macro, event type, saved search or data model the catalog does not hold, a dynamic term, a wildcard role default, a truncated SPL, a resolution limit reached). For a search naming no index, the indexes its account’s roles give it (the role search filter’s indexes, else the default indexes the roles allow) are shown as context, never as reads.
Counted once. A search is counted at its grant in the legacy
Audit:[…]key=value format, or at its completion in the structured format. A canceled or failed completion counts; a search Splunk refused at its quota (action=quota info=denied) is not a read.The indexers’ confirmations. On a distributed deployment, the search peers record in
remote_searches.logthe search they received after Splunk expanded its macros and saved searches. The Data usage run reads those lines from its own cursor and keeps them as a separate facet (Indexers received), never added to the search head’s counts. A standalone search head has none.Declarations. Each catalog publication projects which knowledge objects name each index (saved searches, macros, event types, dashboards, data models). A declaration is not a read.
History. When the tenant has a backfill, the Data usage history starts at the backfill depth, upgraded tenants included, but never before the oldest event of the audit trail: what
_auditno longer holds cannot be read. Without a backfill, a new tenant’s history starts where its Audit activity started, and an upgraded tenant’s at its first Data usage run.
The rules of the views. Every case, with diagrams and worked examples, is in the Data usage reference: how each claim is processed.
One indexing layer. Usage classes and review candidates are decided across every tier of the tenant: an index read on any tier is never a candidate. The indexes TrackMe writes to — the global index settings, every tenant’s overrides and this tenant’s own families — are never candidates.
No absence from too little evidence. Until the collection covers the selected period, or seven days of it, no index is called unread and no knowledge object not run: the views say so far and give the date from which the claim can be made. A period with no Data usage run, an incomplete fact read or facts without the rollup key withhold every absence verdict. The first runs of a new tenant, before its first catalog listing, count as progress.
Excluded apps (
trackmeandSplunk_SA_CIMby default) are shown, never counted: an index only they read is Excluded apps only.Wildcards reach by index name.
index=cribl_*is matched against the indexes known for the tier with Splunk’s index pattern rule (*never matches an internal index), then narrowed to the indexes its reader’s roles allow; it is never narrowed by sourcetype. A wildcard reference never makes an index read by name.Role search restrictions. The roles of each reader are read from the published users and roles catalogs when the view is read: allowed indexes, minus the disallowed ones, narrowed by the index terms of the role search filters. A named index the roles do not allow is counted as denied by roles, never as a read. The scope is an upper bound, and the current roles apply to the whole period.
Not due. A scheduled saved search that did not run, whose schedule leaves a longer gap than the period covers, is Not due in this period, never Not run.
Least accessed ranks the indexes read by name with a daily volume above zero by reads per GB/day, and marks the lowest quarter. It needs at least four such indexes.
Volume and cost. A tier is linked to one VOL tenant (index volume) and up to 200 DSM tenants (incoming data), matched automatically whatever account they collect through unless set in Settings → Data usage. The cost per day comes from the VOL tenant’s costs (its Global license usage configuration), when they are enabled; otherwise no cost is shown, never a guessed one. A link grants nothing: every read repeats the caller’s visibility of the linked tenants. An index without a linked volume is counted, not weighed. Each index is weighed by its 30-day average of complete days; while VOL has no average for an index yet (its first day without a backfill), by its last 24 hours, and the views say so.
Reads without a time budget. The map, an index’s detail, the knowledge objects and the
access timelines run as the caller’s own search jobs: the start request dispatches them and
returns at once, the UI polls them until every one is done (naming what is still being read),
and cancels them when the selection changes or the view closes. Only the 600-second safety
timeout applies; a read that reaches it is reported incomplete, never shown as empty data. The
start answer fixes the period, and every poll reads the same one. The linked VOL and DSM reads
page through every record, each request bounded by splunkd_timeout.
Limits. At most 50,000 fact keys and 10,000 catalog indexes per tier are read per map; a larger answer is flagged truncated and withholds every absence verdict. An access timeline has at most 120 clock-aligned buckets and 10,000 aggregated rows, ten lanes per page. Every limit reached is said in the view.
Identity and classification¶
The account. Every observation carries account and account_source
(legacy_search_user, structured_actor or unknown). The legacy user header wins
when present: it names the caller, while the structured actor is often the system principal.
It is a labelled source claim, not a verified initiator: UAM never claims that a person sat
at the keyboard, and a scheduled search runs under its owner or the system account.
Classes and detection.
Class |
Detected when |
Limits |
|---|---|---|
|
An interactive search — a resource record whose provenance starts with |
Ad hoc alone is not a signal (connectors dispatch ad hoc searches through the API); a
labelled dispatch is not either (a dashboard set to run as its owner). Users working
only through React apps (TrackMe’s UI included) reach splunkd as |
|
Sustained automation and nothing a person does: automated searches (REST, scheduler, acceleration, internal) on at least seven distinct days, never a Splunk Web search, a splunkjs page, an MCP client or any other provenance a person might use, and not a detected human. Withdrawn as soon as such a search appears. Switch: Detection (service). |
The automation days come from the legacy key=value |
|
Seeded for |
Assign it by hand to the tenant owner and to the administrator accounts that run the platform’s own workload. |
Rules. Up to 100 ordered classification rules, each with a name, an enabled flag, a
match type (exact or wildcard — *, ?, [abc], [!abc] on the whole name;
no regular expression), a pattern, case sensitivity and the class. No naming heuristic runs
unless an administrator saves a rule. Manual classes (up to 10,000, from Settings, the
Users tab or its bulk classification) always win.
Precedence, in every reader (Users tab, account view, inventory, policies): manual class → system default → first enabled matching rule → human detection → service detection. Unmatched, undetected accounts stay unclassified. Removing a manual class returns the account to the automatic resolution; disabling a rule stops it at once; switching a detection off ignores its records without deleting them. Settings → Account classification previews the draft (up to 1,000 names, the effective class and its source) before saving; the Users tab shows a detected marker with the evidence next to the class. Changing a class never rewrites historical evidence nor resolves an investigation: the policies use it at their next run.
Privileged users¶
The Privileged users tab and Settings → Privileged users (privileged in the
configuration) answer which accounts hold high privileges on the monitored tiers, and why.
Definition. An account is privileged when one of its roles, or a role that role imports
(imported_roles, resolved transitively; a cycle is tolerated), is a privileged role or
grants a privileged capability.
Inheritance. Splunk grants roles and capabilities through direct membership and through
inheritance, and a role inherits from roles that inherit further: the assessment resolves the
import chain breadth first. An inherited reason keeps its chain (path: the role held first,
the privileged role last), an inherited capability names the role that grants it itself
(granted_by, the nearest one; none when only Splunk’s imported_capabilities knows it),
and each role keeps its own definition (its own capabilities and the roles it imports itself)
apart from what it inherits. The tab words them: team_lead imports admin, team_lead
inherits admin through ops, leaf inherits list_settings from base through mid.
Rule (key) |
Default |
Behaviour |
|---|---|---|
Role name patterns ( |
|
Live, case-insensitive globs ( |
Roles added ( |
none |
A role no pattern matches, made privileged by name. |
Roles excluded ( |
|
Overrides a pattern. It removes only the name rule: a privileged capability the role grants still counts. |
Privileged capabilities ( |
|
Granted directly ( |
Up to 500 entries per list. A role name holds letters, digits and _ . -; a pattern also
* and ?; a capability also :; a role cannot be both added and excluded.
Data. No new collection and no call to Splunk: the assessment reads the published users
and roles catalogs of every tier (each role’s capabilities, imported_roles and
imported_capabilities, each user’s roles), so it follows Users and roles every
(60 minutes by default). An account present on several tiers is one account, and each of its
reasons names the tier that grants it.
What the tab shows. Tiles for the privileged accounts (and their share of all accounts),
the privileged roles, the privileged capabilities in use and the privileged accounts active
in the last 24 hours; pies of why accounts are privileged (role, capability or both) and of
their classes; a bar of the accounts per privileged capability; the privileged accounts with
their reasons in words, last seen and executions over 24 hours; the roles of every tier with
their rule, inherited roles and privileged capabilities. The activity is one tstats over
the audit records, read as you, naming the privileged accounts (up to 1,000; above, it reads
every account and keeps the privileged ones); when it cannot be read, the tab says the
activity is unavailable, never that the accounts were inactive.
Settings. The patterns in a text area, then two dual lists filled from what the tiers hold: roles (moving a role a pattern matches out of the privileged list adds it to the exclusions; moving another role in adds it by name) and capabilities. The rules apply from the next read of the tab.
The tab describes; the four privileged policies (see Privileged policies) raise findings from the same assessment.
The built-in policy catalogue¶
A UAM tenant evaluates sixteen built-in policies in four families. Every policy has:
Enabled — on or off.
Severity —
low,medium,highorcritical(UAM has no informational level). A manual severity set on a Finding group survives later runs; choosing Members (the highest severity of its findings) restores the derived one.Excluded owners / accounts and Excluded apps — up to 500 exact, case-sensitive names each (no wildcard). Every policy except the CSV lookup footprint starts with the apps
Splunk_SA_CIMandtrackmeexcluded, so TrackMe’s own trackers and data-model acceleration do not flag the monitoring itself. Exclude owner from this policy in a finding menu adds the owner to this list.Account scope (account policies) —
human(explicitly classified human),classified(human or service, never system) orall. Accounts outside the scope count as not applicable.Its thresholds, each compared strictly: a finding needs more than the limit.
During bank holidays — Hold new findings or Keep opening findings (see Policies run). The six inventory policies hold by default: configuration reviews nobody handles on a day off, still there the next working day. The activity and resource policies keep opening findings by default: unusual activity on a day off is more telling, not less. A configuration stored before 2.4.19 reads each policy’s default. Changing it never resets the direct user notifications.
The policy editor (Policies → Edit) has four tabs: General settings (status, During bank holidays, severity, scope, thresholds, automatic budgets, exclusions, Preview policy), Email template (the direct user emails of this policy, see Notifications and communications), Actions and Automations (findings actions, see Findings actions).
Inventory: saved searches
Policy |
What it detects |
Default |
Severity |
|---|---|---|---|
|
An enabled schedule owned by an account classified human. |
On |
Low |
|
An enabled schedule whose owner has no human or service class. |
Off |
Medium |
|
More scheduled runs per active hour than the limit. |
Off |
Medium |
|
A schedule with no lower time bound (all time). |
On |
Medium |
|
A schedule with a real-time dispatch range. |
On |
Medium |
Inventory: accounts
Policy |
What it detects |
Default |
Severity |
|---|---|---|---|
|
A CSV lookup file too large, or an account’s CSV lookups too large in total. |
On |
Medium |
Activity: accounts
Policy |
What it detects |
Default |
Severity |
|---|---|---|---|
|
An account launching an unusual number of searches. |
Off |
Medium |
|
An account running repeated long searches. |
Off |
Medium |
|
An account running all-time searches. |
On |
High |
Resource: accounts
Policy |
What it detects |
Default |
Severity |
|---|---|---|---|
|
An account’s search CPU above its allowance. |
On |
Medium → High |
|
An account running repeated searches heavy in CPU or memory. |
On |
Medium |
|
An account’s CPU today unusual for its daily baseline. |
Off |
Medium |
Privileged: accounts and roles
Policy |
What it detects |
Default |
Severity |
|---|---|---|---|
|
An account that became privileged (reported once per change). |
Off |
High |
|
A role whose own definition now grants more privileges (reported once, about the role). |
Off |
High |
|
A privileged account without activity for the period. |
Off |
Medium |
|
A privileged account the reference does not declare, or a stale reference. |
Off |
High (stale: Low) |
Default settings
What each policy applies to, its account scope, what it does on a bank holiday, and its thresholds with their defaults.
Policy |
Applies to |
Bank holidays |
Thresholds and notes (defaults) |
|---|---|---|---|
|
Saved search |
Hold |
No threshold. Common where administrators own every schedule, hence low. |
|
Saved search |
Hold |
No threshold. A governance gap, not evidence of misuse. |
|
Saved search |
Hold |
Maximum scheduled runs per active hour 12 (1 to 60). Configured frequency, not observed launches. |
|
Saved search |
Hold |
No threshold. |
|
Saved search |
Hold |
No threshold. An explicit |
|
Account, scope |
Hold |
100 MiB per file, 500 MiB per account and tier. No app excluded by default. |
|
Account, scope |
Keep opening |
Maximum distinct searches per window 200. |
|
Account, scope |
Keep opening |
Minimum run time 300 s, maximum long searches 3. |
|
Account, scope |
Keep opening |
Maximum all-time searches 0. |
|
Account, scope |
Keep opening |
Allowance 10 % of the search CPU capacity (else 3,600 s). Raised one severity level above a dominant share of 40 %. |
|
Account, scope |
Keep opening |
A heavy search uses 2 % of the search CPU or 10 % of the smallest search host memory (else 300 s or 2,048 MB); maximum heavy searches 3. |
|
Account, scope |
Keep opening |
3 × the daily p95 over 14 days, floor 3,600 s. Off, in preview mode: matches are recorded, no finding and no notification. |
|
Account, scope |
Keep opening |
No threshold. Splunk-operated accounts left out (Include accounts operated by Splunk, off). |
|
Role |
Keep opening |
No threshold. Exclusions name roles. |
|
Account, scope |
Hold |
Days without activity 30 (7 to 365). Splunk-operated accounts left out. |
|
Account, scope |
Keep opening |
No declared account and no lookup table (the policy stays learning), Report stale references on. Splunk-operated accounts left out. |
The server supplies the titles, descriptions, bounds and remediation of every policy; the sections below give the full detail.
Inventory policies — saved searches¶
The subject is one saved search of one tier; the finding keeps the same identity across runs. Explicitly unscheduled or disabled searches are not applicable; a missing flag or an unreadable bound is unknown, never assumed. Evidence: the owner and its class (with where the class comes from), the app, the tier, the schedule and the bounds read. UAM never edits nor dispatches the observed searches — the remediation is advisory. These policies follow the catalog cadence: the saved-search listing is daily by default.
Policy |
Details |
|---|---|
Scheduled search owned by a human account |
|
Scheduled search owner is not classified |
|
Scheduled search exceeds the hourly schedule limit |
|
Scheduled search has an all-time dispatch lower bound |
|
Scheduled search uses a real-time dispatch range |
|
CSV lookup footprint¶
csv_lookup_footprint/v1 — CSV lookups attributed to an account exceed its size
allowance — is an inventory policy whose subject is an account:
What it detects, separately on every search head tier: one CSV lookup file larger than Maximum individual CSV file size (default 100 MiB), or the cumulative size of the CSV lookups attributed to one account larger than Maximum cumulative CSV size per attributed account and tier (default 500 MiB). Both 1–1,048,576 MiB.
On by default, severity medium, account scope
all, no app excluded by default.Attribution: probable writer, recorded owner as fallback. The Audit activity tracker records, from the audit evidence it already reads, which account last wrote each lookup file. A file is attributed to that probable writer when the evidence supports it, else to its recorded owner (a shared file owned by
nobodyfalls back to its recorded owner unless audit evidence names a writer). The evidence keeps the basis of the attribution and both identities. Attribution is best effort since monitoring began, not proof of authorship: missing audit evidence, ambiguous targets, concurrent writes or later unmatched changes use the owner fallback, and the backfill does not provide writer hints.Size is the stored file size (a compressed CSV counts at its stored size), not the replicated bundle size. Only the metadata is read — never the contents — and no third-party app is required.
Only tiers whose lookup-file catalog is complete and less than an hour old are evaluated; a missing, partial or stale catalog can never clear a finding.
Suggested action: review the largest files and their generating searches with the probable writer or the owner; reduce retained rows or columns, use the KV store where appropriate, review bundle replication settings with an administrator. UAM never deletes a file nor changes replication. Direct user emails of this policy list up to 20 of the largest attributed lookups.
Activity policies — accounts¶
Aggregated from the trackme:uam:observation records of the evaluated Activity policy
window (15 minutes of collected evidence by default, see Policies run), one row per search first, then per account and app. The
counts are distinct search ids the Audit activity tracker observed — a launch-count proxy —
labelled with the coverage (complete / partial). One finding per policy, environment
and account: a repeated burst updates the same finding. Evidence: the window, the count, the
thresholds, the account class and scope, the top five apps and, for costly_search/v1,
the maximum and total run time. Excluded apps are removed from the account’s aggregate before
the threshold is compared.
Policy |
Details |
|---|---|
Account launched an unusual number of searches |
|
Account ran repeated long searches |
|
Account ran all-time searches |
|
Resource policies — accounts¶
Read from the trackme:uam:resource records (search heads and indexers, ad hoc and
scheduled), through one bounded rollup per policies run: CPU adds up across windows, memory
keeps its peak. The system class is outside the default classified scope (data-model
acceleration never becomes a finding by default) but its CPU stays in the share
denominator: it is real load.
Automatic budgets. With automatic thresholds on (the default), the absolute limits are derived from the capacity — the core sum of the search hosts and the memory of the smallest one — and clamped to each threshold’s own range:
Policy |
Percentage (default) |
Derives |
|---|---|---|
|
Allowance as a share of the search CPU capacity (10 %) |
Maximum CPU seconds = search cores × window seconds × percentage |
|
Heavy search CPU as a share of the search CPU capacity (2 %) |
Minimum CPU seconds of a heavy search = search cores × window seconds × percentage |
|
Heavy search memory as a share of the smallest search host (10 %) |
Minimum peak memory of a heavy search = smallest search host memory × percentage |
With automatic thresholds off, the stored absolute values apply. With them on but no usable
capacity, the stored values apply and the evaluation says manual_fallback. The evidence
carries the thresholds source (auto / manual / manual_fallback) and the capacity
basis; the policy editor shows the effective values.
Learning period. The resource rules are learning — nothing evaluated, no finding created, nothing marked not observed — until the tenant holds Resource rules: minimum history (24 hours by default) of resource history (the backfill counts) and, for automatic budgets, a known capacity. The Policies tab shows the reason.
Policy |
Details |
|---|---|
Account’s search resource consumption exceeded its allowance |
|
Account ran repeated resource-intensive searches |
|
Account’s CPU consumption is unusual for its daily baseline |
|
Privileged policies¶
The four privileged policies read the privileged assessment (see Privileged users) of every tier, from the published users and roles catalogs, in the policies run. They have no excluded apps (they judge roles and accounts, not searches) and never email the account a finding is about.
Changes, reported once. The two change policies compare the current assessment with the previous one, which the policies run keeps (a snapshot, per tier). A change is matched by the run that finds it and opened as a finding; the next complete run no longer matches it, so a resolve sticks and a later change opens a new episode. A change held by a bank holiday stays pending and is opened by the first run after it. The first evaluation, a change of the Privileged users rules, and a change policy turned on record the current state without reporting. A partial users or roles catalog never moves the snapshot, never matches and never clears.
Policy |
Details |
|---|---|
Account became privileged |
|
Role gained a privileged capability |
|
Privileged account is dormant |
|
Privileged accounts differ from the reference |
|
Accounts whose collected email address is support@splunk.com — the accounts Splunk operates on
a Splunk Cloud stack — are left out of the account policies unless Include accounts operated by
Splunk is on. How it is evaluated shows the records judged and, for the dormancy and reference
policies and the change author read, the exact searches.
Policy insight and preview¶
Policy insight — the Last evaluation and the count cells of the Policies tab open what the last run saw: a verdict, the population, why records were unknown, excluded or not applicable (
owner_unclassified,missing_<field>,cron_unreadable,excluded_owner/excluded_app,unscheduled/disabled,out_of_scope_<class>…), the owners and apps behind each bucket (owners can be classified in place), up to 25 samples, the run (window, readiness, thresholds source, inventory per tier) and a seven-day history per policies run.Preview policy (General settings) evaluates the draft against the latest stored inventory of the tenant without writing anything and shows the totals and up to 20 matching examples. It needs a collected inventory.
Custom policies¶
Tenant administrators write their own policies in SPL (Policies → Create policy). A custom policy runs on its own schedule and its findings appear with the built-in ones, in the same Finding groups.
Definition.
Title, description, default severity and remediation (shown on its findings).
Source tier — a policy about accounts reads the route account (the indexing layer); a policy about saved searches reads the selected tier. App context — the search namespace.
SPL — up to 64 KiB. Time range — relative, from
-<n><s|m|h|d|w>tonowor an earlier relative bound, at most 31 days in the past; no all-time, real-time, future bound or calendar snap. Schedule — a numeric five-field cron.
Map search results to findings.
Subject type: account (the result field holding the account) or saved search (the fields holding the owner, the app and the name — three distinct fields; alias them in the SPL). The subject places the finding in the right Finding group.
Dimensions (up to eight fields) — distinguish several findings about one subject.
Evidence fields (up to eight), a count field (occurrences per row, else one per row) and a time field (epoch seconds).
Advanced limits, for example the result rows read (10,000 by default, at most 100,000), the findings per run (1,000, at most 10,000), 25 findings per subject, the samples and evidence bytes kept per finding.
Changing the subject mapping or the source requires a higher identity version before publication: a new identity, so earlier findings are not reused for a different meaning.
Bank holidays — Hold new findings or Keep opening findings (
hold_on_bank_holidays, off when absent). It is not part of the identity, so turning it on needs no new identity version; it takes effect when published. A custom policy holds while a holiday of the tenant’s calendars is active at its anchor, the end of its search window: a holiday that ended earlier inside a longer window no longer holds. Held results publish no finding and use no findings capacity; a finding already observed is still evaluated. The run’s commit recordsheldand, when a holiday applied,bank_holidays(state and names), shown as Held N (bank holiday: <names>) on the run.
Lifecycle.
Step |
What it does |
|---|---|
Draft |
Save keeps a saved version of the draft (the 30 most recent are kept). Saving never publishes nor enables. |
Preview |
Runs the current form — saved or not — as you, asynchronously and cancellable (60 seconds, 1,000 result rows), and shows completeness, diagnostics, counts and at most 20 candidate cards. Nothing is published; a zero-row result cannot verify a mapping. |
Publish |
Freezes an immutable published revision (up to 100 per policy). Draft edits never change what is published. |
Enable / Disable |
Schedules or unschedules the policy’s report |
Archive |
Irreversible: the policy stops, its definition and findings stay readable and it can be duplicated. |
Delete permanently |
Removes the definition, its versions, its scheduled search and its execution history; findings, evidence and notes remain. |
Version history |
Load, compare, restore (as a new draft) or delete a version; the published revision is protected. |
Limits. 100 definitions per tenant (archived ones included) and 25 enabled. A scheduled run has 300 seconds and 10,000 result rows; at most 1,000 findings are kept per custom policy and 10,000 per tenant, separately from the built-in findings limit. Four custom policy runs at a time per installation, two per tenant, one per policy (previews included).
Execution health. Collection health → Trackers, family Custom policies, shows, per policy, the requested and actual schedule, the cron and next run, the last complete evaluation, the failure count, the recent runs and any running search; states are disabled, never run, healthy, healthy (no match), incomplete, failed, cancelled, capacity deferred, schedule drift, missed schedule and recovery required. Run now runs the published revision (findings may be published) and Recover frees a run whose searches are verified stopped. The Configuration Guardian reports the problems (see Configuration Guardian).
What differs from built-in policies.
Custom findings are not notified: the operator and user notification policy selectors list built-in policies only.
There is no Exclude owner from this policy action: write exclusions in the SPL.
A custom policy can only map to accounts and saved searches.
Warning
The SPL of a custom policy is arbitrary SPL run on a schedule as the tenant owner (with
the nobody owner, as Splunk’s internal scheduler identity), and a preview runs it as
its author: a command or macro with side effects has them, preview included. Only trusted
tenant administrators can author policies; give remote accounts least-privilege
credentials.
Findings and Finding groups¶
The shared lifecycle, triage and grouping concepts are explained in A finding and its lifecycle and Finding groups; this section gives the UAM specifics.
The finding¶
A finding is one row per policy, environment and subject (a saved search, an account, or a
role for the role policy),
with a stable id, its status (open, investigating, resolved, dismissed),
its severity (policy or manual), its assignee, a short investigation note, observed,
first / last seen, episodes, reopened_count, the dismissal deadline, a bounded
history (the 50 most recent records) and the evidence.
Transition |
Meaning |
|---|---|
|
First match: the finding opens. |
|
Severity or evidence changed while observed (a threshold edit updates the evidence without changing the identity). |
|
Matched again after an absence: a new episode; open and investigating findings only gain the history record. |
|
Not matched by a complete evaluation: the finding stays, its Condition reads not observed. It is never resolved for you; a partial evaluation never marks a finding not observed. |
|
A resolved finding observed again returns to |
|
A temporary dismissal ended: the finding returns to |
|
An operator decision; the policies never overwrite it. |
|
The policy no longer exists and its replacement evaluated fully: resolved by the system, not notified. |
Decisions¶
Decisions are made on the Finding group (one group, or up to 500 groups at a time), fenced
on the group’s version (a decision captured on an older version is refused,
finding_group_version_changed):
Status — Investigate, Resolve, Dismiss, Reopen. Resolve says the investigation concluded: the policy reopens the finding the next time it observes the condition. Dismiss says the finding is accepted: it stays dismissed while observed. Dismiss permanently (“until reopened by hand”) or for 1, 7, 30 or 90 days (API: one hour to 366 days); an ended dismissal returns the finding to open. Any status change clears a deadline; a new duration replaces it.
Snooze notifications — 1 hour, 1 day, 7 days or 30 days (API: 60 seconds to 90 days): the operator emails about the group are held; the status does not change. Transitions during the snooze are not sent later.
Severity — a manual severity; Members restores the severity derived from the group’s findings.
Assign — to a user or an assignment group (see Assignment and automatic routing).
Notes — the shared TrackMe Notes (Markdown, permanent or expiring) on the group or on a finding, separate from the short investigation note recorded in the history.
Every change leaves a history record with its author (an operator, the policy, the system or
the AI Agent). Decisions on findings and groups (triage, group_members) require a TrackMe
administrator of the tenant; a power user of the tenant can run findings actions, send an
email action and set an assignment.
Finding groups¶
Automatic grouping. All findings about one account and the saved searches it owns form
one Finding group — for example the two personal schedules of analyst-a and its
all-time-search finding. Ownership defines the grouping; classification does not. A saved
search without an owner keeps its own group. Every tier of the indexing layer shares the
account’s group; different tenants never do. A role finding (the privileged role policy) keeps a
group of its own. Each finding keeps its own subject, tier, policy, evidence and id. An automatic
group holds up to 5,000 findings.
The group is the triage unit. A decision applies to every member except a member dismissed on its own (Dismiss only this finding): that member keeps its own dismissal until it ends or is reopened, and the group’s decisions leave it alone. A new kind of problem on a dismissed group reopens the group and keeps the earlier members dismissed on their own: a dismissal never silences a new problem. The group’s severity is the highest of its observed members unless an operator set one.
Manual grouping. Select groups on the Findings tab:
Merge into one Finding group — 2 to 25 groups become one manual group (optional title). The most open status wins; a member whose decision differs keeps it on its own.
Add to a manual group, Remove from the Finding group (up to 25 findings at a time) and Ungroup.
An object’s findings always move together: removing a saved-search finding removes every finding of that object; removing an account returns it with its owned searches.
A manual group holds up to 50 findings; later findings of a full manual group go back to their automatic group. Automatic grouping never undoes a manual grouping.
Assignment and findings actions¶
Assignment (Settings → Assignment): up to 100 assignment groups (name, description, optional team email) and up to 100 ordered automatic assignment rules (by policy, severity, subject type, owner, app, environment), with optional emails to the assigned group. See Assignment and automatic routing.
Findings actions (Settings → Finding actions): up to 50 administrator-defined drilldown searches, links, webhooks (through system-wide Webhook accounts) and the email action, run by hand from a finding or group menu, and up to 100 automation rules that run them for a policy (Policies → Edit → Automations). See Findings actions.
Finding events¶
Every finding transition is indexed as trackme:uam:finding in the findings index (the
tenant’s notable index by default): build your own Splunk alerts, Enterprise Security
correlation searches or SOAR playbooks on them.
Notifications and communications¶
UAM has three email channels, all independent of each other. The shared principles are in Notifications.
Notifications to operators¶
Settings → Notifications to operators (notifications), off by default:
Events: New finding, Finding reopened, Severity raised, Finding resolved (on by default), Finding dismissed, Finding assigned. Being observed again or not observed never notifies.
Minimum severity (medium), Policies (empty = all built-in policies), Delivery account (a TrackMe email account, see Configuration; empty = the search head’s local mail transport), Recipients (up to 50, filtered by the account’s allowed domains), Mode: Digest (one email per policies run, grouped by event then severity) or Per finding (one email per transition, threaded per finding in the mail client).
Transitions are delivered at the end of the next policies run (within about 15 minutes); a failed send is retried at the next runs, and transitions older than 24 hours expire. A snoozed group’s transitions are not sent.
Send test email sends a synthetic message with the saved settings, even when notifications are off.
Every email links to the finding (
TenantHome?tenant_id=<tid>&component=uam&tab=findings&finding=<id>opens its Investigate view).
Notifications to users¶
Settings → Notifications to users (user_notifications), off by default: one email to the
account a finding is about, on detection and when the condition is no longer
detected.
Addresses come from Splunk’s user records, collected per tier by the users catalog and kept in a private store (never in the inventory, the evidence or the findings), or from an administrator’s Override email address (Users tab). A saved-search or CSV finding uses its own tier; an account finding needs one agreed address across the inventoried tiers, or the authoritative identity tier you choose. Missing, stale or conflicting addresses defer the email (at most 24 hours).
Who receives: never a system account; human accounts by default; service and unclassified accounts only when you opt in.
Detection and clearing: a new match opens an episode and sends one detection email. Two consecutive complete evaluations without the condition close the episode and send the “no longer detected” email (only after a sent detection, to the same recipient). Partial, unknown or learning evaluations never clear. A recurrence within repeat hours (24) does not send a new detection.
Baseline: the first enabled evaluation records the current matches without sending them, unless Include current detections once is on.
Independent of operator triage: resolving, dismissing, snoozing, grouping or assigning a finding does not stop or trigger user emails.
Content: a common banner, introduction, footer, reply-to address and an HTTPS support link, plus per-policy subjects and bodies (Policies → Edit → Email template; every built-in policy is on except
unclassified_schedule/v1; the privileged policies never email the account). Plain-text templates with the placeholders{account},{policy},{search_name},{app},{environment},{summary},{action}and{window}; subjects up to 256 characters, bodies up to 10,000.Limits: 50 emails per policies run (1–200), 3 per address per hour (1–20), 24 hours between repeat detections (1–168). One recipient per email.
Preview and Send test email (to a test recipient, for one policy) use synthetic data and work while the channel is off.
Send email communication¶
Send email communication (finding and group menus, tenant administrators and power users) prepares a reviewed one-off email about a finding, a group member or a whole Finding group (up to 200 findings, one section per finding): the modal shows the findings, the recipient (which you may change for this email only), a full preview, and asks for explicit confirmation. It is sent once from a search process, never retried blindly: when the outcome is uncertain, check the inbox before sending again. It does not change the findings or the automatic notification state.
The UAM AI Agent¶
The UAM AI Agent reviews UAM findings with the evidence UAM collected; it replaces the UAM Findings Advisor of 2.4.18. Its modes, notes and decisions are those of every findings AI Agent: see Findings AI Agents.
Inspect writes one current
[AI Agent]note per finding (assessment, confidence, recommendation) and changes nothing. Act also applies the decisions the tenant allows.Ask the AI Agent (one finding, from its menu or the Investigate view), Run a review now (AI Agent tab) and the scheduled triage (hourly, off by default).
The scheduled triage reviews at most findings per run findings, one per Finding group, skips a group reviewed within the review interval unless it changed, and never overrides an operator decision. Its selection uses the shared AI filters: by default only critical and high findings.
The AI Agent tab shows the scheduled triage status and the decision log (kept 90 days).
Requirements: AI enabled with a provider configured; for the scheduled triage, a tenant owner that is not
nobodyorsplunk-system-user(Guardianai_automation_owner_is_system_user). Launching, deciding and reviewing need a TrackMe administrator of the tenant; tenant power users can read the settings and the decision log.
Setting ( |
Default |
Meaning |
|---|---|---|
|
0 |
Scheduled triage on or off. |
|
inspect |
Mode of the scheduled triage ( |
|
empty |
AI provider; empty = the first available. |
|
1 |
Days before a reviewed Finding group is reviewed again (unless it changed). |
|
10 |
Findings reviewed per scheduled run, one per group (1–50). |
|
3000 |
Time budget of one hourly run, in seconds. |
|
1 |
Act may mark a group investigating. |
|
1 |
Act may dismiss for a time — never a critical or high finding still observed. |
|
7 |
Longest dismissal, in days (1–90). |
|
0 |
Act may resolve a finding its policy no longer observes. |
|
0 |
Act may set the class (human or service) of an account without an operator class. |
|
empty |
Plain-English instructions of the tenant administrators, followed by every run of the agent, asked or scheduled (at most 4,000 characters, line breaks kept). |
|
critical,high |
Shared: the finding severities the scheduled triage reviews. |
|
empty |
Shared: a filter expression on the finding ( |
These settings are edited in Settings → AI Agent of the workspace; Manage AI Agents shows the UAM AI Agent of each UAM tenant and edits its schedule, mode, provider, review interval, runtime and custom instructions. A permanent dismissal, an assignment, a severity change and any policy or configuration change are never available to the agent. See also The AI Advisors.
Custom instructions and Evaluate. The agent’s custom instructions (Settings → AI Agent →
Custom instructions, also in Manage AI Agents automation and the Configure tenant dialog)
come last in its prompt, after the provider’s custom prompt and, for scheduled runs, after
the tenant’s shared custom instructions (ai_automated_custom_instructions, scheduled runs
only). They never widen what the agent may do: the allowed decisions and the checks TrackMe
makes before every decision still decide. Evaluate… runs the agent in inspect mode on the
unsaved draft (empty = without instructions), on one open finding or a review of the open
findings (at most 10, the most severe first), optionally side by side with a run without
custom instructions. It writes nothing — no note, no decision, no review record — and is
recorded with the status evaluation, so a later act run never starts from it. See
AI Agents for findings.
Collection health and Configuration Guardian¶
Collection health¶
The Collection health tab is the first stop when something looks wrong. Everything that says something is wrong comes with its explanation, its evidence and its action, and every artefact UAM writes is named, located and one click away. Four views:
Status — one row per tracker that needs attention, from the same assessment as the
uam_collection_healthGuardian check (so the page and the alert never disagree), plus the tracker’s last receipt. Expanded: every reason with its meaning and where it was reported (run, dataset, tier, window), What to do, the facts of the last run (status, finish, consecutive failures, search job, report and its live schedule, lock), the policies a policies run could not complete (Show why opens the policy insight), the evidence shortcuts (Receipts, Tracker log, Search job, Report, Scheduler log) and Run now / Recover. Below: Problems in the last 24 hours, the failed and incomplete runs of each tracker from the indexed receipts, recovered or not (the backfill only while a plan is active or a problem is current). Flow opens a read-only topology of the collection pipeline — the tiers and the indexing layer, the trackers, the KV collections and indexes they write, the policies, findings and their consumers — coloured by health.Trackers — every tracker in one table: status (opens the last-run view), live schedule (read from Splunk, not the defaults), last run, last collected, duration (with the budget applied, see Run budgets), diagnostics, actions. Filters: name, family, status (needs attention, failed, running, not scheduled), tier. Expanded: the activity checkpoint and the windows of the last run with their outcome (acknowledged, split, resumed next run, retried) for Audit activity; the resource windows, re-reads and capacity for Resource usage; the scans and their re-reads for Account signals; the datasets of a catalog; the backfill plan and its controls. Searches of the last run (Audit activity, Resource usage, Account signals, Policies) lists every search the run sent, exactly as sent — audit windows with the clause that resumes them, recounts, re-reads, resource windows, scan chunks, each policy aggregation per evaluated window — with its time range, Copy and Open in Search; only searches the run really sent are listed, with a note when the settings changed since or the run read through a remote account. Custom policies have their execution health under the Custom policies family.
Data & storage — what UAM writes for the tenant: the events per index and sourcetype (volume over 1 hour to 7 days, latest event, search), the KV collections (records, size, lookup definition, a record viewer with a KV query, what large collections are made of), the logs and every scheduled report with its live state, owner and next run.
Troubleshoot & help — the diagnostic glossary: every code UAM can report, with What it means, Where it comes from, Possible causes and What to do; searchable (spaces match underscores), the codes the tenant reports now first, codes of earlier versions kept and marked. Then ready-made searches: tracker errors, failed or incomplete runs, every run, skipped scheduled reports, REST calls, who changed UAM.
The view and its filters, and the expanded row, survive a tab switch and the auto-refresh. A diagnostic code is a chip: its short meaning on hover, its full explanation on click; it keeps its warning or failure colour only while its condition is current, and a code of a recovered past run is drawn neutral and names the run it describes. The Status verdict answers in seconds; the 24-hour history and the record counts follow in a second request.
Configuration Guardian¶
The uam_collection_health check (tenant scope, warning, see Configuration Guardian)
runs at every health cycle of each UAM tenant and on Guardian Run now. It is skipped for a
disabled tenant, an unconfigured workspace or manual collection (which clears a stale alert).
The alert names the tenant, lists its problems in the metadata and points at Collection
health; it clears itself once the conditions are gone. Unreadable inputs leave an existing
alert untouched.
Problem code |
Condition |
|---|---|
|
A report the tenant expects is absent, or not scheduled. |
|
A report has no recorded run. |
|
The last run is older than three missed schedule opportunities (plus the listing budget for the catalog reports). |
|
Three or more consecutive failed runs of one report. |
|
Operator notifications are on and the last policies run failed to deliver some. |
|
User notifications are on and the last policies run failed to deliver some. |
|
A catalog was last published more than twice its cadence plus a day ago. |
|
The last listing or catalog traversal failed or did not complete. |
|
A catalog of a tier waited for another listing of the same tier on three due runs in a row and listed nothing. |
|
A checkpoint did not move for three schedules plus one window — the audit activity cursor, the resource usage cursor or an account signals scan. A checkpoint catching up, however far behind, is not stalled. The alert names the cause when one is recorded: a range being written over several runs, or a held range. |
|
An audit range has been held (its search keeps failing) for 15 minutes. |
|
A window read while some search peers did not answer has waited more than a day to be read again. |
|
A recount of closed ranges has waited more than a day past its time. |
|
One policies run can change more than 50,000 findings. Every finding is still evaluated. |
|
A lock is held by a run whose search has stopped (use Recover stopped run). |
|
A lock’s owner cannot be verified (another member, or no search id). |
|
More custom policies are enabled than the tenant allows. |
|
A custom policy’s scheduled report is missing, unscheduled or differs from its published revision. |
|
Three or more consecutive incomplete runs of a custom policy. |
|
A custom policy run outlived its time limit and needs a verified recovery. |
|
A custom policy missed its scheduled runs. |
Tenant lifecycle¶
Disabling the tenant un-schedules its reports; enabling it reconciles them. Deleting a UAM tenant cancels a running backfill, disables and deletes its reports, lookups and collections, and refuses to run while a job lock is held (a provably stopped lock is recovered first; wait for or recover a live one, then retry). When provisioning is incomplete, the wizard result and the workspace offer Repair UAM workspace, which re-provisions the collections, lookups and reports idempotently.
Settings reference¶
The UAM configuration is one record (uam_config at creation, config of
POST uam/configure afterwards), edited from the workspace Settings tab and saved at once
with a revision check (an older draft is refused). Every limit is a tunable with a validated
range, not a product cap, and every limit of a run is a time: there is no row limit. The seven
record-count settings of earlier versions (activity_max_records,
activity_max_window_retries, resources_max_records, inventory_max_records,
findings_max_records, backfill_max_records, backfill_max_retries) are ignored:
stored values disappear at the next save, and an API client that still sends them keeps
working.
Section |
Setting (key) |
Default |
Bounds and meaning |
|---|---|---|---|
Environment |
Search head tiers ( |
|
1–10: |
Route account for indexing-layer searches ( |
|
One of the tiers; |
|
Activity scope |
Include / exclude ( |
empty / empty |
Up to 20 hostname patterns each ( |
Collection |
Scheduled trackers ( |
On |
Off = collection only on request. Requires a tenant owner. |
Store SPL search ( |
Off |
Index the SPL of reported searches in the search text index. |
|
Collect search resource usage ( |
On |
Required by the resource policies. |
|
Source version assumption ( |
On |
Parse unverified emitters under the head’s version, labelled assumed. |
|
Indexes |
|
empty |
Empty = the tenant’s summary index (evidence, receipts, search text) or notable index (findings). |
Limits · activity |
Activity window ( |
300 |
60–3,600 s: the largest span one audit or resource window reads (a busier window is split and read in full). |
Activity overlap ( |
60 |
0–600 s, less than the window. |
|
Audit activity max seconds per run ( |
270 |
30–900: the budget of one Audit activity run. |
|
Resource usage max seconds per run ( |
270 |
30–900: the budget of one Resource usage run, capacity refresh included. |
|
Account signals max seconds per run ( |
870 |
30–900: the budget of one Account signals run (half at most for the login scan). |
|
Data usage run budget ( |
870 |
30–14,000: the budget of one Data usage run; a scheduled run ends before the next 15-minute slot, a manual run can use the whole budget. |
|
Activity policy window ( |
900 |
300–86,400 s: the window of collected evidence the activity and resource policies evaluate. |
|
Limits · inventory |
Inventory page size ( |
500 |
50–500 records per REST page. |
Catalog collection every (h) ( |
24 |
1–168: saved-search listing and the ten other families. |
|
Users and roles every (min) ( |
60 |
15–1,440. |
|
Full listing budget (s) ( |
3,570 |
300–14,000 per run of a traversal; a longer traversal continues at the next run. |
|
Listing window start / length ( |
1 / 5 |
0–23 / 1–24 (24 = any time), search head local time. |
|
Limits · policies |
Resource rules: minimum history (h) ( |
24 |
0–720; the learning period of the resource policies. |
Limits · backfill |
Backfill days ( |
30 (the wizard proposes none) |
0–90 (0 = no backfill). The wizard always sends its choice; 30 is what a stored configuration without the setting reads. |
Backfill bucket ( |
300 |
300–3,600 s. |
|
Backfill max seconds per run ( |
3,570 |
600–3,570. |
|
Account classification |
Detection ( |
On / On |
Human and service detection. |
Rules ( |
none |
Up to 100 ordered exact / wildcard rules. |
|
Manual classes ( |
|
Up to 10,000 accounts. |
|
Data usage |
Supply links ( |
automatic |
Per tier: one VOL tenant ( |
Excluded apps ( |
|
Up to 10 apps whose searches are shown, never counted as reads. |
|
Internal indexes ( |
Off |
Show the |
|
Account and sourcetype grain ( |
On / On |
Write facts per account and per sourcetype. Changes apply to new facts only. |
|
Resolution limits ( |
65,536 / 128 / 256 / 64 |
SPL excerpt characters (1,024–262,144), reference depth (1–256), resolution attempts per search (1–4,096) and nested subsearch levels (1–128). A limit reached leaves the search unresolved, never dropped. |
|
Privileged users |
|
|
Up to 500 entries each; see Privileged users. |
Notifications to operators |
|
Off; new, reopened, severity raised, resolved; medium; digest |
Up to 50 recipients. |
Notifications to users |
|
Off; human accounts; baseline |
50 per run (1–200), 3 per address per hour (1–20), 24 h between repeat detections (1–168). |
Policies |
|
see the catalogue |
Enabled, severity, exclusions, scope, thresholds, automatic thresholds, preview mode,
bank holidays hold ( |
Stored elsewhere:
AI Agent — the
ai_uam_agent_*fields of the tenant (see The UAM AI Agent).Assignment — up to 100 assignment groups and 100 routing rules; group emails off by default.
Finding actions — up to 50 definitions and 100 automation rules.
Custom policies — their own definitions (see Custom policies).
Per viewer — Exclude TrackMe activity on the Users tab (browser storage, off), the Policies view mode (Cards, Compact cards, List), and the three Tenant Home display preferences (Collection monitors, Single stats, Charts).
The tracker schedules, the one-day retention of old catalog generations and the 90-day retention of the AI Agent decision log are fixed.
Roles and licence¶
Role |
Access |
|---|---|
TrackMe administrator of the tenant ( |
Everything: the workspace in Tenant Home, triage and grouping, configuration, policies and custom policies, search text and live definitions, the knowledge-object catalogs, collection control, the AI Agent. |
Power user of the tenant ( |
REST API access only (Tenant Home shows the UAM workspace to tenant administrators): the workspace, findings, Finding groups, counts, activity, accounts, privileged users, inventory, saved search view, policy evaluation and history, tracker history, AI Agent settings and decision log; Send email communication; findings actions (run an action, email action, set an assignment). |
Read-only user ( |
No UAM operation. |
Licence: any licence beyond the Foundation edition — Enterprise, Unlimited, the trial
and Developer licences. Foundation and the Foundation Trial are refused
(uam_not_available_in_foundation). On an expired licence the workspace stays readable and
changes are refused; scheduled collection and custom policy runs continue through the
read-only and escalation stages of the licence enforcement ladder and stop with the tenants at
the stop stage.
REST endpoints¶
Resource group uam: /trackme/v2/uam/<operation> (browse it in TrackMe REST API
Reference). Every operation is a POST with tenant_id in the body, except GET
workspace and GET agent_settings, and answers describe=true. “Power” marks the
operations also open to tenant power users; the others need a TrackMe administrator of the
tenant. Every earliest / latest accepts what the Splunk time picker produces.
Area |
Operations |
|---|---|
Workspace reads (power) |
|
Data usage (power) |
|
Findings and groups |
|
Policies |
|
Custom policies |
|
Notifications |
|
Inventory and catalogs |
|
Collection |
|
AI Agent |
|
Findings actions |
|
The tenant is created with POST /trackme/v2/vtenants/admin/add_tenant carrying
tenant_uam_enabled=true and a uam_config object (the wizard sends tiers,
scheduled, backfill_days and search_head_scope); see
Creating a splk-uam tenant.
Upgrading to 2.4.22¶
Data usage arrives with its own report,
trackme_uam_data_usage_tracker_tenant_<tid>, created on an upgraded tenant by the health tracker’s schedule reconciliation, without a configuration save. Its history starts at its first run: the searches before the upgrade are not read. Until the collection covers the selected period, or seven days of it, the views say so far and call no index unread.The facts’ index-time fields (
uam_data_*) are extracted by the same TrackMe ingest rule as the other UAM dimensions: on a distributed deployment, the instances that parse the UAM log need the upgraded app and its restart. Until then the map falls back to a slower raw read.Searches the UI starts on a UAM tenant run as the caller’s own search jobs, polled until done: a long range or a heavy account is read completely instead of being cut after 45 to 60 seconds.
Upgrading to 2.4.21¶
Indexing-layer trackers: the health tracker’s report check (every 5 minutes) creates the Resource usage and Account signals reports of an existing tenant, with its owner, ACL and schedule, before the Guardian check of the same cycle (a report it just created is never reported missing). The Activity report keeps its definition and runs the audit only. Resource usage continues from the existing resource cursor, the scans from where the earlier runs stopped; until the first Resource usage run, the policies read the resource usage of the last activity receipt. No schema migration, no settings save.
Budgets: a stored budget still at its earlier default (200 s for the activity, 3,600 s for the full listing, 3,000 s for the backfill) moves to the new default (270 s, 3,570 s, 3,570 s); a value an administrator chose is kept. The report check also refreshes a tracker description left by an earlier build.
Retired limits: the seven record-count settings are ignored and dropped at the next save.
Evidence: correlated executions are no longer indexed, and the UAM events carry fewer fields (see The evidence). Rewrite your own searches on
trackme:uam:execution. The index-timeuam_*fields of audit and resource records now follow their sourcetype: the rule takes effect at the splunkd restart, and the earlier rule still applies until then.Backfill: the wizard proposes no backfill and new configurations use 5-minute buckets; an existing tenant keeps its bucket size until you change it.
Catalogs: older catalog generations are deleted after 30 minutes (a day before), which removes many KV records on a deployment with many users. The users catalog also collects
last_successful_login, kept outside the compared fields (a login is never an inventory change).Privileged users: the tab and Settings → Privileged users appear with the release defaults; the four privileged policies are off, and a change policy turned on starts from a baseline.
Upgrading from 2.4.18¶
Finding groups: the first policies runs after the upgrade consolidate the existing findings into Finding groups (up to 5,000 findings per run; an account is never split). Triage decisions, notes and history are kept.
Inventory: each tier gets its
listingandkos_*reports. The first saved-search listing runs at the next hourly wake, then on the catalog cadence. The users and roles reports move from 5-minute to 15-minute wakes unless an administrator changed their schedule. Inventory max seconds, the fallback listing cadence and the delta object limit of 2.4.18 have no effect any more.UAM AI Agent: the UAM Findings Advisor report is removed; an enabled advisor’s settings (enabled, mode, provider, review interval, runtime capped at 3,000 seconds) are carried to the UAM AI Agent once.
The indexed
uam_*dimensions take effect after the splunkd restart of the upgrade.
Troubleshooting and known limits¶
Start with Collection health (each tracker’s last run, diagnostics and recovery) and the
Configuration Guardian check uam_collection_health. The technical logs carry outcomes only,
with tenant_id index-time extracted:
index=_internal sourcetype=trackme:custom_commands:trackmeuam* tenant_id=<tid>
(trackme_uam_tracker.log, trackme_uam_inventory.log, trackme_uam_activity.log) and
index=_internal sourcetype=trackme:rest_api tenant_id=<tid> (trackme_rest_api_uam.log).
trackme_uam_events.log is the evidence, not a troubleshooting log.
Symptom |
What to check |
|---|---|
The inventory is complete but the Activity tab stays empty |
The route account cannot read |
Data usage calls nothing unread, and says so far with a date |
The collection is younger than the selected period (or than seven days): an absence of reads is claimed from that date. The coverage card of the view gives it. |
Data usage shows Partial coverage or no volume |
The coverage card names the cause: a collection run that did not complete (see the Data usage tracker in Collection health), an index catalog that could not be read, facts without the rollup key (the parsing tier lacks the upgraded app), or no VOL / DSM tenant linked to the tier (Settings → Data usage). |
Most audit lines are unparsed ( |
The emitters’ version could not be verified and Source version assumption is off: turn it on. |
No service account is ever detected |
The |
The resource policies say learning for days |
Less than 24 hours of resource history (Collect search resource usage off, or
|
A policy opened a finding during a bank holiday |
The policy keeps opening findings (During bank holidays), the tenant does not hold new findings (Manage Bank Holidays → Tenants & settings), the holiday is not in the tenant’s calendars, or the finding was already observed. The policy insight and the policies receipt say what the run held, or that the holidays could not be read. |
Peak memory reads not measured |
No introspection sample caught the search (short pooled searches on Splunk Cloud). CPU still comes from Splunk’s completion accounting. |
Fetch SPL shows a reason instead of the text |
|
A finding keeps coming back after Resolve |
Expected: the condition persists and the policy reopens a resolved finding. Fix the cause, add an owner / account or app exclusion on the policy, or dismiss it. |
A CSV finding names the recorded owner, not the writer |
No supported audit evidence of the write since monitoring began (or the tier’s members could not be discovered: see the policy evaluation’s writer diagnostics). The owner fallback is by design. |
The Users tab shows a class the settings do not |
The class is detected; a manual class or a rule always wins, and a detection can be switched off. |
Collect now answers that a run is in progress |
A scheduled run holds the lock; wait for its receipt. If no run is active, Recover stopped run (after five minutes, same search head only). |
The backfill reports waiting for the first activity run |
Normal until the Audit activity and Resource usage trackers set the live start; the backfill plans itself at its next hourly slot. |
A custom policy does not run |
Check Collection health → Trackers, family Custom policies: published and enabled,
Scheduled trackers on, a tenant owner set; the Guardian names |
The activity checkpoint lag keeps growing |
The audit trail grows faster than one run reads it within its budget. Restrict the Activity scope to the search heads you monitor (it is applied in the base searches); Searches of the last run on the Audit activity tracker shows each window and its outcome. Nothing is dropped meanwhile: the next runs continue. |
Audit activity says Range held |
The search of one range keeps failing: it is retried, then halved to isolate the
failing span, never skipped. Open the search job and the tracker log from the Status
row; a range held for 15 minutes raises |
Windows to read again (informational) |
Some search peers did not answer while a window was read. The window is read again once
every peer answers, writing only what was missing; after a day of waiting,
|
The Duration of a run says its budget was capped |
The scheduler dispatched the run late (a busy scheduler): the run ended 30 seconds before the next scheduled run so that none is skipped, and the next runs continue through the checkpoint. Frequent caps point at scheduler load on the search head. |
Lookup sizes refused ( |
On Splunk 9.x the tier’s collection account is not allowed to read
|
My searches on |
Correlated executions are no longer indexed since 2.4.21: rewrite them on
|
The tenant cannot be deleted ( |
A tracker or backfill run is live or its lock is held by another member; wait for it or recover the lock on its member, then retry. |
Known limits.
One indexing layer per tenant: keeping the tiers on one layer is the administrator’s responsibility.
A saved search with the same name, app and owner on two tiers shares one set of run figures in the saved search view (resource records carry no tier).
The knowledge-object catalogs reflect what the collection account can see, and a traversal is not an atomic snapshot.
Several tenants monitoring the same tier each pay their own collection cost.
Activity policies judge 15-minute windows of collected evidence by default; inventory policies follow the catalog cadence (a daily saved-search listing by default).
Custom policies map to accounts and saved searches only, and their findings are not notified.
A line that becomes searchable more than about ten minutes after its range closed, with no Splunk message, is not recovered; the login and automation scans, the resource usage and the backfill are not recounted. Rows recovered by a re-read after their policy window was evaluated are not evaluated again by the activity policies.
A one-second range holding 500,000 audit events or more is held.
A single Splunk call that blocks on a saturated instance is not interrupted inside a run, so such a run can last longer than its budget.
See also
User Activity Monitoring — the task-oriented guide.
Findings, Finding groups and findings actions — findings, Finding groups, assignment, notifications, findings actions and the AI Agents.
Who is doing what on your Splunk? User Activity Monitoring (UAM) — the end-to-end walkthrough.
Creating a splk-uam tenant — the creation wizard and the REST flags.
Configuration Guardian — the Configuration Guardian.
Remote Splunk deployments — remote deployment accounts (the remote tiers).
The AI Advisors — AI Advisors and Agents.