Skip to content

Commit 357c1bb

Browse files
committed
Fix #34906: replace Alloy by Loki docker driver
1 parent aa28ca4 commit 357c1bb

8 files changed

Lines changed: 49 additions & 195 deletions

File tree

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/DockerOrchestrator.kt

Lines changed: 26 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ import org.mandas.docker.client.DockerClient
4949
import org.mandas.docker.client.builder.jersey.JerseyDockerClientBuilder
5050
import org.mandas.docker.client.messages.ContainerConfig
5151
import org.mandas.docker.client.messages.HostConfig
52+
import org.mandas.docker.client.messages.LogConfig
5253
import java.io.FileWriter
5354
import java.nio.file.Files
5455
import java.nio.file.Path
@@ -211,7 +212,7 @@ class DockerOrchestrator(channel: Channel<ShinyProxyEvent>,
211212

212213
copyTemplates(shinyProxy, dir)
213214

214-
val hostConfig = HostConfig.builder()
215+
val hostConfigBuilder = HostConfig.builder()
215216
.networkMode(networkName)
216217
.binds(
217218
HostConfig.Bind.builder()
@@ -245,11 +246,21 @@ class DockerOrchestrator(channel: Channel<ShinyProxyEvent>,
245246
.memory(memoryToBytes(shinyProxy.memoryLimit))
246247
.cpuPeriod(cpuPeriod)
247248
.cpuQuota(cpuQuota)
248-
.build()
249+
250+
if (monitoringConfig.isEnabled()) {
251+
hostConfigBuilder.logConfig(LogConfig.builder()
252+
.logType("loki")
253+
.logOptions(mapOf(
254+
"loki-url" to monitoringConfig.grafanaLokiConfig.getLokiPushUrl(),
255+
"mode" to "non-blocking",
256+
"loki-external-labels" to "sp_realm_id=${shinyProxy.realmId},sp_instance=${shinyProxyInstance.hashOfSpec},namespace=${shinyProxy.namespace},app=shinyproxy"
257+
))
258+
.build())
259+
}
249260

250261
val containerConfig = ContainerConfig.builder()
251262
.image(shinyProxy.image)
252-
.hostConfig(hostConfig)
263+
.hostConfig(hostConfigBuilder.build())
253264
.labels(shinyProxy.labels + LabelFactory.labelsForShinyProxyInstance(shinyProxyInstance, version))
254265
.env("PROXY_VERSION=${version}", "PROXY_REALM_ID=${shinyProxy.realmId}", "SPRING_CONFIG_IMPORT=/opt/shinyproxy/generated.yml")
255266
.build()
@@ -438,18 +449,19 @@ class DockerOrchestrator(channel: Channel<ShinyProxyEvent>,
438449
)
439450
)
440451
),
441-
"proxy" to hashMapOf(
442-
"docker" to mapOf(
443-
"default-container-network" to networkName
444-
),
445-
"template-path" to "/opt/shinyproxy/templates"
446-
)
452+
"proxy" to buildMap {
453+
put("docker", buildMap {
454+
put("default-container-network", networkName)
455+
if (monitoringConfig.isEnabled()) {
456+
put("loki-url", monitoringConfig.grafanaLokiConfig.getLokiPushUrl())
457+
}
458+
})
459+
put("template-path", "/opt/shinyproxy/templates")
460+
if (monitoringConfig.isEnabled()) {
461+
put("monitoring", mapOf("grafana-url" to monitoringConfig.grafanaConfig.getGrafanaUrl(shinyProxy)))
462+
}
463+
}
447464
)
448-
if (monitoringConfig.isEnabled()) {
449-
config["proxy"]?.put("monitoring", hashMapOf(
450-
"grafana-url" to monitoringConfig.grafanaConfig.getGrafanaUrl(shinyProxy)
451-
))
452-
}
453465
return objectMapper.writeValueAsString(config)
454466
}
455467

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/monitoring/GrafanaAlloyConfig.kt

