This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git
The following commit(s) were added to refs/heads/master by this push:
new bfbda6fa14 Add support Kong monitoring (#12696)
bfbda6fa14 is described below
commit bfbda6fa14230c179aa9dc96edf9464c882a59b0
Author: Zixin Zhou <[email protected]>
AuthorDate: Thu Oct 17 10:09:10 2024 +0800
Add support Kong monitoring (#12696)
---
.github/workflows/skywalking.yaml | 2 +
docs/en/changes/changes.md | 4 +-
docs/en/concepts-and-designs/service-hierarchy.md | 9 +
docs/en/setup/backend/backend-kong-monitoring.md | 77 +++++
docs/en/swip/SWIP-8.md | 61 ++++
docs/menu.yml | 2 +
.../skywalking/oap/server/core/analysis/Layer.java | 7 +-
.../ui/template/UITemplateInitializer.java | 1 +
.../src/main/resources/application.yml | 2 +-
.../src/main/resources/hierarchy-definition.yml | 5 +
.../resources/otel-rules/kong/kong-endpoint.yaml | 40 +++
.../resources/otel-rules/kong/kong-instance.yaml | 105 ++++++
.../resources/otel-rules/kong/kong-service.yaml | 69 ++++
.../kong/kong-endpoint.json | 157 +++++++++
.../kong/kong-instance.json | 324 +++++++++++++++++++
.../ui-initialized-templates/kong/kong-root.json | 45 +++
.../kong/kong-service.json | 351 +++++++++++++++++++++
skywalking-ui | 2 +-
test/e2e-v2/cases/kong/docker-compose.yml | 116 +++++++
test/e2e-v2/cases/kong/e2e.yaml | 37 +++
.../metrics-has-value-label-bandwidth-endpoint.yml | 35 ++
.../metrics-has-value-label-bandwidth-service.yml | 35 ++
.../expected/metrics-has-value-label-bandwidth.yml | 37 +++
.../metrics-has-value-label-percentile.yml | 35 ++
.../kong/expected/metrics-has-value-label-pid.yml | 35 ++
.../metrics-has-value-label-shared-dict.yml | 35 ++
.../expected/metrics-has-value-label-state.yml | 35 ++
.../expected/metrics-has-value-label-status.yml | 35 ++
.../cases/kong/expected/metrics-has-value.yml | 31 ++
.../kong/expected/metrics-single-value-label.yml | 32 ++
.../cases/kong/expected/metrics-single-value.yml | 28 ++
test/e2e-v2/cases/kong/expected/service.yml | 24 ++
test/e2e-v2/cases/kong/kong-cases.yaml | 80 +++++
test/e2e-v2/cases/kong/kong-e2e-data-mock.sh | 45 +++
test/e2e-v2/cases/kong/otel-collector-config.yaml | 44 +++
35 files changed, 1978 insertions(+), 4 deletions(-)
diff --git a/.github/workflows/skywalking.yaml
b/.github/workflows/skywalking.yaml
index 93b5706b3d..924bf207aa 100644
--- a/.github/workflows/skywalking.yaml
+++ b/.github/workflows/skywalking.yaml
@@ -667,6 +667,8 @@ jobs:
config:
test/e2e-v2/cases/clickhouse/clickhouse-prometheus-endpoint/e2e.yaml
- name: ActiveMQ
config: test/e2e-v2/cases/activemq/e2e.yaml
+ - name: Kong
+ config: test/e2e-v2/cases/kong/e2e.yaml
- name: UI Menu BanyanDB
config: test/e2e-v2/cases/menu/banyandb/e2e.yaml
diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index c46230ebb5..c2c412cb1c 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -10,10 +10,12 @@
* Support query endpoint list with duration parameter(optional).
* Change the endpoint_traffic to updatable for the additional column
`last_ping`.
* Add Component ID(5023) for the GoZero framework.
-
+* Support Kong monitoring.
#### UI
+* Add support for case-insensitive search in the dashboard list.
+* Add content decorations to Table and Card widgets.
#### Documentation
* Update release document to adopt newly added revision-based process.
diff --git a/docs/en/concepts-and-designs/service-hierarchy.md
b/docs/en/concepts-and-designs/service-hierarchy.md
index 63e48a4531..8cd18bccda 100644
--- a/docs/en/concepts-and-designs/service-hierarchy.md
+++ b/docs/en/concepts-and-designs/service-hierarchy.md
@@ -37,6 +37,7 @@ If you want to customize it according to your own needs,
please refer to [Servic
| KAFKA | K8S_SERVICE | [KAFKA On
K8S_SERVICE](#kafka-on-k8s_service) |
| PULSAR | K8S_SERVICE | [PULSAR On
K8S_SERVICE](#pulsar-on-k8s_service) |
| SO11Y_OAP | K8S_SERVICE | [SO11Y_OAP On
K8S_SERVICE](#so11y_oap-on-k8s_service) |
+| KONG | K8S_SERVICE | [KONG On K8S_SERVICE](#kong-on-k8s_service)
|
- The following sections will describe the **default matching rules** in
detail and use the `upper-layer On lower-layer` format.
- The example service name are based on SkyWalking
[Showcase](https://github.com/apache/skywalking-showcase) default deployment.
@@ -220,6 +221,14 @@ If you want to customize it according to your own needs,
please refer to [Servic
- SO11Y_OAP.service.name: `demo-oap.skywalking-showcase`
- K8S_SERVICE.service.name:
`skywalking-showcase::demo-oap.skywalking-showcase`
+#### KONG On K8S_SERVICE
+- Rule name: `short-name`
+- Groovy script: `{ (u, l) -> u.shortName == l.shortName }`
+- Description: KONG.service.shortName == K8S_SERVICE.service.shortName
+- Matched Example:
+ - KONG.service.name: `kong::kong.skywalking-showcase`
+ - K8S_SERVICE.service.name: `skywalking-showcase::kong.skywalking-showcase`
+
### Build Through Specific Agents
Use agent tech involved(such as eBPF) and deployment tools(such as operator
and agent injector) to detect the service hierarchy relations.
diff --git a/docs/en/setup/backend/backend-kong-monitoring.md
b/docs/en/setup/backend/backend-kong-monitoring.md
new file mode 100644
index 0000000000..7f0412b9ed
--- /dev/null
+++ b/docs/en/setup/backend/backend-kong-monitoring.md
@@ -0,0 +1,77 @@
+# KONG monitoring
+
+## KONG performance from `kong prometheus plugin`
+The
[kong-prometheus](https://github.com/Kong/kong/tree/master/kong/plugins/prometheus)
is a lua library that can be used with Kong to collect metrics.
+It exposes metrics related to Kong and proxied upstream services in Prometheus
exposition format, which can be scraped by a Prometheus Server.
+SkyWalking leverages OpenTelemetry Collector to transfer the metrics
to[OpenTelemetry receiver](opentelemetry-receiver.md)
+and into the [Meter System](./../../concepts-and-designs/meter.md).
+
+### Data flow
+1. [KONG Prometheus plugin](https://docs.konghq.com/hub/kong-inc/prometheus/)
collects metrics data from KONG.
+2. OpenTelemetry Collector fetches metrics from [KONG Prometheus
plugin](https://docs.konghq.com/hub/kong-inc/prometheus/) via
+ Prometheus Receiver and pushes metrics to SkyWalking OAP Server via
OpenTelemetry gRPC exporter.
+3. The SkyWalking OAP Server parses the expression with
[MAL](../../concepts-and-designs/mal.md) to filter/calculate/aggregate and
store the results.
+
+### Set up
+1. Enable KONG [KONG Prometheus
plugin](https://docs.konghq.com/hub/kong-inc/prometheus/). Note that if need to
monitor per_consumer,
+ status_code_metrics, ai_metrics, latency_metrics, bandwidth_metrics or
upstream_health_metrics, **need to enable them manually as needed**,
+ which can be enabled in the [konga](https://pantsel.github.io/konga/)
dashboard or through the Admin API, such as the following command
+ ~~~bash
+ curl -i -X POST http://{KONG-HOST}:{KONG_ADMIN_PORT}/plugins \
+ --data name=prometheus \
+ --data config.per_consumer=true \
+ --data config.status_code_metrics=true \
+ --data config.ai_metrics=true \
+ --data config.latency_metrics=true \
+ --data config.bandwidth_metrics=true \
+ --data config.upstream_health_metrics=true
+ ~~~
+2. Set up [OpenTelemetry
Collector](https://opentelemetry.io/docs/collector/getting-started/#docker).
+ For details on Prometheus Receiver in OpenTelemetry Collector, refer to
[here](../../../../test/e2e-v2/cases/kong/otel-collector-config.yaml).
+3. Config SkyWalking [OpenTelemetry receiver](opentelemetry-receiver.md).
+
+### KONG Monitoring
+
+[KONG prometheus plugin](https://docs.konghq.com/hub/kong-inc/prometheus/)
provide multiple dimensions metrics for KONG server, upstream, route etc.
+Accordingly, SkyWalking observes the status, requests, and latency of the KONG
server, which is cataloged as a `LAYER: KONG` `Service` in the OAP.
+Each Kong server is cataloged as a `LAYER: KONG` `instance`, meanwhile, the
route rules would be recognized as a `LAYER: KONG` `endpoint`.
+
+
+#### Kong Request Supported Metrics
+
+| Monitoring Panel | Unit | Metric Name
| Description
| Data Source |
+|------------------|-------|-------------------------------------------------------------------------------------------------------------------|------------------------------------------------------|-------------|
+| Bandwidth | bytes | meter_kong_service_http_bandwidth<br
/>meter_kong_instance_http_bandwidth<br />meter_kong_endpoint_http_bandwidth |
Total bandwidth (ingress/egress) throughput | Kong |
+| HTTP Status | count | meter_kong_service_http_status<br
/>meter_kong_instance_http_status<br />meter_kong_endpoint_http_status
| HTTP status codes per consumer/service/route in Kong | Kong |
+| HTTP Request | count | meter_kong_service_http_requests<br
/>meter_kong_instance_http_requests |
Total number of requests | Kong |
+
+#### Kong Database Supported Metrics
+
+| Monitoring Panel | Unit | Metric Name
| Description |
Data Source |
+|------------------|-------|-------------------------------------------------------------------------------------|-------------------------------------------|-------------|
+| DB | count | meter_kong_service_datastore_reachable<br
/>meter_kong_instance_datastore_reachable | Datastore reachable from Kong
| Kong |
+| DB | bytes | meter_kong_instance_shared_dict_bytes
| Allocated slabs in bytes in a shared_dict |
Kong |
+| DB | bytes | meter_kong_instance_shared_dict_total_bytes
| Total capacity in bytes of a shared_dict |
Kong |
+| DB | bytes | meter_kong_instance_memory_workers_lua_vms_bytes
| Allocated bytes in worker Lua VM |
Kong |
+
+#### Kong Latencies Supported Metrics
+
+| Monitoring Panel | Unit | Metric Name
|
Description | Data
Source |
+|------------------|------|-------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|-------------|
+| Latency | ms | meter_kong_service_kong_latency<br
/>meter_kong_instance_kong_latency<br />meter_kong_endpoint_kong_latency
| Latency added by Kong and enabled plugins for each service/route in Kong
| Kong |
+| Latency | ms | meter_kong_service_request_latency<br
/>meter_kong_instance_request_latency<br />meter_kong_endpoint_request_latency
| Total latency incurred during requests for each service/route in Kong |
Kong |
+| Latency | ms | meter_kong_service_upstream_latency<br
/>meter_kong_instance_upstream_latency<br
/>meter_kong_endpoint_upstream_latency | Latency added by upstream response for
each service/route in Kong | Kong |
+
+
+#### Kong Nginx Supported Metrics
+
+| Monitoring Panel | Unit | Metric Name
| Description
| Data Source |
+|------------------|-------|---------------------------------------------------------------------------------------------|---------------------------------------|-------------|
+| Nginx | count | meter_kong_service_nginx_metric_errors_total
| Number of nginx-lua-prometheus
errors | Kong |
+| Nginx | count | meter_kong_service_nginx_connections_total<br
/>meter_kong_instance_nginx_connections_total | Number of connections by
subsystem | Kong |
+| Nginx | count | meter_kong_service_nginx_timers<br
/>meter_kong_instance_nginx_timers | Number of Nginx
timers | Kong |
+
+### Customizations
+You can customize your own metrics/expression/dashboard panel.
+The metrics definition and expression rules are found in
`/config/otel-rules/kong`.
+The KONG dashboard panel configurations are found in
`/config/ui-initialized-templates/kong`.
\ No newline at end of file
diff --git a/docs/en/swip/SWIP-8.md b/docs/en/swip/SWIP-8.md
new file mode 100644
index 0000000000..2973e451e9
--- /dev/null
+++ b/docs/en/swip/SWIP-8.md
@@ -0,0 +1,61 @@
+# Support Kong Monitoring
+
+## Motivation
+
+[**Kong**](https://github.com/Kong/kong) or **Kong API Gateway** is a
cloud-native, platform-agnostic, scalable API Gateway
+distinguished for its high performance and extensibility via plugins. Now I
want to add Kong monitoring via the OpenTelemetry Collector,
+which fetches metrics from it's own HTTP endpoint to expose metrics data for
[Prometheus](https://prometheus.io/).
+
+## Architecture Graph
+
+There is no significant architecture-level change.
+
+## Proposed Changes
+
+1. Kong expose its own
[metrics](https://docs.konghq.com/hub/kong-inc/prometheus/) via HTTP endpoint
to opentelemetry collector, OpenTelemetry Collector fetches metrics from it and
pushes metrics to SkyWalking OTEL Receiver via OpenTelemetry exporter.
+2. The SkyWalking OAP Server parses the expression with MAL to
filter/calculate/aggregate and store the results.
+3. These metrics can be displayed via the SkyWalking UI, and the metrics can
be customized for display on the UI dashboard.
+
+### Kong Request Supported Metrics
+
+| Monitoring Panel | Unit | Metric Name
| Description
| Data Source |
+|------------------|-------|-------------------------------------------------------------------------------------------------------------------|------------------------------------------------------|-------------|
+| Bandwidth | bytes | meter_kong_service_http_bandwidth<br
/>meter_kong_instance_http_bandwidth<br />meter_kong_endpoint_http_bandwidth |
Total bandwidth (ingress/egress) throughput | Kong |
+| HTTP Status | count | meter_kong_service_http_status<br
/>meter_kong_instance_http_status<br />meter_kong_endpoint_http_status
| HTTP status codes per consumer/service/route in Kong | Kong |
+| HTTP Request | count | meter_kong_service_http_requests<br
/>meter_kong_instance_http_requests |
Total number of requests | Kong |
+
+### Kong Database Supported Metrics
+
+| Monitoring Panel | Unit | Metric Name
| Description |
Data Source |
+|------------------|-------|-------------------------------------------------------------------------------------|-------------------------------------------|-------------|
+| DB | count | meter_kong_service_datastore_reachable<br
/>meter_kong_instance_datastore_reachable | Datastore reachable from Kong
| Kong |
+| DB | bytes | meter_kong_instance_shared_dict_bytes
| Allocated slabs in bytes in a shared_dict |
Kong |
+| DB | bytes | meter_kong_instance_shared_dict_total_bytes
| Total capacity in bytes of a shared_dict |
Kong |
+| DB | bytes | meter_kong_instance_memory_workers_lua_vms_bytes
| Allocated bytes in worker Lua VM |
Kong |
+
+### Kong Latencies Supported Metrics
+
+| Monitoring Panel | Unit | Metric Name
|
Description | Data
Source |
+|------------------|------|-------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------|-------------|
+| Latency | ms | meter_kong_service_kong_latency<br
/>meter_kong_instance_kong_latency<br />meter_kong_endpoint_kong_latency
| Latency added by Kong and enabled plugins for each service/route in Kong
| Kong |
+| Latency | ms | meter_kong_service_request_latency<br
/>meter_kong_instance_request_latency<br />meter_kong_endpoint_request_latency
| Total latency incurred during requests for each service/route in Kong |
Kong |
+| Latency | ms | meter_kong_service_upstream_latency<br
/>meter_kong_instance_upstream_latency<br
/>meter_kong_endpoint_upstream_latency | Latency added by upstream response for
each service/route in Kong | Kong |
+
+
+### Kong Nginx Supported Metrics
+
+| Monitoring Panel | Unit | Metric Name
| Description
| Data Source |
+|------------------|-------|---------------------------------------------------------------------------------------------|---------------------------------------|-------------|
+| Nginx | count | meter_kong_service_nginx_metric_errors_total
| Number of nginx-lua-prometheus
errors | Kong |
+| Nginx | count | meter_kong_service_nginx_connections_total<br
/>meter_kong_instance_nginx_connections_total | Number of connections by
subsystem | Kong |
+| Nginx | count | meter_kong_service_nginx_timers<br
/>meter_kong_instance_nginx_timers | Number of Nginx
timers | Kong |
+
+## Imported Dependencies libs and their licenses.
+
+No new dependency.
+
+## Compatibility
+
+no breaking changes.
+
+## General usage docs
diff --git a/docs/menu.yml b/docs/menu.yml
index 77436a9907..f349948d22 100644
--- a/docs/menu.yml
+++ b/docs/menu.yml
@@ -110,6 +110,8 @@ catalog:
path: "/en/setup/backend/backend-apisix-monitoring"
- name: "AWS API Gateway"
path: "/en/setup/backend/backend-aws-api-gateway-monitoring"
+ - name: "Kong Monitoring"
+ path: "/en/setup/backend/backend-kong-monitoring"
- name: "Database Monitoring"
catalog:
- name: "MySQL/MariaDB Server"
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 0eb61a9bc6..f2afb45bd0 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
@@ -240,7 +240,12 @@ public enum Layer {
* The self observability of SkyWalking Java Agent,
* which provides the abilities to measure the tracing performance and
error statistics of plugins.
*/
- SO11Y_JAVA_AGENT(39, true);
+ SO11Y_JAVA_AGENT(39, true),
+
+ /**
+ * Kong is Cloud-Native API Gateway and AI Gateway.
+ */
+ KONG(40, true);
private final int value;
/**
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 58dcbd8328..cadfb9bbfd 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
@@ -77,6 +77,7 @@ public class UITemplateInitializer {
Layer.ACTIVEMQ.name(),
Layer.CILIUM_SERVICE.name(),
Layer.SO11Y_JAVA_AGENT.name(),
+ Layer.KONG.name(),
"custom"
};
private final UITemplateManagementService uiTemplateManagementService;
diff --git a/oap-server/server-starter/src/main/resources/application.yml
b/oap-server/server-starter/src/main/resources/application.yml
index aadaaeb3d6..4d97bd4e4e 100644
--- a/oap-server/server-starter/src/main/resources/application.yml
+++ b/oap-server/server-starter/src/main/resources/application.yml
@@ -399,7 +399,7 @@ receiver-otel:
selector: ${SW_OTEL_RECEIVER:default}
default:
enabledHandlers:
${SW_OTEL_RECEIVER_ENABLED_HANDLERS:"otlp-metrics,otlp-logs"}
- enabledOtelMetricsRules:
${SW_OTEL_RECEIVER_ENABLED_OTEL_METRICS_RULES:"apisix,nginx/*,k8s/*,istio-controlplane,vm,mysql/*,postgresql/*,oap,aws-eks/*,windows,aws-s3/*,aws-dynamodb/*,aws-gateway/*,redis/*,elasticsearch/*,rabbitmq/*,mongodb/*,kafka/*,pulsar/*,bookkeeper/*,rocketmq/*,clickhouse/*,activemq/*"}
+ enabledOtelMetricsRules:
${SW_OTEL_RECEIVER_ENABLED_OTEL_METRICS_RULES:"apisix,nginx/*,k8s/*,istio-controlplane,vm,mysql/*,postgresql/*,oap,aws-eks/*,windows,aws-s3/*,aws-dynamodb/*,aws-gateway/*,redis/*,elasticsearch/*,rabbitmq/*,mongodb/*,kafka/*,pulsar/*,bookkeeper/*,rocketmq/*,clickhouse/*,activemq/*,kong/*"}
receiver-zipkin:
selector: ${SW_RECEIVER_ZIPKIN:-}
diff --git
a/oap-server/server-starter/src/main/resources/hierarchy-definition.yml
b/oap-server/server-starter/src/main/resources/hierarchy-definition.yml
index c64a933d6b..1f44cf5630 100644
--- a/oap-server/server-starter/src/main/resources/hierarchy-definition.yml
+++ b/oap-server/server-starter/src/main/resources/hierarchy-definition.yml
@@ -29,6 +29,7 @@ hierarchy:
GENERAL:
APISIX: lower-short-name-remove-ns
K8S_SERVICE: lower-short-name-remove-ns
+ KONG: lower-short-name-remove-ns
MYSQL:
K8S_SERVICE: short-name
@@ -62,6 +63,9 @@ hierarchy:
ACTIVEMQ:
K8S_SERVICE: short-name
+
+ KONG:
+ K8S_SERVICE: short-name
VIRTUAL_DATABASE:
MYSQL: lower-short-name-with-fqdn
@@ -110,6 +114,7 @@ layer-levels:
KAFKA: 2
PULSAR: 2
ACTIVEMQ: 2
+ KONG: 2
MESH_DP: 1
CILIUM_SERVICE: 1
diff --git
a/oap-server/server-starter/src/main/resources/otel-rules/kong/kong-endpoint.yaml
b/oap-server/server-starter/src/main/resources/otel-rules/kong/kong-endpoint.yaml
new file mode 100644
index 0000000000..009bb1e001
--- /dev/null
+++
b/oap-server/server-starter/src/main/resources/otel-rules/kong/kong-endpoint.yaml
@@ -0,0 +1,40 @@
+#
+# 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.
+#
+filter: "{ tags -> tags.job_name == 'kong-monitoring' }"
+expSuffix: tag({tags -> tags.host_name = 'kong::' +
tags.host_name}).endpoint(['host_name'], ['route'], Layer.KONG)
+metricPrefix: meter_kong_endpoint
+metricsRules:
+ # counter
+ # Total bandwidth (ingress/egress) throughput in bytes
+ - name: http_bandwidth
+ exp:
kong_bandwidth_bytes.sum(['host_name','direction','route']).rate('PT1M')
+ # HTTP status codes per consumer/service/route in Kong
+ - name: http_status
+ exp:
kong_http_requests_total.sum(['host_name','route','code']).rate('PT1M')
+
+ # histogram
+ # Latency added by Kong and enabled plugins for each service/route in Kong
+ - name: kong_latency
+ exp:
kong_kong_latency_ms.tagNotEqual('route','').sum(['host_name','route','le']).histogram().histogram_percentile([50,70,90,99])
+ # Total latency incurred during requests for each service/route in Kong
+ - name: request_latency
+ exp:
kong_request_latency_ms.tagNotEqual('route','').sum(['host_name','route','le']).histogram().histogram_percentile([50,70,90,99])
+ # Latency added by upstream response for each service/route in Kong
+ - name: upstream_latency
+ exp:
kong_upstream_latency_ms.tagNotEqual('route','').sum(['host_name','route','le']).histogram().histogram_percentile([50,70,90,99])
\ No newline at end of file
diff --git
a/oap-server/server-starter/src/main/resources/otel-rules/kong/kong-instance.yaml
b/oap-server/server-starter/src/main/resources/otel-rules/kong/kong-instance.yaml
new file mode 100644
index 0000000000..547a93c69d
--- /dev/null
+++
b/oap-server/server-starter/src/main/resources/otel-rules/kong/kong-instance.yaml
@@ -0,0 +1,105 @@
+# 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.
+# <p>
+# Examples:
+# <pre>
+# "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"
+# </pre>
+# 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.
+# <p>
+# Examples:
+# <pre>
+# "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"
+# </pre>
+filter: "{ tags -> tags.job_name == 'kong-monitoring' }"
+expSuffix: tag({tags -> tags.host_name = 'kong::' +
tags.host_name}).instance(['host_name'], ['service_instance_id'], Layer.KONG)
+metricPrefix: meter_kong_instance
+metricsRules:
+ # counter
+ # Total bandwidth (ingress/egress) throughput in bytes
+ - name: http_bandwidth
+ exp:
kong_bandwidth_bytes.sum(['host_name','service_instance_id','direction','route']).rate('PT1M')
+ # HTTP status codes per consumer/service/route in Kong
+ - name: http_status
+ exp:
kong_http_requests_total.sum(['host_name','service_instance_id','code']).rate('PT1M')
+
+ # gauge
+ # Datastore reachable from Kong
+ - name: datastore_reachable
+ exp: kong_datastore_reachable.sum(['host_name','service_instance_id'])
+ # Total number of requests
+ - name: http_requests
+ exp:
kong_nginx_requests_total.sum(['host_name','service_instance_id']).rate('PT1M')
+ # Allocated slabs in bytes in a shared_dict
+ - name: shared_dict_bytes
+ exp:
kong_memory_lua_shared_dict_bytes.sum(['host_name','service_instance_id','shared_dict'])
+ # Total capacity in bytes of a shared_dict
+ - name: shared_dict_total_bytes
+ exp:
kong_memory_lua_shared_dict_total_bytes.sum(['host_name','service_instance_id','shared_dict'])
+ # Allocated bytes in worker Lua VM
+ - name: memory_workers_lua_vms_bytes
+ exp:
kong_memory_workers_lua_vms_bytes.tagNotEqual('pid','').sum(['host_name','service_instance_id','pid'])
+ # Number of connections by subsystem
+ - name: nginx_connections_total
+ exp:
kong_nginx_connections_total.tagNotEqual('state','').sum(['host_name','service_instance_id','state']).rate('PT1M')
+ # Number of Nginx timers
+ - name: nginx_timers
+ exp: kong_nginx_timers.sum(['host_name','service_instance_id','state'])
+
+ # histogram
+ # Latency added by Kong and enabled plugins for each service/route in Kong
+ - name: kong_latency
+ exp:
kong_kong_latency_ms.sum(['host_name','service_instance_id','le']).histogram().histogram_percentile([50,70,90,99])
+ # Total latency incurred during requests for each service/route in Kong
+ - name: request_latency
+ exp:
kong_request_latency_ms.sum(['host_name','service_instance_id','le']).histogram().histogram_percentile([50,70,90,99])
+ # Latency added by upstream response for each service/route in Kong
+ - name: upstream_latency
+ exp:
kong_upstream_latency_ms.sum(['host_name','service_instance_id','le']).histogram().histogram_percentile([50,70,90,99])
\ No newline at end of file
diff --git
a/oap-server/server-starter/src/main/resources/otel-rules/kong/kong-service.yaml
b/oap-server/server-starter/src/main/resources/otel-rules/kong/kong-service.yaml
new file mode 100644
index 0000000000..028c8b445b
--- /dev/null
+++
b/oap-server/server-starter/src/main/resources/otel-rules/kong/kong-service.yaml
@@ -0,0 +1,69 @@
+# 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.
+# <p>
+# Examples:
+# <pre>
+# "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"
+# </pre>
+filter: "{ tags -> tags.job_name == 'kong-monitoring' }"
+expSuffix: tag({tags -> tags.host_name = 'kong::' +
tags.host_name}).service(['host_name'], Layer.KONG)
+metricPrefix: meter_kong_service
+metricsRules:
+ # counter
+ # Total bandwidth (ingress/egress) throughput in bytes
+ - name: http_bandwidth
+ exp:
kong_bandwidth_bytes.sum(['host_name','service_instance_id','direction','route']).rate('PT1M')
+ # HTTP status codes per consumer/service/route in Kong
+ - name: http_status
+ exp:
kong_http_requests_total.sum(['host_name','service_instance_id','code']).rate('PT1M')
+ # Number of nginx-lua-prometheus errors
+ - name: nginx_metric_errors_total
+ exp:
kong_nginx_metric_errors_total.sum(['host_name','service_instance_id'])
+
+ # gauge
+ # Datastore reachable from Kong
+ - name: datastore_reachable
+ exp: kong_datastore_reachable.sum(['host_name','service_instance_id'])
+ # Total number of requests
+ - name: http_requests
+ exp:
kong_nginx_requests_total.sum(['host_name','service_instance_id']).rate('PT1M')
+ # Number of connections by subsystem
+ - name: nginx_connections_total
+ exp:
kong_nginx_connections_total.sum(['host_name','service_instance_id','state']).rate('PT1M')
+ # Number of Nginx timers
+ - name: nginx_timers
+ exp: kong_nginx_timers.sum(['host_name','service_instance_id','state'])
+
+ # histogram
+ # Latency added by Kong and enabled plugins for each service/route in Kong
+ - name: kong_latency
+ exp:
kong_kong_latency_ms.sum(['le','host_name','service_instance_id']).histogram().histogram_percentile([50,70,90,99])
+ # Total latency incurred during requests for each service/route in Kong
+ - name: request_latency
+ exp:
kong_request_latency_ms.sum(['le','host_name','service_instance_id']).histogram().histogram_percentile([50,70,90,99])
+ # Latency added by upstream response for each service/route in Kong
+ - name: upstream_latency
+ exp:
kong_upstream_latency_ms.sum(['le','host_name','service_instance_id']).histogram().histogram_percentile([50,70,90,99])
\ No newline at end of file
diff --git
a/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-endpoint.json
b/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-endpoint.json
new file mode 100644
index 0000000000..008cea5b90
--- /dev/null
+++
b/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-endpoint.json
@@ -0,0 +1,157 @@
+[
+ {
+ "id": "Kong-Endpoint",
+ "configuration": {
+ "children": [
+ {
+ "x": 0,
+ "y": 0,
+ "w": 12,
+ "h": 13,
+ "i": "0",
+ "type": "Widget",
+ "widget": {
+ "title": "Total bandwidth Trend (ingress/egress) (KB/s)"
+ },
+ "metricConfig": [
+ {
+ "label": "HTTP bandwidth Trend (requests per second)",
+ "unit": "KB/s"
+ }
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "expressions": [
+ "meter_kong_endpoint_http_bandwidth/1024"
+ ]
+ },
+ {
+ "x": 12,
+ "y": 0,
+ "w": 12,
+ "h": 13,
+ "i": "1",
+ "type": "Widget",
+ "widget": {
+ "title": "HTTP Status Trend (requests per second)"
+ },
+ "metricConfig": [
+ {
+ "label": "HTTP Status Trend",
+ "unit": "req/s"
+ }
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "expressions": [
+ "meter_kong_endpoint_http_status"
+ ]
+ },
+ {
+ "x": 0,
+ "y": 13,
+ "w": 8,
+ "h": 13,
+ "i": "2",
+ "type": "Widget",
+ "expressions": [
+ "meter_kong_endpoint_kong_latency"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Kong Latency",
+ "unit": "ms"
+ },
+ "metricConfig": [
+ {
+ "label": "Kong Latency",
+ "tips": "Latency added by Kong and enabled plugins for each
service/route in Kong"
+ }
+ ]
+ },
+ {
+ "x": 8,
+ "y": 13,
+ "w": 8,
+ "h": 13,
+ "i": "3",
+ "type": "Widget",
+ "expressions": [
+ "meter_kong_endpoint_request_latency"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Request Latency",
+ "unit": "ms"
+ },
+ "metricConfig": [
+ {
+ "label": "Request Latency",
+ "tips": "Total latency incurred during requests for each
service/route in Kong"
+ }
+ ]
+ },
+ {
+ "x": 16,
+ "y": 13,
+ "w": 8,
+ "h": 13,
+ "i": "4",
+ "type": "Widget",
+ "expressions": [
+ "meter_kong_endpoint_upstream_latency"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Upstream Latency",
+ "unit": "ms"
+ },
+ "metricConfig": [
+ {
+ "label": "Upstream Latency",
+ "tips": "Latency added by upstream response for each
service/route in Kong"
+ }
+ ]
+ }
+ ],
+ "layer": "KONG",
+ "entity": "Endpoint",
+ "name": "Kong-Endpoint",
+ "isRoot": false,
+ "isDefault": true
+ }
+ }
+]
diff --git
a/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-instance.json
b/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-instance.json
new file mode 100644
index 0000000000..5099146a22
--- /dev/null
+++
b/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-instance.json
@@ -0,0 +1,324 @@
+[
+ {
+ "id": "Kong-Instance",
+ "configuration": {
+ "children": [
+ {
+ "x": 0,
+ "y": 0,
+ "w": 12,
+ "h": 13,
+ "i": "0",
+ "type": "Widget",
+ "expressions": [
+ "latest(meter_kong_instance_datastore_reachable)"
+ ],
+ "graph": {
+ "type": "Card",
+ "fontSize": 24,
+ "textAlign": "center",
+ "showUnit": true,
+ "decorations": {
+ "0": "unreachable",
+ "1": "reachable"
+ }
+ },
+ "metricConfig": [
+ {
+ "label": "Datastore reachable"
+ }
+ ],
+ "widget": {
+ "title": "Datastore reachable",
+ "tips": "Datastore reachable from Kong, 0 is unreachable"
+ }
+ },
+ {
+ "x": 12,
+ "y": 0,
+ "w": 12,
+ "h": 13,
+ "i": "1",
+ "type": "Widget",
+ "widget": {
+ "title": "Total bandwidth Trend (ingress/egress) (KB/s)"
+ },
+ "metricConfig": [
+ {
+ "label": "HTTP bandwidth Trend (requests per second)",
+ "unit": "KB/s"
+ }
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "expressions": [
+ "meter_kong_instance_http_bandwidth/1024"
+ ]
+ },
+ {
+ "x": 0,
+ "y": 13,
+ "w": 12,
+ "h": 13,
+ "i": "2",
+ "type": "Widget",
+ "widget": {
+ "title": "HTTP Status Trend (requests per second)"
+ },
+ "metricConfig": [
+ {
+ "label": "HTTP Status Trend",
+ "unit": "req/s"
+ }
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "expressions": [
+ "meter_kong_instance_http_status"
+ ]
+ },
+ {
+ "x": 12,
+ "y": 13,
+ "w": 12,
+ "h": 13,
+ "i": "3",
+ "type": "Widget",
+ "widget": {
+ "title": "HTTP Request Trend (requests per second)"
+ },
+ "metricConfig": [
+ {
+ "label": "Number of requests total"
+ }
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "expressions": [
+ "meter_kong_instance_http_requests"
+ ]
+ },
+ {
+ "x": 0,
+ "y": 26,
+ "w": 12,
+ "h": 13,
+ "i": "4",
+ "type": "Widget",
+ "expressions": [
+
"(meter_kong_instance_shared_dict_bytes*100)/meter_kong_instance_shared_dict_total_bytes"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": false,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Shared memory usage (%)",
+ "tips": "Kong shared memory usage by Node (%)"
+ },
+ "metricConfig": [
+ {
+ "unit": "%",
+ "label": "Kong shared memory usage by Node (%)"
+ }
+ ]
+ },
+ {
+ "x": 12,
+ "y": 26,
+ "w": 12,
+ "h": 13,
+ "i": "5",
+ "type": "Widget",
+ "expressions": [
+ "meter_kong_instance_memory_workers_lua_vms_bytes/1024/1024"
+ ],
+ "graph": {
+ "type": "Area",
+ "opacity": 0.4,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Worker Lua VM usage by Node(MB)",
+ "tips": "Kong worker Lua VM usage by Node(MB)"
+ },
+ "metricConfig": [
+ {
+ "unit": "MB",
+ "label": "Kong worker Lua VM usage by Node"
+ }
+ ]
+ },
+ {
+ "x": 0,
+ "y": 39,
+ "w": 12,
+ "h": 13,
+ "i": "6",
+ "type": "Widget",
+ "expressions": [
+ "meter_kong_instance_nginx_connections_total"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "HTTP Connections Trend (requests per second)"
+ },
+ "metricConfig": [
+ {
+ "label": "HTTP Connections"
+ }
+ ]
+ },
+ {
+ "x": 12,
+ "y": 39,
+ "w": 12,
+ "h": 13,
+ "i": "7",
+ "type": "Widget",
+ "expressions": [
+ "meter_kong_instance_nginx_timers"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Nginx timers"
+ },
+ "metricConfig": [
+ {
+ "label": "Nginx timers"
+ }
+ ]
+ },
+ {
+ "x": 0,
+ "y": 52,
+ "w": 8,
+ "h": 13,
+ "i": "8",
+ "type": "Widget",
+ "expressions": [
+ "meter_kong_instance_kong_latency"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Kong Latency",
+ "unit": "ms"
+ },
+ "metricConfig": [
+ {
+ "label": "Kong Latency",
+ "tips": "Latency added by Kong and enabled plugins for each
service/route in Kong"
+ }
+ ]
+ },
+ {
+ "x": 8,
+ "y": 52,
+ "w": 8,
+ "h": 13,
+ "i": "9",
+ "type": "Widget",
+ "expressions": [
+ "meter_kong_instance_request_latency"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Request Latency",
+ "unit": "ms"
+ },
+ "metricConfig": [
+ {
+ "label": "Request Latency",
+ "tips": "Total latency incurred during requests for each
service/route in Kong"
+ }
+ ]
+ },
+ {
+ "x": 16,
+ "y": 52,
+ "w": 8,
+ "h": 13,
+ "i": "10",
+ "type": "Widget",
+ "expressions": [
+ "meter_kong_instance_upstream_latency"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Upstream Latency",
+ "unit": "ms"
+ },
+ "metricConfig": [
+ {
+ "label": "Upstream Latency",
+ "tips": "Latency added by upstream response for each
service/route in Kong"
+ }
+ ]
+ }
+ ],
+ "layer": "KONG",
+ "entity": "ServiceInstance",
+ "name": "Kong-Instance",
+ "isRoot": false,
+ "isDefault": true
+ }
+ }
+]
diff --git
a/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-root.json
b/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-root.json
new file mode 100644
index 0000000000..c5a6946c12
--- /dev/null
+++
b/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-root.json
@@ -0,0 +1,45 @@
+[
+ {
+ "id": "Kong-Root",
+ "configuration": {
+ "children": [
+ {
+ "x": 0,
+ "y": 3,
+ "w": 24,
+ "h": 36,
+ "i": "0",
+ "type": "Widget",
+ "graph": {
+ "type": "ServiceList",
+ "dashboardName": "Kong-Service",
+ "fontSize": 12,
+ "showXAxis": false,
+ "showYAxis": false,
+ "showGroup": true
+ }
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "w": 24,
+ "h": 3,
+ "i": "1",
+ "type": "Text",
+ "graph": {
+ "fontColor": "theme",
+ "backgroundColor": "theme",
+ "content": "Provide Kong monitoring through OpenTelemetry's
Prometheus Receiver",
+ "fontSize": 14,
+ "textAlign": "left",
+ "url":
"https://skywalking.apache.org/docs/main/next/en/setup/backend/backend-kong-monitoring/"
+ }
+ }
+ ],
+ "layer": "KONG",
+ "entity": "All",
+ "name": "Kong-Root",
+ "isRoot": true
+ }
+ }
+]
diff --git
a/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-service.json
b/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-service.json
new file mode 100644
index 0000000000..163eb1a4be
--- /dev/null
+++
b/oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-service.json
@@ -0,0 +1,351 @@
+[
+ {
+ "id": "Kong-Service",
+ "configuration": {
+ "children": [
+ {
+ "x": 0,
+ "y": 0,
+ "w": 24,
+ "h": 48,
+ "i": "0",
+ "type": "Tab",
+ "children": [
+ {
+ "name": "Inspections",
+ "children": [
+ {
+ "x": 0,
+ "y": 0,
+ "w": 12,
+ "h": 8,
+ "i": "0",
+ "type": "Widget",
+ "expressions": [
+
"latest(aggregate_labels(meter_kong_service_nginx_metric_errors_total,sum))"
+ ],
+ "graph": {
+ "type": "Card",
+ "fontSize": 24,
+ "textAlign": "center",
+ "showUnit": true
+ },
+ "metricConfig": [
+ {
+ "label": "Nginx metric errors"
+ }
+ ],
+ "widget": {
+ "title": "Nginx metric errors"
+ }
+ },
+ {
+ "x": 12,
+ "y": 0,
+ "w": 12,
+ "h": 8,
+ "i": "1",
+ "type": "Widget",
+ "expressions": [
+
"latest(aggregate_labels(meter_kong_service_datastore_reachable,sum(service_instance_id)))"
+ ],
+ "graph": {
+ "type": "Table",
+ "showTableValues": true,
+ "tableHeaderCol1": "Instances",
+ "tableHeaderCol2": "Reachable",
+ "decorations": {
+ "0": "unreachable",
+ "1": "reachable"
+ }
+ },
+ "metricConfig": [
+ {
+ "label": "Datastore reachable"
+ }
+ ],
+ "widget": {
+ "title": "Datastore reachable",
+ "tips": "Datastore reachable from Kong, 0 is unreachable"
+ }
+ },
+ {
+ "x": 0,
+ "y": 8,
+ "w": 12,
+ "h": 13,
+ "i": "2",
+ "type": "Widget",
+ "widget": {
+ "title": "Total bandwidth Trend (ingress/egress) (KB/s)"
+ },
+ "metricConfig": [
+ {
+ "label": "HTTP bandwidth Trend (requests per second)",
+ "unit": "KB/s"
+ }
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "expressions": [
+
"aggregate_labels(meter_kong_service_http_bandwidth,sum(direction))/1024"
+ ]
+ },
+ {
+ "x": 12,
+ "y": 8,
+ "w": 12,
+ "h": 13,
+ "i": "3",
+ "type": "Widget",
+ "widget": {
+ "title": "HTTP Status Trend (requests per second)"
+ },
+ "metricConfig": [
+ {
+ "label": "HTTP Status Trend",
+ "unit": "req/s"
+ }
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "expressions": [
+
"aggregate_labels(meter_kong_service_http_status,sum(code))"
+ ]
+ },
+ {
+ "x": 0,
+ "y": 21,
+ "w": 12,
+ "h": 13,
+ "i": "4",
+ "type": "Widget",
+ "widget": {
+ "title": "HTTP Request Trend (requests per second)"
+ },
+ "metricConfig": [
+ {
+ "label": "Number of requests total",
+ "unit": "req/s"
+ }
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "expressions": [
+ "aggregate_labels(meter_kong_service_http_requests,sum)"
+ ]
+ },
+ {
+ "x": 12,
+ "y": 21,
+ "w": 12,
+ "h": 13,
+ "i": "5",
+ "type": "Widget",
+ "expressions": [
+
"aggregate_labels(meter_kong_service_nginx_connections_total,sum(state))"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Nginx Connections Trend (requests per second)"
+ },
+ "metricConfig": [
+ {
+ "label": "Nginx Connections",
+ "unit": "req/s"
+ }
+ ]
+ },
+ {
+ "x": 0,
+ "y": 34,
+ "w": 12,
+ "h": 13,
+ "i": "6",
+ "type": "Widget",
+ "expressions": [
+
"aggregate_labels(meter_kong_service_nginx_timers,sum(state))"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Nginx timers"
+ },
+ "metricConfig": [
+ {
+ "label": "Nginx timers"
+ }
+ ]
+ },
+ {
+ "x": 12,
+ "y": 34,
+ "w": 12,
+ "h": 13,
+ "i": "7",
+ "type": "Widget",
+ "expressions": [
+ "aggregate_labels(meter_kong_service_kong_latency,avg(p))"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Kong Latency",
+ "unit": "ms"
+ },
+ "metricConfig": [
+ {
+ "label": "Kong Latency",
+ "tips": "Latency added by Kong and enabled plugins for
each service/route in Kong"
+ }
+ ]
+ },
+ {
+ "x": 0,
+ "y": 47,
+ "w": 12,
+ "h": 13,
+ "i": "8",
+ "type": "Widget",
+ "expressions": [
+
"aggregate_labels(meter_kong_service_request_latency,avg(p))"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Request Latency",
+ "unit": "ms"
+ },
+ "metricConfig": [
+ {
+ "label": "Request Latency",
+ "tips": "Total latency incurred during requests for each
service/route in Kong"
+ }
+ ]
+ },
+ {
+ "x": 12,
+ "y": 47,
+ "w": 12,
+ "h": 13,
+ "i": "9",
+ "type": "Widget",
+ "expressions": [
+
"aggregate_labels(meter_kong_service_upstream_latency,avg(p))"
+ ],
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": true,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "widget": {
+ "title": "Upstream Latency",
+ "unit": "ms"
+ },
+ "metricConfig": [
+ {
+ "label": "Upstream Latency",
+ "tips": "Latency added by upstream response for each
service/route in Kong"
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "name": "Instances",
+ "children": [
+ {
+ "x": 0,
+ "y": 0,
+ "w": 24,
+ "h": 17,
+ "type": "Widget",
+ "graph": {
+ "type": "InstanceList",
+ "dashboardName": "Kong-Instance",
+ "fontSize": 12
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ],
+ "layer": "KONG",
+ "entity": "Service",
+ "name": "Kong-Service",
+ "isRoot": false,
+ "isDefault": true,
+ "expressions": [
+ "avg(aggregate_labels(meter_kong_service_http_requests,sum))",
+ "avg(aggregate_labels(meter_kong_service_http_status{code='200'},
sum))",
+ "avg(aggregate_labels(meter_kong_service_http_status{code='404'},
sum))",
+ "avg(aggregate_labels(meter_kong_service_http_status{code='500'},
sum))"
+ ],
+ "expressionsConfig": [
+ {
+ "label": "Avg HTTP Requests",
+ "unit": "req / s"
+ },
+ {
+ "label": "Avg HTTP Status 200",
+ "unit": "req / s"
+ },
+ {
+ "label": "Avg HTTP Status 404",
+ "unit": "req / s"
+ },
+ {
+ "label": "Avg HTTP Status 500",
+ "unit": "req / s"
+ }
+ ]
+ }
+ }
+]
\ No newline at end of file
diff --git a/skywalking-ui b/skywalking-ui
index d65c18bd38..61449f4b17 160000
--- a/skywalking-ui
+++ b/skywalking-ui
@@ -1 +1 @@
-Subproject commit d65c18bd380a56df8886c931cbe72be2919667b6
+Subproject commit 61449f4b172a143d96cca139bed50839f5f2a5d6
diff --git a/test/e2e-v2/cases/kong/docker-compose.yml
b/test/e2e-v2/cases/kong/docker-compose.yml
new file mode 100644
index 0000000000..3bee88804f
--- /dev/null
+++ b/test/e2e-v2/cases/kong/docker-compose.yml
@@ -0,0 +1,116 @@
+# 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.
+
+version: '2.1'
+
+services:
+ oap:
+ extends:
+ file: ../../script/docker-compose/base-compose.yml
+ service: oap
+ ports:
+ - "12800:12800"
+ networks:
+ - e2e
+ kong-db:
+ image: postgres:alpine
+ networks:
+ - e2e
+ expose:
+ - 5432
+ environment:
+ POSTGRES_DB: kong
+ POSTGRES_USER: kong
+ POSTGRES_PASSWORD: kong
+ healthcheck:
+ test: [ "CMD", "bash", "-c", "cat < /dev/null > /dev/tcp/127.0.0.1/5432"
]
+ interval: 5s
+ timeout: 60s
+ retries: 120
+ kong-migrations:
+ image: kong:3.8.0
+ networks:
+ - e2e
+ environment:
+ - KONG_DATABASE=postgres
+ - KONG_PG_USER=kong
+ - KONG_PG_PASSWORD=kong
+ - KONG_PG_HOST=kong-db
+ - KONG_CASSANDRA_CONTACT_POINTS=kong-db
+ command: kong migrations bootstrap
+ depends_on:
+ kong-db:
+ condition: service_healthy
+ healthcheck:
+ test: [ "CMD", "kong", "health" ]
+ interval: 10s
+ timeout: 60s
+ retries: 120
+ kong-1:
+ image: kong:3.8.0
+ networks:
+ - e2e
+ depends_on:
+ kong-migrations:
+ condition: service_completed_successfully
+ environment:
+ KONG_ADMIN_ACCESS_LOG: /dev/stdout
+ KONG_ADMIN_ERROR_LOG: /dev/stderr
+ KONG_PROXY_LISTEN: "0.0.0.0:8000"
+ KONG_ADMIN_LISTEN: "0.0.0.0:8001"
+ KONG_CASSANDRA_CONTACT_POINTS: kong-db
+ KONG_DATABASE: postgres
+ KONG_PG_DATABASE: kong
+ KONG_PG_PASSWORD: kong
+ KONG_PG_HOST: kong-db
+ KONG_PG_USER: kong
+ KONG_PROXY_ACCESS_LOG: /dev/stdout
+ KONG_PROXY_ERROR_LOG: /dev/stderr
+ ports:
+ - "8001:8001"
+ - "8000:8000"
+ restart: on-failure
+ healthcheck:
+ test: [ "CMD", "kong", "health" ]
+ interval: 10s
+ timeout: 60s
+ retries: 120
+ otel-collector:
+ image: otel/opentelemetry-collector:${OTEL_COLLECTOR_VERSION}
+ networks:
+ - e2e
+ command: [ "--config=/etc/otel-collector-config.yaml" ]
+ volumes:
+ - ./otel-collector-config.yaml:/etc/otel-collector-config.yaml
+ expose:
+ - 55678
+ depends_on:
+ oap:
+ condition: service_healthy
+ kong-mock:
+ image: curlimages/curl:8.10.1
+ networks:
+ - e2e
+ depends_on:
+ kong-1:
+ condition: service_healthy
+ oap:
+ condition: service_healthy
+ command: "sh /etc/kong-e2e-data-mock.sh"
+ volumes:
+ - ./kong-e2e-data-mock.sh:/etc/kong-e2e-data-mock.sh
+
+networks:
+ e2e:
\ No newline at end of file
diff --git a/test/e2e-v2/cases/kong/e2e.yaml b/test/e2e-v2/cases/kong/e2e.yaml
new file mode 100644
index 0000000000..528eec9262
--- /dev/null
+++ b/test/e2e-v2/cases/kong/e2e.yaml
@@ -0,0 +1,37 @@
+# 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 file is used to show how to write configuration files and can be used
to test.
+
+setup:
+ env: compose
+ file: docker-compose.yml
+ timeout: 20m
+ init-system-environment: ../../script/env
+ steps:
+ - name: set PATH
+ command: export PATH=/tmp/skywalking-infra-e2e/bin:$PATH
+ - name: install yq
+ command: bash test/e2e-v2/script/prepare/setup-e2e-shell/install.sh yq
+ - name: install swctl
+ command: bash test/e2e-v2/script/prepare/setup-e2e-shell/install.sh swctl
+
+verify:
+ retry:
+ count: 20
+ interval: 3s
+ cases:
+ - includes:
+ - ./kong-cases.yaml
diff --git
a/test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth-endpoint.yml
b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth-endpoint.yml
new file mode 100644
index 0000000000..7a0f02852f
--- /dev/null
+++
b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth-endpoint.yml
@@ -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.
+
+type: TIME_SERIES_VALUES
+results:
+ {{- contains .results }}
+ - metric:
+ labels:
+ {{- contains .metric.labels }}
+ - key: direction
+ value: {{ .value }}
+ {{- end}}
+ values:
+ {{- contains .values }}
+ - id: {{ notEmpty .id }}
+ value: {{ .value }}
+ traceid: null
+ - id: {{ notEmpty .id }}
+ value: null
+ traceid: null
+ {{- end}}
+ {{- end}}
+error: null
diff --git
a/test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth-service.yml
b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth-service.yml
new file mode 100644
index 0000000000..7a0f02852f
--- /dev/null
+++
b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth-service.yml
@@ -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.
+
+type: TIME_SERIES_VALUES
+results:
+ {{- contains .results }}
+ - metric:
+ labels:
+ {{- contains .metric.labels }}
+ - key: direction
+ value: {{ .value }}
+ {{- end}}
+ values:
+ {{- contains .values }}
+ - id: {{ notEmpty .id }}
+ value: {{ .value }}
+ traceid: null
+ - id: {{ notEmpty .id }}
+ value: null
+ traceid: null
+ {{- end}}
+ {{- end}}
+error: null
diff --git
a/test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth.yml
b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth.yml
new file mode 100644
index 0000000000..ded3f115c1
--- /dev/null
+++ b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth.yml
@@ -0,0 +1,37 @@
+# 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.
+
+type: TIME_SERIES_VALUES
+results:
+ {{- contains .results }}
+ - metric:
+ labels:
+ {{- contains .metric.labels }}
+ - key: direction
+ value: {{ .value }}
+ - key: route
+ value: {{ .value }}
+ {{- end}}
+ values:
+ {{- contains .values }}
+ - id: {{ notEmpty .id }}
+ value: {{ .value }}
+ traceid: null
+ - id: {{ notEmpty .id }}
+ value: null
+ traceid: null
+ {{- end}}
+ {{- end}}
+error: null
diff --git
a/test/e2e-v2/cases/kong/expected/metrics-has-value-label-percentile.yml
b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-percentile.yml
new file mode 100644
index 0000000000..0e662e432f
--- /dev/null
+++ b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-percentile.yml
@@ -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.
+
+type: TIME_SERIES_VALUES
+results:
+ {{- contains .results }}
+ - metric:
+ labels:
+ {{- contains .metric.labels }}
+ - key: p
+ value: {{ .value }}
+ {{- end}}
+ values:
+ {{- contains .values }}
+ - id: {{ notEmpty .id }}
+ value: {{ .value }}
+ traceid: null
+ - id: {{ notEmpty .id }}
+ value: null
+ traceid: null
+ {{- end}}
+ {{- end}}
+error: null
diff --git a/test/e2e-v2/cases/kong/expected/metrics-has-value-label-pid.yml
b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-pid.yml
new file mode 100644
index 0000000000..a3082d647c
--- /dev/null
+++ b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-pid.yml
@@ -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.
+
+type: TIME_SERIES_VALUES
+results:
+ {{- contains .results }}
+ - metric:
+ labels:
+ {{- contains .metric.labels }}
+ - key: pid
+ value: {{ .value }}
+ {{- end}}
+ values:
+ {{- contains .values }}
+ - id: {{ notEmpty .id }}
+ value: {{ .value }}
+ traceid: null
+ - id: {{ notEmpty .id }}
+ value: null
+ traceid: null
+ {{- end}}
+ {{- end}}
+error: null
diff --git
a/test/e2e-v2/cases/kong/expected/metrics-has-value-label-shared-dict.yml
b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-shared-dict.yml
new file mode 100644
index 0000000000..1328a2e3ab
--- /dev/null
+++ b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-shared-dict.yml
@@ -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.
+
+type: TIME_SERIES_VALUES
+results:
+ {{- contains .results }}
+ - metric:
+ labels:
+ {{- contains .metric.labels }}
+ - key: shared_dict
+ value: {{ .value }}
+ {{- end}}
+ values:
+ {{- contains .values }}
+ - id: {{ notEmpty .id }}
+ value: {{ .value }}
+ traceid: null
+ - id: {{ notEmpty .id }}
+ value: null
+ traceid: null
+ {{- end}}
+ {{- end}}
+error: null
diff --git a/test/e2e-v2/cases/kong/expected/metrics-has-value-label-state.yml
b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-state.yml
new file mode 100644
index 0000000000..ca75192102
--- /dev/null
+++ b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-state.yml
@@ -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.
+
+type: TIME_SERIES_VALUES
+results:
+ {{- contains .results }}
+ - metric:
+ labels:
+ {{- contains .metric.labels }}
+ - key: state
+ value: {{ .value }}
+ {{- end}}
+ values:
+ {{- contains .values }}
+ - id: {{ notEmpty .id }}
+ value: {{ .value }}
+ traceid: null
+ - id: {{ notEmpty .id }}
+ value: null
+ traceid: null
+ {{- end}}
+ {{- end}}
+error: null
diff --git a/test/e2e-v2/cases/kong/expected/metrics-has-value-label-status.yml
b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-status.yml
new file mode 100644
index 0000000000..2f8dfa8155
--- /dev/null
+++ b/test/e2e-v2/cases/kong/expected/metrics-has-value-label-status.yml
@@ -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.
+
+type: TIME_SERIES_VALUES
+results:
+ {{- contains .results }}
+ - metric:
+ labels:
+ {{- contains .metric.labels }}
+ - key: code
+ value: {{ .value }}
+ {{- end}}
+ values:
+ {{- contains .values }}
+ - id: {{ notEmpty .id }}
+ value: {{ .value }}
+ traceid: null
+ - id: {{ notEmpty .id }}
+ value: null
+ traceid: null
+ {{- end}}
+ {{- end}}
+error: null
diff --git a/test/e2e-v2/cases/kong/expected/metrics-has-value.yml
b/test/e2e-v2/cases/kong/expected/metrics-has-value.yml
new file mode 100644
index 0000000000..dc71f56632
--- /dev/null
+++ b/test/e2e-v2/cases/kong/expected/metrics-has-value.yml
@@ -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.
+
+type: TIME_SERIES_VALUES
+results:
+ {{- contains .results }}
+ - metric:
+ labels: []
+ values:
+ {{- contains .values }}
+ - id: {{ notEmpty .id }}
+ value: {{ .value }}
+ traceid: null
+ - id: {{ notEmpty .id }}
+ value: null
+ traceid: null
+ {{- end}}
+ {{- end}}
+error: null
diff --git a/test/e2e-v2/cases/kong/expected/metrics-single-value-label.yml
b/test/e2e-v2/cases/kong/expected/metrics-single-value-label.yml
new file mode 100644
index 0000000000..c4cb82f51e
--- /dev/null
+++ b/test/e2e-v2/cases/kong/expected/metrics-single-value-label.yml
@@ -0,0 +1,32 @@
+# 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.
+
+type: SINGLE_VALUE
+results:
+ {{- contains .results }}
+ - metric:
+ labels:
+ {{- contains .metric.labels }}
+ - key: service_instance_id
+ value: {{ .value }}
+ {{- end}}
+ values:
+ {{- contains .values }}
+ - id: {{ notEmpty .id }}
+ value: {{ .value }}
+ traceid: null
+ {{- end}}
+ {{- end}}
+error: null
diff --git a/test/e2e-v2/cases/kong/expected/metrics-single-value.yml
b/test/e2e-v2/cases/kong/expected/metrics-single-value.yml
new file mode 100644
index 0000000000..1a70151859
--- /dev/null
+++ b/test/e2e-v2/cases/kong/expected/metrics-single-value.yml
@@ -0,0 +1,28 @@
+# 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.
+
+type: SINGLE_VALUE
+results:
+ {{- contains .results }}
+ - metric:
+ labels: []
+ values:
+ {{- contains .values }}
+ - id: {{ notEmpty .id }}
+ value: {{ .value }}
+ traceid: null
+ {{- end}}
+ {{- end}}
+error: null
diff --git a/test/e2e-v2/cases/kong/expected/service.yml
b/test/e2e-v2/cases/kong/expected/service.yml
new file mode 100644
index 0000000000..8a4d7c6c52
--- /dev/null
+++ b/test/e2e-v2/cases/kong/expected/service.yml
@@ -0,0 +1,24 @@
+# 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.
+
+{{- contains . }}
+- id: {{ b64enc "kong::kong-cluster" }}.1
+ name: kong::kong-cluster
+ group: kong
+ shortname: kong-cluster
+ layers:
+ - KONG
+ normal: true
+{{- end }}
\ No newline at end of file
diff --git a/test/e2e-v2/cases/kong/kong-cases.yaml
b/test/e2e-v2/cases/kong/kong-cases.yaml
new file mode 100644
index 0000000000..85d6786f48
--- /dev/null
+++ b/test/e2e-v2/cases/kong/kong-cases.yaml
@@ -0,0 +1,80 @@
+# 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 file is used to show how to write configuration files and can be used
to test.
+
+cases:
+ # service list
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql service ls
+ expected: expected/service.yml
+ # service metrics
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression='latest(aggregate_labels(meter_kong_service_nginx_metric_errors_total,sum))'
--service-name=kong::kong-cluster
+ expected: expected/metrics-single-value.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression='latest(aggregate_labels(meter_kong_service_datastore_reachable,sum(service_instance_id)))'
--service-name=kong::kong-cluster
+ expected: expected/metrics-single-value-label.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression='aggregate_labels(meter_kong_service_http_bandwidth,sum(direction))'
--service-name=kong::kong-cluster
+ expected: expected/metrics-has-value-label-bandwidth-service.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression='aggregate_labels(meter_kong_service_http_status,sum(code))'
--service-name=kong::kong-cluster
+ expected: expected/metrics-has-value-label-status.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression='aggregate_labels(meter_kong_service_http_requests,sum)'
--service-name=kong::kong-cluster
+ expected: expected/metrics-has-value.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression='aggregate_labels(meter_kong_service_nginx_connections_total,sum(state))'
--service-name=kong::kong-cluster
+ expected: expected/metrics-has-value-label-state.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression='aggregate_labels(meter_kong_service_nginx_timers,sum(state))'
--service-name=kong::kong-cluster
+ expected: expected/metrics-has-value-label-state.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression='aggregate_labels(meter_kong_service_kong_latency,avg(p))'
--service-name=kong::kong-cluster
+ expected: expected/metrics-has-value-label-percentile.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression='aggregate_labels(meter_kong_service_request_latency,avg(p))'
--service-name=kong::kong-cluster
+ expected: expected/metrics-has-value-label-percentile.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression='aggregate_labels(meter_kong_service_upstream_latency,avg(p))'
--service-name=kong::kong-cluster
+ expected: expected/metrics-has-value-label-percentile.yml
+
+ # instance metrics
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_http_bandwidth
--service-name=kong::kong-cluster --instance-name=kong-1:8001
+ expected: expected/metrics-has-value-label-bandwidth.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_http_status --service-name=kong::kong-cluster
--instance-name=kong-1:8001
+ expected: expected/metrics-has-value-label-status.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_datastore_reachable
--service-name=kong::kong-cluster --instance-name=kong-1:8001
+ expected: expected/metrics-has-value.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_http_requests
--service-name=kong::kong-cluster --instance-name=kong-1:8001
+ expected: expected/metrics-has-value.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_shared_dict_bytes
--service-name=kong::kong-cluster --instance-name=kong-1:8001
+ expected: expected/metrics-has-value-label-shared-dict.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_shared_dict_total_bytes
--service-name=kong::kong-cluster --instance-name=kong-1:8001
+ expected: expected/metrics-has-value-label-shared-dict.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_memory_workers_lua_vms_bytes
--service-name=kong::kong-cluster --instance-name=kong-1:8001
+ expected: expected/metrics-has-value-label-pid.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_nginx_connections_total
--service-name=kong::kong-cluster --instance-name=kong-1:8001
+ expected: expected/metrics-has-value-label-state.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_nginx_timers --service-name=kong::kong-cluster
--instance-name=kong-1:8001
+ expected: expected/metrics-has-value-label-state.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_kong_latency --service-name=kong::kong-cluster
--instance-name=kong-1:8001
+ expected: expected/metrics-has-value-label-percentile.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_request_latency
--service-name=kong::kong-cluster --instance-name=kong-1:8001
+ expected: expected/metrics-has-value-label-percentile.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_instance_upstream_latency
--service-name=kong::kong-cluster --instance-name=kong-1:8001
+ expected: expected/metrics-has-value-label-percentile.yml
+
+ # Endpoint metrics
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_endpoint_http_bandwidth
--service-name=kong::kong-cluster --instance-name=kong-1:8001
--endpoint-name=sw_route
+ expected: expected/metrics-has-value-label-bandwidth-endpoint.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_endpoint_http_status --service-name=kong::kong-cluster
--instance-name=kong-1:8001 --endpoint-name=sw_route
+ expected: expected/metrics-has-value-label-status.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_endpoint_kong_latency --service-name=kong::kong-cluster
--instance-name=kong-1:8001 --endpoint-name=sw_route
+ expected: expected/metrics-has-value-label-percentile.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_endpoint_request_latency
--service-name=kong::kong-cluster --instance-name=kong-1:8001
--endpoint-name=sw_route
+ expected: expected/metrics-has-value-label-percentile.yml
+ - query: swctl --display yaml
--base-url=http://${oap_host}:${oap_12800}/graphql metrics exec
--expression=meter_kong_endpoint_upstream_latency
--service-name=kong::kong-cluster --instance-name=kong-1:8001
--endpoint-name=sw_route
+ expected: expected/metrics-has-value-label-percentile.yml
\ No newline at end of file
diff --git a/test/e2e-v2/cases/kong/kong-e2e-data-mock.sh
b/test/e2e-v2/cases/kong/kong-e2e-data-mock.sh
new file mode 100644
index 0000000000..dda1e69777
--- /dev/null
+++ b/test/e2e-v2/cases/kong/kong-e2e-data-mock.sh
@@ -0,0 +1,45 @@
+#!/bin/bash
+# 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 script is used to test the Kong plugin with the data mock service.
+
+# Add global plugins
+curl -i -X POST http://kong-1:8001/plugins \
+ --data name=prometheus \
+ --data config.per_consumer=true \
+ --data config.status_code_metrics=true \
+ --data config.ai_metrics=true \
+ --data config.latency_metrics=true \
+ --data config.bandwidth_metrics=true \
+ --data config.upstream_health_metrics=true
+curl -i -X POST http://kong-1:8001/plugins \
+ --data name=rate-limiting \
+ --data config.minute=5 \
+ --data config.policy=local
+
+# Add a mock service and route
+curl -i -s -X POST http://kong-1:8001/services \
+ --data name=sw_service \
+ --data url='http://httpbin.konghq.com'
+curl -i -X POST http://kong-1:8001/services/sw_service/routes \
+ --data 'paths[]=/mock' \
+ --data name=sw_route
+
+while true
+do
+ curl -s -i http://kong-1:8000/mock/anything > /dev/null
+ sleep 5
+done
\ No newline at end of file
diff --git a/test/e2e-v2/cases/kong/otel-collector-config.yaml
b/test/e2e-v2/cases/kong/otel-collector-config.yaml
new file mode 100644
index 0000000000..feff62b04d
--- /dev/null
+++ b/test/e2e-v2/cases/kong/otel-collector-config.yaml
@@ -0,0 +1,44 @@
+# 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.
+
+receivers:
+ prometheus:
+ config:
+ scrape_configs:
+ - job_name: 'kong-monitoring'
+ metrics_path: "/metrics"
+ scrape_interval: 10s
+ static_configs:
+ - targets: ['kong-1:8001']
+ labels:
+ host_name: kong-cluster
+
+processors:
+ batch:
+
+exporters:
+ otlp:
+ endpoint: oap:11800
+ tls:
+ insecure: true
+service:
+ pipelines:
+ metrics:
+ receivers:
+ - prometheus
+ processors:
+ - batch
+ exporters:
+ - otlp
\ No newline at end of file