Testing
Grafana LabsOfficialPublished by Grafana Labs
- Skill
- Tool integration
- Cloud and DevOps
- Apache-2.0
- Low risk
From the skill’s files
Taken from the skill’s own files (its description, section headings and stated usage). Not an AutoGineer summary, and not written by the author as one.
Probe, load-test, and instrument frontends from Grafana Cloud. Covers Synthetic Monitoring (HTTP / DNS / TCP / Ping / Traceroute / Multihttp / k6-browser scripted checks from 20+ global probes, alert on probe_success + TLS-cert expiry), Grafana Cloud k6 (distributed load tests across AWS load-zones, scenarios, http_req_duration thresholds, CI integration via grafana/k6-action), and Frontend Observability with Faro Web SDK (RUM, Core Web Vitals, custom events, pushError, distributed-trace correlation). Use when checking website / API uptime from multiple regions, gating a release on a load test, watching for TLS-cert renewal, instrumenting a React/Vue app, tracking Core Web Vitals, or correlating frontend errors to backend traces — even when the user says "is my login flow up?", "monitor my API", "ping our endpoint every minute", "release-gate load test", "browser performance…
What it does
- Prerequisites
- Common Workflows
- Troubleshooting
When to use it
- Use when checking website / API uptime from multiple regions, gating a release on a load test, watching for TLS-cert renewal, instrumenting a React/Vue app, tracking Core Web Vitals, or correlating…
Advantages
The skill’s files do not state this.
Usage examples
The skill’s files do not state this.
Install
Download the skill as a ZIP:
https://mp-staging.autogineer.com/agent-skills/grafana/testing/downloadUnzip it into the cross-client skills folder of your project:
mkdir -p .agents/skills && unzip testing.zip -d .agents/skills
Documentation by Grafana Labs
Grafana Cloud Testing
Three pillars: external probing (Synthetic Monitoring), load testing (k6 Cloud), real-user monitoring (Faro).
Prerequisites
Grafana Cloud stack
Synthetic Monitoring: SM access token (
sm:write)k6 Cloud: a Grafana Cloud k6 token + projectID
Faro: a Faro app + write-token from Frontend Observability → Apps
Common Workflows
1. Create + verify a Synthetic HTTP check
# 1. Create the check (full payload in references/synthetic.md)
curl -X POST https://synthetic-monitoring-api.grafana.net/sm/checks \
-H "Authorization: Bearer <sm-token>" -H "Content-Type: application/json" \
-d '{"job":"website","target":"https://example.com","frequency":60000,"timeout":15000,
"enabled":true,"probes":[1,5,10],
"settings":{"http":{"method":"GET","validStatusCodes":[200]}}}'
# 2. List checks — confirm it exists and is enabled
curl -s https://synthetic-monitoring-api.grafana.net/sm/checks \
-H "Authorization: Bearer <sm-token>" | jq '.[] | select(.job=="website")'
# 3. Verify probe_success arrived (wait ~60s for the first run)
# In Grafana Explore on the synthetic metrics datasource:
# probe_success{job="website"}
# Expect 1 from each probe in `probes:[1,5,10]`.
#
# Rollback: DELETE /sm/checks/<id> or set `"enabled": false`.See references/synthetic.md for all check types, PromQL queries, and alert rules.
2. Run a k6 cloud load test
# 1. Authenticate once
k6 cloud login --token <grafana-cloud-k6-token>
# 2. Validate the script locally first (smoke run, no cloud cost)
k6 run --vus 1 --duration 30s script.js
# 3. Launch in cloud
k6 cloud script.js
# → URL of the run; thresholds (p95<500ms, error<1%) decide pass/fail.
# 4. Verify in CI — exit code 0 = thresholds passed, 99 = threshold failed.
echo $?Full script + scenarios + CI YAML: references/k6-and-faro.md.
3. Instrument a frontend with Faro
# 1. Install
npm install @grafana/faro-web-sdk @grafana/faro-web-tracing// 2. initializeFaro({ url, apiKey, app, instrumentations }) — see references/k6-and-faro.md
// 3. Push a test event so we have something to look for:
faro.api.pushEvent('faro_smoketest', { ts: Date.now().toString() });# 4. Verify the collector accepted it (browser DevTools → Network)
# POST to /collect should return 202. If 401 — apiKey mismatch.
# 5. Verify in Grafana
# - Frontend Observability → your app → Sessions: should show your session
# - Explore on Loki: `{kind="event"} |= "faro_smoketest"`
# - For traces: filter by `service.name="my-frontend"` in TempoTroubleshooting
Synthetic check stuck at
probe_success=0→ checkprobe_*_duration_secondsfor the failing stage; the probe-region label tells you which prober erroredk6 cloud run "ABORTED_THRESHOLD" → a threshold tripped; inspect the run page to see which one
Faro events not landing → check the browser network call to
/collectreturns 202; common cause is wrongapiKeyorurl(must match the FE Observability app)
References
For deep authoring of Synthetic Monitoring scripted (k6) and browser checks — execution model, assertions, secrets, API/Terraform payloads — see the
synthetic-monitoring-checksskillreferences/synthetic.md— Synthetic Monitoring essentials: check types, key PromQL metrics, alert rulesreferences/synthetic-monitoring.md— deep dive: full API for check CRUD, probe selection, scripted (k6) checks, multi-step browser checksreferences/k6-and-faro.md— k6 cloud script + Faro Web SDK init snippets for end-to-end testingreferences/k6-cloud.md— deep dive: k6 cloud config (project + load zones + thresholds), CI integration, run analysis
Resources
Files
- ATTRIBUTION.mdAdded by AutoGineer835 B
- LICENSELicence file added by AutoGineer11.1 KiB
- SKILL.md5.3 KiB
- references/k6-and-faro.md2.6 KiB
- references/k6-cloud.md4.8 KiB
- references/synthetic-monitoring.md4.6 KiB
- references/synthetic.md2.2 KiB
references/synthetic-monitoring.md
Synthetic Monitoring Reference
Check Types
| Type | Protocol | Use Case |
|---|---|---|
| HTTP | HTTP/HTTPS | Website/API uptime and response validation |
| DNS | DNS | Record resolution and lookup time |
| TCP | TCP | Port/service reachability |
| Ping | ICMP | Host availability |
| MultiHTTP | HTTP/HTTPS | Multi-step API flows (login, then action) |
| Browser (k6) | Chrome | Full browser page load, Core Web Vitals |
| Scripted (k6) | k6 script | Custom JS test logic |
HTTP Check Fields
{
"job": "api-health",
"target": "https://api.example.com/health",
"frequency": 60000,
"timeout": 15000,
"enabled": true,
"probes": [1, 2, 5, 10, 14],
"settings": {
"http": {
"method": "GET",
"ipVersion": "V4",
"noFollowRedirects": false,
"tlsConfig": {
"insecureSkipVerify": false,
"serverName": "api.example.com"
},
"validStatusCodes": [200],
"validHTTPVersions": ["HTTP/1.1", "HTTP/2.0"],
"failIfBodyMatchesRegexp": ["error", "exception"],
"failIfBodyNotMatchesRegexp": [],
"failIfHeaderMatchesRegexp": [],
"failIfHeaderNotMatchesRegexp": [],
"headers": [
{"name": "Authorization", "value": "Bearer token"},
{"name": "User-Agent", "value": "Grafana-SM/1.0"}
],
"body": "",
"bearerToken": "",
"basicAuth": {"username": "", "password": ""}
}
},
"labels": [{"name": "env", "value": "production"}],
"alertSensitivity": "medium"
}Probe Locations (Post Feb 2025 AWS Migration)
Americas (AMER)
| ID | Location |
|---|---|
| 1 | Columbus, Ohio, USA (AWS us-east-2) |
| 2 | Manassas, Virginia, USA (AWS us-east-1) |
| 14 | Portland, Oregon, USA (AWS us-west-2) |
| 15 | São Paulo, Brazil (AWS sa-east-1) |
| 16 | Montreal, Canada (AWS ca-central-1) |
Europe, Middle East, Africa (EMEA)
| ID | Location |
|---|---|
| 5 | Frankfurt, Germany (AWS eu-central-1) |
| 10 | Dublin, Ireland (AWS eu-west-1) |
| 17 | London, UK (AWS eu-west-2) |
| 18 | Paris, France (AWS eu-west-3) |
| 19 | Stockholm, Sweden (AWS eu-north-1) |
| 20 | Milan, Italy (AWS eu-south-1) |
| 21 | Cape Town, South Africa (AWS af-south-1) |
| 22 | Bahrain (AWS me-south-1) |
Asia Pacific (APAC)
| ID | Location |
|---|---|
| 3 | Singapore (AWS ap-southeast-1) |
| 4 | Sydney, Australia (AWS ap-southeast-2) |
| 6 | Tokyo, Japan (AWS ap-northeast-1) |
| 7 | Mumbai, India (AWS ap-south-1) |
| 8 | Seoul, South Korea (AWS ap-northeast-2) |
| 9 | Hong Kong (AWS ap-east-1) |
| 11 | Osaka, Japan (AWS ap-northeast-3) |
| 12 | Jakarta, Indonesia (AWS ap-southeast-3) |
| 13 | Melbourne, Australia (AWS ap-southeast-4) |
Alert Sensitivity Levels
| Level | Probe Success Threshold | For Duration |
|---|---|---|
none | No alerts | - |
low | < 50% probes succeeding | 5 minutes |
medium | < 75% probes succeeding | 5 minutes |
high | < 95% probes succeeding | 5 minutes |
Custom alert override (per-check):
# Override per check in Terraform
resource "grafana_synthetic_monitoring_check" "api" {
...
alert_sensitivity = "high"
}Terraform (Configuration as Code)
terraform {
required_providers {
grafana = { source = "grafana/grafana" }
}
}
provider "grafana" {
sm_access_token = var.sm_access_token
sm_url = "https://synthetic-monitoring-api.grafana.net"
}
resource "grafana_synthetic_monitoring_check" "website" {
job = "homepage"
target = "https://example.com"
enabled = true
frequency = 60000
timeout = 15000
probes = [1, 5, 10, 14]
settings {
http {
valid_status_codes = [200]
valid_http_versions = ["HTTP/1.1", "HTTP/2.0"]
}
}
labels = {
environment = "production"
team = "platform"
}
}Grizzly (YAML as Code)
apiVersion: grizzly.grafana.com/v1alpha1
kind: SyntheticMonitoringCheck
metadata:
name: api-health
spec:
job: api-health
target: https://api.example.com/health
frequency: 60000
timeout: 10000
probes: [1, 5, 10]
settings:
http:
method: GET
validStatusCodes: [200]Key Metrics
# Uptime % over 7 days
avg_over_time(probe_success{job="api-health"}[7d]) * 100
# P95 response time by location
histogram_quantile(0.95,
sum(rate(probe_duration_seconds_bucket{job="api-health"}[5m])) by (le, probe)
)
# DNS lookup time trend
avg(probe_dns_lookup_time_seconds{job="dns-check"}) by (probe)
# TLS certificate days until expiry
(probe_ssl_earliest_cert_expiry{job="api-health"} - time()) / 86400
# Availability by region
avg(probe_success{job="api-health"}) by (probe)Requirements and compatibility
Works with: Claude Code, Claude apps, OpenAI Codex, GitHub Copilot, Cursor, Gemini CLI, Kiro, OpenCode, Goose, Amp, Roo Code, JetBrains Junie, Factory Droid, Devin (ex-Windsurf), Mistral Vibe, OpenHands, Letta
“Works with” means the tool reads the open Agent Skills format; a skill written for one tool may use features others lack.
Needs: Needs network access, Needs Node.js
Security
What our scanner noticed· Low risk
- Instructions that use the network
A static scan is not a guarantee. Skills are third-party content: review a skill before you let an agent use it.
Attribution and licence
- Published by
- Grafana Labs
- Publisher
- Grafana Labs (Official)
- Source
- grafana/skills · skills/grafana-cloud/testing · commit 8fb72a5
- Licence
- Apache License 2.0 (redistribution allowed)
- LICENSE (added by AutoGineer from LICENSE)
- ATTRIBUTION.md (written by AutoGineer)
- Synced
AutoGineer is not affiliated with or endorsed by Grafana Labs.
Download ZIP
The ZIP holds the skill’s files, its licence files and an ATTRIBUTION.md. Download testing.zip