Skip to content

Commit 696e942

Browse files
committed
Fix Prometheus issues
1 parent 6f10b6e commit 696e942

File tree

24 files changed

+424
-30
lines changed

24 files changed

+424
-30
lines changed

README.md

+6-5
Original file line numberDiff line numberDiff line change
@@ -34,12 +34,13 @@ We will provide more receivers in the future and welcome contributions. Right no
3434

3535
| Receiver name | Type | Status | JDK required |
3636
|---------------|------|--------|--------------|
37-
| [Dameng Database](ojr-dameng-db/README.md) | metrics | beta | Java 8+ |
38-
| [Oceanbase Database](ojr-oceanbase-db/README.md) | metrics | alpha | Java 8+ |
39-
| [Informix Database](ojr-informix-db/README.md) | metrics | alpha | Java 8+ |
40-
| [Linux Host](ojr-linux-host/README.md) | metrics | alpha | Java 8+ |
37+
| [Dameng Database](ojr-dameng-db/README.md) | metrics | beta | Java 8+ |
38+
| [Oceanbase Database](ojr-oceanbase-db/README.md) | metrics | alpha | Java 8+ |
39+
| [Informix Database](ojr-informix-db/README.md) | metrics | alpha | Java 8+ |
40+
| [Linux Host](ojr-linux-host/README.md) | metrics | alpha | Java 8+ |
4141
| [SNMP Host](ojr-snmp-host/README.md) | metrics | alpha | Java 11+ |
42-
| [IBM MQ Appliance](ojr-mq-appliance/README.md) | metrics | beta | Java 8+ |
42+
| [IBM MQ Appliance](ojr-mq-appliance/README.md) | metrics | beta | Java 8+ |
43+
| [IBM MQ](ojr-ibmmq/README.md) | metrics | beta | Java 8+ |
4344

4445

4546
## Common Parameters for Receivers

ojr-dameng-db/libs/ojr-core-0.1.0.jar

6.66 KB
Binary file not shown.

ojr-dameng-db/libs/ojr-rdb-0.1.0.jar

0 Bytes
Binary file not shown.

ojr-ibmmq/config/config.yaml

+18
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,21 @@ instances:
1717
#otel.backend.url: http://localhost:4318
1818
otel.transport: prometheus
1919
prometheus.port: 16543
20+
21+
- queueManager: SATURN
22+
isLocal: false
23+
#user: liurui
24+
#password: xxxxxxxx
25+
#port: 1414
26+
queuesMonitored: Q*
27+
#customEventQueues:
28+
#keystore:
29+
#keystorePassword:
30+
#cipherSuite: TLS_RSA_WITH_AES_256_CBC_SHA256
31+
32+
## Data collector properties:
33+
poll.interval: 25
34+
callback.interval: 30
35+
#otel.backend.url: http://localhost:4318
36+
otel.transport: prometheus
37+
prometheus.port: 16543

ojr-ibmmq/libs/ojr-core-0.1.0.jar

6.66 KB
Binary file not shown.

