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": {