import { css } from '@emotion/css'; import { useEffect, useState } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { Trans } from '@grafana/i18n'; import { config, GrafanaBootConfig } from '@grafana/runtime'; import { LinkButton, Stack, useStyles2 } from '@grafana/ui'; import { AccessControlAction } from 'app/types/accessControl'; import { contextSrv } from '../../core/services/context_srv'; import { ServerStatsCard } from './ServerStatsCard'; import { getServerStats, ServerStat } from './state/apis'; export const ServerStats = () => { const [stats, setStats] = useState(null); const [isLoading, setIsLoading] = useState(true); const styles = useStyles2(getStyles); const hasAccessToDataSources = contextSrv.hasPermission(AccessControlAction.DataSourcesRead); const hasAccessToAdminUsers = contextSrv.hasPermission(AccessControlAction.UsersRead); useEffect(() => { if (contextSrv.hasPermission(AccessControlAction.ActionServerStatsRead)) { getServerStats().then((stats) => { setStats(stats); setIsLoading(false); }); } }, []); if (!contextSrv.hasPermission(AccessControlAction.ActionServerStatsRead)) { return null; } return ( <>

Instance statistics

{!isLoading && !stats ? (

No stats found.

) : ( Manage dashboards } /> Manage data sources ) } /> Manage alerts } /> Manage users ) } /> )} ); }; const getAnonymousStatsContent = (stats: ServerStat | null, config: GrafanaBootConfig) => { if (!config.anonymousEnabled || !stats?.activeDevices) { return []; } if (!config.anonymousDeviceLimit) { return [ { name: 'Active anonymous devices', value: `${stats.activeDevices}`, tooltip: 'Detected devices that are not logged in, in last 30 days.', }, ]; } else { return [ { name: 'Active anonymous devices', value: `${stats.activeDevices} / ${config.anonymousDeviceLimit}`, tooltip: 'Detected devices that are not logged in, in last 30 days.', highlight: stats.activeDevices > config.anonymousDeviceLimit, }, ]; } }; const getStyles = (theme: GrafanaTheme2) => { return { title: css({ marginBottom: theme.spacing(4), }), notFound: css({ fontSize: theme.typography.h6.fontSize, textAlign: 'center', height: '290px', }), }; };