{"version":3,"file":"ServerStats.3fbd2493deb8f4598755.js","mappings":"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","sources":["webpack://grafana/./public/app/features/admin/ServerStatsCard.tsx","webpack://grafana/./public/app/features/admin/state/apis.tsx","webpack://grafana/./public/app/features/admin/ServerStats.tsx"],"sourcesContent":["import { css, cx } from '@emotion/css';\nimport React from 'react';\nimport Skeleton from 'react-loading-skeleton';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { Card, Stack, useStyles2, Tooltip, Icon } from '@grafana/ui';\n\ninterface StatItem {\n name: string;\n value: string | number | undefined;\n tooltip?: string;\n highlight?: boolean;\n indent?: boolean;\n}\n\nexport interface Props {\n content: StatItem[];\n isLoading?: boolean;\n footer?: JSX.Element | boolean;\n}\n\nexport const ServerStatsCard = ({ content, footer, isLoading }: Props) => {\n const styles = useStyles2(getStyles);\n return (\n \n {content.map((item, index) => (\n \n \n {item.name}\n {item.tooltip && (\n \n \n \n )}\n \n {isLoading ? (\n \n ) : (\n {item.value}\n )}\n \n ))}\n {footer &&
{footer}
}\n
\n );\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n container: css({\n display: 'flex',\n flexDirection: 'column',\n gap: theme.spacing(2),\n padding: theme.spacing(2),\n }),\n indent: css({\n marginLeft: theme.spacing(2),\n }),\n tooltip: css({\n color: theme.colors.secondary.text,\n }),\n highlight: css({\n color: theme.colors.warning.text,\n padding: `${theme.spacing(0.5)} ${theme.spacing(1)}`,\n marginRight: `-${theme.spacing(1)}`,\n }),\n };\n};\n","import { getBackendSrv } from '@grafana/runtime';\n\ninterface AnonServerStat {\n activeDevices?: number;\n}\n\nexport interface ServerStat extends AnonServerStat {\n activeAdmins: number;\n activeEditors: number;\n activeSessions: number;\n activeUsers: number;\n activeViewers: number;\n admins: number;\n alerts: number;\n dashboards: number;\n datasources: number;\n editors: number;\n orgs: number;\n playlists: number;\n snapshots: number;\n stars: number;\n tags: number;\n users: number;\n viewers: number;\n}\n\nexport const getServerStats = async (): Promise => {\n return getBackendSrv()\n .get('api/admin/stats')\n .catch((err) => {\n console.error(err);\n return null;\n });\n};\n","import { css } from '@emotion/css';\nimport React, { useEffect, useState } from 'react';\n\nimport { GrafanaTheme2 } from '@grafana/data';\nimport { config, GrafanaBootConfig } from '@grafana/runtime';\nimport { LinkButton, useStyles2 } from '@grafana/ui';\nimport { AccessControlAction } from 'app/types';\n\nimport { contextSrv } from '../../core/services/context_srv';\n\nimport { ServerStatsCard } from './ServerStatsCard';\nimport { getServerStats, ServerStat } from './state/apis';\n\nexport const ServerStats = () => {\n const [stats, setStats] = useState(null);\n const [isLoading, setIsLoading] = useState(true);\n const styles = useStyles2(getStyles);\n\n const hasAccessToDataSources = contextSrv.hasPermission(AccessControlAction.DataSourcesRead);\n const hasAccessToAdminUsers = contextSrv.hasPermission(AccessControlAction.UsersRead);\n\n useEffect(() => {\n if (contextSrv.hasPermission(AccessControlAction.ActionServerStatsRead)) {\n getServerStats().then((stats) => {\n setStats(stats);\n setIsLoading(false);\n });\n }\n }, []);\n\n if (!contextSrv.hasPermission(AccessControlAction.ActionServerStatsRead)) {\n return null;\n }\n\n return (\n <>\n

Instance statistics

\n {!isLoading && !stats ? (\n

No stats found.

\n ) : (\n
\n \n Manage dashboards\n \n }\n />\n\n
\n \n Manage data sources\n \n )\n }\n />\n \n Manage alerts\n \n }\n />\n
\n \n Manage users\n \n )\n }\n />\n
\n )}\n \n );\n};\n\nconst getAnonymousStatsContent = (stats: ServerStat | null, config: GrafanaBootConfig) => {\n if (!config.anonymousEnabled || !config.featureToggles.displayAnonymousStats || !stats?.activeDevices) {\n return [];\n }\n if (!config.anonymousDeviceLimit) {\n return [\n {\n name: 'Active anonymous devices',\n value: `${stats.activeDevices}`,\n tooltip: 'Detected devices that are not logged in, in last 30 days.',\n },\n ];\n } else {\n return [\n {\n name: 'Active anonymous devices',\n value: `${stats.activeDevices} / ${config.anonymousDeviceLimit}`,\n tooltip: 'Detected devices that are not logged in, in last 30 days.',\n highlight: stats.activeDevices > config.anonymousDeviceLimit,\n },\n ];\n }\n};\n\nconst getStyles = (theme: GrafanaTheme2) => {\n return {\n title: css({\n marginBottom: theme.spacing(4),\n }),\n row: css({\n display: 'flex',\n justifyContent: 'space-between',\n width: '100%',\n\n '& > div:not(:last-of-type)': {\n marginRight: theme.spacing(2),\n },\n\n '& > div': {\n width: '33.3%',\n },\n }),\n doubleRow: css({\n display: 'flex',\n flexDirection: 'column',\n\n '& > div:first-of-type': {\n marginBottom: theme.spacing(2),\n },\n }),\n notFound: css({\n fontSize: theme.typography.h6.fontSize,\n textAlign: 'center',\n height: '290px',\n }),\n };\n};\n"],"names":["ServerStatsCard","content","footer","isLoading","styles","getStyles","Card","item","index","Stack","Tooltip","Icon","theme","getServerStats","err","ServerStats","stats","setStats","setIsLoading","hasAccessToDataSources","hasAccessToAdminUsers","getAnonymousStatsContent","config"],"sourceRoot":""}