ThousandEyes Documentation
  • ThousandEyes Documentation
  • What's New
    • Changelog
    • Naming and Navigation Menu Changes - Summary List
  • Product Documentation
    • Getting Started
      • Getting Started with Account Setup
      • Getting Started with Cloud and Enterprise Agents
      • Getting Started with Cloud and Enterprise Agent Tests
      • Getting Started with Endpoint Agents
      • Getting Started with Transactions
      • Getting Started with Dashboards
      • Getting Started with Alerts
      • Getting Started with Internet Insights
      • Getting Started with the ThousandEyes API
      • Getting Started with API Tests
      • Getting Support from ThousandEyes
      • Notification of Upgrades, Maintenance and Outages
      • New User FAQ
      • ThousandEyes Glossary
    • Global Vantage Points
      • Cloud Agents
        • Where Are Cloud Agents Available?
        • Webex Cloud Agents
        • AWS Wavelength Cloud Agents
        • Cloud Agent with Local Problems
      • Enterprise Agents
        • Getting Started
          • Where Can I Get the Account Group Token?
        • Installing
          • Enterprise Agent System Requirements
            • Enterprise Agent Support Lifecycle
          • Appliances
            • How to Set Up the Virtual Appliance
            • Enterprise Agents: Hypervisor Installation
            • Installing Enterprise Agent on VirtualBox
            • Enterprise Agent Deployment Using ThousandEyes Virtual Appliance (Hyper-V)
            • Enterprise Agent Deployment Using ThousandEyes Virtual Appliance (OVA)
            • Custom Virtual Appliances
            • Installing a Physical Appliance
            • Installing an Enterprise Agent on a Raspberry Pi Device
          • Cisco Devices
            • Catalyst Switching
            • Catalyst Routing
            • Nexus Switching
            • Service Routing
            • Meraki MX Appliances
            • Cisco Enterprise NFV Infrastructure Software
            • Installation Methods
              • Installing Enterprise Agents on Cisco Nexus Switches with Application Hosting
              • Installing Enterprise Agents on Cisco Nexus Switches with Guestshell
              • Installing Enterprise Agents on Cisco Routers using SD-WAN Manager Feature Templates
              • Installing Enterprise Agents on Cisco Routers using the SD-WAN Manager ThousandEyes Workflow
              • Installing Enterprise Agents on Cisco Switches with Docker
              • Installing Enterprise Agents on Cisco Routers with Docker
              • Installing Enterprise Agents on Cisco Switches with the DNA Center
          • Linux Packages
            • Enterprise Agent Deployment Using Linux Package Method
            • Installing the Enterprise Agent with BrowserBot on Oracle Linux Server 7
          • Docker Agents
            • Installing Enterprise Agents with Docker
          • Cloud Templates
            • Installing Enterprise Agents with Microsoft Azure
          • Docker Agent Configuration Options
          • Missing Dependencies for Enterprise Agent on Redhat Enterprise Linux RHEL 7 Installation
          • Migrating ThousandEyes Appliance or Package-Based Enterprise Agent to Docker
        • Configuring
          • Password Reset on the Virtual Appliance
          • Configuring rDNS Lookups for Enterprise Agents
          • Connecting to the ThousandEyes Virtual Appliance Using SSH (Mac/Linux)
          • Connecting to the ThousandEyes Virtual Appliance Using SSH (Windows)
          • Static IP Addresses for ThousandEyes Repositories
          • Firewall Configuration for Enterprise Agents
          • Enterprise Agent Port Forwarding
          • Security Policy and Public NTP Servers on Enterprise Agents
          • Secure Access to ThousandEyes Appliances
          • Disabling the Web Server of a Virtual Appliance
          • NAT Traversal for Agent-to-Agent Tests
          • Enterprise Agent on Docker Advanced Networking
        • Managing
          • Cisco Devices
            • Disable, Restart, or Uninstall the Enterprise Agent via DCNM
          • Docker Agents
            • Add/Remove BrowserBot from Existing Docker Enterprise Agents
          • Upgrading Operating Systems for Enterprise Agents
          • Backup and Restore Your Enterprise Agent Configuration
          • Upgrade Ubuntu 20.04 Focal-Based ThousandEyes Appliances
          • Crash Reporting for Enterprise Agents
          • Configuring a Local Mirror of the ThousandEyes Package Repository
          • Resetting an Enterprise Agent
          • Working with Enterprise Agent Clusters
          • Replacing an Enterprise Agent Using the Agent Clustering Method
          • Replacing an Enterprise Agent Using Agent Identity Files
          • Unlocking the ThousandEyes Appliance
          • Uninstalling the Enterprise Agent (Linux Package)
        • Proxy Environments
          • Installing Enterprise Agents in Proxy Environments
          • Configuring an Enterprise Agent to Use a Proxy Server
          • Writing and Testing Proxy Auto-Configuration (PAC) Files
        • Troubleshooting
          • How to Generate Packet Captures
          • Troubleshooting Automatic-Update Problems on Enterprise Agents
          • Troubleshooting Time Synchronization on Enterprise Agents
          • Installing CA Certificates on Enterprise Agents
          • Agent Unable to Trace Path to Destination?
          • BrowserBot Installation Fails on Red Hat or CentOS in Amazon EC2
          • What to Do If te-agent Stops Running Due to a VACUUM Error
        • Enterprise Agents: What Information Do We Collect?
        • What Is BrowserBot?
        • Upgrading to BrowserBot 2
        • Upgrading to BrowserBot 2.6+ (Chromium 97)
        • Enterprise Agent Utilization
        • Network Utilization from Enterprise Agent Test Traffic
        • Enterprise Agent Interface Selection
        • ThousandEyes Product Lifecycle Policy
      • Endpoint Agents
        • Installing
          • System Requirements
          • Download the Endpoint Agent Installer
          • Install the Endpoint Agent
          • Reinstall the Endpoint Agent
          • Install the Endpoint Agent Browser Extension
          • Install Endpoint Agents for Windows via Group Policy
          • Installing Browser Extensions for Windows via Group Policy
          • Guidance for Windows Software Deployment Teams
          • Install Endpoint Agents for macOS using Munki and the Managed Software Center
          • Deploy an MSI package to Intune for Windows Devices
          • Endpoint Agent Installation on Cisco Webex Devices (RoomOS)
          • Endpoint Agent Installation on Cisco Phone Devices (PhoneOS)
          • Uninstall or Delete an Endpoint Agent
          • Endpoint Agent Installation Reference
          • NPCAP Driver Upgrade Management
        • Configuring
          • Configure Endpoint Agent Labels
          • Endpoint Agent Proxy Configuration for Scheduled Tests
        • Managing
          • Manage Endpoint Agent Settings
        • How Does the Endpoint Agent Work
        • Cisco Secure Client ThousandEyes Endpoint Agent Module
        • Endpoint Agent Licensing
        • Assigning tests to an Endpoint Agent
        • Data Collected by Endpoint Agent
        • Reporting on data collected by Endpoint Agent
        • Endpoint Agent VPN Support
        • Endpoint Agent TCP Support
        • Endpoint Agent End-user Experience
        • Endpoint Agent FAQ
      • Working with Agent Settings
      • Obtaining a list of ThousandEyes Agent IP Addresses with te-iplist
    • Tests
      • HTTP Server Tests
        • Collecting Proxy Metrics
        • POSIX Extended Regular Expression Syntax (Quick Reference)
        • POSIX Extended Regular Expression Syntax
        • Custom User-Agent Strings in a Web Test
        • Two-Step HTTP Testing (OAuth)
      • Web-Layer Tests
      • Network Tests
        • Network Tests Explained
        • Agent-to-Agent Test Overview
        • DSCP Options in Network Tests
      • DNS Tests
      • Voice Tests
        • SIP Server Test Settings
        • RTP Stream Test Settings
        • Using the SIP Server View
        • Using the RTP Stream View
      • BGP Tests
        • Inside-Out BGP Visibility
        • Using the BGP Route Visualization View
        • Using the BGP Updates Table
        • Working with Raw BGP Data
        • Reasons for Failure of Private Peering with ThousandEyes
        • RPKI
      • API Tests
        • Using the API Test Step Builder
      • Templates
        • User-defined Templates
      • Recommendations
        • Associated Service Recommendations
        • AWS Test Recommendations
      • ThousandEyes Metrics: What Do Your Results Mean?
      • Sharing Test Data
      • Working with Test Settings
      • Scheduled Versus Instant Tests
      • Working with Instant Tests
      • Working with Labels for Agent and Test Groups
      • Multi-Service Views
      • Identifying Traffic from ThousandEyes Agents
      • Excluding ThousandEyes Agents from Google Analytics
    • Internet and WAN Monitoring
      • Path Visualization
        • How Path Trace Works
        • MPLS Tunnel Inference Using Deep Path Analysis
        • Troubleshooting
          • Reasons for Missing Information on the Visualization View
          • Virtual Machine with NAT Breaks Path Visualization
          • Cisco ASA Breaks Path Visualization
          • Path Visualization: Edge Firewall Incorrectly Shows a Single Hop to the Destination
          • Network Overview Shows Packet Loss That Does Not Appear in Path Visualization
      • Views
        • Using the Network Overview
        • Using the FTP Server View
        • Using the HTTP Server View
        • Using the DNS Server View
        • Using the DNS Domain Trace View
        • Using the DNSSEC Trace View
        • Using the API Test Views
      • Troubleshooting
        • CLI Network Troubleshooting Utilities
        • HTTP Server Test Fails with SSL Error
        • HTTP Server Test Fails with SSL Error: OpenSSL SSL_connect: SSL_ERROR_SYSCALL
        • HTTP Server Test Error "dh Key Too Small"
    • Browser Synthetics
      • Browser Synthetics Test Types
      • Browser Synthetics Disambiguation
      • Test Settings for Page Load and Transaction Tests
      • Navigating Waterfall Charts for Page Load and Transaction Tests
      • Using Round Robin Test Scheduling
      • What Information Is Transmitted in a Page Load or Transaction Test?
      • Transaction Test SSO Support
        • Implementing SSO in Transaction Scripts
        • Caveats for NTLM/Kerberos Authentication
        • TOTP Examples for SSO
      • Page Load Tests
        • When to Use a Page Load Test
        • Creating a Page Load Test
        • Using the Page Load View
        • How to Generate a HAR File
        • Migrating to Single Interval for Page Load Tests
        • Creating a Page Load Test that Uses SSO
      • Transaction Tests
        • Getting Started With Transaction Tests
          • When to Use a Transaction Test
          • Transaction Tests Compared With Other Test Types
          • ThousandEyes Recorder
          • ThousandEyes Recorder Permissions
          • Working With Web Development Tools
          • Working With Secure Credentials
          • Transaction Test Table Tab View
          • Transaction Metrics on Alerts and Dashboards
          • Screenshots in Transaction Test Views
        • Transaction Test Development Guide
          • Creating Robust Transaction Scripts
            • Optimizing and Troubleshooting Transaction Scripts
            • Transaction Scripting Tips and Tricks
          • Transactions – Executing Custom JavaScript Code
        • Use Cases | Code Examples
          • Uploading or Downloading Files in a Script
            • Transaction Scripting Examples for File Downloads
          • Include API Calls in a Transaction Test
            • Using the node-fetch module
            • Using the net module
            • Using the tls module
        • Transaction Scripting Reference
      • Dual Chromium Option
        • Why Are Regular Chromium Upgrades Needed?
        • Configuring Dual Chromium
        • Working With Dual Chromium
        • Chromium Update History
        • Chromium Upgrade Known Issues
    • Endpoint Experience
      • Test Settings
        • Monitoring an Application using Synthetic Tests
        • Configuration Options for Synthetic Tests
        • Managing Synthetic Tests
        • Real User Tests
      • Viewing Data
        • Endpoint Agent Scheduled Tests View
        • Endpoint Agent Real User Tests View
        • Endpoint Agent Local Networks View
        • Endpoint Agent Dynamic Tests View
        • Endpoint Agent Views
        • Endpoint Views Reference
      • Troubleshooting
        • Step-by-Step Guide to Troubleshooting Endpoint Agent Problems
        • Troubleshooting Endpoint Agent Issues
    • Connected Devices
      • Connected Devices Tests
        • Routing
          • Traceroute
        • Network
          • Speed Tests
          • Latency, Loss, Disconnections, and Jitter Tests
          • Responsiveness (Latency under Load) Tests
        • DNS
          • DNS Resolution Tests
        • Web
          • Web Browsing Lite Tests
          • Generic Streaming (HLS/DASH) Tests
        • Voice
        • Dynamic Application Test Suites
          • Gameplay Test Suite
          • Video Conferencing Test Suite
          • Social Media Test Suite
          • Game Store Test Suite
          • Video Streaming Test Suite
            • Netflix Streaming Tests
            • YouTube Streaming Tests
            • BBC iPlayer Streaming Tests
          • Content Delivery Network (CDN) Test Suite
        • Local Network Information
          • Data Usage
      • Test Management
        • Test Triggers
          • Scheduled Tests
          • Instant Tests
        • Testing Thresholds
        • Test Targets
          • Test Server Methodology
        • Automatic Test Configuration Retrieval
      • Device Agents
        • Router Agents
          • Router Agent Device Support
        • Connected Devices Agent Release Versions
      • Usage Guides
        • Viewing Charts
        • Configuring Charts
        • Using Maps
        • Exporting Data
        • Importing Metadata
        • Managing Metadata
        • Creating Reports
        • Viewing Agents
        • Using Test Schedules
        • Accessing Your APIs
        • Using ConstantCare
      • Cisco Real Speed
    • Cloud Insights
      • Integrations
      • Views
      • Settings
    • Traffic Insights
      • Traffic Insights System Requirements
      • Traffic Insights Configuration Guide
      • Traffic Insights Views and Settings
      • Traffic Insights FPS Monitoring
    • WAN Insights
      • WAN Insights Quick Start
        • How to Activate ThousandEyes WAN Insights
        • WAN Insights Introductory Tour, Part 1
        • WAN Insights Introductory Tour, Part 2
        • WAN Insights Introductory Tour, Part 3
      • Introducing WAN Insights
        • What Is WAN Insights?
        • WAN Insights Value-Add
        • Why Use WAN Insights?
        • Using WAN Insights Together With ThousandEyes Network Assurance
        • Using WAN Insights Together with vAnalytics and vManage
        • WAN Insights Key Components
        • Enabling WAN Insights
        • Getting Support for WAN Insights
      • WAN Insights Terminology and Reference
      • WAN Insights Technical Overview
        • Application Categories
        • Sites, Routers, Paths, and Interfaces
        • Application Traffic Types
        • Estimating User Counts
        • Estimating Throughput
        • Capacity Planning
        • Understanding Quality
        • Life of a Recommendation
        • Understanding Recommendations
        • WAN Insights and ThousandEyes Alerts
      • WAN Insights User Interface
        • Logging In for the First Time
        • WAN Insights Screens and Workflows
        • Recommendations Screen
        • Recommendation Cards, Explained
        • Recommendation Details Modal
        • Endpoint-Pair Quality Comparison
        • Site Details Screen
        • Capacity Planning Screen
        • Capacity Detail Modal
        • Enter or Upload Bandwidth Data
      • Common Tasks
        • Adding Business-Critical Applications to WAN Insights
        • Email Notifications
        • Adding and Managing WAN Insights Users
        • Applying WAN Insights Recommendations
    • Internet Insights
      • Internet Insights Terminology
      • Limited Outage Map
      • Internet Insights Screens
        • Overview Screen
        • Internet Insights Service Views Screen
        • Application Outages
        • Network Outages
        • Catalog Settings Screen
      • Saving and Sharing from Internet Insights
      • Configuring Internet Insights
      • Provider Labels
      • Using Alerts and Dashboards With Internet Insights
        • My Affected Tests
        • Setting Up Alert Rules for Internet Insights
        • Using the Internet Insights Built-In Dashboard
    • Event Detection
    • Alerts
      • Creating and Editing Alert Rules
        • Global and Location Alert Conditions
        • Alert Rule Severity
        • Adaptive Alert Detection
        • Dynamic Baselines
        • Transport Layer Security (TLS) Alerts
        • Alert Rules for Devices
        • Alert Metrics Reference
      • Default Alert Rules
      • Viewing Alerts
      • Alert Clearing
        • Alert Suppression Windows
      • Alert Notifications
      • Standard Notification Methods
        • Alert Notifications via Email
        • Alert Notifications via SMS
        • Classic Webhooks for Alert Notifications
    • Dashboards
      • Using the Dashboard
      • Customizing Your Dashboard
      • Using the Dashboard Templates
      • Dashboard Widgets
      • Embedding Dashboard Widgets in External Web Sites
      • Excluding Periods of Data From a Dashboard
      • Dashboard Sharing and Snapshots
      • Dashboard Labels
      • Troubleshooting with Dashboard Drill Down
      • Tailoring Dashboards with Dashboard Filters
    • Device Layer
      • Discovering Device-Layer Devices
      • Device Discovery Results
      • Using the Device Layer View
    • Account Management
      • User Registration
        • SAML JIT Provisioning
        • ThousandEyes Support for SCIM
          • How to Configure SCIM with Azure Active Directory
          • How to Configure SCIM with Okta
      • Authorization
        • Role-Based Access Control
          • Role-Based Access, Explained
          • Built-In Roles and Permissions
        • Account Groups
          • What is an Account Group?
          • Working with Account Settings
          • Users in Multiple Organizations
          • Changing Ownership of a Test
          • Working with Time Zone Settings
        • OAuth 2.0 with ThousandEyes
          • Integrations with OAuth 2.0
        • Adding a Profile Image with Gravatar
      • Authentication
        • Logging In
        • How to Configure Single Sign-On
      • User Activity
        • Working with the Activity Log
        • ThousandEyes User Session Timeouts and Terminations
        • How Long is my Data Accessible via ThousandEyes?
        • Retaining Data Beyond the 90-Day Limit
        • Multi-Region Cloud Support
      • Usage-Based Billing
        • About Our Consumption Model
          • Device Agent Consumption Model
        • About Units
        • Test Type Layers and Units
        • Setting Quotas
        • Calculating Units
        • FAQs: Usage
      • Customer Security and Privacy Responsibilities
    • Integrations
      • Custom Webhooks
        • Using OAuth 2.0 Authentication for Your Custom Webhook
        • Webhook Variables
      • Custom Webhook Examples
        • Microsoft Teams for Alert Notifications
        • Cisco Webex for Alert Notifications
        • Google Chat for Alert Notifications
        • Event-Driven Ansible for Alert Notifications
        • Splunk Alert Notification
      • Custom-Built Integrations
        • PagerDuty for Alert Notifications
        • ServiceNow for Alert Notifications
          • Incident Management
        • Slack for Alert Notifications
        • AppDynamics for Alert Notifications
        • AppDynamics for Test Recommendations
        • AWS for Test Recommendations
        • AWS for Cloud Insights
          • AWS for Cloud Insights Using CLI
        • Meraki for Data Enrichment
        • Webex Control Hub Integration
        • Microsoft Teams Integration
        • ThousandEyes for OpenTelemetry
          • Configuring ThousandEyes for OpenTelemetry
            • Configuring ThousandEyes for OpenTelemetry Using the API
            • Configuring ThousandEyes for OpenTelemetry Using the UI
          • Configuring ThousandEyes for Splunk Cloud or Enterprise
            • Configuring ThousandEyes for Splunk Cloud or Enterprise using the API
            • Configuring ThousandEyes for Splunk Cloud or Enterprise using the UI
          • ThousandEyes for OpenTelemetry Data Model
            • ThousandEyes for OpenTelemetry Data Model v1
              • OpenTelemetry Collector Data v1 Example
            • ThousandEyes for OpenTelemetry Data Model v2
              • ThousandEyes for OpenTelemetry Data Model v2 - Metrics
                • OpenTelemetry Collector Data v2 Metrics Example
                • ThousandEyes for OpenTelemetry Data Model Metrics - Migration from v1 to v2
              • ThousandEyes for OpenTelemetry Data Model v2 - Traces
                • OpenTelemetry Collector Data v2 Traces Example
          • OpenTelemetry Collector Configuration
          • Automatic Disabling of Failing Streaming Integrations
        • Cisco ThousandEyes App for Splunk
          • Configuration
          • Inputs
          • Dashboards
          • Troubleshooting
    • Best-Practices Guides
      • Choosing the Right Test Protocol for Network & App Synthetics Tests
      • Optimizing SYN vs SACK Probing Methods to Avoid Unexplainable Packet Loss
      • Using Dashboards to Tell a Story
      • Best Practices for Implementing Account Groups
      • Monitoring Microsoft 365
      • Monitoring Microsoft Teams
      • Monitoring Salesforce
      • Monitoring Slack
      • Monitoring Webex Meetings with Endpoint Agents
      • Monitoring Webex Calling
      • Monitoring Webex Meetings with Cloud and Enterprise Agents
      • Monitoring Zoom
    • API
      • Create/Update/Delete Tests Using the ThousandEyes API
      • Obtaining a List of ThousandEyes Agent IP Addresses
      • Writing JSON to API Produces HTTP 406 Response Code
    • Privacy-Related
      • Authorized Subprocessors for ThousandEyes Network Intelligence Platform
    • Archived Documentation
      • Archived - Displaying and Alerting for Unit Consumption
      • Archived - Dependency Tree for ThousandEyes Enterprise Agent Software
      • Archived - Getting Started with ThousandEyes
      • Archived - Sending ThousandEyes Alerts to AppDynamics
      • Archived - ThousandEyes Infrastructure Changes
      • Archived - Using the Transactions (Classic) View
      • Archived - Transaction Test Migration Workflow
      • Archived - Instructions for Mitigating Meltdown and Spectre on Enterprise Agents
      • Archived - Bash (ShellShock) Security Notice
      • Archived - Endpoint Installation using Customized Installers
      • Archived - Configuring Endpoint Agent Setup
      • Archived - Creating Scheduled Tests on Endpoint Agents
      • Archived - Managing the Endpoint Agent
      • Archived - Enterprise Agent Installation on Juniper NFX Routers
      • Archived - Installing and Removing ThousandEyes X Virtual Framebuffer on Enterprise Agents
      • Archived - Permitted Content Types for Page Load Tests
  • Archived Release Notes
    • 2024
      • Release Notes: January 2024
      • Release Notes: February 2024
      • Release Notes: March 2024
      • Release Notes: April 2024
      • Release Notes: May 2024
      • Release Notes: June 2024
      • Release Notes: July 2024
      • Release Notes: August 2024
    • 2023
      • Release Notes: January 2023
      • Release Notes: February 2023
      • Release Notes: March 2023
      • Release Notes: April 2023
      • Release Notes: May 2023
      • Release Notes: June 2023
      • Release Notes: July 2023
      • Release Notes: August 2023
      • Release Notes: September 2023
      • Release Notes: October 2023
      • Release Notes: November 2023
      • Release Notes: December 2023
    • 2022
      • Release Notes: January 2022
      • Release Notes: February 2022
      • Release Notes: March 2022
      • Release Notes: April 2022
      • Release Notes: May 2022
      • Release Notes: June 2022
      • Release Notes: July 2022
      • Release Notes: August 2022
      • Release Notes: September 2022
      • Release Notes: October 2022
      • Release Notes: November 2022
      • Release Notes: December 2022
    • 2021
      • Release Notes: January 2021
      • Release Notes: February 2021
      • Release Notes: March 2021
      • Release Notes: April 2021
      • Release Notes: May 2021
      • Release Notes: June 2021
      • Release Notes: July 2021
      • Release Notes: August 2021
      • Release Notes: September 2021
      • Release Notes: October 2021
      • Release Notes: November 2021
      • Release Notes: December 2021
    • 2020
      • Release Notes: January 2020
      • Release Notes: February 2020
      • Release Notes: March 2020
      • Release Notes: April 2020
      • Release Notes: May 2020
      • Release Notes: June 2020
      • Release Notes: July 2020
      • Release Notes: August 2020
      • Release Notes: September 2020
      • Release Notes: October 2020
      • Release Notes: November 2020
      • Release Notes: December 2020
    • 2019
      • Release Notes: 2019-01-08
      • Release Notes: 2019-02-06
      • Release Notes: 2019-02-20
      • Release Notes: 2019-03-06
      • Release Notes: 2019-03-19
      • Release Notes: 2019-04-02
      • Release Notes: 2019-04-30
      • Release Notes: 2019-05-14
      • Release Notes: 2019-05-30
      • Release Notes: 2019-06-11
      • Release Notes: 2019-07-23
      • Release Notes: 2019-08-06
      • Release Notes: 2019-08-20
      • Release Notes: 2019-09-03
      • Release Notes: 2019-09-17
      • Release Notes: 2019-10-03
      • Release Notes: 2019-10-15
      • Release Notes: 2019-10-29
      • Release Notes: 2019-11-12
      • Release Notes: 2019-11-26
      • Release Notes: 2019-12-10
    • 2018
      • Release Notes: 2018-01-10
      • Release Notes: 2018-01-17
      • Release Notes: 2018-01-31
      • Release Notes: 2018-02-14
      • Release Notes: 2018-03-07
      • Release Notes: 2018-03-14
      • Release Notes: 2018-03-28
      • Release Notes: 2018-04-11
      • Release Notes: 2018-04-25
      • Release Notes: 2018-05-09
      • Release Notes: 2018-05-23
      • Release Notes: 2018-06-06
      • Release Notes: 2018-06-20
      • Release Notes: 2018-07-03
      • Release Notes: 2018-07-18
      • Release Notes: 2018-08-01
      • Release Notes: 2018-08-15
      • Release Notes: 2018-08-29
      • Release Notes: 2018-09-12
      • Release Notes: 2018-09-26
      • Release Notes: 2018-10-10
      • Release Notes: 2018-10-23
      • Release Notes: 2018-11-13
      • Release Notes: 2018-11-27
      • Release Notes: 2018-12-18
    • 2017
      • Release Notes: 2017-01-04
      • Release Notes: 2017-01-18
      • Release Notes: 2017-02-01
      • Release Notes: 2017-02-16
      • Release Notes: 2017-03-02
      • Release Notes: 2017-03-15
      • Release Notes: 2017-03-29
      • Release Notes: 2017-04-12
      • Release Notes: 2017-04-26
      • Release Notes: 2017-05-10
      • Release Notes: 2017-05-24
      • Release Notes: 2017-06-06
      • Release Notes: 2017-06-21
      • Release Notes: 2017-07-07
      • Release Notes: 2017-07-19
      • Release Notes: 2017-08-02
      • Release Notes: 2017-08-16
      • Release Notes: 2017-08-30
      • Release Notes: 2017-09-13
      • Release Notes: 2017-09-27
      • Release Notes: 2017-10-12
      • Release Notes: 2017-10-25
      • Release Notes: 2017-11-08
      • Release Notes: 2017-11-29
      • Release Notes: 2017-12-13
    • 2016
      • Release Notes: 2016-01-06
      • Release Notes: 2016-01-20
      • Release Notes: 2016-02-03
      • Release Notes: 2016-02-17
      • Release Notes: 2016-03-02
      • Release Notes: 2016-03-16
      • Release Notes: 2016-03-30
      • Release Notes: 2016-04-13
      • Release Notes: 2016-04-27
      • Release Notes: 2016-05-11
      • Release Notes: 2016-05-25
      • Release Notes: 2016-06-08
      • Release Notes: 2016-06-22
      • Release Notes: 2016-07-06
      • Release Notes: 2016-07-20
      • Release Notes: 2016-08-03
      • Release Notes: 2016-08-17
      • Release Notes: 2016-08-31
      • Release Notes: 2016-09-14
      • Release Notes: 2016-09-28
      • Release Notes: 2016-10-12
      • Release Notes: 2016-10-26
      • Release Notes: 2016-11-09
      • Release Notes: 2016-11-23
      • Release Notes: 2016-12-07
      • Release Notes: 2016-12-21
    • 2015
      • Release Notes: 2015-01-07
      • Release Notes: 2015-01-21
      • Release Notes: 2015-02-04
      • Release Notes: 2015-02-18
      • Release Notes: 2015-03-04
      • Release Notes: 2015-04-01
      • Release Notes: 2015-04-15
      • Release Notes: 2015-04-29
      • Release Notes: 2015-05-13
      • Release Notes: 2015-05-27
      • Release Notes: 2015-06-10
      • Release Notes: 2015-06-24
      • Release Notes: 2015-07-08
      • Release Notes: 2015-07-22
      • Release Notes: 2015-08-05
      • Release Notes: 2015-08-19
      • Release Notes: 2015-09-16
      • Release Notes: 2015-09-30
      • Release Notes: 2015-10-14
      • Release Notes: 2015-10-28
      • Release Notes: 2015-11-11
      • Release Notes: 2015-12-02
      • Release Notes: 2015-12-16
    • 2014
      • Release Notes: 2014-01-09
      • Release Notes: 2014-01-22
      • Release Notes: 2014-02-05
      • Release Notes: 2014-03-05
      • Release Notes: 2014-03-19
      • Release Notes: 2014-04-09
      • Release Notes: 2014-04-30
      • Release Notes: 2014-06-04
      • Release Notes: 2014-06-11
      • Release Notes: 2014-06-26
      • Release Notes: 2014-07-09
      • Release Notes: 2014-07-23
      • Release Notes: 2014-08-20
      • Release Notes: 2014-09-04
      • Release Notes: 2014-09-17
      • Release Notes: 2014-10-01
      • Release Notes: 2014-10-15
      • Release Notes: 2014-10-29
      • Release Notes: 2014-11-12
    • 2013
      • Release Notes: 2013-01-08
      • Release Notes: 2013-02-27
      • Release Notes: 2013-03-20
      • Release Notes: 2013-04-02
      • Release Notes: 2013-04-17
      • Release Notes: 2013-05-01
      • Release Notes: 2013-05-21
      • Release Notes: 2013-06-11
      • Release Notes: 2013-06-18
      • Release Notes: 2013-07-10
      • Release Notes: 2013-07-24
      • Release Notes: 2013-08-07
      • Release Notes: 2013-09-05
      • Release Notes: 2013-09-18
      • Release Notes: 2013-10-02
      • Release Notes: 2013-10-30
      • Release Notes: 2013-11-13
      • Release Notes: 2013-11-27
    • 2012
      • Release Notes: 2012-03-28
      • Release Notes: 2012-04-11
      • Release Notes: 2012-04-24
      • Release Notes: 2012-05-22
      • Release Notes: 2012-06-05
      • Release Notes: 2012-06-20
      • Release Notes: 2012-08-01
      • Release Notes: 2012-08-28
