# Telemetry detectors

State changes and collection-health events.

Version coverage: /docs/reference/versions/


{{< detector-table >}}
{{< detector-row name="IceTraversalDetector" description="Reports changes to the selected ICE tuple set." trigger="selected tuple set changes" recovery="remembers tuple set; no first-observation change event; no issue" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/IceTraversalDetector.ts#L26" triggerLabel="What it observes" recoveryLabel="State and reset behavior" displayName="ICE Traversal" collects="The selected ICE tuple set and its previous value." example="The selected network tuple changes after its initial observation." >}}
{{< detector-row name="IceRestartDetector" description="Tracks ICE restarts and their outcomes." trigger="local ICE username fragment changes, restart outcome" recovery="per-transport generation/pending state; `createEvent` true" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/IceRestartDetector.ts#L53" triggerLabel="What it observes" recoveryLabel="State and reset behavior" displayName="ICE Restart" collects="Local ICE username-fragment changes and restart outcome." example="A new local ICE username fragment starts a new restart generation." >}}
{{< detector-row name="IceRestartRecommendationDetector" description="Recommends an ICE restart when connectivity is unhealthy." trigger="failed, disconnected/stalled≥10000 ms, or never-established≥10000 ms" recovery="cooldown 15000 ms; pending restart gates; recommendation event, does not itself restart ICE" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/IceRestartRecommendationDetector.ts#L87" triggerLabel="What it observes" recoveryLabel="State and reset behavior" displayName="ICE Restart Recommendation" collects="Failed, disconnected, stalled or never-established connectivity, plus cooldown state." example="Connectivity remains unhealthy long enough to recommend a restart; the application chooses whether to act." >}}
{{< detector-row name="CaptureTrackMutedDetector" description="Reports when a capture track becomes muted." trigger="previously known unmuted→muted transition" recovery="track muted state; `createEvent` true; distinct from application mute" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/CaptureTrackMutedDetector.ts#L28" triggerLabel="What it observes" recoveryLabel="State and reset behavior" displayName="Capture Track Muted" collects="Changes in a previously observed capture track's muted state." example="A capture track changes from unmuted to muted." >}}
{{< detector-row name="CodecChangeDetector" description="Reports changes to codec configuration." trigger="MIME/FMTP change" recovery="previous codec signature; first value establishes baseline" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/CodecChangeDetector.ts#L26" triggerLabel="What it observes" recoveryLabel="State and reset behavior" displayName="Codec Change" collects="Codec MIME type and FMTP signatures." example="A previously observed stream changes its codec configuration." >}}
{{< detector-row name="VideoResolutionChangeDetector" description="Reports changes to video frame dimensions." trigger="positive frame width/height changes" recovery="prior geometry; includes direction and outbound limitation context" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/VideoResolutionChangeDetector.ts#L34" triggerLabel="What it observes" recoveryLabel="State and reset behavior" displayName="Video Resolution Change" collects="Positive frame width and height, stream direction and outbound limitation context." example="An observed video stream changes from 1280×720 to 640×360." >}}
{{< detector-row name="SimulcastLayerDetector" description="Reports changes to the active simulcast layers." trigger="set of actively sending layer keys changes" recovery="multiple encoding requirement; paused/end reset" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/SimulcastLayerDetector.ts#L45" triggerLabel="What it observes" recoveryLabel="State and reset behavior" displayName="Simulcast Layer" collects="The set of actively sending encoding-layer keys." example="A simulcast stream stops sending one of its active layers." >}}
{{< detector-row name="StatsGapDetector" description="Reports unusually long gaps between stats collections." trigger="actual collection period >2×expected AND >5000 ms" recovery="prior collection start time; no issue, `createEvent` true" source="https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/src/detectors/StatsGapDetector.ts#L34" triggerLabel="What it observes" recoveryLabel="State and reset behavior" displayName="Stats Gap" collects="Actual and expected intervals between stats collections." example="A normally five-second collection cycle takes more than ten seconds." >}}
{{< /detector-table >}}

Source files are preserved in the [detector implementation reference](/reference/detector-implementation-reference.md) and [client-monitor-js/docs/TELEMETRY_DETECTORS.md](https://github.com/ObserveRTC/client-monitor-js/blob/0f08bd5d110a4e9d53cf0486962e638c5b393c49/docs/TELEMETRY_DETECTORS.md). Telemetry can have thresholds (`StatsGap` and restart recommendations); prose saying it has none is too broad.

