Skip to content

Commit 31a4d06

Browse files
committed
move to produce metrics via MetricProducer
1 parent 60bd641 commit 31a4d06

29 files changed

Lines changed: 1101 additions & 379 deletions

ibm-mq-metrics/build.gradle.kts

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ val ibmClientJar: Configuration by configurations.creating {
2020
}
2121

2222
dependencies {
23+
api("com.google.auto.value:auto-value-annotations:1.11.1")
2324
api("com.google.code.findbugs:jsr305:3.0.2")
2425
api("io.swagger:swagger-annotations:1.6.16")
2526
api("org.jetbrains:annotations:26.1.0")
@@ -33,6 +34,7 @@ dependencies {
3334
implementation("org.slf4j:slf4j-simple:2.0.17")
3435
testImplementation("com.google.guava:guava")
3536
testImplementation("io.opentelemetry:opentelemetry-sdk-testing")
37+
annotationProcessor("com.google.auto.value:auto-value:1.11.1")
3638
ibmClientJar("com.ibm.mq:com.ibm.mq.allclient:9.4.5.1") {
3739
artifact {
3840
name = "com.ibm.mq.allclient"

ibm-mq-metrics/config.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,4 +214,4 @@ sslConnection:
214214

215215
# Configure the OTLP exporter using system properties keys following the specification https://opentelemetry.io/docs/languages/java/configuration/
216216
otlpExporter:
217-
otel.exporter.otlp.endpoint: http://localhost:4318
217+
otel.exporter.otlp.endpoint: http://localhost:4318

ibm-mq-metrics/src/integrationTest/java/io/opentelemetry/ibm/mq/integration/tests/TestWMQMonitor.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,9 @@
88
import static org.assertj.core.api.Assertions.assertThat;
99

1010
import com.fasterxml.jackson.databind.ObjectMapper;
11-
import io.opentelemetry.api.metrics.Meter;
1211
import io.opentelemetry.ibm.mq.WmqMonitor;
1312
import io.opentelemetry.ibm.mq.config.QueueManager;
13+
import io.opentelemetry.ibm.mq.metrics.MetricProducer;
1414
import io.opentelemetry.ibm.mq.opentelemetry.ConfigWrapper;
1515
import java.util.List;
1616
import java.util.Map;
@@ -26,12 +26,12 @@ class TestWMQMonitor {
2626

2727
private final ConfigWrapper config;
2828
private final ExecutorService threadPool;
29-
private final Meter meter;
29+
private final MetricProducer producer;
3030

31-
TestWMQMonitor(ConfigWrapper config, Meter meter, ExecutorService service) {
31+
TestWMQMonitor(ConfigWrapper config, MetricProducer producer, ExecutorService service) {
3232
this.config = config;
3333
this.threadPool = service;
34-
this.meter = meter;
34+
this.producer = producer;
3535
}
3636

3737
/**
@@ -47,7 +47,7 @@ void runTest() {
4747
assertThat(queueManagers).isNotNull();
4848
ObjectMapper mapper = new ObjectMapper();
4949

50-
WmqMonitor wmqTask = new WmqMonitor(config, threadPool, meter);
50+
WmqMonitor wmqTask = new WmqMonitor(config, threadPool, producer);
5151

5252
// we override this helper to pass in our opentelemetry helper instead.
5353
for (Map<String, ?> queueManager : queueManagers) {

ibm-mq-metrics/src/integrationTest/java/io/opentelemetry/ibm/mq/integration/tests/WMQMonitorIntegrationTest.java

Lines changed: 20 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,14 @@
2020
import com.ibm.mq.headers.pcf.PCFMessageAgent;
2121
import io.opentelemetry.api.common.AttributeKey;
2222
import io.opentelemetry.api.common.Attributes;
23-
import io.opentelemetry.api.metrics.Meter;
2423
import io.opentelemetry.ibm.mq.config.QueueManager;
24+
import io.opentelemetry.ibm.mq.metrics.MetricProducer;
2525
import io.opentelemetry.ibm.mq.opentelemetry.ConfigWrapper;
2626
import io.opentelemetry.ibm.mq.opentelemetry.Main;
2727
import io.opentelemetry.ibm.mq.util.WmqUtil;
28+
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
2829
import io.opentelemetry.sdk.metrics.data.MetricData;
29-
import io.opentelemetry.sdk.testing.junit5.OpenTelemetryExtension;
30+
import io.opentelemetry.sdk.resources.Resource;
3031
import java.io.File;
3132
import java.net.URISyntaxException;
3233
import java.net.URL;
@@ -50,7 +51,6 @@
5051
import org.junit.jupiter.api.BeforeEach;
5152
import org.junit.jupiter.api.Disabled;
5253
import org.junit.jupiter.api.Test;
53-
import org.junit.jupiter.api.extension.RegisterExtension;
5454
import org.slf4j.Logger;
5555
import org.slf4j.LoggerFactory;
5656

@@ -60,9 +60,6 @@ class WMQMonitorIntegrationTest {
6060

6161
private static final Logger logger = LoggerFactory.getLogger(WMQMonitorIntegrationTest.class);
6262

63-
@RegisterExtension
64-
static final OpenTelemetryExtension otelTesting = OpenTelemetryExtension.create();
65-
6663
private static final ExecutorService service =
6764
Executors.newFixedThreadPool(
6865
4, /* one gets burned with our @BeforeAll message uzi, 4 is faster than 2 */
@@ -183,11 +180,13 @@ void test_monitor_with_full_config() throws Exception {
183180
String configFile = getConfigFile("conf/test-config.yml");
184181

185182
ConfigWrapper config = ConfigWrapper.parse(configFile);
186-
Meter meter = otelTesting.getOpenTelemetry().getMeter("opentelemetry.io/mq");
187-
TestWMQMonitor monitor = new TestWMQMonitor(config, meter, service);
183+
MetricProducer producer =
184+
new MetricProducer(Resource.empty(), InstrumentationScopeInfo.empty());
185+
186+
TestWMQMonitor monitor = new TestWMQMonitor(config, producer, service);
188187
monitor.runTest();
189188

190-
List<MetricData> data = otelTesting.getMetrics();
189+
List<MetricData> data = producer.produce(Resource.empty());
191190
Map<String, MetricData> metrics = new HashMap<>();
192191
for (MetricData metricData : data) {
193192
metrics.put(metricData.getName(), metricData);
@@ -244,9 +243,9 @@ void test_monitor_with_full_config() throws Exception {
244243
void test_wmqmonitor() throws Exception {
245244
String configFile = getConfigFile("conf/test-queuemgr-config.yml");
246245
ConfigWrapper config = ConfigWrapper.parse(configFile);
247-
Meter meter = otelTesting.getOpenTelemetry().getMeter("opentelemetry.io/mq");
248-
249-
TestWMQMonitor monitor = new TestWMQMonitor(config, meter, service);
246+
MetricProducer producer =
247+
new MetricProducer(Resource.empty(), InstrumentationScopeInfo.empty());
248+
TestWMQMonitor monitor = new TestWMQMonitor(config, producer, service);
250249
monitor.runTest();
251250
// TODO: Wait why are there no asserts here?
252251
}
@@ -257,14 +256,17 @@ void test_otlphttp() throws Exception {
257256
ConfigWrapper.parse(WMQMonitorIntegrationTest.getConfigFile("conf/test-config.yml"));
258257
ScheduledExecutorService service =
259258
Executors.newScheduledThreadPool(config.getNumberOfThreads());
260-
Main.run(config, service, otelTesting.getOpenTelemetry());
259+
MetricProducer producer =
260+
new MetricProducer(Resource.empty(), InstrumentationScopeInfo.empty());
261+
262+
Main.run(config, service, producer);
261263
CountDownLatch latch = new CountDownLatch(1);
262264
Future<?> ignored = service.submit(latch::countDown);
263265
Thread.sleep(5000); // TODO: This is fragile and time consuming and should be made better
264266
service.shutdown();
265267
assertTrue(service.awaitTermination(30, TimeUnit.SECONDS));
266268

267-
List<MetricData> data = otelTesting.getMetrics();
269+
List<MetricData> data = producer.produce(Resource.empty());
268270
Set<String> metricNames = new HashSet<>();
269271
for (MetricData metricData : data) {
270272
metricNames.add(metricData.getName());
@@ -290,11 +292,12 @@ void test_bad_connection() throws Exception {
290292
String configFile = getConfigFile("conf/test-bad-config.yml");
291293

292294
ConfigWrapper config = ConfigWrapper.parse(configFile);
293-
Meter meter = otelTesting.getOpenTelemetry().getMeter("opentelemetry.io/mq");
294-
TestWMQMonitor monitor = new TestWMQMonitor(config, meter, service);
295+
MetricProducer producer =
296+
new MetricProducer(Resource.empty(), InstrumentationScopeInfo.empty());
297+
TestWMQMonitor monitor = new TestWMQMonitor(config, producer, service);
295298
monitor.runTest();
296299

297-
List<MetricData> data = otelTesting.getMetrics();
300+
List<MetricData> data = producer.produce(Resource.empty());
298301

299302
assertThat(data).isNotEmpty();
300303
assertThat(data).hasSize(2);

ibm-mq-metrics/src/main/java/io/opentelemetry/ibm/mq/WmqMonitor.java

Lines changed: 16 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -13,11 +13,8 @@
1313
import com.ibm.mq.MQQueueManager;
1414
import com.ibm.mq.headers.pcf.PCFMessageAgent;
1515
import io.opentelemetry.api.common.Attributes;
16-
import io.opentelemetry.api.metrics.LongCounter;
17-
import io.opentelemetry.api.metrics.LongGauge;
18-
import io.opentelemetry.api.metrics.Meter;
1916
import io.opentelemetry.ibm.mq.config.QueueManager;
20-
import io.opentelemetry.ibm.mq.metrics.Metrics;
17+
import io.opentelemetry.ibm.mq.metrics.MetricProducer;
2118
import io.opentelemetry.ibm.mq.metrics.MetricsConfig;
2219
import io.opentelemetry.ibm.mq.metricscollector.ChannelMetricsCollector;
2320
import io.opentelemetry.ibm.mq.metricscollector.InquireChannelCmdCollector;
@@ -49,15 +46,15 @@ public final class WmqMonitor {
4946

5047
private final List<QueueManager> queueManagers;
5148
private final List<Consumer<MetricsCollectorContext>> jobs = new ArrayList<>();
52-
private final LongCounter errorCodesCounter;
53-
private final LongGauge heartbeatGauge;
5449
private final ExecutorService threadPool;
5550
private final MetricsConfig metricsConfig;
51+
private final MetricProducer producer;
5652

57-
public WmqMonitor(ConfigWrapper config, ExecutorService threadPool, Meter meter) {
53+
public WmqMonitor(ConfigWrapper config, ExecutorService threadPool, MetricProducer producer) {
5854
List<Map<String, ?>> queueManagers = getQueueManagers(config);
5955
ObjectMapper mapper = new ObjectMapper();
6056

57+
this.producer = producer;
6158
this.queueManagers = new ArrayList<>();
6259

6360
for (Map<String, ?> queueManager : queueManagers) {
@@ -70,21 +67,18 @@ public WmqMonitor(ConfigWrapper config, ExecutorService threadPool, Meter meter)
7067
}
7168

7269
this.metricsConfig = new MetricsConfig(config);
73-
74-
this.heartbeatGauge = Metrics.createIbmMqHeartbeat(meter);
75-
this.errorCodesCounter = Metrics.createIbmMqConnectionErrors(meter);
7670
this.threadPool = threadPool;
7771

78-
jobs.add(new QueueManagerMetricsCollector(meter));
79-
jobs.add(new InquireQueueManagerCmdCollector(meter));
80-
jobs.add(new ChannelMetricsCollector(meter));
81-
jobs.add(new InquireChannelCmdCollector(meter));
82-
jobs.add(new QueueMetricsCollector(meter, threadPool, config));
83-
jobs.add(new ListenerMetricsCollector(meter));
84-
jobs.add(new TopicMetricsCollector(meter));
85-
jobs.add(new ReadConfigurationEventQueueCollector(meter));
86-
jobs.add(new PerformanceEventQueueCollector(meter));
87-
jobs.add(new QueueManagerEventCollector(meter));
72+
jobs.add(new QueueManagerMetricsCollector(producer));
73+
jobs.add(new InquireQueueManagerCmdCollector(producer));
74+
jobs.add(new ChannelMetricsCollector(producer));
75+
jobs.add(new InquireChannelCmdCollector(producer));
76+
jobs.add(new QueueMetricsCollector(producer, threadPool, config));
77+
jobs.add(new ListenerMetricsCollector(producer));
78+
jobs.add(new TopicMetricsCollector(producer));
79+
jobs.add(new ReadConfigurationEventQueueCollector(producer));
80+
jobs.add(new PerformanceEventQueueCollector(producer));
81+
jobs.add(new QueueManagerEventCollector(producer));
8882
}
8983

9084
public void run() {
@@ -115,12 +109,12 @@ public void run(QueueManager queueManager) {
115109
if (e.getCause() instanceof MQException) {
116110
MQException mqe = (MQException) e.getCause();
117111
String errorCode = String.valueOf(mqe.getReason());
118-
errorCodesCounter.add(
112+
producer.recordIbmMqConnectionErrors(
119113
1, Attributes.of(IBM_MQ_QUEUE_MANAGER, queueManagerName, ERROR_CODE, errorCode));
120114
}
121115
} finally {
122116
if (this.metricsConfig.isIbmMqHeartbeatEnabled()) {
123-
heartbeatGauge.set(
117+
producer.recordIbmMqHeartbeat(
124118
heartBeatMetricValue, Attributes.of(IBM_MQ_QUEUE_MANAGER, queueManagerName));
125119
}
126120
cleanUp(ibmQueueManager, agent);
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
/*
2+
* Copyright The OpenTelemetry Authors
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package io.opentelemetry.ibm.mq.metrics;
7+
8+
import com.google.auto.value.AutoValue;
9+
import io.opentelemetry.sdk.common.InstrumentationScopeInfo;
10+
import io.opentelemetry.sdk.metrics.data.Data;
11+
import io.opentelemetry.sdk.metrics.data.MetricDataType;
12+
import io.opentelemetry.sdk.resources.Resource;
13+
import javax.annotation.concurrent.Immutable;
14+
15+
@Immutable
16+
@AutoValue
17+
abstract class MetricData implements io.opentelemetry.sdk.metrics.data.MetricData {
18+
19+
static MetricData createMetricData(
20+
Resource resource,
21+
InstrumentationScopeInfo instrumentationScopeInfo,
22+
String name,
23+
String description,
24+
String unit,
25+
MetricDataType type,
26+
Data<?> data) {
27+
return new AutoValue_MetricData(
28+
resource, instrumentationScopeInfo, name, description, unit, type, data);
29+
}
30+
}

0 commit comments

Comments
 (0)