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
meter_kong_instance_http_bandwidth
meter_kong_endpoint_http_bandwidth | Total bandwidth (ingress/egress) throughput | Kong |
+| HTTP Status | count | meter_kong_service_http_status
meter_kong_instance_http_status
meter_kong_endpoint_http_status | HTTP status codes per consumer/service/route in Kong | Kong |
+| HTTP Request | count | meter_kong_service_http_requests
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
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
meter_kong_instance_kong_latency
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
meter_kong_instance_request_latency
meter_kong_endpoint_request_latency | Total latency incurred during requests for each service/route in Kong | Kong |
+| Latency | ms | meter_kong_service_upstream_latency
meter_kong_instance_upstream_latency
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
meter_kong_instance_nginx_connections_total | Number of connections by subsystem | Kong |
+| Nginx | count | meter_kong_service_nginx_timers
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
meter_kong_instance_http_bandwidth
meter_kong_endpoint_http_bandwidth | Total bandwidth (ingress/egress) throughput | Kong |
+| HTTP Status | count | meter_kong_service_http_status
meter_kong_instance_http_status
meter_kong_endpoint_http_status | HTTP status codes per consumer/service/route in Kong | Kong |
+| HTTP Request | count | meter_kong_service_http_requests
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
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
meter_kong_instance_kong_latency
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
meter_kong_instance_request_latency
meter_kong_endpoint_request_latency | Total latency incurred during requests for each service/route in Kong | Kong |
+| Latency | ms | meter_kong_service_upstream_latency
meter_kong_instance_upstream_latency
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
meter_kong_instance_nginx_connections_total | Number of connections by subsystem | Kong |
+| Nginx | count | meter_kong_service_nginx_timers
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.
+#
+# Examples: +#
+# "PT20.345S" -- parses as "20.345 seconds" +# "PT15M" -- parses as "15 minutes" (where a minute is 60 seconds) +# "PT10H" -- parses as "10 hours" (where an hour is 3600 seconds) +# "P2D" -- parses as "2 days" (where a day is 24 hours or 86400 seconds) +# "P2DT3H4M" -- parses as "2 days, 3 hours and 4 minutes" +# "P-6H3M" -- parses as "-6 hours and +3 minutes" +# "-P6H3M" -- parses as "-6 hours and -3 minutes" +# "-P-6H+3M" -- parses as "+6 hours and -3 minutes" +#+# Licensed to the Apache Software Foundation (ASF) under one or more +# contributor license agreements. See the NOTICE file distributed with +# this work for additional information regarding copyright ownership. +# The ASF licenses this file to You under the Apache License, Version 2.0 +# (the "License"); you may not use this file except in compliance with +# the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. + +# This will parse a textual representation of a duration. The formats +# accepted are based on the ISO-8601 duration format {@code PnDTnHnMn.nS} +# with days considered to be exactly 24 hours. +#
+# Examples: +#
+# "PT20.345S" -- parses as "20.345 seconds" +# "PT15M" -- parses as "15 minutes" (where a minute is 60 seconds) +# "PT10H" -- parses as "10 hours" (where an hour is 3600 seconds) +# "P2D" -- parses as "2 days" (where a day is 24 hours or 86400 seconds) +# "P2DT3H4M" -- parses as "2 days, 3 hours and 4 minutes" +# "P-6H3M" -- parses as "-6 hours and +3 minutes" +# "-P6H3M" -- parses as "-6 hours and -3 minutes" +# "-P-6H+3M" -- parses as "+6 hours and -3 minutes" +#+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. +#
+# Examples: +#
+# "PT20.345S" -- parses as "20.345 seconds" +# "PT15M" -- parses as "15 minutes" (where a minute is 60 seconds) +# "PT10H" -- parses as "10 hours" (where an hour is 3600 seconds) +# "P2D" -- parses as "2 days" (where a day is 24 hours or 86400 seconds) +# "P2DT3H4M" -- parses as "2 days, 3 hours and 4 minutes" +# "P-6H3M" -- parses as "-6 hours and +3 minutes" +# "-P6H3M" -- parses as "-6 hours and -3 minutes" +# "-P-6H+3M" -- parses as "+6 hours and -3 minutes" +#+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