Experience Score

The Experience Score boils a machine's day-to-day health down to one number from 0 to 10. It is built from five things a user feels: how long the last logon took, how often applications crash or hang, how responsive the machine is, how fast its slowest drive answers, and the network round trip to the Athena server. The server calculates it from each heartbeat, shows it on the machine's Resource Metrics page with a 7-day trend, and lets you filter, monitor and script against it. You decide how much each input counts and what "good" and "bad" mean for your fleet.

Where to see it#

Open a machine from the Agents list and choose Resource Metrics in the agent detail view. The Experience Score card shows:

Hover the card title for a one-line summary of how the score is made. When too little is known to score the machine fairly, the card says Not enough data to score yet instead of guessing (see below).

The five inputs#

Every input is "lower is better". Each one is turned into a sub-score: 10 at its good bound or better, 0 at its bad bound or worse, and a straight line in between. With the default bounds, for example, a 52.5-second logon scores 5.0.

Input (chip)What it measuresDefault good / badDefault weight
LogonHow long the machine's most recent logon took, in seconds. Reported by Windows agents; Linux and macOS machines show n/a.15 s / 90 s25
App stabilityApplication crashes plus hangs in the last 24 hours.0 / 1025
ResponsivenessThe worst of three sub-scores: run queue per CPU core, memory commit (% of the commit limit) and hard page faults per second.Run queue 1 / 4
Commit 70 % / 100 %
Hard faults 50 / 1000 per s
25
DiskThe latency of the machine's slowest drive, in milliseconds. Older agents that report only a single overall disk response time are scored on that.10 ms / 100 ms15
NetworkThe round trip from the Athena server to the agent and back, in milliseconds. The server measures it itself about once a minute over the agent's existing connection — nothing extra runs on the endpoint.30 ms / 300 ms10

The fast-moving inputs — run queue, commit, hard faults and drive latency — are smoothed over roughly 10 minutes, so one busy heartbeat does not swing the score. Logon, crashes and network round trip are used as reported. A network round trip older than 5 minutes is treated as not reported.

How the score is calculated

The score is the weighted average of the inputs the machine actually reported, rounded to one decimal. Missing inputs are dropped and the remaining weights are re-balanced, so a machine is never punished for something it cannot measure. A Linux server with no logon data, for example, is scored on the other four inputs (75 of the default 100 weight).

# Default weights, every input present
score = (25 × Logon + 25 × AppStability + 25 × Responsiveness + 15 × Disk + 10 × Network) / 100

# Logon not reported (Linux / macOS): the other weights are re-balanced
score = (25 × AppStability + 25 × Responsiveness + 15 × Disk + 10 × Network) / 75

"Not enough data to score yet"

If the inputs a machine reported carry less than half of the total weight, there is no score — the card shows Not enough data to score yet, the API returns null, and filters and monitors treat the machine as having no value. With the default weights that means at least 50 of the 100 points must be present. The score is worked out from the machine's heartbeats, so a machine that has not sent one since the server started also shows this message until it does.

Tuning the score#

Go to Settings → Monitoring → Experience Score. The page has two parts:

Click Save to store and apply the values. The change takes effect at once for every machine — the next time a score is shown, it uses the new weights and bounds. Reset to defaults restores Logon 25, App stability 25, Responsiveness 25, Disk 15, Network 10 and the default bounds listed above.

Validation rules

A save is refused, with the reason shown as a message, when:

RuleMessage
A weight is below 0 or above 100Each weight must be 0 to 100.
All five weights are 0At least one weight must be above 0.
A bound is empty, not a number or negative<Measure>: the bounds must be numbers of 0 or more.
A good bound is not below its bad bound<Measure>: the good bound must be below the bad bound.

Administrators only, per server. Viewing or changing these settings needs the settings.manage permission; other users see Only an administrator can view or change the experience score settings. Every changed value is written to the audit log as a settings change with its old and new value. The settings are saved in this server's appsettings.local.json in its data directory, under Performance:Score, and are not copied to other servers. If the stored values are invalid, the server logs a warning and uses the defaults.

Finding low scores across the fleet#

The score and its raw inputs are filter fields in the Performance category, so you can use them wherever Athena filters machines — collections, monitors, reports and tagging rules:

