[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-grafana-synthetic-monitoring-checks":3,"mdc--wem0v6-key":34,"related-org-grafana-synthetic-monitoring-checks":5207,"related-repo-grafana-synthetic-monitoring-checks":5394},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":11,"stars":23,"repoUrl":24,"updatedAt":25,"license":26,"forks":27,"topics":28,"repo":29,"sourceUrl":32,"mdContent":33},"synthetic-monitoring-checks","author Grafana Synthetic Monitoring checks","Author Grafana Cloud Synthetic Monitoring checks, with deep coverage of k6 scripted and browser checks: SM's single-VU\u002Fsingle-iteration execution model, assertions that actually fail probe_success (expect() and fail() vs bare check()), secrets, deterministic scripts, robust browser locators, local validation with k6 run, deployment via UI\u002FAPI\u002FTerraform, verifying probe_success, and rollback. Also helps choose the simplest sufficient check type (HTTP\u002Fping\u002FDNS\u002FTCP, MultiHTTP, scripted, browser). Use when writing a synthetic check, monitoring a login\u002Fcheckout\u002Fsignup flow in production, converting a k6 script or an OpenAPI spec into a check, authoring a browser check, validating a user journey, or asking \"is my site up from multiple regions\". NOT for load, stress, or performance testing — SM runs one iteration per execution; for load tests use the grafana-k6 plugin or Grafana Cloud k6. For the broad Grafana Cloud Testing overview (SM + k6 Cloud + Faro), use the testing skill.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},"grafana","Grafana","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fgrafana.jpg",[12,16,19,20],{"name":13,"slug":14,"type":15},"Observability","observability","tag",{"name":17,"slug":18,"type":15},"Monitoring","monitoring",{"name":9,"slug":8,"type":15},{"name":21,"slug":22,"type":15},"Testing","testing",189,"https:\u002F\u002Fgithub.com\u002Fgrafana\u002Fskills","2026-08-03T06:27:20.328462","Apache-2.0",16,[],{"repoUrl":24,"stars":23,"forks":27,"topics":30,"description":31},[],null,"https:\u002F\u002Fgithub.com\u002Fgrafana\u002Fskills\u002Ftree\u002FHEAD\u002Fskills\u002Fgrafana-cloud\u002Fsynthetic-monitoring-checks","---\nname: synthetic-monitoring-checks\nlicense: Apache-2.0\ndescription: >\n  Author Grafana Cloud Synthetic Monitoring checks, with deep coverage of k6 scripted and\n  browser checks: SM's single-VU\u002Fsingle-iteration execution model, assertions that actually\n  fail probe_success (expect() and fail() vs bare check()), secrets, deterministic scripts,\n  robust browser locators, local validation with k6 run, deployment via UI\u002FAPI\u002FTerraform,\n  verifying probe_success, and rollback. Also helps choose the simplest sufficient check\n  type (HTTP\u002Fping\u002FDNS\u002FTCP, MultiHTTP, scripted, browser). Use when writing a synthetic\n  check, monitoring a login\u002Fcheckout\u002Fsignup flow in production, converting a k6 script or\n  an OpenAPI spec into a check, authoring a browser check, validating a user journey, or\n  asking \"is my site up from multiple regions\". NOT for load, stress, or performance testing — SM runs one\n  iteration per execution; for load tests use the grafana-k6 plugin or Grafana Cloud k6.\n  For the broad Grafana Cloud Testing overview (SM + k6 Cloud + Faro), use the testing skill.\n---\n\n# Synthetic Monitoring Check Authoring\n\n> **Docs**: https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002F\n> Broad Grafana Cloud Testing entry point (SM + k6 Cloud + Faro): [`testing`](..\u002Ftesting\u002FSKILL.md) skill.\n\n## Reliability monitoring, not load testing\n\nSynthetic Monitoring (SM) runs k6 as a **reliability\u002Favailability engine**: every check\nexecution runs **one iteration with one VU** from each selected probe location on a fixed\nschedule. Success means \"the user journey works right now, from this region\" — detect\noutages before your customers do.\n\nDo **not** apply load-testing idioms. There are no VUs to ramp, no `stages`, no load\nprofiles, no soak\u002Fstress\u002Fspike phases, and no `thresholds` over aggregated traffic.\nVocabulary: *check*, *probe*, *execution*, *uptime*, *reachability*, *user journey\nvalidation* — never \"load test\", \"ramping\", or \"VUs\".\n\n**If the user actually wants load or performance testing** (throughput, latency under\nload, breakpoints), stop: that is Grafana Cloud k6 \u002F the `grafana-k6` plugin's `k6` skill,\nnot Synthetic Monitoring. A script can be shared between both products, but the goals,\noptions, and pricing are different.\n\n## Execution model and constraints (verify against these before writing)\n\n| Constraint | Value |\n|---|---|\n| Workload | One iteration per probe execution. Scripted and MultiHTTP run with forced `--vus 1 --iterations 1`; browser checks rely on the script's required single scenario. Either way `vus`, `duration`, `stages`, `iterations` are **ignored** — never write a load shape |\n| `thresholds` | **Not supported** |\n| Frequency | k6-class checks (scripted, MultiHTTP, browser): 60–3600s. Protocol checks (HTTP\u002Fping\u002FDNS\u002FTCP\u002FgRPC): 1–3600s. Traceroute: 120–3600s |\n| Timeout | Must be ≤ frequency. k6-class checks: 1–180s. Protocol checks: 1–60s. Traceroute: fixed 30s |\n| k6 version | Checks run on a [k6 version channel](https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fcreate-checks\u002Fmanage-k6-versions\u002F) (new checks default to the latest stable channel; `v1.x` is deprecated as of July 2026). Pin per check via the UI dropdown or `channels` in API\u002FTerraform |\n| Local files | `open()`, `fs`, `grpc.load()` unsupported. Bundle local modules into the script; remote `https:\u002F\u002Fjslib.k6.io\u002F...` imports work |\n| HTTP request errors | SM runs k6 with `--throw`: network-level request failures throw an exception and fail the execution |\n| Script options SM honors | SM sets its own CLI flags, which take precedence over the script's `options` object; the options that still take effect include `batch`, `batch-per-host`, `discardResponseBodies`, `httpDebug`, `insecureSkipTLSVerify`, `maxRedirects`, `noConnectionReuse`, `setupTimeout`, `systemTags`, `tags`, `teardownTimeout`, `throw`, `tlsAuth`, `tlsCipherSuites`, `tlsVersion`, `userAgent` |\n| Browser memory | [1GB RAM per browser on public probes](https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fcreate-checks\u002Fchecks\u002Fk6-browser\u002F#public-probe-memory) — huge pages fail with `Target has crashed` |\n| Browser script format | The UI rejects bundled\u002Fminified browser scripts (import validation) — deploy those via API or Terraform |\n\n## How an execution fails (this is what agents get wrong)\n\n`probe_success` (1\u002F0) is the uptime signal. An execution is marked **failed** when the\nscript throws an uncaught exception, calls `fail()`, a k6-testing `expect()` assertion\nfails (it calls k6's `test.abort()` under the hood), an HTTP request errors at the\nnetwork level (SM's `--throw`), or the timeout is hit.\n\nA **bare failed `check()` does NOT fail the execution** — it only records the\n`probe_checks_total` \u002F `probe_check_success_rate` metrics. Checks don't affect k6's exit\nstatus without thresholds, and thresholds are disabled in SM.\n\nAssertion patterns, in order of preference:\n\n```javascript\nimport { expect } from 'https:\u002F\u002Fjslib.k6.io\u002Fk6-testing\u002F0.6.1\u002Findex.js';\nimport { check, fail } from 'k6';\n\n\u002F\u002F 1. PREFERRED — assertions module. Throws on failure => execution fails,\n\u002F\u002F    with a descriptive error in the check logs.\nexpect(res.status, 'login should succeed').toEqual(200);\nexpect(res.json('token')).toBeDefined();\n\n\u002F\u002F 2. Soft assertions — run all of them, still fail the execution at the end.\nexpect.soft(res.headers['Content-Type']).toContain('application\u002Fjson');\n\n\u002F\u002F 3. check() when you also want per-assertion metrics — but pair it with\n\u002F\u002F    fail() or the failure won't affect probe_success\u002Fuptime:\ncheck(res, { 'status 200': (r) => r.status === 200 }) ||\n  fail(`login failed with status ${res.status}`);\n```\n\nName every assertion (the message argument \u002F check name): the name is what you see in\ncheck logs and in the `check` label of `probe_checks_total` when diagnosing a failure\nat 3am.\n\n## Choose the simplest sufficient check type first\n\nCheaper for the customer, easier to maintain. Work down this list and stop at the first\nmatch:\n\n1. **HTTP \u002F ping \u002F DNS \u002F TCP \u002F traceroute \u002F gRPC** — a single static endpoint (uptime,\n   status code, body regex, TLS cert expiry, record resolution, port reachability). No\n   script to maintain — these run on the blackbox-exporter probe engine, and Terraform\n   examples with per-type `target` formats are in\n   [`references\u002Fapi-and-terraform.md`](references\u002Fapi-and-terraform.md).\n2. **MultiHTTP** — a sequence of HTTP requests with value-passing between them\n   (`${variable}` capture), but no custom logic. **Caution**: MultiHTTP does not\n   auto-validate status codes — define assertions per request or failures won't affect\n   uptime.\n3. **k6 scripted** — an API flow needing real logic: crypto\u002Fsigning, conditional\n   branching, generated test data, WebSockets, response-driven chaining.\n4. **k6 browser** — only when you need a real browser: JS-rendered user journeys,\n   forms\u002Fclicks, Core Web Vitals.\n\n**Cost model** (execution-based billing): an execution is one check run on one probe,\nmetered per minute of runtime rounded up. Per month:\n`probes × duration_minutes × (43200 \u002F frequency_minutes)`. API test executions (HTTP,\nping, DNS, TCP, traceroute, MultiHTTP, scripted) and browser test executions are billed\nseparately — browser checks are the expensive tier. A browser check on 3 probes every\nminute is ~129,600 browser executions\u002Fmonth; the same check every 5 minutes is ~25,920.\nPick the longest frequency that still meets your detection-time goal, and 2–3 probes\nnear your users (multiple probes reduce alert flapping; more isn't better).\n\n## Scripted check authoring\n\nSkeleton — a login + API action journey with secrets and hard-failing assertions:\n\n```javascript\nimport http from 'k6\u002Fhttp';\nimport { expect } from 'https:\u002F\u002Fjslib.k6.io\u002Fk6-testing\u002F0.6.1\u002Findex.js';\nimport secrets from 'k6\u002Fsecrets';\n\nconst BASE = 'https:\u002F\u002Fapi.example.com';\n\nexport default async function () {\n  \u002F\u002F Secrets are managed in Synthetics > Config > Secrets — never hardcode credentials.\n  const password = await secrets.get('checkout-monitor-password');\n\n  \u002F\u002F Step 1: authenticate with a dedicated monitoring account\n  const login = http.post(\n    `${BASE}\u002Fauth\u002Flogin`,\n    JSON.stringify({ user: 'sm-checkout-monitor', password }),\n    { headers: { 'Content-Type': 'application\u002Fjson' } }\n  );\n  expect(login.status, 'login should return 200').toEqual(200);\n  const token = login.json('token');\n  expect(token, 'auth token should be present').toBeDefined();\n\n  \u002F\u002F Step 2: exercise the journey and assert the OUTCOME, not just the status\n  const order = http.post(`${BASE}\u002Forders`, JSON.stringify({ sku: 'TEST-SKU-1', qty: 1 }), {\n    headers: { 'Content-Type': 'application\u002Fjson', Authorization: `Bearer ${token}` },\n  });\n  expect(order.status, 'order should be created').toEqual(201);\n  const orderId = order.json('id');\n  expect(orderId, 'order id should be returned').toBeDefined();\n\n  \u002F\u002F Step 3: clean up so the check is idempotent against production\n  \u002F\u002F http.url groups metrics for URLs containing unique IDs — without it, every\n  \u002F\u002F execution creates new time series (cardinality + active-series cost).\n  const del = http.del(http.url`${BASE}\u002Forders\u002F${orderId}`, null, {\n    headers: { Authorization: `Bearer ${token}` },\n  });\n  expect(del.status, 'test order should be cleaned up').toEqual(204);\n}\n```\n\nRules that make a scripted check a good *monitor* (vs a good test):\n\n- **Deterministic**: fixed test data (or generated-then-deleted, as above), no\n  time-of-day or ordering dependence. Every execution must be able to pass at any hour\n  from any probe.\n- **Idempotent against production**: create-then-delete, or use read-only endpoints.\n  The check runs forever — leaked state accumulates forever.\n- **Dedicated test account**: never a real user's credentials; scope it minimally, store\n  the password as an SM secret, and exclude the account from analytics\u002Fbilling.\n- **Assert every step** — an unasserted step that breaks shows up as a *later* step's\n  confusing failure.\n- **Stable URL cardinality**: `http.url` template literal for any URL containing an ID.\n- Keep runtime well under the timeout, and the timeout under the frequency.\n\n### Generating a check from an OpenAPI spec (or similar)\n\nGiven an API description — an OpenAPI\u002FSwagger spec, GraphQL schema, or Postman\ncollection — the mechanical conversion to k6 calls is easy. What matters is what you\nchoose to convert:\n\n1. **Journeys, not endpoints.** Do NOT generate one check per path, or one check that\n   sweeps every path — that monitors the spec, not the service, and every extra check\n   multiplies execution cost. Identify the 1–3 flows whose failure means \"customers are\n   impacted\" (auth → core action → result) and write one scripted check per flow.\n2. **Filter for safety.** Only include mutating operations (`POST`\u002F`PUT`\u002F`DELETE`) when\n   the flow cleans up after itself (create-then-delete, as above) or targets dedicated\n   test resources. A spec lists destructive operations right next to health endpoints —\n   never exercise them against production just because they're documented.\n3. **Assert from the response schema.** The spec tells you exactly what a healthy\n   response contains — assert required fields, not just the status code:\n   `expect(order.json('id'), 'id required by OrdersResponse schema').toBeDefined()`.\n4. **Verify the target URL.** `servers:` blocks (and Postman environments) often list\n   localhost or staging first — confirm the production base URL with the user, and map\n   `securitySchemes` credentials to SM secrets, never to values inlined from the spec.\n   (Secrets in plain HTTP\u002Fprotocol checks are a recent, feature-flagged rollout — check\n   current docs; the scripted `secrets.get()` path always works.)\n5. **Treat `format: int64` ids as strings.** `res.json('id')` parses into a JS number\n   and silently corrupts values past 2^53 (snowflake-style ids), so the readback URL\n   404s on every execution while the create looks fine. Extract from the raw body\n   instead: `const id = (\u002F\"id\":\\s*(\\d+)\u002F.exec(res.body) || [])[1];` — and never do\n   arithmetic on it.\n\nNo API spec at all? Probe the frontend: open the web app with browser devtools (or\n`curl` likely routes) and capture the `\u002Fapi\u002F*` XHR calls it makes — that's a monitorable\nHTTP surface even when the documented backend services are gRPC-only or internal.\n\n## Browser check authoring\n\nRequired scaffold: import `k6\u002Fbrowser` and declare the `chromium` browser type. The UI\nvalidates both.\n\n```javascript\nimport { browser } from 'k6\u002Fbrowser';\nimport { expect } from 'https:\u002F\u002Fjslib.k6.io\u002Fk6-testing\u002F0.6.1\u002Findex.js';\nimport secrets from 'k6\u002Fsecrets';\n\nexport const options = {\n  scenarios: {\n    ui: {\n      executor: 'shared-iterations',\n      options: { browser: { type: 'chromium' } },\n    },\n  },\n};\n\nexport default async function () {\n  const page = await browser.newPage();\n  try {\n    await page.goto('https:\u002F\u002Fshop.example.com\u002Flogin');\n\n    \u002F\u002F Prefer role\u002Flabel\u002Ftest-id locators over CSS chains — they survive redesigns.\n    const password = await secrets.get('shop-monitor-password');\n    await page.getByLabel('Email').fill('sm-monitor@example.com');\n    await page.getByLabel('Password').fill(password);\n    await page.getByRole('button', { name: 'Sign in' }).click();\n\n    \u002F\u002F Assert the JOURNEY OUTCOME with auto-retrying assertions — never sleep().\n    await expect(page.getByRole('heading', { name: 'Your account' })).toBeVisible();\n\n    await page.getByRole('link', { name: 'Orders' }).click();\n    await expect(page.getByTestId('order-list')).toBeVisible();\n  } finally {\n    await page.close();\n  }\n}\n```\n\nBrowser-specific rules:\n\n- **Locators**: `getByRole` \u002F `getByLabel` \u002F `getByTestId` (ask the app team to add\n  `data-testid` where needed) > text > CSS. Never XPath or generated class names.\n  `getByTestId` assumes `data-testid` — apps instrumented for Cypress often use\n  `data-cy` instead; fall back to `page.locator('[data-cy=\"...\"]')`.\n- **No manual waits before interactions**: locator actions auto-wait for visibility and\n  enabled state. Don't call `waitFor()` before `click()`\u002F`fill()`, don't use\n  `waitForLoadState()`, never `sleep()`.\n- **Auto-retrying `expect()`** (`toBeVisible`, `toBeEnabled`, ...) is the wait mechanism\n  for asserting state you don't interact with. Caveat: despite being listed as\n  retrying, the text matchers (`toHaveText`\u002F`toContainText`) hard-fail on the first\n  *mismatched* read — e.g. an empty string mid-hydration on a client-rendered app.\n  Assert dynamic text by locating it and asserting visibility instead:\n  `await expect(page.getByText('Order confirmed')).toBeVisible()`.\n- **Assertion timeout defaults to 5s** — client-side-rendered apps routinely take\n  longer to first meaningful render. Raise it once and use the configured instance:\n  `const expectUi = expect.configure({ timeout: 20000 });`.\n- **Assert the outcome** (logged-in heading, order list, confirmation text) — a page can\n  load fine while the journey is broken.\n- **`try\u002Ffinally` with `page.close()`** so the browser is released even when an\n  assertion throws.\n- Screenshot artifacts aren't a documented SM feature — don't build failure handling\n  around `page.screenshot()`; rely on assertion messages and the check's logs (SM stores\n  per-execution logs in Loki).\n- Web Vitals (`probe_browser_web_vital_lcp|cls|fcp|inp|ttfb`) are collected\n  automatically — no extra code needed.\n\n## Validate locally, then deploy\n\nSM scripts are plain k6 scripts — always run them locally first:\n\n```bash\nk6 run script.js                                              # scripted check\nK6_BROWSER_HEADLESS=true k6 run browser-check.js              # browser check\nk6 run --secret-source=mock=checkout-monitor-password=example-password script.js   # with secrets\n# Many\u002Flarge secrets: k6 run --secret-source=file=secrets.txt script.js\n```\n\nPass = exit code 0, one iteration, no failed assertions in the summary. Run it 3–5 times;\na script that is 90% reliable locally will page you nightly from 3 probes.\n\nThen create the check (pick one):\n\n- **UI**: Testing & synthetics → Synthetics → Add new check → *k6 scripted* \u002F *k6\n  browser* → paste script → select probes + frequency → **Test** (runs once without\n  saving) → Save.\n- **API or Terraform**: see [`references\u002Fapi-and-terraform.md`](references\u002Fapi-and-terraform.md).\n  Key gotchas: API `frequency`\u002F`timeout` are **milliseconds** and `settings.scripted.script`\n  \u002F `settings.browser.script` are **base64-encoded**; Terraform takes the plain script\n  via `file()`.\n\n## Verify it works, and rollback\n\nWait one frequency interval, then in Explore against the Synthetic Monitoring metrics\n(Prometheus) datasource:\n\n```promql\n# 1 from every selected probe = healthy\nprobe_success{job=\"checkout-flow\"}\n\n# Assertion pass rate per named assertion (scripted\u002Fbrowser)\nprobe_check_success_rate{job=\"checkout-flow\"}\n\n# Journey duration per probe — confirm it's comfortably under the timeout\nprobe_script_duration_seconds{job=\"checkout-flow\"}\n\n# Uptime over time (how the SM app computes it)\nmax by () (max_over_time(probe_success{job=\"checkout-flow\"}[5m]))\n```\n\nA healthy first execution: `probe_success == 1` from every probe, all\n`probe_check_success_rate` series at 1, duration stable across probes, and the check's\nprebuilt dashboard (Synthetics → check → View dashboard) showing logs for each execution.\nBrowser checks should additionally show `probe_browser_web_vital_*` series.\n\n**Rollback**: set the check's `enabled: false` (UI toggle, API update, or Terraform) to\nstop executions without losing history; delete the check only when you no longer need\nits configuration. Alerting: start with `alertSensitivity` \u002F the default alert rules on\n`probe_success` — see the [`testing`](..\u002Ftesting\u002FSKILL.md) skill for alert rule examples.\n\n## Common failure modes\n\n| Symptom | Cause → fix |\n|---|---|\n| Passes locally, fails on all probes | Target not reachable from the public internet (internal DNS, VPN, IP allowlist). Use [private probes](https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fset-up\u002Fset-up-private-probes\u002F) for internal targets, or allowlist probe egress |\n| Passes locally, fails on *some* probes | Geo-blocking, regional CDN\u002FWAF rules, or bot protection challenging datacenter IPs. Check `probe` label on failures; exempt the SM `userAgent` or those regions in the WAF |\n| Check \"fails\" in your eyes but `probe_success` stays 1 | Bare `check()` without `fail()`\u002F`expect()` — failures are recorded as metrics only. Convert to `expect()` or `check(...) \\|\\| fail(...)` |\n| Browser check flaps with locator timeouts | Brittle selectors or animation timing. Switch to `getByRole`\u002F`getByTestId`, assert with auto-retrying `expect()`, remove manual waits |\n| `toBeVisible` reports `Expected: visible \u002F Received: hidden` but the element is clearly visible | The locator matches multiple elements (strict mode) — the error message is misleading. Tighten the selector or use `.first()` |\n| Create succeeds but readback 404s on every execution | The id exceeds `Number.MAX_SAFE_INTEGER` (2^53) and `res.json()` silently rounded it — extract int64 ids from the raw body as strings (see the OpenAPI section) |\n| `secrets.get()` fails | Secret name mismatch (names are exact, ≤253 chars, letters\u002Fnumbers\u002F`-`\u002F`_`), secret deleted (checks fail until recreated), or the editing user lacks the Admin\u002FEditor role or \"Checks writer\" permission |\n| Executions time out but the journey is fine | Timeout too low for the journey (max 180s) — raise it; or the script does unbounded work per iteration. Also confirm timeout \u003C frequency |\n| `Target has crashed` in browser check logs | Page exceeds the 1GB probe browser memory — trim the journey, block heavy third-party resources, or use a private probe with more memory |\n| UI rejects a browser script | Bundled\u002Fminified script fails the UI's import validation — create it via API or Terraform instead |\n| Metrics\u002Fbilling explosion after adding a check | Unique IDs in URLs creating per-execution time series — use `http.url`, and check frequency × probe count against the cost formula above |\n\n## References\n\n- [`references\u002Fapi-and-terraform.md`](references\u002Fapi-and-terraform.md) — SM API auth + check CRUD payloads (scripted, browser, MultiHTTP) and Terraform examples for every check type, including the protocol checks (HTTP, ping, DNS, TCP, traceroute, gRPC)\n\n## Resources\n\n- [Synthetic Monitoring docs](https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002F)\n- [k6 scripted checks](https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fcreate-checks\u002Fchecks\u002Fk6\u002F) · [k6 browser checks](https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fcreate-checks\u002Fchecks\u002Fk6-browser\u002F)\n- [Secrets management](https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fcreate-checks\u002Fmanage-secrets\u002F)\n- [k6 assertions (`expect`)](https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fk6\u002Flatest\u002Fusing-k6\u002Fassertions\u002F) · [k6 browser module](https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fk6\u002Flatest\u002Fusing-k6-browser\u002F)\n- k6 fundamentals and load testing: `grafana-k6` plugin, [`k6` skill](..\u002F..\u002Fgrafana-k6\u002Fk6\u002FSKILL.md)\n",{"data":35,"body":36},{"name":4,"license":26,"description":6},{"type":37,"children":38},"root",[39,48,86,93,112,179,205,211,611,617,666,702,707,1266,1285,1291,1296,1374,1392,1398,1403,2767,2779,2852,2859,2864,2994,3015,3021,3042,4104,4109,4357,4363,4368,4469,4474,4479,4581,4587,4592,4686,4714,4757,4763,5085,5091,5107,5113,5201],{"type":40,"tag":41,"props":42,"children":44},"element","h1",{"id":43},"synthetic-monitoring-check-authoring",[45],{"type":46,"value":47},"text","Synthetic Monitoring Check Authoring",{"type":40,"tag":49,"props":50,"children":51},"blockquote",{},[52],{"type":40,"tag":53,"props":54,"children":55},"p",{},[56,62,64,72,74,84],{"type":40,"tag":57,"props":58,"children":59},"strong",{},[60],{"type":46,"value":61},"Docs",{"type":46,"value":63},": ",{"type":40,"tag":65,"props":66,"children":70},"a",{"href":67,"rel":68},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002F",[69],"nofollow",[71],{"type":46,"value":67},{"type":46,"value":73},"\nBroad Grafana Cloud Testing entry point (SM + k6 Cloud + Faro): ",{"type":40,"tag":65,"props":75,"children":77},{"href":76},"..\u002Ftesting\u002FSKILL.md",[78],{"type":40,"tag":79,"props":80,"children":82},"code",{"className":81},[],[83],{"type":46,"value":22},{"type":46,"value":85}," skill.",{"type":40,"tag":87,"props":88,"children":90},"h2",{"id":89},"reliability-monitoring-not-load-testing",[91],{"type":46,"value":92},"Reliability monitoring, not load testing",{"type":40,"tag":53,"props":94,"children":95},{},[96,98,103,105,110],{"type":46,"value":97},"Synthetic Monitoring (SM) runs k6 as a ",{"type":40,"tag":57,"props":99,"children":100},{},[101],{"type":46,"value":102},"reliability\u002Favailability engine",{"type":46,"value":104},": every check\nexecution runs ",{"type":40,"tag":57,"props":106,"children":107},{},[108],{"type":46,"value":109},"one iteration with one VU",{"type":46,"value":111}," from each selected probe location on a fixed\nschedule. Success means \"the user journey works right now, from this region\" — detect\noutages before your customers do.",{"type":40,"tag":53,"props":113,"children":114},{},[115,117,122,124,130,132,138,140,146,148,153,154,159,160,165,166,171,172,177],{"type":46,"value":116},"Do ",{"type":40,"tag":57,"props":118,"children":119},{},[120],{"type":46,"value":121},"not",{"type":46,"value":123}," apply load-testing idioms. There are no VUs to ramp, no ",{"type":40,"tag":79,"props":125,"children":127},{"className":126},[],[128],{"type":46,"value":129},"stages",{"type":46,"value":131},", no load\nprofiles, no soak\u002Fstress\u002Fspike phases, and no ",{"type":40,"tag":79,"props":133,"children":135},{"className":134},[],[136],{"type":46,"value":137},"thresholds",{"type":46,"value":139}," over aggregated traffic.\nVocabulary: ",{"type":40,"tag":141,"props":142,"children":143},"em",{},[144],{"type":46,"value":145},"check",{"type":46,"value":147},", ",{"type":40,"tag":141,"props":149,"children":150},{},[151],{"type":46,"value":152},"probe",{"type":46,"value":147},{"type":40,"tag":141,"props":155,"children":156},{},[157],{"type":46,"value":158},"execution",{"type":46,"value":147},{"type":40,"tag":141,"props":161,"children":162},{},[163],{"type":46,"value":164},"uptime",{"type":46,"value":147},{"type":40,"tag":141,"props":167,"children":168},{},[169],{"type":46,"value":170},"reachability",{"type":46,"value":147},{"type":40,"tag":141,"props":173,"children":174},{},[175],{"type":46,"value":176},"user journey\nvalidation",{"type":46,"value":178}," — never \"load test\", \"ramping\", or \"VUs\".",{"type":40,"tag":53,"props":180,"children":181},{},[182,187,189,195,197,203],{"type":40,"tag":57,"props":183,"children":184},{},[185],{"type":46,"value":186},"If the user actually wants load or performance testing",{"type":46,"value":188}," (throughput, latency under\nload, breakpoints), stop: that is Grafana Cloud k6 \u002F the ",{"type":40,"tag":79,"props":190,"children":192},{"className":191},[],[193],{"type":46,"value":194},"grafana-k6",{"type":46,"value":196}," plugin's ",{"type":40,"tag":79,"props":198,"children":200},{"className":199},[],[201],{"type":46,"value":202},"k6",{"type":46,"value":204}," skill,\nnot Synthetic Monitoring. A script can be shared between both products, but the goals,\noptions, and pricing are different.",{"type":40,"tag":87,"props":206,"children":208},{"id":207},"execution-model-and-constraints-verify-against-these-before-writing",[209],{"type":46,"value":210},"Execution model and constraints (verify against these before writing)",{"type":40,"tag":212,"props":213,"children":214},"table",{},[215,234],{"type":40,"tag":216,"props":217,"children":218},"thead",{},[219],{"type":40,"tag":220,"props":221,"children":222},"tr",{},[223,229],{"type":40,"tag":224,"props":225,"children":226},"th",{},[227],{"type":46,"value":228},"Constraint",{"type":40,"tag":224,"props":230,"children":231},{},[232],{"type":46,"value":233},"Value",{"type":40,"tag":235,"props":236,"children":237},"tbody",{},[238,295,314,327,340,378,419,440,572,598],{"type":40,"tag":220,"props":239,"children":240},{},[241,247],{"type":40,"tag":242,"props":243,"children":244},"td",{},[245],{"type":46,"value":246},"Workload",{"type":40,"tag":242,"props":248,"children":249},{},[250,252,258,260,266,267,273,274,279,280,286,288,293],{"type":46,"value":251},"One iteration per probe execution. Scripted and MultiHTTP run with forced ",{"type":40,"tag":79,"props":253,"children":255},{"className":254},[],[256],{"type":46,"value":257},"--vus 1 --iterations 1",{"type":46,"value":259},"; browser checks rely on the script's required single scenario. Either way ",{"type":40,"tag":79,"props":261,"children":263},{"className":262},[],[264],{"type":46,"value":265},"vus",{"type":46,"value":147},{"type":40,"tag":79,"props":268,"children":270},{"className":269},[],[271],{"type":46,"value":272},"duration",{"type":46,"value":147},{"type":40,"tag":79,"props":275,"children":277},{"className":276},[],[278],{"type":46,"value":129},{"type":46,"value":147},{"type":40,"tag":79,"props":281,"children":283},{"className":282},[],[284],{"type":46,"value":285},"iterations",{"type":46,"value":287}," are ",{"type":40,"tag":57,"props":289,"children":290},{},[291],{"type":46,"value":292},"ignored",{"type":46,"value":294}," — never write a load shape",{"type":40,"tag":220,"props":296,"children":297},{},[298,306],{"type":40,"tag":242,"props":299,"children":300},{},[301],{"type":40,"tag":79,"props":302,"children":304},{"className":303},[],[305],{"type":46,"value":137},{"type":40,"tag":242,"props":307,"children":308},{},[309],{"type":40,"tag":57,"props":310,"children":311},{},[312],{"type":46,"value":313},"Not supported",{"type":40,"tag":220,"props":315,"children":316},{},[317,322],{"type":40,"tag":242,"props":318,"children":319},{},[320],{"type":46,"value":321},"Frequency",{"type":40,"tag":242,"props":323,"children":324},{},[325],{"type":46,"value":326},"k6-class checks (scripted, MultiHTTP, browser): 60–3600s. Protocol checks (HTTP\u002Fping\u002FDNS\u002FTCP\u002FgRPC): 1–3600s. Traceroute: 120–3600s",{"type":40,"tag":220,"props":328,"children":329},{},[330,335],{"type":40,"tag":242,"props":331,"children":332},{},[333],{"type":46,"value":334},"Timeout",{"type":40,"tag":242,"props":336,"children":337},{},[338],{"type":46,"value":339},"Must be ≤ frequency. k6-class checks: 1–180s. Protocol checks: 1–60s. Traceroute: fixed 30s",{"type":40,"tag":220,"props":341,"children":342},{},[343,348],{"type":40,"tag":242,"props":344,"children":345},{},[346],{"type":46,"value":347},"k6 version",{"type":40,"tag":242,"props":349,"children":350},{},[351,353,360,362,368,370,376],{"type":46,"value":352},"Checks run on a ",{"type":40,"tag":65,"props":354,"children":357},{"href":355,"rel":356},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fcreate-checks\u002Fmanage-k6-versions\u002F",[69],[358],{"type":46,"value":359},"k6 version channel",{"type":46,"value":361}," (new checks default to the latest stable channel; ",{"type":40,"tag":79,"props":363,"children":365},{"className":364},[],[366],{"type":46,"value":367},"v1.x",{"type":46,"value":369}," is deprecated as of July 2026). Pin per check via the UI dropdown or ",{"type":40,"tag":79,"props":371,"children":373},{"className":372},[],[374],{"type":46,"value":375},"channels",{"type":46,"value":377}," in API\u002FTerraform",{"type":40,"tag":220,"props":379,"children":380},{},[381,386],{"type":40,"tag":242,"props":382,"children":383},{},[384],{"type":46,"value":385},"Local files",{"type":40,"tag":242,"props":387,"children":388},{},[389,395,396,402,403,409,411,417],{"type":40,"tag":79,"props":390,"children":392},{"className":391},[],[393],{"type":46,"value":394},"open()",{"type":46,"value":147},{"type":40,"tag":79,"props":397,"children":399},{"className":398},[],[400],{"type":46,"value":401},"fs",{"type":46,"value":147},{"type":40,"tag":79,"props":404,"children":406},{"className":405},[],[407],{"type":46,"value":408},"grpc.load()",{"type":46,"value":410}," unsupported. Bundle local modules into the script; remote ",{"type":40,"tag":79,"props":412,"children":414},{"className":413},[],[415],{"type":46,"value":416},"https:\u002F\u002Fjslib.k6.io\u002F...",{"type":46,"value":418}," imports work",{"type":40,"tag":220,"props":420,"children":421},{},[422,427],{"type":40,"tag":242,"props":423,"children":424},{},[425],{"type":46,"value":426},"HTTP request errors",{"type":40,"tag":242,"props":428,"children":429},{},[430,432,438],{"type":46,"value":431},"SM runs k6 with ",{"type":40,"tag":79,"props":433,"children":435},{"className":434},[],[436],{"type":46,"value":437},"--throw",{"type":46,"value":439},": network-level request failures throw an exception and fail the execution",{"type":40,"tag":220,"props":441,"children":442},{},[443,448],{"type":40,"tag":242,"props":444,"children":445},{},[446],{"type":46,"value":447},"Script options SM honors",{"type":40,"tag":242,"props":449,"children":450},{},[451,453,459,461,467,468,474,475,481,482,488,489,495,496,502,503,509,510,516,517,523,524,530,531,537,538,544,545,551,552,558,559,565,566],{"type":46,"value":452},"SM sets its own CLI flags, which take precedence over the script's ",{"type":40,"tag":79,"props":454,"children":456},{"className":455},[],[457],{"type":46,"value":458},"options",{"type":46,"value":460}," object; the options that still take effect include ",{"type":40,"tag":79,"props":462,"children":464},{"className":463},[],[465],{"type":46,"value":466},"batch",{"type":46,"value":147},{"type":40,"tag":79,"props":469,"children":471},{"className":470},[],[472],{"type":46,"value":473},"batch-per-host",{"type":46,"value":147},{"type":40,"tag":79,"props":476,"children":478},{"className":477},[],[479],{"type":46,"value":480},"discardResponseBodies",{"type":46,"value":147},{"type":40,"tag":79,"props":483,"children":485},{"className":484},[],[486],{"type":46,"value":487},"httpDebug",{"type":46,"value":147},{"type":40,"tag":79,"props":490,"children":492},{"className":491},[],[493],{"type":46,"value":494},"insecureSkipTLSVerify",{"type":46,"value":147},{"type":40,"tag":79,"props":497,"children":499},{"className":498},[],[500],{"type":46,"value":501},"maxRedirects",{"type":46,"value":147},{"type":40,"tag":79,"props":504,"children":506},{"className":505},[],[507],{"type":46,"value":508},"noConnectionReuse",{"type":46,"value":147},{"type":40,"tag":79,"props":511,"children":513},{"className":512},[],[514],{"type":46,"value":515},"setupTimeout",{"type":46,"value":147},{"type":40,"tag":79,"props":518,"children":520},{"className":519},[],[521],{"type":46,"value":522},"systemTags",{"type":46,"value":147},{"type":40,"tag":79,"props":525,"children":527},{"className":526},[],[528],{"type":46,"value":529},"tags",{"type":46,"value":147},{"type":40,"tag":79,"props":532,"children":534},{"className":533},[],[535],{"type":46,"value":536},"teardownTimeout",{"type":46,"value":147},{"type":40,"tag":79,"props":539,"children":541},{"className":540},[],[542],{"type":46,"value":543},"throw",{"type":46,"value":147},{"type":40,"tag":79,"props":546,"children":548},{"className":547},[],[549],{"type":46,"value":550},"tlsAuth",{"type":46,"value":147},{"type":40,"tag":79,"props":553,"children":555},{"className":554},[],[556],{"type":46,"value":557},"tlsCipherSuites",{"type":46,"value":147},{"type":40,"tag":79,"props":560,"children":562},{"className":561},[],[563],{"type":46,"value":564},"tlsVersion",{"type":46,"value":147},{"type":40,"tag":79,"props":567,"children":569},{"className":568},[],[570],{"type":46,"value":571},"userAgent",{"type":40,"tag":220,"props":573,"children":574},{},[575,580],{"type":40,"tag":242,"props":576,"children":577},{},[578],{"type":46,"value":579},"Browser memory",{"type":40,"tag":242,"props":581,"children":582},{},[583,590,592],{"type":40,"tag":65,"props":584,"children":587},{"href":585,"rel":586},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fcreate-checks\u002Fchecks\u002Fk6-browser\u002F#public-probe-memory",[69],[588],{"type":46,"value":589},"1GB RAM per browser on public probes",{"type":46,"value":591}," — huge pages fail with ",{"type":40,"tag":79,"props":593,"children":595},{"className":594},[],[596],{"type":46,"value":597},"Target has crashed",{"type":40,"tag":220,"props":599,"children":600},{},[601,606],{"type":40,"tag":242,"props":602,"children":603},{},[604],{"type":46,"value":605},"Browser script format",{"type":40,"tag":242,"props":607,"children":608},{},[609],{"type":46,"value":610},"The UI rejects bundled\u002Fminified browser scripts (import validation) — deploy those via API or Terraform",{"type":40,"tag":87,"props":612,"children":614},{"id":613},"how-an-execution-fails-this-is-what-agents-get-wrong",[615],{"type":46,"value":616},"How an execution fails (this is what agents get wrong)",{"type":40,"tag":53,"props":618,"children":619},{},[620,626,628,633,635,641,643,649,651,657,659,664],{"type":40,"tag":79,"props":621,"children":623},{"className":622},[],[624],{"type":46,"value":625},"probe_success",{"type":46,"value":627}," (1\u002F0) is the uptime signal. An execution is marked ",{"type":40,"tag":57,"props":629,"children":630},{},[631],{"type":46,"value":632},"failed",{"type":46,"value":634}," when the\nscript throws an uncaught exception, calls ",{"type":40,"tag":79,"props":636,"children":638},{"className":637},[],[639],{"type":46,"value":640},"fail()",{"type":46,"value":642},", a k6-testing ",{"type":40,"tag":79,"props":644,"children":646},{"className":645},[],[647],{"type":46,"value":648},"expect()",{"type":46,"value":650}," assertion\nfails (it calls k6's ",{"type":40,"tag":79,"props":652,"children":654},{"className":653},[],[655],{"type":46,"value":656},"test.abort()",{"type":46,"value":658}," under the hood), an HTTP request errors at the\nnetwork level (SM's ",{"type":40,"tag":79,"props":660,"children":662},{"className":661},[],[663],{"type":46,"value":437},{"type":46,"value":665},"), or the timeout is hit.",{"type":40,"tag":53,"props":667,"children":668},{},[669,671,684,686,692,694,700],{"type":46,"value":670},"A ",{"type":40,"tag":57,"props":672,"children":673},{},[674,676,682],{"type":46,"value":675},"bare failed ",{"type":40,"tag":79,"props":677,"children":679},{"className":678},[],[680],{"type":46,"value":681},"check()",{"type":46,"value":683}," does NOT fail the execution",{"type":46,"value":685}," — it only records the\n",{"type":40,"tag":79,"props":687,"children":689},{"className":688},[],[690],{"type":46,"value":691},"probe_checks_total",{"type":46,"value":693}," \u002F ",{"type":40,"tag":79,"props":695,"children":697},{"className":696},[],[698],{"type":46,"value":699},"probe_check_success_rate",{"type":46,"value":701}," metrics. Checks don't affect k6's exit\nstatus without thresholds, and thresholds are disabled in SM.",{"type":40,"tag":53,"props":703,"children":704},{},[705],{"type":46,"value":706},"Assertion patterns, in order of preference:",{"type":40,"tag":708,"props":709,"children":714},"pre",{"className":710,"code":711,"language":712,"meta":713,"style":713},"language-javascript shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","import { expect } from 'https:\u002F\u002Fjslib.k6.io\u002Fk6-testing\u002F0.6.1\u002Findex.js';\nimport { check, fail } from 'k6';\n\n\u002F\u002F 1. PREFERRED — assertions module. Throws on failure => execution fails,\n\u002F\u002F    with a descriptive error in the check logs.\nexpect(res.status, 'login should succeed').toEqual(200);\nexpect(res.json('token')).toBeDefined();\n\n\u002F\u002F 2. Soft assertions — run all of them, still fail the execution at the end.\nexpect.soft(res.headers['Content-Type']).toContain('application\u002Fjson');\n\n\u002F\u002F 3. check() when you also want per-assertion metrics — but pair it with\n\u002F\u002F    fail() or the failure won't affect probe_success\u002Fuptime:\ncheck(res, { 'status 200': (r) => r.status === 200 }) ||\n  fail(`login failed with status ${res.status}`);\n","javascript","",[715],{"type":40,"tag":79,"props":716,"children":717},{"__ignoreMap":713},[718,773,824,834,844,853,928,989,997,1006,1088,1096,1105,1114,1212],{"type":40,"tag":719,"props":720,"children":723},"span",{"class":721,"line":722},"line",1,[724,730,736,742,747,752,757,763,768],{"type":40,"tag":719,"props":725,"children":727},{"style":726},"--shiki-light:#39ADB5;--shiki-light-font-style:italic;--shiki-default:#89DDFF;--shiki-default-font-style:italic;--shiki-dark:#89DDFF;--shiki-dark-font-style:italic",[728],{"type":46,"value":729},"import",{"type":40,"tag":719,"props":731,"children":733},{"style":732},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[734],{"type":46,"value":735}," {",{"type":40,"tag":719,"props":737,"children":739},{"style":738},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[740],{"type":46,"value":741}," expect",{"type":40,"tag":719,"props":743,"children":744},{"style":732},[745],{"type":46,"value":746}," }",{"type":40,"tag":719,"props":748,"children":749},{"style":726},[750],{"type":46,"value":751}," from",{"type":40,"tag":719,"props":753,"children":754},{"style":732},[755],{"type":46,"value":756}," '",{"type":40,"tag":719,"props":758,"children":760},{"style":759},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[761],{"type":46,"value":762},"https:\u002F\u002Fjslib.k6.io\u002Fk6-testing\u002F0.6.1\u002Findex.js",{"type":40,"tag":719,"props":764,"children":765},{"style":732},[766],{"type":46,"value":767},"'",{"type":40,"tag":719,"props":769,"children":770},{"style":732},[771],{"type":46,"value":772},";\n",{"type":40,"tag":719,"props":774,"children":776},{"class":721,"line":775},2,[777,781,785,790,795,800,804,808,812,816,820],{"type":40,"tag":719,"props":778,"children":779},{"style":726},[780],{"type":46,"value":729},{"type":40,"tag":719,"props":782,"children":783},{"style":732},[784],{"type":46,"value":735},{"type":40,"tag":719,"props":786,"children":787},{"style":738},[788],{"type":46,"value":789}," check",{"type":40,"tag":719,"props":791,"children":792},{"style":732},[793],{"type":46,"value":794},",",{"type":40,"tag":719,"props":796,"children":797},{"style":738},[798],{"type":46,"value":799}," fail",{"type":40,"tag":719,"props":801,"children":802},{"style":732},[803],{"type":46,"value":746},{"type":40,"tag":719,"props":805,"children":806},{"style":726},[807],{"type":46,"value":751},{"type":40,"tag":719,"props":809,"children":810},{"style":732},[811],{"type":46,"value":756},{"type":40,"tag":719,"props":813,"children":814},{"style":759},[815],{"type":46,"value":202},{"type":40,"tag":719,"props":817,"children":818},{"style":732},[819],{"type":46,"value":767},{"type":40,"tag":719,"props":821,"children":822},{"style":732},[823],{"type":46,"value":772},{"type":40,"tag":719,"props":825,"children":827},{"class":721,"line":826},3,[828],{"type":40,"tag":719,"props":829,"children":831},{"emptyLinePlaceholder":830},true,[832],{"type":46,"value":833},"\n",{"type":40,"tag":719,"props":835,"children":837},{"class":721,"line":836},4,[838],{"type":40,"tag":719,"props":839,"children":841},{"style":840},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#546E7A;--shiki-default-font-style:italic;--shiki-dark:#676E95;--shiki-dark-font-style:italic",[842],{"type":46,"value":843},"\u002F\u002F 1. PREFERRED — assertions module. Throws on failure => execution fails,\n",{"type":40,"tag":719,"props":845,"children":847},{"class":721,"line":846},5,[848],{"type":40,"tag":719,"props":849,"children":850},{"style":840},[851],{"type":46,"value":852},"\u002F\u002F    with a descriptive error in the check logs.\n",{"type":40,"tag":719,"props":854,"children":856},{"class":721,"line":855},6,[857,863,868,873,878,882,886,891,895,900,904,909,914,920,924],{"type":40,"tag":719,"props":858,"children":860},{"style":859},"--shiki-light:#6182B8;--shiki-default:#82AAFF;--shiki-dark:#82AAFF",[861],{"type":46,"value":862},"expect",{"type":40,"tag":719,"props":864,"children":865},{"style":738},[866],{"type":46,"value":867},"(res",{"type":40,"tag":719,"props":869,"children":870},{"style":732},[871],{"type":46,"value":872},".",{"type":40,"tag":719,"props":874,"children":875},{"style":738},[876],{"type":46,"value":877},"status",{"type":40,"tag":719,"props":879,"children":880},{"style":732},[881],{"type":46,"value":794},{"type":40,"tag":719,"props":883,"children":884},{"style":732},[885],{"type":46,"value":756},{"type":40,"tag":719,"props":887,"children":888},{"style":759},[889],{"type":46,"value":890},"login should succeed",{"type":40,"tag":719,"props":892,"children":893},{"style":732},[894],{"type":46,"value":767},{"type":40,"tag":719,"props":896,"children":897},{"style":738},[898],{"type":46,"value":899},")",{"type":40,"tag":719,"props":901,"children":902},{"style":732},[903],{"type":46,"value":872},{"type":40,"tag":719,"props":905,"children":906},{"style":859},[907],{"type":46,"value":908},"toEqual",{"type":40,"tag":719,"props":910,"children":911},{"style":738},[912],{"type":46,"value":913},"(",{"type":40,"tag":719,"props":915,"children":917},{"style":916},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[918],{"type":46,"value":919},"200",{"type":40,"tag":719,"props":921,"children":922},{"style":738},[923],{"type":46,"value":899},{"type":40,"tag":719,"props":925,"children":926},{"style":732},[927],{"type":46,"value":772},{"type":40,"tag":719,"props":929,"children":931},{"class":721,"line":930},7,[932,936,940,944,949,953,957,962,966,971,975,980,985],{"type":40,"tag":719,"props":933,"children":934},{"style":859},[935],{"type":46,"value":862},{"type":40,"tag":719,"props":937,"children":938},{"style":738},[939],{"type":46,"value":867},{"type":40,"tag":719,"props":941,"children":942},{"style":732},[943],{"type":46,"value":872},{"type":40,"tag":719,"props":945,"children":946},{"style":859},[947],{"type":46,"value":948},"json",{"type":40,"tag":719,"props":950,"children":951},{"style":738},[952],{"type":46,"value":913},{"type":40,"tag":719,"props":954,"children":955},{"style":732},[956],{"type":46,"value":767},{"type":40,"tag":719,"props":958,"children":959},{"style":759},[960],{"type":46,"value":961},"token",{"type":40,"tag":719,"props":963,"children":964},{"style":732},[965],{"type":46,"value":767},{"type":40,"tag":719,"props":967,"children":968},{"style":738},[969],{"type":46,"value":970},"))",{"type":40,"tag":719,"props":972,"children":973},{"style":732},[974],{"type":46,"value":872},{"type":40,"tag":719,"props":976,"children":977},{"style":859},[978],{"type":46,"value":979},"toBeDefined",{"type":40,"tag":719,"props":981,"children":982},{"style":738},[983],{"type":46,"value":984},"()",{"type":40,"tag":719,"props":986,"children":987},{"style":732},[988],{"type":46,"value":772},{"type":40,"tag":719,"props":990,"children":992},{"class":721,"line":991},8,[993],{"type":40,"tag":719,"props":994,"children":995},{"emptyLinePlaceholder":830},[996],{"type":46,"value":833},{"type":40,"tag":719,"props":998,"children":1000},{"class":721,"line":999},9,[1001],{"type":40,"tag":719,"props":1002,"children":1003},{"style":840},[1004],{"type":46,"value":1005},"\u002F\u002F 2. Soft assertions — run all of them, still fail the execution at the end.\n",{"type":40,"tag":719,"props":1007,"children":1009},{"class":721,"line":1008},10,[1010,1014,1018,1023,1027,1031,1036,1040,1045,1049,1054,1058,1063,1067,1071,1076,1080,1084],{"type":40,"tag":719,"props":1011,"children":1012},{"style":738},[1013],{"type":46,"value":862},{"type":40,"tag":719,"props":1015,"children":1016},{"style":732},[1017],{"type":46,"value":872},{"type":40,"tag":719,"props":1019,"children":1020},{"style":859},[1021],{"type":46,"value":1022},"soft",{"type":40,"tag":719,"props":1024,"children":1025},{"style":738},[1026],{"type":46,"value":867},{"type":40,"tag":719,"props":1028,"children":1029},{"style":732},[1030],{"type":46,"value":872},{"type":40,"tag":719,"props":1032,"children":1033},{"style":738},[1034],{"type":46,"value":1035},"headers[",{"type":40,"tag":719,"props":1037,"children":1038},{"style":732},[1039],{"type":46,"value":767},{"type":40,"tag":719,"props":1041,"children":1042},{"style":759},[1043],{"type":46,"value":1044},"Content-Type",{"type":40,"tag":719,"props":1046,"children":1047},{"style":732},[1048],{"type":46,"value":767},{"type":40,"tag":719,"props":1050,"children":1051},{"style":738},[1052],{"type":46,"value":1053},"])",{"type":40,"tag":719,"props":1055,"children":1056},{"style":732},[1057],{"type":46,"value":872},{"type":40,"tag":719,"props":1059,"children":1060},{"style":859},[1061],{"type":46,"value":1062},"toContain",{"type":40,"tag":719,"props":1064,"children":1065},{"style":738},[1066],{"type":46,"value":913},{"type":40,"tag":719,"props":1068,"children":1069},{"style":732},[1070],{"type":46,"value":767},{"type":40,"tag":719,"props":1072,"children":1073},{"style":759},[1074],{"type":46,"value":1075},"application\u002Fjson",{"type":40,"tag":719,"props":1077,"children":1078},{"style":732},[1079],{"type":46,"value":767},{"type":40,"tag":719,"props":1081,"children":1082},{"style":738},[1083],{"type":46,"value":899},{"type":40,"tag":719,"props":1085,"children":1086},{"style":732},[1087],{"type":46,"value":772},{"type":40,"tag":719,"props":1089,"children":1091},{"class":721,"line":1090},11,[1092],{"type":40,"tag":719,"props":1093,"children":1094},{"emptyLinePlaceholder":830},[1095],{"type":46,"value":833},{"type":40,"tag":719,"props":1097,"children":1099},{"class":721,"line":1098},12,[1100],{"type":40,"tag":719,"props":1101,"children":1102},{"style":840},[1103],{"type":46,"value":1104},"\u002F\u002F 3. check() when you also want per-assertion metrics — but pair it with\n",{"type":40,"tag":719,"props":1106,"children":1108},{"class":721,"line":1107},13,[1109],{"type":40,"tag":719,"props":1110,"children":1111},{"style":840},[1112],{"type":46,"value":1113},"\u002F\u002F    fail() or the failure won't affect probe_success\u002Fuptime:\n",{"type":40,"tag":719,"props":1115,"children":1117},{"class":721,"line":1116},14,[1118,1122,1126,1130,1134,1138,1144,1148,1153,1158,1164,1168,1174,1179,1183,1188,1193,1198,1202,1207],{"type":40,"tag":719,"props":1119,"children":1120},{"style":859},[1121],{"type":46,"value":145},{"type":40,"tag":719,"props":1123,"children":1124},{"style":738},[1125],{"type":46,"value":867},{"type":40,"tag":719,"props":1127,"children":1128},{"style":732},[1129],{"type":46,"value":794},{"type":40,"tag":719,"props":1131,"children":1132},{"style":732},[1133],{"type":46,"value":735},{"type":40,"tag":719,"props":1135,"children":1136},{"style":732},[1137],{"type":46,"value":756},{"type":40,"tag":719,"props":1139,"children":1141},{"style":1140},"--shiki-light:#E53935;--shiki-default:#F07178;--shiki-dark:#F07178",[1142],{"type":46,"value":1143},"status 200",{"type":40,"tag":719,"props":1145,"children":1146},{"style":732},[1147],{"type":46,"value":767},{"type":40,"tag":719,"props":1149,"children":1150},{"style":732},[1151],{"type":46,"value":1152},":",{"type":40,"tag":719,"props":1154,"children":1155},{"style":732},[1156],{"type":46,"value":1157}," (",{"type":40,"tag":719,"props":1159,"children":1161},{"style":1160},"--shiki-light:#90A4AE;--shiki-light-font-style:italic;--shiki-default:#EEFFFF;--shiki-default-font-style:italic;--shiki-dark:#BABED8;--shiki-dark-font-style:italic",[1162],{"type":46,"value":1163},"r",{"type":40,"tag":719,"props":1165,"children":1166},{"style":732},[1167],{"type":46,"value":899},{"type":40,"tag":719,"props":1169,"children":1171},{"style":1170},"--shiki-light:#9C3EDA;--shiki-default:#C792EA;--shiki-dark:#C792EA",[1172],{"type":46,"value":1173}," =>",{"type":40,"tag":719,"props":1175,"children":1176},{"style":738},[1177],{"type":46,"value":1178}," r",{"type":40,"tag":719,"props":1180,"children":1181},{"style":732},[1182],{"type":46,"value":872},{"type":40,"tag":719,"props":1184,"children":1185},{"style":738},[1186],{"type":46,"value":1187},"status ",{"type":40,"tag":719,"props":1189,"children":1190},{"style":732},[1191],{"type":46,"value":1192},"===",{"type":40,"tag":719,"props":1194,"children":1195},{"style":916},[1196],{"type":46,"value":1197}," 200",{"type":40,"tag":719,"props":1199,"children":1200},{"style":732},[1201],{"type":46,"value":746},{"type":40,"tag":719,"props":1203,"children":1204},{"style":738},[1205],{"type":46,"value":1206},") ",{"type":40,"tag":719,"props":1208,"children":1209},{"style":732},[1210],{"type":46,"value":1211},"||\n",{"type":40,"tag":719,"props":1213,"children":1215},{"class":721,"line":1214},15,[1216,1221,1225,1230,1235,1240,1245,1249,1253,1258,1262],{"type":40,"tag":719,"props":1217,"children":1218},{"style":859},[1219],{"type":46,"value":1220},"  fail",{"type":40,"tag":719,"props":1222,"children":1223},{"style":738},[1224],{"type":46,"value":913},{"type":40,"tag":719,"props":1226,"children":1227},{"style":732},[1228],{"type":46,"value":1229},"`",{"type":40,"tag":719,"props":1231,"children":1232},{"style":759},[1233],{"type":46,"value":1234},"login failed with status ",{"type":40,"tag":719,"props":1236,"children":1237},{"style":732},[1238],{"type":46,"value":1239},"${",{"type":40,"tag":719,"props":1241,"children":1242},{"style":738},[1243],{"type":46,"value":1244},"res",{"type":40,"tag":719,"props":1246,"children":1247},{"style":732},[1248],{"type":46,"value":872},{"type":40,"tag":719,"props":1250,"children":1251},{"style":738},[1252],{"type":46,"value":877},{"type":40,"tag":719,"props":1254,"children":1255},{"style":732},[1256],{"type":46,"value":1257},"}`",{"type":40,"tag":719,"props":1259,"children":1260},{"style":738},[1261],{"type":46,"value":899},{"type":40,"tag":719,"props":1263,"children":1264},{"style":732},[1265],{"type":46,"value":772},{"type":40,"tag":53,"props":1267,"children":1268},{},[1269,1271,1276,1278,1283],{"type":46,"value":1270},"Name every assertion (the message argument \u002F check name): the name is what you see in\ncheck logs and in the ",{"type":40,"tag":79,"props":1272,"children":1274},{"className":1273},[],[1275],{"type":46,"value":145},{"type":46,"value":1277}," label of ",{"type":40,"tag":79,"props":1279,"children":1281},{"className":1280},[],[1282],{"type":46,"value":691},{"type":46,"value":1284}," when diagnosing a failure\nat 3am.",{"type":40,"tag":87,"props":1286,"children":1288},{"id":1287},"choose-the-simplest-sufficient-check-type-first",[1289],{"type":46,"value":1290},"Choose the simplest sufficient check type first",{"type":40,"tag":53,"props":1292,"children":1293},{},[1294],{"type":46,"value":1295},"Cheaper for the customer, easier to maintain. Work down this list and stop at the first\nmatch:",{"type":40,"tag":1297,"props":1298,"children":1299},"ol",{},[1300,1329,1354,1364],{"type":40,"tag":1301,"props":1302,"children":1303},"li",{},[1304,1309,1311,1317,1319,1328],{"type":40,"tag":57,"props":1305,"children":1306},{},[1307],{"type":46,"value":1308},"HTTP \u002F ping \u002F DNS \u002F TCP \u002F traceroute \u002F gRPC",{"type":46,"value":1310}," — a single static endpoint (uptime,\nstatus code, body regex, TLS cert expiry, record resolution, port reachability). No\nscript to maintain — these run on the blackbox-exporter probe engine, and Terraform\nexamples with per-type ",{"type":40,"tag":79,"props":1312,"children":1314},{"className":1313},[],[1315],{"type":46,"value":1316},"target",{"type":46,"value":1318}," formats are in\n",{"type":40,"tag":65,"props":1320,"children":1322},{"href":1321},"references\u002Fapi-and-terraform.md",[1323],{"type":40,"tag":79,"props":1324,"children":1326},{"className":1325},[],[1327],{"type":46,"value":1321},{"type":46,"value":872},{"type":40,"tag":1301,"props":1330,"children":1331},{},[1332,1337,1339,1345,1347,1352],{"type":40,"tag":57,"props":1333,"children":1334},{},[1335],{"type":46,"value":1336},"MultiHTTP",{"type":46,"value":1338}," — a sequence of HTTP requests with value-passing between them\n(",{"type":40,"tag":79,"props":1340,"children":1342},{"className":1341},[],[1343],{"type":46,"value":1344},"${variable}",{"type":46,"value":1346}," capture), but no custom logic. ",{"type":40,"tag":57,"props":1348,"children":1349},{},[1350],{"type":46,"value":1351},"Caution",{"type":46,"value":1353},": MultiHTTP does not\nauto-validate status codes — define assertions per request or failures won't affect\nuptime.",{"type":40,"tag":1301,"props":1355,"children":1356},{},[1357,1362],{"type":40,"tag":57,"props":1358,"children":1359},{},[1360],{"type":46,"value":1361},"k6 scripted",{"type":46,"value":1363}," — an API flow needing real logic: crypto\u002Fsigning, conditional\nbranching, generated test data, WebSockets, response-driven chaining.",{"type":40,"tag":1301,"props":1365,"children":1366},{},[1367,1372],{"type":40,"tag":57,"props":1368,"children":1369},{},[1370],{"type":46,"value":1371},"k6 browser",{"type":46,"value":1373}," — only when you need a real browser: JS-rendered user journeys,\nforms\u002Fclicks, Core Web Vitals.",{"type":40,"tag":53,"props":1375,"children":1376},{},[1377,1382,1384,1390],{"type":40,"tag":57,"props":1378,"children":1379},{},[1380],{"type":46,"value":1381},"Cost model",{"type":46,"value":1383}," (execution-based billing): an execution is one check run on one probe,\nmetered per minute of runtime rounded up. Per month:\n",{"type":40,"tag":79,"props":1385,"children":1387},{"className":1386},[],[1388],{"type":46,"value":1389},"probes × duration_minutes × (43200 \u002F frequency_minutes)",{"type":46,"value":1391},". API test executions (HTTP,\nping, DNS, TCP, traceroute, MultiHTTP, scripted) and browser test executions are billed\nseparately — browser checks are the expensive tier. A browser check on 3 probes every\nminute is ~129,600 browser executions\u002Fmonth; the same check every 5 minutes is ~25,920.\nPick the longest frequency that still meets your detection-time goal, and 2–3 probes\nnear your users (multiple probes reduce alert flapping; more isn't better).",{"type":40,"tag":87,"props":1393,"children":1395},{"id":1394},"scripted-check-authoring",[1396],{"type":46,"value":1397},"Scripted check authoring",{"type":40,"tag":53,"props":1399,"children":1400},{},[1401],{"type":46,"value":1402},"Skeleton — a login + API action journey with secrets and hard-failing assertions:",{"type":40,"tag":708,"props":1404,"children":1406},{"className":710,"code":1405,"language":712,"meta":713,"style":713},"import http from 'k6\u002Fhttp';\nimport { expect } from 'https:\u002F\u002Fjslib.k6.io\u002Fk6-testing\u002F0.6.1\u002Findex.js';\nimport secrets from 'k6\u002Fsecrets';\n\nconst BASE = 'https:\u002F\u002Fapi.example.com';\n\nexport default async function () {\n  \u002F\u002F Secrets are managed in Synthetics > Config > Secrets — never hardcode credentials.\n  const password = await secrets.get('checkout-monitor-password');\n\n  \u002F\u002F Step 1: authenticate with a dedicated monitoring account\n  const login = http.post(\n    `${BASE}\u002Fauth\u002Flogin`,\n    JSON.stringify({ user: 'sm-checkout-monitor', password }),\n    { headers: { 'Content-Type': 'application\u002Fjson' } }\n  );\n  expect(login.status, 'login should return 200').toEqual(200);\n  const token = login.json('token');\n  expect(token, 'auth token should be present').toBeDefined();\n\n  \u002F\u002F Step 2: exercise the journey and assert the OUTCOME, not just the status\n  const order = http.post(`${BASE}\u002Forders`, JSON.stringify({ sku: 'TEST-SKU-1', qty: 1 }), {\n    headers: { 'Content-Type': 'application\u002Fjson', Authorization: `Bearer ${token}` },\n  });\n  expect(order.status, 'order should be created').toEqual(201);\n  const orderId = order.json('id');\n  expect(orderId, 'order id should be returned').toBeDefined();\n\n  \u002F\u002F Step 3: clean up so the check is idempotent against production\n  \u002F\u002F http.url groups metrics for URLs containing unique IDs — without it, every\n  \u002F\u002F execution creates new time series (cardinality + active-series cost).\n  const del = http.del(http.url`${BASE}\u002Forders\u002F${orderId}`, null, {\n    headers: { Authorization: `Bearer ${token}` },\n  });\n  expect(del.status, 'test order should be cleaned up').toEqual(204);\n}\n",[1407],{"type":40,"tag":79,"props":1408,"children":1409},{"__ignoreMap":713},[1410,1444,1483,1516,1523,1558,1565,1598,1606,1668,1675,1683,1718,1750,1818,1876,1888,1959,2012,2065,2073,2082,2218,2303,2320,2391,2445,2499,2507,2516,2525,2534,2624,2672,2688,2758],{"type":40,"tag":719,"props":1411,"children":1412},{"class":721,"line":722},[1413,1417,1422,1427,1431,1436,1440],{"type":40,"tag":719,"props":1414,"children":1415},{"style":726},[1416],{"type":46,"value":729},{"type":40,"tag":719,"props":1418,"children":1419},{"style":738},[1420],{"type":46,"value":1421}," http ",{"type":40,"tag":719,"props":1423,"children":1424},{"style":726},[1425],{"type":46,"value":1426},"from",{"type":40,"tag":719,"props":1428,"children":1429},{"style":732},[1430],{"type":46,"value":756},{"type":40,"tag":719,"props":1432,"children":1433},{"style":759},[1434],{"type":46,"value":1435},"k6\u002Fhttp",{"type":40,"tag":719,"props":1437,"children":1438},{"style":732},[1439],{"type":46,"value":767},{"type":40,"tag":719,"props":1441,"children":1442},{"style":732},[1443],{"type":46,"value":772},{"type":40,"tag":719,"props":1445,"children":1446},{"class":721,"line":775},[1447,1451,1455,1459,1463,1467,1471,1475,1479],{"type":40,"tag":719,"props":1448,"children":1449},{"style":726},[1450],{"type":46,"value":729},{"type":40,"tag":719,"props":1452,"children":1453},{"style":732},[1454],{"type":46,"value":735},{"type":40,"tag":719,"props":1456,"children":1457},{"style":738},[1458],{"type":46,"value":741},{"type":40,"tag":719,"props":1460,"children":1461},{"style":732},[1462],{"type":46,"value":746},{"type":40,"tag":719,"props":1464,"children":1465},{"style":726},[1466],{"type":46,"value":751},{"type":40,"tag":719,"props":1468,"children":1469},{"style":732},[1470],{"type":46,"value":756},{"type":40,"tag":719,"props":1472,"children":1473},{"style":759},[1474],{"type":46,"value":762},{"type":40,"tag":719,"props":1476,"children":1477},{"style":732},[1478],{"type":46,"value":767},{"type":40,"tag":719,"props":1480,"children":1481},{"style":732},[1482],{"type":46,"value":772},{"type":40,"tag":719,"props":1484,"children":1485},{"class":721,"line":826},[1486,1490,1495,1499,1503,1508,1512],{"type":40,"tag":719,"props":1487,"children":1488},{"style":726},[1489],{"type":46,"value":729},{"type":40,"tag":719,"props":1491,"children":1492},{"style":738},[1493],{"type":46,"value":1494}," secrets ",{"type":40,"tag":719,"props":1496,"children":1497},{"style":726},[1498],{"type":46,"value":1426},{"type":40,"tag":719,"props":1500,"children":1501},{"style":732},[1502],{"type":46,"value":756},{"type":40,"tag":719,"props":1504,"children":1505},{"style":759},[1506],{"type":46,"value":1507},"k6\u002Fsecrets",{"type":40,"tag":719,"props":1509,"children":1510},{"style":732},[1511],{"type":46,"value":767},{"type":40,"tag":719,"props":1513,"children":1514},{"style":732},[1515],{"type":46,"value":772},{"type":40,"tag":719,"props":1517,"children":1518},{"class":721,"line":836},[1519],{"type":40,"tag":719,"props":1520,"children":1521},{"emptyLinePlaceholder":830},[1522],{"type":46,"value":833},{"type":40,"tag":719,"props":1524,"children":1525},{"class":721,"line":846},[1526,1531,1536,1541,1545,1550,1554],{"type":40,"tag":719,"props":1527,"children":1528},{"style":1170},[1529],{"type":46,"value":1530},"const",{"type":40,"tag":719,"props":1532,"children":1533},{"style":738},[1534],{"type":46,"value":1535}," BASE ",{"type":40,"tag":719,"props":1537,"children":1538},{"style":732},[1539],{"type":46,"value":1540},"=",{"type":40,"tag":719,"props":1542,"children":1543},{"style":732},[1544],{"type":46,"value":756},{"type":40,"tag":719,"props":1546,"children":1547},{"style":759},[1548],{"type":46,"value":1549},"https:\u002F\u002Fapi.example.com",{"type":40,"tag":719,"props":1551,"children":1552},{"style":732},[1553],{"type":46,"value":767},{"type":40,"tag":719,"props":1555,"children":1556},{"style":732},[1557],{"type":46,"value":772},{"type":40,"tag":719,"props":1559,"children":1560},{"class":721,"line":855},[1561],{"type":40,"tag":719,"props":1562,"children":1563},{"emptyLinePlaceholder":830},[1564],{"type":46,"value":833},{"type":40,"tag":719,"props":1566,"children":1567},{"class":721,"line":930},[1568,1573,1578,1583,1588,1593],{"type":40,"tag":719,"props":1569,"children":1570},{"style":726},[1571],{"type":46,"value":1572},"export",{"type":40,"tag":719,"props":1574,"children":1575},{"style":726},[1576],{"type":46,"value":1577}," default",{"type":40,"tag":719,"props":1579,"children":1580},{"style":1170},[1581],{"type":46,"value":1582}," async",{"type":40,"tag":719,"props":1584,"children":1585},{"style":1170},[1586],{"type":46,"value":1587}," function",{"type":40,"tag":719,"props":1589,"children":1590},{"style":732},[1591],{"type":46,"value":1592}," ()",{"type":40,"tag":719,"props":1594,"children":1595},{"style":732},[1596],{"type":46,"value":1597}," {\n",{"type":40,"tag":719,"props":1599,"children":1600},{"class":721,"line":991},[1601],{"type":40,"tag":719,"props":1602,"children":1603},{"style":840},[1604],{"type":46,"value":1605},"  \u002F\u002F Secrets are managed in Synthetics > Config > Secrets — never hardcode credentials.\n",{"type":40,"tag":719,"props":1607,"children":1608},{"class":721,"line":999},[1609,1614,1619,1624,1629,1634,1638,1643,1647,1651,1656,1660,1664],{"type":40,"tag":719,"props":1610,"children":1611},{"style":1170},[1612],{"type":46,"value":1613},"  const",{"type":40,"tag":719,"props":1615,"children":1616},{"style":738},[1617],{"type":46,"value":1618}," password",{"type":40,"tag":719,"props":1620,"children":1621},{"style":732},[1622],{"type":46,"value":1623}," =",{"type":40,"tag":719,"props":1625,"children":1626},{"style":726},[1627],{"type":46,"value":1628}," await",{"type":40,"tag":719,"props":1630,"children":1631},{"style":738},[1632],{"type":46,"value":1633}," secrets",{"type":40,"tag":719,"props":1635,"children":1636},{"style":732},[1637],{"type":46,"value":872},{"type":40,"tag":719,"props":1639,"children":1640},{"style":859},[1641],{"type":46,"value":1642},"get",{"type":40,"tag":719,"props":1644,"children":1645},{"style":1140},[1646],{"type":46,"value":913},{"type":40,"tag":719,"props":1648,"children":1649},{"style":732},[1650],{"type":46,"value":767},{"type":40,"tag":719,"props":1652,"children":1653},{"style":759},[1654],{"type":46,"value":1655},"checkout-monitor-password",{"type":40,"tag":719,"props":1657,"children":1658},{"style":732},[1659],{"type":46,"value":767},{"type":40,"tag":719,"props":1661,"children":1662},{"style":1140},[1663],{"type":46,"value":899},{"type":40,"tag":719,"props":1665,"children":1666},{"style":732},[1667],{"type":46,"value":772},{"type":40,"tag":719,"props":1669,"children":1670},{"class":721,"line":1008},[1671],{"type":40,"tag":719,"props":1672,"children":1673},{"emptyLinePlaceholder":830},[1674],{"type":46,"value":833},{"type":40,"tag":719,"props":1676,"children":1677},{"class":721,"line":1090},[1678],{"type":40,"tag":719,"props":1679,"children":1680},{"style":840},[1681],{"type":46,"value":1682},"  \u002F\u002F Step 1: authenticate with a dedicated monitoring account\n",{"type":40,"tag":719,"props":1684,"children":1685},{"class":721,"line":1098},[1686,1690,1695,1699,1704,1708,1713],{"type":40,"tag":719,"props":1687,"children":1688},{"style":1170},[1689],{"type":46,"value":1613},{"type":40,"tag":719,"props":1691,"children":1692},{"style":738},[1693],{"type":46,"value":1694}," login",{"type":40,"tag":719,"props":1696,"children":1697},{"style":732},[1698],{"type":46,"value":1623},{"type":40,"tag":719,"props":1700,"children":1701},{"style":738},[1702],{"type":46,"value":1703}," http",{"type":40,"tag":719,"props":1705,"children":1706},{"style":732},[1707],{"type":46,"value":872},{"type":40,"tag":719,"props":1709,"children":1710},{"style":859},[1711],{"type":46,"value":1712},"post",{"type":40,"tag":719,"props":1714,"children":1715},{"style":1140},[1716],{"type":46,"value":1717},"(\n",{"type":40,"tag":719,"props":1719,"children":1720},{"class":721,"line":1107},[1721,1726,1731,1736,1741,1745],{"type":40,"tag":719,"props":1722,"children":1723},{"style":732},[1724],{"type":46,"value":1725},"    `${",{"type":40,"tag":719,"props":1727,"children":1728},{"style":738},[1729],{"type":46,"value":1730},"BASE",{"type":40,"tag":719,"props":1732,"children":1733},{"style":732},[1734],{"type":46,"value":1735},"}",{"type":40,"tag":719,"props":1737,"children":1738},{"style":759},[1739],{"type":46,"value":1740},"\u002Fauth\u002Flogin",{"type":40,"tag":719,"props":1742,"children":1743},{"style":732},[1744],{"type":46,"value":1229},{"type":40,"tag":719,"props":1746,"children":1747},{"style":732},[1748],{"type":46,"value":1749},",\n",{"type":40,"tag":719,"props":1751,"children":1752},{"class":721,"line":1116},[1753,1758,1762,1767,1771,1776,1781,1785,1789,1794,1798,1802,1806,1810,1814],{"type":40,"tag":719,"props":1754,"children":1755},{"style":738},[1756],{"type":46,"value":1757},"    JSON",{"type":40,"tag":719,"props":1759,"children":1760},{"style":732},[1761],{"type":46,"value":872},{"type":40,"tag":719,"props":1763,"children":1764},{"style":859},[1765],{"type":46,"value":1766},"stringify",{"type":40,"tag":719,"props":1768,"children":1769},{"style":1140},[1770],{"type":46,"value":913},{"type":40,"tag":719,"props":1772,"children":1773},{"style":732},[1774],{"type":46,"value":1775},"{",{"type":40,"tag":719,"props":1777,"children":1778},{"style":1140},[1779],{"type":46,"value":1780}," user",{"type":40,"tag":719,"props":1782,"children":1783},{"style":732},[1784],{"type":46,"value":1152},{"type":40,"tag":719,"props":1786,"children":1787},{"style":732},[1788],{"type":46,"value":756},{"type":40,"tag":719,"props":1790,"children":1791},{"style":759},[1792],{"type":46,"value":1793},"sm-checkout-monitor",{"type":40,"tag":719,"props":1795,"children":1796},{"style":732},[1797],{"type":46,"value":767},{"type":40,"tag":719,"props":1799,"children":1800},{"style":732},[1801],{"type":46,"value":794},{"type":40,"tag":719,"props":1803,"children":1804},{"style":738},[1805],{"type":46,"value":1618},{"type":40,"tag":719,"props":1807,"children":1808},{"style":732},[1809],{"type":46,"value":746},{"type":40,"tag":719,"props":1811,"children":1812},{"style":1140},[1813],{"type":46,"value":899},{"type":40,"tag":719,"props":1815,"children":1816},{"style":732},[1817],{"type":46,"value":1749},{"type":40,"tag":719,"props":1819,"children":1820},{"class":721,"line":1214},[1821,1826,1831,1835,1839,1843,1847,1851,1855,1859,1863,1867,1871],{"type":40,"tag":719,"props":1822,"children":1823},{"style":732},[1824],{"type":46,"value":1825},"    {",{"type":40,"tag":719,"props":1827,"children":1828},{"style":1140},[1829],{"type":46,"value":1830}," headers",{"type":40,"tag":719,"props":1832,"children":1833},{"style":732},[1834],{"type":46,"value":1152},{"type":40,"tag":719,"props":1836,"children":1837},{"style":732},[1838],{"type":46,"value":735},{"type":40,"tag":719,"props":1840,"children":1841},{"style":732},[1842],{"type":46,"value":756},{"type":40,"tag":719,"props":1844,"children":1845},{"style":1140},[1846],{"type":46,"value":1044},{"type":40,"tag":719,"props":1848,"children":1849},{"style":732},[1850],{"type":46,"value":767},{"type":40,"tag":719,"props":1852,"children":1853},{"style":732},[1854],{"type":46,"value":1152},{"type":40,"tag":719,"props":1856,"children":1857},{"style":732},[1858],{"type":46,"value":756},{"type":40,"tag":719,"props":1860,"children":1861},{"style":759},[1862],{"type":46,"value":1075},{"type":40,"tag":719,"props":1864,"children":1865},{"style":732},[1866],{"type":46,"value":767},{"type":40,"tag":719,"props":1868,"children":1869},{"style":732},[1870],{"type":46,"value":746},{"type":40,"tag":719,"props":1872,"children":1873},{"style":732},[1874],{"type":46,"value":1875}," }\n",{"type":40,"tag":719,"props":1877,"children":1878},{"class":721,"line":27},[1879,1884],{"type":40,"tag":719,"props":1880,"children":1881},{"style":1140},[1882],{"type":46,"value":1883},"  )",{"type":40,"tag":719,"props":1885,"children":1886},{"style":732},[1887],{"type":46,"value":772},{"type":40,"tag":719,"props":1889,"children":1891},{"class":721,"line":1890},17,[1892,1897,1901,1906,1910,1914,1918,1922,1927,1931,1935,1939,1943,1947,1951,1955],{"type":40,"tag":719,"props":1893,"children":1894},{"style":859},[1895],{"type":46,"value":1896},"  expect",{"type":40,"tag":719,"props":1898,"children":1899},{"style":1140},[1900],{"type":46,"value":913},{"type":40,"tag":719,"props":1902,"children":1903},{"style":738},[1904],{"type":46,"value":1905},"login",{"type":40,"tag":719,"props":1907,"children":1908},{"style":732},[1909],{"type":46,"value":872},{"type":40,"tag":719,"props":1911,"children":1912},{"style":738},[1913],{"type":46,"value":877},{"type":40,"tag":719,"props":1915,"children":1916},{"style":732},[1917],{"type":46,"value":794},{"type":40,"tag":719,"props":1919,"children":1920},{"style":732},[1921],{"type":46,"value":756},{"type":40,"tag":719,"props":1923,"children":1924},{"style":759},[1925],{"type":46,"value":1926},"login should return 200",{"type":40,"tag":719,"props":1928,"children":1929},{"style":732},[1930],{"type":46,"value":767},{"type":40,"tag":719,"props":1932,"children":1933},{"style":1140},[1934],{"type":46,"value":899},{"type":40,"tag":719,"props":1936,"children":1937},{"style":732},[1938],{"type":46,"value":872},{"type":40,"tag":719,"props":1940,"children":1941},{"style":859},[1942],{"type":46,"value":908},{"type":40,"tag":719,"props":1944,"children":1945},{"style":1140},[1946],{"type":46,"value":913},{"type":40,"tag":719,"props":1948,"children":1949},{"style":916},[1950],{"type":46,"value":919},{"type":40,"tag":719,"props":1952,"children":1953},{"style":1140},[1954],{"type":46,"value":899},{"type":40,"tag":719,"props":1956,"children":1957},{"style":732},[1958],{"type":46,"value":772},{"type":40,"tag":719,"props":1960,"children":1962},{"class":721,"line":1961},18,[1963,1967,1972,1976,1980,1984,1988,1992,1996,2000,2004,2008],{"type":40,"tag":719,"props":1964,"children":1965},{"style":1170},[1966],{"type":46,"value":1613},{"type":40,"tag":719,"props":1968,"children":1969},{"style":738},[1970],{"type":46,"value":1971}," token",{"type":40,"tag":719,"props":1973,"children":1974},{"style":732},[1975],{"type":46,"value":1623},{"type":40,"tag":719,"props":1977,"children":1978},{"style":738},[1979],{"type":46,"value":1694},{"type":40,"tag":719,"props":1981,"children":1982},{"style":732},[1983],{"type":46,"value":872},{"type":40,"tag":719,"props":1985,"children":1986},{"style":859},[1987],{"type":46,"value":948},{"type":40,"tag":719,"props":1989,"children":1990},{"style":1140},[1991],{"type":46,"value":913},{"type":40,"tag":719,"props":1993,"children":1994},{"style":732},[1995],{"type":46,"value":767},{"type":40,"tag":719,"props":1997,"children":1998},{"style":759},[1999],{"type":46,"value":961},{"type":40,"tag":719,"props":2001,"children":2002},{"style":732},[2003],{"type":46,"value":767},{"type":40,"tag":719,"props":2005,"children":2006},{"style":1140},[2007],{"type":46,"value":899},{"type":40,"tag":719,"props":2009,"children":2010},{"style":732},[2011],{"type":46,"value":772},{"type":40,"tag":719,"props":2013,"children":2015},{"class":721,"line":2014},19,[2016,2020,2024,2028,2032,2036,2041,2045,2049,2053,2057,2061],{"type":40,"tag":719,"props":2017,"children":2018},{"style":859},[2019],{"type":46,"value":1896},{"type":40,"tag":719,"props":2021,"children":2022},{"style":1140},[2023],{"type":46,"value":913},{"type":40,"tag":719,"props":2025,"children":2026},{"style":738},[2027],{"type":46,"value":961},{"type":40,"tag":719,"props":2029,"children":2030},{"style":732},[2031],{"type":46,"value":794},{"type":40,"tag":719,"props":2033,"children":2034},{"style":732},[2035],{"type":46,"value":756},{"type":40,"tag":719,"props":2037,"children":2038},{"style":759},[2039],{"type":46,"value":2040},"auth token should be present",{"type":40,"tag":719,"props":2042,"children":2043},{"style":732},[2044],{"type":46,"value":767},{"type":40,"tag":719,"props":2046,"children":2047},{"style":1140},[2048],{"type":46,"value":899},{"type":40,"tag":719,"props":2050,"children":2051},{"style":732},[2052],{"type":46,"value":872},{"type":40,"tag":719,"props":2054,"children":2055},{"style":859},[2056],{"type":46,"value":979},{"type":40,"tag":719,"props":2058,"children":2059},{"style":1140},[2060],{"type":46,"value":984},{"type":40,"tag":719,"props":2062,"children":2063},{"style":732},[2064],{"type":46,"value":772},{"type":40,"tag":719,"props":2066,"children":2068},{"class":721,"line":2067},20,[2069],{"type":40,"tag":719,"props":2070,"children":2071},{"emptyLinePlaceholder":830},[2072],{"type":46,"value":833},{"type":40,"tag":719,"props":2074,"children":2076},{"class":721,"line":2075},21,[2077],{"type":40,"tag":719,"props":2078,"children":2079},{"style":840},[2080],{"type":46,"value":2081},"  \u002F\u002F Step 2: exercise the journey and assert the OUTCOME, not just the status\n",{"type":40,"tag":719,"props":2083,"children":2085},{"class":721,"line":2084},22,[2086,2090,2095,2099,2103,2107,2111,2115,2120,2124,2128,2133,2137,2141,2146,2150,2154,2158,2162,2167,2171,2175,2180,2184,2188,2193,2197,2202,2206,2210,2214],{"type":40,"tag":719,"props":2087,"children":2088},{"style":1170},[2089],{"type":46,"value":1613},{"type":40,"tag":719,"props":2091,"children":2092},{"style":738},[2093],{"type":46,"value":2094}," order",{"type":40,"tag":719,"props":2096,"children":2097},{"style":732},[2098],{"type":46,"value":1623},{"type":40,"tag":719,"props":2100,"children":2101},{"style":738},[2102],{"type":46,"value":1703},{"type":40,"tag":719,"props":2104,"children":2105},{"style":732},[2106],{"type":46,"value":872},{"type":40,"tag":719,"props":2108,"children":2109},{"style":859},[2110],{"type":46,"value":1712},{"type":40,"tag":719,"props":2112,"children":2113},{"style":1140},[2114],{"type":46,"value":913},{"type":40,"tag":719,"props":2116,"children":2117},{"style":732},[2118],{"type":46,"value":2119},"`${",{"type":40,"tag":719,"props":2121,"children":2122},{"style":738},[2123],{"type":46,"value":1730},{"type":40,"tag":719,"props":2125,"children":2126},{"style":732},[2127],{"type":46,"value":1735},{"type":40,"tag":719,"props":2129,"children":2130},{"style":759},[2131],{"type":46,"value":2132},"\u002Forders",{"type":40,"tag":719,"props":2134,"children":2135},{"style":732},[2136],{"type":46,"value":1229},{"type":40,"tag":719,"props":2138,"children":2139},{"style":732},[2140],{"type":46,"value":794},{"type":40,"tag":719,"props":2142,"children":2143},{"style":738},[2144],{"type":46,"value":2145}," JSON",{"type":40,"tag":719,"props":2147,"children":2148},{"style":732},[2149],{"type":46,"value":872},{"type":40,"tag":719,"props":2151,"children":2152},{"style":859},[2153],{"type":46,"value":1766},{"type":40,"tag":719,"props":2155,"children":2156},{"style":1140},[2157],{"type":46,"value":913},{"type":40,"tag":719,"props":2159,"children":2160},{"style":732},[2161],{"type":46,"value":1775},{"type":40,"tag":719,"props":2163,"children":2164},{"style":1140},[2165],{"type":46,"value":2166}," sku",{"type":40,"tag":719,"props":2168,"children":2169},{"style":732},[2170],{"type":46,"value":1152},{"type":40,"tag":719,"props":2172,"children":2173},{"style":732},[2174],{"type":46,"value":756},{"type":40,"tag":719,"props":2176,"children":2177},{"style":759},[2178],{"type":46,"value":2179},"TEST-SKU-1",{"type":40,"tag":719,"props":2181,"children":2182},{"style":732},[2183],{"type":46,"value":767},{"type":40,"tag":719,"props":2185,"children":2186},{"style":732},[2187],{"type":46,"value":794},{"type":40,"tag":719,"props":2189,"children":2190},{"style":1140},[2191],{"type":46,"value":2192}," qty",{"type":40,"tag":719,"props":2194,"children":2195},{"style":732},[2196],{"type":46,"value":1152},{"type":40,"tag":719,"props":2198,"children":2199},{"style":916},[2200],{"type":46,"value":2201}," 1",{"type":40,"tag":719,"props":2203,"children":2204},{"style":732},[2205],{"type":46,"value":746},{"type":40,"tag":719,"props":2207,"children":2208},{"style":1140},[2209],{"type":46,"value":899},{"type":40,"tag":719,"props":2211,"children":2212},{"style":732},[2213],{"type":46,"value":794},{"type":40,"tag":719,"props":2215,"children":2216},{"style":732},[2217],{"type":46,"value":1597},{"type":40,"tag":719,"props":2219,"children":2221},{"class":721,"line":2220},23,[2222,2227,2231,2235,2239,2243,2247,2251,2255,2259,2263,2267,2272,2276,2281,2286,2290,2294,2298],{"type":40,"tag":719,"props":2223,"children":2224},{"style":1140},[2225],{"type":46,"value":2226},"    headers",{"type":40,"tag":719,"props":2228,"children":2229},{"style":732},[2230],{"type":46,"value":1152},{"type":40,"tag":719,"props":2232,"children":2233},{"style":732},[2234],{"type":46,"value":735},{"type":40,"tag":719,"props":2236,"children":2237},{"style":732},[2238],{"type":46,"value":756},{"type":40,"tag":719,"props":2240,"children":2241},{"style":1140},[2242],{"type":46,"value":1044},{"type":40,"tag":719,"props":2244,"children":2245},{"style":732},[2246],{"type":46,"value":767},{"type":40,"tag":719,"props":2248,"children":2249},{"style":732},[2250],{"type":46,"value":1152},{"type":40,"tag":719,"props":2252,"children":2253},{"style":732},[2254],{"type":46,"value":756},{"type":40,"tag":719,"props":2256,"children":2257},{"style":759},[2258],{"type":46,"value":1075},{"type":40,"tag":719,"props":2260,"children":2261},{"style":732},[2262],{"type":46,"value":767},{"type":40,"tag":719,"props":2264,"children":2265},{"style":732},[2266],{"type":46,"value":794},{"type":40,"tag":719,"props":2268,"children":2269},{"style":1140},[2270],{"type":46,"value":2271}," Authorization",{"type":40,"tag":719,"props":2273,"children":2274},{"style":732},[2275],{"type":46,"value":1152},{"type":40,"tag":719,"props":2277,"children":2278},{"style":732},[2279],{"type":46,"value":2280}," `",{"type":40,"tag":719,"props":2282,"children":2283},{"style":759},[2284],{"type":46,"value":2285},"Bearer ",{"type":40,"tag":719,"props":2287,"children":2288},{"style":732},[2289],{"type":46,"value":1239},{"type":40,"tag":719,"props":2291,"children":2292},{"style":738},[2293],{"type":46,"value":961},{"type":40,"tag":719,"props":2295,"children":2296},{"style":732},[2297],{"type":46,"value":1257},{"type":40,"tag":719,"props":2299,"children":2300},{"style":732},[2301],{"type":46,"value":2302}," },\n",{"type":40,"tag":719,"props":2304,"children":2306},{"class":721,"line":2305},24,[2307,2312,2316],{"type":40,"tag":719,"props":2308,"children":2309},{"style":732},[2310],{"type":46,"value":2311},"  }",{"type":40,"tag":719,"props":2313,"children":2314},{"style":1140},[2315],{"type":46,"value":899},{"type":40,"tag":719,"props":2317,"children":2318},{"style":732},[2319],{"type":46,"value":772},{"type":40,"tag":719,"props":2321,"children":2323},{"class":721,"line":2322},25,[2324,2328,2332,2337,2341,2345,2349,2353,2358,2362,2366,2370,2374,2378,2383,2387],{"type":40,"tag":719,"props":2325,"children":2326},{"style":859},[2327],{"type":46,"value":1896},{"type":40,"tag":719,"props":2329,"children":2330},{"style":1140},[2331],{"type":46,"value":913},{"type":40,"tag":719,"props":2333,"children":2334},{"style":738},[2335],{"type":46,"value":2336},"order",{"type":40,"tag":719,"props":2338,"children":2339},{"style":732},[2340],{"type":46,"value":872},{"type":40,"tag":719,"props":2342,"children":2343},{"style":738},[2344],{"type":46,"value":877},{"type":40,"tag":719,"props":2346,"children":2347},{"style":732},[2348],{"type":46,"value":794},{"type":40,"tag":719,"props":2350,"children":2351},{"style":732},[2352],{"type":46,"value":756},{"type":40,"tag":719,"props":2354,"children":2355},{"style":759},[2356],{"type":46,"value":2357},"order should be created",{"type":40,"tag":719,"props":2359,"children":2360},{"style":732},[2361],{"type":46,"value":767},{"type":40,"tag":719,"props":2363,"children":2364},{"style":1140},[2365],{"type":46,"value":899},{"type":40,"tag":719,"props":2367,"children":2368},{"style":732},[2369],{"type":46,"value":872},{"type":40,"tag":719,"props":2371,"children":2372},{"style":859},[2373],{"type":46,"value":908},{"type":40,"tag":719,"props":2375,"children":2376},{"style":1140},[2377],{"type":46,"value":913},{"type":40,"tag":719,"props":2379,"children":2380},{"style":916},[2381],{"type":46,"value":2382},"201",{"type":40,"tag":719,"props":2384,"children":2385},{"style":1140},[2386],{"type":46,"value":899},{"type":40,"tag":719,"props":2388,"children":2389},{"style":732},[2390],{"type":46,"value":772},{"type":40,"tag":719,"props":2392,"children":2394},{"class":721,"line":2393},26,[2395,2399,2404,2408,2412,2416,2420,2424,2428,2433,2437,2441],{"type":40,"tag":719,"props":2396,"children":2397},{"style":1170},[2398],{"type":46,"value":1613},{"type":40,"tag":719,"props":2400,"children":2401},{"style":738},[2402],{"type":46,"value":2403}," orderId",{"type":40,"tag":719,"props":2405,"children":2406},{"style":732},[2407],{"type":46,"value":1623},{"type":40,"tag":719,"props":2409,"children":2410},{"style":738},[2411],{"type":46,"value":2094},{"type":40,"tag":719,"props":2413,"children":2414},{"style":732},[2415],{"type":46,"value":872},{"type":40,"tag":719,"props":2417,"children":2418},{"style":859},[2419],{"type":46,"value":948},{"type":40,"tag":719,"props":2421,"children":2422},{"style":1140},[2423],{"type":46,"value":913},{"type":40,"tag":719,"props":2425,"children":2426},{"style":732},[2427],{"type":46,"value":767},{"type":40,"tag":719,"props":2429,"children":2430},{"style":759},[2431],{"type":46,"value":2432},"id",{"type":40,"tag":719,"props":2434,"children":2435},{"style":732},[2436],{"type":46,"value":767},{"type":40,"tag":719,"props":2438,"children":2439},{"style":1140},[2440],{"type":46,"value":899},{"type":40,"tag":719,"props":2442,"children":2443},{"style":732},[2444],{"type":46,"value":772},{"type":40,"tag":719,"props":2446,"children":2448},{"class":721,"line":2447},27,[2449,2453,2457,2462,2466,2470,2475,2479,2483,2487,2491,2495],{"type":40,"tag":719,"props":2450,"children":2451},{"style":859},[2452],{"type":46,"value":1896},{"type":40,"tag":719,"props":2454,"children":2455},{"style":1140},[2456],{"type":46,"value":913},{"type":40,"tag":719,"props":2458,"children":2459},{"style":738},[2460],{"type":46,"value":2461},"orderId",{"type":40,"tag":719,"props":2463,"children":2464},{"style":732},[2465],{"type":46,"value":794},{"type":40,"tag":719,"props":2467,"children":2468},{"style":732},[2469],{"type":46,"value":756},{"type":40,"tag":719,"props":2471,"children":2472},{"style":759},[2473],{"type":46,"value":2474},"order id should be returned",{"type":40,"tag":719,"props":2476,"children":2477},{"style":732},[2478],{"type":46,"value":767},{"type":40,"tag":719,"props":2480,"children":2481},{"style":1140},[2482],{"type":46,"value":899},{"type":40,"tag":719,"props":2484,"children":2485},{"style":732},[2486],{"type":46,"value":872},{"type":40,"tag":719,"props":2488,"children":2489},{"style":859},[2490],{"type":46,"value":979},{"type":40,"tag":719,"props":2492,"children":2493},{"style":1140},[2494],{"type":46,"value":984},{"type":40,"tag":719,"props":2496,"children":2497},{"style":732},[2498],{"type":46,"value":772},{"type":40,"tag":719,"props":2500,"children":2502},{"class":721,"line":2501},28,[2503],{"type":40,"tag":719,"props":2504,"children":2505},{"emptyLinePlaceholder":830},[2506],{"type":46,"value":833},{"type":40,"tag":719,"props":2508,"children":2510},{"class":721,"line":2509},29,[2511],{"type":40,"tag":719,"props":2512,"children":2513},{"style":840},[2514],{"type":46,"value":2515},"  \u002F\u002F Step 3: clean up so the check is idempotent against production\n",{"type":40,"tag":719,"props":2517,"children":2519},{"class":721,"line":2518},30,[2520],{"type":40,"tag":719,"props":2521,"children":2522},{"style":840},[2523],{"type":46,"value":2524},"  \u002F\u002F http.url groups metrics for URLs containing unique IDs — without it, every\n",{"type":40,"tag":719,"props":2526,"children":2528},{"class":721,"line":2527},31,[2529],{"type":40,"tag":719,"props":2530,"children":2531},{"style":840},[2532],{"type":46,"value":2533},"  \u002F\u002F execution creates new time series (cardinality + active-series cost).\n",{"type":40,"tag":719,"props":2535,"children":2537},{"class":721,"line":2536},32,[2538,2542,2547,2551,2555,2559,2564,2568,2573,2577,2582,2586,2590,2594,2599,2603,2607,2611,2615,2620],{"type":40,"tag":719,"props":2539,"children":2540},{"style":1170},[2541],{"type":46,"value":1613},{"type":40,"tag":719,"props":2543,"children":2544},{"style":738},[2545],{"type":46,"value":2546}," del",{"type":40,"tag":719,"props":2548,"children":2549},{"style":732},[2550],{"type":46,"value":1623},{"type":40,"tag":719,"props":2552,"children":2553},{"style":738},[2554],{"type":46,"value":1703},{"type":40,"tag":719,"props":2556,"children":2557},{"style":732},[2558],{"type":46,"value":872},{"type":40,"tag":719,"props":2560,"children":2561},{"style":859},[2562],{"type":46,"value":2563},"del",{"type":40,"tag":719,"props":2565,"children":2566},{"style":1140},[2567],{"type":46,"value":913},{"type":40,"tag":719,"props":2569,"children":2570},{"style":738},[2571],{"type":46,"value":2572},"http",{"type":40,"tag":719,"props":2574,"children":2575},{"style":732},[2576],{"type":46,"value":872},{"type":40,"tag":719,"props":2578,"children":2579},{"style":859},[2580],{"type":46,"value":2581},"url",{"type":40,"tag":719,"props":2583,"children":2584},{"style":732},[2585],{"type":46,"value":2119},{"type":40,"tag":719,"props":2587,"children":2588},{"style":738},[2589],{"type":46,"value":1730},{"type":40,"tag":719,"props":2591,"children":2592},{"style":732},[2593],{"type":46,"value":1735},{"type":40,"tag":719,"props":2595,"children":2596},{"style":759},[2597],{"type":46,"value":2598},"\u002Forders\u002F",{"type":40,"tag":719,"props":2600,"children":2601},{"style":732},[2602],{"type":46,"value":1239},{"type":40,"tag":719,"props":2604,"children":2605},{"style":738},[2606],{"type":46,"value":2461},{"type":40,"tag":719,"props":2608,"children":2609},{"style":732},[2610],{"type":46,"value":1257},{"type":40,"tag":719,"props":2612,"children":2613},{"style":732},[2614],{"type":46,"value":794},{"type":40,"tag":719,"props":2616,"children":2617},{"style":732},[2618],{"type":46,"value":2619}," null,",{"type":40,"tag":719,"props":2621,"children":2622},{"style":732},[2623],{"type":46,"value":1597},{"type":40,"tag":719,"props":2625,"children":2627},{"class":721,"line":2626},33,[2628,2632,2636,2640,2644,2648,2652,2656,2660,2664,2668],{"type":40,"tag":719,"props":2629,"children":2630},{"style":1140},[2631],{"type":46,"value":2226},{"type":40,"tag":719,"props":2633,"children":2634},{"style":732},[2635],{"type":46,"value":1152},{"type":40,"tag":719,"props":2637,"children":2638},{"style":732},[2639],{"type":46,"value":735},{"type":40,"tag":719,"props":2641,"children":2642},{"style":1140},[2643],{"type":46,"value":2271},{"type":40,"tag":719,"props":2645,"children":2646},{"style":732},[2647],{"type":46,"value":1152},{"type":40,"tag":719,"props":2649,"children":2650},{"style":732},[2651],{"type":46,"value":2280},{"type":40,"tag":719,"props":2653,"children":2654},{"style":759},[2655],{"type":46,"value":2285},{"type":40,"tag":719,"props":2657,"children":2658},{"style":732},[2659],{"type":46,"value":1239},{"type":40,"tag":719,"props":2661,"children":2662},{"style":738},[2663],{"type":46,"value":961},{"type":40,"tag":719,"props":2665,"children":2666},{"style":732},[2667],{"type":46,"value":1257},{"type":40,"tag":719,"props":2669,"children":2670},{"style":732},[2671],{"type":46,"value":2302},{"type":40,"tag":719,"props":2673,"children":2675},{"class":721,"line":2674},34,[2676,2680,2684],{"type":40,"tag":719,"props":2677,"children":2678},{"style":732},[2679],{"type":46,"value":2311},{"type":40,"tag":719,"props":2681,"children":2682},{"style":1140},[2683],{"type":46,"value":899},{"type":40,"tag":719,"props":2685,"children":2686},{"style":732},[2687],{"type":46,"value":772},{"type":40,"tag":719,"props":2689,"children":2691},{"class":721,"line":2690},35,[2692,2696,2700,2704,2708,2712,2716,2720,2725,2729,2733,2737,2741,2745,2750,2754],{"type":40,"tag":719,"props":2693,"children":2694},{"style":859},[2695],{"type":46,"value":1896},{"type":40,"tag":719,"props":2697,"children":2698},{"style":1140},[2699],{"type":46,"value":913},{"type":40,"tag":719,"props":2701,"children":2702},{"style":738},[2703],{"type":46,"value":2563},{"type":40,"tag":719,"props":2705,"children":2706},{"style":732},[2707],{"type":46,"value":872},{"type":40,"tag":719,"props":2709,"children":2710},{"style":738},[2711],{"type":46,"value":877},{"type":40,"tag":719,"props":2713,"children":2714},{"style":732},[2715],{"type":46,"value":794},{"type":40,"tag":719,"props":2717,"children":2718},{"style":732},[2719],{"type":46,"value":756},{"type":40,"tag":719,"props":2721,"children":2722},{"style":759},[2723],{"type":46,"value":2724},"test order should be cleaned up",{"type":40,"tag":719,"props":2726,"children":2727},{"style":732},[2728],{"type":46,"value":767},{"type":40,"tag":719,"props":2730,"children":2731},{"style":1140},[2732],{"type":46,"value":899},{"type":40,"tag":719,"props":2734,"children":2735},{"style":732},[2736],{"type":46,"value":872},{"type":40,"tag":719,"props":2738,"children":2739},{"style":859},[2740],{"type":46,"value":908},{"type":40,"tag":719,"props":2742,"children":2743},{"style":1140},[2744],{"type":46,"value":913},{"type":40,"tag":719,"props":2746,"children":2747},{"style":916},[2748],{"type":46,"value":2749},"204",{"type":40,"tag":719,"props":2751,"children":2752},{"style":1140},[2753],{"type":46,"value":899},{"type":40,"tag":719,"props":2755,"children":2756},{"style":732},[2757],{"type":46,"value":772},{"type":40,"tag":719,"props":2759,"children":2761},{"class":721,"line":2760},36,[2762],{"type":40,"tag":719,"props":2763,"children":2764},{"style":732},[2765],{"type":46,"value":2766},"}\n",{"type":40,"tag":53,"props":2768,"children":2769},{},[2770,2772,2777],{"type":46,"value":2771},"Rules that make a scripted check a good ",{"type":40,"tag":141,"props":2773,"children":2774},{},[2775],{"type":46,"value":2776},"monitor",{"type":46,"value":2778}," (vs a good test):",{"type":40,"tag":2780,"props":2781,"children":2782},"ul",{},[2783,2793,2803,2813,2830,2847],{"type":40,"tag":1301,"props":2784,"children":2785},{},[2786,2791],{"type":40,"tag":57,"props":2787,"children":2788},{},[2789],{"type":46,"value":2790},"Deterministic",{"type":46,"value":2792},": fixed test data (or generated-then-deleted, as above), no\ntime-of-day or ordering dependence. Every execution must be able to pass at any hour\nfrom any probe.",{"type":40,"tag":1301,"props":2794,"children":2795},{},[2796,2801],{"type":40,"tag":57,"props":2797,"children":2798},{},[2799],{"type":46,"value":2800},"Idempotent against production",{"type":46,"value":2802},": create-then-delete, or use read-only endpoints.\nThe check runs forever — leaked state accumulates forever.",{"type":40,"tag":1301,"props":2804,"children":2805},{},[2806,2811],{"type":40,"tag":57,"props":2807,"children":2808},{},[2809],{"type":46,"value":2810},"Dedicated test account",{"type":46,"value":2812},": never a real user's credentials; scope it minimally, store\nthe password as an SM secret, and exclude the account from analytics\u002Fbilling.",{"type":40,"tag":1301,"props":2814,"children":2815},{},[2816,2821,2823,2828],{"type":40,"tag":57,"props":2817,"children":2818},{},[2819],{"type":46,"value":2820},"Assert every step",{"type":46,"value":2822}," — an unasserted step that breaks shows up as a ",{"type":40,"tag":141,"props":2824,"children":2825},{},[2826],{"type":46,"value":2827},"later",{"type":46,"value":2829}," step's\nconfusing failure.",{"type":40,"tag":1301,"props":2831,"children":2832},{},[2833,2838,2839,2845],{"type":40,"tag":57,"props":2834,"children":2835},{},[2836],{"type":46,"value":2837},"Stable URL cardinality",{"type":46,"value":63},{"type":40,"tag":79,"props":2840,"children":2842},{"className":2841},[],[2843],{"type":46,"value":2844},"http.url",{"type":46,"value":2846}," template literal for any URL containing an ID.",{"type":40,"tag":1301,"props":2848,"children":2849},{},[2850],{"type":46,"value":2851},"Keep runtime well under the timeout, and the timeout under the frequency.",{"type":40,"tag":2853,"props":2854,"children":2856},"h3",{"id":2855},"generating-a-check-from-an-openapi-spec-or-similar",[2857],{"type":46,"value":2858},"Generating a check from an OpenAPI spec (or similar)",{"type":40,"tag":53,"props":2860,"children":2861},{},[2862],{"type":46,"value":2863},"Given an API description — an OpenAPI\u002FSwagger spec, GraphQL schema, or Postman\ncollection — the mechanical conversion to k6 calls is easy. What matters is what you\nchoose to convert:",{"type":40,"tag":1297,"props":2865,"children":2866},{},[2867,2877,2910,2927,2961],{"type":40,"tag":1301,"props":2868,"children":2869},{},[2870,2875],{"type":40,"tag":57,"props":2871,"children":2872},{},[2873],{"type":46,"value":2874},"Journeys, not endpoints.",{"type":46,"value":2876}," Do NOT generate one check per path, or one check that\nsweeps every path — that monitors the spec, not the service, and every extra check\nmultiplies execution cost. Identify the 1–3 flows whose failure means \"customers are\nimpacted\" (auth → core action → result) and write one scripted check per flow.",{"type":40,"tag":1301,"props":2878,"children":2879},{},[2880,2885,2887,2893,2895,2901,2902,2908],{"type":40,"tag":57,"props":2881,"children":2882},{},[2883],{"type":46,"value":2884},"Filter for safety.",{"type":46,"value":2886}," Only include mutating operations (",{"type":40,"tag":79,"props":2888,"children":2890},{"className":2889},[],[2891],{"type":46,"value":2892},"POST",{"type":46,"value":2894},"\u002F",{"type":40,"tag":79,"props":2896,"children":2898},{"className":2897},[],[2899],{"type":46,"value":2900},"PUT",{"type":46,"value":2894},{"type":40,"tag":79,"props":2903,"children":2905},{"className":2904},[],[2906],{"type":46,"value":2907},"DELETE",{"type":46,"value":2909},") when\nthe flow cleans up after itself (create-then-delete, as above) or targets dedicated\ntest resources. A spec lists destructive operations right next to health endpoints —\nnever exercise them against production just because they're documented.",{"type":40,"tag":1301,"props":2911,"children":2912},{},[2913,2918,2920,2926],{"type":40,"tag":57,"props":2914,"children":2915},{},[2916],{"type":46,"value":2917},"Assert from the response schema.",{"type":46,"value":2919}," The spec tells you exactly what a healthy\nresponse contains — assert required fields, not just the status code:\n",{"type":40,"tag":79,"props":2921,"children":2923},{"className":2922},[],[2924],{"type":46,"value":2925},"expect(order.json('id'), 'id required by OrdersResponse schema').toBeDefined()",{"type":46,"value":872},{"type":40,"tag":1301,"props":2928,"children":2929},{},[2930,2935,2937,2943,2945,2951,2953,2959],{"type":40,"tag":57,"props":2931,"children":2932},{},[2933],{"type":46,"value":2934},"Verify the target URL.",{"type":46,"value":2936}," ",{"type":40,"tag":79,"props":2938,"children":2940},{"className":2939},[],[2941],{"type":46,"value":2942},"servers:",{"type":46,"value":2944}," blocks (and Postman environments) often list\nlocalhost or staging first — confirm the production base URL with the user, and map\n",{"type":40,"tag":79,"props":2946,"children":2948},{"className":2947},[],[2949],{"type":46,"value":2950},"securitySchemes",{"type":46,"value":2952}," credentials to SM secrets, never to values inlined from the spec.\n(Secrets in plain HTTP\u002Fprotocol checks are a recent, feature-flagged rollout — check\ncurrent docs; the scripted ",{"type":40,"tag":79,"props":2954,"children":2956},{"className":2955},[],[2957],{"type":46,"value":2958},"secrets.get()",{"type":46,"value":2960}," path always works.)",{"type":40,"tag":1301,"props":2962,"children":2963},{},[2964,2977,2978,2984,2986,2992],{"type":40,"tag":57,"props":2965,"children":2966},{},[2967,2969,2975],{"type":46,"value":2968},"Treat ",{"type":40,"tag":79,"props":2970,"children":2972},{"className":2971},[],[2973],{"type":46,"value":2974},"format: int64",{"type":46,"value":2976}," ids as strings.",{"type":46,"value":2936},{"type":40,"tag":79,"props":2979,"children":2981},{"className":2980},[],[2982],{"type":46,"value":2983},"res.json('id')",{"type":46,"value":2985}," parses into a JS number\nand silently corrupts values past 2^53 (snowflake-style ids), so the readback URL\n404s on every execution while the create looks fine. Extract from the raw body\ninstead: ",{"type":40,"tag":79,"props":2987,"children":2989},{"className":2988},[],[2990],{"type":46,"value":2991},"const id = (\u002F\"id\":\\s*(\\d+)\u002F.exec(res.body) || [])[1];",{"type":46,"value":2993}," — and never do\narithmetic on it.",{"type":40,"tag":53,"props":2995,"children":2996},{},[2997,2999,3005,3007,3013],{"type":46,"value":2998},"No API spec at all? Probe the frontend: open the web app with browser devtools (or\n",{"type":40,"tag":79,"props":3000,"children":3002},{"className":3001},[],[3003],{"type":46,"value":3004},"curl",{"type":46,"value":3006}," likely routes) and capture the ",{"type":40,"tag":79,"props":3008,"children":3010},{"className":3009},[],[3011],{"type":46,"value":3012},"\u002Fapi\u002F*",{"type":46,"value":3014}," XHR calls it makes — that's a monitorable\nHTTP surface even when the documented backend services are gRPC-only or internal.",{"type":40,"tag":87,"props":3016,"children":3018},{"id":3017},"browser-check-authoring",[3019],{"type":46,"value":3020},"Browser check authoring",{"type":40,"tag":53,"props":3022,"children":3023},{},[3024,3026,3032,3034,3040],{"type":46,"value":3025},"Required scaffold: import ",{"type":40,"tag":79,"props":3027,"children":3029},{"className":3028},[],[3030],{"type":46,"value":3031},"k6\u002Fbrowser",{"type":46,"value":3033}," and declare the ",{"type":40,"tag":79,"props":3035,"children":3037},{"className":3036},[],[3038],{"type":46,"value":3039},"chromium",{"type":46,"value":3041}," browser type. The UI\nvalidates both.",{"type":40,"tag":708,"props":3043,"children":3045},{"className":710,"code":3044,"language":712,"meta":713,"style":713},"import { browser } from 'k6\u002Fbrowser';\nimport { expect } from 'https:\u002F\u002Fjslib.k6.io\u002Fk6-testing\u002F0.6.1\u002Findex.js';\nimport secrets from 'k6\u002Fsecrets';\n\nexport const options = {\n  scenarios: {\n    ui: {\n      executor: 'shared-iterations',\n      options: { browser: { type: 'chromium' } },\n    },\n  },\n};\n\nexport default async function () {\n  const page = await browser.newPage();\n  try {\n    await page.goto('https:\u002F\u002Fshop.example.com\u002Flogin');\n\n    \u002F\u002F Prefer role\u002Flabel\u002Ftest-id locators over CSS chains — they survive redesigns.\n    const password = await secrets.get('shop-monitor-password');\n    await page.getByLabel('Email').fill('sm-monitor@example.com');\n    await page.getByLabel('Password').fill(password);\n    await page.getByRole('button', { name: 'Sign in' }).click();\n\n    \u002F\u002F Assert the JOURNEY OUTCOME with auto-retrying assertions — never sleep().\n    await expect(page.getByRole('heading', { name: 'Your account' })).toBeVisible();\n\n    await page.getByRole('link', { name: 'Orders' }).click();\n    await expect(page.getByTestId('order-list')).toBeVisible();\n  } finally {\n    await page.close();\n  }\n}\n",[3046],{"type":40,"tag":79,"props":3047,"children":3048},{"__ignoreMap":713},[3049,3089,3128,3159,3166,3191,3207,3223,3252,3309,3317,3325,3333,3340,3367,3408,3420,3466,3473,3481,3538,3613,3678,3770,3777,3785,3884,3891,3980,4045,4061,4089,4097],{"type":40,"tag":719,"props":3050,"children":3051},{"class":721,"line":722},[3052,3056,3060,3065,3069,3073,3077,3081,3085],{"type":40,"tag":719,"props":3053,"children":3054},{"style":726},[3055],{"type":46,"value":729},{"type":40,"tag":719,"props":3057,"children":3058},{"style":732},[3059],{"type":46,"value":735},{"type":40,"tag":719,"props":3061,"children":3062},{"style":738},[3063],{"type":46,"value":3064}," browser",{"type":40,"tag":719,"props":3066,"children":3067},{"style":732},[3068],{"type":46,"value":746},{"type":40,"tag":719,"props":3070,"children":3071},{"style":726},[3072],{"type":46,"value":751},{"type":40,"tag":719,"props":3074,"children":3075},{"style":732},[3076],{"type":46,"value":756},{"type":40,"tag":719,"props":3078,"children":3079},{"style":759},[3080],{"type":46,"value":3031},{"type":40,"tag":719,"props":3082,"children":3083},{"style":732},[3084],{"type":46,"value":767},{"type":40,"tag":719,"props":3086,"children":3087},{"style":732},[3088],{"type":46,"value":772},{"type":40,"tag":719,"props":3090,"children":3091},{"class":721,"line":775},[3092,3096,3100,3104,3108,3112,3116,3120,3124],{"type":40,"tag":719,"props":3093,"children":3094},{"style":726},[3095],{"type":46,"value":729},{"type":40,"tag":719,"props":3097,"children":3098},{"style":732},[3099],{"type":46,"value":735},{"type":40,"tag":719,"props":3101,"children":3102},{"style":738},[3103],{"type":46,"value":741},{"type":40,"tag":719,"props":3105,"children":3106},{"style":732},[3107],{"type":46,"value":746},{"type":40,"tag":719,"props":3109,"children":3110},{"style":726},[3111],{"type":46,"value":751},{"type":40,"tag":719,"props":3113,"children":3114},{"style":732},[3115],{"type":46,"value":756},{"type":40,"tag":719,"props":3117,"children":3118},{"style":759},[3119],{"type":46,"value":762},{"type":40,"tag":719,"props":3121,"children":3122},{"style":732},[3123],{"type":46,"value":767},{"type":40,"tag":719,"props":3125,"children":3126},{"style":732},[3127],{"type":46,"value":772},{"type":40,"tag":719,"props":3129,"children":3130},{"class":721,"line":826},[3131,3135,3139,3143,3147,3151,3155],{"type":40,"tag":719,"props":3132,"children":3133},{"style":726},[3134],{"type":46,"value":729},{"type":40,"tag":719,"props":3136,"children":3137},{"style":738},[3138],{"type":46,"value":1494},{"type":40,"tag":719,"props":3140,"children":3141},{"style":726},[3142],{"type":46,"value":1426},{"type":40,"tag":719,"props":3144,"children":3145},{"style":732},[3146],{"type":46,"value":756},{"type":40,"tag":719,"props":3148,"children":3149},{"style":759},[3150],{"type":46,"value":1507},{"type":40,"tag":719,"props":3152,"children":3153},{"style":732},[3154],{"type":46,"value":767},{"type":40,"tag":719,"props":3156,"children":3157},{"style":732},[3158],{"type":46,"value":772},{"type":40,"tag":719,"props":3160,"children":3161},{"class":721,"line":836},[3162],{"type":40,"tag":719,"props":3163,"children":3164},{"emptyLinePlaceholder":830},[3165],{"type":46,"value":833},{"type":40,"tag":719,"props":3167,"children":3168},{"class":721,"line":846},[3169,3173,3178,3183,3187],{"type":40,"tag":719,"props":3170,"children":3171},{"style":726},[3172],{"type":46,"value":1572},{"type":40,"tag":719,"props":3174,"children":3175},{"style":1170},[3176],{"type":46,"value":3177}," const",{"type":40,"tag":719,"props":3179,"children":3180},{"style":738},[3181],{"type":46,"value":3182}," options ",{"type":40,"tag":719,"props":3184,"children":3185},{"style":732},[3186],{"type":46,"value":1540},{"type":40,"tag":719,"props":3188,"children":3189},{"style":732},[3190],{"type":46,"value":1597},{"type":40,"tag":719,"props":3192,"children":3193},{"class":721,"line":855},[3194,3199,3203],{"type":40,"tag":719,"props":3195,"children":3196},{"style":1140},[3197],{"type":46,"value":3198},"  scenarios",{"type":40,"tag":719,"props":3200,"children":3201},{"style":732},[3202],{"type":46,"value":1152},{"type":40,"tag":719,"props":3204,"children":3205},{"style":732},[3206],{"type":46,"value":1597},{"type":40,"tag":719,"props":3208,"children":3209},{"class":721,"line":930},[3210,3215,3219],{"type":40,"tag":719,"props":3211,"children":3212},{"style":1140},[3213],{"type":46,"value":3214},"    ui",{"type":40,"tag":719,"props":3216,"children":3217},{"style":732},[3218],{"type":46,"value":1152},{"type":40,"tag":719,"props":3220,"children":3221},{"style":732},[3222],{"type":46,"value":1597},{"type":40,"tag":719,"props":3224,"children":3225},{"class":721,"line":991},[3226,3231,3235,3239,3244,3248],{"type":40,"tag":719,"props":3227,"children":3228},{"style":1140},[3229],{"type":46,"value":3230},"      executor",{"type":40,"tag":719,"props":3232,"children":3233},{"style":732},[3234],{"type":46,"value":1152},{"type":40,"tag":719,"props":3236,"children":3237},{"style":732},[3238],{"type":46,"value":756},{"type":40,"tag":719,"props":3240,"children":3241},{"style":759},[3242],{"type":46,"value":3243},"shared-iterations",{"type":40,"tag":719,"props":3245,"children":3246},{"style":732},[3247],{"type":46,"value":767},{"type":40,"tag":719,"props":3249,"children":3250},{"style":732},[3251],{"type":46,"value":1749},{"type":40,"tag":719,"props":3253,"children":3254},{"class":721,"line":999},[3255,3260,3264,3268,3272,3276,3280,3285,3289,3293,3297,3301,3305],{"type":40,"tag":719,"props":3256,"children":3257},{"style":1140},[3258],{"type":46,"value":3259},"      options",{"type":40,"tag":719,"props":3261,"children":3262},{"style":732},[3263],{"type":46,"value":1152},{"type":40,"tag":719,"props":3265,"children":3266},{"style":732},[3267],{"type":46,"value":735},{"type":40,"tag":719,"props":3269,"children":3270},{"style":1140},[3271],{"type":46,"value":3064},{"type":40,"tag":719,"props":3273,"children":3274},{"style":732},[3275],{"type":46,"value":1152},{"type":40,"tag":719,"props":3277,"children":3278},{"style":732},[3279],{"type":46,"value":735},{"type":40,"tag":719,"props":3281,"children":3282},{"style":1140},[3283],{"type":46,"value":3284}," type",{"type":40,"tag":719,"props":3286,"children":3287},{"style":732},[3288],{"type":46,"value":1152},{"type":40,"tag":719,"props":3290,"children":3291},{"style":732},[3292],{"type":46,"value":756},{"type":40,"tag":719,"props":3294,"children":3295},{"style":759},[3296],{"type":46,"value":3039},{"type":40,"tag":719,"props":3298,"children":3299},{"style":732},[3300],{"type":46,"value":767},{"type":40,"tag":719,"props":3302,"children":3303},{"style":732},[3304],{"type":46,"value":746},{"type":40,"tag":719,"props":3306,"children":3307},{"style":732},[3308],{"type":46,"value":2302},{"type":40,"tag":719,"props":3310,"children":3311},{"class":721,"line":1008},[3312],{"type":40,"tag":719,"props":3313,"children":3314},{"style":732},[3315],{"type":46,"value":3316},"    },\n",{"type":40,"tag":719,"props":3318,"children":3319},{"class":721,"line":1090},[3320],{"type":40,"tag":719,"props":3321,"children":3322},{"style":732},[3323],{"type":46,"value":3324},"  },\n",{"type":40,"tag":719,"props":3326,"children":3327},{"class":721,"line":1098},[3328],{"type":40,"tag":719,"props":3329,"children":3330},{"style":732},[3331],{"type":46,"value":3332},"};\n",{"type":40,"tag":719,"props":3334,"children":3335},{"class":721,"line":1107},[3336],{"type":40,"tag":719,"props":3337,"children":3338},{"emptyLinePlaceholder":830},[3339],{"type":46,"value":833},{"type":40,"tag":719,"props":3341,"children":3342},{"class":721,"line":1116},[3343,3347,3351,3355,3359,3363],{"type":40,"tag":719,"props":3344,"children":3345},{"style":726},[3346],{"type":46,"value":1572},{"type":40,"tag":719,"props":3348,"children":3349},{"style":726},[3350],{"type":46,"value":1577},{"type":40,"tag":719,"props":3352,"children":3353},{"style":1170},[3354],{"type":46,"value":1582},{"type":40,"tag":719,"props":3356,"children":3357},{"style":1170},[3358],{"type":46,"value":1587},{"type":40,"tag":719,"props":3360,"children":3361},{"style":732},[3362],{"type":46,"value":1592},{"type":40,"tag":719,"props":3364,"children":3365},{"style":732},[3366],{"type":46,"value":1597},{"type":40,"tag":719,"props":3368,"children":3369},{"class":721,"line":1214},[3370,3374,3379,3383,3387,3391,3395,3400,3404],{"type":40,"tag":719,"props":3371,"children":3372},{"style":1170},[3373],{"type":46,"value":1613},{"type":40,"tag":719,"props":3375,"children":3376},{"style":738},[3377],{"type":46,"value":3378}," page",{"type":40,"tag":719,"props":3380,"children":3381},{"style":732},[3382],{"type":46,"value":1623},{"type":40,"tag":719,"props":3384,"children":3385},{"style":726},[3386],{"type":46,"value":1628},{"type":40,"tag":719,"props":3388,"children":3389},{"style":738},[3390],{"type":46,"value":3064},{"type":40,"tag":719,"props":3392,"children":3393},{"style":732},[3394],{"type":46,"value":872},{"type":40,"tag":719,"props":3396,"children":3397},{"style":859},[3398],{"type":46,"value":3399},"newPage",{"type":40,"tag":719,"props":3401,"children":3402},{"style":1140},[3403],{"type":46,"value":984},{"type":40,"tag":719,"props":3405,"children":3406},{"style":732},[3407],{"type":46,"value":772},{"type":40,"tag":719,"props":3409,"children":3410},{"class":721,"line":27},[3411,3416],{"type":40,"tag":719,"props":3412,"children":3413},{"style":726},[3414],{"type":46,"value":3415},"  try",{"type":40,"tag":719,"props":3417,"children":3418},{"style":732},[3419],{"type":46,"value":1597},{"type":40,"tag":719,"props":3421,"children":3422},{"class":721,"line":1890},[3423,3428,3432,3436,3441,3445,3449,3454,3458,3462],{"type":40,"tag":719,"props":3424,"children":3425},{"style":726},[3426],{"type":46,"value":3427},"    await",{"type":40,"tag":719,"props":3429,"children":3430},{"style":738},[3431],{"type":46,"value":3378},{"type":40,"tag":719,"props":3433,"children":3434},{"style":732},[3435],{"type":46,"value":872},{"type":40,"tag":719,"props":3437,"children":3438},{"style":859},[3439],{"type":46,"value":3440},"goto",{"type":40,"tag":719,"props":3442,"children":3443},{"style":1140},[3444],{"type":46,"value":913},{"type":40,"tag":719,"props":3446,"children":3447},{"style":732},[3448],{"type":46,"value":767},{"type":40,"tag":719,"props":3450,"children":3451},{"style":759},[3452],{"type":46,"value":3453},"https:\u002F\u002Fshop.example.com\u002Flogin",{"type":40,"tag":719,"props":3455,"children":3456},{"style":732},[3457],{"type":46,"value":767},{"type":40,"tag":719,"props":3459,"children":3460},{"style":1140},[3461],{"type":46,"value":899},{"type":40,"tag":719,"props":3463,"children":3464},{"style":732},[3465],{"type":46,"value":772},{"type":40,"tag":719,"props":3467,"children":3468},{"class":721,"line":1961},[3469],{"type":40,"tag":719,"props":3470,"children":3471},{"emptyLinePlaceholder":830},[3472],{"type":46,"value":833},{"type":40,"tag":719,"props":3474,"children":3475},{"class":721,"line":2014},[3476],{"type":40,"tag":719,"props":3477,"children":3478},{"style":840},[3479],{"type":46,"value":3480},"    \u002F\u002F Prefer role\u002Flabel\u002Ftest-id locators over CSS chains — they survive redesigns.\n",{"type":40,"tag":719,"props":3482,"children":3483},{"class":721,"line":2067},[3484,3489,3493,3497,3501,3505,3509,3513,3517,3521,3526,3530,3534],{"type":40,"tag":719,"props":3485,"children":3486},{"style":1170},[3487],{"type":46,"value":3488},"    const",{"type":40,"tag":719,"props":3490,"children":3491},{"style":738},[3492],{"type":46,"value":1618},{"type":40,"tag":719,"props":3494,"children":3495},{"style":732},[3496],{"type":46,"value":1623},{"type":40,"tag":719,"props":3498,"children":3499},{"style":726},[3500],{"type":46,"value":1628},{"type":40,"tag":719,"props":3502,"children":3503},{"style":738},[3504],{"type":46,"value":1633},{"type":40,"tag":719,"props":3506,"children":3507},{"style":732},[3508],{"type":46,"value":872},{"type":40,"tag":719,"props":3510,"children":3511},{"style":859},[3512],{"type":46,"value":1642},{"type":40,"tag":719,"props":3514,"children":3515},{"style":1140},[3516],{"type":46,"value":913},{"type":40,"tag":719,"props":3518,"children":3519},{"style":732},[3520],{"type":46,"value":767},{"type":40,"tag":719,"props":3522,"children":3523},{"style":759},[3524],{"type":46,"value":3525},"shop-monitor-password",{"type":40,"tag":719,"props":3527,"children":3528},{"style":732},[3529],{"type":46,"value":767},{"type":40,"tag":719,"props":3531,"children":3532},{"style":1140},[3533],{"type":46,"value":899},{"type":40,"tag":719,"props":3535,"children":3536},{"style":732},[3537],{"type":46,"value":772},{"type":40,"tag":719,"props":3539,"children":3540},{"class":721,"line":2075},[3541,3545,3549,3553,3558,3562,3566,3571,3575,3579,3583,3588,3592,3596,3601,3605,3609],{"type":40,"tag":719,"props":3542,"children":3543},{"style":726},[3544],{"type":46,"value":3427},{"type":40,"tag":719,"props":3546,"children":3547},{"style":738},[3548],{"type":46,"value":3378},{"type":40,"tag":719,"props":3550,"children":3551},{"style":732},[3552],{"type":46,"value":872},{"type":40,"tag":719,"props":3554,"children":3555},{"style":859},[3556],{"type":46,"value":3557},"getByLabel",{"type":40,"tag":719,"props":3559,"children":3560},{"style":1140},[3561],{"type":46,"value":913},{"type":40,"tag":719,"props":3563,"children":3564},{"style":732},[3565],{"type":46,"value":767},{"type":40,"tag":719,"props":3567,"children":3568},{"style":759},[3569],{"type":46,"value":3570},"Email",{"type":40,"tag":719,"props":3572,"children":3573},{"style":732},[3574],{"type":46,"value":767},{"type":40,"tag":719,"props":3576,"children":3577},{"style":1140},[3578],{"type":46,"value":899},{"type":40,"tag":719,"props":3580,"children":3581},{"style":732},[3582],{"type":46,"value":872},{"type":40,"tag":719,"props":3584,"children":3585},{"style":859},[3586],{"type":46,"value":3587},"fill",{"type":40,"tag":719,"props":3589,"children":3590},{"style":1140},[3591],{"type":46,"value":913},{"type":40,"tag":719,"props":3593,"children":3594},{"style":732},[3595],{"type":46,"value":767},{"type":40,"tag":719,"props":3597,"children":3598},{"style":759},[3599],{"type":46,"value":3600},"sm-monitor@example.com",{"type":40,"tag":719,"props":3602,"children":3603},{"style":732},[3604],{"type":46,"value":767},{"type":40,"tag":719,"props":3606,"children":3607},{"style":1140},[3608],{"type":46,"value":899},{"type":40,"tag":719,"props":3610,"children":3611},{"style":732},[3612],{"type":46,"value":772},{"type":40,"tag":719,"props":3614,"children":3615},{"class":721,"line":2084},[3616,3620,3624,3628,3632,3636,3640,3645,3649,3653,3657,3661,3665,3670,3674],{"type":40,"tag":719,"props":3617,"children":3618},{"style":726},[3619],{"type":46,"value":3427},{"type":40,"tag":719,"props":3621,"children":3622},{"style":738},[3623],{"type":46,"value":3378},{"type":40,"tag":719,"props":3625,"children":3626},{"style":732},[3627],{"type":46,"value":872},{"type":40,"tag":719,"props":3629,"children":3630},{"style":859},[3631],{"type":46,"value":3557},{"type":40,"tag":719,"props":3633,"children":3634},{"style":1140},[3635],{"type":46,"value":913},{"type":40,"tag":719,"props":3637,"children":3638},{"style":732},[3639],{"type":46,"value":767},{"type":40,"tag":719,"props":3641,"children":3642},{"style":759},[3643],{"type":46,"value":3644},"Password",{"type":40,"tag":719,"props":3646,"children":3647},{"style":732},[3648],{"type":46,"value":767},{"type":40,"tag":719,"props":3650,"children":3651},{"style":1140},[3652],{"type":46,"value":899},{"type":40,"tag":719,"props":3654,"children":3655},{"style":732},[3656],{"type":46,"value":872},{"type":40,"tag":719,"props":3658,"children":3659},{"style":859},[3660],{"type":46,"value":3587},{"type":40,"tag":719,"props":3662,"children":3663},{"style":1140},[3664],{"type":46,"value":913},{"type":40,"tag":719,"props":3666,"children":3667},{"style":738},[3668],{"type":46,"value":3669},"password",{"type":40,"tag":719,"props":3671,"children":3672},{"style":1140},[3673],{"type":46,"value":899},{"type":40,"tag":719,"props":3675,"children":3676},{"style":732},[3677],{"type":46,"value":772},{"type":40,"tag":719,"props":3679,"children":3680},{"class":721,"line":2220},[3681,3685,3689,3693,3698,3702,3706,3711,3715,3719,3723,3728,3732,3736,3741,3745,3749,3753,3757,3762,3766],{"type":40,"tag":719,"props":3682,"children":3683},{"style":726},[3684],{"type":46,"value":3427},{"type":40,"tag":719,"props":3686,"children":3687},{"style":738},[3688],{"type":46,"value":3378},{"type":40,"tag":719,"props":3690,"children":3691},{"style":732},[3692],{"type":46,"value":872},{"type":40,"tag":719,"props":3694,"children":3695},{"style":859},[3696],{"type":46,"value":3697},"getByRole",{"type":40,"tag":719,"props":3699,"children":3700},{"style":1140},[3701],{"type":46,"value":913},{"type":40,"tag":719,"props":3703,"children":3704},{"style":732},[3705],{"type":46,"value":767},{"type":40,"tag":719,"props":3707,"children":3708},{"style":759},[3709],{"type":46,"value":3710},"button",{"type":40,"tag":719,"props":3712,"children":3713},{"style":732},[3714],{"type":46,"value":767},{"type":40,"tag":719,"props":3716,"children":3717},{"style":732},[3718],{"type":46,"value":794},{"type":40,"tag":719,"props":3720,"children":3721},{"style":732},[3722],{"type":46,"value":735},{"type":40,"tag":719,"props":3724,"children":3725},{"style":1140},[3726],{"type":46,"value":3727}," name",{"type":40,"tag":719,"props":3729,"children":3730},{"style":732},[3731],{"type":46,"value":1152},{"type":40,"tag":719,"props":3733,"children":3734},{"style":732},[3735],{"type":46,"value":756},{"type":40,"tag":719,"props":3737,"children":3738},{"style":759},[3739],{"type":46,"value":3740},"Sign in",{"type":40,"tag":719,"props":3742,"children":3743},{"style":732},[3744],{"type":46,"value":767},{"type":40,"tag":719,"props":3746,"children":3747},{"style":732},[3748],{"type":46,"value":746},{"type":40,"tag":719,"props":3750,"children":3751},{"style":1140},[3752],{"type":46,"value":899},{"type":40,"tag":719,"props":3754,"children":3755},{"style":732},[3756],{"type":46,"value":872},{"type":40,"tag":719,"props":3758,"children":3759},{"style":859},[3760],{"type":46,"value":3761},"click",{"type":40,"tag":719,"props":3763,"children":3764},{"style":1140},[3765],{"type":46,"value":984},{"type":40,"tag":719,"props":3767,"children":3768},{"style":732},[3769],{"type":46,"value":772},{"type":40,"tag":719,"props":3771,"children":3772},{"class":721,"line":2305},[3773],{"type":40,"tag":719,"props":3774,"children":3775},{"emptyLinePlaceholder":830},[3776],{"type":46,"value":833},{"type":40,"tag":719,"props":3778,"children":3779},{"class":721,"line":2322},[3780],{"type":40,"tag":719,"props":3781,"children":3782},{"style":840},[3783],{"type":46,"value":3784},"    \u002F\u002F Assert the JOURNEY OUTCOME with auto-retrying assertions — never sleep().\n",{"type":40,"tag":719,"props":3786,"children":3787},{"class":721,"line":2393},[3788,3792,3796,3800,3805,3809,3813,3817,3821,3826,3830,3834,3838,3842,3846,3850,3855,3859,3863,3867,3871,3876,3880],{"type":40,"tag":719,"props":3789,"children":3790},{"style":726},[3791],{"type":46,"value":3427},{"type":40,"tag":719,"props":3793,"children":3794},{"style":859},[3795],{"type":46,"value":741},{"type":40,"tag":719,"props":3797,"children":3798},{"style":1140},[3799],{"type":46,"value":913},{"type":40,"tag":719,"props":3801,"children":3802},{"style":738},[3803],{"type":46,"value":3804},"page",{"type":40,"tag":719,"props":3806,"children":3807},{"style":732},[3808],{"type":46,"value":872},{"type":40,"tag":719,"props":3810,"children":3811},{"style":859},[3812],{"type":46,"value":3697},{"type":40,"tag":719,"props":3814,"children":3815},{"style":1140},[3816],{"type":46,"value":913},{"type":40,"tag":719,"props":3818,"children":3819},{"style":732},[3820],{"type":46,"value":767},{"type":40,"tag":719,"props":3822,"children":3823},{"style":759},[3824],{"type":46,"value":3825},"heading",{"type":40,"tag":719,"props":3827,"children":3828},{"style":732},[3829],{"type":46,"value":767},{"type":40,"tag":719,"props":3831,"children":3832},{"style":732},[3833],{"type":46,"value":794},{"type":40,"tag":719,"props":3835,"children":3836},{"style":732},[3837],{"type":46,"value":735},{"type":40,"tag":719,"props":3839,"children":3840},{"style":1140},[3841],{"type":46,"value":3727},{"type":40,"tag":719,"props":3843,"children":3844},{"style":732},[3845],{"type":46,"value":1152},{"type":40,"tag":719,"props":3847,"children":3848},{"style":732},[3849],{"type":46,"value":756},{"type":40,"tag":719,"props":3851,"children":3852},{"style":759},[3853],{"type":46,"value":3854},"Your account",{"type":40,"tag":719,"props":3856,"children":3857},{"style":732},[3858],{"type":46,"value":767},{"type":40,"tag":719,"props":3860,"children":3861},{"style":732},[3862],{"type":46,"value":746},{"type":40,"tag":719,"props":3864,"children":3865},{"style":1140},[3866],{"type":46,"value":970},{"type":40,"tag":719,"props":3868,"children":3869},{"style":732},[3870],{"type":46,"value":872},{"type":40,"tag":719,"props":3872,"children":3873},{"style":859},[3874],{"type":46,"value":3875},"toBeVisible",{"type":40,"tag":719,"props":3877,"children":3878},{"style":1140},[3879],{"type":46,"value":984},{"type":40,"tag":719,"props":3881,"children":3882},{"style":732},[3883],{"type":46,"value":772},{"type":40,"tag":719,"props":3885,"children":3886},{"class":721,"line":2447},[3887],{"type":40,"tag":719,"props":3888,"children":3889},{"emptyLinePlaceholder":830},[3890],{"type":46,"value":833},{"type":40,"tag":719,"props":3892,"children":3893},{"class":721,"line":2501},[3894,3898,3902,3906,3910,3914,3918,3923,3927,3931,3935,3939,3943,3947,3952,3956,3960,3964,3968,3972,3976],{"type":40,"tag":719,"props":3895,"children":3896},{"style":726},[3897],{"type":46,"value":3427},{"type":40,"tag":719,"props":3899,"children":3900},{"style":738},[3901],{"type":46,"value":3378},{"type":40,"tag":719,"props":3903,"children":3904},{"style":732},[3905],{"type":46,"value":872},{"type":40,"tag":719,"props":3907,"children":3908},{"style":859},[3909],{"type":46,"value":3697},{"type":40,"tag":719,"props":3911,"children":3912},{"style":1140},[3913],{"type":46,"value":913},{"type":40,"tag":719,"props":3915,"children":3916},{"style":732},[3917],{"type":46,"value":767},{"type":40,"tag":719,"props":3919,"children":3920},{"style":759},[3921],{"type":46,"value":3922},"link",{"type":40,"tag":719,"props":3924,"children":3925},{"style":732},[3926],{"type":46,"value":767},{"type":40,"tag":719,"props":3928,"children":3929},{"style":732},[3930],{"type":46,"value":794},{"type":40,"tag":719,"props":3932,"children":3933},{"style":732},[3934],{"type":46,"value":735},{"type":40,"tag":719,"props":3936,"children":3937},{"style":1140},[3938],{"type":46,"value":3727},{"type":40,"tag":719,"props":3940,"children":3941},{"style":732},[3942],{"type":46,"value":1152},{"type":40,"tag":719,"props":3944,"children":3945},{"style":732},[3946],{"type":46,"value":756},{"type":40,"tag":719,"props":3948,"children":3949},{"style":759},[3950],{"type":46,"value":3951},"Orders",{"type":40,"tag":719,"props":3953,"children":3954},{"style":732},[3955],{"type":46,"value":767},{"type":40,"tag":719,"props":3957,"children":3958},{"style":732},[3959],{"type":46,"value":746},{"type":40,"tag":719,"props":3961,"children":3962},{"style":1140},[3963],{"type":46,"value":899},{"type":40,"tag":719,"props":3965,"children":3966},{"style":732},[3967],{"type":46,"value":872},{"type":40,"tag":719,"props":3969,"children":3970},{"style":859},[3971],{"type":46,"value":3761},{"type":40,"tag":719,"props":3973,"children":3974},{"style":1140},[3975],{"type":46,"value":984},{"type":40,"tag":719,"props":3977,"children":3978},{"style":732},[3979],{"type":46,"value":772},{"type":40,"tag":719,"props":3981,"children":3982},{"class":721,"line":2509},[3983,3987,3991,3995,3999,4003,4008,4012,4016,4021,4025,4029,4033,4037,4041],{"type":40,"tag":719,"props":3984,"children":3985},{"style":726},[3986],{"type":46,"value":3427},{"type":40,"tag":719,"props":3988,"children":3989},{"style":859},[3990],{"type":46,"value":741},{"type":40,"tag":719,"props":3992,"children":3993},{"style":1140},[3994],{"type":46,"value":913},{"type":40,"tag":719,"props":3996,"children":3997},{"style":738},[3998],{"type":46,"value":3804},{"type":40,"tag":719,"props":4000,"children":4001},{"style":732},[4002],{"type":46,"value":872},{"type":40,"tag":719,"props":4004,"children":4005},{"style":859},[4006],{"type":46,"value":4007},"getByTestId",{"type":40,"tag":719,"props":4009,"children":4010},{"style":1140},[4011],{"type":46,"value":913},{"type":40,"tag":719,"props":4013,"children":4014},{"style":732},[4015],{"type":46,"value":767},{"type":40,"tag":719,"props":4017,"children":4018},{"style":759},[4019],{"type":46,"value":4020},"order-list",{"type":40,"tag":719,"props":4022,"children":4023},{"style":732},[4024],{"type":46,"value":767},{"type":40,"tag":719,"props":4026,"children":4027},{"style":1140},[4028],{"type":46,"value":970},{"type":40,"tag":719,"props":4030,"children":4031},{"style":732},[4032],{"type":46,"value":872},{"type":40,"tag":719,"props":4034,"children":4035},{"style":859},[4036],{"type":46,"value":3875},{"type":40,"tag":719,"props":4038,"children":4039},{"style":1140},[4040],{"type":46,"value":984},{"type":40,"tag":719,"props":4042,"children":4043},{"style":732},[4044],{"type":46,"value":772},{"type":40,"tag":719,"props":4046,"children":4047},{"class":721,"line":2518},[4048,4052,4057],{"type":40,"tag":719,"props":4049,"children":4050},{"style":732},[4051],{"type":46,"value":2311},{"type":40,"tag":719,"props":4053,"children":4054},{"style":726},[4055],{"type":46,"value":4056}," finally",{"type":40,"tag":719,"props":4058,"children":4059},{"style":732},[4060],{"type":46,"value":1597},{"type":40,"tag":719,"props":4062,"children":4063},{"class":721,"line":2527},[4064,4068,4072,4076,4081,4085],{"type":40,"tag":719,"props":4065,"children":4066},{"style":726},[4067],{"type":46,"value":3427},{"type":40,"tag":719,"props":4069,"children":4070},{"style":738},[4071],{"type":46,"value":3378},{"type":40,"tag":719,"props":4073,"children":4074},{"style":732},[4075],{"type":46,"value":872},{"type":40,"tag":719,"props":4077,"children":4078},{"style":859},[4079],{"type":46,"value":4080},"close",{"type":40,"tag":719,"props":4082,"children":4083},{"style":1140},[4084],{"type":46,"value":984},{"type":40,"tag":719,"props":4086,"children":4087},{"style":732},[4088],{"type":46,"value":772},{"type":40,"tag":719,"props":4090,"children":4091},{"class":721,"line":2536},[4092],{"type":40,"tag":719,"props":4093,"children":4094},{"style":732},[4095],{"type":46,"value":4096},"  }\n",{"type":40,"tag":719,"props":4098,"children":4099},{"class":721,"line":2626},[4100],{"type":40,"tag":719,"props":4101,"children":4102},{"style":732},[4103],{"type":46,"value":2766},{"type":40,"tag":53,"props":4105,"children":4106},{},[4107],{"type":46,"value":4108},"Browser-specific rules:",{"type":40,"tag":2780,"props":4110,"children":4111},{},[4112,4177,4225,4282,4299,4309,4331,4344],{"type":40,"tag":1301,"props":4113,"children":4114},{},[4115,4120,4121,4126,4127,4132,4133,4138,4140,4146,4148,4153,4155,4160,4162,4168,4170,4176],{"type":40,"tag":57,"props":4116,"children":4117},{},[4118],{"type":46,"value":4119},"Locators",{"type":46,"value":63},{"type":40,"tag":79,"props":4122,"children":4124},{"className":4123},[],[4125],{"type":46,"value":3697},{"type":46,"value":693},{"type":40,"tag":79,"props":4128,"children":4130},{"className":4129},[],[4131],{"type":46,"value":3557},{"type":46,"value":693},{"type":40,"tag":79,"props":4134,"children":4136},{"className":4135},[],[4137],{"type":46,"value":4007},{"type":46,"value":4139}," (ask the app team to add\n",{"type":40,"tag":79,"props":4141,"children":4143},{"className":4142},[],[4144],{"type":46,"value":4145},"data-testid",{"type":46,"value":4147}," where needed) > text > CSS. Never XPath or generated class names.\n",{"type":40,"tag":79,"props":4149,"children":4151},{"className":4150},[],[4152],{"type":46,"value":4007},{"type":46,"value":4154}," assumes ",{"type":40,"tag":79,"props":4156,"children":4158},{"className":4157},[],[4159],{"type":46,"value":4145},{"type":46,"value":4161}," — apps instrumented for Cypress often use\n",{"type":40,"tag":79,"props":4163,"children":4165},{"className":4164},[],[4166],{"type":46,"value":4167},"data-cy",{"type":46,"value":4169}," instead; fall back to ",{"type":40,"tag":79,"props":4171,"children":4173},{"className":4172},[],[4174],{"type":46,"value":4175},"page.locator('[data-cy=\"...\"]')",{"type":46,"value":872},{"type":40,"tag":1301,"props":4178,"children":4179},{},[4180,4185,4187,4193,4195,4201,4202,4208,4210,4216,4218,4224],{"type":40,"tag":57,"props":4181,"children":4182},{},[4183],{"type":46,"value":4184},"No manual waits before interactions",{"type":46,"value":4186},": locator actions auto-wait for visibility and\nenabled state. Don't call ",{"type":40,"tag":79,"props":4188,"children":4190},{"className":4189},[],[4191],{"type":46,"value":4192},"waitFor()",{"type":46,"value":4194}," before ",{"type":40,"tag":79,"props":4196,"children":4198},{"className":4197},[],[4199],{"type":46,"value":4200},"click()",{"type":46,"value":2894},{"type":40,"tag":79,"props":4203,"children":4205},{"className":4204},[],[4206],{"type":46,"value":4207},"fill()",{"type":46,"value":4209},", don't use\n",{"type":40,"tag":79,"props":4211,"children":4213},{"className":4212},[],[4214],{"type":46,"value":4215},"waitForLoadState()",{"type":46,"value":4217},", never ",{"type":40,"tag":79,"props":4219,"children":4221},{"className":4220},[],[4222],{"type":46,"value":4223},"sleep()",{"type":46,"value":872},{"type":40,"tag":1301,"props":4226,"children":4227},{},[4228,4238,4239,4244,4245,4251,4253,4259,4260,4266,4268,4273,4275,4281],{"type":40,"tag":57,"props":4229,"children":4230},{},[4231,4233],{"type":46,"value":4232},"Auto-retrying ",{"type":40,"tag":79,"props":4234,"children":4236},{"className":4235},[],[4237],{"type":46,"value":648},{"type":46,"value":1157},{"type":40,"tag":79,"props":4240,"children":4242},{"className":4241},[],[4243],{"type":46,"value":3875},{"type":46,"value":147},{"type":40,"tag":79,"props":4246,"children":4248},{"className":4247},[],[4249],{"type":46,"value":4250},"toBeEnabled",{"type":46,"value":4252},", ...) is the wait mechanism\nfor asserting state you don't interact with. Caveat: despite being listed as\nretrying, the text matchers (",{"type":40,"tag":79,"props":4254,"children":4256},{"className":4255},[],[4257],{"type":46,"value":4258},"toHaveText",{"type":46,"value":2894},{"type":40,"tag":79,"props":4261,"children":4263},{"className":4262},[],[4264],{"type":46,"value":4265},"toContainText",{"type":46,"value":4267},") hard-fail on the first\n",{"type":40,"tag":141,"props":4269,"children":4270},{},[4271],{"type":46,"value":4272},"mismatched",{"type":46,"value":4274}," read — e.g. an empty string mid-hydration on a client-rendered app.\nAssert dynamic text by locating it and asserting visibility instead:\n",{"type":40,"tag":79,"props":4276,"children":4278},{"className":4277},[],[4279],{"type":46,"value":4280},"await expect(page.getByText('Order confirmed')).toBeVisible()",{"type":46,"value":872},{"type":40,"tag":1301,"props":4283,"children":4284},{},[4285,4290,4292,4298],{"type":40,"tag":57,"props":4286,"children":4287},{},[4288],{"type":46,"value":4289},"Assertion timeout defaults to 5s",{"type":46,"value":4291}," — client-side-rendered apps routinely take\nlonger to first meaningful render. Raise it once and use the configured instance:\n",{"type":40,"tag":79,"props":4293,"children":4295},{"className":4294},[],[4296],{"type":46,"value":4297},"const expectUi = expect.configure({ timeout: 20000 });",{"type":46,"value":872},{"type":40,"tag":1301,"props":4300,"children":4301},{},[4302,4307],{"type":40,"tag":57,"props":4303,"children":4304},{},[4305],{"type":46,"value":4306},"Assert the outcome",{"type":46,"value":4308}," (logged-in heading, order list, confirmation text) — a page can\nload fine while the journey is broken.",{"type":40,"tag":1301,"props":4310,"children":4311},{},[4312,4329],{"type":40,"tag":57,"props":4313,"children":4314},{},[4315,4321,4323],{"type":40,"tag":79,"props":4316,"children":4318},{"className":4317},[],[4319],{"type":46,"value":4320},"try\u002Ffinally",{"type":46,"value":4322}," with ",{"type":40,"tag":79,"props":4324,"children":4326},{"className":4325},[],[4327],{"type":46,"value":4328},"page.close()",{"type":46,"value":4330}," so the browser is released even when an\nassertion throws.",{"type":40,"tag":1301,"props":4332,"children":4333},{},[4334,4336,4342],{"type":46,"value":4335},"Screenshot artifacts aren't a documented SM feature — don't build failure handling\naround ",{"type":40,"tag":79,"props":4337,"children":4339},{"className":4338},[],[4340],{"type":46,"value":4341},"page.screenshot()",{"type":46,"value":4343},"; rely on assertion messages and the check's logs (SM stores\nper-execution logs in Loki).",{"type":40,"tag":1301,"props":4345,"children":4346},{},[4347,4349,4355],{"type":46,"value":4348},"Web Vitals (",{"type":40,"tag":79,"props":4350,"children":4352},{"className":4351},[],[4353],{"type":46,"value":4354},"probe_browser_web_vital_lcp|cls|fcp|inp|ttfb",{"type":46,"value":4356},") are collected\nautomatically — no extra code needed.",{"type":40,"tag":87,"props":4358,"children":4360},{"id":4359},"validate-locally-then-deploy",[4361],{"type":46,"value":4362},"Validate locally, then deploy",{"type":40,"tag":53,"props":4364,"children":4365},{},[4366],{"type":46,"value":4367},"SM scripts are plain k6 scripts — always run them locally first:",{"type":40,"tag":708,"props":4369,"children":4373},{"className":4370,"code":4371,"language":4372,"meta":713,"style":713},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","k6 run script.js                                              # scripted check\nK6_BROWSER_HEADLESS=true k6 run browser-check.js              # browser check\nk6 run --secret-source=mock=checkout-monitor-password=example-password script.js   # with secrets\n# Many\u002Flarge secrets: k6 run --secret-source=file=secrets.txt script.js\n","bash",[4374],{"type":40,"tag":79,"props":4375,"children":4376},{"__ignoreMap":713},[4377,4400,4436,4461],{"type":40,"tag":719,"props":4378,"children":4379},{"class":721,"line":722},[4380,4385,4390,4395],{"type":40,"tag":719,"props":4381,"children":4383},{"style":4382},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[4384],{"type":46,"value":202},{"type":40,"tag":719,"props":4386,"children":4387},{"style":759},[4388],{"type":46,"value":4389}," run",{"type":40,"tag":719,"props":4391,"children":4392},{"style":759},[4393],{"type":46,"value":4394}," script.js",{"type":40,"tag":719,"props":4396,"children":4397},{"style":840},[4398],{"type":46,"value":4399},"                                              # scripted check\n",{"type":40,"tag":719,"props":4401,"children":4402},{"class":721,"line":775},[4403,4408,4412,4417,4422,4426,4431],{"type":40,"tag":719,"props":4404,"children":4405},{"style":738},[4406],{"type":46,"value":4407},"K6_BROWSER_HEADLESS",{"type":40,"tag":719,"props":4409,"children":4410},{"style":732},[4411],{"type":46,"value":1540},{"type":40,"tag":719,"props":4413,"children":4414},{"style":759},[4415],{"type":46,"value":4416},"true",{"type":40,"tag":719,"props":4418,"children":4419},{"style":4382},[4420],{"type":46,"value":4421}," k6",{"type":40,"tag":719,"props":4423,"children":4424},{"style":759},[4425],{"type":46,"value":4389},{"type":40,"tag":719,"props":4427,"children":4428},{"style":759},[4429],{"type":46,"value":4430}," browser-check.js",{"type":40,"tag":719,"props":4432,"children":4433},{"style":840},[4434],{"type":46,"value":4435},"              # browser check\n",{"type":40,"tag":719,"props":4437,"children":4438},{"class":721,"line":826},[4439,4443,4447,4452,4456],{"type":40,"tag":719,"props":4440,"children":4441},{"style":4382},[4442],{"type":46,"value":202},{"type":40,"tag":719,"props":4444,"children":4445},{"style":759},[4446],{"type":46,"value":4389},{"type":40,"tag":719,"props":4448,"children":4449},{"style":759},[4450],{"type":46,"value":4451}," --secret-source=mock=checkout-monitor-password=example-password",{"type":40,"tag":719,"props":4453,"children":4454},{"style":759},[4455],{"type":46,"value":4394},{"type":40,"tag":719,"props":4457,"children":4458},{"style":840},[4459],{"type":46,"value":4460},"   # with secrets\n",{"type":40,"tag":719,"props":4462,"children":4463},{"class":721,"line":836},[4464],{"type":40,"tag":719,"props":4465,"children":4466},{"style":840},[4467],{"type":46,"value":4468},"# Many\u002Flarge secrets: k6 run --secret-source=file=secrets.txt script.js\n",{"type":40,"tag":53,"props":4470,"children":4471},{},[4472],{"type":46,"value":4473},"Pass = exit code 0, one iteration, no failed assertions in the summary. Run it 3–5 times;\na script that is 90% reliable locally will page you nightly from 3 probes.",{"type":40,"tag":53,"props":4475,"children":4476},{},[4477],{"type":46,"value":4478},"Then create the check (pick one):",{"type":40,"tag":2780,"props":4480,"children":4481},{},[4482,4511],{"type":40,"tag":1301,"props":4483,"children":4484},{},[4485,4490,4492,4496,4497,4502,4504,4509],{"type":40,"tag":57,"props":4486,"children":4487},{},[4488],{"type":46,"value":4489},"UI",{"type":46,"value":4491},": Testing & synthetics → Synthetics → Add new check → ",{"type":40,"tag":141,"props":4493,"children":4494},{},[4495],{"type":46,"value":1361},{"type":46,"value":693},{"type":40,"tag":141,"props":4498,"children":4499},{},[4500],{"type":46,"value":4501},"k6\nbrowser",{"type":46,"value":4503}," → paste script → select probes + frequency → ",{"type":40,"tag":57,"props":4505,"children":4506},{},[4507],{"type":46,"value":4508},"Test",{"type":46,"value":4510}," (runs once without\nsaving) → Save.",{"type":40,"tag":1301,"props":4512,"children":4513},{},[4514,4519,4521,4529,4531,4537,4538,4544,4545,4550,4552,4558,4560,4566,4567,4572,4574,4580],{"type":40,"tag":57,"props":4515,"children":4516},{},[4517],{"type":46,"value":4518},"API or Terraform",{"type":46,"value":4520},": see ",{"type":40,"tag":65,"props":4522,"children":4523},{"href":1321},[4524],{"type":40,"tag":79,"props":4525,"children":4527},{"className":4526},[],[4528],{"type":46,"value":1321},{"type":46,"value":4530},".\nKey gotchas: API ",{"type":40,"tag":79,"props":4532,"children":4534},{"className":4533},[],[4535],{"type":46,"value":4536},"frequency",{"type":46,"value":2894},{"type":40,"tag":79,"props":4539,"children":4541},{"className":4540},[],[4542],{"type":46,"value":4543},"timeout",{"type":46,"value":287},{"type":40,"tag":57,"props":4546,"children":4547},{},[4548],{"type":46,"value":4549},"milliseconds",{"type":46,"value":4551}," and ",{"type":40,"tag":79,"props":4553,"children":4555},{"className":4554},[],[4556],{"type":46,"value":4557},"settings.scripted.script",{"type":46,"value":4559},"\n\u002F ",{"type":40,"tag":79,"props":4561,"children":4563},{"className":4562},[],[4564],{"type":46,"value":4565},"settings.browser.script",{"type":46,"value":287},{"type":40,"tag":57,"props":4568,"children":4569},{},[4570],{"type":46,"value":4571},"base64-encoded",{"type":46,"value":4573},"; Terraform takes the plain script\nvia ",{"type":40,"tag":79,"props":4575,"children":4577},{"className":4576},[],[4578],{"type":46,"value":4579},"file()",{"type":46,"value":872},{"type":40,"tag":87,"props":4582,"children":4584},{"id":4583},"verify-it-works-and-rollback",[4585],{"type":46,"value":4586},"Verify it works, and rollback",{"type":40,"tag":53,"props":4588,"children":4589},{},[4590],{"type":46,"value":4591},"Wait one frequency interval, then in Explore against the Synthetic Monitoring metrics\n(Prometheus) datasource:",{"type":40,"tag":708,"props":4593,"children":4597},{"className":4594,"code":4595,"language":4596,"meta":713,"style":713},"language-promql shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","# 1 from every selected probe = healthy\nprobe_success{job=\"checkout-flow\"}\n\n# Assertion pass rate per named assertion (scripted\u002Fbrowser)\nprobe_check_success_rate{job=\"checkout-flow\"}\n\n# Journey duration per probe — confirm it's comfortably under the timeout\nprobe_script_duration_seconds{job=\"checkout-flow\"}\n\n# Uptime over time (how the SM app computes it)\nmax by () (max_over_time(probe_success{job=\"checkout-flow\"}[5m]))\n","promql",[4598],{"type":40,"tag":79,"props":4599,"children":4600},{"__ignoreMap":713},[4601,4609,4617,4624,4632,4640,4647,4655,4663,4670,4678],{"type":40,"tag":719,"props":4602,"children":4603},{"class":721,"line":722},[4604],{"type":40,"tag":719,"props":4605,"children":4606},{},[4607],{"type":46,"value":4608},"# 1 from every selected probe = healthy\n",{"type":40,"tag":719,"props":4610,"children":4611},{"class":721,"line":775},[4612],{"type":40,"tag":719,"props":4613,"children":4614},{},[4615],{"type":46,"value":4616},"probe_success{job=\"checkout-flow\"}\n",{"type":40,"tag":719,"props":4618,"children":4619},{"class":721,"line":826},[4620],{"type":40,"tag":719,"props":4621,"children":4622},{"emptyLinePlaceholder":830},[4623],{"type":46,"value":833},{"type":40,"tag":719,"props":4625,"children":4626},{"class":721,"line":836},[4627],{"type":40,"tag":719,"props":4628,"children":4629},{},[4630],{"type":46,"value":4631},"# Assertion pass rate per named assertion (scripted\u002Fbrowser)\n",{"type":40,"tag":719,"props":4633,"children":4634},{"class":721,"line":846},[4635],{"type":40,"tag":719,"props":4636,"children":4637},{},[4638],{"type":46,"value":4639},"probe_check_success_rate{job=\"checkout-flow\"}\n",{"type":40,"tag":719,"props":4641,"children":4642},{"class":721,"line":855},[4643],{"type":40,"tag":719,"props":4644,"children":4645},{"emptyLinePlaceholder":830},[4646],{"type":46,"value":833},{"type":40,"tag":719,"props":4648,"children":4649},{"class":721,"line":930},[4650],{"type":40,"tag":719,"props":4651,"children":4652},{},[4653],{"type":46,"value":4654},"# Journey duration per probe — confirm it's comfortably under the timeout\n",{"type":40,"tag":719,"props":4656,"children":4657},{"class":721,"line":991},[4658],{"type":40,"tag":719,"props":4659,"children":4660},{},[4661],{"type":46,"value":4662},"probe_script_duration_seconds{job=\"checkout-flow\"}\n",{"type":40,"tag":719,"props":4664,"children":4665},{"class":721,"line":999},[4666],{"type":40,"tag":719,"props":4667,"children":4668},{"emptyLinePlaceholder":830},[4669],{"type":46,"value":833},{"type":40,"tag":719,"props":4671,"children":4672},{"class":721,"line":1008},[4673],{"type":40,"tag":719,"props":4674,"children":4675},{},[4676],{"type":46,"value":4677},"# Uptime over time (how the SM app computes it)\n",{"type":40,"tag":719,"props":4679,"children":4680},{"class":721,"line":1090},[4681],{"type":40,"tag":719,"props":4682,"children":4683},{},[4684],{"type":46,"value":4685},"max by () (max_over_time(probe_success{job=\"checkout-flow\"}[5m]))\n",{"type":40,"tag":53,"props":4687,"children":4688},{},[4689,4691,4697,4699,4704,4706,4712],{"type":46,"value":4690},"A healthy first execution: ",{"type":40,"tag":79,"props":4692,"children":4694},{"className":4693},[],[4695],{"type":46,"value":4696},"probe_success == 1",{"type":46,"value":4698}," from every probe, all\n",{"type":40,"tag":79,"props":4700,"children":4702},{"className":4701},[],[4703],{"type":46,"value":699},{"type":46,"value":4705}," series at 1, duration stable across probes, and the check's\nprebuilt dashboard (Synthetics → check → View dashboard) showing logs for each execution.\nBrowser checks should additionally show ",{"type":40,"tag":79,"props":4707,"children":4709},{"className":4708},[],[4710],{"type":46,"value":4711},"probe_browser_web_vital_*",{"type":46,"value":4713}," series.",{"type":40,"tag":53,"props":4715,"children":4716},{},[4717,4722,4724,4730,4732,4738,4740,4745,4747,4755],{"type":40,"tag":57,"props":4718,"children":4719},{},[4720],{"type":46,"value":4721},"Rollback",{"type":46,"value":4723},": set the check's ",{"type":40,"tag":79,"props":4725,"children":4727},{"className":4726},[],[4728],{"type":46,"value":4729},"enabled: false",{"type":46,"value":4731}," (UI toggle, API update, or Terraform) to\nstop executions without losing history; delete the check only when you no longer need\nits configuration. Alerting: start with ",{"type":40,"tag":79,"props":4733,"children":4735},{"className":4734},[],[4736],{"type":46,"value":4737},"alertSensitivity",{"type":46,"value":4739}," \u002F the default alert rules on\n",{"type":40,"tag":79,"props":4741,"children":4743},{"className":4742},[],[4744],{"type":46,"value":625},{"type":46,"value":4746}," — see the ",{"type":40,"tag":65,"props":4748,"children":4749},{"href":76},[4750],{"type":40,"tag":79,"props":4751,"children":4753},{"className":4752},[],[4754],{"type":46,"value":22},{"type":46,"value":4756}," skill for alert rule examples.",{"type":40,"tag":87,"props":4758,"children":4760},{"id":4759},"common-failure-modes",[4761],{"type":46,"value":4762},"Common failure modes",{"type":40,"tag":212,"props":4764,"children":4765},{},[4766,4782],{"type":40,"tag":216,"props":4767,"children":4768},{},[4769],{"type":40,"tag":220,"props":4770,"children":4771},{},[4772,4777],{"type":40,"tag":224,"props":4773,"children":4774},{},[4775],{"type":46,"value":4776},"Symptom",{"type":40,"tag":224,"props":4778,"children":4779},{},[4780],{"type":46,"value":4781},"Cause → fix",{"type":40,"tag":235,"props":4783,"children":4784},{},[4785,4807,4841,4894,4927,4959,4988,5021,5034,5052,5065],{"type":40,"tag":220,"props":4786,"children":4787},{},[4788,4793],{"type":40,"tag":242,"props":4789,"children":4790},{},[4791],{"type":46,"value":4792},"Passes locally, fails on all probes",{"type":40,"tag":242,"props":4794,"children":4795},{},[4796,4798,4805],{"type":46,"value":4797},"Target not reachable from the public internet (internal DNS, VPN, IP allowlist). Use ",{"type":40,"tag":65,"props":4799,"children":4802},{"href":4800,"rel":4801},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fset-up\u002Fset-up-private-probes\u002F",[69],[4803],{"type":46,"value":4804},"private probes",{"type":46,"value":4806}," for internal targets, or allowlist probe egress",{"type":40,"tag":220,"props":4808,"children":4809},{},[4810,4822],{"type":40,"tag":242,"props":4811,"children":4812},{},[4813,4815,4820],{"type":46,"value":4814},"Passes locally, fails on ",{"type":40,"tag":141,"props":4816,"children":4817},{},[4818],{"type":46,"value":4819},"some",{"type":46,"value":4821}," probes",{"type":40,"tag":242,"props":4823,"children":4824},{},[4825,4827,4832,4834,4839],{"type":46,"value":4826},"Geo-blocking, regional CDN\u002FWAF rules, or bot protection challenging datacenter IPs. Check ",{"type":40,"tag":79,"props":4828,"children":4830},{"className":4829},[],[4831],{"type":46,"value":152},{"type":46,"value":4833}," label on failures; exempt the SM ",{"type":40,"tag":79,"props":4835,"children":4837},{"className":4836},[],[4838],{"type":46,"value":571},{"type":46,"value":4840}," or those regions in the WAF",{"type":40,"tag":220,"props":4842,"children":4843},{},[4844,4856],{"type":40,"tag":242,"props":4845,"children":4846},{},[4847,4849,4854],{"type":46,"value":4848},"Check \"fails\" in your eyes but ",{"type":40,"tag":79,"props":4850,"children":4852},{"className":4851},[],[4853],{"type":46,"value":625},{"type":46,"value":4855}," stays 1",{"type":40,"tag":242,"props":4857,"children":4858},{},[4859,4861,4866,4868,4873,4874,4879,4881,4886,4888],{"type":46,"value":4860},"Bare ",{"type":40,"tag":79,"props":4862,"children":4864},{"className":4863},[],[4865],{"type":46,"value":681},{"type":46,"value":4867}," without ",{"type":40,"tag":79,"props":4869,"children":4871},{"className":4870},[],[4872],{"type":46,"value":640},{"type":46,"value":2894},{"type":40,"tag":79,"props":4875,"children":4877},{"className":4876},[],[4878],{"type":46,"value":648},{"type":46,"value":4880}," — failures are recorded as metrics only. Convert to ",{"type":40,"tag":79,"props":4882,"children":4884},{"className":4883},[],[4885],{"type":46,"value":648},{"type":46,"value":4887}," or ",{"type":40,"tag":79,"props":4889,"children":4891},{"className":4890},[],[4892],{"type":46,"value":4893},"check(...) || fail(...)",{"type":40,"tag":220,"props":4895,"children":4896},{},[4897,4902],{"type":40,"tag":242,"props":4898,"children":4899},{},[4900],{"type":46,"value":4901},"Browser check flaps with locator timeouts",{"type":40,"tag":242,"props":4903,"children":4904},{},[4905,4907,4912,4913,4918,4920,4925],{"type":46,"value":4906},"Brittle selectors or animation timing. Switch to ",{"type":40,"tag":79,"props":4908,"children":4910},{"className":4909},[],[4911],{"type":46,"value":3697},{"type":46,"value":2894},{"type":40,"tag":79,"props":4914,"children":4916},{"className":4915},[],[4917],{"type":46,"value":4007},{"type":46,"value":4919},", assert with auto-retrying ",{"type":40,"tag":79,"props":4921,"children":4923},{"className":4922},[],[4924],{"type":46,"value":648},{"type":46,"value":4926},", remove manual waits",{"type":40,"tag":220,"props":4928,"children":4929},{},[4930,4948],{"type":40,"tag":242,"props":4931,"children":4932},{},[4933,4938,4940,4946],{"type":40,"tag":79,"props":4934,"children":4936},{"className":4935},[],[4937],{"type":46,"value":3875},{"type":46,"value":4939}," reports ",{"type":40,"tag":79,"props":4941,"children":4943},{"className":4942},[],[4944],{"type":46,"value":4945},"Expected: visible \u002F Received: hidden",{"type":46,"value":4947}," but the element is clearly visible",{"type":40,"tag":242,"props":4949,"children":4950},{},[4951,4953],{"type":46,"value":4952},"The locator matches multiple elements (strict mode) — the error message is misleading. Tighten the selector or use ",{"type":40,"tag":79,"props":4954,"children":4956},{"className":4955},[],[4957],{"type":46,"value":4958},".first()",{"type":40,"tag":220,"props":4960,"children":4961},{},[4962,4967],{"type":40,"tag":242,"props":4963,"children":4964},{},[4965],{"type":46,"value":4966},"Create succeeds but readback 404s on every execution",{"type":40,"tag":242,"props":4968,"children":4969},{},[4970,4972,4978,4980,4986],{"type":46,"value":4971},"The id exceeds ",{"type":40,"tag":79,"props":4973,"children":4975},{"className":4974},[],[4976],{"type":46,"value":4977},"Number.MAX_SAFE_INTEGER",{"type":46,"value":4979}," (2^53) and ",{"type":40,"tag":79,"props":4981,"children":4983},{"className":4982},[],[4984],{"type":46,"value":4985},"res.json()",{"type":46,"value":4987}," silently rounded it — extract int64 ids from the raw body as strings (see the OpenAPI section)",{"type":40,"tag":220,"props":4989,"children":4990},{},[4991,5001],{"type":40,"tag":242,"props":4992,"children":4993},{},[4994,4999],{"type":40,"tag":79,"props":4995,"children":4997},{"className":4996},[],[4998],{"type":46,"value":2958},{"type":46,"value":5000}," fails",{"type":40,"tag":242,"props":5002,"children":5003},{},[5004,5006,5012,5013,5019],{"type":46,"value":5005},"Secret name mismatch (names are exact, ≤253 chars, letters\u002Fnumbers\u002F",{"type":40,"tag":79,"props":5007,"children":5009},{"className":5008},[],[5010],{"type":46,"value":5011},"-",{"type":46,"value":2894},{"type":40,"tag":79,"props":5014,"children":5016},{"className":5015},[],[5017],{"type":46,"value":5018},"_",{"type":46,"value":5020},"), secret deleted (checks fail until recreated), or the editing user lacks the Admin\u002FEditor role or \"Checks writer\" permission",{"type":40,"tag":220,"props":5022,"children":5023},{},[5024,5029],{"type":40,"tag":242,"props":5025,"children":5026},{},[5027],{"type":46,"value":5028},"Executions time out but the journey is fine",{"type":40,"tag":242,"props":5030,"children":5031},{},[5032],{"type":46,"value":5033},"Timeout too low for the journey (max 180s) — raise it; or the script does unbounded work per iteration. Also confirm timeout \u003C frequency",{"type":40,"tag":220,"props":5035,"children":5036},{},[5037,5047],{"type":40,"tag":242,"props":5038,"children":5039},{},[5040,5045],{"type":40,"tag":79,"props":5041,"children":5043},{"className":5042},[],[5044],{"type":46,"value":597},{"type":46,"value":5046}," in browser check logs",{"type":40,"tag":242,"props":5048,"children":5049},{},[5050],{"type":46,"value":5051},"Page exceeds the 1GB probe browser memory — trim the journey, block heavy third-party resources, or use a private probe with more memory",{"type":40,"tag":220,"props":5053,"children":5054},{},[5055,5060],{"type":40,"tag":242,"props":5056,"children":5057},{},[5058],{"type":46,"value":5059},"UI rejects a browser script",{"type":40,"tag":242,"props":5061,"children":5062},{},[5063],{"type":46,"value":5064},"Bundled\u002Fminified script fails the UI's import validation — create it via API or Terraform instead",{"type":40,"tag":220,"props":5066,"children":5067},{},[5068,5073],{"type":40,"tag":242,"props":5069,"children":5070},{},[5071],{"type":46,"value":5072},"Metrics\u002Fbilling explosion after adding a check",{"type":40,"tag":242,"props":5074,"children":5075},{},[5076,5078,5083],{"type":46,"value":5077},"Unique IDs in URLs creating per-execution time series — use ",{"type":40,"tag":79,"props":5079,"children":5081},{"className":5080},[],[5082],{"type":46,"value":2844},{"type":46,"value":5084},", and check frequency × probe count against the cost formula above",{"type":40,"tag":87,"props":5086,"children":5088},{"id":5087},"references",[5089],{"type":46,"value":5090},"References",{"type":40,"tag":2780,"props":5092,"children":5093},{},[5094],{"type":40,"tag":1301,"props":5095,"children":5096},{},[5097,5105],{"type":40,"tag":65,"props":5098,"children":5099},{"href":1321},[5100],{"type":40,"tag":79,"props":5101,"children":5103},{"className":5102},[],[5104],{"type":46,"value":1321},{"type":46,"value":5106}," — SM API auth + check CRUD payloads (scripted, browser, MultiHTTP) and Terraform examples for every check type, including the protocol checks (HTTP, ping, DNS, TCP, traceroute, gRPC)",{"type":40,"tag":87,"props":5108,"children":5110},{"id":5109},"resources",[5111],{"type":46,"value":5112},"Resources",{"type":40,"tag":2780,"props":5114,"children":5115},{},[5116,5125,5144,5154,5178],{"type":40,"tag":1301,"props":5117,"children":5118},{},[5119],{"type":40,"tag":65,"props":5120,"children":5122},{"href":67,"rel":5121},[69],[5123],{"type":46,"value":5124},"Synthetic Monitoring docs",{"type":40,"tag":1301,"props":5126,"children":5127},{},[5128,5135,5137],{"type":40,"tag":65,"props":5129,"children":5132},{"href":5130,"rel":5131},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fcreate-checks\u002Fchecks\u002Fk6\u002F",[69],[5133],{"type":46,"value":5134},"k6 scripted checks",{"type":46,"value":5136}," · ",{"type":40,"tag":65,"props":5138,"children":5141},{"href":5139,"rel":5140},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fcreate-checks\u002Fchecks\u002Fk6-browser\u002F",[69],[5142],{"type":46,"value":5143},"k6 browser checks",{"type":40,"tag":1301,"props":5145,"children":5146},{},[5147],{"type":40,"tag":65,"props":5148,"children":5151},{"href":5149,"rel":5150},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fgrafana-cloud\u002Ftesting\u002Fsynthetic-monitoring\u002Fcreate-checks\u002Fmanage-secrets\u002F",[69],[5152],{"type":46,"value":5153},"Secrets management",{"type":40,"tag":1301,"props":5155,"children":5156},{},[5157,5170,5171],{"type":40,"tag":65,"props":5158,"children":5161},{"href":5159,"rel":5160},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fk6\u002Flatest\u002Fusing-k6\u002Fassertions\u002F",[69],[5162,5164,5169],{"type":46,"value":5163},"k6 assertions (",{"type":40,"tag":79,"props":5165,"children":5167},{"className":5166},[],[5168],{"type":46,"value":862},{"type":46,"value":899},{"type":46,"value":5136},{"type":40,"tag":65,"props":5172,"children":5175},{"href":5173,"rel":5174},"https:\u002F\u002Fgrafana.com\u002Fdocs\u002Fk6\u002Flatest\u002Fusing-k6-browser\u002F",[69],[5176],{"type":46,"value":5177},"k6 browser module",{"type":40,"tag":1301,"props":5179,"children":5180},{},[5181,5183,5188,5190],{"type":46,"value":5182},"k6 fundamentals and load testing: ",{"type":40,"tag":79,"props":5184,"children":5186},{"className":5185},[],[5187],{"type":46,"value":194},{"type":46,"value":5189}," plugin, ",{"type":40,"tag":65,"props":5191,"children":5193},{"href":5192},"..\u002F..\u002Fgrafana-k6\u002Fk6\u002FSKILL.md",[5194,5199],{"type":40,"tag":79,"props":5195,"children":5197},{"className":5196},[],[5198],{"type":46,"value":202},{"type":46,"value":5200}," skill",{"type":40,"tag":5202,"props":5203,"children":5204},"style",{},[5205],{"type":46,"value":5206},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":5208,"total":5393},[5209,5226,5245,5264,5279,5295,5308,5321,5338,5353,5366,5381],{"slug":5210,"name":5210,"fn":5211,"description":5212,"org":5213,"tags":5214,"stars":5223,"repoUrl":5224,"updatedAt":5225},"faro-setup-web","instrument web apps with Grafana Faro","Instruments a web app with Grafana Faro Web SDK for frontend observability. Use when setting up error tracking, Web Vitals, session monitoring, or distributed tracing in a browser app.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5215,5218,5221,5222],{"name":5216,"slug":5217,"type":15},"Distributed Tracing","distributed-tracing",{"name":5219,"slug":5220,"type":15},"Frontend","frontend",{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},1103,"https:\u002F\u002Fgithub.com\u002Fgrafana\u002Ffaro-web-sdk","2026-07-12T07:43:24.63314",{"slug":5227,"name":5227,"fn":5228,"description":5229,"org":5230,"tags":5231,"stars":5242,"repoUrl":5243,"updatedAt":5244},"configuring-yesoreyeram-infinity-datasource","configure Grafana Infinity data source","Configure the Infinity data source — base URL and allowed hosts, the authentication methods (basic, bearer token, API key, digest, OAuth passthrough, OAuth 2.0 client credentials\u002FJWT, Azure, Azure Blob, AWS), TLS, custom HTTP headers, network and security settings, the custom health check, and provisioning with a config file. Use when a user asks how to set up, configure, or change settings for the Infinity data source; how to authenticate to an API; how to allow hosts; how to provision it as YAML; or how to troubleshoot connection, authentication, or health-check issues.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5232,5235,5238,5241],{"name":5233,"slug":5234,"type":15},"API Development","api-development",{"name":5236,"slug":5237,"type":15},"Authentication","authentication",{"name":5239,"slug":5240,"type":15},"Configuration","configuration",{"name":9,"slug":8,"type":15},1056,"https:\u002F\u002Fgithub.com\u002Fgrafana\u002Fgrafana-infinity-datasource","2026-07-12T07:43:25.939136",{"slug":5246,"name":5246,"fn":5247,"description":5248,"org":5249,"tags":5250,"stars":5242,"repoUrl":5243,"updatedAt":5263},"querying-yesoreyeram-infinity-datasource","query data with Infinity datasource","Build queries with the Infinity data source — the query types (JSON, CSV, TSV, XML, GraphQL, HTML, UQL, GROQ, Google Sheets, Series, Transformations), the parsers (Frontend\u002Fsimple, Backend JSONata, JQ, UQL, GROQ) and which support alerting, the sources (URL, Inline, Reference, Azure Blob, Random walk), output formats (table, timeseries, logs, trace, node graph, dataframe), root selector and columns, computed columns\u002Ffilters\u002Fsummarize, pagination, and template variables. Use when a user asks how to query Infinity; how to fetch JSON\u002FCSV\u002FXML\u002FGraphQL\u002FHTML from a URL or inline; how to select rows and columns; how to transform data with UQL\u002FGROQ\u002FJSONata\u002FJQ; how to make a query work with alerting; how to paginate; or how to use variables in a query.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5251,5254,5257,5258,5261],{"name":5252,"slug":5253,"type":15},"CSV","csv",{"name":5255,"slug":5256,"type":15},"Data Analysis","data-analysis",{"name":9,"slug":8,"type":15},{"name":5259,"slug":5260,"type":15},"GraphQL","graphql",{"name":5262,"slug":948,"type":15},"JSON","2026-07-15T05:34:05.773947",{"slug":5265,"name":5265,"fn":5266,"description":5267,"org":5268,"tags":5269,"stars":5276,"repoUrl":5277,"updatedAt":5278},"agento11y","manage Grafana Agent Observability resources","Inspects and manages Grafana Agent Observability resources via gcx: conversations, generations, evaluators, rules, scores, and templates. Use when the user wants to list or search conversations, inspect generations, manage evaluators (upsert, test, delete), set up evaluation rules, check scores, or browse evaluator templates. Trigger on phrases like \"list conversations\", \"search generations\", \"what did the agent do\", \"debug LLM conversation\", \"create evaluator\", \"set up evaluation rule\", \"test evaluator\", \"check scores\", \"evaluate generation quality\", or \"set up online evaluation\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5270,5273,5274,5275],{"name":5271,"slug":5272,"type":15},"Agents","agents",{"name":9,"slug":8,"type":15},{"name":17,"slug":18,"type":15},{"name":13,"slug":14,"type":15},430,"https:\u002F\u002Fgithub.com\u002Fgrafana\u002Fgcx","2026-07-25T05:30:40.29622",{"slug":5280,"name":5280,"fn":5281,"description":5282,"org":5283,"tags":5284,"stars":5276,"repoUrl":5277,"updatedAt":5294},"agento11y-instrument","instrument LLM apps for agent observability","Sets up and instruments a developer's own LLM app or agent to send generations and agentic workflow to Grafana Agent Observability (the Agent Observability SDKs) — greenfield setup, fixing broken instrumentation, or filling gaps in existing instrumentation. Uses gcx for the parts a static prompt can't do: `gcx login` \u002F `gcx cloud stacks` to find the stack, and `gcx agento11y agents|conversations|generations` to VERIFY that data actually lands — so it iterates (instrument → run → verify → fix) until generations arrive, not blindly. Reads the app's code, detects language\u002Fframework, classifies instrumentation state (none \u002F partial \u002F broken), then runs a fixed gap checklist whose #1 item is the silent failure no other prompt catches: the SDK emits OTel spans\u002Fmetrics but never creates a TracerProvider\u002FMeterProvider, so without them all metrics go to a no-op and are lost. Also checks agent_version (required for per-version Performance charts), set_result completeness, SYNC vs STREAM, parent_generation_ids DAG links, and workflow-step coverage. Recommends changes citing file:line and, only with explicit confirmation, applies minimal diffs that don't change app behavior. Pulls SDK reference from agento11y's llms.txt rather than restating it, and hands off to `agento11y-test-starter` once data flows. It does NOT write test suites or set up tenant evaluations, rules, or guards — offline test suites are `agento11y-test-starter`, tenant eval rules + guards are `agento11y-prod-setup`; does NOT install coding-agent telemetry plugins (that is llms.txt \"Path A\"); does NOT mint or store credentials or invent endpoints. Trigger on phrases like \"instrument my app\", \"send my agent's traces to Grafana\", \"set up AI observability for my app\", \"my generations aren't showing up\", \"why is Performance empty\", \"add Agent Observability to my code\", \"fix my instrumentation\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5285,5286,5287,5290,5293],{"name":5271,"slug":5272,"type":15},{"name":9,"slug":8,"type":15},{"name":5288,"slug":5289,"type":15},"Instrumentation","instrumentation",{"name":5291,"slug":5292,"type":15},"LLM","llm",{"name":13,"slug":14,"type":15},"2026-07-31T05:53:52.580237",{"slug":5296,"name":5296,"fn":5297,"description":5298,"org":5299,"tags":5300,"stars":5276,"repoUrl":5277,"updatedAt":5307},"agento11y-prod-setup","setup production evaluation for AI agents","Sets up production evaluation and guardrails for a DEPLOYED AI agent in Grafana Agent Observability, grounded in the agent's own code and its real ingested traffic. The judgment layer on top of the `agento11y` skill: it reads the agent's source (system prompt, tools, entrypoint) AND samples its live traffic via gcx, checks what evaluators\u002Frules\u002Fguards already exist, then recommends only what's missing — online eval rules (score live conversations for regressions) and guards (warn-first request-path policies that redact \u002F tool-filter and may later be promoted to deny). It drafts reviewable YAML and, only with explicit confirmation, applies via `gcx agento11y`. New guards are drafted in warn mode (safe on live traffic — warn records but never blocks). It DOES create stack-level objects — that is the point — but every write is confirmed. It never rewrites or redeploys the agent. Trigger on phrases like \"set up production evaluation\", \"my agent is in prod what should I evaluate\", \"catch quality regressions\", \"add guardrails to my agent\", \"redact PII from my agent\", \"block dangerous tools\", \"set up online evals and guards\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5301,5302,5305,5306],{"name":5271,"slug":5272,"type":15},{"name":5303,"slug":5304,"type":15},"Evals","evals",{"name":9,"slug":8,"type":15},{"name":13,"slug":14,"type":15},"2026-07-31T05:53:53.576347",{"slug":5309,"name":5309,"fn":5310,"description":5311,"org":5312,"tags":5313,"stars":5276,"repoUrl":5277,"updatedAt":5320},"agento11y-test-starter","build and run agent test suites","Use early in an AI-agent project — before ship, before real traffic — to build a starter test suite for the agent and run it offline. Reads the agent's own code (system prompt, tools, task), writes a labeled draft suite of test cases (happy\u002Fedge\u002Fadversarial) grounded in real lines, and recommends how to score each case (the evaluators\u002Fjudges the offline runner uses). Assesses how runnable the agent is: for an easily-invoked agent it generates a runner stub (run_experiment.py) with two holes to fill and can optionally run it (only with permission, only against the endpoint the developer configured); for agents needing a harness or full runtime it points to the existing eval infra. It runs OFFLINE and never creates tenant-level evaluators, rules, or guards — that is `agento11y-prod-setup`, for a deployed agent with real traffic. Trigger on phrases like \"how do I test my agent before shipping\", \"write test cases for my agent\", \"set up tests for my agent\", \"check my agent before prod\", \"I have no traffic yet, how do I evaluate it\", \"test my agent offline\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5314,5315,5316,5319],{"name":5271,"slug":5272,"type":15},{"name":9,"slug":8,"type":15},{"name":5317,"slug":5318,"type":15},"QA","qa",{"name":21,"slug":22,"type":15},"2026-07-31T05:53:51.62785",{"slug":5322,"name":5322,"fn":5323,"description":5324,"org":5325,"tags":5326,"stars":5276,"repoUrl":5277,"updatedAt":5337},"create-dashboard","create Grafana dashboards with gcx","Designs and creates Grafana dashboards with gcx, using `gcx dashboards snapshot` as a visual feedback loop. Use when the user wants to create a new Grafana dashboard, add panels, variables, or annotations to an existing dashboard, design dashboard panels, variables, queries, or layout, or make a material visual redesign. Triggers on \"create dashboard\", \"new dashboard\", \"build dashboard\", \"dashboard for \u003Cservice>\", \"add panels\", \"add variable\", \"add annotation\", \"improve this dashboard\", or \"iterate on a dashboard\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5327,5330,5333,5336],{"name":5328,"slug":5329,"type":15},"Dashboards","dashboards",{"name":5331,"slug":5332,"type":15},"Data Visualization","data-visualization",{"name":5334,"slug":5335,"type":15},"Design","design",{"name":9,"slug":8,"type":15},"2026-07-25T05:30:46.289717",{"slug":5339,"name":5339,"fn":5340,"description":5341,"org":5342,"tags":5343,"stars":5276,"repoUrl":5277,"updatedAt":5352},"debug-with-grafana","investigate application issues with Grafana","Structured workflow for investigating application problems with Grafana observability data (metrics, logs, traces) via gcx. Covers live firefighting AND retrospective incident analysis: incident triage, root-cause analysis, blast-radius checks (did an incident spill into other services), verifying whether a deployment or rollout triggered an incident, finding which service, endpoint, or path owns the most errors or slow requests, checking whether retries or queue backlogs piled up, and quantifying error or latency shares over a time window. Trigger on: \"my API is returning 500 errors\", \"latency is spiking\", \"investigate why requests are failing\", \"triage the incident\", \"blast radius\", \"root cause\", \"did the rollout cause it\", \"which endpoint owns the most 5xx\", \"did retries pile up\", or any request to analyse an earlier incident window using telemetry. For authoring dashboards use create-dashboard; for dashboard inventory use manage-dashboards.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5344,5347,5348,5351],{"name":5345,"slug":5346,"type":15},"Debugging","debugging",{"name":9,"slug":8,"type":15},{"name":5349,"slug":5350,"type":15},"Incident Response","incident-response",{"name":13,"slug":14,"type":15},"2026-07-18T05:11:10.445428",{"slug":5354,"name":5354,"fn":5355,"description":5356,"org":5357,"tags":5358,"stars":5276,"repoUrl":5277,"updatedAt":5365},"diagnose-entity-graph","diagnose Grafana Entity Graph issues","Diagnose Entity Graph problems: missing entities, missing edges, disconnected clusters, or filtering issues. Use when the user reports that Entity Graph doesn't look right, services are missing, edges aren't appearing, or environments can't be filtered. Triggers for: \"entity graph is empty\", \"services missing from entity graph\", \"no edges in entity graph\", \"disconnected services\", \"can't filter entity graph\", \"entity graph not working\", \"diagnose entity graph\", \"debug knowledge graph\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5359,5360,5361,5364],{"name":5345,"slug":5346,"type":15},{"name":9,"slug":8,"type":15},{"name":5362,"slug":5363,"type":15},"Graph Analysis","graph-analysis",{"name":13,"slug":14,"type":15},"2026-07-25T05:30:39.380934",{"slug":5367,"name":5367,"fn":5368,"description":5369,"org":5370,"tags":5371,"stars":5276,"repoUrl":5277,"updatedAt":5380},"gcx","manage Grafana Cloud resources via gcx","Manages Grafana Cloud resources via the gcx CLI. Trigger when the user wants to inspect, create, update, delete, query, or automate any Grafana resource - dashboards, datasources, alerts, SLOs, synthetic checks, oncall, incidents, fleet, k6, knowledge graph, or adaptive telemetry.\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5372,5375,5376,5377],{"name":5373,"slug":5374,"type":15},"CLI","cli",{"name":9,"slug":8,"type":15},{"name":17,"slug":18,"type":15},{"name":5378,"slug":5379,"type":15},"Operations","operations","2026-07-31T05:53:50.587304",{"slug":5382,"name":5382,"fn":5383,"description":5384,"org":5385,"tags":5386,"stars":5276,"repoUrl":5277,"updatedAt":5392},"gcx-demo","present gcx demo tours","Run a narrated, read-only demo tour of gcx for customer or colleague presentations. Showcases the breadth of gcx across every Grafana Cloud product area — resources, datasources, metrics, logs, traces, SLOs, alerts, synthetic monitoring, IRM, k6, fleet, and more. All commands are strictly read-only. Trigger when the user says \"demo gcx\", \"show off gcx\", \"customer demo\", \"gcx tour\", or \"\u002Fgcx-demo\".\n",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5387,5388,5389],{"name":5373,"slug":5374,"type":15},{"name":9,"slug":8,"type":15},{"name":5390,"slug":5391,"type":15},"Presentations","presentations","2026-07-25T05:30:45.282458",81,{"items":5395,"total":5500},[5396,5411,5426,5442,5455,5471,5485],{"slug":5397,"name":5397,"fn":5398,"description":5399,"org":5400,"tags":5401,"stars":23,"repoUrl":24,"updatedAt":5410},"adaptive-metrics","optimize Grafana Cloud metrics costs","Cut Grafana Cloud Metrics cost by shrinking active-series count with Adaptive Metrics aggregation rules — auto-recommendations from query history, custom exact\u002Fregex rules, label-drop config, unused-metric detection, and Alloy remote_write fallback. Use when investigating a high Mimir\u002FGrafana Cloud bill, hunting high-cardinality labels (`pod_uid`, `service_instance_id`, `version`), pre-aggregating counters\u002Fgauges, dropping unused metrics, or measuring `grafanacloud_instance_active_series` before\u002Fafter — even when the user says \"reduce cardinality\", \"too many series\", \"metrics spend\", \"active series count is exploding\", or \"drop the version label\" without naming Adaptive Metrics.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5402,5405,5406,5409],{"name":5403,"slug":5404,"type":15},"Cost Optimization","cost-optimization",{"name":9,"slug":8,"type":15},{"name":5407,"slug":5408,"type":15},"Metrics","metrics",{"name":13,"slug":14,"type":15},"2026-07-12T07:44:27.451068",{"slug":5412,"name":5412,"fn":5413,"description":5414,"org":5415,"tags":5416,"stars":23,"repoUrl":24,"updatedAt":5425},"admin","manage Grafana Cloud accounts and RBAC","Manage Grafana Cloud accounts — organizations, stacks, RBAC roles and assignments, SSO\u002FSAML\u002FOAuth\u002FGitHub auth, service accounts for CI\u002FCD, user invites, team membership, and API-driven provisioning. Creates stacks via the Cloud API, mints service-account tokens, applies role assignments, configures SSO providers, and provisions teams\u002Ffolders\u002Fdashboards via Terraform. Use when managing Grafana Cloud access, configuring SSO\u002FSAML\u002FOAuth, setting up service accounts for Terraform\u002FCI\u002FCD, assigning RBAC roles, inviting users, managing multiple stacks or organizations, provisioning cloud resources via API or Terraform, or auditing admin actions — even when the user says \"set up SSO\", \"create a stack\", \"make a service account\", or \"onboard a team\" without explicitly saying \"admin\".",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5417,5420,5423,5424],{"name":5418,"slug":5419,"type":15},"Access Control","access-control",{"name":5421,"slug":5422,"type":15},"Auth","auth",{"name":9,"slug":8,"type":15},{"name":5378,"slug":5379,"type":15},"2026-07-12T07:44:12.078436",{"slug":5427,"name":5427,"fn":5428,"description":5429,"org":5430,"tags":5431,"stars":23,"repoUrl":24,"updatedAt":5441},"admission-control","implement admission control webhooks","Use when the user asks to \"write a validator\", \"add validation\", \"implement admission control\", \"write a mutating webhook\", \"add a mutation handler\", \"validate incoming resources\", \"implement admission logic\", \"add admission webhooks\", \"write ingress validation\", or asks how to validate or mutate resources before they are persisted in a grafana-app-sdk app. Provides guidance on implementing validation and mutation admission handlers for grafana-app-sdk apps.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5432,5435,5438],{"name":5433,"slug":5434,"type":15},"Architecture","architecture",{"name":5436,"slug":5437,"type":15},"Security","security",{"name":5439,"slug":5440,"type":15},"Validation","validation","2026-07-12T07:45:06.148973",{"slug":5443,"name":5443,"fn":5444,"description":5445,"org":5446,"tags":5447,"stars":23,"repoUrl":24,"updatedAt":5454},"alerting-irm","configure Grafana Alerting and Incident Management","Configure Grafana Alerting, Incident Response Management (IRM), and SLOs end-to-end — provisions Grafana-managed and data-source-managed alert rules, contact points (Slack\u002FPagerDuty\u002Femail\u002Fwebhook), notification policies with hierarchical matchers, silences, mute timings, on-call schedules and escalation chains, incident-management integrations, and SLOs with multi-window burn-rate alerts. Use when configuring alerts, debugging notification routing, setting up on-call rotations, declaring or managing incidents, defining SLOs, provisioning alerting via YAML or API, picking matchers for a notification policy, building a PagerDuty\u002FSlack webhook receiver, or troubleshooting why an alert isn't firing — even when the user says \"page me on errors\", \"alert me when X happens\", \"route this to the platform team\", or \"set up an SLO\" without naming Alerting or IRM.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5448,5451,5452,5453],{"name":5449,"slug":5450,"type":15},"Alerting","alerting",{"name":9,"slug":8,"type":15},{"name":5349,"slug":5350,"type":15},{"name":17,"slug":18,"type":15},"2026-07-12T07:44:02.393397",{"slug":5456,"name":5456,"fn":5457,"description":5458,"org":5459,"tags":5460,"stars":23,"repoUrl":24,"updatedAt":5470},"alloy","build unified telemetry pipelines with Grafana Alloy","Build a unified telemetry pipeline with Grafana Alloy — one OpenTelemetry-compatible binary that collects metrics, logs, traces, and profiles and ships to Grafana Cloud \u002F Prometheus \u002F Loki \u002F Tempo \u002F Pyroscope. Covers the Alloy config language (blocks, `sys.env`, component refs), `prometheus.scrape` → `remote_write`, `loki.source.file` + `loki.process` → `loki.write`, `otelcol.receiver.otlp` → `otelcol.exporter.otlp`, `pyroscope.scrape`, K8s \u002F Docker \u002F EC2 discovery, relabeling, modules (`import.file\u002Fgit\u002Fhttp`), clustering, Fleet Management `remotecfg`, the Alloy UI at `:12345`, and `alloy fmt` \u002F `alloy validate`. Use when writing a `config.alloy`, replacing Grafana Agent \u002F OTel Collector, scraping K8s pods, parsing logs, ingesting OTLP, or debugging \"Alloy isn't sending anything\" — even when the user says \"set up the agent\", \"write me a scrape config\", \"drop these logs before sending\", or \"OTel collector config\" without naming Alloy.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5461,5462,5465,5466,5467],{"name":9,"slug":8,"type":15},{"name":5463,"slug":5464,"type":15},"Logs","logs",{"name":5407,"slug":5408,"type":15},{"name":13,"slug":14,"type":15},{"name":5468,"slug":5469,"type":15},"OpenTelemetry","opentelemetry","2026-07-12T07:43:54.817139",{"slug":5472,"name":5472,"fn":5473,"description":5474,"org":5475,"tags":5476,"stars":23,"repoUrl":24,"updatedAt":5484},"app-observability","monitor application performance in Grafana Cloud","Get RED metrics + service maps + frontend RUM + AI\u002FLLM monitoring out of Grafana Cloud — Application Observability (`traces_spanmetrics_*` from OTel traces, p50\u002Fp95\u002Fp99 latency, exemplar-to-trace, traces-to-logs \u002F profiles), Frontend Observability with the Faro Web SDK (Core Web Vitals, session replay, `pushError`, React + router integration, `TracingInstrumentation` for browser → backend trace correlation), and AI Observability via OpenLIT (token \u002F cost \u002F latency, GPU, hallucination + toxicity evals). Use when standing up APM for a service, wiring an Alloy OTLP receiver + forwarding to Cloud, instrumenting a React frontend for RUM, debugging why service-map edges are missing, monitoring LLM cost drift, or correlating a frontend error to its backend trace — even when the user says \"set up APM\", \"show service map\", \"monitor browser perf\", \"session replay\", \"RUM SDK\", or \"watch our OpenAI bill\" without naming App \u002F Frontend \u002F AI Observability.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5477,5480,5481,5482,5483],{"name":5478,"slug":5479,"type":15},"APM","apm",{"name":5216,"slug":5217,"type":15},{"name":9,"slug":8,"type":15},{"name":5291,"slug":5292,"type":15},{"name":13,"slug":14,"type":15},"2026-07-12T07:44:34.500406",{"slug":5486,"name":5486,"fn":5487,"description":5488,"org":5489,"tags":5490,"stars":23,"repoUrl":24,"updatedAt":5499},"app-sdk-concepts","scaffold and configure Grafana apps","Use when starting any grafana-app-sdk work — scaffolding a Grafana app, initializing a Grafana App Platform app, picking a deployment mode (standalone operator \u002F grafana\u002Fapps \u002F frontend-only), wiring app-specific config, or onboarding to the SDK. Covers `grafana-app-sdk` CLI install, `project init` per deployment mode, project layout, the schema-centric workflow (CUE kinds → generated code → reconciler\u002Fadmission logic), and `SpecificConfig` for env-driven app configuration. Use even if the user just says \"make a new app\", \"Grafana app platform\", \"kinds and watchers\", \"operator scaffold\", or asks about `apps\u002F` inside the Grafana repo, without naming the SDK explicitly.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":8},[5491,5492,5495,5498],{"name":5433,"slug":5434,"type":15},{"name":5493,"slug":5494,"type":15},"Deployment","deployment",{"name":5496,"slug":5497,"type":15},"Engineering","engineering",{"name":9,"slug":8,"type":15},"2026-07-12T07:45:08.595757",49]