@nitin15j/plugin-dora-backend
Version:
This plugin backend was templated using the Backstage CLI. You should replace this text with a description of your plugin backend.
400 lines (393 loc) • 11.8 kB
JavaScript
'use strict';
var core = require('@apollo/client/core');
var batchHttp = require('@apollo/client/link/batch-http');
var fetch = require('cross-fetch');
var DoraMetrics = require('../../domain/models/DoraMetrics.cjs.js');
function _interopDefaultCompat (e) { return e && typeof e === 'object' && 'default' in e ? e : { default: e }; }
var fetch__default = /*#__PURE__*/_interopDefaultCompat(fetch);
class SleuthClient {
client;
batchClient;
organizationId;
constructor(apiKey, apiUrl, organizationId) {
this.organizationId = organizationId;
this.client = new core.ApolloClient({
link: new core.HttpLink({
uri: `${apiUrl}/graphql`,
fetch: fetch__default.default,
headers: {
Authorization: `apikey ${apiKey}`,
"Content-Type": "application/json",
Cookie: "__Host-sessionid=f7xr8j59258nzt0zgy3a9atjhx3aypc2"
}
}),
cache: new core.InMemoryCache()
//defaultOptions: { query: { fetchPolicy: 'no-cache' } },
});
this.batchClient = new core.ApolloClient({
link: new batchHttp.BatchHttpLink({
uri: `${apiUrl}/graphql-batch`,
fetch: fetch__default.default,
headers: {
Authorization: `apikey ${apiKey}`,
"Content-Type": "application/json",
Cookie: "__Host-sessionid=f7xr8j59258nzt0zgy3a9atjhx3aypc2"
},
batchMax: 5,
batchInterval: 10
}),
cache: new core.InMemoryCache()
//defaultOptions: { query: { fetchPolicy: 'no-cache' } },
});
}
async projectMetrics(request) {
const query = `
query GetProjectMetrics(
$orgSlug: ID!
$projectSlug: ID!
$deploymentSlugs: [ID!]!
$environmentSlug: ID!
$currentRangeStartDate: DateTime!
$currentRangeEndDate: DateTime!
$previousRangeStartDate: DateTime!
$previousRangeEndDate: DateTime!
$teamSlug: ID
) {
project(orgSlug: $orgSlug, projectSlug: $projectSlug) {
previousRange: metricRecap(
environmentSlug: $environmentSlug
deploymentSlugs: $deploymentSlugs
start: $previousRangeStartDate
end: $previousRangeEndDate
teamSlug: $teamSlug
) {
avgLeadTimeInSec
numOfDeploys
numOfDeploysPerDay
failureRatePercent
avgMttrDurationInSec
}
currentRange: metricRecap(
environmentSlug: $environmentSlug
deploymentSlugs: $deploymentSlugs
start: $currentRangeStartDate
end: $currentRangeEndDate
teamSlug: $teamSlug
) {
avgLeadTimeInSec
numOfDeploys
numOfDeploysPerDay
failureRatePercent
avgMttrDurationInSec
}
}
}
`;
const variables = {
orgSlug: this.organizationId,
projectSlug: request.projectSlug,
environmentSlug: request.environment,
deploymentSlugs: [],
currentRangeStartDate: request.currentRangeStart,
currentRangeEndDate: request.currentRangeEnd,
previousRangeStartDate: request.previousRangeStart,
previousRangeEndDate: request.previousRangeEnd
};
try {
const result = await this.client.query({
query: core.gql`${query}`,
variables
});
return result.data;
} catch (error) {
throw new DoraMetrics.DoraMetricsError(
"Failed to query Sleuth API",
"PROVIDER_ERROR",
error
);
}
}
async projectMetricsInsights(request) {
const query = `query GetInsights(
$orgSlug: ID!,
$projectSlug: ID!,
$environmentSlug: ID!,
$deploymentSlugs: [ID!]!,
$teamSlug: ID,
$startDate: DateTime!,
$endDate: DateTime!)
{
project(orgSlug: $orgSlug, projectSlug: $projectSlug)
{
insights(
environmentSlug: $environmentSlug
deploymentSlugs: $deploymentSlugs
start: $startDate
end: $endDate
teamSlug: $teamSlug
) {
__typename
... on MetricOffsetFromAverageInsightType {
insightMetricType
offsetPercentage
message
icon
isPositive
insightLink
}
}
}
}`;
const variables = {
orgSlug: this.organizationId,
projectSlug: request.projectSlug,
environmentSlug: request.environment,
deploymentSlugs: [],
startDate: request.currentRangeStart,
endDate: request.currentRangeEnd
};
try {
const result = await this.client.query({
query: core.gql`${query}`,
variables
});
return result.data;
} catch (error) {
throw new DoraMetrics.DoraMetricsError(
"Failed to query Sleuth API for insights",
"PROVIDER_ERROR",
error
);
}
}
async getTrendMetrics(start, end) {
const trendQuery = `
query GetTrendMetrics($orgSlug: ID!, $projectSlugs: [ID!], $labelSlugs: [ID!], $teamSlugs: [ID!], $environmentName: String, $start: DateTime!, $end: DateTime!) {
organization(orgSlug: $orgSlug) {
metricsRecapWithQuarters(
start: $start
end: $end
filters: {projectSlugs: $projectSlugs, labelSlugs: $labelSlugs, environmentName: $environmentName, teamSlugs: $teamSlugs}
) {
totalRecap {
numOfDeploys
numOfDeploysPerDay
avgLeadTimeInSec
failureRatePercent
avgMttrDurationInSec
}
quarters {
startIncl
endNotIncl
numOfDeploysPerDay
avgLeadTimeInSec
failureRatePercent
avgMttrDurationInSec
}
}
}
}
`;
const variables = {
orgSlug: this.organizationId,
start,
end
};
try {
const result = await this.batchClient.query({
query: core.gql`${trendQuery}`,
variables
});
return result.data;
} catch (error) {
throw new DoraMetrics.DoraMetricsError(
"Failed to query Sleuth API for trend metrics",
"PROVIDER_ERROR",
error
);
}
}
async teamMetrics(request) {
const query = `
query GetTeamMetrics(
$orgSlug: ID!
$teamSlug: ID!
$previousRangeStart: DateTime!
$previousRangeEnd: DateTime!
$currentRangeStart: DateTime!
$currentRangeEnd: DateTime!
) {
team(orgSlug: $orgSlug, teamSlug: $teamSlug) {
name
currentRange: metricRecap(
start: $currentRangeStart
end: $currentRangeEnd
) {
avgLeadTimeInSec
numOfDeploys
numOfDeploysPerDay
failureRatePercent
avgMttrDurationInSec
}
previousRange: metricRecap(
start: $previousRangeStart
end: $previousRangeEnd
) {
avgLeadTimeInSec
numOfDeploys
numOfDeploysPerDay
failureRatePercent
avgMttrDurationInSec
}
}
}
`;
const variables = {
orgSlug: this.organizationId,
teamSlug: request.teamSlug,
currentRangeStart: request.currentRangeStart,
currentRangeEnd: request.currentRangeEnd,
previousRangeStart: request.previousRangeStart,
previousRangeEnd: request.previousRangeEnd
};
try {
const result = await this.batchClient.query({
query: core.gql`${query}`,
variables
});
return result.data;
} catch (error) {
throw new DoraMetrics.DoraMetricsError(
"Failed to query Sleuth API for team metrics",
"PROVIDER_ERROR",
error
);
}
}
async teamMetricsInsights(request) {
const query = `
query GetTeamMetricsInsights(
$orgSlug: ID!
$projectSlug: ID!
$deploymentSlugs: [ID!]!
$environmentSlug: ID!
$startDate: DateTime!
$endDate: DateTime!
$teamSlug: ID
) {
project(orgSlug: $orgSlug, projectSlug: $projectSlug) {
insights(
environmentSlug: $environmentSlug
deploymentSlugs: $deploymentSlugs
start: $startDate
end: $endDate
teamSlug: $teamSlug
) {
__typename
... on MetricOffsetFromAverageInsightType {
insightMetricType
offsetPercentage
message
icon
isPositive
insightLink
}
}
}
}
`;
const variables = {
orgSlug: this.organizationId,
teamSlug: request.teamSlug,
environmentSlug: request.environment,
deploymentSlugs: [],
startDate: request.currentRangeStart,
endDate: request.currentRangeEnd
};
try {
const result = await this.client.query({
query: core.gql`${query}`,
variables
});
return result.data;
} catch (error) {
throw new DoraMetrics.DoraMetricsError(
"Failed to query Sleuth API for team metrics insights",
"PROVIDER_ERROR",
error
);
}
}
async batchTeamMetrics(requests) {
const TEAM_METRICS_QUERY = `
query GetTeamMetrics(
$orgSlug: ID!
$teamSlug: ID!
$previousRangeStart: DateTime!
$previousRangeEnd: DateTime!
$currentRangeStart: DateTime!
$currentRangeEnd: DateTime!
) {
team(orgSlug: $orgSlug, teamSlug: $teamSlug) {
name
currentRange: metricRecap(
start: $currentRangeStart
end: $currentRangeEnd
) {
avgLeadTimeInSec
numOfDeploys
numOfDeploysPerDay
failureRatePercent
avgMttrDurationInSec
}
previousRange: metricRecap(
start: $previousRangeStart
end: $previousRangeEnd
) {
avgLeadTimeInSec
numOfDeploys
numOfDeploysPerDay
failureRatePercent
avgMttrDurationInSec
}
}
}
`;
const batchQueries = requests.map((request) => ({
query: TEAM_METRICS_QUERY,
variables: {
orgSlug: this.organizationId,
teamSlug: request.teamSlug,
currentRangeStart: request.currentRangeStart,
currentRangeEnd: request.currentRangeEnd,
previousRangeStart: request.previousRangeStart,
previousRangeEnd: request.previousRangeEnd
}
}));
try {
const teamPromises = batchQueries.map(async (batchQuery) => {
try {
const result = await this.batchClient.query({
query: core.gql`${batchQuery.query}`,
variables: batchQuery.variables
});
return result.data.team;
} catch (error) {
console.error(`Failed to fetch metrics for team: ${batchQuery.variables.teamSlug}`, error);
return null;
}
});
const teamResults = await Promise.all(teamPromises);
const teams = teamResults.filter((team) => team !== null && team !== void 0);
return { teams };
} catch (error) {
throw new DoraMetrics.DoraMetricsError(
"Failed to query Sleuth API for batch team metrics",
"PROVIDER_ERROR",
error
);
}
}
}
exports.SleuthClient = SleuthClient;
//# sourceMappingURL=SleuthClient.cjs.js.map