FieldDisplay nameMeaning
Performance.ExperienceScoreExperience ScoreThe 0–10 score; no value when there is not enough data.
Performance.LogonSecondsLast Logon (s)How long the last logon took, in seconds (Windows).
Performance.CrashesAndHangs24hApp Crashes and Hangs (24 h)Application crashes plus hangs in the last 24 hours.
Performance.WorstDriveLatencyMsWorst Drive Latency (ms)The slowest drive's latency over the last heartbeat.
Performance.CommitPctMemory Commit (%)Committed memory against the commit limit.
Performance.NetworkRttMsNetwork Round Trip (ms)Round trip from the server to the agent, measured once a minute.

Built-in performance monitors

Athena ships four ready-made monitors under Settings → Monitoring → Monitors. They are disabled until you turn them on, so nothing alerts until you decide it should. Each is a Warning that checks every 15 minutes, fires after 2 consecutive failures and clears after 1 pass. You can edit or delete them like any other monitor; a deleted one is not recreated.

MonitorCondition
Performance: experience score below 5Experience Score is less than 5. A machine with not enough data is not applicable.
Performance: more than 5 app crashes and hangs in 24 hApp Crashes and Hangs (24 h) is greater than 5.
Performance: logon slower than 60 sLast Logon (s) is greater than 60 (Windows).
Performance: worst drive latency above 50 msWorst Drive Latency (ms) is greater than 50.

History#

The server stores one daily average of each machine's score (history key experience.score), next to the stored logons and daily crash and hang counts. History is kept for 7 days by default; set Performance:HistoryDays (1 to 90) in the server configuration to keep more or less. Older rows are removed automatically.

REST API#

Method & pathPermissionWhat it does
GET api/agents/{agentId}/performanceinventory.viewThe machine's latest performance values, including experienceScore (0–10, null = not enough data) and scoreInputs — one entry per input with input (logon, stability, responsiveness, disk, network), the measured value, its sub-score and its weight. An input the machine did not report has no sub-score. 404 when nothing is known for the machine.
GET api/agents/{agentId}/performance/history?key=experience.score&days=7inventory.viewStored history, oldest first. key and days are optional; days is capped at the kept history. 400 for an unknown key.
GET api/settings/experience-scoresettings.manageThe current weights and bounds.
PUT api/settings/experience-scoresettings.manageSave and apply new weights and bounds (the whole object). 400 with the validation message when invalid. Audited.
POST api/settings/experience-score/resetsettings.manageBack to the defaults. Audited.

The settings object uses these fields (defaults shown):

{
  "logonWeight": 25, "stabilityWeight": 25, "responsivenessWeight": 25,
  "diskWeight": 15, "networkWeight": 10,
  "logonGoodSeconds": 15,  "logonBadSeconds": 90,
  "crashesGood": 0,        "crashesBad": 10,
  "queuePerCoreGood": 1,   "queuePerCoreBad": 4,
  "commitPctGood": 70,     "commitPctBad": 100,
  "hardFaultsGood": 50,    "hardFaultsBad": 1000,
  "diskLatencyGoodMs": 10, "diskLatencyBadMs": 100,
  "rttGoodMs": 30,         "rttBadMs": 300
}
# Weigh the network more heavily for a branch-office fleet
$headers = @{ Authorization = "Bearer $token" }
$base    = "https://athena.example.com:8443/api/settings/experience-score"

$s = (Invoke-RestMethod -Uri $base -Headers $headers).data
$s.networkWeight = 25
Invoke-RestMethod -Method Put -Uri $base -Headers $headers `
  -ContentType "application/json" -Body ($s | ConvertTo-Json)

PowerShell#

In the Athena PowerShell module, the score is one of the samples that Get-AthenaAgentPerformance returns, under the key experience.score; the server-measured network round trip is net.rtt_ms. Both are present while the machine is online and reporting. Get-AthenaAgentPerformanceHistory returns the stored daily averages. Both cmdlets take -AgentId from the pipeline; -Key narrows the output (a wildcard for current values, one history key for history), and the history cmdlet takes -Days (1–7). For the per-input breakdown, read scoreInputs from the REST API.

# Current score and round trip for one machine
Get-AthenaAgentPerformance -AgentId "12345678-1234-1234-1234-123456789012" -Key "experience.score"
Get-AthenaAgentPerformance -AgentId "12345678-1234-1234-1234-123456789012" -Key "net.rtt_ms"

# Daily score averages for a group of machines
Get-AthenaAgent -Hostname "PC-5*" | Get-AthenaAgentPerformanceHistory -Key experience.score -Days 7