diff --git a/CHANGES.md b/CHANGES.md
index 56409f0ea..9b28d50f0 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -12,6 +12,7 @@ Release Notes.
#### OAP-Backend
* Disable Spring sleuth meter analyzer by default.
+* Use MAL to calculate JVM metrics, remove OAL dependency.
#### UI
diff --git a/apm-dist-es7/src/main/assembly/binary-es7.xml b/apm-dist-es7/src/main/assembly/binary-es7.xml
index 337217b65..4e3e3f307 100644
--- a/apm-dist-es7/src/main/assembly/binary-es7.xml
+++ b/apm-dist-es7/src/main/assembly/binary-es7.xml
@@ -67,6 +67,7 @@
ui-initialized-templates/*lal/*log-mal-rules/*
+ jvm-metrics-rules/*.yamlconfig
diff --git a/apm-dist/src/main/assembly/binary.xml b/apm-dist/src/main/assembly/binary.xml
index 562fe8b11..b78466a0f 100644
--- a/apm-dist/src/main/assembly/binary.xml
+++ b/apm-dist/src/main/assembly/binary.xml
@@ -67,6 +67,7 @@
ui-initialized-templates/*lal/*log-mal-rules/*
+ jvm-metrics-rules/*.yamlconfig
diff --git a/docs/en/concepts-and-designs/scope-definitions.md b/docs/en/concepts-and-designs/scope-definitions.md
index cc7518ff8..0bdb725c4 100644
--- a/docs/en/concepts-and-designs/scope-definitions.md
+++ b/docs/en/concepts-and-designs/scope-definitions.md
@@ -52,62 +52,6 @@ This calculates the metrics data from each request of the service instance.
| tcpInfo.receivedBytes | The received bytes of the TCP traffic, if this request is a TCP call. | | long |
| tcpInfo.sentBytes | The sent bytes of the TCP traffic, if this request is a TCP call. | | long |
-#### Secondary scopes of `ServiceInstance`
-
-This calculates the metrics data if the service instance is a JVM and collects through javaagent.
-
-1. SCOPE `ServiceInstanceJVMCPU`
-
-| Name | Remarks | Group Key | Type |
-|---|---|---|---|
-| name | The name of the service instance, such as `ip:port@Service Name`. **Note**: Currently, the native agent uses `uuid@ipv4` as the instance name, which does not assist in setting up a filter in aggregation. | | string|
-| serviceName | The name of the service. | | string |
-| usePercent | The percentage of CPU time spent.| | double|
-
-2. SCOPE `ServiceInstanceJVMMemory`
-
-| Name | Remarks | Group Key | Type |
-|---|---|---|---|
-| name | The name of the service instance, such as `ip:port@Service Name`. **Note**: Currently, the native agent uses `uuid@ipv4` as the instance name, which does not assist in setting up a filter in aggregation. | | string|
-| serviceName | The name of the service. | | string |
-| heapStatus | Indicates whether the metric has a heap property or not. | | bool |
-| init | See the JVM documentation. | | long |
-| max | See the JVM documentation. | | long |
-| used | See the JVM documentation. | | long |
-| committed | See the JVM documentation. | | long |
-
-3. SCOPE `ServiceInstanceJVMMemoryPool`
-
-| Name | Remarks | Group Key | Type |
-|---|---|---|---|
-| name | The name of the service instance, such as `ip:port@Service Name`. **Note**: Currently, the native agent uses `uuid@ipv4` as the instance name, which does not assist in setting up a filter in aggregation. | | string|
-| serviceName | The name of the service. | | string |
-| poolType | The type may be CODE_CACHE_USAGE, NEWGEN_USAGE, OLDGEN_USAGE, SURVIVOR_USAGE, PERMGEN_USAGE, or METASPACE_USAGE based on different versions of JVM. | | enum |
-| init | See the JVM documentation. | | long |
-| max | See the JVM documentation. | | long |
-| used | See the JVM documentation. | | long |
-| committed | See the JVM documentation. | | long |
-
-4. SCOPE `ServiceInstanceJVMGC`
-
-| Name | Remarks | Group Key | Type |
-|---|---|---|---|
-| name | The name of the service instance, such as `ip:port@Service Name`. **Note**: Currently, the native agent uses `uuid@ipv4` as the instance name, which does not assist in setting up a filter in aggregation. | | string|
-| serviceName | The name of the service. | | string |
-| phrase | Includes both NEW and OLD. | | Enum |
-| time | The time spent in GC. | | long |
-| count | The count in GC operations. | | long |
-
-5. SCOPE `ServiceInstanceJVMThread`
-
-| Name | Remarks | Group Key | Type |
-|---|---|---|---|
-| name | The name of the service instance, such as `ip:port@Service Name`. **Note**: Currently, the native agent uses `uuid@ipv4` as the instance name, which does not assist in setting up a filter in aggregation. | | string|
-| serviceName | The name of the service. | | string |
-| liveCount | The current number of live threads. | | int |
-| daemonCount | The current number of daemon threads. | | int |
-| peakCount | The current number of peak threads. | | int |
-
### SCOPE `Endpoint`
This calculates the metrics data from each request of the endpoint in the service.
diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/jvm/JVMSourceDispatcher.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/jvm/JVMSourceDispatcher.java
index f1ab7b955..ca9586a7b 100644
--- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/jvm/JVMSourceDispatcher.java
+++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/jvm/JVMSourceDispatcher.java
@@ -18,182 +18,167 @@
package org.apache.skywalking.oap.server.analyzer.provider.jvm;
+import java.util.Arrays;
+import java.util.Collection;
import java.util.List;
+import java.util.stream.Collectors;
+import java.util.Collections;
+
+import com.google.common.collect.ImmutableMap;
import lombok.extern.slf4j.Slf4j;
-import org.apache.skywalking.apm.network.common.v3.CPU;
import org.apache.skywalking.apm.network.language.agent.v3.GC;
import org.apache.skywalking.apm.network.language.agent.v3.JVMMetric;
import org.apache.skywalking.apm.network.language.agent.v3.Memory;
import org.apache.skywalking.apm.network.language.agent.v3.MemoryPool;
import org.apache.skywalking.apm.network.language.agent.v3.Thread;
+import org.apache.skywalking.oap.meter.analyzer.MetricConvert;
+import org.apache.skywalking.oap.meter.analyzer.dsl.Sample;
+import org.apache.skywalking.oap.meter.analyzer.dsl.SampleFamily;
+import org.apache.skywalking.oap.meter.analyzer.dsl.SampleFamilyBuilder;
+import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rule;
+import org.apache.skywalking.oap.server.analyzer.provider.meter.process.SampleBuilder;
import org.apache.skywalking.oap.server.core.CoreModule;
-import org.apache.skywalking.oap.server.core.analysis.IDManager;
-import org.apache.skywalking.oap.server.core.analysis.NodeType;
-import org.apache.skywalking.oap.server.core.analysis.TimeBucket;
-import org.apache.skywalking.oap.server.core.source.GCPhrase;
-import org.apache.skywalking.oap.server.core.source.MemoryPoolType;
-import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMCPU;
-import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMGC;
-import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMMemory;
-import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMMemoryPool;
-import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMThread;
-import org.apache.skywalking.oap.server.core.source.SourceReceiver;
+import org.apache.skywalking.oap.server.core.analysis.meter.MeterSystem;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
@Slf4j
public class JVMSourceDispatcher {
- private final SourceReceiver sourceReceiver;
- public JVMSourceDispatcher(ModuleManager moduleManager) {
- this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class);
+ private final List metricConverts;
+
+ public JVMSourceDispatcher(ModuleManager moduleManager, List rules) {
+ this.metricConverts = rules.stream()
+ .map(it -> new MetricConvert(it, moduleManager.find(CoreModule.NAME).provider().getService(MeterSystem.class)))
+ .collect(Collectors.toList());
}
- public void sendMetric(String service, String serviceInstance, JVMMetric metrics) {
- long minuteTimeBucket = TimeBucket.getMinuteTimeBucket(metrics.getTime());
+ public void sendMetric(String service, String serviceInstance, JVMMetric jvmMetric) {
+ List cpuSamples = Collections.singletonList(parseCpuData(service, serviceInstance, jvmMetric));
+ List memorySamples = parseMemoryData(service, serviceInstance, jvmMetric);
+ List memoryPoolSamples = parseMemoryPollData(service, serviceInstance, jvmMetric);
+ List gcCountSamples = parseGcCountData(service, serviceInstance, jvmMetric);
+ List gcTimeSamples = parseGcTimeData(service, serviceInstance, jvmMetric);
+ List threadSamples = parseThreadData(service, serviceInstance, jvmMetric);
- final String serviceId = IDManager.ServiceID.buildId(service, NodeType.Normal);
- final String serviceInstanceId = IDManager.ServiceInstanceID.buildId(serviceId, serviceInstance);
+ ImmutableMap sampleFamilies = ImmutableMap.builder()
+ .put("sw_jvm_gc_time", SampleFamilyBuilder.newBuilder(gcTimeSamples.toArray(new Sample[0])).build())
+ .put("sw_jvm_gc_count", SampleFamilyBuilder.newBuilder(gcCountSamples.toArray(new Sample[0])).build())
+ .put("sw_jvm_cpu", SampleFamilyBuilder.newBuilder(cpuSamples.toArray(new Sample[0])).build())
+ .put("sw_jvm_thread", SampleFamilyBuilder.newBuilder(threadSamples.toArray(new Sample[0])).build())
+ .put("sw_jvm_memory", SampleFamilyBuilder.newBuilder(memorySamples.toArray(new Sample[0])).build())
+ .put("sw_jvm_memory_poll", SampleFamilyBuilder.newBuilder(memoryPoolSamples.toArray(new Sample[0])).build())
+ .build();
- this.sendToCpuMetricProcess(
- service, serviceId, serviceInstance, serviceInstanceId, minuteTimeBucket, metrics.getCpu());
- this.sendToMemoryMetricProcess(
- service, serviceId, serviceInstance, serviceInstanceId, minuteTimeBucket, metrics.getMemoryList());
- this.sendToMemoryPoolMetricProcess(
- service, serviceId, serviceInstance, serviceInstanceId, minuteTimeBucket, metrics.getMemoryPoolList());
- this.sendToGCMetricProcess(
- service, serviceId, serviceInstance, serviceInstanceId, minuteTimeBucket, metrics.getGcList());
- this.sendToThreadMetricProcess(
- service, serviceId, serviceInstance, serviceInstanceId, minuteTimeBucket, metrics.getThread());
+ metricConverts.forEach(metricConvert -> metricConvert.toMeter(sampleFamilies));
}
- private void sendToCpuMetricProcess(String service,
- String serviceId,
- String serviceInstance,
- String serviceInstanceId,
- long timeBucket,
- CPU cpu) {
- ServiceInstanceJVMCPU serviceInstanceJVMCPU = new ServiceInstanceJVMCPU();
- serviceInstanceJVMCPU.setId(serviceInstanceId);
- serviceInstanceJVMCPU.setName(serviceInstance);
- serviceInstanceJVMCPU.setServiceId(serviceId);
- serviceInstanceJVMCPU.setServiceName(service);
- // If the cpu usage percent is less than 1, will set to 1
- double adjustedCpuUsagePercent = Math.max(cpu.getUsagePercent(), 1.0);
- serviceInstanceJVMCPU.setUsePercent(adjustedCpuUsagePercent);
- serviceInstanceJVMCPU.setTimeBucket(timeBucket);
- sourceReceiver.receive(serviceInstanceJVMCPU);
+ private List parseThreadData(String service, String serviceInstance, JVMMetric jvmMetric) {
+ Thread thread = jvmMetric.getThread();
+ return Arrays.asList(
+ buildThreadSample(thread.getDaemonCount(), "daemon", service, serviceInstance, jvmMetric.getTime()),
+ buildThreadSample(thread.getLiveCount(), "live", service, serviceInstance, jvmMetric.getTime()),
+ buildThreadSample(thread.getPeakCount(), "peak", service, serviceInstance, jvmMetric.getTime())
+ );
}
- private void sendToGCMetricProcess(String service,
- String serviceId,
- String serviceInstance,
- String serviceInstanceId,
- long timeBucket,
- List gcs) {
- gcs.forEach(gc -> {
- ServiceInstanceJVMGC serviceInstanceJVMGC = new ServiceInstanceJVMGC();
- serviceInstanceJVMGC.setId(serviceInstanceId);
- serviceInstanceJVMGC.setName(serviceInstance);
- serviceInstanceJVMGC.setServiceId(serviceId);
- serviceInstanceJVMGC.setServiceName(service);
-
- switch (gc.getPhrase()) {
- case NEW:
- serviceInstanceJVMGC.setPhrase(GCPhrase.NEW);
- break;
- case OLD:
- serviceInstanceJVMGC.setPhrase(GCPhrase.OLD);
- break;
- }
-
- serviceInstanceJVMGC.setTime(gc.getTime());
- serviceInstanceJVMGC.setCount(gc.getCount());
- serviceInstanceJVMGC.setTimeBucket(timeBucket);
- sourceReceiver.receive(serviceInstanceJVMGC);
- });
+ private List parseGcCountData(String service, String serviceInstance, JVMMetric jvmMetric) {
+ return jvmMetric.getGcList().stream().map(gc ->
+ buildGcSample(gc, gc.getCount(), "sw_jvm_gc_count", service, serviceInstance, jvmMetric.getTime())
+ ).collect(Collectors.toList());
}
- private void sendToMemoryMetricProcess(String service,
- String serviceId,
- String serviceInstance,
- String serviceInstanceId,
- long timeBucket,
- List memories) {
- memories.forEach(memory -> {
- ServiceInstanceJVMMemory serviceInstanceJVMMemory = new ServiceInstanceJVMMemory();
- serviceInstanceJVMMemory.setId(serviceInstanceId);
- serviceInstanceJVMMemory.setName(serviceInstance);
- serviceInstanceJVMMemory.setServiceId(serviceId);
- serviceInstanceJVMMemory.setServiceName(service);
- serviceInstanceJVMMemory.setHeapStatus(memory.getIsHeap());
- serviceInstanceJVMMemory.setInit(memory.getInit());
- serviceInstanceJVMMemory.setMax(memory.getMax());
- serviceInstanceJVMMemory.setUsed(memory.getUsed());
- serviceInstanceJVMMemory.setCommitted(memory.getCommitted());
- serviceInstanceJVMMemory.setTimeBucket(timeBucket);
- sourceReceiver.receive(serviceInstanceJVMMemory);
- });
+ private List parseGcTimeData(String service, String serviceInstance, JVMMetric jvmMetric) {
+ return jvmMetric.getGcList().stream().map(gc ->
+ buildGcSample(gc, gc.getTime(), "sw_jvm_gc_time", service, serviceInstance, jvmMetric.getTime())
+ ).collect(Collectors.toList());
}
- private void sendToMemoryPoolMetricProcess(String service,
- String serviceId,
- String serviceInstance,
- String serviceInstanceId,
- long timeBucket,
- List memoryPools) {
-
- memoryPools.forEach(memoryPool -> {
- ServiceInstanceJVMMemoryPool serviceInstanceJVMMemoryPool = new ServiceInstanceJVMMemoryPool();
- serviceInstanceJVMMemoryPool.setId(serviceInstanceId);
- serviceInstanceJVMMemoryPool.setName(serviceInstance);
- serviceInstanceJVMMemoryPool.setServiceId(serviceId);
- serviceInstanceJVMMemoryPool.setServiceName(service);
-
- switch (memoryPool.getType()) {
- case NEWGEN_USAGE:
- serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.NEWGEN_USAGE);
- break;
- case OLDGEN_USAGE:
- serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.OLDGEN_USAGE);
- break;
- case PERMGEN_USAGE:
- serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.PERMGEN_USAGE);
- break;
- case SURVIVOR_USAGE:
- serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.SURVIVOR_USAGE);
- break;
- case METASPACE_USAGE:
- serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.METASPACE_USAGE);
- break;
- case CODE_CACHE_USAGE:
- serviceInstanceJVMMemoryPool.setPoolType(MemoryPoolType.CODE_CACHE_USAGE);
- break;
- }
-
- serviceInstanceJVMMemoryPool.setInit(memoryPool.getInit());
- serviceInstanceJVMMemoryPool.setMax(memoryPool.getMax());
- serviceInstanceJVMMemoryPool.setUsed(memoryPool.getUsed());
- serviceInstanceJVMMemoryPool.setCommitted(memoryPool.getCommitted());
- serviceInstanceJVMMemoryPool.setTimeBucket(timeBucket);
- sourceReceiver.receive(serviceInstanceJVMMemoryPool);
- });
+ private Sample parseCpuData(String service, String serviceInstance, JVMMetric jvmMetric) {
+ SampleBuilder.SampleBuilderBuilder sampleBuilderBuilder = SampleBuilder.builder();
+ double adjustedCpuUsagePercent = Math.max(jvmMetric.getCpu().getUsagePercent(), 1.0);
+ sampleBuilderBuilder.name("sw_jvm_cpu");
+ sampleBuilderBuilder.value(adjustedCpuUsagePercent);
+ sampleBuilderBuilder.labels(ImmutableMap.builder().build());
+ return sampleBuilderBuilder.build().build(service, serviceInstance, jvmMetric.getTime());
}
- private void sendToThreadMetricProcess(String service,
- String serviceId,
- String serviceInstance,
- String serviceInstanceId,
- long timeBucket,
- Thread thread) {
- ServiceInstanceJVMThread serviceInstanceJVMThread = new ServiceInstanceJVMThread();
- serviceInstanceJVMThread.setId(serviceInstanceId);
- serviceInstanceJVMThread.setName(serviceInstance);
- serviceInstanceJVMThread.setServiceId(serviceId);
- serviceInstanceJVMThread.setServiceName(service);
- serviceInstanceJVMThread.setLiveCount(thread.getLiveCount());
- serviceInstanceJVMThread.setDaemonCount(thread.getDaemonCount());
- serviceInstanceJVMThread.setPeakCount(thread.getPeakCount());
- serviceInstanceJVMThread.setTimeBucket(timeBucket);
- sourceReceiver.receive(serviceInstanceJVMThread);
+ private List parseMemoryData(String service, String serviceInstance, JVMMetric jvmMetric) {
+ return jvmMetric.getMemoryList().stream().map(memory -> Arrays.asList(
+ buildMemorySample(memory, memory.getInit(), "init", service, serviceInstance, jvmMetric.getTime()),
+ buildMemorySample(memory, memory.getMax(), "max", service, serviceInstance, jvmMetric.getTime()),
+ buildMemorySample(memory, memory.getCommitted(), "committed", service, serviceInstance, jvmMetric.getTime()),
+ buildMemorySample(memory, memory.getUsed(), "used", service, serviceInstance, jvmMetric.getTime())
+ )).flatMap(Collection::stream).collect(Collectors.toList());
+ }
+
+ private List parseMemoryPollData(String service, String serviceInstance, JVMMetric jvmMetric) {
+ return jvmMetric.getMemoryPoolList().stream().map(memoryPool -> Arrays.asList(
+ buildMemoryPoolSample(memoryPool, memoryPool.getInit(), "init", service, serviceInstance, jvmMetric.getTime()),
+ buildMemoryPoolSample(memoryPool, memoryPool.getMax(), "max", service, serviceInstance, jvmMetric.getTime()),
+ buildMemoryPoolSample(memoryPool, memoryPool.getCommitted(), "committed", service, serviceInstance, jvmMetric.getTime()),
+ buildMemoryPoolSample(memoryPool, memoryPool.getUsed(), "used", service, serviceInstance, jvmMetric.getTime())
+ )).flatMap(Collection::stream).collect(Collectors.toList());
+ }
+
+ private Sample buildGcSample(GC gc, long value, String name, String service, String serviceInstance, long time) {
+ SampleBuilder.SampleBuilderBuilder sampleBuilderBuilder = SampleBuilder.builder();
+ sampleBuilderBuilder.name(name);
+ sampleBuilderBuilder.value(value);
+ switch (gc.getPhrase()) {
+ case NEW:
+ sampleBuilderBuilder.labels(ImmutableMap.of("gc_phrase", "new"));
+ break;
+ case OLD:
+ sampleBuilderBuilder.labels(ImmutableMap.of("gc_phrase", "old"));
+ break;
+ default:
+ }
+ return sampleBuilderBuilder.build().build(service, serviceInstance, time);
+ }
+
+ private Sample buildThreadSample(long value, String threadType, String service, String serviceInstance, long time) {
+ SampleBuilder.SampleBuilderBuilder sampleBuilderBuilder = SampleBuilder.builder();
+ sampleBuilderBuilder.name("sw_jvm_thread");
+ sampleBuilderBuilder.value(value);
+ sampleBuilderBuilder.labels(ImmutableMap.of("thread_type", threadType));
+ return sampleBuilderBuilder.build().build(service, serviceInstance, time);
+ }
+
+ private Sample buildMemorySample(Memory memory, long value, String memoryType, String service, String serviceInstance, long time) {
+ SampleBuilder.SampleBuilderBuilder sampleBuilderBuilder = SampleBuilder.builder();
+ sampleBuilderBuilder.name("sw_jvm_memory");
+ sampleBuilderBuilder.labels(ImmutableMap.of("heap_status", String.valueOf(memory.getIsHeap()), "memory_type", memoryType));
+ sampleBuilderBuilder.value(value);
+ return sampleBuilderBuilder.build().build(service, serviceInstance, time);
+ }
+
+ private Sample buildMemoryPoolSample(MemoryPool memoryPool, long value, String memoryType, String service, String serviceInstance, long time) {
+ SampleBuilder.SampleBuilderBuilder sampleBuilderBuilder = SampleBuilder.builder();
+ sampleBuilderBuilder.name("sw_jvm_memory_poll");
+ sampleBuilderBuilder.value(value);
+ String pollType = "poll_type";
+ String memoryTypeKey = "memory_type";
+ switch (memoryPool.getType()) {
+ case NEWGEN_USAGE:
+ sampleBuilderBuilder.labels(ImmutableMap.of(pollType, "memoryTypeKey", memoryTypeKey, memoryType));
+ break;
+ case OLDGEN_USAGE:
+ sampleBuilderBuilder.labels(ImmutableMap.of(pollType, "oldgenUsage", memoryTypeKey, memoryType));
+ break;
+ case PERMGEN_USAGE:
+ sampleBuilderBuilder.labels(ImmutableMap.of(pollType, "permgenUsage", memoryTypeKey, memoryType));
+ break;
+ case SURVIVOR_USAGE:
+ sampleBuilderBuilder.labels(ImmutableMap.of(pollType, "survivorUsage", memoryTypeKey, memoryType));
+ break;
+ case METASPACE_USAGE:
+ sampleBuilderBuilder.labels(ImmutableMap.of(pollType, "metaspaceUsage", memoryTypeKey, memoryType));
+ break;
+ case CODE_CACHE_USAGE:
+ sampleBuilderBuilder.labels(ImmutableMap.of(pollType, "codeCacheUsage", memoryTypeKey, memoryType));
+ break;
+ default:
+ }
+ return sampleBuilderBuilder.build().build(service, serviceInstance, time);
}
}
diff --git a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4 b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4
index 8c3acdd8a..86830f20f 100644
--- a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4
+++ b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALLexer.g4
@@ -34,11 +34,6 @@ SRC_ENDPOINT: 'Endpoint';
SRC_SERVICE_RELATION: 'ServiceRelation';
SRC_SERVICE_INSTANCE_RELATION: 'ServiceInstanceRelation';
SRC_ENDPOINT_RELATION: 'EndpointRelation';
-SRC_SERVICE_INSTANCE_JVM_CPU: 'ServiceInstanceJVMCPU';
-SRC_SERVICE_INSTANCE_JVM_MEMORY: 'ServiceInstanceJVMMemory';
-SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL: 'ServiceInstanceJVMMemoryPool';
-SRC_SERVICE_INSTANCE_JVM_GC: 'ServiceInstanceJVMGC';
-SRC_SERVICE_INSTANCE_JVM_THREAD: 'ServiceInstanceJVMThread';
SRC_DATABASE_ACCESS: 'DatabaseAccess';
SRC_SERVICE_INSTANCE_CLR_CPU: 'ServiceInstanceCLRCPU';
SRC_SERVICE_INSTANCE_CLR_GC: 'ServiceInstanceCLRGC';
diff --git a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4 b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4
index 71b030a9d..08f40087c 100644
--- a/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4
+++ b/oap-server/oal-grammar/src/main/antlr4/org/apache/skywalking/oal/rt/grammar/OALParser.g4
@@ -52,7 +52,6 @@ filterExpression
source
: SRC_ALL | SRC_SERVICE | SRC_DATABASE_ACCESS | SRC_SERVICE_INSTANCE | SRC_ENDPOINT |
SRC_SERVICE_RELATION | SRC_SERVICE_INSTANCE_RELATION | SRC_ENDPOINT_RELATION |
- SRC_SERVICE_INSTANCE_JVM_CPU | SRC_SERVICE_INSTANCE_JVM_MEMORY | SRC_SERVICE_INSTANCE_JVM_MEMORY_POOL | SRC_SERVICE_INSTANCE_JVM_GC | SRC_SERVICE_INSTANCE_JVM_THREAD |// JVM source of service instance
SRC_SERVICE_INSTANCE_CLR_CPU | SRC_SERVICE_INSTANCE_CLR_GC | SRC_SERVICE_INSTANCE_CLR_THREAD |
SRC_ENVOY_INSTANCE_METRIC |
SRC_BROWSER_APP_PERF | SRC_BROWSER_APP_PAGE_PERF | SRC_BROWSER_APP_SINGLE_VERSION_PERF |
diff --git a/oap-server/server-bootstrap/pom.xml b/oap-server/server-bootstrap/pom.xml
index e9dbccada..dd0c38233 100644
--- a/oap-server/server-bootstrap/pom.xml
+++ b/oap-server/server-bootstrap/pom.xml
@@ -285,6 +285,7 @@
zabbix-rules/lal/log-mal-rules/
+ jvm-metrics-rules/
diff --git a/oap-server/server-bootstrap/src/main/resources/jvm-metrics-rules/jvm.yaml b/oap-server/server-bootstrap/src/main/resources/jvm-metrics-rules/jvm.yaml
new file mode 100644
index 000000000..1aeb7bb3d
--- /dev/null
+++ b/oap-server/server-bootstrap/src/main/resources/jvm-metrics-rules/jvm.yaml
@@ -0,0 +1,61 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You 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.
+
+# This will parse a textual representation of a duration. The formats
+# accepted are based on the ISO-8601 duration format {@code PnDTnHnMn.nS}
+# with days considered to be exactly 24 hours.
+#
+# Examples:
+#
+# "PT20.345S" -- parses as "20.345 seconds"
+# "PT15M" -- parses as "15 minutes" (where a minute is 60 seconds)
+# "PT10H" -- parses as "10 hours" (where an hour is 3600 seconds)
+# "P2D" -- parses as "2 days" (where a day is 24 hours or 86400 seconds)
+# "P2DT3H4M" -- parses as "2 days, 3 hours and 4 minutes"
+# "P-6H3M" -- parses as "-6 hours and +3 minutes"
+# "-P6H3M" -- parses as "-6 hours and -3 minutes"
+# "-P-6H+3M" -- parses as "+6 hours and -3 minutes"
+#
+expSuffix: instance(['service'], ['instance'])
+metricPrefix: instance_jvm
+metricsRules:
+ - name: cpu
+ exp: sw_jvm_cpu
+
+ - name: memory_heap
+ exp: sw_jvm_memory.tagEqual('memory_type', 'used', 'heap_status', 'true').avg(['service', 'instance'])
+ - name: memory_noheap
+ exp: sw_jvm_memory.tagEqual('memory_type', 'used', 'heap_status', 'false').avg(['service', 'instance'])
+ - name: memory_heap_max
+ exp: sw_jvm_memory.tagEqual('memory_type', 'max', 'heap_status', 'true').avg(['service', 'instance'])
+ - name: memory_noheap_max
+ exp: sw_jvm_memory.tagEqual('memory_type', 'max', 'heap_status', 'false').avg(['service', 'instance'])
+
+ - name: young_gc_time
+ exp: sw_jvm_gc_time.tagEqual('gc_phrase', 'new').sum(['service', 'instance'])
+ - name: old_gc_time
+ exp: sw_jvm_gc_time.tagEqual('gc_phrase', 'old').sum(['service', 'instance'])
+
+ - name: young_gc_count
+ exp: sw_jvm_gc_count.tagEqual('gc_phrase', 'new').sum(['service', 'instance'])
+ - name: old_gc_count
+ exp: sw_jvm_gc_count.tagEqual('gc_phrase', 'old').sum(['service', 'instance'])
+
+ - name: thread_live_count
+ exp: sw_jvm_thread.tagEqual('thread_type', 'live').avg(['service', 'instance'])
+ - name: thread_daemon_count
+ exp: sw_jvm_thread.tagEqual('thread_type', 'daemon').avg(['service', 'instance'])
+ - name: thread_peak_count
+ exp: sw_jvm_thread.tagEqual('thread_type', 'peak').avg(['service', 'instance'])
diff --git a/oap-server/server-bootstrap/src/main/resources/oal/java-agent.oal b/oap-server/server-bootstrap/src/main/resources/oal/java-agent.oal
deleted file mode 100644
index ca344605f..000000000
--- a/oap-server/server-bootstrap/src/main/resources/oal/java-agent.oal
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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.
- *
- */
-
-// JVM instance metrics
-instance_jvm_cpu = from(ServiceInstanceJVMCPU.usePercent).doubleAvg();
-instance_jvm_memory_heap = from(ServiceInstanceJVMMemory.used).filter(heapStatus == true).longAvg();
-instance_jvm_memory_noheap = from(ServiceInstanceJVMMemory.used).filter(heapStatus == false).longAvg();
-instance_jvm_memory_heap_max = from(ServiceInstanceJVMMemory.max).filter(heapStatus == true).longAvg();
-instance_jvm_memory_noheap_max = from(ServiceInstanceJVMMemory.max).filter(heapStatus == false).longAvg();
-instance_jvm_young_gc_time = from(ServiceInstanceJVMGC.time).filter(phrase == GCPhrase.NEW).sum();
-instance_jvm_old_gc_time = from(ServiceInstanceJVMGC.time).filter(phrase == GCPhrase.OLD).sum();
-instance_jvm_young_gc_count = from(ServiceInstanceJVMGC.count).filter(phrase == GCPhrase.NEW).sum();
-instance_jvm_old_gc_count = from(ServiceInstanceJVMGC.count).filter(phrase == GCPhrase.OLD).sum();
-instance_jvm_thread_live_count = from(ServiceInstanceJVMThread.liveCount).longAvg();
-instance_jvm_thread_daemon_count = from(ServiceInstanceJVMThread.daemonCount).longAvg();
-instance_jvm_thread_peak_count = from(ServiceInstanceJVMThread.peakCount).longAvg();
\ No newline at end of file
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java
deleted file mode 100644
index 58c99255d..000000000
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.skywalking.oap.server.core.source;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_CATALOG_NAME;
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_JVM_CPU;
-
-@ScopeDeclaration(id = SERVICE_INSTANCE_JVM_CPU, name = "ServiceInstanceJVMCPU", catalog = SERVICE_INSTANCE_CATALOG_NAME)
-@ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class)
-public class ServiceInstanceJVMCPU extends Source {
- @Override
- public int scope() {
- return DefaultScopeDefine.SERVICE_INSTANCE_JVM_CPU;
- }
-
- @Override
- public String getEntityId() {
- return String.valueOf(id);
- }
-
- @Getter
- @Setter
- private String id;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "name", requireDynamicActive = true)
- private String name;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "service_name", requireDynamicActive = true)
- private String serviceName;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "service_id")
- private String serviceId;
- @Getter
- @Setter
- private double usePercent;
-}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java
deleted file mode 100644
index 64a4dd8bc..000000000
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.skywalking.oap.server.core.source;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_CATALOG_NAME;
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_JVM_GC;
-
-@ScopeDeclaration(id = SERVICE_INSTANCE_JVM_GC, name = "ServiceInstanceJVMGC", catalog = SERVICE_INSTANCE_CATALOG_NAME)
-@ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class)
-public class ServiceInstanceJVMGC extends Source {
- @Override
- public int scope() {
- return DefaultScopeDefine.SERVICE_INSTANCE_JVM_GC;
- }
-
- @Override
- public String getEntityId() {
- return String.valueOf(id);
- }
-
- @Getter
- @Setter
- private String id;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "name", requireDynamicActive = true)
- private String name;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "service_name", requireDynamicActive = true)
- private String serviceName;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "service_id")
- private String serviceId;
- @Getter
- @Setter
- private GCPhrase phrase;
- @Getter
- @Setter
- private long time;
- @Getter
- @Setter
- private long count;
-}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java
deleted file mode 100644
index ea715012f..000000000
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.skywalking.oap.server.core.source;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_CATALOG_NAME;
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_JVM_MEMORY;
-
-@ScopeDeclaration(id = SERVICE_INSTANCE_JVM_MEMORY, name = "ServiceInstanceJVMMemory", catalog = SERVICE_INSTANCE_CATALOG_NAME)
-@ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class)
-public class ServiceInstanceJVMMemory extends Source {
- @Override
- public int scope() {
- return DefaultScopeDefine.SERVICE_INSTANCE_JVM_MEMORY;
- }
-
- @Override
- public String getEntityId() {
- return String.valueOf(id);
- }
-
- @Getter
- @Setter
- private String id;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "name", requireDynamicActive = true)
- private String name;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "service_name", requireDynamicActive = true)
- private String serviceName;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "service_id")
- private String serviceId;
- @Getter
- @Setter
- private boolean heapStatus;
- @Getter
- @Setter
- private long init;
- @Getter
- @Setter
- private long max;
- @Getter
- @Setter
- private long used;
- @Getter
- @Setter
- private long committed;
-}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java
deleted file mode 100644
index 193fbc1a8..000000000
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.skywalking.oap.server.core.source;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_CATALOG_NAME;
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_JVM_MEMORY_POOL;
-
-@ScopeDeclaration(id = SERVICE_INSTANCE_JVM_MEMORY_POOL, name = "ServiceInstanceJVMMemoryPool", catalog = SERVICE_INSTANCE_CATALOG_NAME)
-@ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class)
-public class ServiceInstanceJVMMemoryPool extends Source {
- @Override
- public int scope() {
- return DefaultScopeDefine.SERVICE_INSTANCE_JVM_MEMORY_POOL;
- }
-
- @Override
- public String getEntityId() {
- return String.valueOf(id);
- }
-
- @Getter
- @Setter
- private String id;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "name", requireDynamicActive = true)
- private String name;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "service_name", requireDynamicActive = true)
- private String serviceName;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "service_id")
- private String serviceId;
- @Getter
- @Setter
- private MemoryPoolType poolType;
- @Getter
- @Setter
- private long init;
- @Getter
- @Setter
- private long max;
- @Getter
- @Setter
- private long used;
- @Getter
- @Setter
- private long committed;
-}
diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMThread.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMThread.java
deleted file mode 100644
index 42ee6a2e2..000000000
--- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMThread.java
+++ /dev/null
@@ -1,64 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.skywalking.oap.server.core.source;
-
-import lombok.Getter;
-import lombok.Setter;
-
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_CATALOG_NAME;
-import static org.apache.skywalking.oap.server.core.source.DefaultScopeDefine.SERVICE_INSTANCE_JVM_THREAD;
-
-@ScopeDeclaration(id = SERVICE_INSTANCE_JVM_THREAD, name = "ServiceInstanceJVMThread", catalog = SERVICE_INSTANCE_CATALOG_NAME)
-@ScopeDefaultColumn.VirtualColumnDefinition(fieldName = "entityId", columnName = "entity_id", isID = true, type = String.class)
-public class ServiceInstanceJVMThread extends Source {
- @Override
- public int scope() {
- return SERVICE_INSTANCE_JVM_THREAD;
- }
-
- @Override
- public String getEntityId() {
- return String.valueOf(id);
- }
-
- @Getter
- @Setter
- private String id;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "name", requireDynamicActive = true)
- private String name;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "service_name", requireDynamicActive = true)
- private String serviceName;
- @Getter
- @Setter
- @ScopeDefaultColumn.DefinedByField(columnName = "service_id")
- private String serviceId;
- @Getter
- @Setter
- private long liveCount;
- @Getter
- @Setter
- private long daemonCount;
- @Getter
- @Setter
- private long peakCount;
-}
diff --git a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/KafkaFetcherProvider.java b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/KafkaFetcherProvider.java
index 94be3913f..d187bdafe 100644
--- a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/KafkaFetcherProvider.java
+++ b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/KafkaFetcherProvider.java
@@ -20,6 +20,8 @@ package org.apache.skywalking.oap.server.analyzer.agent.kafka.provider;
import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.oap.log.analyzer.module.LogAnalyzerModule;
+import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rule;
+import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rules;
import org.apache.skywalking.oap.server.analyzer.agent.kafka.KafkaFetcherHandlerRegister;
import org.apache.skywalking.oap.server.analyzer.agent.kafka.module.KafkaFetcherConfig;
import org.apache.skywalking.oap.server.analyzer.agent.kafka.module.KafkaFetcherModule;
@@ -39,6 +41,9 @@ import org.apache.skywalking.oap.server.library.module.ModuleStartException;
import org.apache.skywalking.oap.server.library.module.ServiceNotProvidedException;
import org.apache.skywalking.oap.server.telemetry.TelemetryModule;
+import java.util.Collections;
+import java.util.List;
+
@Slf4j
public class KafkaFetcherProvider extends ModuleProvider {
private KafkaFetcherHandlerRegister handlerRegister;
@@ -69,8 +74,9 @@ public class KafkaFetcherProvider extends ModuleProvider {
}
@Override
- public void start() throws ServiceNotProvidedException {
- handlerRegister.register(new JVMMetricsHandler(getManager(), config));
+ public void start() throws ServiceNotProvidedException, ModuleStartException {
+ List rules = Rules.loadRules("jvm-metrics-rules", Collections.singletonList("jvm"));
+ handlerRegister.register(new JVMMetricsHandler(getManager(), config, rules));
handlerRegister.register(new ServiceManagementHandler(getManager(), config));
handlerRegister.register(new TraceSegmentHandler(getManager(), config));
handlerRegister.register(new ProfileTaskHandler(getManager(), config));
diff --git a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/JVMMetricsHandler.java b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/JVMMetricsHandler.java
index 0a5365f5d..55e3780c8 100644
--- a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/JVMMetricsHandler.java
+++ b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/main/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/JVMMetricsHandler.java
@@ -22,6 +22,7 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.common.utils.Bytes;
import org.apache.skywalking.apm.network.language.agent.v3.JVMMetricCollection;
+import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rule;
import org.apache.skywalking.oap.server.analyzer.agent.kafka.module.KafkaFetcherConfig;
import org.apache.skywalking.oap.server.analyzer.provider.jvm.JVMSourceDispatcher;
import org.apache.skywalking.oap.server.core.CoreModule;
@@ -34,6 +35,8 @@ import org.apache.skywalking.oap.server.telemetry.api.HistogramMetrics.Timer;
import org.apache.skywalking.oap.server.telemetry.api.MetricsCreator;
import org.apache.skywalking.oap.server.telemetry.api.MetricsTag;
+import java.util.List;
+
/**
* A handler deserializes the message of JVM Metrics and pushes it to downstream.
*/
@@ -47,9 +50,9 @@ public class JVMMetricsHandler extends AbstractKafkaHandler {
private final HistogramMetrics histogramBatch;
private final CounterMetrics errorCounter;
- public JVMMetricsHandler(ModuleManager manager, KafkaFetcherConfig config) {
+ public JVMMetricsHandler(ModuleManager manager, KafkaFetcherConfig config, List rules) {
super(manager, config);
- this.jvmSourceDispatcher = new JVMSourceDispatcher(manager);
+ this.jvmSourceDispatcher = new JVMSourceDispatcher(manager, rules);
this.namingLengthControl = manager.find(CoreModule.NAME)
.provider()
.getService(NamingControl.class);
diff --git a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/test/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/JVMMetricsHandlerTest.java b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/test/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/JVMMetricsHandlerTest.java
index 8ac4824f2..4d56a56c6 100644
--- a/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/test/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/JVMMetricsHandlerTest.java
+++ b/oap-server/server-fetcher-plugin/kafka-fetcher-plugin/src/test/java/org/apache/skywalking/oap/server/analyzer/agent/kafka/provider/handler/JVMMetricsHandlerTest.java
@@ -19,7 +19,8 @@
package org.apache.skywalking.oap.server.analyzer.agent.kafka.provider.handler;
import com.google.common.collect.Lists;
-import java.util.List;
+
+import java.util.ArrayList;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.common.utils.Bytes;
import org.apache.skywalking.apm.network.common.v3.CPU;
@@ -31,12 +32,6 @@ import org.apache.skywalking.apm.network.language.agent.v3.MemoryPool;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.config.NamingControl;
import org.apache.skywalking.oap.server.core.config.group.EndpointNameGrouping;
-import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMCPU;
-import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMGC;
-import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMMemory;
-import org.apache.skywalking.oap.server.core.source.ServiceInstanceJVMMemoryPool;
-import org.apache.skywalking.oap.server.core.source.Source;
-import org.apache.skywalking.oap.server.core.source.SourceReceiver;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.analyzer.agent.kafka.module.KafkaFetcherConfig;
import org.apache.skywalking.oap.server.analyzer.agent.kafka.mock.MockModuleManager;
@@ -46,11 +41,8 @@ import org.apache.skywalking.oap.server.telemetry.api.MetricsCreator;
import org.apache.skywalking.oap.server.telemetry.none.MetricsCreatorNoop;
import org.junit.Assert;
import org.junit.Before;
-import org.junit.ClassRule;
import org.junit.Test;
-import static org.hamcrest.CoreMatchers.is;
-
public class JVMMetricsHandlerTest {
private static final String TOPIC_NAME = "skywalking-metrics";
private JVMMetricsHandler handler = null;
@@ -58,20 +50,6 @@ public class JVMMetricsHandlerTest {
private ModuleManager manager;
- @ClassRule
- public static SourceReceiverRule SOURCE_RECEIVER = new SourceReceiverRule() {
-
- @Override
- protected void verify(final List sourceList) throws Throwable {
- Assert.assertTrue(sourceList.get(0) instanceof ServiceInstanceJVMCPU);
- ServiceInstanceJVMCPU serviceInstanceJVMCPU = (ServiceInstanceJVMCPU) sourceList.get(0);
- Assert.assertThat(serviceInstanceJVMCPU.getUsePercent(), is(1.0));
- Assert.assertTrue(sourceList.get(1) instanceof ServiceInstanceJVMMemory);
- Assert.assertTrue(sourceList.get(2) instanceof ServiceInstanceJVMMemoryPool);
- Assert.assertTrue(sourceList.get(3) instanceof ServiceInstanceJVMGC);
- }
- };
-
@Before
public void setup() {
manager = new MockModuleManager() {
@@ -82,7 +60,6 @@ public class JVMMetricsHandlerTest {
protected void register() {
registerServiceImplementation(NamingControl.class, new NamingControl(
512, 512, 512, new EndpointNameGrouping()));
- registerServiceImplementation(SourceReceiver.class, SOURCE_RECEIVER);
}
});
register(TelemetryModule.NAME, () -> new MockModuleProvider() {
@@ -93,7 +70,7 @@ public class JVMMetricsHandlerTest {
});
}
};
- handler = new JVMMetricsHandler(manager, config);
+ handler = new JVMMetricsHandler(manager, config, new ArrayList<>());
}
@Test
diff --git a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java
index 202f9e8be..a55159b75 100644
--- a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java
+++ b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMModuleProvider.java
@@ -18,8 +18,9 @@
package org.apache.skywalking.oap.server.receiver.jvm.provider;
+import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rule;
+import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rules;
import org.apache.skywalking.oap.server.core.CoreModule;
-import org.apache.skywalking.oap.server.core.oal.rt.OALEngineLoaderService;
import org.apache.skywalking.oap.server.core.server.GRPCHandlerRegister;
import org.apache.skywalking.oap.server.library.module.ModuleConfig;
import org.apache.skywalking.oap.server.library.module.ModuleDefine;
@@ -30,6 +31,9 @@ import org.apache.skywalking.oap.server.receiver.jvm.provider.handler.JVMMetricR
import org.apache.skywalking.oap.server.receiver.jvm.provider.handler.JVMMetricReportServiceHandlerCompat;
import org.apache.skywalking.oap.server.receiver.sharing.server.SharingServerModule;
+import java.util.Collections;
+import java.util.List;
+
public class JVMModuleProvider extends ModuleProvider {
@Override
@@ -53,16 +57,12 @@ public class JVMModuleProvider extends ModuleProvider {
@Override
public void start() throws ModuleStartException {
- // load official analysis
- getManager().find(CoreModule.NAME)
- .provider()
- .getService(OALEngineLoaderService.class)
- .load(JVMOALDefine.INSTANCE);
+ List rules = Rules.loadRules("jvm-metrics-rules", Collections.singletonList("jvm"));
+ JVMMetricReportServiceHandler jvmMetricReportServiceHandler = new JVMMetricReportServiceHandler(getManager(), rules);
GRPCHandlerRegister grpcHandlerRegister = getManager().find(SharingServerModule.NAME)
.provider()
.getService(GRPCHandlerRegister.class);
- JVMMetricReportServiceHandler jvmMetricReportServiceHandler = new JVMMetricReportServiceHandler(getManager());
grpcHandlerRegister.addHandler(jvmMetricReportServiceHandler);
grpcHandlerRegister.addHandler(new JVMMetricReportServiceHandlerCompat(jvmMetricReportServiceHandler));
}
diff --git a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMOALDefine.java b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMOALDefine.java
deleted file mode 100644
index 0ff62ae3b..000000000
--- a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMOALDefine.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one or more
- * contributor license agreements. See the NOTICE file distributed with
- * this work for additional information regarding copyright ownership.
- * The ASF licenses this file to You 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 org.apache.skywalking.oap.server.receiver.jvm.provider;
-
-import org.apache.skywalking.oap.server.core.oal.rt.OALDefine;
-
-/**
- * JVM OAl script includes the metrics related to JVM only.
- */
-public class JVMOALDefine extends OALDefine {
- public static final JVMOALDefine INSTANCE = new JVMOALDefine();
-
- private JVMOALDefine() {
- super(
- "oal/java-agent.oal",
- "org.apache.skywalking.oap.server.core.source"
- );
- }
-}
diff --git a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricReportServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricReportServiceHandler.java
index f39d0057b..8ba14bb5d 100644
--- a/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricReportServiceHandler.java
+++ b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/handler/JVMMetricReportServiceHandler.java
@@ -23,19 +23,23 @@ import lombok.extern.slf4j.Slf4j;
import org.apache.skywalking.apm.network.common.v3.Commands;
import org.apache.skywalking.apm.network.language.agent.v3.JVMMetricCollection;
import org.apache.skywalking.apm.network.language.agent.v3.JVMMetricReportServiceGrpc;
+import org.apache.skywalking.oap.meter.analyzer.prometheus.rule.Rule;
import org.apache.skywalking.oap.server.analyzer.provider.jvm.JVMSourceDispatcher;
import org.apache.skywalking.oap.server.core.CoreModule;
import org.apache.skywalking.oap.server.core.config.NamingControl;
import org.apache.skywalking.oap.server.library.module.ModuleManager;
import org.apache.skywalking.oap.server.library.server.grpc.GRPCHandler;
+import java.util.List;
+
@Slf4j
public class JVMMetricReportServiceHandler extends JVMMetricReportServiceGrpc.JVMMetricReportServiceImplBase implements GRPCHandler {
- private final JVMSourceDispatcher jvmSourceDispatcher;
private final NamingControl namingControl;
- public JVMMetricReportServiceHandler(ModuleManager moduleManager) {
- this.jvmSourceDispatcher = new JVMSourceDispatcher(moduleManager);
+ private final JVMSourceDispatcher jvmSourceDispatcher;
+
+ public JVMMetricReportServiceHandler(ModuleManager moduleManager, List rules) {
+ this.jvmSourceDispatcher = new JVMSourceDispatcher(moduleManager, rules);
this.namingControl = moduleManager.find(CoreModule.NAME)
.provider()
.getService(NamingControl.class);
@@ -61,5 +65,4 @@ public class JVMMetricReportServiceHandler extends JVMMetricReportServiceGrpc.JV
responseObserver.onNext(Commands.newBuilder().build());
responseObserver.onCompleted();
}
-
}
diff --git a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/MetricsQuery.java b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/MetricsQuery.java
index e50d2f65f..7117760df 100644
--- a/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/MetricsQuery.java
+++ b/test/e2e/e2e-data/src/main/java/org/apache/skywalking/e2e/metrics/MetricsQuery.java
@@ -69,13 +69,19 @@ public class MetricsQuery extends AbstractQuery {
SERVICE_INSTANCE_SLA
};
+ public static String INSTANCE_JVM_MEMORY_HEAP = "instance_jvm_memory_heap";
+ public static String INSTANCE_JVM_MEMORY_HEAP_MAX = "instance_jvm_memory_heap_max";
+ public static String INSTANCE_JVM_MEMORY_NOHEAP = "instance_jvm_memory_noheap";
public static String INSTANCE_JVM_THREAD_LIVE_COUNT = "instance_jvm_thread_live_count";
public static String INSTANCE_JVM_THREAD_DAEMON_COUNT = "instance_jvm_thread_daemon_count";
public static String INSTANCE_JVM_THREAD_PEAK_COUNT = "instance_jvm_thread_peak_count";
public static String [] ALL_INSTANCE_JVM_METRICS = {
+ INSTANCE_JVM_THREAD_LIVE_COUNT,
INSTANCE_JVM_THREAD_DAEMON_COUNT,
- INSTANCE_JVM_THREAD_DAEMON_COUNT,
- INSTANCE_JVM_THREAD_PEAK_COUNT
+ INSTANCE_JVM_THREAD_PEAK_COUNT,
+ INSTANCE_JVM_MEMORY_NOHEAP,
+ INSTANCE_JVM_MEMORY_HEAP_MAX,
+ INSTANCE_JVM_MEMORY_HEAP,
};
public static String SERVICE_RELATION_CLIENT_CPM = "service_relation_client_cpm";
diff --git a/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java
index 09ab8461a..0a8065507 100644
--- a/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java
+++ b/test/e2e/e2e-test/src/test/java/org/apache/skywalking/e2e/simple/SimpleE2E.java
@@ -246,11 +246,11 @@ public class SimpleE2E extends SkyWalkingTestAdapter {
LOGGER.info("instance jvm metrics: {}", instanceJVMMetrics);
- final AtLeastOneOfMetricsMatcher instanceThreadMatcher = new AtLeastOneOfMetricsMatcher();
+ final AtLeastOneOfMetricsMatcher instanceMatcher = new AtLeastOneOfMetricsMatcher();
final MetricsValueMatcher greaterThanZero = new MetricsValueMatcher();
greaterThanZero.setValue("gt 0");
- instanceThreadMatcher.setValue(greaterThanZero);
- instanceThreadMatcher.verify(instanceJVMMetrics);
+ instanceMatcher.setValue(greaterThanZero);
+ instanceMatcher.verify(instanceJVMMetrics);
LOGGER.info("{}: {}", metricsName, instanceJVMMetrics);
}
}