diff --git a/agent-module/agent/src/main/resources/profiles/local/pinpoint.config b/agent-module/agent/src/main/resources/profiles/local/pinpoint.config
index f2470840ee29..7bc58ba4e24e 100644
--- a/agent-module/agent/src/main/resources/profiles/local/pinpoint.config
+++ b/agent-module/agent/src/main/resources/profiles/local/pinpoint.config
@@ -1430,4 +1430,13 @@ profiler.kotlin.coroutines.record.cancel=false
###########################################################
profiler.resilience4j.enable=true
profiler.resilience4j.trace.circuit-breaker=true
-profiler.resilience4j.mark.error.circuit-breaker=false
\ No newline at end of file
+profiler.resilience4j.mark.error.circuit-breaker=false
+
+###########################################################
+# Open telemetry metrics
+###########################################################
+profiler.micrometer.otlp.enabled=true
+profiler.micrometer.otlp.url=http://127.0.0.1:15200/opentelemetry
+profiler.micrometer.otlp.step=30s
+profiler.micrometer.otlp.batchSize=50
+
diff --git a/agent-module/agent/src/main/resources/profiles/release/pinpoint.config b/agent-module/agent/src/main/resources/profiles/release/pinpoint.config
index 509f2354e85a..405d1632e46a 100644
--- a/agent-module/agent/src/main/resources/profiles/release/pinpoint.config
+++ b/agent-module/agent/src/main/resources/profiles/release/pinpoint.config
@@ -1453,4 +1453,12 @@ profiler.kotlin.coroutines.record.cancel=false
###########################################################
profiler.resilience4j.enable=true
profiler.resilience4j.trace.circuit-breaker=true
-profiler.resilience4j.mark.error.circuit-breaker=false
\ No newline at end of file
+profiler.resilience4j.mark.error.circuit-breaker=false
+
+###########################################################
+# Open telemetry metrics
+###########################################################
+profiler.micrometer.otlp.enabled=true
+profiler.micrometer.otlp.url=http://127.0.0.1:15200/opentelemetry
+profiler.micrometer.otlp.step=30s
+profiler.micrometer.otlp.batchSize=50
diff --git a/agent-module/profiler/pom.xml b/agent-module/profiler/pom.xml
index 19ed0cfcc3d0..142e10f39015 100644
--- a/agent-module/profiler/pom.xml
+++ b/agent-module/profiler/pom.xml
@@ -167,11 +167,15 @@
-->
-
org.mapstruct
mapstruct
+
+ io.micrometer
+ micrometer-registry-otlp
+ 1.9.2
+
diff --git a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/monitor/config/DefaultMonitorConfig.java b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/monitor/config/DefaultMonitorConfig.java
index feca0c35d876..ee3f197f6976 100644
--- a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/monitor/config/DefaultMonitorConfig.java
+++ b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/monitor/config/DefaultMonitorConfig.java
@@ -17,7 +17,7 @@
package com.navercorp.pinpoint.profiler.context.monitor.config;
import com.navercorp.pinpoint.common.config.Value;
-
+import com.navercorp.pinpoint.common.util.StringUtils;
public class DefaultMonitorConfig implements MonitorConfig {
public static final int DEFAULT_AGENT_STAT_COLLECTION_INTERVAL_MS = 5 * 1000;
@@ -49,6 +49,50 @@ public class DefaultMonitorConfig implements MonitorConfig {
@Value("${profiler.jvm.stat.collect.detailed.metrics}")
private boolean profilerJvmStatCollectDetailedMetrics = false;
+ @Value("${profiler.micrometer.otlp.enabled}")
+ private boolean micrometerEnable = false;
+
+ @Value("${profiler.micrometer.otlp.url}")
+ private String micrometerUrl;
+
+ @Value("${profiler.micrometer.otlp.step}")
+ private String micrometerStep;
+
+ @Value("${profiler.micrometer.otlp.batchSize}")
+ private String micrometerBatchSize;
+
+ @Value("${pinpoint.applicationName}")
+ private String applicationName;
+
+ @Value("${pinpoint.agentId}")
+ private String agentId;
+
+ public DefaultMonitorConfig() {
+ if (StringUtils.isEmpty(agentId)) {
+ agentId = System.getProperty("pinpoint.agentId");
+ }
+ if (StringUtils.isEmpty(applicationName)) {
+ applicationName = System.getProperty("pinpoint.applicationName");
+ }
+ }
+
+ @Override
+ public boolean isMicrometerEnable() { return micrometerEnable; }
+
+ @Override
+ public String getMicrometerUrl() { return micrometerUrl; }
+
+ @Override
+ public String getMicrometerStep() { return micrometerStep; }
+
+ @Override
+ public String getMicrometerBatchSize() { return micrometerBatchSize; }
+
+ @Override
+ public String getApplicationName() { return applicationName; }
+
+ public String getAgentId() { return agentId;}
+
@Override
public int getProfileJvmStatCollectIntervalMs() {
return profileJvmStatCollectIntervalMs;
@@ -118,6 +162,12 @@ public String toString() {
", profileJvmStatCollectIntervalMs=" + profileJvmStatCollectIntervalMs +
", profileJvmStatBatchSendCount=" + profileJvmStatBatchSendCount +
", profilerJvmStatCollectDetailedMetrics=" + profilerJvmStatCollectDetailedMetrics +
+ ", micrometerEnable=" + micrometerEnable +
+ ", micrometerUrl=" + micrometerUrl +
+ ", micrometerStep=" + micrometerStep +
+ ", micrometerBatchSize=" + micrometerBatchSize +
+ ", micrometerHostName=" + agentId +
+ ", micrometerHostGroupName=" + applicationName +
'}';
}
}
diff --git a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/monitor/config/MonitorConfig.java b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/monitor/config/MonitorConfig.java
index 2b8e5cd263f0..ddde6dcdab2e 100644
--- a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/monitor/config/MonitorConfig.java
+++ b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/context/monitor/config/MonitorConfig.java
@@ -39,4 +39,16 @@ public interface MonitorConfig {
int getCompletedUriStatDataLimitSize();
+ boolean isMicrometerEnable();
+
+ String getMicrometerUrl();
+
+ String getMicrometerStep();
+
+ String getMicrometerBatchSize();
+
+ String getApplicationName();
+
+ String getAgentId();
+
}
diff --git a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/monitor/DefaultAgentStatMonitor.java b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/monitor/DefaultAgentStatMonitor.java
index 33aaf3ef5fce..7286c009868d 100644
--- a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/monitor/DefaultAgentStatMonitor.java
+++ b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/monitor/DefaultAgentStatMonitor.java
@@ -33,6 +33,7 @@
import com.navercorp.pinpoint.profiler.monitor.collector.AgentStatMetricCollector;
import com.navercorp.pinpoint.profiler.monitor.metric.AgentStatMetricSnapshot;
import com.navercorp.pinpoint.profiler.monitor.metric.MetricType;
+import com.navercorp.pinpoint.profiler.monitor.micrometer.MicrometerCollectingJob;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -105,6 +106,11 @@ public DefaultAgentStatMonitor(@StatDataSender DataSender dataSender
runnableList.add(uriStatCollectingJob);
}
+ if (monitorConfig.isMicrometerEnable()) {
+ new MicrometerCollectingJob(monitorConfig.getMicrometerUrl(), monitorConfig.getMicrometerStep(),
+ monitorConfig.getMicrometerBatchSize(), monitorConfig.getApplicationName(), monitorConfig.getAgentId());
+ }
+
this.statMonitorJob = new StatMonitorJob(runnableList);
preLoadClass(agentId, agentStartTimestamp, agentStatCollector);
diff --git a/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/monitor/micrometer/MicrometerCollectingJob.java b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/monitor/micrometer/MicrometerCollectingJob.java
new file mode 100644
index 000000000000..561c5472b2aa
--- /dev/null
+++ b/agent-module/profiler/src/main/java/com/navercorp/pinpoint/profiler/monitor/micrometer/MicrometerCollectingJob.java
@@ -0,0 +1,71 @@
+/*
+ * Copyright 2017 NAVER Corp.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package com.navercorp.pinpoint.profiler.monitor.micrometer;
+
+import io.micrometer.core.instrument.Clock;
+import io.micrometer.core.instrument.binder.jvm.*;
+import io.micrometer.core.instrument.binder.system.DiskSpaceMetrics;
+import io.micrometer.core.instrument.binder.system.FileDescriptorMetrics;
+import io.micrometer.core.instrument.binder.system.ProcessorMetrics;
+import io.micrometer.core.instrument.binder.system.UptimeMetrics;
+import io.micrometer.registry.otlp.OtlpConfig;
+import io.micrometer.registry.otlp.OtlpMeterRegistry;
+import org.apache.logging.log4j.LogManager;
+import org.apache.logging.log4j.Logger;
+
+import java.io.File;
+import java.util.Properties;
+
+public class MicrometerCollectingJob {
+
+ private final Logger logger = LogManager.getLogger(this.getClass());
+
+ private final OtlpMeterRegistry meterRegistry;
+
+ public MicrometerCollectingJob(String micrometerUrl, String micrometerStep, String micrometerBatchSize, String applicationName, String agentId) {
+ this.meterRegistry = new OtlpMeterRegistry(getOtlpConfig(micrometerUrl, micrometerStep, micrometerBatchSize, "", applicationName, agentId), Clock.SYSTEM);
+ bindMetrics();
+ }
+
+ private void bindMetrics() {
+ // jvm
+ new ClassLoaderMetrics().bindTo(meterRegistry);
+ new JvmCompilationMetrics().bindTo(meterRegistry);
+ new JvmGcMetrics().bindTo(meterRegistry);
+ new JvmHeapPressureMetrics().bindTo(meterRegistry);
+ new JvmInfoMetrics().bindTo(meterRegistry);
+ new JvmMemoryMetrics().bindTo(meterRegistry);
+ new JvmThreadMetrics().bindTo(meterRegistry);
+
+ // system
+ new DiskSpaceMetrics(new File("/")).bindTo(meterRegistry); // add other paths with user input?
+ new FileDescriptorMetrics().bindTo(meterRegistry);
+ new ProcessorMetrics().bindTo(meterRegistry);
+ new UptimeMetrics().bindTo(meterRegistry);
+ }
+
+ private OtlpConfig getOtlpConfig(String micrometerUrl, String micrometerStep, String micrometerBatchSize,
+ String serviceName, String applicationName, String agentId) {
+ Properties propertiesConfig = new Properties();
+ propertiesConfig.put("otlp.url", micrometerUrl);
+ propertiesConfig.put("otlp.step", String.valueOf(micrometerStep));
+ propertiesConfig.put("otlp.batchSize", String.valueOf(micrometerBatchSize));
+ propertiesConfig.put("otlp.resourceAttributes", "service.namespace=" + serviceName + ",service.name=" + applicationName + ",pinpoint.agentId=" + agentId);
+ OtlpConfig otlpConfig = (key -> (String) propertiesConfig.get(key));
+ return otlpConfig;
+ }
+}
\ No newline at end of file