Skip to content

Commit a48c2eb

Browse files
committed
feat: added metrics and allow to set a low priority separate queue for thread pool
1 parent 3e92789 commit a48c2eb

63 files changed

Lines changed: 806 additions & 183 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/*
2+
* Copyright (C) 2019 OnGres, Inc.
3+
* SPDX-License-Identifier: AGPL-3.0-or-later
4+
*/
5+
6+
package io.stackgres.cluster.configuration;
7+
8+
import javax.management.MalformedObjectNameException;
9+
10+
import io.stackgres.common.ClusterControllerProperty;
11+
import io.stackgres.common.metrics.AbstractJmxCollectorRegistry;
12+
import jakarta.inject.Singleton;
13+
14+
@Singleton
15+
public class ClusterControllerJmxCollectorRegistry extends AbstractJmxCollectorRegistry {
16+
17+
public ClusterControllerJmxCollectorRegistry() throws MalformedObjectNameException {
18+
super(ClusterControllerProperty.CLUSTER_CONTROLLER_JMX_COLLECTOR_YAML_CONFIG
19+
.get().orElse(""));
20+
}
21+
22+
}

stackgres-k8s/src/cluster-controller/src/main/resources/application.properties

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,3 +38,6 @@ quarkus.http.auth.basic=true
3838
org.jooq.no-logo=true
3939
quarkus.log.category."org.jooq.Constants".level=OFF
4040
quarkus.log.category."org.jooq.tools.LoggerListener".level=OFF
41+
42+
# Use custom micrometer producer
43+
quarkus.micrometer.export.prometheus.default-registry=false

stackgres-k8s/src/common/pom.xml

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,14 @@
4545
<groupId>com.ongres</groupId>
4646
<artifactId>fluent-process</artifactId>
4747
</dependency>
48+
<dependency>
49+
<groupId>io.quarkus</groupId>
50+
<artifactId>quarkus-micrometer-registry-prometheus</artifactId>
51+
</dependency>
52+
<dependency>
53+
<groupId>io.prometheus.jmx</groupId>
54+
<artifactId>collector</artifactId>
55+
</dependency>
4856

4957
<dependency>
5058
<groupId>io.stackgres</groupId>

stackgres-k8s/src/common/src/main/java/io/stackgres/common/ClusterControllerProperty.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,9 @@ public enum ClusterControllerProperty implements StackGresPropertyReader {
2626
CLUSTER_CONTROLLER_RECONCILE_MANAGED_SQL(
2727
"stackgres.clusterReconcileManagedSql"),
2828
CLUSTER_CONTROLLER_RECONCILE_PATRONI_AFTER_MAJOR_VERSION_UPGRADE(
29-
"stackgres.clusterReconcilePatroniAfterMajorVersionUpgrade");
29+
"stackgres.clusterReconcilePatroniAfterMajorVersionUpgrade"),
30+
CLUSTER_CONTROLLER_JMX_COLLECTOR_YAML_CONFIG(
31+
"stackgres.cluster.controllerJmxCollectorYamlConfig");
3032

3133
private static final Properties APPLICATION_PROPERTIES =
3234
StackGresPropertyReader.readApplicationProperties(ClusterControllerProperty.class);

