Skip to content

Commit 418662f

Browse files
committed
directly passes weekly dep-freq to the score function
1 parent 9669d58 commit 418662f

File tree

4 files changed

+42
-38
lines changed

4 files changed

+42
-38
lines changed

web-server/src/content/DoraMetrics/DoraCards/WeeklyDeliveryVolumeCard.tsx

Lines changed: 16 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -18,10 +18,9 @@ import {
1818
} from '@/hooks/useStateTeamConfig';
1919
import { useSelector } from '@/store';
2020
import { IntegrationGroup } from '@/types/resources';
21-
import { merge } from '@/utils/datatype';
2221
import { getSortedDatesAsArrayFromMap } from '@/utils/date';
2322

24-
import { useAvgWeeklyDeploymentFrequency } from './sharedHooks';
23+
import { useAvgIntervalBasedDeploymentFrequency } from './sharedHooks';
2524

2625
import { DoraMetricsComparisonPill } from '../DoraMetricsComparisonPill';
2726
import { getDoraLink } from '../getDoraLink';
@@ -54,19 +53,27 @@ const chartOptions = {
5453
export const WeeklyDeliveryVolumeCard = () => {
5554
const { integrationSet } = useAuth();
5655
const dateRangeLabel = useCurrentDateRangeLabel();
57-
const deploymentFrequencyProps = useAvgWeeklyDeploymentFrequency();
56+
const deploymentFrequencyProps = useAvgIntervalBasedDeploymentFrequency();
5857

5958
const { addPage } = useOverlayPage();
6059
const deploymentsConfigured = true;
6160
const isCodeProviderIntegrationEnabled = integrationSet.has(
6261
IntegrationGroup.CODE
6362
);
6463

65-
const weekDeliveryVolumeData = useSelector((s) =>
66-
merge(
67-
s.doraMetrics.metrics_summary?.deployment_frequency_trends.current,
68-
s.doraMetrics.metrics_summary?.deployment_frequency_trends.previous
69-
)
64+
const currentWeekDeliveryVolumeData = useSelector(
65+
(s) => s.doraMetrics.metrics_summary?.deployment_frequency_trends.current
66+
);
67+
const previousWeekDeliveryVolumeData = useSelector(
68+
(s) => s.doraMetrics.metrics_summary?.deployment_frequency_trends.previous
69+
);
70+
71+
const weekDeliveryVolumeData = useMemo(
72+
() => ({
73+
...currentWeekDeliveryVolumeData,
74+
...previousWeekDeliveryVolumeData
75+
}),
76+
[currentWeekDeliveryVolumeData, previousWeekDeliveryVolumeData]
7077
);
7178

7279
const totalDeployments = useSelector(
@@ -81,8 +88,7 @@ export const WeeklyDeliveryVolumeCard = () => {
8188
label: 'Deployments',
8289
fill: 'start',
8390
data: getSortedDatesAsArrayFromMap(weekDeliveryVolumeData).map(
84-
(date: keyof typeof weekDeliveryVolumeData) =>
85-
weekDeliveryVolumeData[date].count
91+
(date) => weekDeliveryVolumeData[date].count
8692
),
8793
backgroundColor: deploymentFrequencyProps?.backgroundColor,
8894
borderColor: alpha(deploymentFrequencyProps?.backgroundColor, 0.5),

web-server/src/content/DoraMetrics/DoraCards/sharedHooks.tsx

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -108,39 +108,35 @@ export const useLeadTimeProps = () => {
108108
export const useDoraStats = () => {
109109
const { integrationSet } = useAuth();
110110
const leadTimeProps = useLeadTimeProps();
111-
const depsConfigured = true;
112-
const { count: df } = useAvgWeeklyDeploymentFrequency();
113111
const { count: cfr } = useChangeFailureRateProps();
114112
const { count: mttr, isNoDataAvailable } = useMeanTimeToRestoreProps();
115113

116114
const lt = leadTimeProps.count;
117115

118-
const interval = useSelector(
116+
const weeklyDeploymentFrequency = useSelector(
119117
(s) =>
120-
s.doraMetrics.metrics_summary?.deployment_frequency_stats.current.duration
118+
s.doraMetrics.metrics_summary?.deployment_frequency_stats.current
119+
.avg_weekly_deployment_frequency
121120
);
122121

123122
return useMemo(
124123
() =>
125124
getDoraScore({
126125
lt: integrationSet.has(IntegrationGroup.CODE) ? lt : null,
127-
df: depsConfigured ? df : null,
126+
df: weeklyDeploymentFrequency,
128127
cfr: integrationSet.has(IntegrationGroup.INCIDENT) ? cfr : null,
129128
mttr:
130129
integrationSet.has(IntegrationGroup.INCIDENT) && !isNoDataAvailable
131130
? mttr
132-
: null,
133-
dfInterval: interval
131+
: null
134132
}),
135133
[
136134
cfr,
137-
depsConfigured,
138-
df,
139135
integrationSet,
140-
interval,
141136
isNoDataAvailable,
142137
lt,
143-
mttr
138+
mttr,
139+
weeklyDeploymentFrequency
144140
]
145141
);
146142
};
@@ -219,7 +215,7 @@ export const usePropsForChangeTimeCard = () => {
219215
};
220216
};
221217

222-
export const useAvgWeeklyDeploymentFrequency = () => {
218+
export const useAvgIntervalBasedDeploymentFrequency = () => {
223219
const avgDeploymentFrequency = useSelector(
224220
(s) =>
225221
s.doraMetrics.metrics_summary?.deployment_frequency_stats.current

web-server/src/types/resources.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -579,7 +579,10 @@ export type TeamDoraMetricsApiResponseType = {
579579
current: DeploymentFrequencyAnalyticsResponse;
580580
previous: DeploymentFrequencyAnalyticsResponse;
581581
};
582-
deployment_frequency_trends: Record<DateString, DeploymentFrequencyTrendBase>;
582+
deployment_frequency_trends: {
583+
current: Record<DateString, DeploymentFrequencyTrendBase>;
584+
previous: Record<DateString, DeploymentFrequencyTrendBase>;
585+
};
583586
lead_time_prs: PR[];
584587
assigned_repos: (Row<'TeamRepos'> & Row<'OrgRepo'>)[];
585588
unsynced_repos: ID[];

web-server/src/utils/dora.ts

Lines changed: 14 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2,8 +2,7 @@ import {
22
secondsInHour,
33
secondsInDay,
44
secondsInMonth,
5-
secondsInWeek,
6-
daysInWeek
5+
secondsInWeek
76
} from 'date-fns/constants';
87
import { isNil, mean, reject } from 'ramda';
98

@@ -41,15 +40,21 @@ export const IndustryStandardsDoraScores: Record<Industries, number> = {
4140
[Industries.OTHER]: 6.7
4241
};
4342

43+
/**
44+
* Calculates the DORA (DevOps Research and Assessment) score based on the provided parameters.
45+
*
46+
* @param {Object} params - An object containing the following properties:
47+
* @param {number | null} [params.lt] - Lead Time for Changes
48+
* @param {number | null} [params.df] - Weekly Deployment Frequency. IMPORTANT: must be weekly
49+
* @param {number | null} [params.cfr] - Change Failure Rate
50+
* @param {number | null} [params.mttr] - Mean Time to Recovery.
51+
*/
4452
export const getDoraScore = ({
4553
lt,
4654
df,
4755
cfr,
48-
mttr,
49-
dfInterval
50-
}: Partial<Record<'lt' | 'df' | 'cfr' | 'mttr', number | null>> & {
51-
dfInterval: string;
52-
}) => {
56+
mttr
57+
}: Partial<Record<'lt' | 'df' | 'cfr' | 'mttr', number | null>>) => {
5358
const ltMttrBreakpoints = [
5459
secondsInMonth * 6,
5560
secondsInMonth,
@@ -59,12 +64,6 @@ export const getDoraScore = ({
5964
0
6065
];
6166

62-
let deploymentFrequency = df;
63-
64-
if (dfInterval === 'day') deploymentFrequency = df * daysInWeek;
65-
else if (dfInterval === 'week') deploymentFrequency = df;
66-
else if (dfInterval === 'month') deploymentFrequency = (df / 30) * daysInWeek;
67-
6867
const deployBreakpoints = [
6968
1 / (4 * 6), // ~once in 6 months
7069
1 / 4, // once in 4 weeks (~monthly)
@@ -85,8 +84,8 @@ export const getDoraScore = ({
8584
const scores = {
8685
lt: typeof lt === 'number' ? getScoreFromData(lt, ltMttrBreakpoints) : null,
8786
df:
88-
typeof deploymentFrequency === 'number'
89-
? getScoreFromDataInv(deploymentFrequency, deployBreakpoints)
87+
typeof df === 'number'
88+
? getScoreFromDataInv(df, deployBreakpoints)
9089
: null,
9190
cfr: typeof cfr === 'number' ? getCFRScore(cfr) : null,
9291
mttr:

0 commit comments

Comments
 (0)