ThousandEyes Integration with Splunk Observability Cloud
90 minutesAuthor
Alec Chamberlain
This workshop demonstrates integrating ThousandEyes with Splunk Observability Cloud to provide unified visibility across your synthetic monitoring and observability data.
What You’ll Learn
By the end of this workshop, you will:
Deploy a ThousandEyes Enterprise Agent as a containerized workload in Kubernetes
Integrate ThousandEyes metrics with Splunk Observability Cloud using OpenTelemetry
Create synthetic tests for internal Kubernetes services and external dependencies
Monitor test results in Splunk Observability Cloud dashboards
Correlate synthetic test data with APM traces and infrastructure metrics
Sections
Overview - Understand ThousandEyes agent types and architecture
Deployment - Deploy the Enterprise Agent in Kubernetes
This integration enables you to correlate synthetic test results with real user monitoring (RUM), APM traces, and infrastructure metrics for comprehensive root cause analysis.
Prerequisites
A Kubernetes cluster (v1.16+)
RBAC permissions to deploy resources in your chosen namespace
A ThousandEyes account with access to Enterprise Agent tokens
A Splunk Observability Cloud account with ingest token access
Benefits of Integration
By connecting ThousandEyes to Splunk Observability Cloud, you gain:
🔗 Unified visibility: Correlate synthetic test results with RUM, APM traces, and infrastructure metrics
📊 Enhanced dashboards: Visualize ThousandEyes data alongside your existing Splunk observability metrics
🚨 Centralized alerting: Configure alerts based on ThousandEyes test results within Splunk
🔍 Root cause analysis: Quickly identify if issues are network-related (ThousandEyes) or application-related (APM)
Metrics: Real-time visualization of ThousandEyes data
Dashboards: Pre-built ThousandEyes dashboard with unified views
APM/RUM Integration: Correlate synthetic tests with application traces and real user monitoring
Alerting: Centralized alert management with correlation rules
6. Data Flow
Agent authenticates using token from Kubernetes Secret
Agent runs scheduled tests against internal and external targets
Test results sent to ThousandEyes Cloud
ThousandEyes streams metrics to Splunk via OpenTelemetry protocol
Splunk ingests, processes, and visualizes data in dashboards
DevOps/SRE teams monitor dashboards and respond to alerts
Testing Capabilities
With this deployment, you can:
✅ Test internal services: Monitor Kubernetes services, APIs, and microservices from within the cluster
✅ Test external dependencies: Validate connectivity to payment gateways, third-party APIs, and SaaS platforms
✅ Measure performance: Capture latency, availability, and performance metrics from your cluster’s perspective
✅ Troubleshoot issues: Identify whether problems originate from your infrastructure or external dependencies
Note
This is not an officially supported ThousandEyes agent deployment configuration. However, it has been tested and works very well in production-like environments.
Deployment
This section guides you through deploying the ThousandEyes Enterprise Agent in your Kubernetes cluster.
Components
The deployment consists of two files:
1. Secrets File (credentialsSecret.yaml)
Contains your ThousandEyes agent token (base64 encoded). This secret is referenced by the deployment to authenticate the agent with ThousandEyes Cloud.
Create a file named thousandEyesDeploy.yaml with the deployment manifest shown above (customize the hostname and namespace as needed).
Apply the deployment:
kubectl apply -f thousandEyesDeploy.yaml
Step 5: Verify the Deployment
Verify the agent is running:
kubectl get pods -n te-demo
Expected output:
NAME READY STATUS RESTARTS AGE
thousandeyes-xxxxxxxxxx-xxxxx 1/1 Running 0 2m
Check the logs to ensure the agent is connecting:
kubectl logs -n te-demo -l app=thousandeyes
Step 6: Verify in ThousandEyes Dashboard
Verify in the ThousandEyes dashboard that the agent has registered successfully:
Navigate to Cloud & Enterprise Agents > Agent Settings to see your newly registered agent.
Success
Your ThousandEyes Enterprise Agent is now running in Kubernetes! Next, we’ll integrate it with Splunk Observability Cloud.
Background
ThousandEyes does not provide official Kubernetes deployment documentation. Their standard deployment method uses docker run commands, which makes it challenging to translate into reusable Kubernetes manifests. This guide bridges that gap by providing production-ready Kubernetes configurations.
Splunk Integration
About Splunk Observability Cloud
Splunk Observability Cloud is a real-time observability platform purpose-built for monitoring metrics, traces, and logs at scale. It ingests OpenTelemetry data and provides advanced dashboards and analytics to help teams detect and resolve performance issues quickly. This section explains how to integrate ThousandEyes data with Splunk Observability Cloud using OpenTelemetry.
Step 1: Create a Splunk Observability Cloud Access Token
To send data to Splunk Observability Cloud, you need an access token. Follow these steps:
In the Splunk Observability Cloud platform, go to Settings > Access Token
Click Create Token
Enter a Name
Select Ingest scope
Select Create to generate your access token
Copy the access token and store it securely
You need the access token to send telemetry data to Splunk Observability Cloud.
Step 2: Create an Integration
Using the ThousandEyes UI
To integrate Splunk Observability Cloud with ThousandEyes:
Log in to your account on the ThousandEyes platform and go to Manage > Integration > Integration 1.0
Click New Integration and select OpenTelemetry Integration
Enter a Name for the integration
Set the Target to HTTP
Enter the Endpoint URL: https://ingest.{REALM}.signalfx.com/v2/datapoint/otlp
Replace {REALM} with your Splunk environment (e.g., us1, eu0)
For Preset Configuration, select Splunk Observability Cloud
For Auth Type, select Custom
Add the following Custom Headers:
X-SF-Token: {TOKEN} (Enter your Splunk Observability Cloud access token created in Step 1)
Content-Type: application/x-protobuf
For OpenTelemetry Signal, select Metric
For Data Model Version, select v2
Select a test
Click Save to complete the integration setup
You have now successfully integrated your ThousandEyes data with Splunk Observability Cloud.
Using the ThousandEyes API
For a programmatic integration, use the following API commands:
Replace streamEndpointUrl and X-SF-Token values with the correct values for your Splunk Observability Cloud instance.
Note
Make sure to replace {REALM} with your Splunk environment realm (e.g., us1, us2, eu0) and {TOKEN} with your actual Splunk access token.
Step 3: ThousandEyes Dashboard in Splunk Observability Cloud
Once the integration is set up, you can view real-time monitoring data in the ThousandEyes Network Monitoring Dashboard within Splunk Observability Cloud. The dashboard includes:
HTTP Server Availability (%): Displays the availability of monitored HTTP servers
HTTP Throughput (bytes/s): Shows the data transfer rate over time
Client Request Duration (seconds): Measures the latency of client requests
Web Page Load Completion (%): Indicates the percentage of successful page loads
Page Load Duration (seconds): Displays the time taken to load pages
Your ThousandEyes data is now streaming to Splunk Observability Cloud! You can now correlate synthetic test results with APM traces and infrastructure metrics for comprehensive observability.
Kubernetes Service Testing
Replicating AppDynamics Test Recommendations
AppDynamics offers a feature called “Test Recommendations” that automatically suggests synthetic tests for your application endpoints. With ThousandEyes deployed inside your Kubernetes cluster, you can replicate this capability by leveraging Kubernetes service discovery combined with Splunk Observability Cloud’s unified view.
Since the ThousandEyes Enterprise Agent runs inside the cluster, it can directly test internal Kubernetes services using their service names as hostnames. This provides a powerful way to monitor backend services that may not be exposed externally.
How It Works
Service Discovery: Use kubectl get svc to enumerate services in your cluster
Hostname Construction: Build test URLs using Kubernetes DNS naming convention: <service-name>.<namespace>.svc.cluster.local
Test Creation: Configure ThousandEyes HTTP Server tests targeting these internal services
Correlation in Splunk: View synthetic test results alongside APM traces and infrastructure metrics
Benefits of In-Cluster Testing
Internal Service Monitoring: Test backend services not exposed to the internet
Service Mesh Awareness: Monitor services behind Istio, Linkerd, or other service meshes
DNS Resolution Testing: Validate Kubernetes DNS and service discovery
Network Policy Validation: Ensure network policies allow proper communication
Pre-Production Testing: Test services before exposing them via Ingress/LoadBalancer
Step-by-Step Guide
1. Discover Kubernetes Services
List all services in your cluster or a specific namespace:
# Get all services in all namespaceskubectl get svc --all-namespaces
# Get services in a specific namespacekubectl get svc -n production
# Get services with detailed output including portskubectl get svc -n production -o wide
Example output:
NAMESPACE NAME TYPE CLUSTER-IP PORT(S) AGE
production api-gateway ClusterIP 10.96.100.50 8080/TCP 5d
production payment-svc ClusterIP 10.96.100.51 8080/TCP 5d
production auth-service ClusterIP 10.96.100.52 9000/TCP 5d
production postgres ClusterIP 10.96.100.53 5432/TCP 5d
2. Build Test Hostnames
Kubernetes services are accessible via DNS using the following naming pattern:
<service-name>.<namespace>.svc.cluster.local
For the services above:
api-gateway.production.svc.cluster.local:8080
payment-svc.production.svc.cluster.local:8080
auth-service.production.svc.cluster.local:9000
Shorthand within the same namespace:
If testing services in the same namespace as the ThousandEyes agent, you can use just the service name:
api-gateway:8080
payment-svc:8080
3. Create ThousandEyes Tests for Internal Services
For each service endpoint, create an HTTP Server test in ThousandEyes:
Via ThousandEyes UI
Navigate to Cloud & Enterprise Agents > Test Settings
While ThousandEyes is primarily for HTTP testing, you can test database proxies:
# Test PgBouncer or database HTTP management interfaceshttp://pgbouncer.production.svc.cluster.local:8080/stats
http://redis-exporter.production.svc.cluster.local:9121/metrics
Use Case 4: External Service Dependencies
One of the most valuable capabilities of the in-cluster ThousandEyes agent is monitoring your application’s external dependencies from the same network perspective as your services. This helps identify whether issues originate from your infrastructure, network path, or the external service itself.
Testing Payment Gateways
Create tests for critical payment gateway endpoints to ensure availability and performance:
Stripe API:
# Via ThousandEyes UITest Name: [External] Stripe API Health
URL: https://api.stripe.com/healthcheck
Interval: 2 minutes
Agents: Your Kubernetes Enterprise Agent
Expected Response: 200
PayPal API:
Test Name: [External] PayPal API Health
URL: https://api.paypal.com/v1/notifications/webhooks
Interval: 2 minutes
Agents: Your Kubernetes Enterprise Agent
Expected Response: 401(authentication required, but endpoint is reachable)
Cloud Storage: AWS S3, Google Cloud Storage, Azure Blob Storage
Third-Party APIs: Any critical business partner APIs
Best Practice
Use the [External] prefix in test names to easily distinguish between internal Kubernetes services and external dependencies in your dashboards.
Best Practices
Use Consistent Naming: Prefix test names with [K8s] or [Internal] for easy filtering
Test Health Endpoints First: Start with /health or /readiness endpoints before testing business logic
Set Appropriate Intervals: Use shorter intervals (1-2 minutes) for critical services
Tag Tests: Use ThousandEyes labels/tags to group tests by:
Environment (dev, staging, production)
Service type (API, database, cache)
Team ownership
Monitor Test Agent Health: Ensure the ThousandEyes agent pod is healthy and has sufficient resources
Correlate with APM: Create Splunk dashboards that show both synthetic and real user metrics side-by-side
Tip
By testing internal services before they’re exposed externally, you can catch issues early and ensure your infrastructure is healthy before user traffic reaches it.
Troubleshooting
This section covers common issues you may encounter when deploying and using the ThousandEyes Enterprise Agent in Kubernetes.
Test Failing with DNS Resolution Error
If your tests are failing with DNS resolution errors, verify DNS from within the ThousandEyes pod:
# Verify DNS resolution from within the podkubectl exec -n te-demo -it <pod-name> -- nslookup api-gateway.production.svc.cluster.local
# Check CoreDNS logskubectl logs -n kube-system -l k8s-app=kube-dns
Common causes:
Service doesn’t exist in the specified namespace
Typo in the service name or namespace
CoreDNS is not functioning properly
Connection Refused Errors
If you’re seeing connection refused errors, check the following:
# Verify service endpoints existkubectl get endpoints -n production api-gateway
# Check if pods are readykubectl get pods -n production -l app=api-gateway
# Test connectivity from agent podkubectl exec -n te-demo -it <pod-name> -- curl -v http://api-gateway.production.svc.cluster.local:8080/health
Common causes:
No pods backing the service (endpoints are empty)
Pods are not in Ready state
Wrong port specified in the test URL
Service selector doesn’t match pod labels
Network Policy Blocking Traffic
If network policies are blocking traffic from the ThousandEyes agent:
# List network policieskubectl get networkpolicies -n production
# Describe network policykubectl describe networkpolicy <policy-name> -n production
Solution:
Create a network policy to allow traffic from the te-demo namespace to your services:
If the ThousandEyes agent pod is not starting, check the pod status and events:
# Get pod statuskubectl get pods -n te-demo
# Describe pod to see eventskubectl describe pod -n te-demo <pod-name>
# Check logskubectl logs -n te-demo <pod-name>
Common causes:
Insufficient resources (memory/CPU)
Invalid or missing TEAGENT_ACCOUNT_TOKEN secret
Security context capabilities not allowed by Pod Security Policy
Image pull errors
Solutions:
Increase memory limits if OOMKilled
Verify secret is created correctly: kubectl get secret te-creds -n te-demo -o yaml
Check Pod Security Policy allows NET_ADMIN and SYS_ADMIN capabilities
Verify image pull: kubectl describe pod -n te-demo <pod-name>
Agent Not Appearing in ThousandEyes Dashboard
If the agent is running but not appearing in the ThousandEyes dashboard:
Some Kubernetes clusters with strict Pod Security Policies may not allow these capabilities. You may need to work with your cluster administrators to create an appropriate policy exception.
Getting Help
If you encounter issues not covered in this guide: