diff --git a/packages/grafana-data/src/types/icon.ts b/packages/grafana-data/src/types/icon.ts index b75521182db..c1889cf1b6f 100644 --- a/packages/grafana-data/src/types/icon.ts +++ b/packages/grafana-data/src/types/icon.ts @@ -21,6 +21,7 @@ export const availableIconsIndex = { 'angle-up': true, 'align-left': true, 'align-right': true, + 'application-observability': true, apps: true, arrow: true, 'arrow-down': true, @@ -110,6 +111,7 @@ export const availableIconsIndex = { 'folder-plus': true, 'folder-upload': true, forward: true, + 'frontend-observability': true, 'gf-bar-alignment-after': true, 'gf-bar-alignment-before': true, 'gf-bar-alignment-center': true, diff --git a/pkg/services/navtree/models.go b/pkg/services/navtree/models.go index e6e2354f692..74008ff1f82 100644 --- a/pkg/services/navtree/models.go +++ b/pkg/services/navtree/models.go @@ -13,17 +13,18 @@ const ( WeightHome = (iota - 20) * 100 WeightSavedItems - WeightCreate WeightDashboard WeightExplore WeightAlerting WeightAlertsAndIncidents WeightMonitoring + WeightInfrastructure + WeightApplication + WeightFrontend WeightDataConnections WeightApps WeightPlugin WeightConfig - WeightAdmin WeightProfile WeightHelp ) @@ -31,11 +32,14 @@ const ( const ( NavIDRoot = "root" NavIDDashboards = "dashboards/browse" + NavIDExplore = "explore" NavIDCfg = "cfg" // NavIDCfg is the id for org configuration navigation node NavIDAlertsAndIncidents = "alerts-and-incidents" NavIDAlerting = "alerting" NavIDAlertingLegacy = "alerting-legacy" NavIDMonitoring = "monitoring" + NavIDInfrastructure = "infrastructure" + NavIDFrontend = "frontend" NavIDReporting = "reports" NavIDApps = "apps" NavIDCfgGeneral = "cfg/general" diff --git a/pkg/services/navtree/navtreeimpl/applinks.go b/pkg/services/navtree/navtreeimpl/applinks.go index 1e03944ea74..8fa6b7cec71 100644 --- a/pkg/services/navtree/navtreeimpl/applinks.go +++ b/pkg/services/navtree/navtreeimpl/applinks.go @@ -213,6 +213,26 @@ func (s *ServiceImpl) addPluginToSection(c *contextmodel.ReqContext, treeRoot *n Children: []*navtree.NavLink{appLink}, Url: s.cfg.AppSubURL + "/monitoring", }) + case navtree.NavIDInfrastructure: + treeRoot.AddSection(&navtree.NavLink{ + Text: "Infrastructure", + Id: navtree.NavIDInfrastructure, + SubTitle: "Understand your infrastructure's health", + Icon: "heart-rate", + SortWeight: navtree.WeightInfrastructure, + Children: []*navtree.NavLink{appLink}, + Url: s.cfg.AppSubURL + "/infrastructure", + }) + case navtree.NavIDFrontend: + treeRoot.AddSection(&navtree.NavLink{ + Text: "Frontend", + Id: navtree.NavIDFrontend, + SubTitle: "Gain real user monitoring insights", + Icon: "frontend-observability", + SortWeight: navtree.WeightFrontend, + Children: []*navtree.NavLink{appLink}, + Url: s.cfg.AppSubURL + "/frontend", + }) case navtree.NavIDAlertsAndIncidents: alertsAndIncidentsChildren := []*navtree.NavLink{} if alertingNode != nil { @@ -252,12 +272,34 @@ func (s *ServiceImpl) hasAccessToInclude(c *contextmodel.ReqContext, pluginID st } func (s *ServiceImpl) readNavigationSettings() { + k8sCfg := NavigationAppConfig{SectionID: navtree.NavIDMonitoring, SortWeight: 1, Text: "Kubernetes"} + appO11yCfg := NavigationAppConfig{SectionID: navtree.NavIDMonitoring, SortWeight: 2, Text: "Application"} + profilesCfg := NavigationAppConfig{SectionID: navtree.NavIDMonitoring, SortWeight: 3, Text: "Profiles"} + frontendCfg := NavigationAppConfig{SectionID: navtree.NavIDMonitoring, SortWeight: 4, Text: "Frontend"} + syntheticsCfg := NavigationAppConfig{SectionID: navtree.NavIDMonitoring, SortWeight: 5, Text: "Synthetics"} + + if s.features.IsEnabledGlobally(featuremgmt.FlagDockedMegaMenu) { + k8sCfg.SectionID = navtree.NavIDInfrastructure + + appO11yCfg.SectionID = navtree.NavIDRoot + appO11yCfg.SortWeight = navtree.WeightApplication + + profilesCfg.SectionID = navtree.NavIDExplore + profilesCfg.SortWeight = 1 + + frontendCfg.SectionID = navtree.NavIDFrontend + frontendCfg.SortWeight = 1 + + syntheticsCfg.SectionID = navtree.NavIDFrontend + syntheticsCfg.SortWeight = 2 + } + s.navigationAppConfig = map[string]NavigationAppConfig{ - "grafana-k8s-app": {SectionID: navtree.NavIDMonitoring, SortWeight: 1, Text: "Kubernetes"}, - "grafana-app-observability-app": {SectionID: navtree.NavIDMonitoring, SortWeight: 2, Text: "Application"}, - "grafana-pyroscope-app": {SectionID: navtree.NavIDMonitoring, SortWeight: 3, Text: "Profiles"}, - "grafana-kowalski-app": {SectionID: navtree.NavIDMonitoring, SortWeight: 4, Text: "Frontend"}, - "grafana-synthetic-monitoring-app": {SectionID: navtree.NavIDMonitoring, SortWeight: 5, Text: "Synthetics"}, + "grafana-k8s-app": k8sCfg, + "grafana-app-observability-app": appO11yCfg, + "grafana-pyroscope-app": profilesCfg, + "grafana-kowalski-app": frontendCfg, + "grafana-synthetic-monitoring-app": syntheticsCfg, "grafana-oncall-app": {SectionID: navtree.NavIDAlertsAndIncidents, SortWeight: 1, Text: "OnCall"}, "grafana-incident-app": {SectionID: navtree.NavIDAlertsAndIncidents, SortWeight: 2, Text: "Incidents"}, "grafana-ml-app": {SectionID: navtree.NavIDAlertsAndIncidents, SortWeight: 3, Text: "Machine Learning"}, diff --git a/pkg/services/navtree/navtreeimpl/navtree.go b/pkg/services/navtree/navtreeimpl/navtree.go index 7e6b6729aae..e6c7b6c36b6 100644 --- a/pkg/services/navtree/navtreeimpl/navtree.go +++ b/pkg/services/navtree/navtreeimpl/navtree.go @@ -119,7 +119,7 @@ func (s *ServiceImpl) GetNavTree(c *contextmodel.ReqContext, prefs *pref.Prefere if setting.ExploreEnabled && hasAccess(ac.EvalPermission(ac.ActionDatasourcesExplore)) { treeRoot.AddSection(&navtree.NavLink{ Text: "Explore", - Id: "explore", + Id: navtree.NavIDExplore, SubTitle: "Explore your data", Icon: "compass", SortWeight: navtree.WeightExplore, diff --git a/public/app/core/utils/navBarItem-translations.ts b/public/app/core/utils/navBarItem-translations.ts index 6e713d98640..bff076047f5 100644 --- a/public/app/core/utils/navBarItem-translations.ts +++ b/public/app/core/utils/navBarItem-translations.ts @@ -118,6 +118,10 @@ export function getNavTitle(navId: string | undefined) { return t('nav.upgrading.title', 'Stats and license'); case 'monitoring': return t('nav.monitoring.title', 'Observability'); + case 'infrastructure': + return t('nav.infrastructure.title', 'Infrastructure'); + case 'frontend': + return t('nav.frontend.title', 'Frontend'); case 'apps': return t('nav.apps.title', 'Apps'); case 'alerts-and-incidents': @@ -139,7 +143,7 @@ export function getNavTitle(navId: string | undefined) { case 'plugin-page-grafana-pyroscope-app': return t('nav.profiles.title', 'Profiles'); case 'plugin-page-grafana-kowalski-app': - return t('nav.frontend.title', 'Frontend'); + return t('nav.frontend-app.title', 'Frontend'); case 'plugin-page-grafana-synthetic-monitoring-app': return t('nav.synthetics.title', 'Synthetics'); case 'help': @@ -161,7 +165,7 @@ export function getNavTitle(navId: string | undefined) { case 'connections-datasources': return t('nav.data-sources.title', 'Data sources'); case 'standalone-plugin-page-/connections/infrastructure': - return t('nav.infrastructure.title', 'Integrations'); + return t('nav.integrations.title', 'Integrations'); case 'standalone-plugin-page-/connections/connect-data': return t('nav.connect-data.title', 'Connect data'); case 'plugin-page-grafana-detect-app': @@ -246,6 +250,10 @@ export function getNavSubTitle(navId: string | undefined) { return t('nav.apps.subtitle', 'App plugins that extend the Grafana experience'); case 'monitoring': return t('nav.monitoring.subtitle', 'Out-of-the-box observability solutions'); + case 'infrastructure': + return t('nav.infrastructure.subtitle', "Understand your infrastructure's health"); + case 'frontend': + return t('nav.frontend.subtitle', 'Gain real user monitoring insights'); case 'alerts-and-incidents': return t('nav.alerts-and-incidents.subtitle', 'Alerting and incident management apps'); case 'connections-add-new-connection': diff --git a/public/app/routes/routes.tsx b/public/app/routes/routes.tsx index e9da62614c1..ea22c474453 100644 --- a/public/app/routes/routes.tsx +++ b/public/app/routes/routes.tsx @@ -174,6 +174,14 @@ export function getAppRoutes(): RouteDescriptor[] { path: '/monitoring', component: () => , }, + { + path: '/infrastructure', + component: () => , + }, + { + path: '/frontend', + component: () => , + }, { path: '/admin/general', component: () => , diff --git a/public/img/icons/unicons/application-observability.svg b/public/img/icons/unicons/application-observability.svg new file mode 100644 index 00000000000..9ea3ec93680 --- /dev/null +++ b/public/img/icons/unicons/application-observability.svg @@ -0,0 +1,9 @@ + + + + + + + + + diff --git a/public/img/icons/unicons/frontend-observability.svg b/public/img/icons/unicons/frontend-observability.svg new file mode 100644 index 00000000000..743b87dc8a8 --- /dev/null +++ b/public/img/icons/unicons/frontend-observability.svg @@ -0,0 +1,4 @@ + + + + diff --git a/public/locales/de-DE/grafana.json b/public/locales/de-DE/grafana.json index 750f14ec237..7a6e234a877 100644 --- a/public/locales/de-DE/grafana.json +++ b/public/locales/de-DE/grafana.json @@ -773,6 +773,10 @@ "title": "Entdecken" }, "frontend": { + "subtitle": "", + "title": "" + }, + "frontend-app": { "title": "Frontend" }, "global-orgs": { @@ -800,6 +804,10 @@ "title": "Störungen" }, "infrastructure": { + "subtitle": "", + "title": "" + }, + "integrations": { "title": "Integrationen" }, "kubernetes": { diff --git a/public/locales/en-US/grafana.json b/public/locales/en-US/grafana.json index 7400c72c39f..37ea6dd0e06 100644 --- a/public/locales/en-US/grafana.json +++ b/public/locales/en-US/grafana.json @@ -773,6 +773,10 @@ "title": "Explore" }, "frontend": { + "subtitle": "Gain real user monitoring insights", + "title": "Frontend" + }, + "frontend-app": { "title": "Frontend" }, "global-orgs": { @@ -800,6 +804,10 @@ "title": "Incidents" }, "infrastructure": { + "subtitle": "Understand your infrastructure's health", + "title": "Infrastructure" + }, + "integrations": { "title": "Integrations" }, "kubernetes": { diff --git a/public/locales/es-ES/grafana.json b/public/locales/es-ES/grafana.json index c8550f6d54d..4f631fc0cf6 100644 --- a/public/locales/es-ES/grafana.json +++ b/public/locales/es-ES/grafana.json @@ -779,6 +779,10 @@ "title": "Explorar" }, "frontend": { + "subtitle": "", + "title": "" + }, + "frontend-app": { "title": "Interfaz" }, "global-orgs": { @@ -806,6 +810,10 @@ "title": "Incidentes" }, "infrastructure": { + "subtitle": "", + "title": "" + }, + "integrations": { "title": "Integraciones" }, "kubernetes": { diff --git a/public/locales/fr-FR/grafana.json b/public/locales/fr-FR/grafana.json index c72db727f04..87c722bd604 100644 --- a/public/locales/fr-FR/grafana.json +++ b/public/locales/fr-FR/grafana.json @@ -779,6 +779,10 @@ "title": "Explorer" }, "frontend": { + "subtitle": "", + "title": "" + }, + "frontend-app": { "title": "Frontend" }, "global-orgs": { @@ -806,6 +810,10 @@ "title": "Incidents" }, "infrastructure": { + "subtitle": "", + "title": "" + }, + "integrations": { "title": "Intégrations" }, "kubernetes": { diff --git a/public/locales/pseudo-LOCALE/grafana.json b/public/locales/pseudo-LOCALE/grafana.json index f7113312014..a988b6137dd 100644 --- a/public/locales/pseudo-LOCALE/grafana.json +++ b/public/locales/pseudo-LOCALE/grafana.json @@ -773,6 +773,10 @@ "title": "Ēχpľőřę" }, "frontend": { + "subtitle": "Ğäįʼn řęäľ ūşęř mőʼnįŧőřįʼnģ įʼnşįģĥŧş", + "title": "Fřőʼnŧęʼnđ" + }, + "frontend-app": { "title": "Fřőʼnŧęʼnđ" }, "global-orgs": { @@ -800,6 +804,10 @@ "title": "Ĩʼnčįđęʼnŧş" }, "infrastructure": { + "subtitle": "Ůʼnđęřşŧäʼnđ yőūř įʼnƒřäşŧřūčŧūřę'ş ĥęäľŧĥ", + "title": "Ĩʼnƒřäşŧřūčŧūřę" + }, + "integrations": { "title": "Ĩʼnŧęģřäŧįőʼnş" }, "kubernetes": { diff --git a/public/locales/zh-Hans/grafana.json b/public/locales/zh-Hans/grafana.json index 2424a6e796e..ac1c9879c42 100644 --- a/public/locales/zh-Hans/grafana.json +++ b/public/locales/zh-Hans/grafana.json @@ -767,6 +767,10 @@ "title": "探索" }, "frontend": { + "subtitle": "", + "title": "" + }, + "frontend-app": { "title": "前端" }, "global-orgs": { @@ -794,6 +798,10 @@ "title": "事件" }, "infrastructure": { + "subtitle": "", + "title": "" + }, + "integrations": { "title": "集成" }, "kubernetes": {