diff --git a/package-lock.json b/package-lock.json
index 83c34648cc9..97630108522 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -47881,6 +47881,7 @@
"electron": "^37.8.0",
"hadron-ipc": "^3.5.21",
"lodash": "^4.17.21",
+ "mongodb-ns": "^3.0.3",
"react": "^17.0.2",
"redux": "^4.2.1",
"redux-thunk": "^2.4.2"
@@ -47911,6 +47912,12 @@
"node": ">=0.3.1"
}
},
+ "packages/atlas-service/node_modules/mongodb-ns": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-3.0.3.tgz",
+ "integrity": "sha512-ctpHlSXGYlIim3JSgcsQjNkgB4CWvwWSFIxKFphSY/MoY/2i6E5rtVkOt1FBbSjEJYa2XvD4c+G2BbLfjhQqaQ==",
+ "license": "Apache-2.0"
+ },
"packages/atlas-service/node_modules/sinon": {
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz",
@@ -48630,6 +48637,7 @@
"license": "SSPL",
"dependencies": {
"@faker-js/faker": "^9.0.0",
+ "@mongodb-js/atlas-service": "^0.70.0",
"@mongodb-js/compass-app-registry": "^9.4.27",
"@mongodb-js/compass-app-stores": "^7.72.0",
"@mongodb-js/compass-components": "^1.57.1",
@@ -52479,6 +52487,7 @@
"version": "5.86.0",
"license": "SSPL",
"dependencies": {
+ "@mongodb-js/atlas-service": "^0.70.0",
"@mongodb-js/compass-app-registry": "^9.4.27",
"@mongodb-js/compass-app-stores": "^7.72.0",
"@mongodb-js/compass-components": "^1.57.1",
@@ -53388,11 +53397,11 @@
"@mongodb-js/compass-app-registry": "^9.4.27",
"@mongodb-js/compass-components": "^1.57.1",
"@mongodb-js/compass-connections": "^1.86.0",
- "@mongodb-js/compass-logging": "^1.7.23",
"@mongodb-js/compass-telemetry": "^1.19.1",
"@mongodb-js/compass-workspaces": "^0.67.0",
"compass-preferences-model": "^2.64.0",
"react": "^17.0.2",
+ "react-redux": "^8.1.3",
"redux": "^4.2.1",
"redux-thunk": "^2.4.2"
},
@@ -54411,6 +54420,7 @@
"version": "1.83.0",
"license": "SSPL",
"dependencies": {
+ "@mongodb-js/atlas-service": "^0.70.0",
"@mongodb-js/compass-components": "^1.57.1",
"@mongodb-js/compass-connections": "^1.86.0",
"@mongodb-js/compass-telemetry": "^1.19.1",
@@ -62852,6 +62862,7 @@
"hadron-ipc": "^3.5.21",
"lodash": "^4.17.21",
"mocha": "^10.2.0",
+ "mongodb-ns": "^3.0.3",
"nyc": "^15.1.0",
"react": "^17.0.2",
"redux": "^4.2.1",
@@ -62866,6 +62877,11 @@
"integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==",
"dev": true
},
+ "mongodb-ns": {
+ "version": "3.0.3",
+ "resolved": "https://registry.npmjs.org/mongodb-ns/-/mongodb-ns-3.0.3.tgz",
+ "integrity": "sha512-ctpHlSXGYlIim3JSgcsQjNkgB4CWvwWSFIxKFphSY/MoY/2i6E5rtVkOt1FBbSjEJYa2XvD4c+G2BbLfjhQqaQ=="
+ },
"sinon": {
"version": "9.2.4",
"resolved": "https://registry.npmjs.org/sinon/-/sinon-9.2.4.tgz",
@@ -63304,6 +63320,7 @@
"version": "file:packages/compass-collection",
"requires": {
"@faker-js/faker": "^9.0.0",
+ "@mongodb-js/atlas-service": "^0.70.0",
"@mongodb-js/compass-app-registry": "^9.4.27",
"@mongodb-js/compass-app-stores": "^7.72.0",
"@mongodb-js/compass-components": "^1.57.1",
@@ -66275,6 +66292,7 @@
"@mongodb-js/compass-sidebar": {
"version": "file:packages/compass-sidebar",
"requires": {
+ "@mongodb-js/atlas-service": "^0.70.0",
"@mongodb-js/compass-app-registry": "^9.4.27",
"@mongodb-js/compass-app-stores": "^7.72.0",
"@mongodb-js/compass-components": "^1.57.1",
@@ -67023,7 +67041,6 @@
"@mongodb-js/compass-app-registry": "^9.4.27",
"@mongodb-js/compass-components": "^1.57.1",
"@mongodb-js/compass-connections": "^1.86.0",
- "@mongodb-js/compass-logging": "^1.7.23",
"@mongodb-js/compass-telemetry": "^1.19.1",
"@mongodb-js/compass-workspaces": "^0.67.0",
"@mongodb-js/eslint-config-compass": "^1.4.12",
@@ -67043,6 +67060,7 @@
"mocha": "^10.2.0",
"nyc": "^15.1.0",
"react": "^17.0.2",
+ "react-redux": "^8.1.3",
"redux": "^4.2.1",
"redux-thunk": "^2.4.2",
"sinon": "^9.2.3",
@@ -67481,6 +67499,7 @@
"@mongodb-js/databases-collections-list": {
"version": "file:packages/databases-collections-list",
"requires": {
+ "@mongodb-js/atlas-service": "^0.70.0",
"@mongodb-js/compass-components": "^1.57.1",
"@mongodb-js/compass-connections": "^1.86.0",
"@mongodb-js/compass-telemetry": "^1.19.1",
diff --git a/packages/atlas-service/package.json b/packages/atlas-service/package.json
index 408f4c28b56..7963a19ca02 100644
--- a/packages/atlas-service/package.json
+++ b/packages/atlas-service/package.json
@@ -83,6 +83,7 @@
"electron": "^37.8.0",
"hadron-ipc": "^3.5.21",
"lodash": "^4.17.21",
+ "mongodb-ns": "^3.0.3",
"react": "^17.0.2",
"redux": "^4.2.1",
"redux-thunk": "^2.4.2"
diff --git a/packages/atlas-service/src/provider.tsx b/packages/atlas-service/src/provider.tsx
index c4786939a91..bf35540122b 100644
--- a/packages/atlas-service/src/provider.tsx
+++ b/packages/atlas-service/src/provider.tsx
@@ -1,3 +1,5 @@
+export * from './url-builders';
+
import React, { createContext, useContext, useMemo } from 'react';
import type { AtlasAuthService } from './atlas-auth-service';
import { AtlasService, type AtlasServiceOptions } from './atlas-service';
diff --git a/packages/atlas-service/src/url-builders.ts b/packages/atlas-service/src/url-builders.ts
new file mode 100644
index 00000000000..857ce2e1085
--- /dev/null
+++ b/packages/atlas-service/src/url-builders.ts
@@ -0,0 +1,51 @@
+import toNS from 'mongodb-ns';
+import type { AtlasClusterMetadata } from '@mongodb-js/connection-info';
+
+export function buildPerformanceMetricsUrl({
+ projectId,
+ metricsType,
+ metricsId,
+}: AtlasClusterMetadata): string {
+ const url = new URL(`/v2/${projectId}`, window.location.origin);
+ return `${url}#/host/${metricsType}/${metricsId}/realtime/panel`;
+}
+
+export function buildMonitoringUrl({
+ projectId,
+ metricsType,
+ metricsId,
+}: AtlasClusterMetadata): string {
+ const url = new URL(`/v2/${projectId}`, window.location.origin);
+ return `${url}#/host/${metricsType}/${metricsId}`;
+}
+
+export function buildClusterOverviewUrl({
+ projectId,
+ clusterName,
+}: AtlasClusterMetadata): string {
+ const url = new URL(`/v2/${projectId}`, window.location.origin);
+ return `${url}#/clusters/detail/${clusterName}`;
+}
+
+export function buildQueryInsightsUrl({
+ projectId,
+ metricsType,
+ metricsId,
+}: AtlasClusterMetadata): string {
+ const url = new URL(`/v2/${projectId}`, window.location.origin);
+ return `${url}#/metrics/${metricsType}/${metricsId}/queryInsights/shape`;
+}
+
+export function buildChartsUrl(
+ { projectId, clusterName }: AtlasClusterMetadata,
+ namespace?: string
+): string {
+ const { database } = toNS(namespace ?? '');
+ const url = new URL(`/charts/${projectId}`, window.location.origin);
+ url.searchParams.set('sourceType', 'cluster');
+ url.searchParams.set('name', clusterName);
+ if (database) {
+ url.searchParams.set('database', database);
+ }
+ return `${url}`;
+}
diff --git a/packages/compass-collection/package.json b/packages/compass-collection/package.json
index 176fde6ccce..bd109dade2c 100644
--- a/packages/compass-collection/package.json
+++ b/packages/compass-collection/package.json
@@ -49,6 +49,7 @@
},
"dependencies": {
"@faker-js/faker": "^9.0.0",
+ "@mongodb-js/atlas-service": "^0.70.0",
"@mongodb-js/compass-app-registry": "^9.4.27",
"@mongodb-js/compass-app-stores": "^7.72.0",
"@mongodb-js/compass-components": "^1.57.1",
diff --git a/packages/compass-collection/src/components/collection-header-actions/collection-header-actions.tsx b/packages/compass-collection/src/components/collection-header-actions/collection-header-actions.tsx
index 35238ca9b7f..a1ef5f33167 100644
--- a/packages/compass-collection/src/components/collection-header-actions/collection-header-actions.tsx
+++ b/packages/compass-collection/src/components/collection-header-actions/collection-header-actions.tsx
@@ -30,6 +30,10 @@ import {
type SchemaAnalysisError,
} from '../../schema-analysis-types';
import { MAX_COLLECTION_NESTING_DEPTH } from '../mock-data-generator-modal/utils';
+import {
+ buildChartsUrl,
+ buildMonitoringUrl,
+} from '@mongodb-js/atlas-service/provider';
const collectionHeaderActionsStyles = css({
display: 'flex',
@@ -46,20 +50,6 @@ const tooltipMessageStyles = css({
},
});
-function buildChartsUrl(
- groupId: string,
- clusterName: string,
- namespace: string
-) {
- const { database, collection } = toNS(namespace);
- const url = new URL(`/charts/${groupId}`, window.location.origin);
- url.searchParams.set('sourceType', 'cluster');
- url.searchParams.set('name', clusterName);
- url.searchParams.set('database', database);
- url.searchParams.set('collection', collection);
- return url.toString();
-}
-
type CollectionHeaderActionsProps = {
namespace: string;
isReadonly: boolean;
@@ -234,15 +224,23 @@ const CollectionHeaderActions: React.FunctionComponent<
>
)}
+ {atlasMetadata && (
+ }
+ >
+ View monitoring
+
+ )}
{atlasMetadata && (
}
diff --git a/packages/compass-connections-navigation/src/constants.tsx b/packages/compass-connections-navigation/src/constants.tsx
index ce8c7911228..5258f33a5b3 100644
--- a/packages/compass-connections-navigation/src/constants.tsx
+++ b/packages/compass-connections-navigation/src/constants.tsx
@@ -8,6 +8,10 @@ export const ROW_HEIGHT = 28;
export type Actions =
// Atlas Cloud actions
| 'show-connect-via-modal'
+ | 'connection-atlas-performance-metrics'
+ | 'connection-cluster-overview'
+ | 'connection-view-monitoring'
+ | 'connection-query-insights'
// connection item related actions
| 'open-shell'
| 'select-connection'
diff --git a/packages/compass-connections-navigation/src/item-actions.ts b/packages/compass-connections-navigation/src/item-actions.ts
index 7642565f27c..cad6f4173f3 100644
--- a/packages/compass-connections-navigation/src/item-actions.ts
+++ b/packages/compass-connections-navigation/src/item-actions.ts
@@ -121,6 +121,35 @@ export const connectedConnectionItemActions = ({
disabledDescription: 'Not supported',
}
: null,
+ // The following are just links to other parts of Atlas
+ !isPerformanceTabAvailable && connectionInfo.atlasMetadata
+ ? {
+ action: 'connection-atlas-performance-metrics',
+ icon: 'Gauge',
+ label: 'View performance metrics',
+ }
+ : null,
+ connectionInfo.atlasMetadata
+ ? {
+ action: 'connection-cluster-overview',
+ icon: 'Dashboard',
+ label: 'View cluster overview',
+ }
+ : null,
+ connectionInfo.atlasMetadata
+ ? {
+ action: 'connection-view-monitoring',
+ icon: 'TimeSeries',
+ label: 'View monitoring',
+ }
+ : null,
+ connectionInfo.atlasMetadata
+ ? {
+ action: 'connection-query-insights',
+ icon: 'Bulb',
+ label: 'View query insights',
+ }
+ : null,
isAtlas
? null
: {
diff --git a/packages/compass-sidebar/package.json b/packages/compass-sidebar/package.json
index ce059569be3..9e8202131fe 100644
--- a/packages/compass-sidebar/package.json
+++ b/packages/compass-sidebar/package.json
@@ -48,6 +48,7 @@
"reformat": "npm run eslint . -- --fix && npm run prettier -- --write ."
},
"dependencies": {
+ "@mongodb-js/atlas-service": "^0.70.0",
"@mongodb-js/compass-app-registry": "^9.4.27",
"@mongodb-js/compass-app-stores": "^7.72.0",
"@mongodb-js/compass-components": "^1.57.1",
diff --git a/packages/compass-sidebar/src/components/multiple-connections/connections-navigation.tsx b/packages/compass-sidebar/src/components/multiple-connections/connections-navigation.tsx
index c6c457bc539..c193a92ce01 100644
--- a/packages/compass-sidebar/src/components/multiple-connections/connections-navigation.tsx
+++ b/packages/compass-sidebar/src/components/multiple-connections/connections-navigation.tsx
@@ -62,6 +62,12 @@ import {
import { useTelemetry } from '@mongodb-js/compass-telemetry/provider';
import { usePreference } from 'compass-preferences-model/provider';
import { wrapField } from '@mongodb-js/mongodb-constants';
+import {
+ buildPerformanceMetricsUrl,
+ buildClusterOverviewUrl,
+ buildMonitoringUrl,
+ buildQueryInsightsUrl,
+} from '@mongodb-js/atlas-service/provider';
const connectionsContainerStyles = css({
height: '100%',
@@ -421,6 +427,30 @@ const ConnectionsNavigation: React.FC = ({
case 'show-connect-via-modal':
onOpenConnectViaModal?.(getConnectionInfo(item).atlasMetadata);
return;
+ case 'connection-atlas-performance-metrics': {
+ const { atlasMetadata } = getConnectionInfo(item);
+ if (atlasMetadata)
+ window.open(buildPerformanceMetricsUrl(atlasMetadata), '_blank');
+ return;
+ }
+ case 'connection-cluster-overview': {
+ const { atlasMetadata } = getConnectionInfo(item);
+ if (atlasMetadata)
+ window.open(buildClusterOverviewUrl(atlasMetadata), '_blank');
+ return;
+ }
+ case 'connection-view-monitoring': {
+ const { atlasMetadata } = getConnectionInfo(item);
+ if (atlasMetadata)
+ window.open(buildMonitoringUrl(atlasMetadata), '_blank');
+ return;
+ }
+ case 'connection-query-insights': {
+ const { atlasMetadata } = getConnectionInfo(item);
+ if (atlasMetadata)
+ window.open(buildQueryInsightsUrl(atlasMetadata), '_blank');
+ return;
+ }
case 'select-database':
openCollectionsWorkspace(connectionId, getNamespace(item));
return;
diff --git a/packages/databases-collections-list/package.json b/packages/databases-collections-list/package.json
index 523aae97b39..020b03ac5cb 100644
--- a/packages/databases-collections-list/package.json
+++ b/packages/databases-collections-list/package.json
@@ -47,6 +47,7 @@
"reformat": "npm run eslint . -- --fix && npm run prettier -- --write ."
},
"dependencies": {
+ "@mongodb-js/atlas-service": "^0.70.0",
"@mongodb-js/compass-components": "^1.57.1",
"@mongodb-js/compass-connections": "^1.86.0",
"@mongodb-js/compass-telemetry": "^1.19.1",
diff --git a/packages/databases-collections-list/src/items-table.tsx b/packages/databases-collections-list/src/items-table.tsx
index afe1d22f3e6..91e7584b53d 100644
--- a/packages/databases-collections-list/src/items-table.tsx
+++ b/packages/databases-collections-list/src/items-table.tsx
@@ -38,6 +38,10 @@ import toNS from 'mongodb-ns';
import { getConnectionTitle } from '@mongodb-js/connection-info';
import { useOpenWorkspace } from '@mongodb-js/compass-workspaces/provider';
import { usePreferences } from 'compass-preferences-model/provider';
+import {
+ buildChartsUrl,
+ buildMonitoringUrl,
+} from '@mongodb-js/atlas-service/provider';
type Item = {
_id: string;
@@ -99,21 +103,6 @@ const bannerRowStyles = css({
paddingTop: spacing[200],
});
-function buildChartsUrl(
- groupId: string,
- clusterName: string,
- namespace?: string
-) {
- const { database } = toNS(namespace ?? '');
- const url = new URL(`/charts/${groupId}`, window.location.origin);
- url.searchParams.set('sourceType', 'cluster');
- url.searchParams.set('name', clusterName);
- if (database) {
- url.searchParams.set('database', database);
- }
- return url.toString();
-}
-
const TableControls: React.FunctionComponent<{
namespace?: string;
itemType: string;
@@ -197,16 +186,23 @@ const TableControls: React.FunctionComponent<{
Open MongoDB shell
)}
-
+ {connectionInfo.atlasMetadata && (
+ }
+ >
+ View monitoring
+
+ )}
{connectionInfo.atlasMetadata && (
}