Alerting: Add Synthetic and IRM link cards (#107538)

pull/107672/head
Hugo Kiyodi Oshiro 2 weeks ago committed by GitHub
parent 15e1aa8855
commit c7374b6910
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
  1. 2
      pkg/services/user/model.go
  2. 7
      public/app/core/components/Branding/CloudBadge.tsx
  3. 31
      public/app/core/components/Branding/CloudEnterpriseBadge.tsx
  4. 31
      public/app/core/components/Branding/OrangeBadge.tsx
  5. 146
      public/app/features/alerting/unified/home/AdCard.tsx
  6. 8
      public/app/features/alerting/unified/home/Home.tsx
  7. 28
      public/app/features/alerting/unified/home/IRMCard.tsx
  8. 38
      public/app/features/alerting/unified/home/SyntheticMonitoringCard.tsx
  9. 45
      public/img/irm_logo.svg
  10. 10
      public/img/synthetic_monitoring_logo.svg
  11. 19
      public/locales/en-US/grafana.json

@ -16,6 +16,8 @@ const (
HelpFlagGettingStartedPanelDismissed HelpFlags1 = 1 << iota
HelpFlagDashboardHelp1
HelpFlagEnterpriseAuth1
HelpFlagSyntheticMonitoring1
HelpFlagIRM1
)
type UpdateEmailActionType string

@ -0,0 +1,7 @@
import { t } from '@grafana/i18n';
import { OrangeBadge } from './OrangeBadge';
export function CloudBadge() {
return <OrangeBadge text={t('cloud-feature-badge', 'Cloud')} />;
}

@ -1,32 +1,7 @@
import { css } from '@emotion/css';
import { t } from '@grafana/i18n';
import { GrafanaTheme2 } from '@grafana/data';
import { Trans } from '@grafana/i18n';
import { Icon, useStyles2 } from '@grafana/ui';
import { OrangeBadge } from './OrangeBadge';
export function CloudEnterpriseBadge() {
const styles = useStyles2(getStyles);
return (
<div className={styles.wrapper}>
<Icon name="cloud" size="sm" />
<Trans i18nKey="cloud-enterprise-feature-badge">Cloud & Enterprise </Trans>
</div>
);
return <OrangeBadge text={t('cloud-enterprise-feature-badge', 'Cloud & Enterprise')} />;
}
const getStyles = (theme: GrafanaTheme2) => {
return {
wrapper: css({
display: 'inline-flex',
padding: theme.spacing(0.5, 1),
borderRadius: theme.shape.radius.pill,
background: theme.colors.gradients.brandHorizontal,
color: theme.colors.primary.contrastText,
fontWeight: theme.typography.fontWeightMedium,
gap: theme.spacing(0.5),
fontSize: theme.typography.bodySmall.fontSize,
lineHeight: theme.typography.bodySmall.lineHeight,
alignItems: 'center',
}),
};
};

@ -0,0 +1,31 @@
import { css } from '@emotion/css';
import { GrafanaTheme2 } from '@grafana/data';
import { Icon, useStyles2 } from '@grafana/ui';
export function OrangeBadge({ text }: { text: string }) {
const styles = useStyles2(getStyles);
return (
<div className={styles.wrapper}>
<Icon name="cloud" size="sm" />
{text}
</div>
);
}
const getStyles = (theme: GrafanaTheme2) => {
return {
wrapper: css({
display: 'inline-flex',
padding: theme.spacing(0.5, 1),
borderRadius: theme.shape.radius.pill,
background: theme.colors.gradients.brandHorizontal,
color: theme.colors.primary.contrastText,
fontWeight: theme.typography.fontWeightMedium,
gap: theme.spacing(0.5),
fontSize: theme.typography.bodySmall.fontSize,
lineHeight: theme.typography.bodySmall.lineHeight,
alignItems: 'center',
}),
};
};

@ -0,0 +1,146 @@
import { css } from '@emotion/css';
import { useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { Trans, t } from '@grafana/i18n';
import { Button, Divider, Icon, IconButton, useStyles2 } from '@grafana/ui';
import { CloudBadge } from 'app/core/components/Branding/CloudBadge';
import { backendSrv } from 'app/core/services/backend_srv';
import { contextSrv } from 'app/core/services/context_srv';
import { isOpenSourceBuildOrUnlicenced } from 'app/features/admin/EnterpriseAuthFeaturesCard';
type AdCardProps = {
title: string;
description: string;
href: string;
logoUrl: string;
items: string[];
helpFlag: number;
};
export default function AdCard({ title, description, href, logoUrl, items, helpFlag }: AdCardProps) {
const styles = useStyles2(getAddCardStyles);
const helpFlags = contextSrv.user.helpFlags1;
const [isDismissed, setDismissed] = useState<boolean>(Boolean(helpFlags & helpFlag));
const onDismiss = () => {
backendSrv.put(`/api/user/helpflags/${helpFlag}`, undefined, { showSuccessAlert: false }).then((res) => {
contextSrv.user.helpFlags1 = res.helpFlags1;
setDismissed(true);
});
};
if (isDismissed || !isOpenSourceBuildOrUnlicenced()) {
return null;
}
return (
<div className={styles.cardBody} title={title}>
<div className={styles.preHeader}>
<CloudBadge />
<IconButton name="times" size="sm" onClick={onDismiss} aria-label={t('alerting.ad.close', 'Close')} />
</div>
<header className={styles.header}>
<img src={logoUrl} alt={title.concat(' logo')} className={styles.logo} />
<div className={styles.contentColumn}>
<h3 className={styles.title}>{title}</h3>
<p className={styles.description}>{description}</p>
</div>
</header>
<Divider />
<div className={styles.itemsList}>
{items.map((item) => (
<div key={item} className={styles.listItem}>
<Icon className={styles.icon} name="check" />
{item}
</div>
))}
</div>
<Divider />
<Button fill="solid" variant="secondary" onClick={() => window.open(href, '_blank')} className={styles.button}>
<Trans i18nKey="alerting.ad.learn-more">Learn more</Trans>
<Icon name="external-link-alt" className={styles.buttonIcon} />
</Button>
</div>
);
}
const getAddCardStyles = (theme: GrafanaTheme2) => ({
logo: css({
objectFit: 'contain',
width: '47px',
height: '47px',
}),
header: css({
display: 'flex',
alignItems: 'flex-start',
gap: theme.spacing(2),
paddingTop: theme.spacing(2),
height: theme.spacing(8),
}),
contentColumn: css({
flex: 1,
}),
title: css({
marginBottom: theme.spacing(1),
fontSize: theme.typography.h4.fontSize,
fontWeight: theme.typography.h4.fontWeight,
color: theme.colors.text.primary,
}),
description: css({
fontSize: theme.typography.bodySmall.fontSize,
color: theme.colors.text.secondary,
lineHeight: theme.typography.bodySmall.lineHeight,
}),
itemsList: css({
display: 'grid',
gridTemplateColumns: '1fr',
gap: theme.spacing(0.5),
[theme.breakpoints.up('xl')]: {
gridTemplateColumns: '1fr 1fr',
gap: theme.spacing(1),
},
}),
listItem: css({
display: 'flex',
alignItems: 'flex-start',
fontSize: theme.typography.bodySmall.fontSize,
color: theme.colors.text.secondary,
lineHeight: theme.typography.bodySmall.lineHeight,
marginBottom: theme.spacing(0.5),
}),
icon: css({
marginRight: theme.spacing(1),
color: theme.colors.success.main,
}),
button: css({
padding: `0 ${theme.spacing(2)}`,
}),
buttonIcon: css({
marginLeft: theme.spacing(1),
}),
cardBody: css({
padding: `${theme.spacing(3)} ${theme.spacing(4)} ${theme.spacing(2.25)} ${theme.spacing(4)}`,
backgroundColor: theme.colors.background.secondary,
borderRadius: theme.shape.radius.default,
border: `1px solid ${theme.colors.border.weak}`,
flex: 1,
}),
preHeader: css({
display: 'flex',
justifyContent: 'space-between',
alignItems: 'center',
}),
});

@ -8,8 +8,10 @@ import { isLocalDevEnv } from '../utils/misc';
import { withPageErrorBoundary } from '../withPageErrorBoundary';
import GettingStarted, { WelcomeHeader } from './GettingStarted';
import IRMCard from './IRMCard';
import { getInsightsScenes, insightsIsAvailable } from './Insights';
import { PluginIntegrations } from './PluginIntegrations';
import SyntheticMonitoringCard from './SyntheticMonitoringCard';
function Home() {
const insightsEnabled = insightsIsAvailable() || isLocalDevEnv();
@ -27,6 +29,12 @@ function Home() {
<WelcomeHeader />
<PluginIntegrations />
</Stack>
<Box marginTop={{ lg: 2, md: 2, xs: 2 }}>
<Stack direction="row" gap={2}>
<SyntheticMonitoringCard />
<IRMCard />
</Stack>
</Box>
<Box marginTop={{ lg: 2, md: 0, xs: 0 }}>
<TabsBar>
{insightsEnabled && (

@ -0,0 +1,28 @@
import { t } from '@grafana/i18n';
import irmSvg from 'img/irm_logo.svg';
import AdCard from './AdCard';
const LINK = 'https://grafana.com/auth/sign-up/create-user?redirectPath=irm&src=oss-grafana&cnt=alerting-irm';
const HELP_FLAG_IRM = 0x0010;
export default function IRMCard() {
return (
<AdCard
title={t('alerting.home.irm-card-title', 'Incident response and management')}
description={t(
'alerting.home.irm-card-description',
'Unify on-call, alerting, and incident response with Grafana Cloud IRM.'
)}
href={LINK}
logoUrl={irmSvg}
items={[
t('alerting.home.irm-card-item-1', 'Manage on-call schedules with your calendar or Terraform.'),
t('alerting.home.irm-card-item-2', 'Respond to incidents via web, app, Slack, or other channels.'),
t('alerting.home.irm-card-item-3', 'Pinpoint root causes with AI-powered Grafana SIFT.'),
t('alerting.home.irm-card-item-4', 'Analyze past incidents to improve response and resilience.'),
]}
helpFlag={HELP_FLAG_IRM}
/>
);
}

@ -0,0 +1,38 @@
import { t } from '@grafana/i18n';
import syntheticMonitoringSvg from 'img/synthetic_monitoring_logo.svg';
import AdCard from './AdCard';
const LINK =
'https://grafana.com/auth/sign-up/create-user?redirectPath=synthetic-monitoring&src=oss-grafana&cnt=alerting-synthetic-monitoring';
const HELP_FLAG_SYNTHETIC_MONITORING = 0x0008;
export default function SyntheticMonitoringCard() {
return (
<AdCard
title={t('alerting.home.synthetic-monitoring-card-title', 'Synthetic Monitoring')}
description={t(
'alerting.home.synthetic-monitoring-card-description',
'Monitor critical user flows, websites, and APIs externally, from global locations.'
)}
href={LINK}
logoUrl={syntheticMonitoringSvg}
items={[
t('alerting.home.synthetic-monitoring-card-item-1', 'Simulate end-to-end user journeys with browser checks.'),
t(
'alerting.home.synthetic-monitoring-card-item-2',
'Run ping, DNS, HTTP/S, and TCP checks at every network layer.'
),
t(
'alerting.home.synthetic-monitoring-card-item-3',
'Use 20+ global probes or private probes behind your firewall.'
),
t(
'alerting.home.synthetic-monitoring-card-item-4',
'Track SLOs with built-in Prometheus-style alerts — right from the UI.'
),
]}
helpFlag={HELP_FLAG_SYNTHETIC_MONITORING}
/>
);
}

@ -0,0 +1,45 @@
<svg width="47" height="47" viewBox="0 0 47 47" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="47" height="47" rx="4" fill="#CCCCDC" fill-opacity="0.14"/>
<path d="M23.408 9.27604C24.3127 9.27604 25.0461 8.54267 25.0461 7.63802C25.0461 6.73337 24.3127 6 23.408 6C22.5034 6 21.77 6.73337 21.77 7.63802C21.77 8.54267 22.5034 9.27604 23.408 9.27604Z" fill="url(#paint0_linear_191_6486)"/>
<path d="M24.4494 17.572C24.273 17.572 24.1292 17.7159 24.1292 17.8923V25.2967C24.1292 25.4731 24.273 25.6169 24.4494 25.6169H26.6086C26.7728 25.6169 26.9112 25.4921 26.9275 25.3279L27.6698 17.9235C27.6888 17.7349 27.5409 17.5707 27.3509 17.5707H24.4481L24.4494 17.572Z" fill="url(#paint1_linear_191_6486)"/>
<path d="M19.6519 17.5721C19.4619 17.5721 19.3139 17.7363 19.3329 17.9249L20.0698 25.3293C20.0861 25.4935 20.2246 25.6183 20.3888 25.6183H22.5262C22.7026 25.6183 22.8465 25.4745 22.8465 25.298V17.8937C22.8465 17.7173 22.7026 17.5734 22.5262 17.5734H19.6519V17.5721Z" fill="url(#paint2_linear_191_6486)"/>
<path d="M31.6775 17.5721H29.2836C29.1194 17.5721 28.981 17.6969 28.9647 17.8611L28.2223 25.2655C28.2033 25.4541 28.3513 25.6183 28.5413 25.6183H30.2037C30.3571 25.6183 30.4887 25.5097 30.5186 25.3605L31.9937 17.9561C32.0331 17.758 31.8811 17.5734 31.6789 17.5734L31.6775 17.5721Z" fill="url(#paint3_linear_191_6486)"/>
<path d="M18.7749 25.2655L18.038 17.8611C18.0217 17.6969 17.8833 17.5721 17.7191 17.5721H15.3211C15.1189 17.5721 14.9669 17.7566 15.0062 17.9548L16.4814 25.3591C16.5113 25.5097 16.6429 25.617 16.7962 25.617H18.456C18.646 25.617 18.7939 25.4527 18.7749 25.2641V25.2655Z" fill="url(#paint4_linear_191_6486)"/>
<path d="M17.1547 12.4449H29.6631C29.9427 12.4449 30.1897 12.263 30.2738 11.9957C30.4027 11.5831 30.0947 11.1651 29.6631 11.1651H23.8887V9.86366C23.7339 9.89759 23.5738 9.91523 23.4082 9.91523C23.2427 9.91523 23.0825 9.89623 22.9278 9.86366V11.1651H17.1547C16.7232 11.1651 16.4151 11.5831 16.544 11.9957C16.6282 12.263 16.8752 12.4449 17.1547 12.4449Z" fill="url(#paint5_linear_191_6486)"/>
<path d="M29.0008 16.0683L29.602 14.1426C29.6671 13.9363 29.5124 13.7259 29.2966 13.7259H17.5211C17.3053 13.7259 17.1506 13.9363 17.2157 14.1426L17.8169 16.0683C17.859 16.2026 17.9825 16.2936 18.1223 16.2936H28.6941C28.8339 16.2936 28.9587 16.2026 28.9994 16.0683H29.0008Z" fill="url(#paint6_linear_191_6486)"/>
<path d="M28.2891 26.8992H18.5275C18.1733 26.8992 17.887 27.1855 17.887 27.5397V38.136C17.887 39.1986 18.7474 40.059 19.81 40.059H27.0067C28.0693 40.059 28.9297 39.1986 28.9297 38.136V27.5397C28.9297 27.1855 28.6433 26.8992 28.2891 26.8992Z" fill="url(#paint7_linear_191_6486)"/>
<defs>
<linearGradient id="paint0_linear_191_6486" x1="23.408" y1="6.85314" x2="23.408" y2="9.27604" gradientUnits="userSpaceOnUse">
<stop stop-color="#F55F3E"/>
<stop offset="1" stop-color="#FF8833"/>
</linearGradient>
<linearGradient id="paint1_linear_191_6486" x1="25.9003" y1="19.6661" x2="25.9003" y2="25.6169" gradientUnits="userSpaceOnUse">
<stop stop-color="#F55F3E"/>
<stop offset="1" stop-color="#FF8833"/>
</linearGradient>
<linearGradient id="paint2_linear_191_6486" x1="21.0889" y1="19.6674" x2="21.0889" y2="25.6183" gradientUnits="userSpaceOnUse">
<stop stop-color="#F55F3E"/>
<stop offset="1" stop-color="#FF8833"/>
</linearGradient>
<linearGradient id="paint3_linear_191_6486" x1="30.1103" y1="19.6674" x2="30.1103" y2="25.6183" gradientUnits="userSpaceOnUse">
<stop stop-color="#F55F3E"/>
<stop offset="1" stop-color="#FF8833"/>
</linearGradient>
<linearGradient id="paint4_linear_191_6486" x1="16.8883" y1="19.6671" x2="16.8883" y2="25.617" gradientUnits="userSpaceOnUse">
<stop stop-color="#F55F3E"/>
<stop offset="1" stop-color="#FF8833"/>
</linearGradient>
<linearGradient id="paint5_linear_191_6486" x1="23.4089" y1="10.5359" x2="23.4089" y2="12.4449" gradientUnits="userSpaceOnUse">
<stop stop-color="#F55F3E"/>
<stop offset="1" stop-color="#FF8833"/>
</linearGradient>
<linearGradient id="paint6_linear_191_6486" x1="23.4089" y1="14.3946" x2="23.4089" y2="16.2936" gradientUnits="userSpaceOnUse">
<stop stop-color="#F55F3E"/>
<stop offset="1" stop-color="#FF8833"/>
</linearGradient>
<linearGradient id="paint7_linear_191_6486" x1="23.4083" y1="30.3262" x2="23.4083" y2="40.059" gradientUnits="userSpaceOnUse">
<stop stop-color="#F55F3E"/>
<stop offset="1" stop-color="#FF8833"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 4.3 KiB

@ -0,0 +1,10 @@
<svg width="47" height="47" viewBox="0 0 47 47" fill="none" xmlns="http://www.w3.org/2000/svg">
<rect width="47" height="47" rx="4" fill="#CCCCDC" fill-opacity="0.14"/>
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.7654 30.5449C25.2271 30.0828 25.2271 29.3319 24.7654 28.8698L18.068 22.1602C14.8358 18.9243 14.8358 13.661 18.068 10.426C19.6814 8.80987 21.8073 8 23.9288 8C26.0494 8 28.1753 8.80987 29.7897 10.426L32.6004 13.24L32.6414 13.2812C32.829 13.4832 32.9477 13.7531 32.9477 14.0508C32.9477 14.6729 32.4451 15.1762 31.8236 15.1762C31.5263 15.1762 31.2566 15.0573 31.0557 14.8696L31.0325 14.8472L28.203 12.0136C27.0646 10.8739 25.5467 10.2473 23.9333 10.2473C22.319 10.2473 20.802 10.8739 19.6636 12.0136C17.3091 14.3708 17.3091 18.2109 19.6636 20.5681L26.361 27.2724C27.0101 27.9222 27.3664 28.7831 27.3664 29.7029C27.3664 30.6227 27.0101 31.4835 26.361 32.1334C25.7118 32.7832 24.8521 33.1399 23.9333 33.1399C23.7824 33.1399 23.6324 33.1301 23.485 33.1113C23.1672 33.0701 22.8601 32.9862 22.5707 32.861C22.1788 32.6912 21.8181 32.4463 21.5056 32.1334L17.1948 27.8123C17.0519 27.6827 16.9376 27.5155 16.8733 27.3242C16.8358 27.2134 16.8153 27.0945 16.8153 26.9702C16.8153 26.7477 16.8796 26.5394 16.9912 26.3651C17.0322 26.3007 17.0805 26.2399 17.134 26.1845C17.3385 25.9744 17.6233 25.8448 17.9403 25.8448C18.0921 25.8448 18.2376 25.8761 18.3698 25.9324C18.5287 25.9994 18.6689 26.1022 18.7814 26.2292L23.0922 30.5449C23.3208 30.7782 23.627 30.8926 23.9288 30.8926C24.2306 30.8926 24.5324 30.7738 24.7654 30.5449ZM16.5635 24.4629C16.5635 25.085 16.0608 25.5883 15.4394 25.5883C15.1117 25.5883 14.817 25.4488 14.6117 25.2253C14.4268 25.0251 14.3144 24.757 14.3144 24.4629C14.3144 23.8398 14.817 23.3366 15.4394 23.3366C15.6528 23.3366 15.8519 23.3956 16.0224 23.4992C16.1751 23.5922 16.3037 23.7201 16.3974 23.872C16.5028 24.0436 16.5635 24.2456 16.5635 24.4629ZM34.3228 15.7081C34.2227 15.7608 34.129 15.8287 34.0451 15.9128L31.2066 18.7553L29.7986 17.3457C29.3503 16.897 28.628 16.897 28.1798 17.3457C27.7325 17.7944 27.7325 18.5176 28.1798 18.9654L30.3977 21.1858C30.6209 21.4093 30.9137 21.5193 31.2066 21.5193C31.3789 21.5193 31.5522 21.4808 31.7111 21.4031C31.8209 21.3494 31.9236 21.277 32.0156 21.1858L35.6639 17.5334C36.112 17.0847 36.112 16.3615 35.6639 15.9128C35.2996 15.5489 34.7549 15.481 34.3228 15.7081ZM23.0913 15.4551C22.6297 15.9172 22.6297 16.6681 23.0913 17.1302L29.7887 23.8398C33.0209 27.0757 33.0209 32.339 29.7887 35.5749C28.1753 37.1901 26.0494 38 23.9279 38C21.8073 38 19.6859 37.1901 18.068 35.5749L11.3795 28.8787L11.3884 28.8698C11.1509 28.6588 11 28.362 11 28.0232C11 27.7032 11.1321 27.4154 11.3455 27.2107C11.5473 27.0158 11.8223 26.897 12.125 26.897C12.4679 26.897 12.7741 27.057 12.9795 27.3001L19.6537 33.9819C20.7921 35.1217 22.31 35.7483 23.9235 35.7483C25.5378 35.7483 27.0547 35.1217 28.1932 33.9819C30.5477 31.6247 30.5477 27.7846 28.1932 25.4283L21.4966 18.7232C20.8466 18.0733 20.4904 17.2125 20.4904 16.2927C20.4904 15.3729 20.8466 14.512 21.4966 13.8622C22.1457 13.2123 23.0047 12.8556 23.9235 12.8556C24.8422 12.8556 25.7021 13.2123 26.3512 13.8622L27.1789 14.6908C27.3842 14.8973 27.5119 15.1807 27.5119 15.4917C27.5119 16.1139 27.0092 16.6181 26.3878 16.6181C26.0681 16.6181 25.7797 16.4804 25.5744 16.265L24.7646 15.4551C24.536 15.2218 24.2297 15.1073 23.9279 15.1073C23.6261 15.1073 23.3199 15.2263 23.0913 15.4551Z" fill="url(#paint0_linear_191_6483)"/>
<defs>
<linearGradient id="paint0_linear_191_6483" x1="23.5" y1="15.8125" x2="23.5" y2="38" gradientUnits="userSpaceOnUse">
<stop stop-color="#F55F3E"/>
<stop offset="1" stop-color="#FF8833"/>
</linearGradient>
</defs>
</svg>

After

Width:  |  Height:  |  Size: 3.6 KiB

@ -352,6 +352,10 @@
"active-timing-fields": {
"am-active-timing-select-label-active-timings": "Active timings"
},
"ad": {
"close": "Close",
"learn-more": "Learn more"
},
"add-button": {
"add-more": "Add more"
},
@ -1525,8 +1529,20 @@
}
},
"home": {
"irm-card-description": "Unify on-call, alerting, and incident response with Grafana Cloud IRM.",
"irm-card-item-1": "Manage on-call schedules with your calendar or Terraform.",
"irm-card-item-2": "Respond to incidents via web, app, Slack, or other channels.",
"irm-card-item-3": "Pinpoint root causes with AI-powered Grafana SIFT.",
"irm-card-item-4": "Analyze past incidents to improve response and resilience.",
"irm-card-title": "Incident response and management",
"label-get-started": "Get started",
"label-insights": "Insights",
"synthetic-monitoring-card-description": "Monitor critical user flows, websites, and APIs externally, from global locations.",
"synthetic-monitoring-card-item-1": "Simulate end-to-end user journeys with browser checks.",
"synthetic-monitoring-card-item-2": "Run ping, DNS, HTTP/S, and TCP checks at every network layer.",
"synthetic-monitoring-card-item-3": "Use 20+ global probes or private probes behind your firewall.",
"synthetic-monitoring-card-item-4": "Track SLOs with built-in Prometheus-style alerts — right from the UI.",
"synthetic-monitoring-card-title": "Synthetic Monitoring",
"title-alerting": "Alerting"
},
"import-to-gma": {
@ -3894,7 +3910,8 @@
"close-button": {
"tooltip": "Close"
},
"cloud-enterprise-feature-badge": "Cloud & Enterprise ",
"cloud-enterprise-feature-badge": "Cloud & Enterprise",
"cloud-feature-badge": "Cloud",
"combobox": {
"async": {
"error": "An error occurred while loading options."

Loading…
Cancel
Save