feat: add Prometheus docker_sd_configs labels to agent containers
All checks were successful
CI / cleanup-branch (push) Has been skipped
CI / build (push) Successful in 1m26s
CI / docker (push) Successful in 1m12s
CI / deploy-feature (push) Has been skipped
CI / deploy (push) Successful in 43s

Labels prometheus.scrape, prometheus.path, and prometheus.port are now
set on every deployed container based on the resolved runtime type,
enabling automatic Prometheus service discovery via docker_sd_configs.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
hsiegeln
2026-04-12 18:00:32 +02:00
parent c1fbe1a63a
commit caaa1ab0cc
4 changed files with 89 additions and 1 deletions

View File

@@ -162,6 +162,7 @@ public class DeploymentExecutor {
Map<String, String> baseEnvVars = buildEnvVars(app, env, config);
Map<String, String> labels = TraefikLabelBuilder.build(app.slug(), env.slug(), tenantId, config);
labels.putAll(PrometheusLabelBuilder.build(resolvedRuntimeType));
List<Map<String, Object>> replicaStates = new ArrayList<>();
List<String> newContainerIds = new ArrayList<>();

View File

@@ -0,0 +1,35 @@
package com.cameleer3.server.app.runtime;
import java.util.LinkedHashMap;
import java.util.Map;
public final class PrometheusLabelBuilder {
private PrometheusLabelBuilder() {}
public static Map<String, String> build(String resolvedRuntimeType) {
Map<String, String> labels = new LinkedHashMap<>();
labels.put("prometheus.scrape", "true");
switch (resolvedRuntimeType) {
case "spring-boot" -> {
labels.put("prometheus.path", "/actuator/prometheus");
labels.put("prometheus.port", "8081");
}
case "quarkus", "native" -> {
labels.put("prometheus.path", "/q/metrics");
labels.put("prometheus.port", "9000");
}
case "plain-java" -> {
labels.put("prometheus.path", "/metrics");
labels.put("prometheus.port", "9464");
}
default -> {
labels.put("prometheus.path", "/actuator/prometheus");
labels.put("prometheus.port", "8081");
}
}
return labels;
}
}

View File

@@ -0,0 +1,50 @@
package com.cameleer3.server.app.runtime;
import org.junit.jupiter.api.Test;
import java.util.Map;
import static org.junit.jupiter.api.Assertions.*;
class PrometheusLabelBuilderTest {
@Test
void springBootLabels() {
Map<String, String> labels = PrometheusLabelBuilder.build("spring-boot");
assertEquals("true", labels.get("prometheus.scrape"));
assertEquals("/actuator/prometheus", labels.get("prometheus.path"));
assertEquals("8081", labels.get("prometheus.port"));
}
@Test
void quarkusLabels() {
Map<String, String> labels = PrometheusLabelBuilder.build("quarkus");
assertEquals("true", labels.get("prometheus.scrape"));
assertEquals("/q/metrics", labels.get("prometheus.path"));
assertEquals("9000", labels.get("prometheus.port"));
}
@Test
void nativeLabels() {
Map<String, String> labels = PrometheusLabelBuilder.build("native");
assertEquals("true", labels.get("prometheus.scrape"));
assertEquals("/q/metrics", labels.get("prometheus.path"));
assertEquals("9000", labels.get("prometheus.port"));
}
@Test
void plainJavaLabels() {
Map<String, String> labels = PrometheusLabelBuilder.build("plain-java");
assertEquals("true", labels.get("prometheus.scrape"));
assertEquals("/metrics", labels.get("prometheus.path"));
assertEquals("9464", labels.get("prometheus.port"));
}
@Test
void unknownDefaultsToSpringBoot() {
Map<String, String> labels = PrometheusLabelBuilder.build("unknown");
assertEquals("true", labels.get("prometheus.scrape"));
assertEquals("/actuator/prometheus", labels.get("prometheus.path"));
assertEquals("8081", labels.get("prometheus.port"));
}
}