Splunk Observability ThousandEyes Integration
Prerequisites
| Tool or access |
Purpose |
Verify |
| Bash and Python 3 |
Run bundled setup and validation helpers |
bash --version && python3 --version |
| Required product/platform access |
Inspect or configure the selected target |
Complete the documented preflight |
| Credential files for live modes |
Keep secrets out of chat |
Verify paths only |
Workflow Overview
┌───────────┐ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐
│ Preflight │ → │ Render/review │ → │ Apply/handoff │ → │ Validate evidence │
└───────────┘ └───────────────┘ └───────────────┘ └─────────────────┘
When to Activate
- Wire ThousandEyes telemetry into Splunk Observability Cloud, configure Integrations 2.0 APM trace linking, manage
TE tests/alert rules/templates for an O11y integration, or produce the per-test-type O11y dashboards.
- Preview and review the splunk observability thousandeyes integration workflow before any live apply phase.
- Diagnose failed prerequisites, generated assets, configuration, or validation evidence.
Scope
Follow the documented read-only or render-first path whenever it is available.
This skill does not imply permission to mutate live systems. Require explicit
apply flags, protected credentials, and operator review for state changes.
Examples
Inspect the supported setup modes before selecting one:
bash skills/splunk-observability-thousandeyes-integration/scripts/setup.sh --help
Expected output: usage, supported modes, and required arguments are displayed
without changing the target environment.
Inspect validation modes before running completion checks:
bash skills/splunk-observability-thousandeyes-integration/scripts/validate.sh --help
Expected output: offline, live, and completion options are displayed when the
skill supports them; help exits without mutation.
Troubleshooting
| Issue |
Cause |
Resolution |
| Preflight fails |
A required tool or access path is missing |
Resolve it before rendering or applying |
| Rendered assets are incomplete |
Required non-secret inputs are absent |
Complete intake and render again |
| Apply is blocked |
Review, credentials, or explicit acceptance is missing |
Use the documented handoff |
| Validation is incomplete |
Live evidence is unavailable |
Record the gap and keep completion open |
This is a generalized TE -> Splunk Observability Cloud skill, NOT tied to any one demo. A private RTSP/UDP/RTP demo repo was used during initial development to validate the TE Streams API + Integrations 2.0 mechanics; that demo's test taxonomy is demo-specific and is NOT carried into this skill. Source of truth: the public ThousandEyes for OpenTelemetry Data Model v2 (docs.thousandeyes.com/.../opentelemetry/data-model/data-model-v2/metrics) and the TE API v7 schemas (developer.cisco.com/docs/thousandeyes/).
Three TE-side surfaces
- Integration 1.0 OpenTelemetry stream —
POST /v7/streams with type=opentelemetry, signal=metric|trace|log (default metric), endpointType=http|grpc, streamEndpointUrl=https://ingest.<realm>.signalfx.com/v2/datapoint/otlp, customHeaders.X-SF-Token, dataModelVersion=v2, testMatch[], optional filters.testTypes[].
- Integrations 2.0 Splunk Observability APM connector — generic connector targeting
https://api.<realm>.signalfx.com with X-SF-Token; assigned to the splunk-observability-apm operation for trace linking.
- TE assets — render across the canonical taxonomy, with apply limited to operations that have ID-based readback:
- Tests:
POST /v7/tests/{type} for http-server, page-load, web-transactions, api, agent-to-server, agent-to-agent, bgp, dns-server, dns-trace, dnssec, sip-server, voice, ftp-server.
- Alert Rules:
POST /v7/alerts/rules aligned with the SignalFlow detector specs we ship for O11y.
- Labels, Tags, and TE-side Dashboards are rendered for operator/API handoff; their generated apply scripts fail closed before mutation.
- TE Templates: verified
POST /v7/templates creation with
Handlebars-only credential placeholders. Deployment remains a TE UI
handoff because template-resource readback does not prove deploy
completion and cannot make an interrupted deploy POST retry-safe.
Out of scope (handed off)
For the Splunk TA or any dashboard-companion handoff, follow the shared TA completion gate: package installation alone is not completion; validate ingest and dashboard visibility, macro alignment, and data, or record evidence that no pre-built dashboard ships.
Safety Rules
- Never ask for the ThousandEyes API token, the Splunk Observability ingest token, or the Splunk Observability API token in conversation.
- Never pass any token on the command line or as an environment-variable prefix.
- Use file-based secret flags only:
--te-token-file for the TE bearer token (used for Streams, Tests, Alert Rules, Templates, Dashboards).
--o11y-ingest-token-file for the Splunk Observability Org access token with ingest authorization (used as X-SF-Token in the OTLP metric stream customHeaders).
--o11y-api-token-file for the Splunk Observability User API access token (used as X-SF-Token in the Integrations 2.0 APM connector and SignalFlow validate calls).
- Reject every direct token flag (
--te-token, --access-token, --token, --bearer-token, --api-token, --o11y-token, --sf-token).
- Token files must be single-link, non-symlink regular files containing exactly
one non-empty UTF-8 line and must be
chmod 600. Live validators open them
with no-follow descriptor checks. There is no permission bypass.
- TE Templates render with Handlebars placeholders only — TE API rejects plain-text credentials with HTTP 400.
- Apply scripts read token files at runtime through the fixed-origin HTTPS client; the renderer never reads token files. Every TE request is scoped with the rendered numeric
account_group_id as ?aid=.
Primary Workflow
Collect non-secret values: realm (us0/us1/eu0/...), account group ID, list of TE test IDs or test types to include, optional alert rules / labels / tags / dashboards / templates.
Create or update a YAML/JSON spec from template.example. Spec supports test selection via:
- explicit
test_match[] (list of {id, domain: cea|endpoint}),
filters.test_types[] (any of the canonical TE OTel v2 types),
- or
mode: all (stream every enabled test).
Render and validate:
bash skills/splunk-observability-thousandeyes-integration/scripts/setup.sh \
--render \
--validate \
--spec skills/splunk-observability-thousandeyes-integration/template.example \
--output-dir splunk-observability-thousandeyes-rendered
Review splunk-observability-thousandeyes-rendered/:
.splunk-observability-thousandeyes-bundle.json — private exclusive-root
marker required before any managed directory can be cleaned on rerender.
te-payloads/ — request bodies for POST/PUT /v7/streams, connector + APM operation, per-test JSON, alert rules, labels, tags, TE dashboards, templates.
dashboards/ — one SignalFlow spec per selected test type (consumable by splunk-observability-dashboard-builder).
detectors/ — starter detector specs (consumable by splunk-observability-native-ops).
scripts/ — per-step apply scripts, list helpers, SignalFlow validation, hand-off drivers.
metadata.json — non-secret plan summary.
Apply only when explicitly requested:
bash skills/splunk-observability-thousandeyes-integration/scripts/setup.sh \
--apply stream,apm,tests,alert_rules,templates \
--spec my-integration.yaml \
--te-token-file /secure/path/te-token \
--o11y-ingest-token-file /secure/path/o11y-ingest-token \
--o11y-api-token-file /secure/path/o11y-api-token \
--i-accept-te-mutations
To apply only a subset:
bash skills/splunk-observability-thousandeyes-integration/scripts/setup.sh \
--apply stream,apm \
--spec my-integration.yaml \
--te-token-file /secure/path/te-token \
--o11y-ingest-token-file /secure/path/o11y-ingest-token \
--o11y-api-token-file /secure/path/o11y-api-token \
--i-accept-te-mutations
Every live apply requires an explicit section list (or all) and --i-accept-te-mutations. all means the currently automatable sections: stream, APM, tests, alert rules, and templates. Labels, tags, and TE dashboards remain render-only and fail closed if selected.
Successful creates retain server-returned IDs under the rendered output's
mode-700 state/ directory and verify them by collection/item readback.
Each logical object has a private cross-process lock, and an fsynced
in_progress intent is written before POST. A missing ID, failed exact
readback, or uncertain transport becomes ambiguous with
manual_reconcile: true; later applies block before any second POST. Never
delete or hand-edit ambiguous state to force a retry—reconcile the live TE
object and retained ID first.
Rerender preserves state/ intentionally. It only cleans generated
directories after validating the exclusive marker, canonical bundle root,
expected top-level layout, same-filesystem trees, and single-link regular
files. Root, home, repository-root, unmarked non-empty, symlinked, and
hardlinked output targets fail without recursive deletion.
Per-test-type metric coverage (TE OpenTelemetry Data Model v2)
| TE test type |
Canonical metrics |
agent-to-server / agent-to-agent |
network.latency, network.loss, network.jitter |
http-server |
http.server.request.availability, http.server.throughput, http.client.request.duration |
page-load |
web.page_load.duration, web.page_load.completion |
web-transactions |
web.transaction.duration, web.transaction.errors.count, web.transaction.completion |
api / api-step |
api.duration, api.completion, api.step.duration, api.step.completion |
bgp |
bgp.path_changes.count, bgp.reachability, bgp.updates.count |
dns-server / dns-trace |
dns.lookup.availability, dns.lookup.duration |
dnssec |
dns.lookup.validity |
voice (RTP-stream) |
rtp.client.request.{mos,loss,discards,duration,pdv} |
sip-server |
sip.server.request.availability, sip.client.request.duration, sip.client.request.total_time |
ftp-server |
ftp.server.request.availability, ftp.client.request.duration, ftp.server.throughput |
All charts are filtered by thousandeyes.account.id and thousandeyes.test.id.
Hand-offs
- Dashboards:
scripts/handoff-dashboards.sh emits the exact splunk-observability-dashboard-builder invocation.
- Detectors:
scripts/handoff-detectors.sh emits the exact splunk-observability-native-ops invocation.
- TE MCP registration:
scripts/handoff-mcp.sh emits the cisco-thousandeyes-mcp-setup invocation.
- Splunk Platform TA:
scripts/handoff-ta.sh emits the cisco-thousandeyes-setup invocation.
See reference.md for option details and the references/ annexes for the per-test-type catalog, TE Templates, alert rules, Integrations 2.0 APM, dashboards catalog, and SignalFlow validation.
1---2name: splunk-observability-thousandeyes-integration3description: Use when the user asks to wire ThousandEyes telemetry into Splunk Observability Cloud, configure Integrations 2.0 APM trace linking, manage TE tests/alert rules/templates for an O11y integration, or produce the per-test-type O11y dashboards. Render and (optionally) apply a guarded ThousandEyes -> Splunk Observability Cloud integration end-to-end: Integration 1.0 OpenTelemetry metric stream (POST /v7/streams to ingest.<realm>.signalfx.com/v2/datapoint/otlp), Integrations 2.0 Splunk Observability APM connector (generic connector + splunk-observability-apm operation), plus verified create/readback flows for tests, alert rules, and TE Templates. Renders labels, tags, and TE-side dashboards as reviewable handoffs until authoritative API ID/readback schemas are encoded. Covers the canonical TE OpenTelemetry Data Model v2 taxonomy. Generates SignalFlow dashboard specs and starter detectors for hand-off to splunk-observability-dashboard-builder and splunk-observability-native-ops.4---56# Splunk Observability ThousandEyes Integration78## Prerequisites910| Tool or access | Purpose | Verify |11|---|---|---|12| Bash and Python 3 | Run bundled setup and validation helpers | `bash --version && python3 --version` |13| Required product/platform access | Inspect or configure the selected target | Complete the documented preflight |14| Credential files for live modes | Keep secrets out of chat | Verify paths only |1516## Workflow Overview1718```text19┌───────────┐ ┌───────────────┐ ┌───────────────┐ ┌─────────────────┐20│ Preflight │ → │ Render/review │ → │ Apply/handoff │ → │ Validate evidence │21└───────────┘ └───────────────┘ └───────────────┘ └─────────────────┘22```2324## When to Activate2526- Wire ThousandEyes telemetry into Splunk Observability Cloud, configure Integrations 2.0 APM trace linking, manage27 TE tests/alert rules/templates for an O11y integration, or produce the per-test-type O11y dashboards.28- Preview and review the splunk observability thousandeyes integration workflow before any live apply phase.29- Diagnose failed prerequisites, generated assets, configuration, or validation evidence.3031## Scope3233Follow the documented read-only or render-first path whenever it is available.34This skill does not imply permission to mutate live systems. Require explicit35apply flags, protected credentials, and operator review for state changes.3637## Examples3839Inspect the supported setup modes before selecting one:4041```bash42bash skills/splunk-observability-thousandeyes-integration/scripts/setup.sh --help43```4445Expected output: usage, supported modes, and required arguments are displayed46without changing the target environment.4748Inspect validation modes before running completion checks:4950```bash51bash skills/splunk-observability-thousandeyes-integration/scripts/validate.sh --help52```5354Expected output: offline, live, and completion options are displayed when the55skill supports them; help exits without mutation.5657## Troubleshooting5859| Issue | Cause | Resolution |60|---|---|---|61| Preflight fails | A required tool or access path is missing | Resolve it before rendering or applying |62| Rendered assets are incomplete | Required non-secret inputs are absent | Complete intake and render again |63| Apply is blocked | Review, credentials, or explicit acceptance is missing | Use the documented handoff |64| Validation is incomplete | Live evidence is unavailable | Record the gap and keep completion open |6566This is a **generalized TE -> Splunk Observability Cloud skill**, NOT tied to any one demo. A private RTSP/UDP/RTP demo repo was used during initial development to validate the TE Streams API + Integrations 2.0 mechanics; that demo's test taxonomy is demo-specific and is NOT carried into this skill. Source of truth: the public **ThousandEyes for OpenTelemetry Data Model v2** (`docs.thousandeyes.com/.../opentelemetry/data-model/data-model-v2/metrics`) and the **TE API v7** schemas (`developer.cisco.com/docs/thousandeyes/`).6768## Three TE-side surfaces69701. **Integration 1.0 OpenTelemetry stream** — `POST /v7/streams` with `type=opentelemetry`, `signal=metric|trace|log` (default `metric`), `endpointType=http|grpc`, `streamEndpointUrl=https://ingest.<realm>.signalfx.com/v2/datapoint/otlp`, `customHeaders.X-SF-Token`, `dataModelVersion=v2`, `testMatch[]`, optional `filters.testTypes[]`.712. **Integrations 2.0 Splunk Observability APM connector** — generic connector targeting `https://api.<realm>.signalfx.com` with `X-SF-Token`; assigned to the `splunk-observability-apm` operation for trace linking.723. **TE assets** — render across the canonical taxonomy, with apply limited to operations that have ID-based readback:73 - **Tests**: `POST /v7/tests/{type}` for `http-server`, `page-load`, `web-transactions`, `api`, `agent-to-server`, `agent-to-agent`, `bgp`, `dns-server`, `dns-trace`, `dnssec`, `sip-server`, `voice`, `ftp-server`.74 - **Alert Rules**: `POST /v7/alerts/rules` aligned with the SignalFlow detector specs we ship for O11y.75 - **Labels**, **Tags**, and **TE-side Dashboards** are rendered for operator/API handoff; their generated apply scripts fail closed before mutation.76 - **TE Templates**: verified `POST /v7/templates` creation with77 Handlebars-only credential placeholders. Deployment remains a TE UI78 handoff because template-resource readback does not prove deploy79 completion and cannot make an interrupted deploy POST retry-safe.8081## Out of scope (handed off)8283- Splunk Platform `ta_cisco_thousandeyes` add-on -> [cisco-thousandeyes-setup](../cisco-thousandeyes-setup/SKILL.md).84- ThousandEyes MCP Server registration with Cursor / Claude / Codex / VS Code / Kiro -> [cisco-thousandeyes-mcp-setup](../cisco-thousandeyes-mcp-setup/SKILL.md).85- TE Enterprise Agent K8s/VM deployment.86- O11y dashboard apply -> [splunk-observability-dashboard-builder](../splunk-observability-dashboard-builder/SKILL.md).87- O11y detector apply -> [splunk-observability-native-ops](../splunk-observability-native-ops/SKILL.md).88- `signal=log` and `signal=trace` deep targets — render the payload shape and document that O11y's `/v2/datapoint/otlp` endpoint is metrics-only.8990For the Splunk TA or any dashboard-companion handoff, follow [the shared TA completion gate](../shared/ta_completion_gate.md): package installation alone is not completion; validate ingest and dashboard visibility, macro alignment, and data, or record evidence that no pre-built dashboard ships.9192## Safety Rules9394- Never ask for the ThousandEyes API token, the Splunk Observability ingest token, or the Splunk Observability API token in conversation.95- Never pass any token on the command line or as an environment-variable prefix.96- Use file-based secret flags only:97 - `--te-token-file` for the TE bearer token (used for Streams, Tests, Alert Rules, Templates, Dashboards).98 - `--o11y-ingest-token-file` for the Splunk Observability **Org access token** with ingest authorization (used as `X-SF-Token` in the OTLP metric stream `customHeaders`).99 - `--o11y-api-token-file` for the Splunk Observability **User API access token** (used as `X-SF-Token` in the Integrations 2.0 APM connector and SignalFlow validate calls).100- Reject every direct token flag (`--te-token`, `--access-token`, `--token`, `--bearer-token`, `--api-token`, `--o11y-token`, `--sf-token`).101- Token files must be single-link, non-symlink regular files containing exactly102 one non-empty UTF-8 line and must be `chmod 600`. Live validators open them103 with no-follow descriptor checks. There is no permission bypass.104- TE Templates render with **Handlebars placeholders only** — TE API rejects plain-text credentials with HTTP 400.105- Apply scripts read token files at runtime through the fixed-origin HTTPS client; the renderer never reads token files. Every TE request is scoped with the rendered numeric `account_group_id` as `?aid=`.106107## Primary Workflow1081091. Collect non-secret values: realm (us0/us1/eu0/...), account group ID, list of TE test IDs or test types to include, optional alert rules / labels / tags / dashboards / templates.1101112. Create or update a YAML/JSON spec from `template.example`. Spec supports test selection via:112 - explicit `test_match[]` (list of `{id, domain: cea|endpoint}`),113 - `filters.test_types[]` (any of the canonical TE OTel v2 types),114 - or `mode: all` (stream every enabled test).1151163. Render and validate:117118 ```bash119 bash skills/splunk-observability-thousandeyes-integration/scripts/setup.sh \120 --render \121 --validate \122 --spec skills/splunk-observability-thousandeyes-integration/template.example \123 --output-dir splunk-observability-thousandeyes-rendered124 ```1251264. Review `splunk-observability-thousandeyes-rendered/`:127 - `.splunk-observability-thousandeyes-bundle.json` — private exclusive-root128 marker required before any managed directory can be cleaned on rerender.129 - `te-payloads/` — request bodies for `POST/PUT /v7/streams`, connector + APM operation, per-test JSON, alert rules, labels, tags, TE dashboards, templates.130 - `dashboards/` — one SignalFlow spec per selected test type (consumable by `splunk-observability-dashboard-builder`).131 - `detectors/` — starter detector specs (consumable by `splunk-observability-native-ops`).132 - `scripts/` — per-step apply scripts, list helpers, SignalFlow validation, hand-off drivers.133 - `metadata.json` — non-secret plan summary.1341355. Apply only when explicitly requested:136137 ```bash138 bash skills/splunk-observability-thousandeyes-integration/scripts/setup.sh \139 --apply stream,apm,tests,alert_rules,templates \140 --spec my-integration.yaml \141 --te-token-file /secure/path/te-token \142 --o11y-ingest-token-file /secure/path/o11y-ingest-token \143 --o11y-api-token-file /secure/path/o11y-api-token \144 --i-accept-te-mutations145 ```146147 To apply only a subset:148149 ```bash150 bash skills/splunk-observability-thousandeyes-integration/scripts/setup.sh \151 --apply stream,apm \152 --spec my-integration.yaml \153 --te-token-file /secure/path/te-token \154 --o11y-ingest-token-file /secure/path/o11y-ingest-token \155 --o11y-api-token-file /secure/path/o11y-api-token \156 --i-accept-te-mutations157 ```158159 Every live apply requires an explicit section list (or `all`) and `--i-accept-te-mutations`. `all` means the currently automatable sections: stream, APM, tests, alert rules, and templates. Labels, tags, and TE dashboards remain render-only and fail closed if selected.160161 Successful creates retain server-returned IDs under the rendered output's162 mode-700 `state/` directory and verify them by collection/item readback.163 Each logical object has a private cross-process lock, and an fsynced164 `in_progress` intent is written before POST. A missing ID, failed exact165 readback, or uncertain transport becomes `ambiguous` with166 `manual_reconcile: true`; later applies block before any second POST. Never167 delete or hand-edit ambiguous state to force a retry—reconcile the live TE168 object and retained ID first.169170 Rerender preserves `state/` intentionally. It only cleans generated171 directories after validating the exclusive marker, canonical bundle root,172 expected top-level layout, same-filesystem trees, and single-link regular173 files. Root, home, repository-root, unmarked non-empty, symlinked, and174 hardlinked output targets fail without recursive deletion.175176## Per-test-type metric coverage (TE OpenTelemetry Data Model v2)177178| TE test type | Canonical metrics |179|--------------|-------------------|180| `agent-to-server` / `agent-to-agent` | `network.latency`, `network.loss`, `network.jitter` |181| `http-server` | `http.server.request.availability`, `http.server.throughput`, `http.client.request.duration` |182| `page-load` | `web.page_load.duration`, `web.page_load.completion` |183| `web-transactions` | `web.transaction.duration`, `web.transaction.errors.count`, `web.transaction.completion` |184| `api` / `api-step` | `api.duration`, `api.completion`, `api.step.duration`, `api.step.completion` |185| `bgp` | `bgp.path_changes.count`, `bgp.reachability`, `bgp.updates.count` |186| `dns-server` / `dns-trace` | `dns.lookup.availability`, `dns.lookup.duration` |187| `dnssec` | `dns.lookup.validity` |188| `voice` (RTP-stream) | `rtp.client.request.{mos,loss,discards,duration,pdv}` |189| `sip-server` | `sip.server.request.availability`, `sip.client.request.duration`, `sip.client.request.total_time` |190| `ftp-server` | `ftp.server.request.availability`, `ftp.client.request.duration`, `ftp.server.throughput` |191192All charts are filtered by `thousandeyes.account.id` and `thousandeyes.test.id`.193194## Hand-offs195196- Dashboards: `scripts/handoff-dashboards.sh` emits the exact `splunk-observability-dashboard-builder` invocation.197- Detectors: `scripts/handoff-detectors.sh` emits the exact `splunk-observability-native-ops` invocation.198- TE MCP registration: `scripts/handoff-mcp.sh` emits the `cisco-thousandeyes-mcp-setup` invocation.199- Splunk Platform TA: `scripts/handoff-ta.sh` emits the `cisco-thousandeyes-setup` invocation.200201See `reference.md` for option details and the `references/` annexes for the per-test-type catalog, TE Templates, alert rules, Integrations 2.0 APM, dashboards catalog, and SignalFlow validation.