ojr-ibmmq/src/main/java/com/ojr/ibmmq/MQDc.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -87,7 +87,7 @@ public void collectData() {
8787
logger.info("Start to collect metrics");
8888
try {
8989
mqClient.connect();
90-
for(DataQuerier querier : queriers){
90+
for (DataQuerier querier : queriers) {
9191
querier.collectData();
9292
}
9393
} catch (Exception e) {
6.66 KB
Binary file not shown.
0 Bytes
Binary file not shown.
6.66 KB
Binary file not shown.
0 Bytes
Binary file not shown.
6.66 KB
Binary file not shown.
0 Bytes
Binary file not shown.

ojr-oceanbase-db/config/config.yaml

+1-1
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ instances:
2626
db.username: root@sys
2727
db.password: MTIzNDU2
2828
db.connection.url: jdbc:mysql://localhost:2881/oceanbase?autoReconnect=true&useSSL=false
29-
db.name: oceanbase
29+
db.name: oceanbase1
3030
db.entity.type: tenant
3131
db.tenant.name: test
3232

6.66 KB
Binary file not shown.
0 Bytes
Binary file not shown.

ojr-snmp-host/libs/ojr-core-0.1.0.jar

6.66 KB
Binary file not shown.

ojr-snmp-host/libs/ojr-host-0.1.0.jar

0 Bytes
Binary file not shown.

sdk/ojr-core/build.gradle

+2
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,8 @@ dependencies {
2828
api("io.opentelemetry.semconv:opentelemetry-semconv-incubating:1.28.0-alpha")
2929
api("com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.18.2")
3030

31+
implementation('io.prometheus:prometheus-metrics-exporter-httpserver:1.3.4')
32+
3133
testImplementation platform('org.junit:junit-bom:5.11.3')
3234
testImplementation 'org.junit.jupiter:junit-jupiter'
3335
testImplementation 'org.mockito:mockito-core:4.11.0'

sdk/ojr-core/src/main/java/com/ojr/core/AbstractDc.java

+50-23
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.ojr.core;
22

3+
import com.ojr.core.metric.OjrPrometheusHttpServer;
34
import com.ojr.core.metric.RawMetric;
45
import com.ojr.core.resources.ContainerResource;
56
import io.opentelemetry.api.OpenTelemetry;
@@ -17,17 +18,16 @@
1718
import io.opentelemetry.exporter.otlp.metrics.OtlpGrpcMetricExporterBuilder;
1819
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporter;
1920
import io.opentelemetry.exporter.otlp.trace.OtlpGrpcSpanExporterBuilder;
20-
import io.opentelemetry.exporter.prometheus.PrometheusHttpServer;
21-
import io.opentelemetry.exporter.prometheus.PrometheusHttpServerBuilder;
21+
import io.opentelemetry.exporter.prometheus.PrometheusMetricReader;
2222
import io.opentelemetry.sdk.OpenTelemetrySdk;
2323
import io.opentelemetry.sdk.OpenTelemetrySdkBuilder;
24+
import io.opentelemetry.sdk.common.export.MemoryMode;
2425
import io.opentelemetry.sdk.logs.SdkLoggerProvider;
2526
import io.opentelemetry.sdk.logs.export.BatchLogRecordProcessor;
2627
import io.opentelemetry.sdk.logs.export.LogRecordExporter;
2728
import io.opentelemetry.sdk.metrics.SdkMeterProvider;
2829
import io.opentelemetry.sdk.metrics.SdkMeterProviderBuilder;
2930
import io.opentelemetry.sdk.metrics.export.MetricExporter;
30-
import io.opentelemetry.sdk.metrics.export.MetricReader;
3131
import io.opentelemetry.sdk.metrics.export.PeriodicMetricReader;
3232
import io.opentelemetry.sdk.resources.Resource;
3333
import io.opentelemetry.sdk.trace.SdkTracerProvider;
@@ -69,7 +69,7 @@ public abstract class AbstractDc<Cfg extends BasicDcConfig> implements IDc<Cfg>
6969
private String transport = DcUtil.DEFAULT_OTEL_TRANSPORT;
7070

7171
private int prometheusPort = DcUtil.DEFAULT_PROMETHEUS_PORT;
72-
private String prometheusHost = null;
72+
private String prometheusHost = DcUtil.DEFAULT_PROMETHEUS_HOST;
7373

7474
private String serviceName = DcUtil.DEFAULT_OTEL_SERVICE_NAME;
7575
private String serviceInstanceId = null;
@@ -420,14 +420,10 @@ public LogRecordExporter createOtlpHttpLogRecordExporter(Map<String, String> hea
420420
return builder.build();
421421
}
422422

423-
private static MetricReader prometheusMetricReader = null;
423+
//private static MetricReader prometheusMetricReader = null;
424424

425-
private static Predicate<String> dftResAttrsFilterForPrometheus = (String key) -> {
426-
if (DcUtil.OJR_PLUGIN.equals(key) || HostIncubatingAttributes.HOST_NAME.getKey().equals(key)) {
427-
return true;
428-
}
429-
return false;
430-
};
425+
private static final Predicate<String> dftResAttrsFilterForPrometheus =
426+
(String key) -> DcUtil.OJR_PLUGIN.equals(key) || HostIncubatingAttributes.HOST_NAME.getKey().equals(key);
431427

432428
/**
433429
* Returns the filter for resource attributes used when exporting metrics to Prometheus.
@@ -440,15 +436,8 @@ public Predicate<String> updateResAttrsFilterForPrometheus(Predicate<String> res
440436
return resAttrsFilter;
441437
}
442438

443-
/**
444-
* Creates and configures a Prometheus metric reader.
445-
* <p>
446-
* This method sets up a Prometheus HTTP server with a specified port.
447-
* Optionally, if a host is provided and not empty, it sets the host as well.
448-
*
449-
* @return A configured MetricReader instance for Prometheus metrics.
450-
*/
451-
public synchronized MetricReader createPrometheusMetricReader() {
439+
/*
440+
private synchronized MetricReader createPrometheusMetricReader0() {
452441
if (prometheusMetricReader != null) {
453442
return prometheusMetricReader;
454443
}
@@ -461,6 +450,44 @@ public synchronized MetricReader createPrometheusMetricReader() {
461450
462451
return prometheusMetricReader = builder.build();
463452
}
453+
*/
454+
455+
private static OjrPrometheusHttpServer prometheusHttpServer = null;
456+
457+
458+
public synchronized OjrPrometheusHttpServer createPrometheusHttpServerIfNotExist() {
459+
if (prometheusHttpServer != null) {
460+
return prometheusHttpServer; // Return early if the server is already created
461+
}
462+
prometheusHttpServer = new OjrPrometheusHttpServer(prometheusHost, prometheusPort, null, MemoryMode.REUSABLE_DATA);
463+
return prometheusHttpServer;
464+
}
465+
466+
/**
467+
* Creates and configures a Prometheus metric reader.
468+
* <p>
469+
* This method sets up a Prometheus HTTP server with a specified port.
470+
* Optionally, if a host is provided and not empty, it sets the host as well.
471+
*
472+
* @return A configured PrometheusMetricReader instance for Prometheus metrics.
473+
*/
474+
public PrometheusMetricReader createPrometheusMetricReader() {
475+
return new PrometheusMetricReader(false, updateResAttrsFilterForPrometheus(dftResAttrsFilterForPrometheus));
476+
}
477+
478+
479+
/**
480+
* Initializes Prometheus for the OpenTelemetry Meter Provider.
481+
*
482+
* @param builder The SdkMeterProviderBuilder instance to configure Prometheus.
483+
* @return The updated SdkMeterProviderBuilder instance.
484+
*/
485+
public SdkMeterProviderBuilder initPrometheus(SdkMeterProviderBuilder builder) {
486+
PrometheusMetricReader reader = createPrometheusMetricReader();
487+
builder.registerMetricReader(reader);
488+
createPrometheusHttpServerIfNotExist().registerReader(reader).start();
489+
return builder;
490+
}
464491

465492
/**
466493
* Creates a default SDK meter provider with the specified configuration.
@@ -476,17 +503,17 @@ public SdkMeterProvider getDefaultSdkMeterProvider(Resource resource) {
476503
if (transport.contains(DcUtil.GRPC)) {
477504
SdkMeterProviderBuilder builder = SdkMeterProvider.builder().setResource(resource).registerMetricReader(PeriodicMetricReader.builder(createOtlpGrpcMetricExporter(headers, cert)).setInterval(Duration.ofSeconds(callbackInterval)).build());
478505
if (transport.contains(DcUtil.PROMETHEUS)) {
479-
builder.registerMetricReader(createPrometheusMetricReader());
506+
initPrometheus(builder);
480507
}
481508
return builder.build();
482509
} else if (transport.contains(DcUtil.HTTP)) {
483510
SdkMeterProviderBuilder builder = SdkMeterProvider.builder().setResource(resource).registerMetricReader(PeriodicMetricReader.builder(createOtlpHttpMetricExporter(headers, cert)).setInterval(Duration.ofSeconds(callbackInterval)).build());
484511
if (transport.contains(DcUtil.PROMETHEUS)) {
485-
builder.registerMetricReader(createPrometheusMetricReader());
512+
initPrometheus(builder);
486513
}
487514
return builder.build();
488515
} else if (transport.contains(DcUtil.PROMETHEUS)) {
489-
return SdkMeterProvider.builder().setResource(resource).registerMetricReader(createPrometheusMetricReader()).build();
516+
return initPrometheus(SdkMeterProvider.builder().setResource(resource)).build();
490517
} else {
491518
return SdkMeterProvider.builder().build();
492519
}

sdk/ojr-core/src/main/java/com/ojr/core/DcUtil.java

+1
Original file line numberDiff line numberDiff line change
@@ -44,6 +44,7 @@ public class DcUtil {
4444
public static final String PROMETHEUS_PORT = "prometheus.port";
4545
public static final int DEFAULT_PROMETHEUS_PORT = 16543; // Default Prometheus port
4646
public static final String PROMETHEUS_HOST = "prometheus.host";
47+
public static final String DEFAULT_PROMETHEUS_HOST = "0.0.0.0";
4748

4849
public final static String OTEL_SERVICE_NAME = "otel.service.name"; // Service name for OpenTelemetry
4950
public final static String DEFAULT_OTEL_SERVICE_NAME = "OJR"; // Default service name
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,177 @@
1+
package com.ojr.core.metric;
2+
3+
import io.opentelemetry.exporter.prometheus.PrometheusMetricReader;
4+
import io.opentelemetry.sdk.common.CompletableResultCode;
5+
import io.opentelemetry.sdk.common.export.MemoryMode;
6+
import io.opentelemetry.sdk.internal.DaemonThreadFactory;
7+
import io.prometheus.metrics.exporter.httpserver.HTTPServer;
8+
import io.prometheus.metrics.model.registry.PrometheusRegistry;
9+
10+
import javax.annotation.Nullable;
11+
import java.io.IOException;
12+
import java.io.UncheckedIOException;
13+
import java.net.InetSocketAddress;
14+
import java.util.concurrent.ExecutorService;
15+
import java.util.concurrent.LinkedBlockingQueue;
16+
import java.util.concurrent.ThreadPoolExecutor;
17+
import java.util.concurrent.TimeUnit;
18+
19+
/**
20+
* Prometheus HTTP server implementation.
21+
* This class manages the Prometheus HTTP server, including starting, stopping, and shutting down.
22+
*/
23+
public class OjrPrometheusHttpServer {
24+
// HTTP server instance to handle incoming requests
25+
private HTTPServer httpServer;
26+
27+
private final PrometheusMergedReader mReader = new PrometheusMergedReader();
28+
29+
// Prometheus registry to manage and expose metrics
30+
private final PrometheusRegistry prometheusRegistry = new PrometheusRegistry();
31+
32+
// Host address where the HTTP server will listen
33+
private final String host;
34+
35+
// Port number where the HTTP server will listen
36+
private final int port;
37+
38+
// Memory mode configuration (e.g., REUSABLE_DATA)
39+
private final MemoryMode memoryMode;
40+
41+
// Executor service for handling HTTP server tasks
42+
private final ExecutorService executor;
43+
44+
/**
45+
* Constructor to initialize the Prometheus HTTP server.
46+
*
47+
* @param host Host address for the HTTP server
48+
* @param port Port number for the HTTP server
49+
* @param executor Optional executor service for handling tasks
50+
* @param memoryMode Memory mode configuration
51+
*/
52+
public OjrPrometheusHttpServer(
53+
String host,
54+
int port,
55+
@Nullable ExecutorService executor,
56+
MemoryMode memoryMode) {
57+
58+
this.host = host;
59+
this.port = port;
60+
this.memoryMode = memoryMode;
61+
this.executor = executor;
62+
}
63+
64+
/**
65+
* Registers a PrometheusMetricReader
66+
*
67+
* @param reader PrometheusMetricReader instance to register
68+
* @return The current OjrPrometheusHttpServer instance
69+
*/
70+
public OjrPrometheusHttpServer registerReader(PrometheusMetricReader reader) {
71+
mReader.registerReader(reader);
72+
return this;
73+
}
74+
75+
private static boolean isStarted = false;
76+
77+
/**
78+
* Starts the Prometheus HTTP server.
79+
*/
80+
public synchronized void start() {
81+
if (isStarted)
82+
return;
83+
84+
prometheusRegistry.register(mReader);
85+
86+
ExecutorService executor1 = executor;
87+
88+
// If memory mode is REUSABLE_DATA, create a dedicated thread pool
89+
if (memoryMode == MemoryMode.REUSABLE_DATA) {
90+
executor1 =
91+
new ThreadPoolExecutor(
92+
1,
93+
1,
94+
0L,
95+
TimeUnit.MILLISECONDS,
96+
new LinkedBlockingQueue<>(),
97+
new DaemonThreadFactory("prometheus-http-server"));
98+
}
99+
try {
100+
// Build and start the HTTP server with the given configuration
101+
httpServer =
102+
HTTPServer.builder()
103+
.hostname(host)
104+
.port(port)
105+
.executorService(executor1)
106+
.registry(prometheusRegistry)
107+
.buildAndStart();
108+
} catch (IOException e) {
109+
throw new UncheckedIOException("Could not create Prometheus HTTP server", e);
110+
}
111+
112+
isStarted = true;
113+
}
114+
115+
public PrometheusMergedReader getmReader() {
116+
return mReader;
117+
}
118+
119+
/**
120+
* Returns the current memory mode configuration.
121+
*
122+
* @return MemoryMode enum value
123+
*/
124+
public MemoryMode getMemoryMode() {
125+
return memoryMode;
126+
}
127+
128+
/**
129+
* Shuts down the Prometheus HTTP server gracefully.
130+
*
131+
* @return CompletableResultCode indicating the shutdown result
132+
*/
133+
public CompletableResultCode shutdown() {
134+
CompletableResultCode rc = new CompletableResultCode();
135+
Runnable shutdownFunction =
136+
() -> {
137+
try {
138+
// Unregister each reader and stop the HTTP server
139+
prometheusRegistry.unregister(mReader);
140+
httpServer.stop();
141+
} catch (Throwable t) {
142+
rc.fail();
143+
}
144+
};
145+
Thread shutdownThread = new Thread(shutdownFunction, "Shutdown-OjrPrometheusHttpServer");
146+
shutdownThread.setDaemon(true);
147+
shutdownThread.start();
148+
isStarted = false;
149+
return rc;
150+
}
151+
152+
/**
153+
* Closes the Prometheus HTTP server by initiating a shutdown and waiting for completion.
154+
*/
155+
public void close() {
156+
shutdown().join(10, TimeUnit.SECONDS);
157+
}
158+
159+
/**
160+
* Returns a string representation of the server's address.
161+
*
162+
* @return String representation of the server's address
163+
*/
164+
@Override
165+
public String toString() {
166+
return "OjrPrometheusHttpServer{address=" + getAddress() + "}";
167+
}
168+
169+
/**
170+
* Gets the InetSocketAddress of the HTTP server.
171+
*
172+
* @return InetSocketAddress object
173+
*/
174+
InetSocketAddress getAddress() {
175+
return new InetSocketAddress(host, httpServer.getPort());
176+
}
177+
}

0 commit comments

Comments
 (0)