mirror of
https://github.com/hanzoai/sentinel.git
synced 2026-09-29 22:34:33 +00:00
127 lines
3.6 KiB
TypeScript
127 lines
3.6 KiB
TypeScript
import type {Theme} from '@emotion/react';
|
|
import cronstrue from 'cronstrue';
|
|
|
|
import {t, tn} from 'sentry/locale';
|
|
import type {Organization, SelectValue} from 'sentry/types';
|
|
import {shouldUse24Hours} from 'sentry/utils/dates';
|
|
import type {MonitorConfig} from 'sentry/views/monitors/types';
|
|
import {CheckInStatus, ScheduleType} from 'sentry/views/monitors/types';
|
|
|
|
export function makeMonitorListQueryKey(
|
|
organization: Organization,
|
|
params: Record<string, any>
|
|
) {
|
|
const {query, project, environment, cursor, sort, asc} = params;
|
|
|
|
return [
|
|
`/organizations/${organization.slug}/monitors/`,
|
|
{
|
|
query: {
|
|
cursor,
|
|
query,
|
|
project,
|
|
environment,
|
|
includeNew: true,
|
|
per_page: 20,
|
|
sort,
|
|
asc,
|
|
},
|
|
},
|
|
] as const;
|
|
}
|
|
|
|
export function makeMonitorDetailsQueryKey(
|
|
organization: Organization,
|
|
monitorSlug: string,
|
|
query?: Record<string, any>
|
|
) {
|
|
return [
|
|
`/organizations/${organization.slug}/monitors/${monitorSlug}/`,
|
|
{query},
|
|
] as const;
|
|
}
|
|
|
|
export function crontabAsText(crontabInput: string | null): string | null {
|
|
if (!crontabInput) {
|
|
return null;
|
|
}
|
|
let parsedSchedule: string;
|
|
try {
|
|
parsedSchedule = cronstrue.toString(crontabInput, {
|
|
verbose: false,
|
|
use24HourTimeFormat: shouldUse24Hours(),
|
|
});
|
|
} catch (_e) {
|
|
return null;
|
|
}
|
|
|
|
return parsedSchedule;
|
|
}
|
|
|
|
export function scheduleAsText(config: MonitorConfig) {
|
|
// Crontab format uses cronstrue
|
|
if (config.schedule_type === ScheduleType.CRONTAB) {
|
|
const parsedSchedule = crontabAsText(config.schedule);
|
|
return parsedSchedule ?? t('Unknown schedule');
|
|
}
|
|
|
|
if (config.schedule_type === ScheduleType.INTERVAL) {
|
|
// Interval format is simpler
|
|
const [value, timeUnit] = config.schedule;
|
|
|
|
if (timeUnit === 'minute') {
|
|
return tn('Every minute', 'Every %s minutes', value);
|
|
}
|
|
|
|
if (timeUnit === 'hour') {
|
|
return tn('Every hour', 'Every %s hours', value);
|
|
}
|
|
|
|
if (timeUnit === 'day') {
|
|
return tn('Every day', 'Every %s days', value);
|
|
}
|
|
|
|
if (timeUnit === 'week') {
|
|
return tn('Every week', 'Every %s weeks', value);
|
|
}
|
|
|
|
if (timeUnit === 'month') {
|
|
return tn('Every month', 'Every %s months', value);
|
|
}
|
|
|
|
if (timeUnit === 'year') {
|
|
return tn('Every year', 'Every %s years', value);
|
|
}
|
|
}
|
|
|
|
return t('Unknown schedule');
|
|
}
|
|
|
|
export const statusToText: Record<CheckInStatus, string> = {
|
|
[CheckInStatus.OK]: t('Okay'),
|
|
[CheckInStatus.ERROR]: t('Failed'),
|
|
[CheckInStatus.IN_PROGRESS]: t('In Progress'),
|
|
[CheckInStatus.MISSED]: t('Missed'),
|
|
[CheckInStatus.TIMEOUT]: t('Timed Out'),
|
|
};
|
|
|
|
export function getColorsFromStatus(status: CheckInStatus, theme: Theme) {
|
|
const statusToColor: Record<CheckInStatus, {labelColor: string; tickColor: string}> = {
|
|
[CheckInStatus.ERROR]: {tickColor: theme.red300, labelColor: theme.red400},
|
|
[CheckInStatus.TIMEOUT]: {tickColor: theme.red300, labelColor: theme.red400},
|
|
[CheckInStatus.OK]: {tickColor: theme.green300, labelColor: theme.green400},
|
|
[CheckInStatus.MISSED]: {tickColor: theme.yellow300, labelColor: theme.yellow400},
|
|
[CheckInStatus.IN_PROGRESS]: {tickColor: theme.disabled, labelColor: theme.disabled},
|
|
};
|
|
return statusToColor[status];
|
|
}
|
|
|
|
export const getScheduleIntervals = (n: number): SelectValue<string>[] => [
|
|
{value: 'minute', label: tn('minute', 'minutes', n)},
|
|
{value: 'hour', label: tn('hour', 'hours', n)},
|
|
{value: 'day', label: tn('day', 'days', n)},
|
|
{value: 'week', label: tn('week', 'weeks', n)},
|
|
{value: 'month', label: tn('month', 'months', n)},
|
|
{value: 'year', label: tn('year', 'years', n)},
|
|
];
|