On this page
  • Importing node-fetch
  • Making a Request
  • Example POST Request
  • Arbitrary HTTP Request
  • Working with a Returned Promise
  • Example GET Request for a Promise
  • Advanced Examples
  • Example: GET Request with Authentication
  • Example: Multiple GET Requests
  • Example: Chained GET Requests with Authentication
  • Proxy Support for API Monitoring
  • Example: Proxies with Custom Configuration
  • Example: Trusting Arbitrary Certificates
  • Example: Disable SSL Verification
  • Example: Proxy With Custom SSL Certificate
  • Example: Proxy With SSL Disabled
  • Example: Proxy With Test Configuration
  • Example: Using Client Certificates
  1. Product Documentation
  2. Browser Synthetics
  3. Transaction Tests
  4. Use Cases | Code Examples
  5. Include API Calls in a Transaction Test

Using the node-fetch module

PreviousInclude API Calls in a Transaction TestNextUsing the net module

Last updated 1 year ago

The node-fetch module is vitally useful in your transaction script for creating HTTP requests. Transaction test scripts can use node-fetch to make requests against one or more HTTP API endpoints, and to chain data from one call to the next.

node-fetch is maintained and distributed by at . As such, you should always look there for authoritative information on usage and implementation.

This article describes some basic uses of node-fetch in ThousandEyes transaction scripts.

