extensionMetricMonitoring information

The official documentation

Source and Scope extension for new metrics

Case study:JVM ThreadincreaseMetrics 

Modify theThreadThe definition of

In apm – protocol/apm – network/SRC/main/proto/language – agent/JVMMetric proto agreement file cover message definition of Thread

message Thread {
  int64 liveCount = 1;
  int64 daemonCount = 2;
  int64 peakCount = 3;
  int64 deadlocked = 4;
  int64 monitorDeadlocked = 5;
  int64 newThreadCount = 7;
  int64 runnableThreadCount = 8;
  int64 blockedThreadCount = 9;
  int64 waitThreadCount = 10;
  int64 timeWaitThreadCount = 11;
  int64 terminatedThreadCount = 12;
}
Copy the code

Rebuild the APM-Network project

cd apm-protocol/apm-network
mvn clean package -DskipTests=true
Copy the code

PS: You can install the Protocol Buffer Editor plug-in to support the Protocol Buffer syntax

Modify theagent core 中 Thread MetricsThe provider class

Directly using the following code coverage org. Apache. Skywalking. Apm. Agent. The core. The JVM. Thread. ThreadProvider class

/* * 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.apm.agent.core.jvm.thread;

import java.lang.management.ManagementFactory;
import java.lang.management.ThreadInfo;
import java.lang.management.ThreadMXBean;
import java.util.Optional;

import org.apache.skywalking.apm.network.language.agent.v3.Thread;

public enum ThreadProvider {
    INSTANCE;
    private final ThreadMXBean threadMXBean;
    private static final long [] EMPTY_DEADLOCKED_THREADS = new long[0];

    ThreadProvider() {
        this.threadMXBean = ManagementFactory.getThreadMXBean();
    }

    public Thread getThreadMetrics(a) {
        int newThreadCount = 0;
        int runnableThreadCount = 0;
        int blockedThreadCount = 0;
        int waitThreadCount = 0;
        int timeWaitThreadCount = 0;
        int terminatedThreadCount = 0;

        // Increase the number of threads in the corresponding state based on the thread state information
        ThreadInfo[] threadInfos = threadMXBean.getThreadInfo(threadMXBean.getAllThreadIds());
        if(threadInfos ! =null) {
            for (ThreadInfo threadInfo : threadInfos) {
                if(threadInfo ! =null) {
                    switch (threadInfo.getThreadState()) {
                        case NEW:
                            newThreadCount++;
                            break;
                        case RUNNABLE:
                            runnableThreadCount++;
                            break;
                        case BLOCKED:
                            blockedThreadCount++;
                            break;
                        case WAITING:
                            waitThreadCount++;
                            break;
                        case TIMED_WAITING:
                            timeWaitThreadCount++;
                            break;
                        case TERMINATED:
                            terminatedThreadCount++;
                            break;
                        default:
                            break; }}else {
                    /* * If a thread of a given ID is not alive or does not exist, * the corresponding element in the returned array will, * contain null,because is mut exist ,so the thread is terminated */terminatedThreadCount++; }}}// The number of threads currently alive
        int threadCount = threadMXBean.getThreadCount();
        Deamon Number of threads
        int daemonThreadCount = threadMXBean.getDaemonThreadCount();
        // Peak number of threads
        int peakThreadCount = threadMXBean.getPeakThreadCount();
        int deadlocked = Optional.ofNullable(threadMXBean.findDeadlockedThreads())
                .orElse(EMPTY_DEADLOCKED_THREADS).length;
        int monitorDeadlocked = Optional.ofNullable(threadMXBean.findMonitorDeadlockedThreads())
                .orElse(EMPTY_DEADLOCKED_THREADS).length;
        // Build a Thread object to send Thread Metrics to the OAP
        returnThread.newBuilder().setLiveCount(threadCount) .setDaemonCount(daemonThreadCount) .setPeakCount(peakThreadCount) .setDeadlocked(deadlocked) .setMonitorDeadlocked(monitorDeadlocked) .setNewThreadCount(newThreadCount) .setRunnableThreadCount(runnableThreadCount) .setBlockedThreadCount(blockedThreadCount) .setWaitThreadCount(waitThreadCount) .setTimeWaitThreadCount(timeWaitThreadCount) .setTerminatedThreadCount(terminatedThreadCount) .build(); }}Copy the code

Modify theServiceInstanceJVMThread 

