Skip to content

Commit c75d066

Browse files
Andrea Falzettiroboquat
Andrea Falzetti
authored andcommitted
feat(jetbrains): show workspace class in backend control center
1 parent ba687e5 commit c75d066

File tree

4 files changed

+94
-20
lines changed

4 files changed

+94
-20
lines changed

components/ide/jetbrains/backend-plugin/src/main/kotlin/io/gitpod/jetbrains/remote/GitpodManager.kt

+3-2
Original file line numberDiff line numberDiff line change
@@ -223,14 +223,16 @@ class GitpodManager : Disposable {
223223
}
224224
}
225225

226+
var infoResponse: WorkspaceInfoResponse? = null
226227
val pendingInfo = CompletableFuture<WorkspaceInfoResponse>()
228+
227229
private val infoJob = GlobalScope.launch {
228230
if (application.isHeadlessEnvironment) {
229231
return@launch
230232
}
231233
try {
232234
// TODO(ak) replace retry with proper handling of grpc errors
233-
val infoResponse = retry(3) {
235+
infoResponse = retry(3) {
234236
InfoServiceGrpc
235237
.newFutureStub(supervisorChannel)
236238
.workspaceInfo(Info.WorkspaceInfoRequest.newBuilder().build())
@@ -391,5 +393,4 @@ class GitpodManager : Disposable {
391393
metricsJob.cancel()
392394
}
393395
}
394-
395396
}

components/ide/jetbrains/backend-plugin/src/main/kotlin/io/gitpod/jetbrains/remote/GitpodMetricControlProvider.kt

+56-7
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,7 @@
55
package io.gitpod.jetbrains.remote
66

77
import com.jetbrains.ide.model.uiautomation.BeControl
8-
import com.jetbrains.rd.ui.bedsl.dsl.VerticalGridBuilder
9-
import com.jetbrains.rd.ui.bedsl.dsl.verticalGrid
8+
import com.jetbrains.rd.ui.bedsl.dsl.*
109
import com.jetbrains.rd.util.lifetime.Lifetime
1110
import com.jetbrains.rd.util.reactive.Property
1211
import com.jetbrains.rdserver.diagnostics.BackendDiagnosticsService
@@ -17,10 +16,60 @@ import com.jetbrains.rdserver.unattendedHost.customization.controlCenter.perform
1716
class GitpodMetricControlProvider : MetricControlProvider {
1817
override val id: String = "gitpodMetricsControl"
1918
override fun getControl(lifetime: Lifetime): BeControl {
19+
val backendDiagnosticsService = BackendDiagnosticsService.Companion.getInstance()
20+
2021
return verticalGrid {
21-
val backendDiagnosticsService = BackendDiagnosticsService.Companion.getInstance()
22-
createCpuControl(this, backendDiagnosticsService, lifetime)
23-
createMemoryControl(this, backendDiagnosticsService, lifetime)
22+
row {
23+
horizontalGrid {
24+
column {
25+
label("Workspace")
26+
}
27+
}
28+
}
29+
createWorkspaceHeaderRow(this, backendDiagnosticsService, lifetime)
30+
row {
31+
verticalGrid {
32+
createCpuControl(this, backendDiagnosticsService, lifetime)
33+
createMemoryControl(this, backendDiagnosticsService, lifetime)
34+
}.withMargin { margin(0, 15, 0, 25) }
35+
}
36+
row {
37+
horizontalGrid {
38+
column {
39+
label("Shared Node Resources")
40+
}
41+
}.withMargin { margin(0, 0, 0, 15) }.withHelpTooltip("Shared Node Resources", "The shared metrics represent the used and available resources of the cluster node on which your workspace is running")
42+
}
43+
}
44+
}
45+
46+
private fun createWorkspaceHeaderRow(ctx: VerticalGridBuilder, backendDiagnosticsService: BackendDiagnosticsService, lifetime: Lifetime) {
47+
val labelProperty = Property("")
48+
49+
val workspaceClassMetric = backendDiagnosticsService.getMetric("gitpod_workspace_class")
50+
val workspaceClass = workspaceClassMetric.toString()
51+
52+
fun updateLabel() {
53+
if (workspaceClass != "") {
54+
labelProperty.set(workspaceClass)
55+
}
56+
}
57+
updateLabel()
58+
59+
workspaceClassMetric.valueProperty.change.advise(lifetime) {
60+
updateLabel()
61+
}
62+
63+
if (workspaceClass == "") {
64+
return
65+
}
66+
67+
return ctx.row {
68+
horizontalGrid {
69+
column {
70+
label(workspaceClass)
71+
}
72+
}.withMargin { margin(0, 15, 0, 0) }
2473
}
2574
}
2675

@@ -29,7 +78,7 @@ class GitpodMetricControlProvider : MetricControlProvider {
2978
val cpuTotal = backendDiagnosticsService.getMetric("gitpod_workspace_cpu_total")
3079
val cpuPercentage = backendDiagnosticsService.getMetric("gitpod_workspace_cpu_percentage")
3180
val cpuPercentageProperty = Property("$cpuPercentage %")
32-
val label = "Workspace CPU"
81+
val label = "CPU"
3382
val progressBar = createProgressBar(lifetime, cpuPercentage.valueProperty, cpuPercentageProperty)
3483
val labelProperty = Property("")
3584

@@ -51,7 +100,7 @@ class GitpodMetricControlProvider : MetricControlProvider {
51100
val memoryTotal = backendDiagnosticsService.getMetric("gitpod_workspace_memory_total")
52101
val memoryPercentage = backendDiagnosticsService.getMetric("gitpod_workspace_memory_percentage")
53102
val memoryPercentageProperty = Property("$memoryPercentage %")
54-
val label = "Workspace Memory"
103+
val label = "Memory"
55104
val progressBar = createProgressBar(lifetime, memoryPercentage.valueProperty, memoryPercentageProperty)
56105
val labelProperty = Property("")
57106

components/ide/jetbrains/backend-plugin/src/main/kotlin/io/gitpod/jetbrains/remote/GitpodMetricProvider.kt

+19-3
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ import com.jetbrains.rd.platform.codeWithMe.unattendedHost.metrics.Metric
99
import com.jetbrains.rd.platform.codeWithMe.unattendedHost.metrics.MetricType
1010
import com.jetbrains.rd.platform.codeWithMe.unattendedHost.metrics.MetricsStatus
1111
import com.jetbrains.rd.platform.codeWithMe.unattendedHost.metrics.providers.MetricProvider
12-
import io.gitpod.jetbrains.remote.GitpodManager
12+
import io.gitpod.supervisor.api.Info.WorkspaceInfoResponse.WorkspaceClass
1313
import io.gitpod.supervisor.api.Status.ResourceStatusSeverity
1414
import kotlin.math.roundToInt
1515

@@ -19,6 +19,7 @@ class GitpodMetricProvider: MetricProvider {
1919
override val id: String = "gitpodMetricsProvider"
2020
override fun getMetrics(): Map<String, Metric> {
2121
val resourceStatus = manager.resourceStatus
22+
val info = manager.infoResponse
2223

2324
val cpuUsed = resourceStatus?.cpu?.used?.toDouble() ?: 0.0
2425
val cpuTotal = resourceStatus?.cpu?.limit?.toDouble() ?: 0.0
@@ -28,17 +29,20 @@ class GitpodMetricProvider: MetricProvider {
2829

2930
val memoryUsed = convertBytesToGB(resourceStatus?.memory?.used ?: 0)
3031
val memoryTotal = convertBytesToGB(resourceStatus?.memory?.limit ?: 0)
31-
val memorySeverity = resourceStatus?.memory?.severity ?:ResourceStatusSeverity.normal
32+
val memorySeverity = resourceStatus?.memory?.severity ?: ResourceStatusSeverity.normal
3233
val memoryPercentage = (memoryUsed / memoryTotal) * 100
3334
val memoryStatus = getSeverityStatus(memorySeverity)
3435

36+
val workspaceClass = formatWorkspaceClass(info?.workspaceClass)
37+
3538
return mapOf(
3639
"gitpod_workspace_cpu_used" to Metric(MetricType.PERFORMANCE, MetricsStatus.NORMAL, roundTo(cpuUsed, 0)),
3740
"gitpod_workspace_cpu_total" to Metric(MetricType.PERFORMANCE, MetricsStatus.NORMAL, roundTo(cpuTotal, 0)),
3841
"gitpod_workspace_cpu_percentage" to Metric(MetricType.PERFORMANCE, cpuStatus, (cpuPercentage * 1000.0).roundToInt() / 1000.0),
3942
"gitpod_workspace_memory_used" to Metric(MetricType.PERFORMANCE, MetricsStatus.NORMAL, roundTo(memoryUsed, 2)),
4043
"gitpod_workspace_memory_total" to Metric(MetricType.PERFORMANCE, MetricsStatus.NORMAL, roundTo(memoryTotal, 2)),
41-
"gitpod_workspace_memory_percentage" to Metric(MetricType.PERFORMANCE, memoryStatus, (memoryPercentage * 1000.0).roundToInt() / 1000.0)
44+
"gitpod_workspace_memory_percentage" to Metric(MetricType.PERFORMANCE, memoryStatus, (memoryPercentage * 1000.0).roundToInt() / 1000.0),
45+
"gitpod_workspace_class" to Metric(MetricType.OTHER, MetricsStatus.NORMAL, workspaceClass)
4246
)
4347
}
4448

@@ -59,4 +63,16 @@ class GitpodMetricProvider: MetricProvider {
5963
MetricsStatus.NORMAL
6064
}
6165
}
66+
67+
private fun formatWorkspaceClass(workspaceClass: WorkspaceClass?): String {
68+
if (workspaceClass == null || workspaceClass.displayName == "") {
69+
return ""
70+
}
71+
72+
if (workspaceClass.description == "") {
73+
return workspaceClass.displayName
74+
}
75+
76+
return "${workspaceClass.displayName}: ${workspaceClass.description}"
77+
}
6278
}

components/ide/jetbrains/backend-plugin/src/main/resources/META-INF/plugin.xml

+16-8
Original file line numberDiff line numberDiff line change
@@ -22,18 +22,26 @@
2222
</dependencies>
2323

2424
<extensions defaultExtensionNs="com.intellij">
25-
<applicationService serviceImplementation="io.gitpod.jetbrains.remote.services.HeartbeatService" preload="true"/>
25+
<applicationService serviceImplementation="io.gitpod.jetbrains.remote.services.HeartbeatService"
26+
preload="true"/>
2627
<applicationService serviceImplementation="io.gitpod.jetbrains.remote.GitpodManager" preload="true"/>
2728
<applicationService serviceImplementation="io.gitpod.jetbrains.remote.GitpodPortsService" preload="true"/>
28-
<notificationGroup id="Gitpod Notifications" displayType="BALLOON" isLogByDefault="false" />
29+
<notificationGroup id="Gitpod Notifications" displayType="BALLOON" isLogByDefault="false"/>
2930
<httpRequestHandler implementation="io.gitpod.jetbrains.remote.GitpodCLIService"/>
30-
<projectService serviceImplementation="io.gitpod.jetbrains.remote.GitpodClientProjectSessionTracker" client="guest" preload="true"/>
31+
<projectService serviceImplementation="io.gitpod.jetbrains.remote.GitpodClientProjectSessionTracker"
32+
client="guest" preload="true"/>
3133
<projectService serviceImplementation="io.gitpod.jetbrains.remote.GitpodProjectManager" preload="true"/>
32-
<projectService serviceImplementation="io.gitpod.jetbrains.remote.GitpodTerminalService" client="guest" preload="true"/>
33-
<gateway.customization.name implementation="io.gitpod.jetbrains.remote.GitpodGatewayClientCustomizationProvider"/>
34-
<gateway.customization.performance id="gitpodMetricsControl" order="before cpuControl" implementation="io.gitpod.jetbrains.remote.GitpodMetricControlProvider"/>
35-
<gateway.customization.metrics id="gitpodMetricsProvider" implementation="io.gitpod.jetbrains.remote.GitpodMetricProvider" />
36-
<registryKey key="gitpod.autoJdk.disabled" defaultValue="false" description="Disable auto-detection of JDK for the project and its modules" restartRequired="true"/>
34+
<projectService serviceImplementation="io.gitpod.jetbrains.remote.GitpodTerminalService" client="guest"
35+
preload="true"/>
36+
<gateway.customization.name
37+
implementation="io.gitpod.jetbrains.remote.GitpodGatewayClientCustomizationProvider"/>
38+
<gateway.customization.performance id="gitpodMetricsControl" order="before cpuControl"
39+
implementation="io.gitpod.jetbrains.remote.GitpodMetricControlProvider"/>
40+
<gateway.customization.metrics id="gitpodMetricsProvider"
41+
implementation="io.gitpod.jetbrains.remote.GitpodMetricProvider"/>
42+
<registryKey key="gitpod.autoJdk.disabled" defaultValue="false"
43+
description="Disable auto-detection of JDK for the project and its modules"
44+
restartRequired="true"/>
3745
</extensions>
3846

3947
</idea-plugin>

0 commit comments

Comments
 (0)