If you need to run a test that solely consists of API calls, and don’t need to emulate a user journey in a browser, use the .

Importing node-fetch

To use the node-fetch module, make sure to first import it within your transaction script:

import fetch from 'node-fetch';

Making a Request

To make a request, use the fetch function:

await fetch('<url>');
    <options>

The fetch function takes the following parameters:

  • url

    A string representing the URL that will receive the request.

  • options

    A JavaScript object that contains request parameters. For information on defaults, see . This parameter can be used to specify HTTP method, custom headers, timeout, and other settings.

Example POST Request

In the following example, you make a POST request and include a custom header:

await fetch('https://example.com', 
    {
    method: 'POST', 
    headers: {'X-Custom-Header': 'Value-Here'}
    }
)

Arbitrary HTTP Request

You can use fetch() to make arbitrary HTTP requests in transaction scripts. Here is an example using fetch() to pull a webpage that requires Basic authentication (username and password are both "admin").

import { By, Key, until } from 'selenium-webdriver';
import { driver, markers, credentials, downloads, transaction, authentication } from 'thousandeyes';
import fetch from 'node-fetch';
runScript();
 
async function runScript() {
 
    var b = new Buffer("admin:admin");
    var s = b.toString("base64");
     
    var requestBody = {
        method: 'GET',
        headers: {
            'Authorization': 'Basic '+s,
        }
    }
    markers.start('FetchTime');
    const response = await fetch('http://the-internet.herokuapp.com/basic_auth', requestBody);     
    const pageText = await response.text();
    if (!response.ok) {
        throw new Error('non-200 response');
    }
    markers.stop('FetchTime');
 
};

