Continuously exercises browser ICE gathering against Genesys Cloud regional netdiag.*.pure.cloud STUN endpoints. IPv4 and IPv6 health are reported separately, public STUN egress is tracked for path changes, and per-region latency is compared with a rolling baseline.
No installation, admin rights, microphone access, Genesys token, or external JavaScript libraries are required.
srflx behavior at that moment, not a guarantee that every production call will connect.
Updated after every regional test.
Derived from the public address returned in STUN srflx candidates. This identifies the Internet egress observed by the selected STUN endpoints, not necessarily the office firewall WAN address.
Select Genesys regional endpoints and/or Google STUN as an external reference. Preferences are saved locally in the browser.
Click a status pill for full details. Click any column header to toggle ascending/descending sort.
| Region↕ | Status↕ | IPv4↕ | IPv6↕ | Last Test↕ | srflx↕ | host↕ | relay↕ | STUN acquisition↕ | Baseline↕ | Public egress IP↕ | Mapped port↕ | Success rate↕ | Alert↕ | Last reason↕ |
|---|
Most recent test completions and incident markers.
Automatic clipboard access was blocked. Select/copy the text below manually.
This single-file application uses the browser's native WebRTC ICE implementation to test STUN reachability to selected Genesys Cloud netdiag.*.pure.cloud:3478 endpoints and the optional external reference endpoint stun.l.google.com:19302. It is designed to capture intermittent network-path evidence from the same workstation and network used by the agent.
The monitor creates a WebRTC data channel only. It does not request microphone, camera, headset, Genesys credentials, or call-control access. Google STUN is provided only as an external comparison point; a Google result does not represent Genesys service health. Test results exist in browser memory for the current page session; only region/interval/timeout/concurrency preferences are stored in localStorage. Use the JSON/CSV download buttons to preserve evidence before closing/reloading the page.
A maximum of 10 endpoint tests is executed per monitoring cycle. If more than 10 endpoints are selected, all selections remain checked and saved, but only the first 10 selected endpoints in the fixed catalog order are tested. A visible warning and toast identify when the cap is active.
The Regional ICE Status table keeps the same columns and layout. Click any column header to sort ascending; click the same header again to sort descending. The ↕, ▲ and ▼ markers show the current sort state. Expanded detail rows remain attached to their endpoint.
STUN acquisition / firstSrflxMs measures elapsed time from the start of the regional WebRTC test until the first srflx candidate is observed. It is an application-level acquisition time, not ICMP ping latency.
Google STUN is useful as a control path. If Genesys and Google both PASS, general browser STUN traversal is available. If Google PASSes while one or more Genesys endpoints FAIL, compare the endpoint-specific ICE errors, routing and security policy; that difference is diagnostic evidence but does not by itself prove a Genesys service outage. If Genesys PASSes while Google fails, the Google endpoint may simply be blocked or treated differently by policy. If both fail together, investigate the workstation/network/SASE path first.
A PASS proves that this browser obtained a server-reflexive mapping from the configured STUN endpoint. It does not prove the production Genesys TURN relay path, RTP/media ports, nominated ICE candidate pair, remote peer connectivity, media quality, or the exact media region selected for a live call.
| Indicator | Meaning | Interpretation |
|---|---|---|
| PASS | At least one srflx candidate was obtained. | STUN traversal worked for at least one address family during that test. |
| FAIL | No srflx candidate was obtained before ICE completion/timeout/exception. | Investigate the recorded ICE errors, endpoint, timeout, network path and surrounding tests. |
| IPv4 PASS | An IPv4 srflx candidate was observed. | IPv4 STUN path is working at that moment. |
| IPv6 PASS | An IPv6 srflx candidate was observed. | IPv6 STUN path is working at that moment. |
| IPv4/IPv6 ERROR | An ICE candidate error was associated with that address family and no srflx for that family was obtained. | The error is retained for diagnosis. An IPv6-only error does not override a successful IPv4 PASS. |
| N/A / NOT OBSERVED | No successful srflx and no family-specific error were observed. | That family was not meaningfully observed during the test. |
| NORMAL | No latency or egress anomaly triggered. | Result falls within the current learned behavior. |
| WARN | Warning latency threshold or public-egress/path anomaly triggered. | Review surrounding cycles and incident timing; the STUN test may still be PASS. |
| CRITICAL | No srflx was obtained, or the critical latency threshold was crossed. | Strong diagnostic event requiring correlation with Genesys/user symptoms. |
The baseline uses the latest 30 successful regional tests with a measured firstSrflxMs. It becomes active after 5 successful samples.
For normal observation, use a modest interval and only the regions relevant to the organization/site. Use shorter intervals temporarily while reproducing an intermittent problem or around an incident marker. The monitor performs STUN gathering only; it does not allocate Genesys production TURN relay sessions.
The public egress address is derived from the selected srflx candidate. It is the address the STUN service sees on the Internet. It may be an office NAT, firewall NAT, ISP CGNAT, VPN egress, SD-WAN path, or SASE/SWG service edge such as a cloud security platform. The offline HTML file does not perform vendor ownership lookup.
| Path state | Meaning |
|---|---|
| COMMON | All endpoints actually tested in the cycle reported one common public egress IP. Different mapped UDP ports are normal and do not count as an IP change. |
| MULTI-EGRESS | Endpoints actually tested in the cycle reported more than one public egress IP in the same cycle. This can indicate destination-based routing, multiple Internet paths, SD-WAN/SASE steering or selective bypass. |
| NO DATA | No usable public srflx address was obtained in the cycle. |
| Common-IP change | A previously established common public egress changed to another common IP in a later completed cycle. |
Use Mark Incident + Copy Current Status at or immediately after an agent reports a failed/missed interaction. The action creates a timestamped incident marker, stores the latest selected-region state, records current egress/anomaly context, and copies a readable snapshot to the clipboard.
Each CSV row represents one regional ICE/STUN test. Column names below exactly match the exported header row.
| CSV column | Type | Definition |
|---|---|---|
| testId | string | Unique identifier generated for this regional test. |
| cycleNumber | integer | Sequential monitoring cycle number. Multiple regions can share the same cycle number. |
| regionId | string | Endpoint identifier used by the monitor, for example cac1, use1 or google. |
| regionName | string | Human-readable region name. |
| host | string | STUN hostname used for the test, such as netdiag.cac1.pure.cloud or stun.l.google.com. |
| startedAt | ISO datetime | UTC timestamp when the regional test started. |
| completedAt | ISO datetime | UTC timestamp when the regional test completed. |
| durationMs | integer | Total elapsed duration of the test in milliseconds. |
| status | PASS/FAIL | Overall test result. PASS requires at least one srflx candidate. |
| reason | string | Human-readable reason summarizing the result, including first srflx timing or failure/error information. |
| ipv4Status | string | IPv4 family classification: PASS, ERROR or NOT OBSERVED. |
| ipv6Status | string | IPv6 family classification: PASS, ERROR or NOT OBSERVED. |
| firstSrflxMs | integer/null | Milliseconds from test start until the first srflx candidate of any family was observed. |
| publicEgressIp | string/null | Preferred public STUN-mapped IP. IPv4 is preferred when available; otherwise the first srflx address is used. |
| mappedPort | integer/null | Mapped UDP port associated with the preferred srflx candidate. |
| mappedAddress | string/null | Combined preferred public IP and mapped port in IP:port form. |
| baselineReady | boolean | True after at least five successful timing samples are available for that region. |
| baselineSamples | integer | Number of successful samples currently used/available in the rolling baseline, up to 30. |
| baselineMedianMs | integer/null | Median firstSrflxMs across the current regional baseline window. |
| baselineP95Ms | integer/null | 95th-percentile firstSrflxMs across the current baseline window. |
| warningThresholdMs | integer/null | Current warning threshold: max(100 ms, 2.5 × rolling median). |
| criticalThresholdMs | integer/null | Current critical threshold: max(250 ms, 5 × rolling median). |
| alertSeverity | string | Current anomaly severity for the test: NORMAL, WARN or CRITICAL. |
| alertKind | string | Anomaly classification such as NONE, NO_SRFLX, LATENCY_SPIKE or EGRESS_CHANGE. |
| alertReasons | string | Semicolon-separated explanations for the alert decision. |
| egressChanged | boolean | True when this region's observed public IP differs from its previous observed public IP. |
| previousEgressIp | string/null | Previous public egress IP for this region when an IP change is detected. |
| hostCount | integer | Number of host ICE candidates recorded in this test. |
| srflxCount | integer | Number of server-reflexive ICE candidates recorded. |
| relayCount | integer | Number of TURN relay ICE candidates recorded. |
| prflxCount | integer | Number of peer-reflexive ICE candidates recorded. |
| errorCount | integer | Number of ICE candidate errors/exceptions recorded during the test. |
| iceGatheringStateFinal | string | Browser ICE gathering state when the test ended, or unavailable if no peer connection was available. |
| completedBy | string | Why collection stopped: normally ice-complete, timeout, or exception. |
The JSON export preserves the complete session. Array notation such as results[] means the definition applies to each item in that array. Dynamic keys such as stats.<regionId> or egress.uniqueIps.<ip> are created from observed region IDs/IP addresses.
| JSON path/key | Type | Definition |
|---|---|---|
| application | object | Tool identity, version and test semantics. |
| application.name | string | Application name. |
| application.version | string | Monitor version that created the export. |
| application.exportGeneratedAt | ISO datetime | UTC timestamp when the JSON file was generated. |
| application.scope | string | Short description of what the browser checks. |
| application.passCriterion | string | Exact PASS criterion and address-family handling. |
| environment | object | Browser/session environment metadata. |
| environment.sessionId | string | Unique identifier for the page session. |
| environment.sessionStarted | ISO datetime | UTC session start time. |
| environment.sessionStartedLocal | string | Browser-local representation of the session start time. |
| environment.userAgent | string | Browser user-agent string. |
| environment.language | string | Browser language setting. |
| environment.platform | string/null | Browser-reported platform value. |
| environment.hardwareConcurrency | integer/null | Browser-reported logical processor count. |
| environment.timezone | string/null | Browser-resolved IANA timezone. |
| environment.origin | string | Full page location, including file:// when opened locally. |
| environment.secureContext | boolean | Whether the page is running in a browser secure context. |
| settings | object | Monitor settings at export time. |
| settings.intervalSeconds | number | Configured delay between continuous monitoring cycles. |
| settings.timeoutSeconds | number | Maximum wait for each regional ICE gathering test. |
| settings.concurrency | number | Maximum number of regional tests executed in parallel. |
| settings.selectedRegionIds | array[string] | Region IDs selected when the export was created. |
| regionCatalog | array[object] | Complete region/diagnostic-endpoint catalog embedded in the tool. |
| regionCatalog[].id | string | Endpoint identifier. Genesys entries use region codes; the Google reference uses google. |
| regionCatalog[].group | string | Endpoint grouping: Americas, EMEA, Asia Pacific or External Reference. |
| regionCatalog[].name | string | Human-readable region name. |
| regionCatalog[].host | string | STUN hostname. Genesys entries use netdiag.*.pure.cloud; Google uses stun.l.google.com. |
| regionCatalog[].port | integer | STUN destination port: 3478 for Genesys diagnostic endpoints and 19302 for Google STUN. |
| limitations | array[string] | Interpretation and browser-scope limitations embedded in the export. |
| JSON path/key | Type | Definition |
|---|---|---|
| stats | object | Per-region aggregate test counters keyed by region ID. |
| stats.<regionId>.total | integer | Total tests completed for that region. |
| stats.<regionId>.pass | integer | Tests that obtained at least one srflx. |
| stats.<regionId>.fail | integer | Tests that did not obtain an srflx. |
| egress | object | Session-wide public STUN egress history and cross-region comparison data. |
| egress.perRegion | object | Latest public IP observation per region, keyed by region ID. |
| egress.perRegion.<regionId>.ip | string | Latest public STUN-mapped IP observed for that region. |
| egress.perRegion.<regionId>.lastSeen | ISO datetime | UTC time the regional public IP was last observed. |
| egress.uniqueIps | object | All unique public IPs observed during the session, keyed by IP address. |
| egress.uniqueIps.<ip>.firstSeen | ISO datetime | First time that public IP was observed. |
| egress.uniqueIps.<ip>.lastSeen | ISO datetime | Most recent time that public IP was observed. |
| egress.uniqueIps.<ip>.count | integer | Number of regional test observations using that public IP. |
| egress.uniqueIps.<ip>.regions | array[string] | Region IDs from which that IP has been observed. |
| egress.commonIp | string/null | Most recently established common IP when all endpoints actually tested in a completed cycle reported one public IP. |
| egress.lastCommonIp | string/null | Previous common-IP value retained when the common IP is updated. |
| egress.commonChanges | array[object] | History of common public-IP changes. |
| egress.commonChanges[].timestamp | ISO datetime | When the common IP change was detected. |
| egress.commonChanges[].cycleId | string | Cycle identifier associated with the change. |
| egress.commonChanges[].cycleNumber | integer | Sequential cycle number associated with the change. |
| egress.commonChanges[].from | string | Previous common public IP. |
| egress.commonChanges[].to | string | New common public IP. |
| egress.cycleHistory | array[object] | Cross-region egress summary for completed monitoring cycles. |
| egress.cycleHistory[].cycleId | string | Unique monitoring-cycle identifier. |
| egress.cycleHistory[].cycleNumber | integer | Sequential monitoring cycle number. |
| egress.cycleHistory[].timestamp | ISO datetime | Time cross-region egress evaluation completed. |
| egress.cycleHistory[].selectedRegionIds | array[string] | Region IDs selected for that cycle. |
| egress.cycleHistory[].reportingRegions | integer | Number of endpoints actually tested that supplied a public srflx IP. |
| egress.cycleHistory[].distinctIps | array[string] | Distinct public STUN IPs seen across reporting regions in the cycle. |
| egress.cycleHistory[].commonIp | string/null | Common public IP if every selected region completed and all reported the same IP. |
| egress.cycleHistory[].state | string | Cycle egress classification: COMMON, MULTI-EGRESS or NO DATA. |
| egress.lastCycle | object/null | Latest cycle summary using the same keys as an egress.cycleHistory[] item. |
| anomalies | array[object] | WARN/CRITICAL events detected during the session. |
| anomalies[].id | string | Unique anomaly identifier. |
| anomalies[].iso | ISO datetime | UTC anomaly timestamp. |
| anomalies[].severity | string | WARN or CRITICAL. |
| anomalies[].kind | string | Anomaly classification, for example LATENCY_SPIKE, NO_SRFLX, EGRESS_CHANGE, COMMON_EGRESS_CHANGE or MULTI_EGRESS. |
| anomalies[].regionId | string/null | Affected region ID, or null for session/cross-region anomalies. |
| anomalies[].text | string | Human-readable anomaly explanation. |
| anomalies[].details | object | Additional structured context. Keys vary by anomaly type, such as test ID/baseline data or egress-change details. |
| anomalyPolicy | object | Threshold rules embedded in the export for reproducible interpretation. |
| anomalyPolicy.baselineMinimumSamples | integer | Successful samples required before latency alerting activates. |
| anomalyPolicy.baselineWindowSuccessfulSamples | integer | Maximum successful samples used by the rolling baseline. |
| anomalyPolicy.warningThreshold | string | Human-readable warning threshold formula. |
| anomalyPolicy.criticalThreshold | string | Human-readable critical threshold formula. |
| anomalyPolicy.ipv6OnlyErrorDoesNotOverrideIpv4Pass | boolean | Documents that an IPv6-only error does not convert an IPv4 STUN PASS into overall FAIL. |
| JSON path/key | Type | Definition |
|---|---|---|
| results | array[object] | Complete chronological regional-test records for the session. |
| results[].testId | string | Unique test identifier. |
| results[].cycleId | string | Identifier shared by regional tests launched in the same monitoring cycle. |
| results[].cycleNumber | integer | Sequential monitoring cycle number. |
| results[].regionId | string | Endpoint identifier tested in this result. |
| results[].regionName | string | Human-readable region name. |
| results[].group | string | Region grouping. |
| results[].host | string | STUN hostname used for the test. |
| results[].stunUrl | string | STUN URL supplied to RTCPeerConnection. |
| results[].startedAt | ISO datetime | UTC test start time. |
| results[].startedLocal | string | Browser-local test start time. |
| results[].completedAt | ISO datetime | UTC test completion time. |
| results[].completedLocal | string | Browser-local test completion time. |
| results[].durationMs | integer | Total test duration. |
| results[].timeoutMs | integer | Per-region timeout applied to the test. |
| results[].completedBy | string | Completion trigger: ice-complete, timeout or exception. |
| results[].status | string | PASS or FAIL. |
| results[].reason | string | Human-readable result summary. |
| results[].firstSrflxMs | integer/null | Elapsed milliseconds to first srflx. |
| results[].mappedAddress | string/null | Preferred public IP and mapped port combined. |
| results[].mappedIp | string/null | Preferred public STUN-mapped IP. |
| results[].mappedPort | integer/null | Preferred STUN-mapped UDP port. |
| results[].iceGatheringStateFinal | string | Final browser ICE gathering state. |
| results[].cycleEgressChange | object/optional | Added to results from a cycle in which the established common public egress changed. Uses timestamp, cycleId, cycleNumber, from and to. |
| JSON path/key | Type | Definition |
|---|---|---|
| results[].counts | object | ICE candidate counters for the test. |
| results[].counts.host | integer | Host candidate count. |
| results[].counts.srflx | integer | Server-reflexive candidate count. |
| results[].counts.relay | integer | Relay candidate count. |
| results[].counts.prflx | integer | Peer-reflexive candidate count. |
| results[].counts.other | integer | Candidate count whose type does not match the four named counters. |
| results[].familyHealth | object | Independent IPv4 and IPv6 classifications. |
| results[].familyHealth.ipv4 | object | IPv4 health record; same child keys as IPv6. |
| results[].familyHealth.ipv6 | object | IPv6 health record; same child keys as IPv4. |
| results[].familyHealth.*.version | integer | 4 or 6. |
| results[].familyHealth.*.status | string | PASS, ERROR or NOT OBSERVED. |
| results[].familyHealth.*.srflxCount | integer | Number of srflx candidates for that family. |
| results[].familyHealth.*.firstSrflxMs | integer/null | First srflx observation time for that family. |
| results[].familyHealth.*.mappedAddresses | array[string] | All srflx addresses recorded for that family. |
| results[].familyHealth.*.errors | array[object] | ICE errors classified into that IP family; entries have the same schema as results[].errors[]. |
| results[].baseline | object | Region-specific rolling latency baseline as it existed before adding the current test. |
| results[].baseline.ready | boolean | Whether at least five baseline samples exist. |
| results[].baseline.count | integer | Samples in the current baseline window. |
| results[].baseline.window | integer | Maximum number of successful samples considered (30). |
| results[].baseline.medianMs | integer/null | Rolling median acquisition time. |
| results[].baseline.p95Ms | integer/null | Rolling 95th percentile acquisition time. |
| results[].baseline.warningThresholdMs | integer/null | Computed warning threshold. |
| results[].baseline.criticalThresholdMs | integer/null | Computed critical threshold. |
| results[].alert | object | Anomaly assessment attached to the test. |
| results[].alert.severity | string | NORMAL, WARN or CRITICAL. |
| results[].alert.kind | string | Primary alert classification. |
| results[].alert.reasons | array[string] | One or more explanations supporting the alert. |
| results[].egressObservation | object | Per-region comparison of this public IP with the previous observation. |
| results[].egressObservation.changed | boolean | True if this region's public IP changed from its previous non-null value. |
| results[].egressObservation.previousIp | string/null | Previous public IP when available. |
| JSON path/key | Type | Definition |
|---|---|---|
| results[].candidates | array[object] | Every ICE candidate emitted by the browser during the test. |
| results[].candidates[].raw | string | Raw SDP ICE candidate string exposed by the browser. |
| results[].candidates[].sdpMid | string/null | SDP media identification associated with the candidate. |
| results[].candidates[].sdpMLineIndex | integer/null | SDP media-line index. |
| results[].candidates[].usernameFragment | string/null | ICE username fragment if exposed. |
| results[].candidates[].foundation | string/null | ICE candidate foundation identifier. |
| results[].candidates[].component | string/null | ICE component, normally RTP for RTCP-mux WebRTC. |
| results[].candidates[].protocol | string/null | Transport protocol reported for the candidate, normally UDP in these tests. |
| results[].candidates[].priority | number/null | ICE candidate priority assigned by the browser. |
| results[].candidates[].address | string/null | Candidate address; browser privacy controls may mask host addresses. |
| results[].candidates[].port | integer/null | Candidate port. |
| results[].candidates[].type | string/null | ICE candidate type: host, srflx, relay, prflx or other. |
| results[].candidates[].tcpType | string/null | TCP candidate subtype when applicable. |
| results[].candidates[].relatedAddress | string/null | Base/related address associated with a derived candidate, when exposed. |
| results[].candidates[].relatedPort | integer/null | Base/related port associated with a derived candidate. |
| results[].candidates[].observedAtMs | integer | Milliseconds from test start when the candidate was observed. |
| results[].candidates[].ipVersion | integer/null | 4, 6 or null based on the candidate address format. |
| results[].errors | array[object] | ICE candidate errors plus locally caught setup exceptions. |
| results[].errors[].observedAtMs | integer | Milliseconds from test start when the error occurred. |
| results[].errors[].timeLocal | string | Browser-local timestamp for the error. |
| results[].errors[].address | string/null | Address associated with the ICE candidate error, when the browser exposes it. |
| results[].errors[].ipVersion | integer/null | Address family inferred from the error address. |
| results[].errors[].port | integer/null | Port associated with the error. |
| results[].errors[].url | string/null | ICE server URL associated with the error. |
| results[].errors[].errorCode | number/string/null | Browser ICE error code, or EXCEPTION for a caught JavaScript/WebRTC setup exception. |
| results[].errors[].errorText | string/null | Browser-provided error description. |
| results[].transitions | array[object] | PeerConnection/ICE state transitions recorded during the test. |
| results[].transitions[].atMs | integer | Milliseconds from test start when the state transition occurred. |
| results[].transitions[].event | string | State/event name such as iceGatheringState, iceConnectionState, connectionState or localDescription. |
| results[].transitions[].value | string | State value recorded for the event. |
| JSON path/key | Type | Definition |
|---|---|---|
| incidents | array[object] | User-created incident markers and their captured monitor state. |
| incidents[].incidentId | string | Generated incident identifier. |
| incidents[].timestamp | ISO datetime | UTC time the incident was marked. |
| incidents[].timestampLocal | string | Browser-local incident timestamp. |
| incidents[].note | string | User-entered incident note or Genesys conversation ID. |
| incidents[].cycleNumber | integer | Latest cycle number at the time the marker was created. |
| incidents[].latestByRegion | object | Snapshot of the latest result for each currently selected region, keyed by region ID; null when no result exists yet. |
| incidents[].latestByRegion.<regionId>.status | string | Latest PASS/FAIL state. |
| incidents[].latestByRegion.<regionId>.completedAt | ISO datetime | Completion time of the captured regional result. |
| incidents[].latestByRegion.<regionId>.reason | string | Captured result summary. |
| incidents[].latestByRegion.<regionId>.counts | object | Captured candidate counts using the same schema as results[].counts. |
| incidents[].latestByRegion.<regionId>.firstSrflxMs | integer/null | Captured first server-reflexive acquisition time. |
| incidents[].latestByRegion.<regionId>.mappedAddress | string/null | Captured preferred public IP:port. |
| incidents[].latestByRegion.<regionId>.mappedIp | string/null | Captured preferred public IP. |
| incidents[].latestByRegion.<regionId>.mappedPort | integer/null | Captured preferred mapped UDP port. |
| incidents[].latestByRegion.<regionId>.familyHealth | object | Captured IPv4/IPv6 family health using the same schema as results[].familyHealth. |
| incidents[].latestByRegion.<regionId>.baseline | object | Captured regional baseline. |
| incidents[].latestByRegion.<regionId>.alert | object | Captured anomaly assessment. |
| incidents[].latestByRegion.<regionId>.errors | array[object] | Captured latest ICE errors. |
| incidents[].egressAtIncident | object/null | Latest completed cross-region egress-cycle summary at marker time. |
| incidents[].egressChangeCount | integer | Total common public-IP changes recorded up to marker time. |
| incidents[].anomalyCount | integer | Total anomalies recorded up to marker time. |
| timeline | array[object] | Recent human-readable event timeline retained by the session (capped by the app). |
| timeline[].iso | ISO datetime | UTC event timestamp. |
| timeline[].type | string | Event type such as PASS, FAIL, WARN, CRITICAL, INCIDENT or INFO. |
| timeline[].regionName | string | Region/session label associated with the event. |
| timeline[].text | string | Human-readable timeline detail. |