Repository: apache/skywalking (language: python)

Issue:
[Feature] Support MongoDB Monitoring
### Search before asking

- [X] I had searched in the [issues](https://github.com/apache/skywalking/issues?q=is%3Aissue) and found no similar feature requirement.


### Description

MongoDB is a popular document database, I hava do some works on mongodb monitoring and I want ask for a permit to contribute it to skywalking. Currently, it support mongodb single node、replSet、shard cluster monitoring. The mapping of mongodb and skywalking like the following table:
|MongoDB|skywalking|
|-----------|------------|
|cluster|Service|
|Node|Instance|
|ReplSet|Endpoint|

Data flow:
[mongodb exporter](https://github.com/percona/mongodb_exporter) -> OpenTelemetry Collector -> SkyWalking OTEL receiver (OTLP)

I hava following two questions:
1. whether it is appropriate monitoring replset as skywalking endpoint？
2. I want add a menu named MongoDB under database menu, is it ok？

### Use case

_No response_

### Related issues

_No response_

### Are you willing to submit a PR?

- [X] Yes I am willing to submit a PR!

### Code of Conduct

- [X] I agree to follow this project's [Code of Conduct](https://www.apache.org/foundation/policies/conduct)



Discussion / hints:
Assigned to you.
> whether it is appropriate monitoring replset as skywalking endpoint？

It should be `operation name`/`entity name` AFAIK. But I don't know whether you have that in the OTEL integration.

> I want add a menu named MongoDB under database menu, is it ok？

This is fine. But you should know, an important change about this is happening,
- https://github.com/apache/skywalking/pull/11005
- https://skywalking.apache.org/docs/main/next/en/ui/readme/#sidebar-menu-and-marketplace

@Fine0830 is working on that part.
@weixiang1862 You could work on other parts first, and you just need to update `ui-initialized-templates/menu.yaml`, and add the icon later. You should be good. You just can't see the menu for short term.
Further, ReplSet should not be the endpoint. Endpoint is a concept of logic operation, like URI, gRPC service, Database table operations, etc.
Ok, thanks for your remind.
@weixiang1862 When do you plan to submit this?
Sorry about this, I'm busy at my work this week, I think next week will be ok.
Some work progress made in this week:
1. MongoDB Cluster
![36d6bc04660dd25738b997a3a35f561](https://github.com/apache/skywalking/assets/16346644/19461f06-882d-4f12-91c9-604c5dceb4f2)

3. MongoDB Node
![706eeb7f89bd2b38fbdae7736415b2a](https://github.com/apache/skywalking/assets/16346644/03a10a48-8bf5-4439-98b8-9dba40cfd2e5)


I will complete e2e case and docs in next week, any suggestions for above?

Have you used the MQE? We are planning to remove the old(general) metric config soon.
> Have you used the MQE? We are planning to remove the old(general) metric config soon.

Yes, I used MQE to build this dashboard. I noticed you mention it in issue list.
Have you synced the latest commit? I think the dynamic menu is there. Have you tested the menu?
> Have you synced the latest commit? I think the dynamic menu is there. Have you tested the menu?

Not yet, I will test this later.
What are `getLastTime` and `getLastTime error time` meaning? This seems not a term.
> What are `getLastTime` and `getLastTime error time` meaning? This seems not a term.

They are calculated from these metrics:

[mongodb_ss_metrics_getLastError_wtime_num](https://www.mongodb.com/docs/manual/reference/command/serverStatus/#mongodb-serverstatus-serverstatus.metrics.getLastError.wtime.num)

[mongodb_ss_metrics_getLastError_wtimeouts](https://www.mongodb.com/docs/manual/reference/command/serverStatus/#mongodb-serverstatus-serverstatus.metrics.getLastError.wtime.totalMillis)

[mongodb_ss_metrics_getLastError_wtime_totalMillis](https://www.mongodb.com/docs/manual/reference/command/serverStatus/#mongodb-serverstatus-serverstatus.metrics.getLastError.wtime.totalMillis)

It represent the number and cost time of getLastError command with [write concern](https://www.mongodb.com/docs/v6.0/reference/write-concern/#std-label-write-concern), which wait for other members of a replica set to acknowledge for write operation.
OK, generally, I think it is good. 
Last check, the nodes are represented by Instance, right?
> OK, generally, I think it is good. Last check, the nodes are represented by Instance, right?

Yes, node represent a mongodb instance.
 OK, let's wait for your PR ready to review.

Fix patch:
diff --git a/.github/workflows/skywalking.yaml b/.github/workflows/skywalking.yaml
index 0dc3a975ec95..4813372aeeae 100644
--- a/.github/workflows/skywalking.yaml
+++ b/.github/workflows/skywalking.yaml
@@ -629,6 +629,8 @@ jobs:
             config: test/e2e-v2/cases/redis/redis-exporter/e2e.yaml
           - name: Elasticsearch
             config: test/e2e-v2/cases/elasticsearch/e2e.yaml
+          - name: MongoDB
+            config: test/e2e-v2/cases/mongodb/e2e.yaml
           - name: RabbitMQ
             config: test/e2e-v2/cases/rabbitmq/e2e.yaml
           - name: MQE Service
diff --git a/docs/en/changes/changes.md b/docs/en/changes/changes.md
index ae4dfb693328..35e6f66cc080 100644
--- a/docs/en/changes/changes.md
+++ b/docs/en/changes/changes.md
@@ -50,6 +50,7 @@
 * Apply MQE on Virtual-Cache layer UI-templates
 * Add Echo component ID(5015) language: Golang.
 * Fix `index out of bounds exception` in `aggregate_labels` MQE function.
+* Support MongoDB Server/Cluster monitoring powered by OTEL.
 * Do not print configurations values in logs to avoid sensitive info leaked.
 * Move created the latest index before retrieval indexes by aliases to avoid the 404 exception. This just prevents some interference from manual operations.
 * Add more Go VM metrics, as new skywalking-go agent provided since its 0.2 release.
diff --git a/docs/en/setup/backend/backend-mongodb-monitoring.md b/docs/en/setup/backend/backend-mongodb-monitoring.md
new file mode 100644
index 000000000000..d1e1845f53b8
--- /dev/null
+++ b/docs/en/setup/backend/backend-mongodb-monitoring.md
@@ -0,0 +1,79 @@
+# MongoDB monitoring
+
+SkyWalking leverages mongodb-exporter for collecting metrics data from MongoDB. It 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. The `mongodb-exporter` collects metrics data from MongoDB. The exporter works side by side with the MongoDB node.
+2. OpenTelemetry Collector fetches metrics from mongodb-exporter 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.
+
+## Setup
+
+1. Setup [mongodb-exporter](https://github.com/percona/mongodb_exporter).
+2. Set up [OpenTelemetry Collector](https://opentelemetry.io/docs/collector/getting-started/#docker). The example for OpenTelemetry Collector configuration, refer
+   to [here](../../../../test/e2e-v2/cases/mongodb/otel-collector-config.yaml).
+3. Config SkyWalking [OpenTelemetry receiver](opentelemetry-receiver.md).
+
+## MongoDB Monitoring
+
+MongoDB monitoring provides multidimensional metrics monitoring of MongoDB clusters as `Layer: MONGODB` `Service` in the OAP. In each cluster, the nodes are represented as `Instance`.
+
+### MongoDB Cluster Supported Metrics
+
+| Monitoring Panel                  | Unit | Metric Name                               | Description                                                         | Data Source      |
+|-----------------------------------|------|-------------------------------------------|---------------------------------------------------------------------|------------------|
+| Uptime (day)                      | day  | meter_mongodb_cluster_uptime              | Maximum uptime of nodes in the cluster                              | mongodb-exporter |
+| Data Size (GB)                    | GB   | meter_mongodb_cluster_data_size           | Total data size of the cluster                                      | mongodb-exporter |
+| Collection Count                  |      | meter_mongodb_cluster_collection_count    | Number of collection of the cluster                                 | mongodb-exporter |
+| Object Count                      |      | meter_mongodb_cluster_object_count        | Number of object of the cluster                                     | mongodb-exporter |
+| Document Avg QPS                  |      | meter_mongodb_cluster_document_avg_qps    | Avg document operations rate of nodes                               | mongodb-exporter |
+| Operation Avg QPS                 |      | meter_mongodb_cluster_operation_avg_qps   | Avg operations rate of nodes                                        | mongodb-exporter |
+| Total Connections                 |      | meter_mongodb_cluster_connections         | Cluster total connections of nodes                                  | mongodb-exporter |
+| Cursor Avg                        |      | meter_mongodb_cluster_cursor_avg          | Avg Opened cursor of nodes                                          | mongodb-exporter |
+| Replication Lag (ms)              | ms   | meter_mongodb_cluster_repl_lag            | Repl set member avg replication lag, this metric works in repl mode | mongodb-exporter |
+| DB Avg Data Size Per Shard (GB)   | GB   | meter_mongodb_cluster_db_data_size        | Avg data size per shard (replSet) of every database                 | mongodb-exporter |
+| DB Avg Index Size Per Shard (GB)  | GB   | meter_mongodb_cluster_db_index_size       | Avg index size per shard (replSet) of every database                | mongodb-exporter |
+| DB Avg Collection Count Per Shard |      | meter_mongodb_cluster_db_collection_count | Avg collection count per shard (replSet) of every database          | mongodb-exporter |
+| DB Avg Index Count Per Shard      |      | meter_mongodb_cluster_db_index_count      | Avg index count per shard (replSet) of every database               | mongodb-exporter |
+
+### MongoDB Node Supported Metrics
+
+| Monitoring Panel             | Unit | Metric Name                                                                                                           | Description                                                | Data Source      |
+|------------------------------|------|-----------------------------------------------------------------------------------------------------------------------|------------------------------------------------------------|------------------|
+| Uptime (day)                 | day  | meter_mongodb_node_uptime                                                                                             | Uptime of the node                                         | mongodb-exporter |
+| QPS                          |      | meter_mongodb_node_qps                                                                                                | Operations per second of the node                          | mongodb-exporter | 
+| Latency                      | µs   | meter_mongodb_node_latency                                                                                            | Latency of operations                                      | mongodb-exporter |
+| Memory Usage                 | %    | meter_mongodb_node_memory_usage                                                                                       | Memory usage percent of RAM                                | mongodb-exporter |
+| Version                      |      | meter_mongodb_node_version                                                                                            | MongoDB edition and version                                | mongodb-exporter |
+| ReplSet State                |      | meter_mongodb_node_rs_state                                                                                           | Repl set state of the node, this metric works in repl mode | mongodb-exporter |
+| CPU Usage (%)                | %    | meter_mongodb_node_cpu_total_percentage                                                                               | Cpu usage percent of the node                              | mongodb-exporter |
+| Network (KB/s)               | KB/s | meter_mongodb_node_network_bytes_in<br/>meter_mongodb_node_network_bytes_out                                          | Inbound and outbound network bytes of node                 | mongodb-exporter |
+| Memory Free (GB)             | GB   | meter_mongodb_node_memory_free_kb<br/>meter_mongodb_node_swap_memory_free_kb                                          | Free memory of RAM and swap                                | mongodb-exporter |
+| Disk (GB)                    | GB   | meter_mongodb_node_fs_used_size<br/>meter_mongodb_node_fs_total_size                                                  | Used and total size of disk                                | mongodb-exporter |
+| Connections                  |      | meter_mongodb_node_connections                                                                                        | Connection nums of node                                    | mongodb-exporter |
+| Active Client                |      | meter_mongodb_node_active_total_num<br/>meter_mongodb_node_active_reader_num<br/>meter_mongodb_node_active_writer_num | Count of active reader and writer                          | mongodb-exporter |
+| Transactions                 |      | meter_mongodb_node_transactions_active<br/>meter_mongodb_node_transactions_inactive                                   | Count of transactions running on the node                  | mongodb-exporter |
+| Document QPS                 |      | meter_mongodb_node_document_qps                                                                                       | Document operations per second                             | mongodb-exporter |
+| Operation QPS                |      | meter_mongodb_node_operation_qps                                                                                      | Operations per second                                      | mongodb-exporter |
+| Repl Operation QPS           |      | meter_mongodb_node_repl_operation_qps                                                                                 | Repl operations per second                                 | mongodb-exporter |
+| Operation Latency (µs)       | µs   | meter_mongodb_node_operation_latency                                                                                  | Latencies for different operation type                     | mongodb-exporter |
+| Cursor                       |      | meter_mongodb_node_cursor                                                                                             | Opened cursor of the node                                  | mongodb-exporter |
+| Server Status Memory (MB)    | MB   | meter_mongodb_node_mem_virtual<br/>meter_mongodb_node_mem_resident                                                    | Virtual and resident memory of the node                    | mongodb-exporter |
+| Asserts                      |      | meter_mongodb_node_asserts                                                                                            | The rate of raised assertions                              | mongodb-exporter |
+| Repl Buffer Count            |      | meter_mongodb_node_repl_buffer_count                                                                                  | The current number of operations in the oplog buffer       | mongodb-exporter |
+| Repl Buffer Size (MB)        | MB   | meter_mongodb_node_repl_buffer_size<br/>meter_mongodb_node_repl_buffer_size_max                                       | The maximum size of the oplog buffer                       | mongodb-exporter |
+| Queued Operation             |      | meter_mongodb_node_queued_operation                                                                                   | The number of operations queued because of a lock          | mongodb-exporter |
+| getLastError Write Num       |      | meter_mongodb_node_write_wait_num<br/>meter_mongodb_node_write_wait_timeout_num                                       | The number of write concern operation                      | mongodb-exporter |
+| getLastError Write Time (ms) | ms   | meter_mongodb_node_write_wait_time                                                                                    | The wait time of write concern operation                   | mongodb-exporter |
+
+## Customizations
+
+You can customize your own metrics/expression/dashboard panel.
+The metrics definition and expression rules are found
+in `/config/otel-rules/mongodb/mongodb-cluster.yaml, /config/otel-rules/mongodb/mongodb-node.yaml`.
+The MongoDB dashboard panel configurations are found in `/config/ui-initialized-templates/mongodb`.
diff --git a/docs/menu.yml b/docs/menu.yml
index 6f170f83af61..b74905ecdfd7 100644
--- a/docs/menu.yml
+++ b/docs/menu.yml
@@ -241,6 +241,8 @@ catalog:
                 path: "/en/setup/backend/backend-redis-monitoring"
               - name: "Elasticsearch"
                 path: "/en/setup/backend/backend-elasticsearch-monitoring"
+              - name: "MongoDB"
+                path: "/en/setup/backend/backend-mongodb-monitoring"
           - name: "MQ Monitoring"
             catalog:
               - name: "RabbitMQ"
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 d6fd2b128d3e..c41125279fdb 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
@@ -183,7 +183,12 @@ public enum Layer {
      * RabbitMQ is one of the most popular open source message brokers. RabbitMQ is lightweight and easy to deploy
      * on premises and in the cloud. It supports multiple messaging protocols.
      */
-    RABBITMQ(29, true);
+    RABBITMQ(29, true),
+
+    /**
+     * MongoDB is a document database. It stores data in a type of JSON format called BSON.
+     */
+    MONGODB(30, 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 75192555411f..45b165613c05 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
@@ -68,6 +68,7 @@ public class UITemplateInitializer {
         Layer.REDIS.name(),
         Layer.ELASTICSEARCH.name(),
         Layer.RABBITMQ.name(),
+        Layer.MONGODB.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 be7c466cba70..d09e7794985f 100644
--- a/oap-server/server-starter/src/main/resources/application.yml
+++ b/oap-server/server-starter/src/main/resources/application.yml
@@ -341,7 +341,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,k8s/*,istio-controlplane,vm,mysql/*,postgresql/*,oap,aws-eks/*,windows,aws-s3/*,aws-dynamodb/*,aws-gateway/*,redis/*,elasticsearch/*,rabbitmq/*"}
+    enabledOtelMetricsRules: ${SW_OTEL_RECEIVER_ENABLED_OTEL_METRICS_RULES:"apisix,k8s/*,istio-controlplane,vm,mysql/*,postgresql/*,oap,aws-eks/*,windows,aws-s3/*,aws-dynamodb/*,aws-gateway/*,redis/*,elasticsearch/*,rabbitmq/*,mongodb/*"}
 
 receiver-zipkin:
   selector: ${SW_RECEIVER_ZIPKIN:-}
diff --git a/oap-server/server-starter/src/main/resources/otel-rules/mongodb/mongodb-cluster.yaml b/oap-server/server-starter/src/main/resources/otel-rules/mongodb/mongodb-cluster.yaml
new file mode 100644
index 000000000000..365eba0261da
--- /dev/null
+++ b/oap-server/server-starter/src/main/resources/otel-rules/mongodb/mongodb-cluster.yaml
@@ -0,0 +1,63 @@
+# 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 == 'mongodb-monitoring' }" # The OpenTelemetry job name
+expSuffix: tag({tags -> tags.cluster = 'mongodb::' + tags.cluster}).service(['cluster'], Layer.MONGODB)
+metricPrefix: meter_mongodb_cluster
+metricsRules:
+  - name: uptime
+    exp: mongodb_ss_uptime.max(['cluster','service_instance_id'])
+  - name: data_size
+    exp: mongodb_dbstats_dataSize.tagNotEqual('cl_role','mongos').tagNotEqual('database','local').sum(['cluster', 'rs_nm'])
+  - name: collection_count
+    exp: mongodb_dbstats_collections.tagNotEqual('cl_role','mongos').tagNotEqual('database','local').sum(['cluster', 'rs_nm'])
+  - name: object_count
+    exp: mongodb_dbstats_objects.tagNotEqual('cl_role','mongos').tagNotEqual('database','local').sum(['cluster', 'rs_nm'])
+
+  - name: document_avg_qps
+    exp: mongodb_ss_metrics_document.max(['cluster','doc_op_type']).rate('PT1M')
+  - name: operation_avg_qps
+    exp: mongodb_ss_opcounters.max(['cluster','legacy_op_type']).rate('PT1M')
+
+  - name: connections
+    exp: mongodb_ss_connections.tagEqual('conn_type','current').max(['cluster','service_instance_id'])
+  - name: cursor_avg
+    exp: mongodb_ss_metrics_cursor_open.max(['cluster',"csr_type"])
+  - name: repl_lag
+    exp: mongodb_mongod_replset_member_replication_lag.tag({tags -> tags.rs_nm = tags.set}).avg(['cluster','rs_nm'])
+
+  - name: db_data_size
+    exp: mongodb_dbstats_dataSize.tagNotEqual('cl_role','mongos').tagNotEqual('database','local').sum(['cluster', 'database'])
+  - name: db_index_size
+    exp: mongodb_dbstats_indexSize.tagNotEqual('cl_role','mongos').tagNotEqual('database','local').sum(['cluster', 'database'])
+  - name: db_collection_count
+    exp: mongodb_dbstats_collections.tagNotEqual('cl_role','mongos').tagNotEqual('database','local').sum(['cluster', 'database'])
+  - name: db_index_count
+    exp: mongodb_dbstats_indexes.tagNotEqual('cl_role','mongos').tagNotEqual('database','local').sum(['cluster' , 'database'])
\ No newline at end of file
diff --git a/oap-server/server-starter/src/main/resources/otel-rules/mongodb/mongodb-node.yaml b/oap-server/server-starter/src/main/resources/otel-rules/mongodb/mongodb-node.yaml
new file mode 100644
index 000000000000..781d54114c1c
--- /dev/null
+++ b/oap-server/server-starter/src/main/resources/otel-rules/mongodb/mongodb-node.yaml
@@ -0,0 +1,108 @@
+# 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 == 'mongodb-monitoring' }" # The OpenTelemetry job name
+expSuffix: tag({tags -> tags.cluster = 'mongodb::' + tags.cluster}).service(['cluster'] , Layer.MONGODB).instance(['cluster'], ['service_instance_id'], Layer.MONGODB)
+metricPrefix: meter_mongodb_node
+metricsRules:
+  - name: uptime
+    exp: mongodb_ss_uptime
+  - name: qps
+    exp: mongodb_ss_opcounters.sum(['cluster','service_instance_id']).rate('PT1M')
+  - name: latency
+    exp: mongodb_ss_opLatencies_latency.sum(['cluster','service_instance_id']).rate('PT1M') / mongodb_ss_opLatencies_ops.sum(['cluster','service_instance_id']).rate('PT1M')
+  - name: memory_usage
+    exp: (mongodb_sys_memory_MemTotal_kb - mongodb_sys_memory_MemAvailable_kb) / mongodb_sys_memory_MemTotal_kb * 100
+  - name: version
+    exp: mongodb_version_info.max(['cluster','service_instance_id','edition',"mongodb"])
+  - name: rs_state
+    exp: mongodb_members_self.max(['cluster','service_instance_id','member_state'])
+
+  - name: cpu_total_percentage
+    exp: ((mongodb_sys_cpu_user_ms + mongodb_sys_cpu_iowait_ms + mongodb_sys_cpu_system_ms + mongodb_sys_cpu_irq_ms + mongodb_sys_cpu_softirq_ms + mongodb_sys_cpu_nice_ms + mongodb_sys_cpu_steal_ms) / 10).rate('PT1M')
+  - name: network_bytes_in
+    exp: mongodb_ss_network_bytesIn.irate()
+  - name: network_bytes_out
+    exp: mongodb_ss_network_bytesOut.irate()
+  - name: memory_free_kb
+    exp: mongodb_sys_memory_MemFree_kb
+  - name: swap_memory_free_kb
+    exp: mongodb_sys_memory_SwapFree_kb
+  - name: fs_used_size
+    exp: mongodb_dbstats_fsUsedSize.max(['cluster','service_instance_id'])
+  - name: fs_total_size
+    exp: mongodb_dbstats_fsTotalSize.max(['cluster','service_instance_id'])
+
+  - name: connections
+    exp: mongodb_ss_connections.tagEqual('conn_type','current').max(['cluster','service_instance_id'])
+  - name: active_total_num
+    exp: mongodb_ss_globalLock_activeClients_total
+  - name: active_reader_num
+    exp: mongodb_ss_globalLock_activeClients_readers
+  - name: active_writer_num
+    exp: mongodb_ss_globalLock_activeClients_writers
+  - name: transactions_active
+    exp: mongodb_ss_transactions_currentActive
+  - name: transactions_inactive
+    exp: mongodb_ss_transactions_currentInactive
+
+  - name: document_qps
+    exp: mongodb_ss_metrics_document.sum(['cluster','service_instance_id','doc_op_type']).rate('PT1M')
+  - name: operation_qps
+    exp: mongodb_ss_opcounters.sum(['cluster','service_instance_id','legacy_op_type']).rate('PT1M')
+  - name: repl_operation_qps
+    exp: mongodb_ss_opcountersRepl.sum(['cluster','service_instance_id','legacy_op_type']).rate('PT1M')
+
+  - name: operation_latency
+    exp: mongodb_ss_opLatencies_latency.max(['cluster','service_instance_id',"op_type"]).rate('PT1M') / mongodb_ss_opLatencies_ops.max(['cluster','service_instance_id',"op_type"]).rate('PT1M')
+  - name: cursor
+    exp: mongodb_ss_metrics_cursor_open.max(['cluster','service_instance_id',"csr_type"])
+  - name: mem_virtual
+    exp: mongodb_ss_mem_virtual
+  - name: mem_resident
+    exp: mongodb_ss_mem_resident
+  - name: asserts
+    exp: mongodb_ss_asserts.max(['cluster','service_instance_id',"assert_type"]).increase('PT1M')
+
+  - name: repl_buffer_count
+    exp: mongodb_ss_metrics_repl_buffer_count
+  - name: repl_buffer_size
+    exp: mongodb_ss_metrics_repl_buffer_sizeBytes
+  - name: repl_buffer_size_max
+    exp: mongodb_ss_metrics_repl_buffer_maxSizeBytes
+  - name: queued_operation
+    exp: mongodb_ss_globalLock_currentQueue.max(['cluster','service_instance_id',"count_type"])
+
+  - name: write_wait_num
+    exp: mongodb_ss_metrics_getLastError_wtime_num.rate('PT1M')
+  - name: write_wait_timeout_num
+    exp: mongodb_ss_metrics_getLastError_wtimeouts.rate('PT1M')
+  - name: write_wait_time
+    exp: mongodb_ss_metrics_getLastError_wtime_totalMillis.rate('PT1M')
\ No newline at end of file
diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/menu.yaml b/oap-server/server-starter/src/main/resources/ui-initialized-templates/menu.yaml
index 6a47975ef35f..c0244c3ccdc2 100644
--- a/oap-server/server-starter/src/main/resources/ui-initialized-templates/menu.yaml
+++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/menu.yaml
@@ -183,6 +183,11 @@ menus:
         description: Provide Elasticsearch Server monitoring through OpenTelemetry's Prometheus Receiver.
         documentLink: https://skywalking.apache.org/docs/main/next/en/setup/backend/backend-elasticsearch-monitoring/
         i18nKey: database_elasticsearch
+      - title: MongoDB
+        layer: MONGODB
+        description: Provide MongoDB monitoring through OpenTelemetry's Prometheus Receiver.
+        documentLink: https://skywalking.apache.org/docs/main/next/en/setup/backend/backend-mongodb-monitoring/
+        i18nKey: database_mongodb
   - title: Message Queue
     icon: mq
     description: A message queue is a form of asynchronous service-to-service communication used in serverless and microservices architectures.
diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/mongodb/mongodb-cluster.json b/oap-server/server-starter/src/main/resources/ui-initialized-templates/mongodb/mongodb-cluster.json
new file mode 100644
index 000000000000..0a8948898e19
--- /dev/null
+++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/mongodb/mongodb-cluster.json
@@ -0,0 +1,414 @@
+/**
+ * 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":"MongoDB-Cluster",
+    "configuration":{
+      "children":[
+        {
+          "x":0,
+          "y":0,
+          "w":24,
+          "h":47,
+          "i":"0",
+          "type":"Tab",
+          "children":[
+            {
+              "name":"Overview",
+              "children":[
+                {
+                  "x":0,
+                  "y":0,
+                  "w":6,
+                  "h":7,
+                  "i":"0",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "expressions":[
+                    "aggregate_labels(meter_mongodb_cluster_uptime,max)/3600/24"
+                  ],
+                  "typesOfMQE":[
+                    "SINGLE_VALUE"
+                  ],
+                  "graph":{
+                    "type":"Card",
+                    "fontSize":30,
+                    "textAlign":"center",
+                    "showUnit":true
+                  },
+                  "metricConfig":[
+                    {
+                      "unit":"day"
+                    }
+                  ],                  
+                  "widget":{
+                    "title":"Uptime"
+                  }
+                },
+                {
+                  "x":6,
+                  "y":0,
+                  "w":6,
+                  "h":7,
+                  "i":"1",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "expressions":[
+                    "aggregate_labels(meter_mongodb_cluster_data_size,sum)/1024/1024/1024"
+                  ],
+                  "typesOfMQE":[
+                    "SINGLE_VALUE"
+                  ],
+                  "graph":{
+                    "type":"Card",
+                    "fontSize":30,
+                    "textAlign":"center",
+                    "showUnit":true
+                  },
+                  "metricConfig":[
+                    {
+                      "unit":"GB"
+                    }
+                  ],                  
+                  "widget":{
+                    "title":"Data Size"
+                  }
+                },
+                {
+                  "x":12,
+                  "y":0,
+                  "w":6,
+                  "h":7,
+                  "i":"2",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "expressions":[
+                    "aggregate_labels(meter_mongodb_cluster_collection_count,sum)"
+                  ],
+                  "typesOfMQE":[
+                    "SINGLE_VALUE"
+                  ],
+                  "graph":{
+                    "type":"Card",
+                    "fontSize":30,
+                    "textAlign":"center",
+                    "showUnit":true
+                  },
+                  "widget":{
+                    "title":"Collection Count"
+                  }
+                },
+                {
+                  "x":18,
+                  "y":0,
+                  "w":6,
+                  "h":7,
+                  "i":"3",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "expressions":[
+                    "aggregate_labels(meter_mongodb_cluster_object_count,sum)"
+                  ],
+                  "typesOfMQE":[
+                    "SINGLE_VALUE"
+                  ],
+                  "graph":{
+                    "type":"Card",
+                    "fontSize":30,
+                    "textAlign":"center",
+                    "showUnit":true
+                  },
+                  "widget":{
+                    "title":"Object Count"
+                  }
+                },
+                {
+                  "x":0,
+                  "y":7,
+                  "w":12,
+                  "h":12,
+                  "i":"4",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "expressions":[
+                    "meter_mongodb_cluster_document_avg_qps"
+                  ],
+                  "typesOfMQE":[
+                    "TIME_SERIES_VALUES"
+                  ],
+                  "graph":{
+                    "type":"Line",
+                    "step":false,
+                    "smooth":false,
+                    "showSymbol":true,
+                    "showXAxis":true,
+                    "showYAxis":true
+                  },
+                  "widget":{
+                    "title":"Document Avg QPS"
+                  }
+                },
+                {
+                  "x":12,
+                  "y":7,
+                  "w":12,
+                  "h":12,
+                  "i":"5",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "expressions":[
+                    "meter_mongodb_cluster_operation_avg_qps"
+                  ],
+                  "graph":{
+                    "type":"Line",
+                    "step":false,
+                    "smooth":false,
+                    "showSymbol":true,
+                    "showXAxis":true,
+                    "showYAxis":true
+                  },
+                  "widget":{
+                    "title":"Operation Avg QPS"
+                  },
+                  "typesOfMQE":[
+                    "TIME_SERIES_VALUES"
+                  ]
+                },
+                {
+                  "x":0,
+                  "y":19,
+                  "w":8,
+                  "h":12,
+                  "i":"6",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "expressions":[
+                    "aggregate_labels(meter_mongodb_cluster_connections,sum)"
+                  ],
+                  "typesOfMQE":[
+                    "TIME_SERIES_VALUES"
+                  ],
+                  "graph":{
+                    "type":"Line",
+                    "step":false,
+                    "smooth":false,
+                    "showSymbol":true,
+                    "showXAxis":true,
+                    "showYAxis":true
+                  },
+                  "widget":{
+                    "title":"Total Connections"
+                  }
+                },
+                {
+                  "x":8,
+                  "y":19,
+                  "w":8,
+                  "h":12,
+                  "i":"7",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "expressions":[
+                    "meter_mongodb_cluster_cursor_avg"
+                  ],
+                  "typesOfMQE":[
+                    "TIME_SERIES_VALUES"
+                  ],
+                  "graph":{
+                    "type":"Line",
+                    "step":false,
+                    "smooth":false,
+                    "showSymbol":true,
+                    "showXAxis":true,
+                    "showYAxis":true
+                  },
+                  "widget":{
+                    "title":"Cursor Avg"
+                  }
+                },
+                {
+                  "x":16,
+                  "y":19,
+                  "w":8,
+                  "h":12,
+                  "i":"8",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "graph":{
+                    "type":"Line",
+                    "step":false,
+                    "smooth":false,
+                    "showSymbol":true,
+                    "showXAxis":true,
+                    "showYAxis":true
+                  },
+                  "widget":{
+                    "title":"Replication Lag (ms)"
+                  },
+                  "expressions":[
+                    "meter_mongodb_cluster_repl_lag"
+                  ],
+                  "typesOfMQE":[
+                    "TIME_SERIES_VALUES"
+                  ]
+                },
+                {
+                  "x":0,
+                  "y":31,
+                  "w":6,
+                  "h":11,
+                  "i":"9",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "widget":{
+                    "title":"DB Avg Data Size Per Shard (GB)"
+                  },
+                  "graph":{
+                    "type":"Table",
+                    "showTableValues":true,
+                    "tableHeaderCol1":"",
+                    "tableHeaderCol2":""
+                  },
+                  "metricTypes":[
+                    "readLabeledMetricsValues"
+                  ],
+                  "expressions":[
+                    "meter_mongodb_cluster_db_data_size/1024/1024/1024"
+                  ],
+                  "typesOfMQE":[
+                    "TIME_SERIES_VALUES"
+                  ]
+                },
+                {
+                  "x":6,
+                  "y":31,
+                  "w":6,
+                  "h":11,
+                  "i":"10",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "widget":{
+                    "title":"DB Avg Index Size Per Shard (GB)"
+                  },
+                  "graph":{
+                    "type":"Table",
+                    "showTableValues":true,
+                    "tableHeaderCol1":"",
+                    "tableHeaderCol2":""
+                  },
+                  "metricTypes":[
+                    "readLabeledMetricsValues"
+                  ],
+                  "expressions":[
+                    "meter_mongodb_cluster_db_index_size/1024/1024/1024"
+                  ],
+                  "typesOfMQE":[
+                    "TIME_SERIES_VALUES"
+                  ]
+                },
+                {
+                  "x":12,
+                  "y":31,
+                  "w":6,
+                  "h":11,
+                  "i":"11",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "widget":{
+                    "title":"DB Avg Collection Count Per Shard"
+                  },
+                  "graph":{
+                    "type":"Table",
+                    "showTableValues":true,
+                    "tableHeaderCol1":"",
+                    "tableHeaderCol2":""
+                  },
+                  "metricTypes":[
+                    "readLabeledMetricsValues"
+                  ],
+                  "expressions":[
+                    "meter_mongodb_cluster_db_collection_count"
+                  ],
+                  "typesOfMQE":[
+                    "TIME_SERIES_VALUES"
+                  ]
+                },
+                {
+                  "x":18,
+                  "y":31,
+                  "w":6,
+                  "h":11,
+                  "i":"12",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "widget":{
+                    "title":"DB Avg Index Count Per Shard"
+                  },
+                  "graph":{
+                    "type":"Table",
+                    "showTableValues":true,
+                    "tableHeaderCol1":"",
+                    "tableHeaderCol2":""
+                  },
+                  "metricTypes":[
+                    "readLabeledMetricsValues"
+                  ],
+                  "expressions":[
+                    "meter_mongodb_cluster_db_index_count"
+                  ],
+                  "typesOfMQE":[
+                    "TIME_SERIES_VALUES"
+                  ]
+                }
+              ]
+            },
+            {
+              "name":"Node",
+              "children":[
+                {
+                  "x":0,
+                  "y":0,
+                  "w":24,
+                  "h":28,
+                  "i":"0",
+                  "type":"Widget",
+                  "metricMode":"Expression",
+                  "expressions":[
+                    ""
+                  ],
+                  "typesOfMQE":[
+                    ""
+                  ],
+                  "graph":{
+                    "type":"InstanceList",
+                    "dashboardName":"MongoDB-Node",
+                    "fontSize":12
+                  }
+                }
+              ]
+            }
+          ]
+        }
+      ],
+      "layer":"MONGODB",
+      "entity":"Service",
+      "name":"MongoDB-Cluster",
+      "id":"MongoDB-Cluster",
+      "isRoot":false
+    }
+  }
+]
\ No newline at end of file
diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/mongodb/mongodb-node.json b/oap-server/server-starter/src/main/resources/ui-initialized-templates/mongodb/mongodb-node.json
new file mode 100644
index 000000000000..7c6cca4671ac
--- /dev/null
+++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/mongodb/mongodb-node.json
@@ -0,0 +1,781 @@
+/**
+ * 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":"MongoDB-Node",
+    "configuration":{
+      "children":[
+        {
+          "x":0,
+          "y":0,
+          "w":4,
+          "h":7,
+          "i":"0",
+          "type":"Widget",
+          "graph":{
+            "type":"Card",
+            "fontSize":30,
+            "textAlign":"center",
+            "showUnit":true
+          },
+          "metricConfig":[
+            {
+              "unit":"day"
+            }
+          ],          
+          "widget":{
+            "title":"Uptime"
+          },
+          "metricMode":"Expression",
+          "expressions":[
+            "meter_mongodb_node_uptime/3600/24"
+          ],
+          "typesOfMQE":[
+            "SINGLE_VALUE"
+          ]
+        },
+        {
+          "x":4,
+          "y":0,
+          "w":4,
+          "h":7,
+          "i":"1",
+          "type":"Widget",
+          "graph":{
+            "type":"Card",
+            "fontSize":30,
+            "textAlign":"center",
+            "showUnit":true
+          },
+          "widget":{
+            "title":"QPS"
+          },
+          "expressions":[
+            "meter_mongodb_node_qps"
+          ],
+          "typesOfMQE":[
+            "SINGLE_VALUE"
+          ],
+          "metricMode":"Expression"
+        },
+        {
+          "x":8,
+          "y":0,
+          "w":4,
+          "h":7,
+          "i":"2",
+          "type":"Widget",
+          "graph":{
+            "type":"Card",
+            "fontSize":30,
+            "textAlign":"center",
+            "showUnit":true
+          },
+          "widget":{
+            "title":"Latency"
+          },
+          "expressions":[
+            "meter_mongodb_node_latency"
+          ],
+          "typesOfMQE":[
+            "SINGLE_VALUE"
+          ],
+          "metricMode":"Expression",
+          "metricConfig":[
+            {
+              "unit":"µs"
+            }
+          ]
+        },
+        {
+          "x":12,
+          "y":0,
+          "w":4,
+          "h":7,
+          "i":"3",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "metricConfig":[
+            {
+              "unit":"%"
+            }
+          ],
+          "graph":{
+            "type":"Card",
+            "fontSize":30,
+            "textAlign":"center",
+            "showUnit":true
+          },
+          "widget":{
+            "title":"Memory Usage"
+          },
+          "expressions":[
+            "meter_mongodb_node_memory_usage"
+          ],
+          "typesOfMQE":[
+            "SINGLE_VALUE"
+          ]
+        },
+        {
+          "x":16,
+          "y":0,
+          "w":4,
+          "h":7,
+          "i":"4",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "graph":{
+            "type":"Table",
+            "showTableValues":false,
+            "tableHeaderCol1":"Version",
+            "tableHeaderCol2":""
+          },
+          "widget":{
+            "title":"Version"
+          },
+          "metricTypes":[
+            "readLabeledMetricsValues"
+          ],
+          "expressions":[
+            "meter_mongodb_node_version"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ]
+        },
+        {
+          "x":20,
+          "y":0,
+          "w":4,
+          "h":7,
+          "i":"5",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "graph":{
+            "type":"Table",
+            "showTableValues":false,
+            "tableHeaderCol1":"ReplSet State",
+            "tableHeaderCol2":""
+          },
+          "widget":{
+            "title":"ReplSet State"
+          },
+          "expressions":[
+            "meter_mongodb_node_rs_state"
+          ],
+          "metricTypes":[
+            "readLabeledMetricsValues"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ]
+        },
+        {
+          "x":0,
+          "y":7,
+          "w":6,
+          "h":12,
+          "i":"6",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "expressions":[
+            "meter_mongodb_node_cpu_total_percentage"
+          ],
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ],
+          "widget":{
+            "title":"CPU Usage (%)"
+          }
+        },
+        {
+          "x":6,
+          "y":7,
+          "w":6,
+          "h":12,
+          "i":"7",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "metricConfig":[
+            {
+              "label":"in"
+            },
+            {
+              "label":"out"
+            }
+          ],
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "widget":{
+            "title":"Network (KB/s)"
+          },
+          "expressions":[
+            "meter_mongodb_node_network_bytes_in/1024",
+            "meter_mongodb_node_network_bytes_out/1024"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES",
+            "TIME_SERIES_VALUES"
+          ]
+        },
+        {
+          "x":12,
+          "y":7,
+          "w":6,
+          "h":12,
+          "i":"8",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "metricConfig":[
+            {
+              "label":"Mem"
+            },
+            {
+              "label":"Swap"
+            }
+          ],
+          "graph":{
+            "type":"Bar",
+            "showBackground":true
+          },
+          "widget":{
+            "title":"Memory Free (GB)"
+          },
+          "expressions":[
+            "meter_mongodb_node_memory_free_kb/1024/1024",
+            "meter_mongodb_node_swap_memory_free_kb/1024/1024"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES",
+            "TIME_SERIES_VALUES"
+          ]
+        },
+        {
+          "x":18,
+          "y":7,
+          "w":6,
+          "h":12,
+          "i":"9",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "expressions":[
+            "meter_mongodb_node_fs_used_size/1024/1024/1024",
+            "meter_mongodb_node_fs_total_size/1024/1024/1024"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES",
+            "TIME_SERIES_VALUES"
+          ],
+          "graph":{
+            "type":"Area",
+            "opacity":0.4,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "metricConfig":[
+            {
+              "label":"used"
+            },
+            {
+              "label":"total"
+            }
+          ],
+          "widget":{
+            "title":"Disk (GB)"
+          }
+        },
+        {
+          "x":0,
+          "y":19,
+          "w":8,
+          "h":12,
+          "i":"10",
+          "type":"Widget",
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true,
+            "legend":{
+              "show":false,
+              "asTable":false
+            }
+          },
+          "widget":{
+            "title":"Connections"
+          },
+          "expressions":[
+            "meter_mongodb_node_connections"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ],
+          "metricMode":"Expression"
+        },
+        {
+          "x":8,
+          "y":19,
+          "w":8,
+          "h":12,
+          "i":"11",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "metricConfig":[
+            {
+              "label":"total"
+            },
+            {
+              "label":"writer"
+            },
+            {
+              "label":"reader"
+            }
+          ],
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "widget":{
+            "title":"Active Client"
+          },
+          "expressions":[
+            "meter_mongodb_node_active_total_num",
+            "meter_mongodb_node_active_writer_num",
+            "meter_mongodb_node_active_reader_num"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES",
+            "TIME_SERIES_VALUES",
+            "TIME_SERIES_VALUES"
+          ]
+        },
+        {
+          "x":16,
+          "y":19,
+          "w":8,
+          "h":12,
+          "i":"12",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "expressions":[
+            "meter_mongodb_node_transactions_active",
+            "meter_mongodb_node_transactions_inactive"
+          ],
+          "metricConfig":[
+            {
+              "label":"active"
+            },
+            {
+              "label":"inactive"
+            }
+          ],
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "widget":{
+            "title":"Transactions"
+          },
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES",
+            "TIME_SERIES_VALUES"
+          ]
+        },
+        {
+          "x":0,
+          "y":31,
+          "w":8,
+          "h":12,
+          "i":"13",
+          "type":"Widget",
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "widget":{
+            "title":"Document QPS"
+          },
+          "expressions":[
+            "meter_mongodb_node_document_qps"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ],
+          "metricMode":"Expression"
+        },
+        {
+          "x":8,
+          "y":31,
+          "w":8,
+          "h":12,
+          "i":"14",
+          "type":"Widget",
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true,
+            "legend":{
+              "asTable":false
+            }
+          },
+          "widget":{
+            "title":"Operation QPS"
+          },
+          "associate":[
+
+          ],
+          "expressions":[
+            "meter_mongodb_node_operation_qps"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ],
+          "metricMode":"Expression"
+        },
+        {
+          "x":16,
+          "y":31,
+          "w":8,
+          "h":12,
+          "i":"15",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "expressions":[
+            "meter_mongodb_node_repl_operation_qps"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ],
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "widget":{
+            "title":"Repl Operation QPS"
+          }
+        },
+        {
+          "x":0,
+          "y":43,
+          "w":6,
+          "h":12,
+          "i":"16",
+          "type":"Widget",
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true,
+            "legend":{
+              "asTable":false
+            }
+          },
+          "widget":{
+            "title":"Operation Latency (µs)"
+          },
+          "expressions":[
+            "meter_mongodb_node_operation_latency"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ],
+          "metricMode":"Expression"
+        },
+        {
+          "x":6,
+          "y":43,
+          "w":6,
+          "h":12,
+          "i":"17",
+          "type":"Widget",
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true,
+            "legend":{
+              "show":true,
+              "asTable":false
+            }
+          },
+          "widget":{
+            "title":"Cursor"
+          },
+          "expressions":[
+            "meter_mongodb_node_cursor"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ],
+          "metricMode":"Expression"
+        },
+        {
+          "x":12,
+          "y":43,
+          "w":6,
+          "h":12,
+          "i":"18",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "expressions":[
+            "meter_mongodb_node_mem_virtual",
+            "meter_mongodb_node_mem_resident"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES",
+            "TIME_SERIES_VALUES"
+          ],
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "widget":{
+            "title":"Server Status Memory (MB)"
+          },
+          "metricConfig":[
+            {
+              "label":"virtual"
+            },
+            {
+              "label":"resident"
+            }
+          ]
+        },
+        {
+          "x":18,
+          "y":43,
+          "w":6,
+          "h":12,
+          "i":"19",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "widget":{
+            "title":"Asserts"
+          },
+          "expressions":[
+            "meter_mongodb_node_asserts"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ]
+        },
+        {
+          "x":0,
+          "y":55,
+          "w":8,
+          "h":12,
+          "i":"20",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "expressions":[
+            "meter_mongodb_node_repl_buffer_count"
+          ],
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "widget":{
+            "title":"Repl Buffer Count"
+          },
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ]
+        },
+        {
+          "x":8,
+          "y":55,
+          "w":8,
+          "h":12,
+          "i":"21",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "graph":{
+            "type":"Area",
+            "opacity":0.4,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "widget":{
+            "title":"Repl Buffer Size (MB)"
+          },
+          "expressions":[
+            "meter_mongodb_node_repl_buffer_size/1024/1024",
+            "meter_mongodb_node_repl_buffer_size_max/1024/1024"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES",
+            "TIME_SERIES_VALUES"
+          ],
+          "metricConfig":[
+            {
+              "label":"current"
+            },
+            {
+              "label":"max"
+            }
+          ]
+        },
+        {
+          "x":16,
+          "y":55,
+          "w":8,
+          "h":12,
+          "i":"22",
+          "type":"Widget",
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "widget":{
+            "title":"Queued Operation"
+          },
+          "expressions":[
+            "meter_mongodb_node_queued_operation"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ],
+          "metricMode":"Expression"
+        },
+        {
+          "x":0,
+          "y":67,
+          "w":12,
+          "h":12,
+          "i":"23",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "expressions":[
+            "meter_mongodb_node_write_wait_num",
+            "meter_mongodb_node_write_wait_timeout_num"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES",
+            "TIME_SERIES_VALUES"
+          ],
+          "graph":{
+            "type":"Area",
+            "opacity":0.4,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "widget":{
+            "title":"getLastError Write Num"
+          },
+          "metricConfig":[
+            {
+              "label":"total"
+            },
+            {
+              "label":"timeout"
+            }
+          ]
+        },
+        {
+          "x":12,
+          "y":67,
+          "w":12,
+          "h":12,
+          "i":"24",
+          "type":"Widget",
+          "metricMode":"Expression",
+          "graph":{
+            "type":"Line",
+            "step":false,
+            "smooth":false,
+            "showSymbol":true,
+            "showXAxis":true,
+            "showYAxis":true
+          },
+          "expressions":[
+            "meter_mongodb_node_write_wait_time"
+          ],
+          "typesOfMQE":[
+            "TIME_SERIES_VALUES"
+          ],
+          "widget":{
+            "title":"getLastError Write Time (ms)"
+          }
+        }
+      ],
+      "layer":"MONGODB",
+      "entity":"ServiceInstance",
+      "name":"MongoDB-Node",
+      "id":"MongoDB-Node",
+      "isRoot":false
+    }
+  }
+]
\ No newline at end of file
diff --git a/oap-server/server-starter/src/main/resources/ui-initialized-templates/mongodb/mongodb-root.json b/oap-server/server-starter/src/main/resources/ui-initialized-templates/mongodb/mongodb-root.json
new file mode 100644
index 000000000000..0dd6daf092d5
--- /dev/null
+++ b/oap-server/server-starter/src/main/resources/ui-initialized-templates/mongodb/mongodb-root.json
@@ -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.
+ */
+[
+  {
+    "id":"MongoDB-Root",
+    "configuration":{
+      "children":[
+        {
+          "x":0,
+          "y":0,
+          "w":24,
+          "h":2,
+          "i":"0",
+          "type":"Text",
+          "graph":{
+            "fontColor":"blue",
+            "backgroundColor":"white",
+            "content":"Provide MongoDB monitoring through OpenTelemetry's Prometheus Receiver",
+            "fontSize":14,
+            "textAlign":"left",
+            "url":"https://skywalking.apache.org/docs/main/next/en/setup/backend/backend-mongodb-monitoring/"
+          }
+        },
+        {
+          "x":0,
+          "y":2,
+          "w":24,
+          "h":33,
+          "i":"1",
+          "type":"Widget",
+          "graph":{
+            "type":"ServiceList",
+            "dashboardName":"MongoDB-Cluster",
+            "fontSize":12,
+            "showXAxis":false,
+            "showYAxis":false,
+            "showGroup":true
+          }
+        }
+      ],
+      "id":"MongoDB-Root",
+      "layer":"MONGODB",
+      "entity":"All",
+      "name":"MongoDB-Root",
+      "isRoot":true
+    }
+  }
+]
\ No newline at end of file


Test patch:
diff --git a/test/e2e-v2/cases/mongodb/docker-compose.yml b/test/e2e-v2/cases/mongodb/docker-compose.yml
new file mode 100644
index 000000000000..7a8b4ae974a8
--- /dev/null
+++ b/test/e2e-v2/cases/mongodb/docker-compose.yml
@@ -0,0 +1,100 @@
+# 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
+  mongodb-1: &mongodb
+    image: mongo:6.0.8
+    networks:
+      - e2e
+    command: mongod --replSet rs1 --shardsvr --port 27017
+    healthcheck:
+      test: [ "CMD", "bash", "-c", "cat < /dev/null > /dev/tcp/127.0.0.1/27017" ]
+      interval: 10s
+      timeout: 10s
+      retries: 120
+  mongodb-2: *mongodb
+  mongodb-repl-setup:
+    image: mongo:6.0.8
+    networks:
+      - e2e
+    depends_on:
+      mongodb-1:
+        condition: service_healthy
+      mongodb-2:
+        condition: service_healthy
+    volumes:
+      - ./setup.sh:/setup.sh
+    entrypoint: [ "bash", "/setup.sh" ]
+  mongodb-exporter-1:
+    image: percona/mongodb_exporter:0.39
+    expose:
+      - 9216
+    networks:
+      - e2e
+    depends_on:
+      mongodb-1:
+        condition: service_healthy
+    command:
+      - '--mongodb.uri=mongodb://mongodb-1:27017'
+      - '--discovering-mode'
+      - '--compatible-mode'
+      - '--collector.dbstats'
+      - '--collector.diagnosticdata'
+      - '--collector.replicasetstatus'
+  mongodb-exporter-2:
+    image: percona/mongodb_exporter:0.39
+    expose:
+      - 9216
+    networks:
+      - e2e
+    depends_on:
+      mongodb-2:
+        condition: service_healthy
+    command:
+      - '--mongodb.uri=mongodb://mongodb-2:27017'
+      - '--discovering-mode'
+      - '--compatible-mode'
+      - '--collector.dbstats'
+      - '--collector.diagnosticdata'
+      - '--collector.replicasetstatus'
+  otel-collector:
+    image: otel/opentelemetry-collector:0.72.0
+    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
+      mongodb-exporter-1:
+        condition: service_started
+      mongodb-exporter-2:
+        condition: service_started
+
+networks:
+  e2e:
\ No newline at end of file
diff --git a/test/e2e-v2/cases/mongodb/e2e.yaml b/test/e2e-v2/cases/mongodb/e2e.yaml
new file mode 100644
index 000000000000..5424c8231576
--- /dev/null
+++ b/test/e2e-v2/cases/mongodb/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: 60
+    interval: 3s
+  cases:
+    - includes:
+        - ./mongodb-cases.yaml
diff --git a/test/e2e-v2/cases/mongodb/expected/instance.yml b/test/e2e-v2/cases/mongodb/expected/instance.yml
new file mode 100644
index 000000000000..3e82313740f1
--- /dev/null
+++ b/test/e2e-v2/cases/mongodb/expected/instance.yml
@@ -0,0 +1,27 @@
+# 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: {{ notEmpty .id }}
+  name: mongodb-exporter-1:9216
+  instanceuuid: {{ notEmpty .instanceuuid }}
+  attributes: []
+  language: UNKNOWN
+- id: {{ notEmpty .id }}
+  name: mongodb-exporter-2:9216
+  instanceuuid: {{ notEmpty .instanceuuid }}
+  attributes: []
+  language: UNKNOWN
+{{- end }}
diff --git a/test/e2e-v2/cases/mongodb/expected/metrics-has-value-label.yml b/test/e2e-v2/cases/mongodb/expected/metrics-has-value-label.yml
new file mode 100644
index 000000000000..0c957c3c779b
--- /dev/null
+++ b/test/e2e-v2/cases/mongodb/expected/metrics-has-value-label.yml
@@ -0,0 +1,25 @@
+# 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:
+  {{- contains .value }}
+  - key: {{ notEmpty .key }}
+    value:
+      value: {{ ge .value.value 0 }}
+      isemptyvalue: false
+  {{- end }}
+{{- end }}
diff --git a/test/e2e-v2/cases/mongodb/expected/metrics-has-value.yml b/test/e2e-v2/cases/mongodb/expected/metrics-has-value.yml
new file mode 100644
index 000000000000..441165535245
--- /dev/null
+++ b/test/e2e-v2/cases/mongodb/expected/metrics-has-value.yml
@@ -0,0 +1,21 @@
+# 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:
+    value: {{ ge .value.value 0 }}
+    isemptyvalue: false
+{{- end }}
diff --git a/test/e2e-v2/cases/mongodb/expected/service.yml b/test/e2e-v2/cases/mongodb/expected/service.yml
new file mode 100644
index 000000000000..328499a74c66
--- /dev/null
+++ b/test/e2e-v2/cases/mongodb/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 "mongodb::replset" }}.1
+  name: mongodb::replset
+  group: mongodb
+  shortname: replset
+  layers:
+    - MONGODB
+  normal: true
+{{- end }}
\ No newline at end of file
diff --git a/test/e2e-v2/cases/mongodb/mongodb-cases.yaml b/test/e2e-v2/cases/mongodb/mongodb-cases.yaml
new file mode 100644
index 000000000000..7868154d2ee9
--- /dev/null
+++ b/test/e2e-v2/cases/mongodb/mongodb-cases.yaml
@@ -0,0 +1,119 @@
+# 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 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 multiple-linear --name=meter_mongodb_cluster_uptime --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_data_size --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_collection_count --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_object_count --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_document_avg_qps --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_operation_avg_qps --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_connections --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_cursor_avg --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_repl_lag --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_db_data_size --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_db_index_size --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_db_collection_count --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_cluster_db_index_count --service-name=mongodb::replset | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+
+  # instance cases
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql instance ls --service-name=mongodb::replset
+    expected: expected/instance.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_uptime --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_qps --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_latency --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_memory_usage --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_node_version --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_node_rs_state --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_cpu_total_percentage --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_network_bytes_in --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_network_bytes_out --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_memory_free_kb --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_swap_memory_free_kb --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_fs_used_size --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_fs_total_size --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_connections --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_active_total_num --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_active_reader_num --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_active_writer_num --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_transactions_active --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_transactions_inactive --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_node_document_qps --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_node_operation_qps --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_node_repl_operation_qps --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_node_operation_latency --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_node_cursor --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_mem_virtual --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_mem_resident --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_node_asserts --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_repl_buffer_count --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_repl_buffer_size --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_repl_buffer_size_max --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics multiple-linear --name=meter_mongodb_node_queued_operation --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries | with(.[] ; .value=(.value | to_entries))' -
+    expected: expected/metrics-has-value-label.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_write_wait_num --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_write_wait_timeout_num --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
+  - query: swctl --display yaml --base-url=http://${oap_host}:${oap_12800}/graphql metrics linear --name=meter_mongodb_node_write_wait_time --service-name=mongodb::replset --instance-name=mongodb-exporter-1:9216 | yq e 'to_entries' -
+    expected: expected/metrics-has-value.yml
\ No newline at end of file
diff --git a/test/e2e-v2/cases/mongodb/otel-collector-config.yaml b/test/e2e-v2/cases/mongodb/otel-collector-config.yaml
new file mode 100644
index 000000000000..ec7255f26d6a
--- /dev/null
+++ b/test/e2e-v2/cases/mongodb/otel-collector-config.yaml
@@ -0,0 +1,64 @@
+# 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: 'mongodb-monitoring'
+         metrics_path: "/metrics"
+         scrape_interval: 10s
+         static_configs:
+           - targets: ['mongodb-exporter-1:9216','mongodb-exporter-2:9216']
+             labels:
+               cluster: replset
+
+##################################################################################################################
+# If you want to define instance name rather than using name in target, please reference to the following case.  #
+##################################################################################################################
+
+#        - job_name: 'mongodb-monitoring'
+#          metrics_path: "/metrics"
+#          scrape_interval: 10s
+#          static_configs:
+#            - targets: ['mongodb-exporter-1:9216']
+#              labels:
+#                cluster: replset
+#                service_instance_id: mongodb-1:27017
+#            - targets: ['mongodb-exporter-2:9216']
+#              labels:
+#                cluster: replset
+#                service_instance_id: mongodb-2:27017
+
+processors:
+  batch:
+
+exporters:
+  ####################################################################################
+  # If you want to use otlp exporter please ensure that your OAP version is >= 9.2.0 #
+  ####################################################################################
+  otlp:
+    endpoint: oap:11800
+    tls:
+      insecure: true
+service:
+  pipelines:
+    metrics:
+      receivers:
+      - prometheus
+      processors:
+      - batch
+      exporters:
+      - otlp
diff --git a/test/e2e-v2/cases/mongodb/setup.sh b/test/e2e-v2/cases/mongodb/setup.sh
new file mode 100644
index 000000000000..ba9a5d8182d6
--- /dev/null
+++ b/test/e2e-v2/cases/mongodb/setup.sh
@@ -0,0 +1,46 @@
+#!/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.
+
+echo "Waiting for startup.."
+until mongosh --host mongodb-1:27017 --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 2)' &>/dev/null; do
+  printf '.'
+  sleep 1
+done
+until mongosh --host mongodb-2:27017 --eval 'quit(db.runCommand({ ping: 1 }).ok ? 0 : 2)' &>/dev/null; do
+  printf '.'
+  sleep 1
+done
+
+echo "Started.."
+
+mongosh --host mongodb-1:27017 <<EOF
+     var cfg = {
+      "_id": "rs1",
+      "protocolVersion": 1,
+      "members": [
+         {
+           "_id": 0,
+           "host": "mongodb-1:27017"
+         },
+         {
+           "_id": 1,
+           "host": "mongodb-2:27017"
+         }
+      ]
+     };
+     rs.initiate(cfg, { force: true });
+     rs.reconfig(cfg, { force: true });
+EOF
\ No newline at end of file