You can also pass different headers or use OAuth, although that is not shown in the example above.

fetch, net, and tls on Enterprise Agents

Cloud Agents have no known problems running the above script for arbitrary HTTP request, but if you run it on an Enterprise Agent, you might see that the transaction is timing out. In the event of a transaction timeout, you can find the following line in /var/log/te-sandboxd/te-sandboxd.log:

WARNING: IPv4 forwarding is disabled. Networking to destinations outside of the agent will not work.

Just because you see this message, doesn't mean you need to perform the following procedure. The following is intended to enable the use of node-fetch, net, and tls. If you are not using any of these, this warning may still appear, but it has no known impact.

In order to run this example script properly, ThousandEyes Enterprise Agents need to be configured to allow IPv4 forwarding. For TEVAs and Ubuntu packages, you'll need to edit /etc/sysctl.conf as follows:

This procedure involves system-level changes that require sudo.

sudo nano /etc/sysctl.conf

Uncomment the existing line, or add a line at the end that says:

net.ipv4.ip_forward=1

Save the changes and then tell sysctl to reload its settings:

sudo sysctl -p

That's it! Your tests should fetch() properly now.

Working with a Returned Promise

To access the details of this response, use the await keyword before the fetch call, so that the promise can reach the fulfilled state:

let resp = await fetch('https://example.com');

