You are viewing a plain text version of this content. The canonical link for it is here.
Posted to notifications@skywalking.apache.org by wu...@apache.org on 2023/02/15 15:14:20 UTC
[skywalking] branch master updated: feature: windows monitoring (#10298)
This is an automated email from the ASF dual-hosted git repository.
wusheng pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/skywalking.git
The following commit(s) were added to refs/heads/master by this push:
new 574b83f095 feature: windows monitoring (#10298)
574b83f095 is described below
commit 574b83f095861d4199fdb78aa52923765cf921a1
Author: Mike <84...@qq.com>
AuthorDate: Wed Feb 15 23:14:04 2023 +0800
feature: windows monitoring (#10298)
---
.github/workflows/skywalking.yaml | 2 +
docs/en/setup/backend/backend-win-monitoring.md | 34 ++++
docs/menu.yml | 2 +
.../skywalking/oap/server/core/analysis/Layer.java | 8 +-
.../ui/template/UITemplateInitializer.java | 1 +
.../src/main/resources/application.yml | 2 +-
.../src/main/resources/otel-rules/windows.yaml | 72 ++++++++
.../os_windows/windows-root.json | 87 +++++++++
.../os_windows/windows-service.json | 202 +++++++++++++++++++++
test/e2e-v2/cases/win/docker-compose.yml | 51 ++++++
test/e2e-v2/cases/win/e2e.yaml | 44 +++++
.../cases/win/expected/metrics-has-value.yml | 19 ++
test/e2e-v2/cases/win/expected/service.yml | 24 +++
.../cases/win/mock-data/otel-mock-metrics.json | 177 ++++++++++++++++++
.../otel-collector-config.yaml | 62 +++++++
test/e2e-v2/cases/win/win-cases.yaml | 22 +++
16 files changed, 807 insertions(+), 2 deletions(-)
diff --git a/.github/workflows/skywalking.yaml b/.github/workflows/skywalking.yaml
index a080ae676f..9c02556851 100644
--- a/.github/workflows/skywalking.yaml
+++ b/.github/workflows/skywalking.yaml
@@ -663,6 +663,8 @@ jobs:
config: test/e2e-v2/cases/virtual-mq/e2e.yaml
- name: AWS Cloud EKS
config: test/e2e-v2/cases/aws/eks/e2e.yaml
+ - name: Windows
+ config: test/e2e-v2/cases/win/e2e.yaml
steps:
- uses: actions/checkout@v3
with:
diff --git a/docs/en/setup/backend/backend-win-monitoring.md b/docs/en/setup/backend/backend-win-monitoring.md
new file mode 100644
index 0000000000..6ecf4135a6
--- /dev/null
+++ b/docs/en/setup/backend/backend-win-monitoring.md
@@ -0,0 +1,34 @@
+# Windows Monitoring
+SkyWalking leverages Prometheus windows_exporter to collect metrics data from the Windows and leverages OpenTelemetry Collector to transfer the metrics to
+[OpenTelemetry receiver](opentelemetry-receiver.md) and into the [Meter System](./../../concepts-and-designs/meter.md).
+Windows entity as a `Service` in OAP and on the `Layer: OS_WINDOWS`.
+
+## Data flow
+**For OpenTelemetry receiver:**
+1. The Prometheus windows_exporter collects metrics data from the VMs.
+2. The OpenTelemetry Collector fetches metrics from windows_exporter via Prometheus Receiver and pushes metrics to the SkyWalking OAP Server via the OpenCensus gRPC Exporter or 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.
+
+## Setup
+**For OpenTelemetry receiver:**
+1. Setup [Prometheus windows_exporter](https://github.com/prometheus-community/windows_exporter).
+2. Setup [OpenTelemetry Collector ](https://opentelemetry.io/docs/collector/). This is an example for OpenTelemetry Collector configuration [otel-collector-config.yaml](../../../../test/e2e-v2/cases/win/prometheus-windows_exporter/otel-collector-config.yaml).
+3. Config SkyWalking [OpenTelemetry receiver](opentelemetry-receiver.md).
+
+## Supported Metrics
+
+| Monitoring Panel | Unit | Metric Name | Description | Data Source |
+|------------------------------|------|-------------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------|-----------------------------------------------------|
+| CPU Usage | % | meter_win_cpu_total_percentage | The total percentage usage of the CPU core. If there are 2 cores, the maximum usage is 200%. | Prometheus windows_exporter |
+| Memory RAM Usage | MB | meter_win_memory_used | The total RAM usage | Prometheus windows_exporter |
+| Memory Swap Usage | % | meter_win_memory_swap_percentage | The percentage usage of swap memory | Prometheus windows_exporter |
+| CPU Average Used | % | meter_win_cpu_average_used | The percentage usage of the CPU core in each mode | Prometheus windows_exporter |
+| Memory RAM | MB | meter_win_memory_total<br />meter_win_memory_available<br />meter_win_memory_used | The RAM statistics, including Total / Available / Used | Prometheus windows_exporter |
+| Memory Swap | MB | meter_win_memory_swap_free<br />meter_win_memory_swap_total | Swap memory statistics, including Free / Total | Prometheus windows_exporter | | The percentage usage of the file system at each mount point | Prometheus win [...]
+| Disk R/W | KB/s | meter_win_disk_read,meter_win_disk_written | The disk read and written | Prometheus windows_exporter |
+| Network Bandwidth Usage | KB/s | meter_win_network_receive<br />meter_win_network_transmit | The network receive and transmit | Prometheus windows_exporter | | The number of file descriptors allocated | Prometheus windows [...]
+
+## Customizing
+You can customize your own metrics/expression/dashboard panel.
+The metrics definition and expression rules are found in `/config/otel-rules/windows.yaml`.
+The dashboard panel confirmations are found in `/config/ui-initialized-templates/os_windows`.
diff --git a/docs/menu.yml b/docs/menu.yml
index 87b79e37fa..1a74b095b7 100644
--- a/docs/menu.yml
+++ b/docs/menu.yml
@@ -183,6 +183,8 @@ catalog:
catalog:
- name: "Linux Monitoring"
path: "/en/setup/backend/backend-vm-monitoring"
+ - name: "Windows Monitoring"
+ path: "/en/setup/backend/backend-win-monitoring"
- name: "AWS Cloud Monitoring"
catalog:
- name: "EKS Monitoring"
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 daaa9f04e3..dd4da5ad05 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
@@ -141,7 +141,13 @@ public enum Layer {
/**
* EKS (Amazon Elastic Kubernetes Service) is k8s service provided by AWS Cloud
*/
- AWS_EKS(22, true);
+ AWS_EKS(22, true),
+
+ /**
+ * Windows Machine
+ */
+ OS_WINDOWS(23, 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 1183a848a5..49539ff305 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
@@ -61,6 +61,7 @@ public class UITemplateInitializer {
Layer.APISIX.name(),
Layer.VIRTUAL_MQ.name(),
Layer.AWS_EKS.name(),
+ Layer.OS_WINDOWS.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 b452006032..a08843be1d 100644
--- a/oap-server/server-starter/src/main/resources/application.yml
+++ b/oap-server/server-starter/src/main/resources/application.yml
@@ -356,7 +356,7 @@ receiver-otel:
selector: ${SW_OTEL_RECEIVER:default}
default:
enabledHandlers: ${SW_OTEL_RECEIVER_ENABLED_HANDLERS:"oc,otlp"}
- enabledOtelRules: ${SW_OTEL_RECEIVER_ENABLED_OTEL_RULES:"apisix,k8s/*,istio-controlplane,vm,mysql/*,postgresql/*,oap,aws-eks/*"}
+ enabledOtelRules: ${SW_OTEL_RECEIVER_ENABLED_OTEL_RULES:"apisix,k8s/*,istio-controlplane,vm,mysql/*,postgresql/*,oap,aws-eks/*,windows"}
receiver-zipkin:
selector: ${SW_RECEIVER_ZIPKIN:-}
diff --git a/oap-server/server-starter/src/main/resources/otel-rules/windows.yaml b/oap-server/server-starter/src/main/resources/otel-rules/windows.yaml
new file mode 100644
index 0000000000..ee667bdce3
--- /dev/null
+++ b/oap-server/server-starter/src/main/resources/otel-rules/windows.yaml
@@ -0,0 +1,72 @@
+# Licensed to the Apache Software Foundation (ASF) under one or more
+# contributor license agreements. See the NOTICE file distributed with
+# this work for additional information regarding copyright ownership.
+# The ASF licenses this file to You under the Apache License, Version 2.0
+# (the "License"); you may not use this file except in compliance with
+# the License. You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+# This will parse a textual representation of a duration. The formats
+# accepted are based on the ISO-8601 duration format {@code PnDTnHnMn.nS}
+# with days considered to be exactly 24 hours.
+# <p>
+# Examples:
+# <pre>
+# "PT20.345S" -- parses as "20.345 seconds"
+# "PT15M" -- parses as "15 minutes" (where a minute is 60 seconds)
+# "PT10H" -- parses as "10 hours" (where an hour is 3600 seconds)
+# "P2D" -- parses as "2 days" (where a day is 24 hours or 86400 seconds)
+# "P2DT3H4M" -- parses as "2 days, 3 hours and 4 minutes"
+# "P-6H3M" -- parses as "-6 hours and +3 minutes"
+# "-P6H3M" -- parses as "-6 hours and -3 minutes"
+# "-P-6H+3M" -- parses as "+6 hours and -3 minutes"
+# </pre>
+filter: "{ tags -> tags.job_name == 'windows-monitoring' }" # The OpenTelemetry job name
+expSuffix: service(['node_identifier_host_name'] , Layer.OS_WINDOWS)
+metricPrefix: meter_win
+metricsRules:
+ #cpu windows don't expose cpu load metrics
+ - name: cpu_total_percentage
+ exp: (windows_cpu_time_total * 100).tagNotEqual('mode' , 'idle').sum(['node_identifier_host_name']).rate('PT1M')
+ - name: cpu_average_used
+ exp: (windows_cpu_time_total * 100).sum(['node_identifier_host_name' , 'mode']).rate('PT1M')
+
+ #memory
+ - name: memory_total
+ exp: windows_cs_physical_memory_bytes
+ - name: memory_available
+ exp: windows_os_physical_memory_free_bytes
+ - name: memory_used
+ exp: windows_cs_physical_memory_bytes - windows_os_physical_memory_free_bytes
+ - name: memory_swap_free
+ exp: windows_os_virtual_memory_free_bytes
+ - name: memory_swap_total
+ exp: windows_os_virtual_memory_bytes
+ - name: memory_swap_percentage
+ exp: 100 - ((windows_os_virtual_memory_free_bytes * 100) / windows_os_virtual_memory_bytes)
+
+ #disk
+ - name: disk_read
+ exp: windows_logical_disk_read_bytes_total.sum(['node_identifier_host_name']).rate('PT1M')
+ - name: disk_written
+ exp: windows_logical_disk_write_bytes_total.sum(['node_identifier_host_name']).rate('PT1M')
+
+ #network
+ - name: network_receive
+ exp: windows_net_bytes_received_total.sum(['node_identifier_host_name']).irate()
+ - name: network_transmit
+ exp: windows_net_bytes_sent_total.sum(['node_identifier_host_name']).irate()
+
+
+
+
+
+
+
diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/os_windows/windows-root.json b/oap-server/server-starter/src/main/resources/ui-initialized-templates/os_windows/windows-root.json
new file mode 100644
index 0000000000..a6625bc7f7
--- /dev/null
+++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/os_windows/windows-root.json
@@ -0,0 +1,87 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+[
+ {
+ "id": "Windows-Root",
+ "configuration": {
+ "children": [
+ {
+ "x": 0,
+ "y": 2,
+ "w": 24,
+ "h": 51,
+ "i": "0",
+ "type": "Widget",
+ "widget": {
+ "title": ""
+ },
+ "graph": {
+ "type": "ServiceList",
+ "dashboardName": "Windows-Service",
+ "fontSize": 12,
+ "showXAxis": false,
+ "showYAxis": false,
+ "showGroup": false
+ },
+ "metrics": [
+ "meter_win_cpu_total_percentage"
+ ],
+ "metricTypes": [
+ "readMetricsValues"
+ ],
+ "moved": false,
+ "metricConfig": [
+ {
+ "label": "CPU Usage",
+ "unit": "%",
+ "calculation": "average"
+ }
+ ]
+ },
+ {
+ "x": 0,
+ "y": 0,
+ "w": 24,
+ "h": 2,
+ "i": "100",
+ "type": "Text",
+ "metricTypes": [
+ ""
+ ],
+ "metrics": [
+ ""
+ ],
+ "graph": {
+ "fontColor": "blue",
+ "backgroundColor": "white",
+ "content": "Provide Windows OS monitoring.",
+ "fontSize": 14,
+ "textAlign": "left",
+ "url": "https://skywalking.apache.org/docs/main/next/en/setup/backend/backend-win-monitoring/"
+ },
+ "moved": false
+ }
+ ],
+ "id": "Windows-Root",
+ "layer": "OS_WINDOWS",
+ "entity": "All",
+ "name": "Windows-Root",
+ "isRoot": true
+ }
+ }
+]
diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/os_windows/windows-service.json b/oap-server/server-starter/src/main/resources/ui-initialized-templates/os_windows/windows-service.json
new file mode 100644
index 0000000000..58154755a4
--- /dev/null
+++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/os_windows/windows-service.json
@@ -0,0 +1,202 @@
+/**
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+[{
+ "id": "Windows-Service",
+ "configuration": {
+ "children": [{
+ "x": 8,
+ "y": 19,
+ "w": 8,
+ "h": 13,
+ "i": "2",
+ "type": "Widget",
+ "widget": {
+ "title": "Network Bandwidth Usage (KB/s)"
+ },
+ "graph": {
+ "type": "Area",
+ "opacity": 0.4,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "metrics": ["meter_win_network_receive", "meter_win_network_transmit"],
+ "metricTypes": ["readMetricsValues", "readMetricsValues"]
+ }, {
+ "x": 8,
+ "y": 6,
+ "w": 8,
+ "h": 13,
+ "i": "3",
+ "type": "Widget",
+ "widget": {
+ "title": "Disk R/W (KB/s - OTEL, ops - Zabbix)"
+ },
+ "graph": {
+ "type": "Line",
+ "opacity": 0.4,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "metrics": ["meter_win_disk_read", "meter_win_disk_written"],
+ "metricTypes": ["readMetricsValues", "readMetricsValues"],
+ "metricConfig": [{
+ "calculation": "byteToKB"
+ }, {
+ "calculation": "byteToKB"
+ }]
+ }, {
+ "x": 0,
+ "y": 6,
+ "w": 8,
+ "h": 13,
+ "i": "5",
+ "type": "Widget",
+ "widget": {
+ "title": "CPU Average Used (%)"
+ },
+ "graph": {
+ "type": "Line",
+ "step": false,
+ "smooth": false,
+ "showSymbol": false,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "metrics": ["meter_win_cpu_average_used"],
+ "metricTypes": ["readLabeledMetricsValues"]
+ }, {
+ "x": 16,
+ "y": 6,
+ "w": 8,
+ "h": 13,
+ "i": "6",
+ "type": "Widget",
+ "widget": {
+ "title": "Memory RAM (MB)"
+ },
+ "graph": {
+ "type": "Area",
+ "opacity": 0.4,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "metrics": ["meter_win_memory_used", "meter_win_memory_total", "meter_win_memory_available"],
+ "metricTypes": ["readMetricsValues", "readMetricsValues", "readMetricsValues"],
+ "metricConfig": [{
+ "calculation": "byteToMB"
+ }, {
+ "calculation": "byteToMB"
+ }, {
+ "calculation": "byteToMB"
+ }]
+ }, {
+ "x": 0,
+ "y": 19,
+ "w": 8,
+ "h": 13,
+ "i": "8",
+ "type": "Widget",
+ "widget": {
+ "title": "Memory Swap (MB)"
+ },
+ "graph": {
+ "type": "Area",
+ "opacity": 0.4,
+ "showXAxis": true,
+ "showYAxis": true
+ },
+ "metrics": ["meter_win_memory_swap_free", "meter_win_memory_swap_total"],
+ "metricTypes": ["readMetricsValues", "readMetricsValues"],
+ "metricConfig": [{
+ "calculation": "byteToMB"
+ }, {
+ "calculation": "byteToMB"
+ }]
+ }, {
+ "x": 16,
+ "y": 0,
+ "w": 8,
+ "h": 6,
+ "i": "9",
+ "type": "Widget",
+ "widget": {
+ "title": "Memory Swap Usage"
+ },
+ "graph": {
+ "type": "Card",
+ "fontSize": 14,
+ "textAlign": "center",
+ "showUnit": true
+ },
+ "metrics": ["meter_win_memory_swap_percentage"],
+ "metricTypes": ["readMetricsValue"],
+ "metricConfig": [{
+ "calculation": "percentage",
+ "unit": "%"
+ }]
+ }, {
+ "x": 8,
+ "y": 0,
+ "w": 8,
+ "h": 6,
+ "i": "10",
+ "type": "Widget",
+ "widget": {
+ "title": "Memory RAM Usage"
+ },
+ "graph": {
+ "type": "Card",
+ "fontSize": 14,
+ "textAlign": "center",
+ "showUnit": true
+ },
+ "metrics": ["meter_win_memory_used"],
+ "metricTypes": ["readMetricsValue"],
+ "metricConfig": [{
+ "calculation": "byteToMB",
+ "unit": "MB"
+ }]
+ }, {
+ "x": 0,
+ "y": 0,
+ "w": 8,
+ "h": 6,
+ "i": "11",
+ "type": "Widget",
+ "widget": {
+ "title": "CPU Usage"
+ },
+ "graph": {
+ "type": "Card",
+ "fontSize": 14,
+ "textAlign": "center",
+ "showUnit": true
+ },
+ "metrics": ["meter_win_cpu_total_percentage"],
+ "metricTypes": ["readMetricsValue"],
+ "metricConfig": [{
+ "unit": "%"
+ }]
+ }],
+ "layer": "OS_WINDOWS",
+ "entity": "Service",
+ "name": "Windows-Service",
+ "id": "Windows-Service",
+ "isRoot": false
+ }
+}]
\ No newline at end of file
diff --git a/test/e2e-v2/cases/win/docker-compose.yml b/test/e2e-v2/cases/win/docker-compose.yml
new file mode 100644
index 0000000000..d2544f61ba
--- /dev/null
+++ b/test/e2e-v2/cases/win/docker-compose.yml
@@ -0,0 +1,51 @@
+# 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
+ networks:
+ e2e:
+
+ sender:
+ image: "eclipse-temurin:8-jre"
+ volumes:
+ - ./../../java-test-service/e2e-mock-sender/target/e2e-mock-sender-2.0.0.jar:/e2e-mock-sender-2.0.0.jar
+ - ./mock-data:/data/otel-metrics
+ command: [ "java", "-jar", "/e2e-mock-sender-2.0.0.jar" ]
+ environment:
+ OAP_HOST: oap
+ OAP_GRPC_PORT: 11800
+ OTEL_METRICS_DATA_PATH: /data/otel-metrics
+ networks:
+ - e2e
+ ports:
+ - 9093
+ healthcheck:
+ test: ["CMD", "sh", "-c", "nc -nz 127.0.0.1 9093"]
+ interval: 5s
+ timeout: 60s
+ retries: 120
+ depends_on:
+ oap:
+ condition: service_healthy
+networks:
+ e2e:
diff --git a/test/e2e-v2/cases/win/e2e.yaml b/test/e2e-v2/cases/win/e2e.yaml
new file mode 100644
index 0000000000..49fd45b9a8
--- /dev/null
+++ b/test/e2e-v2/cases/win/e2e.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.
+
+# 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
+
+trigger:
+ action: http
+ interval: 3s
+ times: 10
+ url: http://${sender_host}:${sender_9093}/otel-metrics/send
+ method: GET
+
+verify:
+ retry:
+ count: 10
+ interval: 3s
+ cases:
+ - includes:
+ - ./win-cases.yaml
diff --git a/test/e2e-v2/cases/win/expected/metrics-has-value.yml b/test/e2e-v2/cases/win/expected/metrics-has-value.yml
new file mode 100644
index 0000000000..ce1f3d83c8
--- /dev/null
+++ b/test/e2e-v2/cases/win/expected/metrics-has-value.yml
@@ -0,0 +1,19 @@
+# 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 . }}
+- key: {{ notEmpty .key }}
+ value: {{ ge .value 0 }}
+{{- end }}
diff --git a/test/e2e-v2/cases/win/expected/service.yml b/test/e2e-v2/cases/win/expected/service.yml
new file mode 100644
index 0000000000..a3aec14d8d
--- /dev/null
+++ b/test/e2e-v2/cases/win/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 "10.211.55.3" }}.1
+ name: 10.211.55.3
+ group: ""
+ shortname: 10.211.55.3
+ normal: true
+ layers:
+ - OS_WINDOWS
+ {{- end }}
diff --git a/test/e2e-v2/cases/win/mock-data/otel-mock-metrics.json b/test/e2e-v2/cases/win/mock-data/otel-mock-metrics.json
new file mode 100644
index 0000000000..4cb9c82d67
--- /dev/null
+++ b/test/e2e-v2/cases/win/mock-data/otel-mock-metrics.json
@@ -0,0 +1,177 @@
+{
+ "resourceMetrics": [
+ {
+ "resource": {
+ "attributes": [
+ {
+ "key": "service.name",
+ "value": {
+ "stringValue": "windows-monitoring"
+ }
+ },
+ {
+ "key": "net.host.name",
+ "value": {
+ "stringValue": "10.211.55.3"
+ }
+ },
+ {
+ "key": "service.instance.id",
+ "value": {
+ "stringValue": "10.211.55.3:9182"
+ }
+ },
+ {
+ "key": "net.host.port",
+ "value": {
+ "stringValue": "9182"
+ }
+ },
+ {
+ "key": "http.scheme",
+ "value": {
+ "stringValue": "http"
+ }
+ }
+ ]
+ },
+ "scopeMetrics": [
+ {
+ "scope": {},
+ "metrics": [
+ {
+ "name": "windows_cpu_time_total",
+ "description": "Time that processor spent in different modes (dpc, idle, interrupt, privileged, user)",
+ "sum": {
+ "dataPoints": [
+ {
+ "startTimeUnixNano": "1676140244999000000",
+ "timeUnixNano": "1676140395007000000",
+ "asDouble": 3.4375,
+ "attributes": [
+ {
+ "key": "core",
+ "value": {
+ "stringValue": "0.0"
+ }
+ }
+ ]
+ },
+ {
+ "startTimeUnixNano": "1676140244999000000",
+ "timeUnixNano": "1676140395007000000",
+ "asDouble": 707.984375,
+ "attributes": [
+ {
+ "key": "core",
+ "value": {
+ "stringValue": "0.0"
+ }
+ },
+ {
+ "key": "mode",
+ "value": {
+ "stringValue": "idle"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+ },
+ {
+ "resource": {
+ "attributes": [
+ {
+ "key": "service.name",
+ "value": {
+ "stringValue": "windows-monitoring"
+ }
+ },
+ {
+ "key": "net.host.name",
+ "value": {
+ "stringValue": "10.211.55.3"
+ }
+ },
+ {
+ "key": "service.instance.id",
+ "value": {
+ "stringValue": "10.211.55.3:9182"
+ }
+ },
+ {
+ "key": "net.host.port",
+ "value": {
+ "stringValue": "9182"
+ }
+ },
+ {
+ "key": "http.scheme",
+ "value": {
+ "stringValue": "http"
+ }
+ }
+ ]
+ },
+ "scopeMetrics": [
+ {
+ "scope": {},
+ "metrics": [
+ {
+ "name": "windows_os_virtual_memory_bytes",
+ "description": "OperatingSystem.TotalVirtualMemorySize",
+ "gauge": {
+ "dataPoints": [
+ {
+ "timeUnixNano": "1676140375004000000",
+ "asDouble": 8.8387584E9
+ }
+ ]
+ }
+ },
+ {
+ "name": "windows_logical_disk_write_seconds_total",
+ "description": "Seconds that the disk was busy servicing write requests (LogicalDisk.PercentDiskWriteTime)",
+ "sum": {
+ "dataPoints": [
+ {
+ "startTimeUnixNano": "1676140244999000000",
+ "timeUnixNano": "1676140375004000000",
+ "asDouble": 9.669203699999999,
+ "attributes": [
+ {
+ "key": "volume",
+ "value": {
+ "stringValue": "C:"
+ }
+ }
+ ]
+ },
+ {
+ "startTimeUnixNano": "1676140244999000000",
+ "timeUnixNano": "1676140375004000000",
+ "asDouble": 8.321E-4,
+ "attributes": [
+ {
+ "key": "volume",
+ "value": {
+ "stringValue": "HarddiskVolume1"
+ }
+ }
+ ]
+ }
+ ]
+ }
+ }
+ ]
+ }
+ ]
+ }
+ ]
+}
+
diff --git a/test/e2e-v2/cases/win/prometheus-windows_exporter/otel-collector-config.yaml b/test/e2e-v2/cases/win/prometheus-windows_exporter/otel-collector-config.yaml
new file mode 100644
index 0000000000..373996186f
--- /dev/null
+++ b/test/e2e-v2/cases/win/prometheus-windows_exporter/otel-collector-config.yaml
@@ -0,0 +1,62 @@
+# 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: "windows-monitoring" # make sure to use this in the vm.yaml to filter only VM metrics
+ scrape_interval: 10s
+ static_configs:
+ - targets: ["win-service:9182"]
+
+processors:
+ batch:
+
+exporters:
+ ####################################################################################
+ # If you want to use otlp exporter please ensure that your OAP version is >= 9.2.0 #
+ # or you can use oc exporter, The config format should be: #
+ # opencensus: #
+ # endpoint: "oap:11800" #
+ # tls: #
+ # insecure: true #
+ ####################################################################################
+ otlp:
+ endpoint: "oap:11800" # The OAP Server address
+ ###############################################################################
+ # OTEL previous version before 0.34.0 the config format, eg. 0.29.0 should be:#
+ # insecure: true #
+ # The new version should be: #
+ # tls: #
+ # insecure: true #
+ ###############################################################################
+ tls:
+ insecure: true
+ #insecure: true
+ # Exports data to the console
+ logging:
+ logLevel: debug
+
+service:
+ pipelines:
+ metrics:
+ receivers: [prometheus]
+ processors: [batch]
+ #########################################
+ # oc exporter config format: #
+ # exporters: [opencensus,logging] #
+ #########################################
+ exporters: [otlp, logging]
diff --git a/test/e2e-v2/cases/win/win-cases.yaml b/test/e2e-v2/cases/win/win-cases.yaml
new file mode 100644
index 0000000000..c41b102a95
--- /dev/null
+++ b/test/e2e-v2/cases/win/win-cases.yaml
@@ -0,0 +1,22 @@
+# 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:
+ - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql service ls
+ expected: expected/service.yml
+ - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_win_cpu_total_percentage --service-name=10.211.55.3 | yq e 'to_entries' -
+ expected: expected/metrics-has-value.yml