Directly using the following code coverage org. Apache. Skywalking. Oap. Server. The core source. ServiceInstanceJVMThread class, ServiceInstanceJVMThread inherits the Source abstract class, which is the OAL system, resource, and scope definition in Skywalking.

/* * 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(a) {
        return SERVICE_INSTANCE_JVM_THREAD;
    }

    @Override
    public String getEntityId(a) {
        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;
    @Getter
    @Setter
    private long deadlocked;
    @Getter
    @Setter
    private long monitorDeadlocked;
    @Getter
    @Setter
    private long newThreadCount;
    @Getter
    @Setter
    private long runnableThreadCount;
    @Getter
    @Setter
    private long blockedThreadCount;
    @Getter
    @Setter
    private long waitThreadCount;
    @Getter
    @Setter
    private long timeWaitThreadCount;
    @Getter
    @Setter
    private long terminatedThreadCount;
}
Copy the code

Modify theJVMSourceDispatcher 

Org. Apache. Skywalking. Oap. Server analyzer. The provider. The JVM. JVMSourceDispatcher is a Source distribution, Split the JVM-related Metrics received from the Agent into corresponding sources. For example, ServiceInstanceJVMMemory and ServiceInstanceJVMThread. Modification method org. Apache. Skywalking. Oap. Server analyzer. The provider. The JVM. JVMSourceDispatcher# sendToThreadMetricProcess for code is as follows:

    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);
        serviceInstanceJVMThread.setDeadlocked(thread.getDeadlocked());
        serviceInstanceJVMThread.setMonitorDeadlocked(thread.getMonitorDeadlocked());
        serviceInstanceJVMThread.setNewThreadCount(thread.getNewThreadCount());
        serviceInstanceJVMThread.setRunnableThreadCount(thread.getRunnableThreadCount());
        serviceInstanceJVMThread.setBlockedThreadCount(thread.getBlockedThreadCount());
        serviceInstanceJVMThread.setWaitThreadCount(thread.getWaitThreadCount());
        serviceInstanceJVMThread.setTimeWaitThreadCount(thread.getTimeWaitThreadCount());
        serviceInstanceJVMThread.setTerminatedThreadCount(thread.getTerminatedThreadCount());
        sourceReceiver.receive(serviceInstanceJVMThread);
    }
Copy the code

injava-agent.oalAdd related indicators

The oap – server/server – the bootstrap/SRC/main/resources/oal/Java – agent. Add the following statement oal

/ / reference grammar oal instance_jvm_thread_deadlocked = the from (ServiceInstanceJVMThread. Deadlocked.) longAvg (); instance_jvm_thread_monitor_deadlocked = from(ServiceInstanceJVMThread.monitorDeadlocked).longAvg(); instance_jvm_thread_new_thread_count = from(ServiceInstanceJVMThread.newThreadCount).longAvg(); instance_jvm_thread_runnable_thread_count = from(ServiceInstanceJVMThread.runnableThreadCount).longAvg(); instance_jvm_thread_blocked_thread_count = from(ServiceInstanceJVMThread.blockedThreadCount).longAvg(); instance_jvm_thread_wait_thread_count = from(ServiceInstanceJVMThread.waitThreadCount).longAvg(); instance_jvm_thread_time_wait_thread_count = from(ServiceInstanceJVMThread.timeWaitThreadCount).longAvg(); instance_jvm_thread_terminated_thread_count = from(ServiceInstanceJVMThread.terminatedThreadCount).longAvg();Copy the code

Modify theapm.yml 

The oap – server/server – the bootstrap/SRC/main/resources/UI – an initialized – templates/apm. Yml file apm panel under the Instance item increase the following configuration

{
  "width": 3."title": "JVM Thread Count (Java Service)"."height": "250"."entityType": "ServiceInstance"."independentSelector": false."metricType": "REGULAR_VALUE"."queryMetricType": "readMetricsValues"."chartType": "ChartLine"."metricName": "instance_jvm_thread_live_count, instance_jvm_thread_daemon_count, instance_jvm_thread_peak_count,instance_jvm_thread_deadlocked,instance_jvm_thread_monitor_deadlocked"
},
{
  "width": 3."title": "JVM Thread State Count (Java Service)"."height": "250"."entityType": "ServiceInstance"."independentSelector": false."metricType": "REGULAR_VALUE"."metricName": "instance_jvm_thread_new_thread_count,instance_jvm_thread_runnable_thread_count,instance_jvm_thread_blocked_thread_count ,instance_jvm_thread_wait_thread_count,instance_jvm_thread_time_wait_thread_count,instance_jvm_thread_terminated_thread_ count"."queryMetricType": "readMetricsValues"."chartType": "ChartBar"
}
Copy the code

Add location if not clear, can directly use the following configuration, covering the oap – server/server – the bootstrap/SRC/main/resources/UI – an initialized – templates/apm. Yml

# 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 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.

# UI templates initialized file includes the default template when the SkyWalking OAP starts up at the first time.
#
# Also, SkyWalking would detect the existing templates in the database, once they are missing, all templates in this file
# could be added automatically.

templates:
  - name: "APM"
    # The type includes DASHBOARD, TOPOLOGY_INSTANCE, TOPOLOGY_ENDPOINT.
    # DASHBOARD type templates could have multiple definitions, by using different names.
    # TOPOLOGY_INSTANCE, TOPOLOGY_ENDPOINT type templates should be defined once, as they are used in the topology page only.
    type: "DASHBOARD"
    # Configuration could be defined through UI, and use `export` to format in the standard JSON.
    configuration: |-
      [
        {
          "name": "APM",
          "type": "service",
          "children": [
            {
              "name": "Global",
              "children": [
                {
                  "width": 3,
                  "title": "Services Load",
                  "height": "300",
                  "entityType": "Service",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_cpm",
                  "queryMetricType": "sortMetrics",
                  "chartType": "ChartSlow",
                  "parentService": false,
                  "unit": "CPM - calls per minute"
                },
                {
                  "width": 3,
                  "title": "Slow Services",
                  "height": "300",
                  "entityType": "Service",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_resp_time",
                  "queryMetricType": "sortMetrics",
                  "chartType": "ChartSlow",
                  "parentService": false,
                  "unit": "ms"
                },
                {
                  "width": 3,
                  "title": "Un-Health Services (Apdex)",
                  "height": "300",
                  "entityType": "Service",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_apdex",
                  "queryMetricType": "sortMetrics",
                  "chartType": "ChartSlow",
                  "parentService": false,
                  "aggregation": "/",
                  "aggregationNum": "10000",
                  "sortOrder": "ASC"
                },
                {
                  "width": 3,
                  "title": "Slow Endpoints",
                  "height": "300",
                  "entityType": "Endpoint",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "endpoint_avg",
                  "queryMetricType": "sortMetrics",
                  "chartType": "ChartSlow",
                  "parentService": false,
                  "unit": "ms"
                },
                {
                  "width": "6",
                  "title": "Global Response Latency",
                  "height": "280",
                  "entityType": "All",
                  "independentSelector": false,
                  "metricType": "LABELED_VALUE",
                  "metricName": "all_percentile",
                  "queryMetricType": "readLabeledMetricsValues",
                  "chartType": "ChartLine",
                  "metricLabels": "P50, P75, P90, P95, P99",
                  "labelsIndex": "0, 1, 2, 3, 4",
                  "unit": "percentile in ms"
                },
                {
                  "width": "6",
                  "title": "Global Heatmap",
                  "height": "280",
                  "entityType": "All",
                  "independentSelector": false,
                  "metricType": "HEATMAP",
                  "unit": "ms",
                  "queryMetricType": "readHeatMap",
                  "chartType": "ChartHeatmap",
                  "metricName": "all_heatmap"
                }
              ]
            },
            {
              "name": "Service",
              "children": [
                {
                  "width": 3,
                  "title": "Service Apdex",
                  "height": "200",
                  "entityType": "Service",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_apdex",
                  "queryMetricType": "readMetricsValue",
                  "chartType": "ChartNum",
                  "aggregation": "/",
                  "aggregationNum": "10000"
                },
                {
                  "width": 3,
                  "title": "Service Avg Response Time",
                  "height": "200",
                  "entityType": "Service",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_resp_time",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "ms"
                },
                {
                  "width": 3,
                  "title": "Successful Rate",
                  "height": "200",
                  "entityType": "Service",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_sla",
                  "queryMetricType": "readMetricsValue",
                  "chartType": "ChartNum",
                  "unit": "%",
                  "aggregation": "/",
                  "aggregationNum": "100"
                },
                {
                  "width": 3,
                  "title": "Service Load",
                  "height": "200",
                  "entityType": "Service",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_cpm",
                  "queryMetricType": "readMetricsValue",
                  "chartType": "ChartNum",
                  "unit": "CPM - calls per minute"
                },
                {
                  "width": 3,
                  "title": "Service Apdex",
                  "height": "200",
                  "entityType": "Service",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_apdex",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "aggregation": "/",
                  "aggregationNum": "10000"
                },
                {
                  "width": 3,
                  "title": "Service Response Time Percentile",
                  "height": "200",
                  "entityType": "Service",
                  "independentSelector": false,
                  "metricType": "LABELED_VALUE",
                  "metricName": "service_percentile",
                  "queryMetricType": "readLabeledMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "ms",
                  "metricLabels": "P50, P75, P90, P95, P99",
                  "labelsIndex": "0, 1, 2, 3, 4"
                },
                {
                  "width": 3,
                  "title": "Successful Rate",
                  "height": "200",
                  "entityType": "Service",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_sla",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "%",
                  "aggregation": "/",
                  "aggregationNum": "100"
                },
                {
                  "width": 3,
                  "title": "Service Load",
                  "height": "200",
                  "entityType": "Service",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_cpm",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "CPM - calls per minute"
                },
                {
                  "width": "4",
                  "title": "Service Instances Load",
                  "height": "280",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_instance_cpm",
                  "queryMetricType": "sortMetrics",
                  "chartType": "ChartSlow",
                  "parentService": true,
                  "unit": "CPM - calls per minute"
                },
                {
                  "width": "4",
                  "title": "Slow Service Instance",
                  "height": "280",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_instance_resp_time",
                  "queryMetricType": "sortMetrics",
                  "chartType": "ChartSlow",
                  "parentService": true,
                  "unit": "ms"
                },
                {
                  "width": "4",
                  "title": "Service Instance Successful Rate",
                  "height": "280",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_instance_sla",
                  "queryMetricType": "sortMetrics",
                  "chartType": "ChartSlow",
                  "parentService": true,
                  "unit": "%",
                  "aggregation": "/",
                  "aggregationNum": "100",
                  "sortOrder": "ASC"
                }
              ]
            },
            {
              "name": "Instance",
              "children": [
                {
                  "width": "3",
                  "title": "Service Instance Load",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_instance_cpm",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "CPM - calls per minute"
                },
                {
                  "width": 3,
                  "title": "Service Instance Throughput",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_instance_throughput_received,service_instance_throughput_sent",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "Bytes"
                },
                {
                  "width": "3",
                  "title": "Service Instance Successful Rate",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_instance_sla",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "%",
                  "aggregation": "/",
                  "aggregationNum": "100"
                },
                {
                  "width": "3",
                  "title": "Service Instance Latency",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "service_instance_resp_time",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "ms"
                },
                {
                  "width": 3,
                  "title": "JVM CPU (Java Service)",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "instance_jvm_cpu",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "%",
                  "aggregation": "+",
                  "aggregationNum": ""
                },
                {
                  "width": 3,
                  "title": "JVM Memory (Java Service)",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "instance_jvm_memory_heap, instance_jvm_memory_heap_max,instance_jvm_memory_noheap, instance_jvm_memory_noheap_max",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "MB",
                  "aggregation": "/",
                  "aggregationNum": "1048576"
                },
                {
                  "width": 3,
                  "title": "JVM GC Time",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "instance_jvm_young_gc_time, instance_jvm_old_gc_time",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "ms"
                },
                {
                  "width": 3,
                  "title": "JVM GC Count",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartBar",
                  "metricName": "instance_jvm_young_gc_count, instance_jvm_old_gc_count"
                },
                {
                  "width": 3,
                  "title": "JVM Thread Count (Java Service)",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "metricName": "instance_jvm_thread_live_count, instance_jvm_thread_daemon_count, instance_jvm_thread_peak_count,instance_jvm_thread_deadlocked,instance_jvm_thread_monitor_deadlocked"
                },
                {
                  "width": 3,
                  "title": "JVM Thread State Count (Java Service)",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "instance_jvm_thread_new_thread_count,instance_jvm_thread_runnable_thread_count,instance_jvm_thread_blocked_thread_count,instance_jvm_thread_wait_thread_count,instance_jvm_thread_time_wait_thread_count,instance_jvm_thread_terminated_thread_count",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartBar"
                },
                {
                  "width": 3,
                  "title": "CLR CPU  (.NET Service)",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "instance_clr_cpu",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "%"
                },
                {
                  "width": 3,
                  "title": "CLR GC (.NET Service)",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "instance_clr_gen0_collect_count, instance_clr_gen1_collect_count, instance_clr_gen2_collect_count",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartBar"
                },
                {
                  "width": 3,
                  "title": "CLR Heap Memory (.NET Service)",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "instance_clr_heap_memory",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "MB",
                  "aggregation": "/",
                  "aggregationNum": "1048576"
                },
                {
                  "width": 3,
                  "title": "CLR Thread (.NET Service)",
                  "height": "250",
                  "entityType": "ServiceInstance",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "metricName": "instance_clr_available_completion_port_threads,instance_clr_available_worker_threads,instance_clr_max_completion_port_threads,instance_clr_max_worker_threads"
                }
              ]
            },
            {
              "name": "Endpoint",
              "children": [
                {
                  "width": "4",
                  "title": "Endpoint Load in Current Service",
                  "height": "280",
                  "entityType": "Endpoint",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "endpoint_cpm",
                  "queryMetricType": "sortMetrics",
                  "chartType": "ChartSlow",
                  "parentService": true,
                  "unit": "CPM - calls per minute"
                },
                {
                  "width": "4",
                  "title": "Slow Endpoints in Current Service",
                  "height": "280",
                  "entityType": "Endpoint",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "queryMetricType": "sortMetrics",
                  "chartType": "ChartSlow",
                  "metricName": "endpoint_avg",
                  "unit": "ms",
                  "parentService": true
                },
                {
                  "width": "4",
                  "title": "Successful Rate in Current Service",
                  "height": "280",
                  "entityType": "Endpoint",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "endpoint_sla",
                  "queryMetricType": "sortMetrics",
                  "chartType": "ChartSlow",
                  "aggregation": "/",
                  "aggregationNum": "100",
                  "parentService": true,
                  "unit": "%",
                  "sortOrder": "ASC"
                },
                {
                  "width": 3,
                  "title": "Endpoint Load",
                  "height": 350,
                  "entityType": "Endpoint",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "endpoint_cpm",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine"
                },
                {
                  "width": 3,
                  "title": "Endpoint Avg Response Time",
                  "height": 350,
                  "entityType": "Endpoint",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "endpoint_avg",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "ms"
                },
                {
                  "width": 3,
                  "title": "Endpoint Response Time Percentile",
                  "height": 350,
                  "entityType": "Endpoint",
                  "independentSelector": false,
                  "metricType": "LABELED_VALUE",
                  "metricName": "endpoint_percentile",
                  "queryMetricType": "readLabeledMetricsValues",
                  "chartType": "ChartLine",
                  "metricLabels": "P50, P75, P90, P95, P99",
                  "labelsIndex": "0, 1, 2, 3, 4",
                  "unit": "ms"
                },
                {
                  "width": 3,
                  "title": "Endpoint Successful Rate",
                  "height": 350,
                  "entityType": "Endpoint",
                  "independentSelector": false,
                  "metricType": "REGULAR_VALUE",
                  "metricName": "endpoint_sla",
                  "queryMetricType": "readMetricsValues",
                  "chartType": "ChartLine",
                  "unit": "%",
                  "aggregation": "/",
                  "aggregationNum": "100"
                }
              ]
            }
          ]
        }
      ]
    # Activated as the DASHBOARD type, makes this templates added into the UI page automatically.
    # False means providing a basic template, user needs to add it manually.
    activated: true
    # True means wouldn't show up on the dashboard. Only keeps the definition in the storage.
    disabled: false
Copy the code

Results show

Code contributions

  • Add some new thread metric and class metric to JVMMetric #7230
  • add some new thread metric and class metric to JVMMetric #52
  • Remove Terminated State and New State in JVMMetric (#7230) #53
  • Add some new thread metric and class metric to JVMMetric (#7230) #7243

conclusion

Metric how to expand, basically no case on the Internet, are to see the official documents and source code to understand. Corresponding to this very popular open source project, or look at the official documents and source code more stable.

Reference documentation

  • Java ManagementFactory parsing
  • The ThreadMXBean class is used programmatically to detect deadlocks
  • Source and Scope extension for new metrics
  • Observability Analysis Language

Share and record what you learn and see