console.log(resp.status);  // HTTP Status Code
console.log(resp.headers.raw());  // HTTP Headers
console.log(await resp.text());	// HTTP Response Body

Example GET Request for a Promise

In the following example, notice that first the fetch function from the node-fetch module is imported. Then, when fetch is called, it is preceded by await so that the promise can reach the fulfilled state:

// fetch tx2.0
import fetch from 'node-fetch';
import assert from 'assert';

runScript();

async function runScript() {
   let target = 'http://beta.the-acme-corporation.com';

   let resp = await fetch(target, {method:'GET', headers: {'User-Agent': 'thousandeyes-transaction'}});

   let resp_text = await resp.text()
   assert(resp_text.includes('Welcome'), 'Did not find welcome text in response');
   if(resp.status != 200){
       throw Error('Non-200 response: ' + resp.status)
   }
  
};

Advanced Examples

Example: GET Request with Authentication

In the following example, notice that the script first defines requestOptions for basic authentication; then fetches the token from the response:

import {markers, credentials} from 'thousandeyes';
import fetch from 'node-fetch';
runScript();

async function runScript() {
   const username = credentials.get('Peter Parker Username');
   const token = credentials.get('Peter Parker Password');
   var buffer = new Buffer(username+':'+token);
   var apiToken = buffer.toString("base64");

   var requestOptions = {
      method: 'GET',
      headers: {
          'Authorization': 'Basic '+apiToken
      }
   }

   markers.start('FetchTime');
   const response = await fetch('https://api.thousandeyes.com/v6/agents.json?agentTypes=CLOUD', requestOptions);
   const responseText = await response.text();
   if (!response.ok) {
      await console.log(responseText);
      throw new Error('non-200 response');
   }
   markers.stop('FetchTime');
};

