import { css } from '@emotion/css'; import React, { useEffect, useState } from 'react'; import { GrafanaTheme2 } from '@grafana/data'; import { config, GrafanaBootConfig } from '@grafana/runtime'; import { LinkButton, useStyles2 } from '@grafana/ui'; import { AccessControlAction } from 'app/types'; 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 || !config.featureToggles.displayAnonymousStats || !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), }), row: css({ display: 'flex', justifyContent: 'space-between', width: '100%', '& > div:not(:last-of-type)': { marginRight: theme.spacing(2), }, '& > div': { width: '33.3%', }, }), doubleRow: css({ display: 'flex', flexDirection: 'column', '& > div:first-of-type': { marginBottom: theme.spacing(2), }, }), notFound: css({ fontSize: theme.typography.h6.fontSize, textAlign: 'center', height: '290px', }), }; };