example.js (131 lines of code) (raw):

'use strict'; var grafana = require('./index'); var Row = grafana.Row; var Dashboard = grafana.Dashboard; var Panels = grafana.Panels; var Target = grafana.Target; var Alert = grafana.Alert; var Condition = grafana.Condition; // For grafana v1, the URL should look something like: // // https://your.grafana.com/elasticsearch/grafana-dash/dashboard/ // // Bascially, grafana v1 used elastic search as its backend, but grafana v2 // has its own backend. Because of this, the URL for grafana v2 should look // something like this: // // https://your.grafanahost.com/grafana2/api/dashboards/db/ grafana.configure({ url: 'https://your.grafanahost.com/grafana2/api/dashboards/db/', cookie: 'auth-openid=REPLACETOKENIFAPPLICABLE', headers: { x: 'y' }, }); // Dashboard Constants var TITLE = 'TEST API dashboard'; var TAGS = ['myapp', 'platform']; var TEMPLATING = [ { name: 'dc', options: ['dc1', 'dc2'], }, { name: 'smoothing', options: ['30min', '10min', '5min', '2min', '1min'], }, ]; var ANNOTATIONS = [ { name: 'Deploy', target: 'stats.$dc.production.deploy', }, ]; var REFRESH = '1m'; // Target prefixes var SERVER_PREFIX = 'servers.app*-$dc.myapp.'; var COUNT_PREFIX = 'stats.$dc.counts.myapp.'; function generateDashboard() { // Rows var volumeRow = new Row({ title: 'Request Volume', }); var systemRow = new Row({ title: 'System / OS', }); // Panels: request volume var rpsGraphPanel = new Panels.Graph({ title: 'req/sec', span: 8, targets: [ new Target(COUNT_PREFIX + 'statusCode.*') .transformNull(0) .sum() .hitcount('1seconds') .scale(0.1) .alias('rps'), ], }); // set alert on request volume when it's (max) value is lower than 1 req / sec var condition = new Condition() .withReducer('max') .withEvaluator(1, 'lt') .onQuery('A'); var alert = new Alert().addCondition(condition); rpsGraphPanel.addAlert(alert); var rpsStatPanel = new Panels.SingleStat({ title: 'Current Request Volume', postfix: 'req/sec', span: 4, targets: [new Target(COUNT_PREFIX + 'statusCode.*').sum().scale(0.1)], }); var favDashboardList = new Panels.DashboardList({ title: 'My Favorite Dashboard', span: 4, mode: 'search', query: 'dashboard list', }); // Panels: system health var cpuGraph = new Panels.Graph({ title: 'CPU', span: 4, targets: [ new Target(SERVER_PREFIX + 'cpu.user') .nonNegativeDerivative() .scale(1 / 60) .scale(100) .averageSeries() .alias('avg'), new Target(SERVER_PREFIX + 'cpu.user') .nonNegativeDerivative() .scale(1 / 60) .scale(100) .percentileOfSeries(95, false) .alias('p95'), ], }); var rssGraph = new Panels.Graph({ title: 'Memory', span: 4, targets: [ new Target(SERVER_PREFIX + 'memory.rss') .averageSeries() .alias('rss'), ], }); var fdsGraph = new Panels.Graph({ title: 'FDs', span: 4, targets: [ new Target(SERVER_PREFIX + 'fds') .averageSeries() .movingAverage('10min') .alias('moving avg'), ], }); // Dashboard var dashboard = new Dashboard({ title: TITLE, tags: TAGS, templating: TEMPLATING, annotations: ANNOTATIONS, refresh: REFRESH, }); // Layout: panels volumeRow.addPanel(rpsGraphPanel); volumeRow.addPanel(rpsStatPanel); volumeRow.addPanel(favDashboardList); systemRow.addPanel(cpuGraph); systemRow.addPanel(rssGraph); systemRow.addPanel(fdsGraph); // Layout: rows dashboard.addRow(volumeRow); dashboard.addRow(systemRow); // Finish grafana.publish(dashboard); } module.exports = { generate: generateDashboard, }; if (require.main === module) { generateDashboard(); }