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