Skip to content

Commit 9fd020e

Browse files
author
Andrea Falzetti
committed
feat(jetbrains): show workspace resources
1 parent 6f8ed36 commit 9fd020e

File tree

4 files changed

+118
-0
lines changed

4 files changed

+118
-0
lines changed

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

+27
Original file line numberDiff line numberDiff line change
@@ -365,4 +365,31 @@ class GitpodManager : Disposable {
365365
}
366366
}
367367
}
368+
369+
var resourceStatus: Status.ResourcesStatusResponse? = null
370+
371+
private val metricsJob = GlobalScope.launch {
372+
if (application.isHeadlessEnvironment) {
373+
return@launch
374+
}
375+
val status = StatusServiceGrpc.newFutureStub(supervisorChannel)
376+
while (isActive) {
377+
try {
378+
val f = status.resourcesStatus(Status.ResourcesStatuRequest.getDefaultInstance())
379+
resourceStatus = f.asDeferred().await()
380+
} catch (t: Throwable) {
381+
if (t is CancellationException) {
382+
throw t
383+
}
384+
thisLogger().error("gitpod: failed to retrieve resource status: ", t)
385+
}
386+
delay(1000L)
387+
}
388+
}
389+
init {
390+
lifetime.onTerminationOrNow {
391+
metricsJob.cancel()
392+
}
393+
}
394+
368395
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2+
// Licensed under the GNU Affero General Public License (AGPL).
3+
// See License-AGPL.txt in the project root for license information.
4+
5+
package io.gitpod.jetbrains.remote.latest
6+
7+
import com.jetbrains.ide.model.uiautomation.BeControl
8+
import com.jetbrains.ide.model.uiautomation.DefiniteProgress
9+
import com.jetbrains.rd.platform.codeWithMe.unattendedHost.metrics.providers.IdeMetricsProvider
10+
import com.jetbrains.rd.ui.bedsl.dsl.VerticalGridBuilder
11+
import com.jetbrains.rd.ui.bedsl.dsl.verticalGrid
12+
import com.jetbrains.rd.util.lifetime.Lifetime
13+
import com.jetbrains.rd.util.reactive.Property
14+
import com.jetbrains.rdserver.diagnostics.BackendDiagnosticsService
15+
import com.jetbrains.rdserver.unattendedHost.customization.controlCenter.performance.MetricControlProvider
16+
import com.jetbrains.rdserver.unattendedHost.customization.controlCenter.performance.createMetricProgressWithLabels
17+
import com.jetbrains.rdserver.unattendedHost.customization.controlCenter.performance.createProgressBar
18+
import com.jetbrains.rdserver.unattendedHost.customization.controlCenter.performance.createProgressRow
19+
20+
class GitpodMetricControlProvider : MetricControlProvider {
21+
override val id: String = "gitpodControl"
22+
override fun getControl(lifetime: Lifetime): BeControl {
23+
return verticalGrid {
24+
val backendDiagnosticsService = BackendDiagnosticsService.Companion.getInstance()
25+
createCpuControl(this, backendDiagnosticsService, lifetime)
26+
createMemoryControl(this, backendDiagnosticsService, lifetime)
27+
}
28+
}
29+
30+
private fun createCpuControl(ctx: VerticalGridBuilder, backendDiagnosticsService: BackendDiagnosticsService, lifetime: Lifetime) {
31+
val data = createMetricProgressWithLabels(backendDiagnosticsService, lifetime, "gitpod_workspace_cpu_total", "gitpod_workspace_cpu_used", "gitpod_workspace_cpu_percentage")
32+
33+
val label = "Workspace CPU"
34+
// TODO: make status dynamic based on a threshold
35+
val status = Property(com.jetbrains.rd.platform.codeWithMe.unattendedHost.metrics.MetricsStatus.DANGER)
36+
37+
createProgressRow(ctx, lifetime, label, status, data.first, data.second, data.third)
38+
}
39+
40+
private fun createMemoryControl(ctx: VerticalGridBuilder, backendDiagnosticsService: BackendDiagnosticsService, lifetime: Lifetime) {
41+
val data = createMetricProgressWithLabels(backendDiagnosticsService, lifetime, "gitpod_workspace_memory_total", "gitpod_workspace_memory_used", "gitpod_workspace_memory_percentage")
42+
43+
val label = "Workspace Memory"
44+
// TODO: make status dynamic based on a threshold
45+
val status = Property(com.jetbrains.rd.platform.codeWithMe.unattendedHost.metrics.MetricsStatus.DANGER)
46+
47+
createProgressRow(ctx, lifetime, label, status, data.first, data.second, data.third)
48+
}
49+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright (c) 2022 Gitpod GmbH. All rights reserved.
2+
// Licensed under the GNU Affero General Public License (AGPL).
3+
// See License-AGPL.txt in the project root for license information.
4+
5+
package io.gitpod.jetbrains.remote.latest
6+
7+
import com.intellij.openapi.components.service
8+
import com.jetbrains.rd.platform.codeWithMe.unattendedHost.metrics.Metric
9+
import com.jetbrains.rd.platform.codeWithMe.unattendedHost.metrics.MetricType
10+
import com.jetbrains.rd.platform.codeWithMe.unattendedHost.metrics.MetricsStatus
11+
import com.jetbrains.rd.platform.codeWithMe.unattendedHost.metrics.providers.MetricProvider
12+
import io.gitpod.jetbrains.remote.GitpodManager
13+
14+
15+
class GitpodMetricProvider: MetricProvider {
16+
private val manager = service<GitpodManager>()
17+
18+
override val id: String = "gitpodMetrics"
19+
override fun getMetrics(): Map<String, Metric> {
20+
// TODO: make values dynamic listening from supervisor
21+
val resourceStatus = manager.resourceStatus
22+
23+
val cpuUsed = resourceStatus?.cpu?.used?.toFloat() ?: 0f
24+
val cpuTotal = resourceStatus?.cpu?.limit?.toFloat() ?: 0f
25+
val cpuPercentage = (cpuUsed / cpuTotal) * 100
26+
27+
val memoryUsed = resourceStatus?.memory?.used?.toFloat() ?: 0f
28+
val memoryTotal = resourceStatus?.memory?.limit?.toFloat() ?: 0f
29+
val memoryPercentage = (memoryUsed / memoryTotal) * 100
30+
31+
return mapOf(
32+
"gitpod_workspace_cpu_used" to Metric(MetricType.OTHER, MetricsStatus.DANGER, cpuUsed),
33+
"gitpod_workspace_cpu_total" to Metric(MetricType.OTHER, MetricsStatus.DANGER, cpuTotal),
34+
"gitpod_workspace_cpu_percentage" to Metric(MetricType.OTHER, MetricsStatus.DANGER, cpuPercentage.toDouble()),
35+
"gitpod_workspace_memory_used" to Metric(MetricType.PERFORMANCE, MetricsStatus.NORMAL, memoryUsed),
36+
"gitpod_workspace_memory_total" to Metric(MetricType.PERFORMANCE, MetricsStatus.NORMAL, memoryTotal),
37+
"gitpod_workspace_memory_percentage" to Metric(MetricType.PERFORMANCE, MetricsStatus.NORMAL, memoryPercentage.toDouble())
38+
)
39+
}
40+
}

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

+2
Original file line numberDiff line numberDiff line change
@@ -7,5 +7,7 @@
77
<extensions defaultExtensionNs="com.intellij">
88
<projectService serviceImplementation="io.gitpod.jetbrains.remote.latest.GitpodTerminalService" client="guest" preload="true"/>
99
<projectService serviceImplementation="io.gitpod.jetbrains.remote.latest.GitpodPortForwardingService" preload="true"/>
10+
<gateway.customization.performance id="gitpodControl" order="before cpuControl" implementation="io.gitpod.jetbrains.remote.latest.GitpodMetricControlProvider"/>
11+
<gateway.customization.metrics id="gitpodMetrics" implementation="io.gitpod.jetbrains.remote.latest.GitpodMetricProvider" />
1012
</extensions>
1113
</idea-plugin>

0 commit comments

Comments
 (0)