Lines changed: 0 additions & 85 deletions
This file was deleted.

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/monitoring/GrafanaLokiConfig.kt

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ import io.github.oshai.kotlinlogging.KotlinLogging
2828
import org.mandas.docker.client.DockerClient
2929
import org.mandas.docker.client.messages.ContainerConfig
3030
import org.mandas.docker.client.messages.HostConfig
31+
import org.mandas.docker.client.messages.PortBinding
3132
import java.nio.file.Path
3233

3334
class GrafanaLokiConfig(private val dockerClient: DockerClient, private val dockerActions: DockerActions, mainDataDir: Path, config: Config) {
@@ -67,11 +68,13 @@ class GrafanaLokiConfig(private val dockerClient: DockerClient, private val dock
6768
.build(),
6869
)
6970
.restartPolicy(HostConfig.RestartPolicy.always())
71+
.portBindings(mapOf("3100" to listOf(PortBinding.of("127.0.0.1", "3100"))))
7072
.build()
7173

7274
val containerConfig = ContainerConfig.builder()
7375
.image(lokiImage)
7476
.hostConfig(hostConfig)
77+
.exposedPorts("3100")
7578
.user("1000")
7679
.labels(mapOf("app" to "grafana-loki"))
7780
.build()
@@ -81,4 +84,8 @@ class GrafanaLokiConfig(private val dockerClient: DockerClient, private val dock
8184
dockerClient.startContainer(containerId)
8285
}
8386

87+
fun getLokiPushUrl(): String {
88+
return "http://localhost:3100/loki/api/v1/push"
89+
}
90+
8491
}

src/main/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/monitoring/MonitoringConfig.kt

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -31,15 +31,13 @@ class MonitoringConfig(dockerClient: DockerClient, dockerActions: DockerActions,
3131

3232
private val enableMonitoring = config.readConfigValue(false, "SPO_ENABLE_MONITORING") { it.toBoolean() }
3333

34-
private val grafanaAlloyConfig = GrafanaAlloyConfig(dockerClient, dockerActions, mainDataDir, config)
35-
private val grafanaLokiConfig = GrafanaLokiConfig(dockerClient, dockerActions, mainDataDir, config)
34+
internal val grafanaLokiConfig = GrafanaLokiConfig(dockerClient, dockerActions, mainDataDir, config)
3635
private val prometheusConfig = PrometheusConfig(dockerClient, dockerActions, mainDataDir, config)
3736
private val cAdvisorConfig = CAdvisorConfig(dockerClient, dockerActions, config)
3837
internal val grafanaConfig = GrafanaConfig(dockerClient, dockerActions, mainDataDir, caddyConfig, config)
3938

4039
suspend fun reconcile(shinyProxy: ShinyProxy) {
4140
if (enableMonitoring) {
42-
grafanaAlloyConfig.reconcile()
4341
grafanaLokiConfig.reconcile()
4442
prometheusConfig.reconcile()
4543
cAdvisorConfig.reconcile()

src/main/resources/configs/docker/monitoring/config.alloy

Lines changed: 0 additions & 83 deletions
This file was deleted.

src/main/resources/configs/docker/monitoring/grafana/dashboards/shinyproxy-app-logs.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -507,7 +507,7 @@
507507
"type": "loki",
508508
"uid": "${datasource}"
509509
},
510-
"expr": "{sp_realm_id=~\".+\", namespace=~\"$namespace\", sp_realm_id=~\"$realm\", sp_user_id=~\"$user\", sp_spec_id=~\"$app\", sp_proxy_instance=~\"$instance\", sp_proxy_id=\"$id\", sp_proxy_id!=\"\"} | line_format `[App]: {{ __line__ }}` ",
510+
"expr": "{sp_realm_id=~\".+\", namespace=~\"$namespace\", sp_realm_id=~\"$realm\", sp_proxy_id=\"$id\", sp_proxy_id!=\"\"} | line_format `[App]: {{ __line__ }}` ",
511511
"legendFormat": "",
512512
"refId": "A"
513513
},

src/main/resources/configs/docker/monitoring/grafana/dashboards/shinyproxy-delegate-app-logs.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,7 @@
323323
"type": "loki",
324324
"uid": "${datasource}"
325325
},
326-
"expr": "{sp_realm_id=~\".+\", namespace=~\"$namespace\", sp_realm_id=~\"$realm\", sp_spec_id=~\"$app\", sp_proxy_id=\"$id\", sp_proxy_id!=\"\"} | line_format `[App]: {{ __line__ }}` ",
326+
"expr": "{sp_realm_id=~\".+\", namespace=~\"$namespace\", sp_realm_id=~\"$realm\", sp_proxy_id=\"$id\", sp_proxy_id!=\"\"} | line_format `[App]: {{ __line__ }}` ",
327327
"legendFormat": "",
328328
"refId": "A"
329329
},

