
Kibana Dashboards
Create and extend Kibana dashboards and visualization panels (markdown, metric, ES|QL bar charts) through structured JSON the agent can generate and apply via the Dashboards API.
Overview
kibana-dashboards is an agent skill most often used in Grow (also Operate monitoring and Ship launch readiness) that generates Kibana dashboard and visualization JSON using ES|QL data sources and grid-based panels.
Install
npx skills add https://github.com/elastic/agent-skills --skill kibana-dashboardsWhat is this skill?
- JSON panel definitions with grid layout (x, y, w, h) for full-dashboard composition
- ES|QL-backed layers and metrics, e.g. `STATS count = COUNT() BY response.keyword`
- Supports markdown header panels plus `vis` metric panels on sample log indices
- xy bar chart specs with titled layers and esql data_source blocks
- Includes time_range defaults such as now-24h to now for live dashboards
- Example dashboards use 48-column grid widths with explicit h/w panel sizing
- Sample ES|QL: STATS count = COUNT() BY response.keyword
- Default time_range example: now-24h to now
Adoption & trust: 1.2k installs on skills.sh; 502 GitHub stars; 3/3 security scanners passed (skills.sh audits).
What problem does it solve?
You have logs in Elasticsearch but no version-controlled, repeatable way for an agent to stand up Kibana dashboards with ES|QL charts and metrics.
Who is it for?
Indie SaaS operators already on Elastic who want agent-generated dashboard specs for log response codes, counts, and narrative markdown headers.
Skip if: Builders without Kibana/Elasticsearch or who only need generic charting outside the Elastic dashboards API.
When should I use this skill?
You need Kibana dashboard or visualization JSON (markdown, metric, xy/esql) that an agent can produce for the Dashboards & Visualizations API.
What do I get? / Deliverables
You get ready-to-apply dashboard JSON—with markdown headers, metric tiles, bar charts, and time ranges—that you can push through Kibana’s dashboards API or save in repo for each environment.
- Complete dashboard JSON with panels array and optional time_range
- Individual visualization specs (metric, xy bar) with esql data_source
- Grid-positioned panel IDs suitable for import or API create/update
Recommended Skills
Journey fit
Spans multiple journey phases - primary shelf plus alternate fits below.
Dashboards turn indexed logs and metrics into decisions after you ship, so Grow → analytics is the primary shelf for visualization work. analytics covers funnel, traffic, and operational log views—not the initial Elastic cluster provisioning in operate/infra.
Where it fits
Generate a dashboard counting requests by HTTP response code for a weekly growth review.
Clone the Log Analysis layout with a now-24h window for on-call log triage.
Add a markdown welcome panel and total-count metric before a release traffic spike.
How it compares
Skill-packaged dashboard JSON templates—not a replacement for Kibana UI exploration when you are still discovering fields interactively.
Common Questions / FAQ
Who is kibana-dashboards for?
Solo developers and small teams using Kibana who want codified dashboard and visualization definitions an AI agent can extend, review in git, and apply via API.
When should I use kibana-dashboards?
Use it in grow when standing up analytics on sample or production logs, in operate when building monitoring views, and in ship when you need a launch-day dashboard with a 24h time window.
Is kibana-dashboards safe to install?
The skill describes API-oriented JSON only; actual calls need your Kibana credentials and network access—check the Security Audits panel on this Prism page before granting secrets to an agent.
SKILL.md
READMESKILL.md - Kibana Dashboards
{ "title": "Requests by Response Code", "type": "xy", "axis": { "x": { "title": { "visible": false } }, "y": { "title": { "visible": false } } }, "layers": [ { "type": "bar", "data_source": { "type": "esql", "query": "FROM kibana_sample_data_logs | STATS count = COUNT() BY response.keyword" }, "x": { "column": "response.keyword" }, "y": [{ "column": "count" }] } ] } { "title": "Basic Dashboard", "panels": [ { "type": "markdown", "id": "header-panel", "grid": { "x": 0, "y": 0, "w": 48, "h": 4 }, "config": { "content": "## Welcome to the Dashboard\n\nThis is a basic dashboard created via the Kibana Dashboards & Visualizations API." } } ], "time_range": { "from": "now-24h", "to": "now" } } { "title": "Dashboard with Visualization Panels", "panels": [ { "type": "markdown", "id": "header", "grid": { "x": 0, "y": 0, "w": 48, "h": 3 }, "config": { "content": "# Log Analysis Dashboard" } }, { "type": "vis", "id": "total-count", "grid": { "x": 0, "y": 3, "w": 12, "h": 8 }, "config": { "type": "metric", "data_source": { "type": "esql", "query": "FROM kibana_sample_data_logs | STATS count = COUNT()" }, "metrics": [ { "type": "primary", "column": "count" } ] } }, { "type": "vis", "id": "avg-bytes", "grid": { "x": 12, "y": 3, "w": 12, "h": 8 }, "config": { "type": "metric", "data_source": { "type": "esql", "query": "FROM kibana_sample_data_logs | STATS avg_bytes = AVG(bytes)" }, "metrics": [ { "type": "primary", "column": "avg_bytes" } ] } }, { "type": "vis", "id": "response-codes", "grid": { "x": 24, "y": 3, "w": 24, "h": 8 }, "config": { "type": "xy", "layers": [ { "type": "bar", "data_source": { "type": "esql", "query": "FROM kibana_sample_data_logs | STATS count = COUNT() BY response = TO_STRING(response)" }, "x": { "column": "response" }, "y": [{ "column": "count" }] } ] } }, { "type": "vis", "id": "timeline", "grid": { "x": 0, "y": 11, "w": 48, "h": 12 }, "config": { "type": "xy", "axis": { "x": { "scale": "temporal", "domain": { "type": "fit", "rounding": false } } }, "layers": [ { "type": "line", "data_source": { "type": "esql", "query": "FROM kibana_sample_data_logs | WHERE @timestamp <= ?_tend AND @timestamp > ?_tstart | STATS count = COUNT() BY BUCKET(@timestamp, 75, ?_tstart, ?_tend)" }, "x": { "column": "BUCKET(@timestamp, 75, ?_tstart, ?_tend)", "label": "@timestamp" }, "y": [{ "column": "count" }] } ] } }, { "type": "vis", "id": "top-hosts", "grid": { "x": 0, "y": 23, "w": 24, "h": 10 }, "config": { "type": "xy", "layers": [ { "type": "bar", "data_source": { "type": "esql", "query": "FROM kibana_sample_data_logs | STATS count = COUNT() BY host = TO_STRING(host)" }, "x": { "column": "host" }, "y": [{ "column": "count" }] } ] } }, { "type": "vis", "id": "bytes-by-os", "grid": { "x"