Monitoring Webex with Cloud and Enterprise Agents

Best Practices

We recommend that you set up the following tests with Webex Cloud Agents to better understand your Webex performance. For full visibility into Webex, these tests should supplement any HTTP server, web transaction, or DNS tests that you have targeting your Webex environment.
  • An RTP Stream Test between any applicable Enterprise Agents and the Webex Cloud Agent hosted within the VPC of your closest multimedia platform server. You should use (UDP) 9000 and 5004, with DSCP 46. This will help you understand inbound performance of voice traffic into the Webex Cloud environment.
    Figure 1: RTP stream test targeting port 5004 with DCSP 46
  • An Agent-to-Agent Bidirectional Test between any applicable Enterprise Agents and the Webex Cloud Agent hosted within the VPC of your closest multimedia platform server. You should use (UDP) 9000 and 5004, with DSCP 34. This will help you understand simulated, bidirectional performance of video-marked traffic into the Webex Cloud environment.
    Figure 2: Network agent-to-agent UDP test targeting port 5004 with DCSP 34
    Keep in mind that for agent-to-agent tests, in many cases you must configure the firewall to allow the test to succeed. For detailed information, see Firewall Configuration.
If the Enterprise Agent in the test is behind a NAT, you must also select the Behind a NAT option. For detailed information, see NAT Traversal Requirements.
  • Optional: Secondary RTP Stream and Agent-to-Agent Bidirectional Tests For more complete visibility, set up the above RTP stream and agent-to-agent tests to your second-closest multimedia platform server. You should use the same test settings targeting your backup Webex multimedia platform location, providing visibility into its reachability and network traffic performance.
If you attempt to run a TCP-based test, we recommend that you enable in-session path trace mode for consistent path visualization results. If you don’t enable this setting, you may notice TCP packets getting dropped at the ingress of the Webex infrastructure.
  • Vanity Webex HTTP Server URL Test for monitoring the primary landing page that your users connect to when they access Webex. This example shows https://cisco.webex.com, but you will want to use https://<your-company-name>.webex.com.
    Figure 3: Vanity Webex HTTP server test
Make sure to update the Advanced Settings > Network > Data Collection > Protocol to ICMP.
  • Authoritative Webex DNS Server Test is used to ensure that your vanity Webex domain is properly resolving both internally and externally. When using Enterprise Agents, update the DNS Servers field to use your internal name servers. If you use Cloud Agents for external visibility, use the Lookup Servers button to auto-populate the authoritative external name servers. This example shows Cloud Agents resolving cisco.webex.com. You will need to update it to your organization's vanity domain.
    Figure 4: Authoritative Webex DNS server test
If you use and Enterprise Agents, make sure to update the Advanced Settings > Network > Protocol to TCP and the Advanced Settings > Network > DNS to Send recursive queries. If you use both Cloud and Enterprise agents, set Advanced Settings > Network > DNS > Transport to UDP.
  • Optional: Transaction Test to Check the Webex Status Page The code sample below can be pasted into the Transaction Script field and used to monitor the Webex Status page
    Figure 5: Webex status page transaction test
Make sure to update Advanced Settings > Network > Data Collection > Protocol to ICMP.
import { By, Key } from 'selenium-webdriver';
import { driver, browser, markers } from 'thousandeyes';
runScript();
async function runScript() {
await configureDriver();
// Navigate to Webex Global Status Page
await driver.get('https://status.webex.com/service/status?lang=en_US');
await driver.takeScreenshot();
// Find the card for Webex Meetings
let webex_meetings = await driver.findElement(By.xpath(`//*[text()="Webex Meetings"]`));
// click on webex meetings to show operational status
await webex_meetings.click();
// Scroll the card into view and take a screenshot
await driver.executeScript("arguments[0].scrollIntoView({block: 'center'});", webex_meetings);
await driver.takeScreenshot();
// Find all the list items showing each component's status
let items = await webex_meetings.findElements(By.xpath('./../..//li'));
// Iterate over each list item...
await Promise.all(items.map(async function (item) {
let component = await item.findElement(By.css('span.text-secondary')).getText();
let status = await item.findElement(By.css('span.font-body-small')).getText();
console.log((await component), (await status));
// ...and throw an error if any Webex Meeting Comopnent is non-Operational
if (status != 'Operational') {
throw Error('Component "' + component + '" is not operational: ' + status);
}
}));
}
async function configureDriver() {
await driver.manage().window().setRect({
width: 1440,
height: 900 });
await driver.manage().setTimeouts({
implicit: 7 * 1000 // If an element is not found, reattempt for this many milliseconds
});
async function configureDriver() {
await driver.manage().setTimeouts({
implicit: 7 * 1000, // If an element is not found, reattempt for this many milliseconds
});
}
async function click(selector) {
await simulateHumanDelay();
const configuredTimeouts = await driver.manage().getTimeouts();
const clickAttemptEndTime = Date.now() + configuredTimeouts.implicit;
await reattemptUntil(attemptToClick, clickAttemptEndTime);
async function attemptToClick() {
await driver.findElement(selector)
.click();
}
}
async function reattemptUntil(attemptActionFn, attemptEndTime) {
const TIME_BETWEEN_ATTEMPTS = 100;
let numberOfAttempts = 0;
let attemptError;
while (Date.now() < attemptEndTime || numberOfAttempts === 0) {
try {
numberOfAttempts += 1;
await attemptActionFn();
}
catch (error) {
attemptError = error;
await driver.sleep(TIME_BETWEEN_ATTEMPTS);
continue; // Attempt failed, reattempt
}
attemptError = null;
break; // Attempt succeeded, stop attempting
}
const wasAttemptSuccessful = !attemptError;
if (!wasAttemptSuccessful) {
throw attemptError;
}
}
async function simulateHumanDelay() {
await driver.sleep(550);
}
async function typeText(value, selector) {
await simulateHumanDelay();
const element = await driver.findElement(selector);
await element.clear();
await element.sendKeys(value);
}
}

Webex Cloud Agent Locations

For current Webex Cloud Agent locations, see Webex Agents.