stackgres-k8s/src/common/src/main/java/io/stackgres/common/OperatorProperty.java

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,11 +46,14 @@ public enum OperatorProperty implements StackGresPropertyReader {
4646
FORCE_UNLOCK_OPERATOR("stackgres.forceUnlockOperator"),
4747
STOP_AFTER_BOOTSTRAP("stackgres.stopAfterBootstrap"),
4848
RECONCILIATION_ENABLE_THREAD_POOL("stackgres.reconciliationEnableThreadPool"),
49+
RECONCILIATION_THREAD_POOL_METRICS_SCRAPE_INTERVAL("stackgres.reconciliationThreadPoolMetricsScrapeInterval"),
4950
RECONCILIATION_THREADS("stackgres.reconciliationThreads"),
51+
RECONCILIATION_LOW_PRIORITY_THREADS("stackgres.reconciliationLowPriorityThreads"),
5052
RECONCILIATION_PRIORITY_TIMEOUT("stackgres.reconciliationPriorityTimeout"),
5153
RECONCILIATION_INITIAL_BACKOFF("stackgres.reconciliationInitialBackoff"),
5254
RECONCILIATION_MAX_BACKOFF("stackgres.reconciliationMaxBackoff"),
53-
RECONCILIATION_BACKOFF_VARIATION("stackgres.reconciliationBackoffVariation");
55+
RECONCILIATION_BACKOFF_VARIATION("stackgres.reconciliationBackoffVariation"),
56+
JMX_COLLECTOR_YAML_CONFIG("stackgres.jmxCollectorYamlConfig");
5457

5558
private static final Properties APPLICATION_PROPERTIES =
5659
StackGresPropertyReader.readApplicationProperties(OperatorProperty.class);
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
/*
2+
* Copyright (C) 2019 OnGres, Inc.
3+
* SPDX-License-Identifier: AGPL-3.0-or-later
4+
*/
5+
6+
package io.stackgres.common.metrics;
7+
8+
import java.io.ByteArrayOutputStream;
9+
import java.io.IOException;
10+
import java.io.OutputStreamWriter;
11+
import java.nio.charset.StandardCharsets;
12+
13+
import javax.management.MalformedObjectNameException;
14+
15+
import io.prometheus.jmx.JmxCollector;
16+
import io.prometheus.metrics.expositionformats.PrometheusTextFormatWriter;
17+
import io.prometheus.metrics.model.registry.PrometheusRegistry;
18+
import io.stackgres.common.CdiUtil;
19+
20+
public abstract class AbstractJmxCollectorRegistry {
21+
private final PrometheusRegistry collectorRegistry;
22+
private final PrometheusTextFormatWriter textFormatter = new PrometheusTextFormatWriter(true);
23+
24+
public AbstractJmxCollectorRegistry(String yamlConfig) throws MalformedObjectNameException {
25+
new JmxCollector(yamlConfig).register(PrometheusRegistry.defaultRegistry);
26+
this.collectorRegistry = PrometheusRegistry.defaultRegistry;
27+
}
28+
29+
public AbstractJmxCollectorRegistry() {
30+
CdiUtil.checkPublicNoArgsConstructorIsCalledToCreateProxy(getClass());
31+
this.collectorRegistry = null;
32+
}
33+
34+
public String scrape(String contentType) {
35+
try (
36+
ByteArrayOutputStream stream = new ByteArrayOutputStream();
37+
OutputStreamWriter writer = new OutputStreamWriter(stream, StandardCharsets.UTF_8)) {
38+
textFormatter.write(stream, collectorRegistry.scrape());
39+
return stream.toString(StandardCharsets.UTF_8);
40+
} catch (IOException e) {
41+
throw new RuntimeException(e);
42+
}
43+
}
44+
45+
}
Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
/*
2+
* Copyright (C) 2019 OnGres, Inc.
3+
* SPDX-License-Identifier: AGPL-3.0-or-later
4+
*/
5+
6+
package io.stackgres.common.metrics;
7+
8+
import io.micrometer.prometheus.PrometheusConfig;
9+
import io.micrometer.prometheus.PrometheusMeterRegistry;
10+
import jakarta.inject.Singleton;
11+
12+
@Singleton
13+
public class CustomPrometheusMeterRegistry extends PrometheusMeterRegistry {
14+
15+
private final AbstractJmxCollectorRegistry jmxCollectorRegistry;
16+
17+
public CustomPrometheusMeterRegistry(
18+
PrometheusConfig config,
19+
AbstractJmxCollectorRegistry jmxCollectorRegistry) {
20+
super(config);
21+
this.jmxCollectorRegistry = jmxCollectorRegistry;
22+
}
23+
24+
@Override
25+
public String scrape(String contentType) {
26+
StringBuilder sb = new StringBuilder();
27+
sb.append(super.scrape(contentType));
28+
if (jmxCollectorRegistry != null) {
29+
sb.append(jmxCollectorRegistry.scrape(contentType));
30+
}
31+
return sb.toString();
32+
}
33+
}

stackgres-k8s/src/jobs/src/main/java/io/stackgres/jobs/Main.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
import io.quarkus.runtime.QuarkusApplication;
99
import io.quarkus.runtime.annotations.QuarkusMain;
10-
import io.stackgres.jobs.app.JobsProperty;
10+
import io.stackgres.jobs.configuration.JobsProperty;
1111
import io.stackgres.jobs.dbops.DbOpsLauncher;
1212
import jakarta.inject.Inject;
1313

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/*
2+
* Copyright (C) 2019 OnGres, Inc.
3+
* SPDX-License-Identifier: AGPL-3.0-or-later
4+
*/
5+
6+
package io.stackgres.jobs.configuration;
7+
8+
import javax.management.MalformedObjectNameException;
9+
10+
import io.stackgres.common.metrics.AbstractJmxCollectorRegistry;
11+
import jakarta.inject.Singleton;
12+
13+
@Singleton
14+
public class JobsJmxCollectorRegistry extends AbstractJmxCollectorRegistry {
15+
16+
public JobsJmxCollectorRegistry() throws MalformedObjectNameException {
17+
super(JobsProperty.JOBS_JMX_COLLECTOR_YAML_CONFIG.get().orElse(""));
18+
}
19+
20+
}

stackgres-k8s/src/jobs/src/main/java/io/stackgres/jobs/app/JobsProperty.java renamed to stackgres-k8s/src/jobs/src/main/java/io/stackgres/jobs/configuration/JobsProperty.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
* SPDX-License-Identifier: AGPL-3.0-or-later
44
*/
55

6-
package io.stackgres.jobs.app;
6+
package io.stackgres.jobs.configuration;
77

88
import java.util.Properties;
99

@@ -20,7 +20,8 @@ public enum JobsProperty implements StackGresPropertyReader {
2020
SERVICE_ACCOUNT("stackgres.dbops.serviceAccount"),
2121
POD_NAME("stackgres.dbops.podName"),
2222
DBOPS_LOCK_POLL_INTERVAL("stackgres.dbops.lockPollInterval"),
23-
DBOPS_LOCK_DURATION("stackgres.dbops.lockDuration");
23+
DBOPS_LOCK_DURATION("stackgres.dbops.lockDuration"),
24+
JOBS_JMX_COLLECTOR_YAML_CONFIG("stackgres.jobs.jmxCollectorYamlConfig");
2425

2526
private static final Properties APPLICATION_PROPERTIES =
2627
StackGresPropertyReader.readApplicationProperties(JobsProperty.class);

0 commit comments

Comments
 (0)