Example: Multiple GET Requests

In the following example, the first fetch request fetches a list of users; the second request fetches the activity log:

markers.start('Fetch User List');
let response = await fetch('https://api.thousandeyes.com/v6/users.json', requestBody);
let responseText = await response.json();
if (!response.ok) {
    await console.log(responseText);
    throw new Error('non-200 response while fetching User List');
}
markers.stop('Fetch User List');

markers.start('Fetch Activity Log');
response = await fetch('https://api.thousandeyes.com/v6/audit/user-events/search.json', requestBody);
responseText = await response.json();
if (!response.ok) {
    await console.log(responseText);
    throw new Error('non-200 response while fetching Activity Log');
}
markers.stop('Fetch Activity Log');

Example: Chained GET Requests with Authentication

In the following example, you find the list of agents assigned to a particular test; then extract the details for these agents:

let response = await fetch(`https://api.thousandeyes.com/v6/tests/${TEST_ID}.json`, requestBody);
let responseText = await response.json();
if (!response.ok) {
    throw new Error('non-200 response while fetching Test details');
}

// Extract list of agents assigned to the given test
let test_agents = responseText['test'][0]['agents'];
let agent_details_promises = []

// Get details for individual Agents
for(var agent of test_agents){
    markers.start('Agent Details ' + agent['agentId']);
    agent_details_promises.push(fetch(`https://api.thousandeyes.com/v6/agents/${agent['agentId']}.json`, requestBody).then((value) => {
        markers.stop('Agent Details ' + agent['agentId']);
        return value;
    }));
}

