From bfdbd55285d04aba40fc8a0da2aae07a92e216c0 Mon Sep 17 00:00:00 2001 From: zhang-wei Date: Sat, 2 Apr 2022 18:03:43 +0800 Subject: [PATCH] Add template of OpenFunction (#8789) --- CHANGES.md | 1 + apm-protocol/apm-network/src/main/proto | 2 +- .../parser/listener/RPCAnalysisListener.java | 28 +- .../oap/server/core/analysis/Layer.java | 15 +- .../ui/template/UITemplateInitializer.java | 1 + .../handler/v8/ManagementServiceHandler.java | 19 +- .../listener/RPCAnalysisListenerTest.java | 18 +- .../faas/faas-function-relation.json | 368 +++++++++++++ .../faas/faas-function.json | 508 ++++++++++++++++++ .../faas/faas-instance-relation.json | 263 +++++++++ .../faas/faas-instance.json | 166 ++++++ .../faas/faas-root.json | 239 ++++++++ 12 files changed, 1601 insertions(+), 27 deletions(-) create mode 100644 oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-function-relation.json create mode 100644 oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-function.json create mode 100644 oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-instance-relation.json create mode 100644 oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-instance.json create mode 100644 oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-root.json diff --git a/CHANGES.md b/CHANGES.md index c6eec71d57..4765afa2e0 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -168,6 +168,7 @@ NOTICE, this sharding concept is NOT just for splitting data into different data * Re-implement UI template initialization for Booster UI. * Add environment variable `SW_ENABLE_UPDATE_UI_TEMPLATE` to control user edit UI template. * Add the Self Observability template of the SkyWalking Satellite. +* Add the template of OpenFunction observability. #### Documentation diff --git a/apm-protocol/apm-network/src/main/proto b/apm-protocol/apm-network/src/main/proto index b7548df896..6882545998 160000 --- a/apm-protocol/apm-network/src/main/proto +++ b/apm-protocol/apm-network/src/main/proto @@ -1 +1 @@ -Subproject commit b7548df896330bd4cd0ae42d95df9b9cc511f139 +Subproject commit 68825459980d14702de8fb2303c7997624129991 diff --git a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/RPCAnalysisListener.java b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/RPCAnalysisListener.java index 8e56c6a3a1..78bff0ef6d 100644 --- a/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/RPCAnalysisListener.java +++ b/oap-server/analyzer/agent-analyzer/src/main/java/org/apache/skywalking/oap/server/analyzer/provider/trace/parser/listener/RPCAnalysisListener.java @@ -286,20 +286,24 @@ public class RPCAnalysisListener extends CommonAnalysisListener implements Entry callingIn.prepare(); sourceReceiver.receive(callingIn.toService()); sourceReceiver.receive(callingIn.toServiceInstance()); - sourceReceiver.receive(callingIn.toEndpoint()); sourceReceiver.receive(callingIn.toServiceRelation()); sourceReceiver.receive(callingIn.toServiceInstanceRelation()); - EndpointRelation endpointRelation = callingIn.toEndpointRelation(); - /* - * Parent endpoint could be none, because in SkyWalking Cross Process Propagation Headers Protocol v2, - * endpoint in ref could be empty, based on that, endpoint relation maybe can't be established. - * So, I am making this source as optional. - * - * Also, since 6.6.0, source endpoint could be none, if this trace begins by an internal task(local span or exit span), such as Timer, - * rather than, normally begin as an entry span, like a RPC server side. - */ - if (endpointRelation != null) { - sourceReceiver.receive(endpointRelation); + // Service is equivalent to endpoint in FaaS (function as a service) + // Don't generate endpoint and endpoint dependency to avoid unnecessary costs. + if (Layer.FAAS != callingIn.getDestLayer()) { + sourceReceiver.receive(callingIn.toEndpoint()); + EndpointRelation endpointRelation = callingIn.toEndpointRelation(); + /* + * Parent endpoint could be none, because in SkyWalking Cross Process Propagation Headers Protocol v2, + * endpoint in ref could be empty, based on that, endpoint relation maybe can't be established. + * So, I am making this source as optional. + * + * Also, since 6.6.0, source endpoint could be none, if this trace begins by an internal task(local span or exit span), such as Timer, + * rather than, normally begin as an entry span, like a RPC server side. + */ + if (endpointRelation != null) { + sourceReceiver.receive(endpointRelation); + } } }); diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/Layer.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/Layer.java index 4f443c64a9..584596ca69 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/Layer.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/analysis/Layer.java @@ -21,7 +21,6 @@ package org.apache.skywalking.oap.server.core.analysis; import java.util.Arrays; import java.util.HashMap; import java.util.Map; -import java.util.stream.Collectors; import org.apache.skywalking.oap.server.core.UnexpectedException; /** @@ -126,9 +125,13 @@ public enum Layer { */ private final boolean isNormal; private static final Map DICTIONARY = new HashMap<>(); + private static final Map DICTIONARY_NAME = new HashMap<>(); static { - Arrays.stream(Layer.values()).collect(Collectors.toMap(Layer::value, layer -> layer)).forEach(DICTIONARY::put); + Arrays.stream(Layer.values()).forEach(l -> { + DICTIONARY.put(l.value, l); + DICTIONARY_NAME.put(l.name(), l); + }); } Layer(int value, boolean isNormal) { @@ -148,6 +151,14 @@ public enum Layer { return layer; } + public static Layer nameOf(String name) { + Layer layer = DICTIONARY_NAME.get(name); + if (layer == null) { + throw new UnexpectedException("Unknown Layer name"); + } + return layer; + } + public boolean isNormal() { return isNormal; } diff --git a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializer.java b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializer.java index 6101308089..7bf5181ff3 100644 --- a/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializer.java +++ b/oap-server/server-core/src/main/java/org/apache/skywalking/oap/server/core/management/ui/template/UITemplateInitializer.java @@ -52,6 +52,7 @@ public class UITemplateInitializer { Layer.VIRTUAL_DATABASE.name(), Layer.K8S_SERVICE.name(), Layer.SO11Y_SATELLITE.name(), + Layer.FAAS.name(), "custom" }; private final UITemplateManagementService uiTemplateManagementService; diff --git a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/ManagementServiceHandler.java b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/ManagementServiceHandler.java index 1372d5dd26..7dbb90b408 100644 --- a/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/ManagementServiceHandler.java +++ b/oap-server/server-receiver-plugin/skywalking-management-receiver-plugin/src/main/java/org/apache/skywalking/oap/server/receiver/register/provider/handler/v8/ManagementServiceHandler.java @@ -35,6 +35,7 @@ import org.apache.skywalking.oap.server.core.source.ServiceInstanceUpdate; import org.apache.skywalking.oap.server.core.source.ServiceMeta; import org.apache.skywalking.oap.server.core.source.SourceReceiver; import org.apache.skywalking.oap.server.library.module.ModuleManager; +import org.apache.skywalking.oap.server.library.util.StringUtil; public final class ManagementServiceHandler { private final SourceReceiver sourceReceiver; @@ -47,13 +48,24 @@ public final class ManagementServiceHandler { .getService(NamingControl.class); } + /** + * Identify the layer of instance. Such as ${@link Layer#FAAS}. + */ + private Layer identifyInstanceLayer(String layer) { + if (StringUtil.isEmpty(layer)) { + return Layer.GENERAL; + } else { + return Layer.nameOf(layer); + } + } + public Commands reportInstanceProperties(final InstanceProperties request) { ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); final String serviceName = namingControl.formatServiceName(request.getService()); final String instanceName = namingControl.formatInstanceName(request.getServiceInstance()); serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, true)); serviceInstanceUpdate.setName(instanceName); - serviceInstanceUpdate.setLayer(Layer.GENERAL); + serviceInstanceUpdate.setLayer(identifyInstanceLayer(request.getLayer())); JsonObject properties = new JsonObject(); List ipv4List = new ArrayList<>(); @@ -77,18 +89,19 @@ public final class ManagementServiceHandler { final long timeBucket = TimeBucket.getTimeBucket(System.currentTimeMillis(), DownSampling.Minute); final String serviceName = namingControl.formatServiceName(request.getService()); final String instanceName = namingControl.formatInstanceName(request.getServiceInstance()); + final Layer layer = identifyInstanceLayer(request.getLayer()); ServiceInstanceUpdate serviceInstanceUpdate = new ServiceInstanceUpdate(); serviceInstanceUpdate.setServiceId(IDManager.ServiceID.buildId(serviceName, true)); serviceInstanceUpdate.setName(instanceName); serviceInstanceUpdate.setTimeBucket(timeBucket); - serviceInstanceUpdate.setLayer(Layer.GENERAL); + serviceInstanceUpdate.setLayer(layer); sourceReceiver.receive(serviceInstanceUpdate); ServiceMeta serviceMeta = new ServiceMeta(); serviceMeta.setName(serviceName); serviceMeta.setTimeBucket(timeBucket); - serviceMeta.setLayer(Layer.GENERAL); + serviceMeta.setLayer(layer); sourceReceiver.receive(serviceMeta); return Commands.newBuilder().build(); diff --git a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/RPCAnalysisListenerTest.java b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/RPCAnalysisListenerTest.java index 6884430949..93f92876f6 100644 --- a/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/RPCAnalysisListenerTest.java +++ b/oap-server/server-receiver-plugin/skywalking-trace-receiver-plugin/src/test/java/org/apache/skywalking/oap/server/receiver/trace/provider/parser/listener/RPCAnalysisListenerTest.java @@ -155,9 +155,9 @@ public class RPCAnalysisListenerTest { Assert.assertEquals(6, receivedSources.size()); final Service service = (Service) receivedSources.get(0); final ServiceInstance serviceInstance = (ServiceInstance) receivedSources.get(1); - final Endpoint endpoint = (Endpoint) receivedSources.get(2); - final ServiceRelation serviceRelation = (ServiceRelation) receivedSources.get(3); - final ServiceInstanceRelation serviceInstanceRelation = (ServiceInstanceRelation) receivedSources.get(4); + final ServiceRelation serviceRelation = (ServiceRelation) receivedSources.get(2); + final ServiceInstanceRelation serviceInstanceRelation = (ServiceInstanceRelation) receivedSources.get(3); + final Endpoint endpoint = (Endpoint) receivedSources.get(4); final EndpointRelation endpointRelation = (EndpointRelation) receivedSources.get(5); Assert.assertEquals("mock-service", service.getName()); Assert.assertEquals(500, service.getHttpResponseStatusCode()); @@ -220,9 +220,9 @@ public class RPCAnalysisListenerTest { Assert.assertEquals(6, receivedSources.size()); final Service service = (Service) receivedSources.get(0); final ServiceInstance serviceInstance = (ServiceInstance) receivedSources.get(1); - final Endpoint endpoint = (Endpoint) receivedSources.get(2); - final ServiceRelation serviceRelation = (ServiceRelation) receivedSources.get(3); - final ServiceInstanceRelation serviceInstanceRelation = (ServiceInstanceRelation) receivedSources.get(4); + final ServiceRelation serviceRelation = (ServiceRelation) receivedSources.get(2); + final ServiceInstanceRelation serviceInstanceRelation = (ServiceInstanceRelation) receivedSources.get(3); + final Endpoint endpoint = (Endpoint) receivedSources.get(4); final EndpointRelation endpointRelation = (EndpointRelation) receivedSources.get(5); Assert.assertEquals("mock-service", service.getName()); Assert.assertEquals("mock-instance", serviceInstance.getName()); @@ -282,9 +282,9 @@ public class RPCAnalysisListenerTest { Assert.assertEquals(6, receivedSources.size()); final Service service = (Service) receivedSources.get(0); final ServiceInstance serviceInstance = (ServiceInstance) receivedSources.get(1); - final Endpoint endpoint = (Endpoint) receivedSources.get(2); - final ServiceRelation serviceRelation = (ServiceRelation) receivedSources.get(3); - final ServiceInstanceRelation serviceInstanceRelation = (ServiceInstanceRelation) receivedSources.get(4); + final ServiceRelation serviceRelation = (ServiceRelation) receivedSources.get(2); + final ServiceInstanceRelation serviceInstanceRelation = (ServiceInstanceRelation) receivedSources.get(3); + final Endpoint endpoint = (Endpoint) receivedSources.get(4); final EndpointRelation endpointRelation = (EndpointRelation) receivedSources.get(5); Assert.assertEquals("mock-service", service.getName()); Assert.assertEquals("mock-instance", serviceInstance.getName()); diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-function-relation.json b/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-function-relation.json new file mode 100644 index 0000000000..f1f85cac16 --- /dev/null +++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-function-relation.json @@ -0,0 +1,368 @@ +/** + * 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. + */ + +[ + { + "id": "FaaS-Function-Relation", + "configuration": { + "children": [ + { + "x": 0, + "y": 0, + "w": 24, + "h": 52, + "i": "0", + "type": "Tab", + "widget": { + "title": "Title" + }, + "graph": {}, + "metrics": [ + "" + ], + "metricTypes": [ + "" + ], + "activedTabIndex": 1, + "children": [ + { + "name": "Overview", + "children": [ + { + "x": 12, + "y": 24, + "w": 12, + "h": 12, + "i": "0", + "type": "Widget", + "widget": { + "title": "Load (Server) (calls / min)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_relation_server_cpm" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false + }, + { + "x": 0, + "y": 24, + "w": 12, + "h": 12, + "i": "1", + "type": "Widget", + "widget": { + "title": "Success Rate (Server) (%)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_relation_server_call_sla" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "calculation": "percentage" + } + ] + }, + { + "x": 12, + "y": 0, + "w": 12, + "h": 12, + "i": "2", + "type": "Widget", + "widget": { + "title": "Response Time Percentile (Server) (ms)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_relation_server_percentile" + ], + "metricTypes": [ + "readLabeledMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "key": "P50, P75, P90, P95, P99", + "labelsIndex": "0,1,2,3,4", + "label": "P50, P75, P90, P95, P99" + } + ] + }, + { + "x": 0, + "y": 0, + "w": 12, + "h": 12, + "i": "3", + "type": "Widget", + "widget": { + "title": "Response Time (Server) (ms)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_relation_server_resp_time" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false + }, + { + "x": 0, + "y": 12, + "w": 12, + "h": 12, + "i": "4", + "type": "Widget", + "widget": { + "title": "Response Time (Client) (ms)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_relation_client_resp_time" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false + }, + { + "x": 12, + "y": 12, + "w": 12, + "h": 12, + "i": "5", + "type": "Widget", + "widget": { + "title": "Response Time Percentile (Client) (ms)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_relation_client_percentile" + ], + "metricTypes": [ + "readLabeledMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "key": "P50, P75, P90, P95, P99", + "labelsIndex": "0,1,2,3,4", + "label": "P50, P75, P90, P95, P99" + } + ] + }, + { + "x": 0, + "y": 36, + "w": 12, + "h": 12, + "i": "6", + "type": "Widget", + "widget": { + "title": "Success Rate (Client) (%)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_relation_client_call_sla" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "calculation": "percentage" + } + ] + }, + { + "x": 12, + "y": 36, + "w": 12, + "h": 12, + "i": "7", + "type": "Widget", + "widget": { + "title": "Load (Client) (calls / min)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_relation_client_cpm" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false + } + ] + }, + { + "name": "Topology", + "children": [ + { + "x": 0, + "y": 0, + "w": 24, + "h": 49, + "i": "0", + "type": "Topology", + "widget": { + "title": "Title" + }, + "graph": { + "showDepth": true + }, + "metrics": [ + "" + ], + "metricTypes": [ + "" + ], + "moved": false, + "linkDashboard": "FaaS-Instance-Relation", + "nodeDashboard": "FaaS-Instance", + "linkServerMetrics": [ + "service_instance_relation_server_resp_time", + "service_instance_relation_server_cpm" + ], + "linkClientMetrics": [ + "service_instance_relation_client_resp_time", + "service_instance_relation_client_cpm" + ], + "nodeMetrics": [ + "service_instance_sla", + "service_instance_cpm", + "service_instance_resp_time" + ], + "legend": [], + "description": {}, + "nodeMetricConfig": [ + { + "unit": "%", + "calculation": "percentage", + "label": "Success Rate" + }, + { + "unit": "calls / min", + "label": "Load" + }, + { + "unit": "ms", + "label": "Latency" + } + ], + "linkServerMetricConfig": [ + { + "unit": "ms", + "label": "Server Latency" + }, + { + "unit": "calls / min ", + "label": "Server Load" + } + ], + "linkClientMetricConfig": [ + { + "unit": "ms", + "label": "Client Latency" + }, + { + "unit": "calls / min", + "label": "Client Load" + } + ] + } + ] + } + ], + "moved": false + } + ], + "layer": "FAAS", + "entity": "ServiceRelation", + "name": "FaaS-Function-Relation", + "id": "FaaS-Function-Relation", + "isRoot": false + } + } +] \ No newline at end of file diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-function.json b/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-function.json new file mode 100644 index 0000000000..496e234e03 --- /dev/null +++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-function.json @@ -0,0 +1,508 @@ +/** + * 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. + */ + +[ + { + "id": "FaaS-Function", + "configuration": { + "children": [ + { + "x": 0, + "y": 0, + "w": 24, + "h": 52, + "i": "4", + "type": "Tab", + "widget": { + "title": "Title" + }, + "graph": {}, + "metrics": [ + "" + ], + "metricTypes": [ + "" + ], + "activedTabIndex": 0, + "children": [ + { + "name": "Overview", + "children": [ + { + "x": 0, + "y": 0, + "w": 8, + "h": 5, + "i": "0", + "type": "Widget", + "widget": { + "title": "Function Apdex" + }, + "graph": { + "type": "Card", + "fontSize": 14, + "textAlign": "center" + }, + "metrics": [ + "service_apdex" + ], + "metricTypes": [ + "readMetricsValue" + ], + "moved": false, + "metricConfig": [ + { + "calculation": "apdex" + } + ] + }, + { + "x": 8, + "y": 0, + "w": 8, + "h": 5, + "i": "1", + "type": "Widget", + "widget": { + "title": "Success Rate" + }, + "graph": { + "type": "Card", + "fontSize": 14, + "textAlign": "center", + "showUnit": true + }, + "metrics": [ + "service_sla" + ], + "metricTypes": [ + "readMetricsValue" + ], + "moved": false, + "metricConfig": [ + { + "calculation": "percentage", + "unit": "%" + } + ] + }, + { + "x": 16, + "y": 0, + "w": 8, + "h": 5, + "i": "2", + "type": "Widget", + "widget": { + "title": "Function Load (calls / min)", + "tips": "For HTTP 1/2, gRPC, RPC functions, this means Calls Per Minute (calls / min)" + }, + "graph": { + "type": "Card", + "fontSize": 14, + "textAlign": "center", + "showUnit": true + }, + "metrics": [ + "service_cpm" + ], + "metricTypes": [ + "readMetricsValue" + ], + "moved": false, + "metricConfig": [ + { + "unit": "calls / min" + } + ] + }, + { + "x": 0, + "y": 5, + "w": 6, + "h": 11, + "i": "3", + "type": "Widget", + "widget": { + "title": "Function Avg Response Time (ms)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_resp_time" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false, + "metricConfig": [ + {} + ] + }, + { + "x": 6, + "y": 5, + "w": 6, + "h": 11, + "i": "5", + "type": "Widget", + "widget": { + "title": "Function Response Time Percentile (ms)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_percentile" + ], + "metricTypes": [ + "readLabeledMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "label": "P50, P75, P90, P95, P99", + "labelsIndex": "0, 1, 2, 3, 4" + } + ] + }, + { + "x": 12, + "y": 5, + "w": 6, + "h": 11, + "i": "6", + "type": "Widget", + "widget": { + "title": "Success Rate (%)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_sla" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "calculation": "percentage" + } + ] + }, + { + "x": 18, + "y": 5, + "w": 6, + "h": 11, + "i": "7", + "type": "Widget", + "widget": { + "title": "Function Load (calls / min)", + "tips": "For HTTP 1/2, gRPC, RPC functions, this means Calls Per Minute (calls / min)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_cpm" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false + }, + { + "x": 0, + "y": 16, + "w": 8, + "h": 14, + "i": "11", + "type": "Widget", + "widget": { + "title": "Function Instances Load (calls / min)", + "tips": "For HTTP 1/2, gRPC, RPC functions, this means Calls Per Minute (calls / min)," + }, + "graph": { + "type": "TopList" + }, + "metrics": [ + "service_instance_cpm" + ], + "metricTypes": [ + "sortMetrics" + ], + "metricConfig": [ + { + "sortOrder": "DES", + "calculation": "percentage" + } + ], + "moved": false + }, + { + "x": 8, + "y": 16, + "w": 8, + "h": 14, + "i": "12", + "type": "Widget", + "widget": { + "title": "Slow Function Instance (ms)" + }, + "graph": { + "type": "TopList", + "topN": "10" + }, + "metrics": [ + "service_instance_resp_time" + ], + "metricTypes": [ + "sortMetrics" + ], + "metricConfig": [ + { + "sortOrder": "DES", + "calculation": "percentage" + } + ], + "moved": false + }, + { + "x": 16, + "y": 16, + "w": 8, + "h": 14, + "i": "13", + "type": "Widget", + "widget": { + "title": "Function Instance Success Rate (%)" + }, + "graph": { + "type": "TopList", + "topN": "10" + }, + "metrics": [ + "service_instance_sla" + ], + "metricTypes": [ + "sortMetrics" + ], + "metricConfig": [ + { + "sortOrder": "ASC", + "calculation": "percentage" + } + ], + "moved": false + } + ] + }, + { + "name": "Instance", + "children": [ + { + "x": 0, + "y": 0, + "w": 24, + "h": 49, + "i": "0", + "type": "Widget", + "widget": { + "title": "" + }, + "graph": { + "type": "InstanceList", + "dashboardName": "FaaS-Instance", + "fontSize": 12 + }, + "metrics": [ + "service_instance_cpm" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "label": "Load", + "unit": "calls / min" + } + ] + } + ] + }, + { + "name": "Topology", + "children": [ + { + "x": 0, + "y": 0, + "w": 24, + "h": 48, + "i": "0", + "type": "Topology", + "widget": { + "title": "Title" + }, + "graph": { + "showDepth": true + }, + "metrics": [ + "" + ], + "metricTypes": [ + "" + ], + "moved": false, + "linkDashboard": "FaaS-Function-Relation", + "nodeDashboard": [ + { + "scope": "Service", + "dashboard": "FaaS-Function" + }, + { + "scope": "ServiceInstance", + "dashboard": "FaaS-Instance" + } + ], + "linkServerMetrics": [ + "service_relation_server_resp_time", + "service_relation_server_cpm" + ], + "linkClientMetrics": [ + "service_relation_client_cpm", + "service_relation_client_resp_time" + ], + "nodeMetrics": [ + "service_cpm", + "service_sla", + "service_resp_time" + ], + "legend": [ + { + "name": "service_sla", + "condition": "<", + "value": "9500" + }, + { + "name": "service_cpm", + "condition": ">", + "value": "1" + } + ], + "description": { + "healthy": "Healthy", + "unhealthy": "Success Rate < 95% and Traffic > 1 call/min" + }, + "nodeMetricConfig": [ + { + "unit": "calls / min", + "label": "Load" + }, + { + "calculation": "percentage", + "unit": "%", + "label": "Success Rate" + }, + { + "unit": "ms", + "label": "Latency" + } + ], + "linkServerMetricConfig": [ + { + "unit": "ms", + "label": "Server Latency" + }, + { + "unit": "calls / min", + "label": "Server Load" + } + ], + "linkClientMetricConfig": [ + { + "unit": "calls / min", + "label": "Client Load" + }, + { + "unit": "ms", + "label": "Client Latency" + } + ] + } + ] + }, + { + "name": "Trace", + "children": [ + { + "x": 0, + "y": 0, + "w": 24, + "h": 48, + "i": "0", + "type": "Trace", + "widget": { + "title": "Title" + }, + "graph": {}, + "metrics": [ + "" + ], + "metricTypes": [ + "" + ], + "moved": false + } + ] + } + ], + "moved": false + } + ], + "layer": "FAAS", + "entity": "Service", + "name": "FaaS-Function", + "id": "FaaS-Function", + "isRoot": false + } + } +] \ No newline at end of file diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-instance-relation.json b/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-instance-relation.json new file mode 100644 index 0000000000..84479ee83c --- /dev/null +++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-instance-relation.json @@ -0,0 +1,263 @@ +/** + * 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. + */ + +[ + { + "id": "FaaS-Instance-Relation", + "configuration": { + "children": [ + { + "x": 12, + "y": 12, + "w": 12, + "h": 12, + "i": "1", + "type": "Widget", + "widget": { + "title": "Response Time Percentile (Client) (ms)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_instance_relation_client_percentile" + ], + "metricTypes": [ + "readLabeledMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "key": "P50, P75, P90, P95, P99", + "labelsIndex": "0,1,2,3,4", + "label": "P50, P75, P90, P95, P99" + } + ] + }, + { + "x": 0, + "y": 24, + "w": 12, + "h": 12, + "i": "2", + "type": "Widget", + "widget": { + "title": "Success Rate (Client) (%)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_instance_relation_client_call_sla" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "calculation": "percentage" + } + ] + }, + { + "x": 12, + "y": 36, + "w": 12, + "h": 12, + "i": "3", + "type": "Widget", + "widget": { + "title": "Load (Client) (calls / min)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_instance_relation_client_cpm" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false + }, + { + "x": 0, + "y": 12, + "w": 12, + "h": 12, + "i": "4", + "type": "Widget", + "widget": { + "title": "Response Time (Client) (ms)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_instance_relation_client_resp_time" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false + }, + { + "x": 12, + "y": 0, + "w": 12, + "h": 12, + "i": "5", + "type": "Widget", + "widget": { + "title": "Response Time Percentile (Server) (ms)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_instance_relation_server_percentile" + ], + "metricTypes": [ + "readLabeledMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "key": "P50, P75, P90, P95, P99", + "labelsIndex": "0,1,2,3,4", + "label": "P50, P75, P90, P95, P99" + } + ] + }, + { + "x": 0, + "y": 36, + "w": 12, + "h": 12, + "i": "6", + "type": "Widget", + "widget": { + "title": "Success Rate (Server) (%)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_instance_relation_server_call_sla" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "calculation": "percentage" + } + ] + }, + { + "x": 12, + "y": 24, + "w": 12, + "h": 12, + "i": "7", + "type": "Widget", + "widget": { + "title": "Load (Server) (calls / min)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_instance_relation_server_cpm" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false + }, + { + "x": 0, + "y": 0, + "w": 12, + "h": 12, + "i": "8", + "type": "Widget", + "widget": { + "title": "Response Time (Server) (ms)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_instance_relation_server_resp_time" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false + } + ], + "layer": "FAAS", + "entity": "ServiceInstanceRelation", + "name": "FaaS-Instance-Relation", + "id": "FaaS-Instance-Relation", + "isRoot": false + } + } +] \ No newline at end of file diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-instance.json b/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-instance.json new file mode 100644 index 0000000000..a673c113e2 --- /dev/null +++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-instance.json @@ -0,0 +1,166 @@ +/** + * 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. + */ + +[ + { + "id": "FaaS-Instance", + "configuration": { + "children": [ + { + "x": 0, + "y": 0, + "w": 24, + "h": 52, + "i": "0", + "type": "Tab", + "widget": { + "title": "Title" + }, + "graph": {}, + "metrics": [ + "" + ], + "metricTypes": [ + "" + ], + "activedTabIndex": 0, + "children": [ + { + "name": "Overview", + "children": [ + { + "x": 0, + "y": 29, + "w": 24, + "h": 14, + "i": "0", + "type": "Widget", + "widget": { + "title": "Function Instance Latency (ms)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_instance_resp_time" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false + }, + { + "x": 0, + "y": 14, + "w": 24, + "h": 15, + "i": "1", + "type": "Widget", + "widget": { + "title": "Function Instance Success Rate (%)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_instance_sla" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "calculation": "percentage" + } + ] + }, + { + "x": 0, + "y": 0, + "w": 24, + "h": 14, + "i": "3", + "type": "Widget", + "widget": { + "title": "Function Instance Load (calls / min)", + "tips": "For HTTP 1/2, gRPC, RPC functions, this means Calls Per Minute (calls / min)" + }, + "graph": { + "type": "Line", + "step": false, + "smooth": false, + "showSymbol": false, + "showXAxis": true, + "showYAxis": true + }, + "metrics": [ + "service_instance_cpm" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false + } + ] + }, + { + "name": "Trace", + "children": [ + { + "x": 0, + "y": 0, + "w": 24, + "h": 49, + "i": "0", + "type": "Trace", + "widget": { + "title": "Title" + }, + "graph": {}, + "metrics": [ + "" + ], + "metricTypes": [ + "" + ], + "moved": false + } + ] + } + ], + "moved": false + } + ], + "layer": "FAAS", + "entity": "ServiceInstance", + "name": "FaaS-Instance", + "id": "FaaS-Instance", + "isRoot": false + } + } +] \ No newline at end of file diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-root.json b/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-root.json new file mode 100644 index 0000000000..b4fd8e92bf --- /dev/null +++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/faas/faas-root.json @@ -0,0 +1,239 @@ +/** + * 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. + */ + +[ + { + "id": "FaaS-Root", + "configuration": { + "children": [ + { + "x": 0, + "y": 2, + "w": 24, + "h": 52, + "i": "1", + "type": "Tab", + "widget": { + "title": "Title" + }, + "graph": {}, + "metrics": [ + "" + ], + "metricTypes": [ + "" + ], + "activedTabIndex": 0, + "children": [ + { + "name": "Function", + "children": [ + { + "x": 0, + "y": 0, + "w": 24, + "h": 48, + "i": "0", + "type": "Widget", + "widget": { + "title": "" + }, + "graph": { + "type": "ServiceList", + "dashboardName": "FaaS-Function", + "fontSize": 12, + "showXAxis": false, + "showYAxis": false, + "showGroup": false + }, + "metrics": [ + "service_cpm" + ], + "metricTypes": [ + "readMetricsValues" + ], + "moved": false, + "metricConfig": [ + { + "label": "Load", + "unit": "calls / min" + } + ] + } + ] + }, + { + "name": "Topology", + "children": [ + { + "x": 0, + "y": 0, + "w": 24, + "h": 48, + "i": "0", + "type": "Topology", + "widget": { + "title": "Title" + }, + "graph": { + "showDepth": true + }, + "metrics": [ + "" + ], + "metricTypes": [ + "" + ], + "moved": false, + "linkDashboard": "Function-Function-Relation", + "nodeDashboard": [ + { + "scope": "Service", + "dashboard": "FaaS-Function" + }, + { + "scope": "ServiceInstance", + "dashboard": "FaaS-Instance" + } + ], + "linkServerMetrics": [ + "service_relation_server_resp_time", + "service_relation_server_cpm" + ], + "linkClientMetrics": [ + "service_relation_client_cpm", + "service_relation_client_resp_time" + ], + "nodeMetrics": [ + "service_cpm", + "service_sla", + "service_resp_time" + ], + "legend": [ + { + "name": "service_sla", + "condition": "<", + "value": "9500" + }, + { + "name": "service_cpm", + "condition": ">", + "value": "1" + } + ], + "description": { + "healthy": "Healthy", + "unhealthy": "Success Rate < 95% and Traffic > 1 calls / min" + }, + "nodeMetricConfig": [ + { + "unit": "calls / min", + "label": "Load" + }, + { + "calculation": "percentage", + "unit": "%", + "label": "Success Rate" + }, + { + "unit": "ms", + "label": "Latency" + } + ], + "linkServerMetricConfig": [ + { + "unit": "ms", + "label": "Server Latency" + }, + { + "unit": "calls / min", + "label": "Server Load" + } + ], + "linkClientMetricConfig": [ + { + "unit": "calls / min", + "label": "Client Load" + }, + { + "unit": "ms", + "label": "Client Latency" + } + ] + } + ] + }, + { + "name": "Trace", + "children": [ + { + "x": 0, + "y": 0, + "w": 24, + "h": 49, + "i": "0", + "type": "Trace", + "widget": { + "title": "Title" + }, + "graph": {}, + "standard": {}, + "metrics": [ + "" + ], + "metricTypes": [ + "" + ], + "moved": false + } + ] + } + ], + "moved": false + }, + { + "x": 0, + "y": 0, + "w": 24, + "h": 2, + "i": "2", + "type": "Text", + "metricTypes": [ + "" + ], + "metrics": [ + "" + ], + "graph": { + "fontColor": "black", + "backgroundColor": "white", + "content": "FaaS (Function-as-a-Service) is a type of cloud-computing service that allows you to execute code in response to events without the complex infrastructure typically associated with building and launching microservices applications. OpenFunction as a FaaS platform, provides out-of-box observability with SkyWalking integration.", + "fontSize": 14, + "textAlign": "left", + "url": "https://github.com/OpenFunction/samples/blob/main/functions/tracing/README.md" + }, + "moved": false + } + ], + "id": "FaaS-Root", + "layer": "FAAS", + "entity": "All", + "name": "FaaS-Root", + "isRoot": true + } + } +] \ No newline at end of file