From bfbda6fa14230c179aa9dc96edf9464c882a59b0 Mon Sep 17 00:00:00 2001 From: Zixin Zhou Date: Thu, 17 Oct 2024 10:09:10 +0800 Subject: [PATCH] Add support Kong monitoring (#12696) --- .github/workflows/skywalking.yaml | 2 + docs/en/changes/changes.md | 4 +- .../concepts-and-designs/service-hierarchy.md | 9 + .../setup/backend/backend-kong-monitoring.md | 77 ++++ docs/en/swip/SWIP-8.md | 61 +++ docs/menu.yml | 2 + .../oap/server/core/analysis/Layer.java | 7 +- .../ui/template/UITemplateInitializer.java | 1 + .../src/main/resources/application.yml | 2 +- .../main/resources/hierarchy-definition.yml | 5 + .../otel-rules/kong/kong-endpoint.yaml | 40 ++ .../otel-rules/kong/kong-instance.yaml | 105 ++++++ .../otel-rules/kong/kong-service.yaml | 69 ++++ .../kong/kong-endpoint.json | 157 ++++++++ .../kong/kong-instance.json | 324 ++++++++++++++++ .../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 ++ ...ics-has-value-label-bandwidth-endpoint.yml | 35 ++ ...rics-has-value-label-bandwidth-service.yml | 35 ++ .../metrics-has-value-label-bandwidth.yml | 37 ++ .../metrics-has-value-label-percentile.yml | 35 ++ .../expected/metrics-has-value-label-pid.yml | 35 ++ .../metrics-has-value-label-shared-dict.yml | 35 ++ .../metrics-has-value-label-state.yml | 35 ++ .../metrics-has-value-label-status.yml | 35 ++ .../cases/kong/expected/metrics-has-value.yml | 31 ++ .../expected/metrics-single-value-label.yml | 32 ++ .../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 +++ .../cases/kong/otel-collector-config.yaml | 44 +++ 35 files changed, 1978 insertions(+), 4 deletions(-) create mode 100644 docs/en/setup/backend/backend-kong-monitoring.md create mode 100644 docs/en/swip/SWIP-8.md create mode 100644 oap-server/server-starter/src/main/resources/otel-rules/kong/kong-endpoint.yaml create mode 100644 oap-server/server-starter/src/main/resources/otel-rules/kong/kong-instance.yaml create mode 100644 oap-server/server-starter/src/main/resources/otel-rules/kong/kong-service.yaml create mode 100644 oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-endpoint.json create mode 100644 oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-instance.json create mode 100644 oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-root.json create mode 100644 oap-server/server-starter/src/main/resources/ui-initialized-templates/kong/kong-service.json create mode 100644 test/e2e-v2/cases/kong/docker-compose.yml create mode 100644 test/e2e-v2/cases/kong/e2e.yaml create mode 100644 test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth-endpoint.yml create mode 100644 test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth-service.yml create mode 100644 test/e2e-v2/cases/kong/expected/metrics-has-value-label-bandwidth.yml create mode 100644 test/e2e-v2/cases/kong/expected/metrics-has-value-label-percentile.yml create mode 100644 test/e2e-v2/cases/kong/expected/metrics-has-value-label-pid.yml create mode 100644 test/e2e-v2/cases/kong/expected/metrics-has-value-label-shared-dict.yml create mode 100644 test/e2e-v2/cases/kong/expected/metrics-has-value-label-state.yml create mode 100644 test/e2e-v2/cases/kong/expected/metrics-has-value-label-status.yml create mode 100644 test/e2e-v2/cases/kong/expected/metrics-has-value.yml create mode 100644 test/e2e-v2/cases/kong/expected/metrics-single-value-label.yml create mode 100644 test/e2e-v2/cases/kong/expected/metrics-single-value.yml create mode 100644 test/e2e-v2/cases/kong/expected/service.yml create mode 100644 test/e2e-v2/cases/kong/kong-cases.yaml create mode 100644 test/e2e-v2/cases/kong/kong-e2e-data-mock.sh create mode 100644 test/e2e-v2/cases/kong/otel-collector-config.yaml 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