UNPKG

@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
'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