// Wait for all agent detail requests to complete
let agent_details = await Promise.all(agent_details_promises);

// Handle the response
for(var agent_detail_response of agent_details){
    let agent_json = await agent_detail_response.json();
    agent_json = agent_json['agents'][0]
}

Proxy Support for API Monitoring

You can make API requests through a proxy by using fetch() and an HTTP proxy agent. This approach supports:

  • Configuring proxy settings for fetch() calls to auto-detect and apply transaction test settings

  • Trusting arbitrary certification chains

  • Tunneling connections through an arbitrary static proxy that might be using a self-signed certificate (e.g., for a decrypting TLS proxy)

  • Tunneling connections through a proxy determined by a PAC script

Supporting custom certificate chains is needed in instances where you need to run a fetch() command targeting a host for which a certificate was manually installed. For a custom certificate chain, copy the X509 of the certificate into your transaction script body.

Read the script comments carefully. These script examples use fake endpoints and fake certificates. Be sure to replace the placeholder values with real ones.

Example: Proxies with Custom Configuration

This ThousandEyes transaction script uses proxies with a custom configuration to call the endpoint with a self-signed certificate:

//
// ThousandEyes Transaction script which uses proxies with custom configuration
//
import {markers, fetchAgent } from 'thousandeyes';
import fetch from 'node-fetch';
import assert from 'assert';

runScript();

async function runScript() {
    // HTTP proxy
    markers.start('HTTP Proxy');
    // custom proxy settings
    const httpProxySettings = {
        host: 'proxy-host.com',
        port: 3333,
        proxyAuth: {
            username: 'username',
            password: 'password'
        }
    };
    // get a HTTP proxy agent
    const httpProxyAgent = fetchAgent.getHttpProxyAgent(httpProxySettings)
    // set the agent in the request options
    const httpProxyRequestOptions = {
        agent: httpProxyAgent,
    };
    // call the endpoint with a self signed certificate 
    // NOTE: this is a fake endpoint make sure to replace with a real one
    const response1 = await fetch('http://some-website.com', httpProxyRequestOptions);
    // verify that response status is 200
    assert.equal(200, response1.status);
    markers.end('HTTP Proxy');

    // HTTPS proxy
    markers.start('HTTPS Proxy');
    // custom proxy settings
    const httpsProxySettings = {
        host: 'ssl-proxy-host.com',
        port: 3333,
        proxyAuth: {
            username: 'username',
            password: 'password'
        }
    };
    // get a HTTPS proxy agent
    const httpsProxyAgent = fetchAgent.getHttpsProxyAgent(httpsProxySettings)
    // set the agent in the request options
    const httpsProxyRequestOptions = {
        agent: httpsProxyAgent,
    };
    // call the endpoint with a self signed certificate 
    // NOTE: this is a fake endpoint make sure to replace with a real one
    const response2 = await fetch('https://some-website.com', httpsProxyRequestOptions);
    // verify that response status is 200
    assert.equal(200, response2.status);
    markers.end('HTTPS Proxy');

    // PAC proxy
    markers.start('PAC Proxy');
    // custom proxy settings
    const pacProxySettings = {
        pacScriptUrl: 'http://pac-script-location.com',
        proxyAuth: {
            username: 'username',
            password: 'password'
        }
    };
    // get a PAC proxy agent
    const pacProxyAgent = fetchAgent.getPACProxyAgent(pacProxySettings)
    // set the agent in the request options
    const pacProxyRequestOptions = {
        agent: pacProxyAgent,
    };
    // call the endpoint with a self signed certificate 
    // NOTE: this is a fake endpoint make sure to replace with a real one
    const response3 = await fetch('https://some-website.com', pacProxyRequestOptions);
    // verify that response status is 200
    assert.equal(200, response3.status);
    markers.end('PAC Proxy');
};

Example: Trusting Arbitrary Certificates

This ThousandEyes Transaction script calls the endpoint with a self signed certificate:

//
// ThousandEyes Transaction script which trusts arbitrary certificates
//
import fetch from 'node-fetch';
import { fetchAgent } from 'thousandeyes';
import assert from 'assert';

runCode();

async function runCode() {
    // X509 of the certificate
    // NOTE: these are fake certificates make sure to replace with real ones
    const cert1 = `-----BEGIN CERTIFICATE-----
self signed certificate
-----END CERTIFICATE-----
`;

    const cert2 = `-----BEGIN CERTIFICATE-----
self signed certificate
-----END CERTIFICATE-----
`;
    // SSL options with custom certificates
    const sslOptions = { customCA: [cert1, cert2] };
    // get a fetch agent with custom certificates
    const agent = fetchAgent.getHttpsAgent(sslOptions);

    // set the agent in the request options
    const requestOptions = {
        agent: agent,
    };

    // call the endpoint with a self signed certificate 
    // NOTE: this is a fake endpoint make sure to replace with a real one
    const response = await fetch('https://some-website-with-a-self-signed-cert.com', requestOptions);

    //verify that response status is 200
    assert.equal(200, response.status);
}

Example: Disable SSL Verification

This example uses a custom HTTPS agent with SSL verification disabled to call the endpoint with a self-signed certificate:

//
// ThousandEyes Transaction script which disables ssl verification
//
import fetch from 'node-fetch';
import { fetchAgent } from 'thousandeyes';
import assert from 'assert';

runCode();

async function runCode() {

    // SSL options with verification disabled certificates
    const sslOptions = { verifySSLCertificate: false };
    // get a HTTPS agent with ssl verification disabled
    const agent = fetchAgent.getHttpsAgent(sslOptions);

    // set the agent in the request options
    const requestOptions = {
        agent: agent,
    };

    // call the endpoint with a self signed certificate 
    // NOTE: this is a fake endpoint make sure to replace with a real one
    const response = await fetch('https://some-website-with-a-self-signde-cert.com', requestOptions);

    //verify that response status is 200
    assert.equal(200, response.status);
}

Example: Proxy With Custom SSL Certificate

This example uses a proxy and a custom SSL certificate.

