Skip to content

Commit

Permalink
Dashboards API v2 (#46)
Browse files Browse the repository at this point in the history
  • Loading branch information
davideschiera authored Apr 14, 2019
1 parent 5118823 commit 3f8fbe1
Show file tree
Hide file tree
Showing 2 changed files with 298 additions and 191 deletions.
162 changes: 102 additions & 60 deletions src/dashboards_service.js
Original file line number Diff line number Diff line change
Expand Up @@ -25,44 +25,15 @@ export default class DashboardsService {
const tags = ['Sysdig', 'Default dashboard'];
return backend.backendSrv.$q
.all([
ApiService.send(backend, {
url: 'api/defaultDashboards'
}),
MetricsService.findMetrics(backend),
fetchDefaultDashboards(backend),
ApiService.send(backend, {
url: 'data/drilldownViewsCategories.json'
})
])
.then((results) => {
const metrics = results[1];
const categories = results[2];

const metricMap = metrics.reduce((acc, metric) => {
acc[metric.metricId] = metric;
return acc;
}, {});
const applicableDashboards = results[0].data.defaultDashboards.filter(
(dashboard) => {
if (
Array.isArray(dashboard.requiredMetrics) &&
dashboard.requiredMetrics.length > 0
) {
if (
dashboard.requiredMetrics.find(
(metricId) => metricMap[metricId] === undefined
)
) {
return false;
} else {
return true;
}
} else {
return true;
}
}
);
const applicableDashboards = results[0].defaultDashboards;

const usedCategories = categories.data.drilldownViewsCategories.filter(
const usedCategories = results[1].data.drilldownViewsCategories.filter(
(category) => {
return (
applicableDashboards.find(
Expand All @@ -73,18 +44,18 @@ export default class DashboardsService {
);

return {
metrics,
categories: usedCategories,
dashboards: applicableDashboards
defaultDashboards: applicableDashboards,
version: results[0].version
};
})
.then((results) => {
const convertedDashboards = results.dashboards
const convertedDashboards = results.defaultDashboards
.map(
convertDashboard.bind(
null,
datasourceName,
results.metrics,
results.version,
results.categories,
tags
)
Expand Down Expand Up @@ -123,18 +94,17 @@ export default class DashboardsService {
};
}

return backend.backendSrv.$q
.all([
ApiService.send(backend, {
url: 'ui/dashboards'
}),
MetricsService.findMetrics(backend)
])
.then((results) => {
const metrics = results[1];
const convertedDashboards = results[0].data.dashboards
.filter(filterDashboardBySetId.bind(null, dashboardSetId))
.map(convertDashboard.bind(null, datasourceName, metrics, [], tags))
return fetchDashboards(backend)
.then((result) => {
const convertedDashboards = result.dashboards
.filter(
SysdigDashboardHelper.filterDashboardBySetId.bind(
null,
result.version,
dashboardSetId
)
)
.map(convertDashboard.bind(null, datasourceName, result.version, [], tags))
.filter((dashboard) => dashboard !== null);

const options = {
Expand All @@ -155,20 +125,10 @@ export default class DashboardsService {
});
}

function filterDashboardBySetId(setId, dashboard) {
switch (dashboardSetId) {
case 'PRIVATE':
return dashboard.isShared === false;
case 'SHARED':
return dashboard.isShared === true;
}
}

function convertDashboard(datasourceName, metrics, categories, tags, dashboard) {
function convertDashboard(datasourceName, version, categories, tags, dashboard) {
try {
return SysdigDashboardHelper.convertToGrafana(dashboard, {
return SysdigDashboardHelper.convertToGrafana(version, dashboard, {
datasourceName,
metrics,
categories,
tags
});
Expand Down Expand Up @@ -203,11 +163,93 @@ export default class DashboardsService {
tags: ['Sysdig', 'sysdig']
})
.then((dashboards) => {
console.log(`Sysdig dashboards: Delete ${dashboards.length} dashboards...`);

removeDashboards(backendSrv, dashboards);
});
}
}

function fetchDefaultDashboards(backend) {
return (
// First try latest endpoint version
ApiService.send(backend, {
url: 'api/v2/defaultDashboards?excludeMissing=true'
})
// Return v2 dashboards
.then((result) => {
if (result.data.defaultDashboards) {
return {
defaultDashboards: result.data.defaultDashboards,
version: 'v2'
};
} else {
//
// dev version of v2 detected, fallback to v1
// (api/v2/defaultDashboards returns an array and not and object with defaultDashboards array)
// NOTE: This is useful until onprem version X and SaaS version Y need to be supported
//
return backend.backendSrv.$q.reject('Dashboards API v2 not available');
}
})
.catch(() => {
return (
// Then try older endpoint version
ApiService.send(backend, {
url: 'api/defaultDashboards?excludeMissing=true'
})
// Return v1 dashboards
.then((result) => {
return {
defaultDashboards: result.data.defaultDashboards,
version: 'v1'
};
})
);
})
);
}

function fetchDashboards(backend) {
return (
// First try latest endpoint version
ApiService.send(backend, {
url: 'api/v2/dashboards'
})
// Return v2 dashboards
.then((result) => {
if (Array.isArray(result.data.dashboards) && result.data.dashboards.length > 0) {
return {
dashboards: result.data.dashboards,
version: 'v2'
};
} else {
//
// probable dev version of v2 detected, fallback to v1
// (api/v2/dashboards was not documented or used, it's supposed to be empty -- NOTE: could lead to false positive in case there are no dashboards to import)
// NOTE: This is useful until onprem version X and SaaS version Y need to be supported
//
return backend.backendSrv.$q.reject('Dashboards API v2 not available');
}
})
.catch(() => {
return (
// Then try older endpoint version
ApiService.send(backend, {
url: 'ui/dashboards'
})
// Return v1 dashboards
.then((result) => {
return {
dashboards: result.data.dashboards,
version: 'v1'
};
})
);
})
);
}

function removeDashboards(backendSrv, dashboards) {
if (dashboards.length > 0) {
return removeNextDashboard(backendSrv, dashboards[0], dashboards.slice(1));
Expand Down
Loading

0 comments on commit 3f8fbe1

Please sign in to comment.