Starlink Metrics — Plain English Explanations
What each metric actually means, why it matters, and what values to expect.
Performance
starlink.throughput.download_bps
What it is: How much data the dish is pulling down from the internet, measured in bits per second.
Normal: 100–300 Mbps (100,000,000–300,000,000 bps)
Bad: 0 = no internet. < 50 Mbps = degraded.
Why it matters: This is the passenger internet speed. Low throughput = buffering, slow loads.
starlink.throughput.upload_bps
What it is: How much data the dish is sending up to the internet.
Normal: 10–40 Mbps
Bad: 0 = no internet. A tiny trickle (~3 kbps) means the dish is trying to connect but can't establish a link.
Why it matters: Affects video calls, uploads, and any data the ship sends to shore.
starlink.latency.pop_ping_ms
What it is: Round-trip time for a ping from the dish to Starlink's Point of Presence (PoP) — the nearest Starlink ground station. Measured in milliseconds.
What's a PoP? It's the ground station where Starlink's satellite network connects to the regular internet. Your data goes: dish → satellite → ground station (PoP) → internet.
Normal: 25–50 ms
Bad: > 100 ms = sluggish experience. -1 = no measurement possible (dish offline).
Why it matters: Latency affects real-time applications — VoIP calls, video meetings, gaming.
starlink.packet_loss.pop_ping_drop_rate
What it is: What fraction of ping packets get lost between the dish and the PoP. Ranges from 0.0 (perfect) to 1.0 (100% loss).
How it's measured: The dish sends 10 pings per second to the PoP. If any don't come back within 2 seconds, they're counted as dropped.
Normal: < 0.01 (less than 1% loss)
Bad: > 0.05 (5%) = noticeable degradation. 1.0 = complete loss of connectivity.
Why it matters: Packet loss causes video stuttering, call drops, and retransmissions that slow everything down.
starlink.network.ethernet_speed_mbps
What it is: The negotiated link speed between the dish and the router/switch it's plugged into.
Normal: 1000 (gigabit)
Bad: 100 = ethernet negotiated at 100 Mbps (bad cable, bad port, or distance issue)
Why it matters: If this drops to 100, the dish can't deliver its full bandwidth even if satellite signal is perfect.
starlink.network.overage_rate_limited
What it is: 1 if the dish is being throttled because the account exceeded its data plan allowance. 0 otherwise.
Why it matters: If throughput suddenly drops and this is 1, it's not a hardware/signal problem — it's a billing problem.
Signal
starlink.signal.snr_above_noise_floor
What it is: 1 if the signal-to-noise ratio is good enough to maintain a connection. 0 if the signal is too weak.
What's SNR? Signal-to-Noise Ratio — how much stronger the actual signal is compared to background radio noise. Like trying to hear someone in a loud room.
Normal: 1 (signal is fine)
Bad: 0 = signal is below the minimum threshold, dish can't communicate reliably.
Why it matters: When this goes to 0, expect high packet loss and possible disconnection.
starlink.signal.snr_persistently_low
What it is: 1 if the SNR has been below threshold for an extended period. 0 otherwise.
Why it matters: A momentary dip (SNR=0 for a few seconds) might be a satellite handover. Persistently low means a real problem — obstruction, hardware issue, or environmental interference.
Health
starlink.system.uptime_s
What it is: Seconds since the dish last booted. Counts up continuously.
Normal: Should be large (days = 86,400+ per day). A dish that's been running for a week shows ~604,800.
Bad: Small numbers mean the dish recently rebooted. If you see it reset frequently, the dish is crash-looping.
Why it matters: Unexpected uptime resets = reboots = service interruption.
starlink.system.stowed
What it is: 1 if the dish has been intentionally put into stow position (folded flat). 0 if operational.
Why it matters: If connectivity drops and stowed=1, it's intentional — someone told the dish to shut down. Not a failure.
starlink.system.bootcount
What it is: Total number of times the dish has booted since manufacture. This only goes up.
Normal: Increases by 1 after a firmware update or power cycle.
Bad: If it increases by 3+ in an hour, the dish is repeatedly crashing and restarting.
Why it matters: Tracks hardware stability over the dish's lifetime.
starlink.gps.satellite_count
What it is: Number of GPS satellites the dish can currently see.
Normal: 8–18
Bad: 0 = no GPS fix (indoors, or GPS antenna issue)
Why it matters: The dish uses GPS for positioning and time synchronization. No GPS = can't determine location.
starlink.gps.valid
What it is: 1 if the GPS fix is valid and trustworthy. 0 if not.
Why it matters: Even with some satellites visible, the fix might not be accurate enough. This confirms the position is reliable.
Alerts (all are 0=clear, 1=active)
starlink.alerts.thermal_throttle
The dish is getting hot and reducing performance to cool down. Connectivity works but is degraded.
starlink.alerts.thermal_shutdown
The dish got too hot and shut itself off entirely. No connectivity until it cools.
starlink.alerts.is_heating
The dish's built-in heater is active (cold weather). This is normal in winter/arctic conditions — it melts snow and ice off the dish surface.
starlink.alerts.motors_stuck
The dish can't physically rotate to point at satellites. Hardware failure in the motor/actuator system.
starlink.alerts.roaming
The dish is operating outside its registered home service area. May have different performance or data plan implications.
starlink.alerts.slow_ethernet_speeds
The Ethernet connection between the dish and router is slower than expected.
starlink.alerts.slow_ethernet_speeds_100
Specifically: the Ethernet negotiated at 100 Mbps instead of 1 Gbps. Usually means a bad cable.
starlink.alerts.install_pending
A firmware update has been downloaded and is waiting for a reboot to install.
starlink.alerts.mast_not_near_vertical
The dish's mounting pole/mast is tilted. The dish compensates with motors, but extreme tilt limits sky coverage.
starlink.alerts.dish_water_detected
Water has gotten inside the dish housing. This is NOT rain on the outside — it means the waterproof seal has failed. Hardware damage risk.
starlink.alerts.router_water_detected
Same as above but for the router unit.
starlink.alerts.no_ethernet_link
No physical Ethernet connection detected. Cable unplugged, cut, or connector damaged.
starlink.alerts.unexpected_location
The dish has moved outside its expected service area (geofence violation).
starlink.alerts.power_supply_thermal_throttle
The power supply unit (not the dish itself) is overheating and throttling.
starlink.alerts.lower_signal_than_predicted
The dish is receiving a weaker signal than it should be getting based on its location and the satellite positions. Indicates rain fade, atmospheric interference, or partial obstruction.
starlink.alerts.is_power_save_idle
The dish has gone into low-power sleep mode. No connectivity while in this state.
starlink.alerts.low_motor_current
The motor current is abnormally low — could indicate a disconnected motor, broken cable to the actuator, or motor failure.
starlink.alerts.obstruction_map_reset
The dish's internal obstruction map (which tracks where sky blockages are) has been reset. Usually happens after a firmware update or mount change.
Alignment
starlink.alignment.boresight_azimuth_deg
What it is: Which compass direction the dish is currently pointing (0°=North, 90°=East, 180°=South, 270°=West).
starlink.alignment.boresight_elevation_deg
What it is: How high above the horizon the dish is pointing (0°=horizon, 90°=straight up).
starlink.alignment.desired_azimuth_deg / desired_elevation_deg
What it is: Where the dish WANTS to point (to track the next satellite). If these differ significantly from the actual boresight values, the dish is struggling to aim correctly.
starlink.alignment.attitude_uncertainty_deg
What it is: How confident the dish is about its own orientation. Low = confident. High = uncertain.
Normal: < 2°
Bad: > 30° = dish doesn't know which way it's pointing (no satellite reference, just booted).
starlink.alignment.tilt_angle_deg
What it is: How much the dish's mounting surface is tilted from level.
Normal: 0–5° (near-level mount)
Bad: > 15° = mount is significantly tilted. > 70° = dish is basically on its side (indoors/testing).
starlink.alignment.azimuth_error_deg / elevation_error_deg
What it is: The computed difference between where the dish IS pointing and where it WANTS to point. Calculated by the check as |current - desired|.
Normal: < 1°
Bad: > 5° = dish can't track the satellite properly.
Obstruction
starlink.obstruction.fraction_obstructed
What it is: What percentage of the dish's sky view is blocked by physical objects (0.0 = clear sky, 1.0 = completely blocked).
Normal: < 0.02 (2%)
Bad: > 0.10 (10%) = significant blockage affecting connectivity.
starlink.obstruction.currently_obstructed
What it is: 1 if something is blocking the signal RIGHT NOW. 0 if clear.
starlink.obstruction.time_obstructed_s
What it is: Total seconds the dish was obstructed during the measurement window.
starlink.obstruction.valid_duration_s
What it is: How long the measurement window is. The fraction_obstructed = time_obstructed / valid_duration.
starlink.obstruction.patches_valid
What it is: Number of valid patches in the dish's internal obstruction map. Higher = more complete picture of the sky.
starlink.obstruction.avg_prolonged_duration_s
What it is: Average length (in seconds) of a prolonged obstruction event. Helps distinguish brief obstructions (passing mast during a turn) from sustained ones (permanent blockage from ship structure).
Power
starlink.power.dish_watts
What it is: How many watts the dish is currently drawing.
Normal: 40–80W depending on conditions (heating uses more).
starlink.power.router_watts
What it is: How many watts the router is drawing.
Normal: 10–18W.
starlink.power.battery_state_of_charge
What it is: Battery charge level (0–100) for dishes with battery backup.
Normal: 80–100 when charging, counts down when on battery.
starlink.power.battery_health
What it is: Overall battery health percentage. Degrades over time with charge cycles.
Outage
starlink.outage.cause
What it is: A numeric code explaining WHY the last outage happened.
- 0 = unknown/none
- 1 = no_schedule (dish can't find a satellite to connect to)
- 2 = obstructed (something blocking the sky)
- 3 = no_downlink (satellite found but can't receive data)
- 4 = no_uplink (can receive but can't send)
Why it matters: This is the most direct answer to "why did we lose connectivity?"
starlink.outage.duration_s
What it is: How long the last outage lasted, in seconds.
starlink.outage.seconds_to_first_slot
What it is: How many seconds until the next satellite will be available.
- Positive number = satellite coming soon
- -1 = no satellite scheduled (extended outage expected)
Initialization Timing
starlink.init.rf_ready_s
What it is: Seconds from boot until the radio frequency hardware is ready to transmit/receive.
Normal: 20–30 seconds.
starlink.init.stable_connection_s
What it is: Seconds from boot until a stable satellite connection is established.
Normal: 30–90 seconds outdoors.
starlink.init.first_pop_ping_s
What it is: Seconds from boot until the first successful ping to a ground station.
Normal: 35–70 seconds. -1 = hasn't happened yet (dish can't connect).
starlink.init.gps_valid_s
What it is: Seconds from boot until GPS fix is acquired.
Normal: 10–60 seconds with clear sky.
starlink.system.software_update_progress
What it is: How far along a firmware download is (0.0 = not started, 1.0 = complete and ready to install).
Ready States (all are 0=not ready, 1=ready)
These track whether each internal subsystem has initialized successfully after boot.
starlink.ready.cady
Communication and data subsystem. Requires satellite lock — this is the last one to become ready.
starlink.ready.scp
Satellite communication processor. Ready early in boot.
starlink.ready.l1l2
Layer 1 / Layer 2 radio stack. The low-level radio communication.
starlink.ready.xphy
Physical layer transceiver. The actual antenna electronics.
starlink.ready.aap
Antenna array processor. Controls beam steering.
starlink.ready.rf
RF (radio frequency) frontend. The analog radio hardware.
Typical boot sequence: RF → SCP → L1L2 → XPHY → AAP → CADY (last, needs satellite)
Location (requires satellite lock)
starlink.location.latitude / longitude
What it is: GPS coordinates of the dish. Only available when the dish has satellite lock and GPS fix.
starlink.location.altitude_m
What it is: Altitude above sea level in meters.
starlink.location.uncertainty_meters
What it is: GPS accuracy radius. Lower = more precise position.
Normal: 5–20 meters
Bad: > 100 meters = poor GPS fix
Service Check
starlink.can_connect
What it is: Did the Datadog Agent successfully connect to the dish and collect data?
- OK = yes, collection succeeded
- CRITICAL = no, couldn't reach the dish or got no data back
This is the most basic health indicator — is the monitoring working at all?
