From d63f3ffcc1788436cf65b6134d44d8e4b4a0ec78 Mon Sep 17 00:00:00 2001 From: liqiangz Date: Mon, 28 Jun 2021 21:05:28 +0800 Subject: [PATCH] revert #7091 (#7189) --- CHANGES.md | 1 - apm-dist-es7/src/main/assembly/binary-es7.xml | 1 - apm-dist/src/main/assembly/binary.xml | 1 - .../concepts-and-designs/scope-definitions.md | 56 ++++ .../provider/jvm/JVMSourceDispatcher.java | 285 +++++++++--------- .../skywalking/oal/rt/grammar/OALLexer.g4 | 5 + .../skywalking/oal/rt/grammar/OALParser.g4 | 1 + oap-server/server-bootstrap/pom.xml | 1 - .../main/resources/jvm-metrics-rules/jvm.yaml | 61 ---- .../src/main/resources/oal/java-agent.oal | 31 ++ .../core/source/ServiceInstanceJVMCPU.java | 58 ++++ .../core/source/ServiceInstanceJVMGC.java | 64 ++++ .../core/source/ServiceInstanceJVMMemory.java | 70 +++++ .../source/ServiceInstanceJVMMemoryPool.java | 70 +++++ .../core/source/ServiceInstanceJVMThread.java | 64 ++++ .../kafka/provider/KafkaFetcherProvider.java | 12 +- .../provider/handler/JVMMetricsHandler.java | 13 +- .../handler/JVMMetricsHandlerTest.java | 31 +- .../jvm/provider/JVMModuleProvider.java | 16 +- .../receiver/jvm/provider/JVMOALDefine.java | 35 +++ .../JVMMetricReportServiceHandler.java | 13 +- 21 files changed, 652 insertions(+), 237 deletions(-) delete mode 100644 oap-server/server-bootstrap/src/main/resources/jvm-metrics-rules/jvm.yaml create mode 100644 oap-server/server-bootstrap/src/main/resources/oal/java-agent.oal create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMCPU.java create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMGC.java create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemory.java create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMMemoryPool.java create mode 100644 oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/source/ServiceInstanceJVMThread.java create mode 100644 oap-server/server-receiver-plugin/skywalking-jvm-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/jvm/provider/JVMOALDefine.java diff --git a/CHANGES.md b/CHANGES.md index 241505515..c0b1c7960 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -19,7 +19,6 @@ Release Notes. #### OAP-Backend * Disable Spring sleuth meter analyzer by default. -* Use MAL to calculate JVM metrics, remove OAL dependency. * Only count 5xx as error in Envoy ALS receiver. * Upgrade apollo core caused by CVE-2020-15170. * Upgrade kubernetes client caused by CVE-2020-28052. diff --git a/apm-dist-es7/src/main/assembly/binary-es7.xml b/apm-dist-es7/src/main/assembly/binary-es7.xml index 4e3e3f307..337217b65 100644 --- a/apm-dist-es7/src/main/assembly/binary-es7.xml +++ b/apm-dist-es7/src/main/assembly/binary-es7.xml @@ -67,7 +67,6 @@ ui-initialized-templates/* lal/* log-mal-rules/* - jvm-metrics-rules/*.yaml config diff --git a/apm-dist/src/main/assembly/binary.xml b/apm-dist/src/main/assembly/binary.xml index b78466a0f..562fe8b11 100644 --- a/apm-dist/src/main/assembly/binary.xml +++ b/apm-dist/src/main/assembly/binary.xml @@ -67,7 +67,6 @@ ui-initialized-templates/* lal/* log-mal-rules/* - jvm-metrics-rules/*.yaml config diff --git a/docs/en/concepts-and-designs/scope-definitions.md b/docs/en/concepts-and-designs/scope-definitions.md index 9be43de53..51b330a6d 100644 --- a/docs/en/concepts-and-designs/scope-definitions.md +++ b/docs/en/concepts-and-designs/scope-definitions.md @@ -52,6 +52,62 @@ 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 ca9586a7b..ad2d3600d 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,167 +18,182 @@ 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.meter.MeterSystem; +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.library.module.ModuleManager; @Slf4j public class JVMSourceDispatcher { + private final SourceReceiver sourceReceiver; - 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 JVMSourceDispatcher(ModuleManager moduleManager) { + this.sourceReceiver = moduleManager.find(CoreModule.NAME).provider().getService(SourceReceiver.class); } - 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); + public void sendMetric(String service, String serviceInstance, JVMMetric metrics) { + long minuteTimeBucket = TimeBucket.getMinuteTimeBucket(metrics.getTime()); - 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(); + final String serviceId = IDManager.ServiceID.buildId(service, NodeType.Normal); + final String serviceInstanceId = IDManager.ServiceInstanceID.buildId(serviceId, serviceInstance); - metricConverts.forEach(metricConvert -> metricConvert.toMeter(sampleFamilies)); + 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()); } - 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 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 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 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 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 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 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 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 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); + 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