//
// ThousandEyes Transaction script which uses a proxy and a custom SSL certificate.
//
import { fetchAgent, test } from 'thousandeyes';
import fetch from 'node-fetch';
import assert from 'assert';

runScript();

async function runScript() {
    // X509 of the certificate
    // NOTE: this is a fake certificate make sure to replace with a real one
    const cert = `-----BEGIN CERTIFICATE-----
self signed certificate
-----END CERTIFICATE-----
`;
    // SSL options with custom certificates
    const sslOptions = { customCA: [cert] };
    // test proxy settings
    const httpsProxySettings = test.getSettings().proxy;

    // get a HTTPS proxy agent
    // NOTE: this works with getHttpProxyAgent and getPACProxyAgent too.
    const httpsProxyAgent = fetchAgent.getHttpsProxyAgent(httpsProxySettings, sslOptions);
    // set the agent in the request options
    const httpsProxyRequestOptions = {
        agent: httpsProxyAgent,
    };
    // call the endpoint with a self signed certificate 
    // NOTE: this is a fake endpoint make sure to replace with a real one
    const response2 = await fetch('https://some-website.com', httpsProxyRequestOptions);
    // verify that response status is 200
    assert.equal(200, response2.status);
};

Example: Proxy With SSL Disabled

This example uses a proxy with SSL disabled:

//
// ThousandEyes Transaction script which uses a proxy and a custom SSL certificate.
//
import { fetchAgent, test } from 'thousandeyes';
import fetch from 'node-fetch';
import assert from 'assert';

runScript();

async function runScript() {
    // SSL options with verification disabled certificates
    const sslOptions = { verifySSLCertificate: false };
    // test proxy settings
    const httpsProxySettings = test.getSettings().proxy;

    // get a HTTPS proxy agent
    // NOTE: this works with getHttpProxyAgent and getPACProxyAgent too.
    const httpsProxyAgent = fetchAgent.getHttpsProxyAgent(httpsProxySettings, sslOptions);
    // set the agent in the request options
    const httpsProxyRequestOptions = {
        agent: httpsProxyAgent,
    };
    // call the endpoint with a self signed certificate 
    // NOTE: this is a fake endpoint make sure to replace with a real one
    const response2 = await fetch('https://some-website.com', httpsProxyRequestOptions);
    // verify that response status is 200
    assert.equal(200, response2.status);
};

Example: Proxy With Test Configuration

This example uses a proxy from the ThousandEyes test configuration:

//
// ThousandEyes Transaction script which uses proxies with configuration from the test config
//
import {markers, fetchAgent, test } from 'thousandeyes';
import fetch from 'node-fetch';
import assert from 'assert';

runScript();

async function runScript() {
    // HTTP proxy
    markers.start('HTTP Proxy');
    // test proxy settings
    const httpProxySettings = test.getSettings().proxy;
    // get a HTTP proxy agent
    const httpProxyAgent = fetchAgent.getHttpProxyAgent(httpProxySettings);
    // set the agent in the request options
    const httpProxyRequestOptions = {
        agent: httpProxyAgent,
    };
    // call the endpoint with a self signed certificate 
    // NOTE: this is a fake endpoint make sure to replace with a real one
    const response1 = await fetch('http://some-website.com', httpProxyRequestOptions);
    // verify that response status is 200
    assert.equal(200, response1.status);
    markers.end('HTTP Proxy');

    // HTTPS proxy
    markers.start('HTTPS Proxy');
    // test proxy settings
    const httpsProxySettings = test.getSettings().proxy;
    // get an HTTPS proxy agent
    const httpsProxyAgent = fetchAgent.getHttpsProxyAgent(httpsProxySettings);
    // set the agent in the request options
    const httpsProxyRequestOptions = {
        agent: httpsProxyAgent,
    };
    // call the endpoint with a self signed certificate 
    // NOTE: this is a fake endpoint; make sure to replace with a real one
    const response2 = await fetch('https://some-website.com', httpsProxyRequestOptions);
    // verify that response status is 200
    assert.equal(200, response2.status);
    markers.end('HTTPS Proxy');

    // PAC proxy
    markers.start('PAC Proxy');
    // test proxy settings
    const pacProxySettings = test.getSettings().proxy;
    // get a PAC proxy agent
    const pacProxyAgent = fetchAgent.getPACProxyAgent(pacProxySettings);
    // set the agent in the request options
    const pacProxyRequestOptions = {
        agent: pacProxyAgent,
    };
    // call the endpoint with a self signed certificate 
    // NOTE: this is a fake endpoint; make sure to replace with a real one
    const response3 = await fetch('https://some-website.com', pacProxyRequestOptions);
    // verify that response status is 200
    assert.equal(200, response3.status);
    markers.end('PAC Proxy');
};

Example: Using Client Certificates

This example shows a transaction test script that uses client certificates:

//
// ThousandEyes Transaction script which uses client certificates authentication
//
import fetch from 'node-fetch';
import { fetchAgent } from 'thousandeyes';
import assert from 'assert';

runCode();

async function runCode() {
    // X509 of the certificate
    // NOTE: these are fake certificates make sure to replace with real ones
    const key = `-----BEGIN CERTIFICATE-----
self signed certificate
-----END CERTIFICATE-----
`;

    const clientCert = `-----BEGIN CERTIFICATE-----
self signed certificate
-----END CERTIFICATE-----
`;
    const passphrase = '';

    // SSL options with client certificate, key and passphrase
    const sslOptions = { key: key, cert: clientCert, passphrase: passphrase };
    // get a fetch agent
    const agent = fetchAgent.getHttpsAgent(sslOptions);

    // set the agent in the request options
    const requestOptions = {
        agent: agent,
    };

    // call the endpoint
    // NOTE: this is a fake endpoint make sure to replace with a real one
    const response = await fetch('https://some-website.com', requestOptions);

    //verify that response status is 200
    assert.equal(200, response.status);
}

If you follow , you don’t need to explicitly enable IPv4 forwarding as described above, for Enterprise Agents running in Docker containers.

The fetch function returns a .

The fulfilled promise is a instance, which has attributes and methods to read the response details:

For additional examples, see the .

The following examples are from the API transaction scripts folder of the ThousandEyes .

npm
https://www.npmjs.com/package/node-fetch
API Test Type
the npm documentation
Enterprise Agent Deployment Using Docker
JavaScript promise
Response
public repository of ThousandEyes transaction scripts
transaction scripting repository