src/test/kotlin/eu/openanalytics/shinyproxyoperator/impl/docker/MainIntegrationTest.kt

Lines changed: 13 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -548,21 +548,26 @@ class MainIntegrationTest : IntegrationTestBase() {
548548
dockerAssertions.assertShinyProxyContainer(shinyProxyContainer1, shinyProxyInstance1)
549549
dockerAssertions.assertShinyProxyContainer(shinyProxyContainer2, shinyProxyInstance2)
550550

551+
// LOKI DRIVER
552+
val containerInfo1 = dockerClient.inspectContainer(shinyProxyContainer1.id())
553+
assertEquals("loki", containerInfo1.hostConfig().logConfig().logType())
554+
assertEquals("http://localhost:3100/loki/api/v1/push", containerInfo1.hostConfig().logConfig().logOptions()["loki-url"])
555+
assertEquals("non-blocking", containerInfo1.hostConfig().logConfig().logOptions()["mode"])
556+
assertEquals("sp_realm_id=default-realm1,sp_instance=${hash1},namespace=default,app=shinyproxy", containerInfo1.hostConfig().logConfig().logOptions()["loki-external-labels"])
557+
558+
val containerInfo2 = dockerClient.inspectContainer(shinyProxyContainer2.id())
559+
assertEquals("loki", containerInfo2.hostConfig().logConfig().logType())
560+
assertEquals("http://localhost:3100/loki/api/v1/push", containerInfo2.hostConfig().logConfig().logOptions()["loki-url"])
561+
assertEquals("non-blocking", containerInfo2.hostConfig().logConfig().logOptions()["mode"])
562+
assertEquals("sp_realm_id=default-realm2,sp_instance=${hash2},namespace=default,app=shinyproxy", containerInfo2.hostConfig().logConfig().logOptions()["loki-external-labels"])
563+
551564
// CADVISOR
552565
val cadvisorContainer = inspectContainer(getContainerByName("sp-cadvisor"))
553566
assertNotNull(cadvisorContainer)
554567
assertEquals(true, cadvisorContainer.state().running())
555568
assertEquals("sp-shared-network", cadvisorContainer.hostConfig().networkMode())
556569
assertEquals("always", cadvisorContainer.hostConfig().restartPolicy().name())
557570

558-
// GRAFANA-ALLOY
559-
val alloyContainer = inspectContainer(getContainerByName("sp-grafana-alloy"))
560-
assertNotNull(alloyContainer)
561-
assertEquals(true, alloyContainer.state().running())
562-
assertEquals("sp-shared-network", alloyContainer.hostConfig().networkMode())
563-
assertEquals("always", alloyContainer.hostConfig().restartPolicy().name())
564-
assertNotNull(dataDir.resolve("sp-grafana-alloy/config.alloy").readText())
565-
566571
// GRAFANA
567572
val grafanaContainer = inspectContainer(getContainerByName("sp-grafana-grafana-default-realm1"))
568573
assertNotNull(grafanaContainer)

0 commit comments

Comments
 (0)