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);
+ 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);
}
}
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 528676080..ea3976f64 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,6 +34,11 @@ 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 f8eef4246..337d0ab56 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
@@ -53,6 +53,7 @@ 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_CLR_CPU | SRC_SERVICE_INSTANCE_CLR_GC | SRC_SERVICE_INSTANCE_CLR_THREAD |
+ 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_ENVOY_INSTANCE_METRIC |
SRC_BROWSER_APP_PERF | SRC_BROWSER_APP_PAGE_PERF | SRC_BROWSER_APP_SINGLE_VERSION_PERF |
SRC_BROWSER_APP_TRAFFIC | SRC_BROWSER_APP_PAGE_TRAFFIC | SRC_BROWSER_APP_SINGLE_VERSION_TRAFFIC |
diff --git a/oap-server/server-bootstrap/pom.xml b/oap-server/server-bootstrap/pom.xml
index dd0c38233..e9dbccada 100644
--- a/oap-server/server-bootstrap/pom.xml
+++ b/oap-server/server-bootstrap/pom.xml
@@ -285,7 +285,6 @@
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
deleted file mode 100644
index 1aeb7bb3d..000000000
--- a/oap-server/server-bootstrap/src/main/resources/jvm-metrics-rules/jvm.yaml
+++ /dev/null
@@ -1,61 +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.
-
-# 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
new file mode 100644
index 000000000..ca344605f
--- /dev/null
+++ b/oap-server/server-bootstrap/src/main/resources/oal/java-agent.oal
@@ -0,0 +1,31 @@
+/*
+ * 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
new file mode 100644
index 000000000..58c99255d
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java
@@ -0,0 +1,58 @@
+/*
+ * 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
new file mode 100644
index 000000000..64a4dd8bc
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java
@@ -0,0 +1,64 @@
+/*
+ * 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
new file mode 100644
index 000000000..ea715012f
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java
@@ -0,0 +1,70 @@
+/*
+ * 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
new file mode 100644
index 000000000..193fbc1a8
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java
@@ -0,0 +1,70 @@
+/*
+ * 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
new file mode 100644
index 000000000..42ee6a2e2
--- /dev/null
+++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMThread.java
@@ -0,0 +1,64 @@
+/*
+ * 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 d187bdafe..697ec256d 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,8 +20,6 @@ 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;
@@ -41,9 +39,6 @@ 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;
@@ -74,9 +69,8 @@ public class KafkaFetcherProvider extends ModuleProvider {
}
@Override
- public void start() throws ServiceNotProvidedException, ModuleStartException {
- List rules = Rules.loadRules("jvm-metrics-rules", Collections.singletonList("jvm"));
- handlerRegister.register(new JVMMetricsHandler(getManager(), config, rules));
+ public void start() throws ServiceNotProvidedException {
+ handlerRegister.register(new JVMMetricsHandler(getManager(), config));
handlerRegister.register(new ServiceManagementHandler(getManager(), config));
handlerRegister.register(new TraceSegmentHandler(getManager(), config));
handlerRegister.register(new ProfileTaskHandler(getManager(), config));
@@ -108,4 +102,4 @@ public class KafkaFetcherProvider extends ModuleProvider {
};
}
-}
+}
\ No newline at end of file
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 55e3780c8..2eddb20d0 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,7 +22,6 @@ 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;
@@ -35,8 +34,6 @@ 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.
*/
@@ -50,12 +47,12 @@ public class JVMMetricsHandler extends AbstractKafkaHandler {
private final HistogramMetrics histogramBatch;
private final CounterMetrics errorCounter;
- public JVMMetricsHandler(ModuleManager manager, KafkaFetcherConfig config, List rules) {
+ public JVMMetricsHandler(ModuleManager manager, KafkaFetcherConfig config) {
super(manager, config);
- this.jvmSourceDispatcher = new JVMSourceDispatcher(manager, rules);
+ this.jvmSourceDispatcher = new JVMSourceDispatcher(manager);
this.namingLengthControl = manager.find(CoreModule.NAME)
- .provider()
- .getService(NamingControl.class);
+ .provider()
+ .getService(NamingControl.class);
MetricsCreator metricsCreator = manager.find(TelemetryModule.NAME)
.provider()
.getService(MetricsCreator.class);
@@ -112,4 +109,4 @@ public class JVMMetricsHandler extends AbstractKafkaHandler {
protected String getPlainTopic() {
return config.getTopicNameOfMetrics();
}
-}
+}
\ No newline at end of file
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 4d56a56c6..d21024a5b 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,8 +19,7 @@
package org.apache.skywalking.oap.server.analyzer.agent.kafka.provider.handler;
import com.google.common.collect.Lists;
-
-import java.util.ArrayList;
+import java.util.List;
import org.apache.kafka.clients.consumer.ConsumerRecord;
import org.apache.kafka.common.utils.Bytes;
import org.apache.skywalking.apm.network.common.v3.CPU;
@@ -32,6 +31,12 @@ 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.ISource;
+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.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;
@@ -41,8 +46,11 @@ 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;
@@ -50,6 +58,20 @@ 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() {
@@ -60,6 +82,7 @@ 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() {
@@ -70,7 +93,7 @@ public class JVMMetricsHandlerTest {
});
}
};
- handler = new JVMMetricsHandler(manager, config, new ArrayList<>());
+ handler = new JVMMetricsHandler(manager, config);
}
@Test
@@ -97,4 +120,4 @@ public class JVMMetricsHandlerTest {
handler.handle(new ConsumerRecord<>(TOPIC_NAME, 0, 0, "", Bytes.wrap(metrics.toByteArray())));
}
-}
+}
\ No newline at end of file
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 a55159b75..c51902b38 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,9 +18,8 @@
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;
@@ -31,9 +30,6 @@ 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
@@ -57,12 +53,16 @@ public class JVMModuleProvider extends ModuleProvider {
@Override
public void start() throws ModuleStartException {
- List rules = Rules.loadRules("jvm-metrics-rules", Collections.singletonList("jvm"));
- JVMMetricReportServiceHandler jvmMetricReportServiceHandler = new JVMMetricReportServiceHandler(getManager(), rules);
+ // load official analysis
+ getManager().find(CoreModule.NAME)
+ .provider()
+ .getService(OALEngineLoaderService.class)
+ .load(JVMOALDefine.INSTANCE);
GRPCHandlerRegister grpcHandlerRegister = getManager().find(SharingServerModule.NAME)
.provider()
.getService(GRPCHandlerRegister.class);
+ JVMMetricReportServiceHandler jvmMetricReportServiceHandler = new JVMMetricReportServiceHandler(getManager());
grpcHandlerRegister.addHandler(jvmMetricReportServiceHandler);
grpcHandlerRegister.addHandler(new JVMMetricReportServiceHandlerCompat(jvmMetricReportServiceHandler));
}
@@ -79,4 +79,4 @@ public class JVMModuleProvider extends ModuleProvider {
SharingServerModule.NAME
};
}
-}
+}
\ No newline at end of file
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
new file mode 100644
index 000000000..0ff62ae3b
--- /dev/null
+++ b/oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMOALDefine.java
@@ -0,0 +1,35 @@
+/*
+ * 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 8ba14bb5d..dcda0b8b5 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,23 +23,19 @@ 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;
- private final JVMSourceDispatcher jvmSourceDispatcher;
-
- public JVMMetricReportServiceHandler(ModuleManager moduleManager, List rules) {
- this.jvmSourceDispatcher = new JVMSourceDispatcher(moduleManager, rules);
+ public JVMMetricReportServiceHandler(ModuleManager moduleManager) {
+ this.jvmSourceDispatcher = new JVMSourceDispatcher(moduleManager);
this.namingControl = moduleManager.find(CoreModule.NAME)
.provider()
.getService(NamingControl.class);
@@ -65,4 +61,5 @@ public class JVMMetricReportServiceHandler extends JVMMetricReportServiceGrpc.JV
responseObserver.onNext(Commands.newBuilder().build());
responseObserver.onCompleted();
}
-}
+
+}
\ No newline at end of file