Skip to content

Commit 8f6019c

Browse files
authored
feat(compass-connections-navigation): add links to cluster level atlas pages COMPASS-9967 (#7516)
1 parent bceb972 commit 8f6019c

File tree

12 files changed

+175
-42
lines changed

12 files changed

+175
-42
lines changed

package-lock.json

Lines changed: 21 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

packages/atlas-service/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,7 @@
8383
"electron": "^37.8.0",
8484
"hadron-ipc": "^3.5.21",
8585
"lodash": "^4.17.21",
86+
"mongodb-ns": "^3.0.3",
8687
"react": "^17.0.2",
8788
"redux": "^4.2.1",
8889
"redux-thunk": "^2.4.2"

packages/atlas-service/src/provider.tsx

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
export * from './url-builders';
2+
13
import React, { createContext, useContext, useMemo } from 'react';
24
import type { AtlasAuthService } from './atlas-auth-service';
35
import { AtlasService, type AtlasServiceOptions } from './atlas-service';
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
import toNS from 'mongodb-ns';
2+
import type { AtlasClusterMetadata } from '@mongodb-js/connection-info';
3+
4+
export function buildPerformanceMetricsUrl({
5+
projectId,
6+
metricsType,
7+
metricsId,
8+
}: AtlasClusterMetadata): string {
9+
const url = new URL(`/v2/${projectId}`, window.location.origin);
10+
return `${url}#/host/${metricsType}/${metricsId}/realtime/panel`;
11+
}
12+
13+
export function buildMonitoringUrl({
14+
projectId,
15+
metricsType,
16+
metricsId,
17+
}: AtlasClusterMetadata): string {
18+
const url = new URL(`/v2/${projectId}`, window.location.origin);
19+
return `${url}#/host/${metricsType}/${metricsId}`;
20+
}
21+
22+
export function buildClusterOverviewUrl({
23+
projectId,
24+
clusterName,
25+
}: AtlasClusterMetadata): string {
26+
const url = new URL(`/v2/${projectId}`, window.location.origin);
27+
return `${url}#/clusters/detail/${clusterName}`;
28+
}
29+
30+
export function buildQueryInsightsUrl({
31+
projectId,
32+
metricsType,
33+
metricsId,
34+
}: AtlasClusterMetadata): string {
35+
const url = new URL(`/v2/${projectId}`, window.location.origin);
36+
return `${url}#/metrics/${metricsType}/${metricsId}/queryInsights/shape`;
37+
}
38+
39+
export function buildChartsUrl(
40+
{ projectId, clusterName }: AtlasClusterMetadata,
41+
namespace?: string
42+
): string {
43+
const { database } = toNS(namespace ?? '');
44+
const url = new URL(`/charts/${projectId}`, window.location.origin);
45+
url.searchParams.set('sourceType', 'cluster');
46+
url.searchParams.set('name', clusterName);
47+
if (database) {
48+
url.searchParams.set('database', database);
49+
}
50+
return `${url}`;
51+
}

packages/compass-collection/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
},
5050
"dependencies": {
5151
"@faker-js/faker": "^9.0.0",
52+
"@mongodb-js/atlas-service": "^0.70.0",
5253
"@mongodb-js/compass-app-registry": "^9.4.27",
5354
"@mongodb-js/compass-app-stores": "^7.72.0",
5455
"@mongodb-js/compass-components": "^1.57.1",

packages/compass-collection/src/components/collection-header-actions/collection-header-actions.tsx

Lines changed: 17 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,10 @@ import {
3030
type SchemaAnalysisError,
3131
} from '../../schema-analysis-types';
3232
import { MAX_COLLECTION_NESTING_DEPTH } from '../mock-data-generator-modal/utils';
33+
import {
34+
buildChartsUrl,
35+
buildMonitoringUrl,
36+
} from '@mongodb-js/atlas-service/provider';
3337

3438
const collectionHeaderActionsStyles = css({
3539
display: 'flex',
@@ -46,20 +50,6 @@ const tooltipMessageStyles = css({
4650
},
4751
});
4852

49-
function buildChartsUrl(
50-
groupId: string,
51-
clusterName: string,
52-
namespace: string
53-
) {
54-
const { database, collection } = toNS(namespace);
55-
const url = new URL(`/charts/${groupId}`, window.location.origin);
56-
url.searchParams.set('sourceType', 'cluster');
57-
url.searchParams.set('name', clusterName);
58-
url.searchParams.set('database', database);
59-
url.searchParams.set('collection', collection);
60-
return url.toString();
61-
}
62-
6353
type CollectionHeaderActionsProps = {
6454
namespace: string;
6555
isReadonly: boolean;
@@ -234,15 +224,23 @@ const CollectionHeaderActions: React.FunctionComponent<
234224
</>
235225
</Tooltip>
236226
)}
227+
{atlasMetadata && (
228+
<Button
229+
data-testid="collection-header-view-monitoring"
230+
size={ButtonSize.Small}
231+
href={buildMonitoringUrl(atlasMetadata)}
232+
target="_blank"
233+
rel="noopener noreferrer"
234+
leftGlyph={<Icon glyph="TimeSeries" />}
235+
>
236+
View monitoring
237+
</Button>
238+
)}
237239
{atlasMetadata && (
238240
<Button
239241
data-testid="collection-header-visualize-your-data"
240242
size={ButtonSize.Small}
241-
href={buildChartsUrl(
242-
atlasMetadata.projectId,
243-
atlasMetadata.clusterName,
244-
namespace
245-
)}
243+
href={buildChartsUrl(atlasMetadata, namespace)}
246244
target="_self"
247245
rel="noopener noreferrer"
248246
leftGlyph={<Icon glyph="Charts" />}

packages/compass-connections-navigation/src/constants.tsx

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ export const ROW_HEIGHT = 28;
88
export type Actions =
99
// Atlas Cloud actions
1010
| 'show-connect-via-modal'
11+
| 'connection-atlas-performance-metrics'
12+
| 'connection-cluster-overview'
13+
| 'connection-view-monitoring'
14+
| 'connection-query-insights'
1115
// connection item related actions
1216
| 'open-shell'
1317
| 'select-connection'

packages/compass-connections-navigation/src/item-actions.ts

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -121,6 +121,35 @@ export const connectedConnectionItemActions = ({
121121
disabledDescription: 'Not supported',
122122
}
123123
: null,
124+
// The following are just links to other parts of Atlas
125+
!isPerformanceTabAvailable && connectionInfo.atlasMetadata
126+
? {
127+
action: 'connection-atlas-performance-metrics',
128+
icon: 'Gauge',
129+
label: 'View performance metrics',
130+
}
131+
: null,
132+
connectionInfo.atlasMetadata
133+
? {
134+
action: 'connection-cluster-overview',
135+
icon: 'Dashboard',
136+
label: 'View cluster overview',
137+
}
138+
: null,
139+
connectionInfo.atlasMetadata
140+
? {
141+
action: 'connection-view-monitoring',
142+
icon: 'TimeSeries',
143+
label: 'View monitoring',
144+
}
145+
: null,
146+
connectionInfo.atlasMetadata
147+
? {
148+
action: 'connection-query-insights',
149+
icon: 'Bulb',
150+
label: 'View query insights',
151+
}
152+
: null,
124153
isAtlas
125154
? null
126155
: {

packages/compass-sidebar/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
"reformat": "npm run eslint . -- --fix && npm run prettier -- --write ."
4949
},
5050
"dependencies": {
51+
"@mongodb-js/atlas-service": "^0.70.0",
5152
"@mongodb-js/compass-app-registry": "^9.4.27",
5253
"@mongodb-js/compass-app-stores": "^7.72.0",
5354
"@mongodb-js/compass-components": "^1.57.1",

packages/compass-sidebar/src/components/multiple-connections/connections-navigation.tsx

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,12 @@ import {
6262
import { useTelemetry } from '@mongodb-js/compass-telemetry/provider';
6363
import { usePreference } from 'compass-preferences-model/provider';
6464
import { wrapField } from '@mongodb-js/mongodb-constants';
65+
import {
66+
buildPerformanceMetricsUrl,
67+
buildClusterOverviewUrl,
68+
buildMonitoringUrl,
69+
buildQueryInsightsUrl,
70+
} from '@mongodb-js/atlas-service/provider';
6571

6672
const connectionsContainerStyles = css({
6773
height: '100%',
@@ -421,6 +427,30 @@ const ConnectionsNavigation: React.FC<ConnectionsNavigationProps> = ({
421427
case 'show-connect-via-modal':
422428
onOpenConnectViaModal?.(getConnectionInfo(item).atlasMetadata);
423429
return;
430+
case 'connection-atlas-performance-metrics': {
431+
const { atlasMetadata } = getConnectionInfo(item);
432+
if (atlasMetadata)
433+
window.open(buildPerformanceMetricsUrl(atlasMetadata), '_blank');
434+
return;
435+
}
436+
case 'connection-cluster-overview': {
437+
const { atlasMetadata } = getConnectionInfo(item);
438+
if (atlasMetadata)
439+
window.open(buildClusterOverviewUrl(atlasMetadata), '_blank');
440+
return;
441+
}
442+
case 'connection-view-monitoring': {
443+
const { atlasMetadata } = getConnectionInfo(item);
444+
if (atlasMetadata)
445+
window.open(buildMonitoringUrl(atlasMetadata), '_blank');
446+
return;
447+
}
448+
case 'connection-query-insights': {
449+
const { atlasMetadata } = getConnectionInfo(item);
450+
if (atlasMetadata)
451+
window.open(buildQueryInsightsUrl(atlasMetadata), '_blank');
452+
return;
453+
}
424454
case 'select-database':
425455
openCollectionsWorkspace(connectionId, getNamespace(item));
426456
return;

0 commit comments

Comments
 (0)