Documentation hub

Starlink integration docs

StarlinkDatadog

Metrics explained

Plain-English meaning, why each signal matters, and what values to expect.

15 min readmetrics

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.

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?

Related tools