diff --git a/README-JA.md b/README-JA.md
index f5bac406..7cad2d17 100644
--- a/README-JA.md
+++ b/README-JA.md
@@ -50,6 +50,7 @@ Get to know the preferred protocol in IoT from beginner to master.
## [MQTT Programming](https://www.emqx.com/ja/blog/category/mqtt-programming)
Best practice of MQTT in various clients.
+- [M2MqttUnityライブラリを使用したUnityでのMQTT](https://www.emqx.com/ja/blog/using-mqtt-in-unity-with-m2mqttunity-library-a-step-by-step-guide) ([Edit](https://github.com/emqx/blog/blob/main/ja/202411/using-mqtt-in-unity-with-m2mqttunity-library-a-step-by-step-guide.md))
- [Qt6でのMQTT:サンプル付き初心者ガイド](https://www.emqx.com/ja/blog/how-to-create-an-mqtt-application-in-qt6) ([Edit](https://github.com/emqx/blog/blob/main/ja/202411/how-to-create-an-mqtt-application-in-qt6.md))
- [MQTTnetを使用してC#でMQTT](https://www.emqx.com/ja/blog/connecting-to-serverless-mqtt-broker-with-mqttnet-in-csharp) ([Edit](https://github.com/emqx/blog/blob/main/ja/202410/connecting-to-serverless-mqtt-broker-with-mqttnet-in-csharp.md))
- [Rust(rumqttc)でMQTT](https://www.emqx.com/ja/blog/how-to-use-mqtt-in-rust) ([Edit](https://github.com/emqx/blog/blob/main/ja/202405/how-to-use-mqtt-in-rust.md))
diff --git a/README-ZH.md b/README-ZH.md
index 82743ef6..872b4a18 100644
--- a/README-ZH.md
+++ b/README-ZH.md
@@ -153,6 +153,7 @@ Best practice of MQTT in various clients.
## [MQTT Integration (Eco & Integration)](https://www.emqx.com/zh/blog/category/eco-and-integration)
Explore more with & via EMQ.
+- [打造透明、高效的分布式系统:通过 EMQX ECP 集成实现链路追踪功能](https://www.emqx.com/zh/blog/emqx-ecp-datalayers-and-open-telemetry-collector) ([Edit](https://github.com/emqx/blog/blob/main/zh/202411/emqx-ecp-datalayers-and-open-telemetry-collector.md))
- [使用 Node-RED 处理 MQTT 数据](https://www.emqx.com/zh/blog/using-node-red-to-process-mqtt-data) ([Edit](https://github.com/emqx/blog/blob/main/zh/202409/using-node-red-to-process-mqtt-data.md))
- [MQTT + PostgreSQL 集成指南:实现车辆实时位置监控](https://www.emqx.com/zh/blog/mqtt-to-postgresql) ([Edit](https://github.com/emqx/blog/blob/main/zh/202408/mqtt-to-postgresql.md))
- [EMQX Platform & Snowflake:构建可再生分布式能源的智慧未来](https://www.emqx.com/zh/blog/mqtt-and-snowflake-distributed-renewable-energy) ([Edit](https://github.com/emqx/blog/blob/main/zh/202408/mqtt-and-snowflake-distributed-renewable-energy.md))
diff --git a/README.md b/README.md
index c02c3807..c5c45b0d 100644
--- a/README.md
+++ b/README.md
@@ -165,6 +165,7 @@ Best practice of MQTT in various clients.
## [MQTT Integration (Eco & Integration)](https://www.emqx.com/en/blog/category/eco-and-integration)
Explore more with & via EMQ.
+- [Real-Time Monitoring and Predictive Maintenance with EMQX, RisingWave, and Grafana](https://www.emqx.com/en/blog/real-time-monitoring-with-emqx-risingwave-and-grafana) ([Edit](https://github.com/emqx/blog/blob/main/en/202411/real-time-monitoring-with-emqx-risingwave-and-grafana.md))
- [Integrating STOMP with EMQX: A Comprehensive Guide](https://www.emqx.com/en/blog/integrating-stomp-with-emqx) ([Edit](https://github.com/emqx/blog/blob/main/en/202410/integrating-stomp-with-emqx.md))
- [Database for MQTT Data Storage: A Selection Guide](https://www.emqx.com/en/blog/database-for-mqtt-data-storage) ([Edit](https://github.com/emqx/blog/blob/main/en/202409/database-for-mqtt-data-storage.md))
- [MQTT and Snowflake: Creating a New Future for Distributed Renewable Energy](https://www.emqx.com/en/blog/mqtt-and-snowflake-distributed-renewable-energy) ([Edit](https://github.com/emqx/blog/blob/main/en/202407/mqtt-and-snowflake-distributed-renewable-energy.md))
diff --git a/en/202411/real-time-monitoring-with-emqx-risingwave-and-grafana.md b/en/202411/real-time-monitoring-with-emqx-risingwave-and-grafana.md
new file mode 100644
index 00000000..c13b5d6e
--- /dev/null
+++ b/en/202411/real-time-monitoring-with-emqx-risingwave-and-grafana.md
@@ -0,0 +1,401 @@
+>This guest blog is contributed by RisingWave.
+
+## Overview
+
+Real-time data processing is crucial in the Industrial Internet of Things (IIoT) space, where timely insights can drive significant operational improvements. By leveraging platforms like EMQX for various industrial data streaming and RisingWave for real-time analytics, manufacturers can process and analyze data from machines as it's generated, enabling predictive maintenance, reducing downtime, and improving efficiency. The integration of these technologies can empower industries to respond instantly to equipment failures, optimize production, and make data-driven decisions that enhance overall equipment effectiveness (OEE) and streamline operations across the board.
+
+This blog will outline the integration of EMQX with RisingWave, creating a robust system designed for real-time monitoring and predictive maintenance within the IIoT framework.
+
+## The Technical Stack
+
+### EMQ and EMQX
+
+[EMQ](https://www.emqx.com/en) is a global leader in providing edge-cloud connectivity and data platform solutions. EMQ facilitates data collection, transmission, transformation, storage, analysis, and control between the physical devices and digital systems with its high-performance MQTT messaging platform EMQX and other software solutions.
+
+EMQ helps businesses tackle data challenges across various scenarios, such as connected vehicles, smart factories, smart buildings, retail, robotics, drones, maritime shipping, and large-scale distributed energy device networks (including renewable energy grids, distributed energy storage, transmission and distribution power grid, gas and water networks).
+
+EMQX is a scalable, distributed MQTT platform that supports unlimited connections, offers seamless integration, and can be deployed anywhere. It can seamlessly integrate IoT data with various backend databases and analytics tools, enabling enterprises to build IoT platforms and applications with leading competitiveness rapidly.
+
+### RisingWave
+
+[RisingWave](https://risingwave.com/) is an SQL-based platform for event-driven workloads, designed to handle large volumes of real-time data efficiently. It offers robust connectors for various data systems, Postgres compatibility, and delivers low-latency results using real-time materialized views. With simple scaling and seamless integration, it is ideal for use cases such as predictive maintenance, quality control, supply chain optimization, energy management, and production line optimization.
+
+### Integration of EMQX, RisingWave, and Grafana
+
+In this blog post, we develop a real-time monitoring, predictive maintenance, and anomaly detection system for PBL86-80 motors used in robotic solutions in manufacturing. This system collects data from the motors on a factory-floor, sends it to an EMQX broker running in EMQX Platform and ingests it into RisingWave for advanced real-time analytics for monitoring, predictive maintenance and anomaly detection. Then, Grafana is used to create charts and real-time dashboard that monitors the factory shop floor.
+
+![Overview of the technical stack](https://assets.emqx.com/images/d6e7c95e10a450d6b36713fdad6bc909.png)
+
+
Overview of the technical stack
+
+## Set up EMQX to Ingest Real-Time Machine Data from Shop-Floor
+
+This section goes through the steps to create an EMQX broker on the EMQX Platform and connect it to RisingWave for data ingestion. For more information regarding the data ingestion from EMQX, please refer to [EMQX documentation](https://docs.emqx.com/en/).
+
+### **Sign up for an EMQX Platform Account**
+
+Begin by signing up for [EMQX Platform Cloud Deployment](https://accounts.emqx.com/signup?continue=https%3A%2F%2Fwww.emqx.com%2Fcn%2Fcloud) account with 14-day free-trial, which provides access to EMQX services.
+
+![Sign up for EMQX Cloud](https://assets.emqx.com/images/cd5e9fbc91eecdd2fdee850087d0412e.png)
+
+ Sign up for EMQX Cloud
+
+### Create a New Deployment
+
+Log in to you account, and on the start page, click **New Deployment** to go to the New Deployment page.
+
+![Create a new deployment](https://assets.emqx.com/images/f81679f6c02ee10908c730b45e8da53b.png)
+
+Create a new deployment
+
+
+
+Select the **Serverless** plan, which provides a free EMQX broker, leave all the deployment settings at their default values, and click **Deploy** to get started with the broker.
+
+![Deploy a serverless EMQX broker](https://assets.emqx.com/images/5125beab117cc09be3b7aabe056482d1.png)
+
+Deploy a serverless EMQX broker
+
+
+
+After you deploy the serverless EMQX broker, it is ready to use.
+
+![Serverless EMQX Cloud deployment](https://assets.emqx.com/images/8615f3822def2b190f9425db3c72c6b3.png)
+
+Serverless EMQX Cloud deployment
+
+
+
+This is an overview of the EMQX Serverless deployment, showing its status, connection information, and deployment API key.
+
+![Overview of the EMQX Serverless deployment](https://assets.emqx.com/images/ac49f3e4035cd818c7c62e717fd9b6bd.png)
+
+Overview of the EMQX Serverless deployment
+
+### **Configure Authentication and Authorization**
+
+Add authentication information before connecting any clients or applications to ensure your data is secure. You can do so by navigating to the deployment's **Access Control** -> **Authentication** page.
+
+![Add username and password for authentication](https://assets.emqx.com/images/0e1629254bdc0e4f9844f73a67945486.png)
+
+Add username and password for authentication
+
+
+
+Then go to the Authorization page to grant permission to publish and subscribe to a topic.
+
+![Add authorization details](https://assets.emqx.com/images/17f58386a1019ed68079f016cc7d04a9.png)
+
+Add authorization details
+
+
+
+We are now ready to ingest shop-floor data from the factory floor into the EMQX broker using the Paho Python client.
+
+Here is a sample of the shop-floor data for electric motors in JSON format:
+
+```json
+{
+ "machine_id": "machine_1",
+ "winding_temperature": 80,
+ "ambient_temperature": 40,
+ "vibration_level": 1.97,
+ "current_draw": 14.43,
+ "voltage_level": 50.37,
+ "nominal_speed": 4207.69,
+ "power_consumption": 646.32,
+ "efficiency": 82.88,
+ "ts": "2024-09-09 09:57:51"
+}
+```
+
+## **Ingest Data from EMQX into RisingWave**
+
+We’ll use RisingWave to ingest and analyze the events from EMQX. In this blog, we use RisingWave Cloud, which provides a user-friendly experience and simplifies the operational aspects of managing and utilizing RisingWave for our real-time monitoring and predictive maintenance system.
+
+### Create a RisingWave Cluster
+
+To create a RisingWave cluster in [RisingWave Cloud](https://cloud.risingwave.com/) and explore the various features it offers, you can sign up for the free plan available. The free plan allows you to test the functionalities of RisingWave without any cost. For detailed instructions on how to create a RisingWave cluster and get started, you can refer to the [official RisingWave documentation](https://docs.risingwave.com/docs/current/intro/). It will provide you with step-by-step guidance on setting up and exploring the features of RisingWave. If you need additional help with setting up this integration, join our active [Slack community](https://www.risingwave.com/slack).
+
+### Create a Source
+
+Once you have deployed the RisingWave cluster, create a source in the [Workspace](https://docs.risingwave.com/cloud/console-overview/) using the following SQL query:
+
+```sqlite
+CREATE TABLE shop_floor_machine_data (
+ machine_id VARCHAR,
+ winding_temperature INT,
+ ambient_temperature INT,
+ vibration_level FLOAT,
+ current_draw FLOAT,
+ voltage_level FLOAT,
+ nominal_speed FLOAT,
+ power_consumption FLOAT,
+ efficiency FLOAT,
+ ts TIMESTAMP
+)
+WITH (
+ connector='mqtt',
+ url='ssl://xxxxxxxxx.us-east-1.emqxsl.com:8883',
+ topic= 'factory/machine_data',
+ username='xxxxxx',
+ password='xxxxxx',
+ qos = 'at_least_once',
+) FORMAT PLAIN ENCODE JSON;
+```
+
+### Create Materialized Views for Data Analysis in RisingWave
+
+We create a set of materialized views in RisingWave based on the `shop_floor_machine_data` source table to facilitate monitoring, predictive maintenance, and anomaly detection. In RisingWave, materialized views are automatically and incrementally updated with each new event, ensuring minimal computing overhead. The RisingWave engine continuously monitors for relevant events from the source after the materialized view is created.
+
+#### **Materialized View for Machine Metrics Aggregation**
+
+This query creates a materialized view `monitoring_mv` that provides one-minute aggregated metrics for each machine on the shop floor. It calculates the average values for winding temperature, ambient temperature, vibration level, current draw, voltage level, nominal speed, power consumption, and efficiency, grouped by machine ID and time windows (window start and window end).
+
+```sql
+CREATE MATERIALIZED VIEW monitoring_mv AS
+SELECT
+ machine_id,
+ AVG(winding_temperature) AS avg_winding_temperature,
+ AVG(ambient_temperature) AS avg_ambient_temperature,
+ AVG(vibration_level) AS avg_vibration_level,
+ AVG(current_draw) AS avg_current_draw,
+ AVG(voltage_level) AS avg_voltage_level,
+ AVG(nominal_speed) AS avg_nominal_speed,
+ AVG(power_consumption) AS avg_power_consumption,
+ AVG(efficiency) AS avg_efficiency,
+ window_start,
+ window_end
+FROM TUMBLE (shop_floor_machine_data,ts, INTERVAL '1 MINUTE')
+GROUP BY machine_id, window_start,window_end;
+```
+
+#### **Materialized View for Maintenance Alerts Based on Recent Machine Metrics**
+
+This query creates a materialized view named `maintenance_mv` that combines recent and historical averages for machine metrics, such as winding temperature, vibration level, current draw, power consumption, and efficiency. It generates alerts for potential maintenance issues by comparing recent statistics against historical averages, flagging conditions like overheating, increased vibration, overcurrent, or efficiency drops. The results are ordered by the end of the time window for easy monitoring.
+
+```sql
+CREATE MATERIALIZED VIEW maintenance_mv AS
+WITH Historical_Averages AS (
+ SELECT
+ machine_id,
+ AVG(winding_temperature) AS avg_winding_temp,
+ AVG(vibration_level) AS avg_vibration,
+ AVG(current_draw) AS avg_current_draw,
+ AVG(power_consumption) AS avg_power_consumption,
+ AVG(efficiency) AS avg_efficiency
+ FROM shop_floor_machine_data
+ WHERE ts < NOW() - INTERVAL '1' HOUR -- Historical data for the last 1 hour
+ GROUP BY machine_id
+),
+Recent_Stats AS (
+ SELECT
+ machine_id,
+ COUNT(*) AS event_count,
+ window_start,
+ window_end,
+ AVG(winding_temperature) AS avg_winding_temp,
+ AVG(vibration_level) AS avg_vibration,
+ AVG(current_draw) AS avg_current_draw,
+ AVG(power_consumption) AS avg_power_consumption,
+ AVG(efficiency) AS avg_efficiency
+ FROM TUMBLE (shop_floor_machine_data,ts, INTERVAL '1 MINUTES')
+ GROUP BY machine_id, window_start,window_end
+)
+SELECT
+ r.machine_id,
+ r.window_start,
+ r.window_end,
+ r.avg_winding_temp,
+ r.avg_vibration,
+ r.avg_current_draw,
+ r.avg_power_consumption,
+ r.avg_efficiency,
+ CASE
+ WHEN r.avg_winding_temp > h.avg_winding_temp + 5 THEN 'Potential Overheating'
+ WHEN r.avg_vibration > h.avg_vibration + 0.1 THEN 'Increased Vibration'
+ WHEN r.avg_current_draw > h.avg_current_draw + 2 THEN 'Possible overcurrent condition'
+ WHEN r.avg_efficiency < h.avg_efficiency - 5 THEN 'Efficiency Drop'
+ ELSE 'Normal'
+ END AS maintenance_alert
+FROM
+ Recent_Stats r
+JOIN
+ Historical_Averages h
+ON
+ r.machine_id = h.machine_id
+WHERE
+ r.avg_winding_temp > h.avg_winding_temp + 5 OR
+ r.avg_vibration > h.avg_vibration + 0.1 OR
+ r.avg_current_draw > h.avg_current_draw + 2 OR
+ r.avg_efficiency < h.avg_efficiency - 5
+ORDER BY
+ r.window_end DESC;
+```
+
+#### **Materialized View for Anomaly Detection in Machine Metrics**
+
+This query creates a materialized view named `anomalies_mv` that identifies anomalies in machine metrics by analyzing recent data. It computes average values, standard deviations, and maximums for metrics such as winding temperature, vibration level, current draw, voltage level, and power consumption over one-minute intervals. By comparing current metrics with historical data, it generates alerts for significant deviations and rising trends, filtering the results to highlight only notable anomalies and ordering them by the time window's end.
+
+```sql
+CREATE MATERIALIZED VIEW anomalies_mv AS
+WITH Anomaly_Metrics AS (
+ SELECT
+ machine_id,
+ window_start,
+ window_end,
+ AVG(winding_temperature) AS avg_winding_temp,
+ AVG(vibration_level) AS avg_vibration,
+ AVG(current_draw) AS avg_current_draw,
+ AVG(voltage_level) AS avg_voltage_level,
+ AVG(power_consumption) AS avg_power_consumption,
+ STDDEV_POP(winding_temperature) AS stddev_winding_temp,
+ STDDEV_POP(vibration_level) AS stddev_vibration,
+ STDDEV_POP(current_draw) AS stddev_current_draw,
+ STDDEV_POP(voltage_level) AS stddev_voltage_level,
+ STDDEV_POP(power_consumption) AS stddev_power_consumption,
+ MAX(winding_temperature) AS max_winding_temp,
+ MAX(vibration_level) AS max_vibration,
+ MAX(current_draw) AS max_current_draw,
+ MAX(voltage_level) AS max_voltage_level,
+ MAX(power_consumption) AS max_power_consumption
+ FROM TUMBLE (shop_floor_machine_data,ts, INTERVAL '1 MINUTES')
+ GROUP BY machine_id, window_start,window_end
+),
+Trend_Analysis AS (
+ SELECT
+ machine_id,
+ window_start,
+ window_end,
+ avg_winding_temp,
+ avg_vibration,
+ avg_current_draw,
+ avg_voltage_level,
+ avg_power_consumption,
+ stddev_winding_temp,
+ stddev_vibration,
+ stddev_current_draw,
+ stddev_voltage_level,
+ stddev_power_consumption,
+ max_winding_temp,
+ max_vibration,
+ max_current_draw,
+ max_voltage_level,
+ max_power_consumption,
+ LAG(avg_winding_temp, 1) OVER (PARTITION BY machine_id ORDER BY window_end) AS prev_avg_winding_temp,
+ LAG(avg_vibration, 1) OVER (PARTITION BY machine_id ORDER BY window_end) AS prev_avg_vibration,
+ LAG(avg_current_draw, 1) OVER (PARTITION BY machine_id ORDER BY window_end) AS prev_avg_current_draw,
+ LAG(avg_voltage_level, 1) OVER (PARTITION BY machine_id ORDER BY window_end) AS prev_avg_voltage_level,
+ LAG(avg_power_consumption, 1) OVER (PARTITION BY machine_id ORDER BY window_end) AS prev_avg_power_consumption
+ FROM Anomaly_Metrics
+)
+SELECT
+ machine_id,
+ window_start,
+ window_end,
+ avg_winding_temp,
+ avg_vibration,
+ avg_current_draw,
+ avg_voltage_level,
+ avg_power_consumption,
+ stddev_winding_temp,
+ stddev_vibration,
+ stddev_current_draw,
+ stddev_voltage_level,
+ stddev_power_consumption,
+ max_winding_temp,
+ max_vibration,
+ max_current_draw,
+ max_voltage_level,
+ max_power_consumption,
+ CASE
+ WHEN max_winding_temp > avg_winding_temp + 3 * stddev_winding_temp THEN 'Anomalous Winding Temperature'
+ WHEN max_vibration > avg_vibration + 3 * stddev_vibration THEN 'Anomalous Vibration Level'
+ WHEN max_current_draw > avg_current_draw + 3 * stddev_current_draw THEN 'Anomalous Current Draw'
+ WHEN max_voltage_level > avg_voltage_level + 3 * stddev_voltage_level THEN 'Anomalous Voltage Level'
+ WHEN max_power_consumption > avg_power_consumption + 3 * stddev_power_consumption THEN 'Anomalous Power Consumption'
+ WHEN (avg_winding_temp - prev_avg_winding_temp) > 2 * stddev_winding_temp THEN 'Rising Winding Temperature'
+ WHEN (avg_vibration - prev_avg_vibration) > 2 * stddev_vibration THEN 'Increasing Vibration'
+ WHEN (avg_current_draw - prev_avg_current_draw) > 2 * stddev_current_draw THEN 'Rising Current Draw'
+ WHEN (avg_voltage_level - prev_avg_voltage_level) > 2 * stddev_voltage_level THEN 'Rising Voltage Level'
+ WHEN (avg_power_consumption - prev_avg_power_consumption) > 2 * stddev_power_consumption THEN 'Rising Power Consumption'
+ ELSE 'Normal'
+ END AS anomaly_alert
+FROM Trend_Analysis
+WHERE
+ max_winding_temp > avg_winding_temp + 3 * stddev_winding_temp OR
+ max_vibration > avg_vibration + 3 * stddev_vibration OR
+ max_current_draw > avg_current_draw + 3 * stddev_current_draw OR
+ max_voltage_level > avg_voltage_level + 3 * stddev_voltage_level OR
+ max_power_consumption > avg_power_consumption + 3 * stddev_power_consumption OR
+ (avg_winding_temp - prev_avg_winding_temp) > 2 * stddev_winding_temp OR
+ (avg_vibration - prev_avg_vibration) > 2 * stddev_vibration OR
+ (avg_current_draw - prev_avg_current_draw) > 2 * stddev_current_draw OR
+ (avg_voltage_level - prev_avg_voltage_level) > 2 * stddev_voltage_level OR
+ (avg_power_consumption - prev_avg_power_consumption) > 2 * stddev_power_consumption
+ORDER BY
+ window_end DESC;
+```
+
+## Send the Data from RisingWave to Apache Grafana for Visualization
+
+We’ll configure Grafana to read data from RisingWave and build visualizations.
+
+### Connect RisingWave to Grafana
+
+To utilize RisingWave as a data source in Grafana and create visualizations and dashboards, follow the instructions provided in [Configure Grafana to read data from RisingWave](https://docs.risingwave.com/docs/current/grafana-integration/).
+
+Once the connection between RisingWave and Grafana is established, you can incorporate materialized views from RisingWave as tables to design charts and build a comprehensive dashboard.
+
+### Visualize Data with Grafana: Table, Charts, and Dashboards
+
+This table is generated from the previously created `shop_floor_machine_data` table, which stores sensor readings and operational metrics from machines on the shop floor. Each record represents a machine's performance at a specific point in time.
+
+![table](https://assets.emqx.com/images/409939ff79c9680e9ef706f34c63c8c6.png)
+
+This chart is generated from the `anomalies_mv` materialized view, which displays alerts like "Anomalous Vibration Level" or "Rising Power Consumption" triggered when deviations exceed predefined thresholds. These alerts highlight unusual machine behavior, enabling real-time monitoring and predictive maintenance.
+
+![image.png](https://assets.emqx.com/images/374f53dedd55e9eaf9473c4db30af926.png)
+
+This chart is based on the `maintenance_mv` materialized view, which tracks real-time machine performance metrics and compares them against historical averages to detect potential maintenance issues. When specific thresholds are exceeded — such as a winding temperature increase of more than 5 degrees or an efficiency drop of over 5% — the system triggers alerts like "Potential Overheating" or "Efficiency Drop." This enables proactive maintenance, helping prevent equipment failures.
+
+![image.png](https://assets.emqx.com/images/f2eb99a27073910559957b6759e275ec.png)
+
+This chart is based on the `shop_floor_machine_data` table and displays the winding temperatures of the machines on the shop floor. If the winding temperature exceeds the threshold of 81°C, the corresponding data points are highlighted in red to indicate a potential issue.
+
+![image.png](https://assets.emqx.com/images/0cdc4377cc4272c28c3c8056b8dd4004.png)
+
+This chart is based on the `shop_floor_machine_data` table and illustrates the vibration levels of the machines on the shop floor. If the vibration level exceeds the threshold of 2.05, it indicates potential mechanical issues that may require attention.
+
+![image.png](https://assets.emqx.com/images/9bb61f6802d65336ee5fcc32cafe04c3.png)
+
+This pie chart, generated using data from the shop_floor_machine_data table, represents the distribution of ambient temperatures across the factory floor.
+
+![image.png](https://assets.emqx.com/images/51e57fa2d0068f239745de37578dc11f.png)
+
+This bar chart is generated using data from the `shop_floor_machine_data` table and displays the nominal speed and power consumption of the machines. A red line is included to indicate the threshold of 4210, serving as a reference point for comparison.
+
+![image.png](https://assets.emqx.com/images/45c04c2bf56aa275382e685b156e0065.png)
+
+This chart is based on the `shop_floor_machine_data` table and displays the efficiency of all the machines. If the efficiency drops below the threshold of 80, the affected data points are highlighted in red to indicate suboptimal performance.
+
+![image.png](https://assets.emqx.com/images/fcfb806ab19389a573eb37e52315b3e1.png)
+
+This is a real-time unified dashboard that monitors the factory shop floor, providing a comprehensive view of operational performance. It displays alerts related to predictive maintenance and anomaly detection, enabling quick identification of potential issues and facilitating proactive management of equipment health.
+
+![image.png](https://assets.emqx.com/images/3be77a2a0612df3c445f7bd16832a5d5.png)
+
+## Conclusion
+
+In this blog, we explored a real-time monitoring and predictive maintenance system for PBL86-80 motors in manufacturing. The system collects motor data, sends it to EMQX, and processes it in RisingWave for real-time analytics, enabling monitoring, predictive maintenance, and anomaly detection. Grafana visualizes the data through real-time dashboards.
+
+We demonstrated how EMQX and RisingWave form a perfect combination for anomaly detection, predictive maintenance, and real-time monitoring in IIoT and manufacturing scenarios. We encourage users to explore both platforms to build scalable, cost-effective solutions for their diverse IIoT use cases.
+
+
+
+
diff --git a/ja/202411/using-mqtt-in-unity-with-m2mqttunity-library-a-step-by-step-guide.md b/ja/202411/using-mqtt-in-unity-with-m2mqttunity-library-a-step-by-step-guide.md
new file mode 100644
index 00000000..8504ef27
--- /dev/null
+++ b/ja/202411/using-mqtt-in-unity-with-m2mqttunity-library-a-step-by-step-guide.md
@@ -0,0 +1,218 @@
+Unityは、幅広いゲームやシミュレーションを作成するために使用されている人気のゲームエンジンです。[MQTT](https://www.emqx.com/ja/blog/the-easiest-guide-to-getting-started-with-mqtt)は、パブリッシュ/サブスクライブモデルに基づく軽量なメッセージングプロトコルであり、低帯域幅や不安定なネットワーク環境でのIoTアプリケーション向けに特別に設計されています。
+
+MQTTは、AR(拡張現実)ゲーム、センサーやその他のデバイスを利用したIoT対応ゲーム、ゲームやシミュレーションのリモートコントロールなど、さまざまな目的でUnityで使用できます。例えば、ARゲームでは、ユーザーのデバイスから平面表面の位置、オブジェクト、人、顔の検出など、世界に関する情報を受信するためにMQTTが使用されます。
+
+このブログでは、[M2MQTT](https://github.com/eclipse/paho.mqtt.m2mqtt)をUnityで使用するためのシンプルな[Unity3d](http://unity3d.com/)プロジェクトを提供します。プロジェクトには、ブローカーへの接続管理やメッセージングのテスト用のユーザーインターフェースを備えた例のシーンが含まれています。
+
+## 前提条件
+
+### Unityのインストール
+
+Unityのインストーラーは、[Unityのウェブサイト](https://unity.com/download)から主要なプラットフォーム向けにダウンロードできます。
+
+### MQTTブローカーの準備
+
+先に進む前に、通信およびテスト用の[MQTTブローカー](https://www.emqx.com/ja/blog/the-ultimate-guide-to-mqtt-broker-comparison)を用意してください。
+
+このブログ記事では、`broker.emqx.io`にある[無料のパブリックMQTTブローカー](https://www.emqx.com/ja/mqtt/public-mqtt5-broker)を使用します。
+
+```
+サーバー: broker.emqx.io
+TCPポート: 1883
+WebSocketポート: 8083
+SSL/TLSポート: 8883
+セキュアWebSocketポート: 8084
+```
+
+無料のパブリックMQTTブローカーは、MQTTプロトコルを学習およびテストしたい方専用に提供されています。セキュリティリスクやダウンタイムの懸念があるため、本番環境での使用は避けることが重要です。
+
+## Unity用のM2MQTT
+
+[M2MQTTライブラリ](https://github.com/CE-SDV-Unity/M2MqttUnity)は、Unityで[M2MQTT](https://github.com/eclipse/paho.mqtt.m2mqtt)を使用するためのシンプルな[Unity3d](http://unity3d.com/)プロジェクトです。ブローカーへの接続管理やメッセージングのテスト用のUIを備えた例のシーンが含まれています。このブログ記事では、例のシーンを使用して、MQTTを利用してMQTTブローカーと通信するアプリケーションを作成する方法を説明します。
+
+まず、GitHubからリポジトリをダウンロードします。
+
+```
+git clone https://github.com/CE-SDV-Unity/M2MqttUnity.git
+```
+
+### **例のシーンをインポートする**
+
+次に、UnityHubで新しいUnityプロジェクトを作成します。
+
+![New Unity project in UnityHub](https://assets.emqx.com/images/df5df7aeb67cba3b8e326afa811f0ace.png)
+
+その後、ダウンロードしたM2MQTTリポジトリから`M2Mqtt`および`M2MqttUnity`フォルダを新しいUnityプロジェクトの`Assets`フォルダにコピーします。
+
+![Copy the `M2Mqtt` and `M2MqttUnity`](https://assets.emqx.com/images/38244fa7514bf682f547c0168fdf18f4.png)
+
+ライブラリには、`M2MqttUnity_Test`というテストシーンが含まれており、`M2MqttUnity/Examples/Scenes`フォルダにあります。このシーンを確認すると、MQTTクライアントのセットアップに使用されている唯一のスクリプトは`M2MqttUnityTest.cs`であり、このスクリプトはシーン内のM2MQTT GameObjectにアタッチされています。ただし、このスクリプトはメインフォルダ`M2Mqtt`の他のクラスとリンクされています。
+
+## 接続と購読
+
+`Play`ボタンを押してアプリケーションを実行します。`Game`タブには、ブローカーアドレス入力ボックスにデフォルトでオフラインのブローカーが表示されます。事前に準備したパブリックMQTTブローカー(`broker.emqx.io`)に置き換える必要があります。
+
+![Press `Play` to run the application](https://assets.emqx.com/images/ed8a1df0d2f4a6623c1be3a0de599554.png)
+
+アドレスを置き換えたら、「Connect」をクリックしてパブリックMQTTブローカーへの接続を確立します。
+
+![Click on "Connect"](https://assets.emqx.com/images/fc291b03470defbc144797ad20b7758d.png)
+
+対応するコードは非常にシンプルです。`broker.emqx.io`への接続を作成し、トピック「M2MQTT_Unity/test」を購読します。
+
+```
+public void SetBrokerAddress(string brokerAddress)
+ {
+ if (addressInputField && !updateUI)
+ {
+ this.brokerAddress = brokerAddress;
+ }
+ }
+
+ public void SetBrokerPort(string brokerPort)
+ {
+ if (portInputField && !updateUI)
+ {
+ int.TryParse(brokerPort, out this.brokerPort);
+ }
+ }
+
+ public void SetEncrypted(bool isEncrypted)
+ {
+ this.isEncrypted = isEncrypted;
+ }
+
+ public void SetUiMessage(string msg)
+ {
+ if (consoleInputField != null)
+ {
+ consoleInputField.text = msg;
+ updateUI = true;
+ }
+ }
+
+ public void AddUiMessage(string msg)
+ {
+ if (consoleInputField != null)
+ {
+ consoleInputField.text += msg + "\\n";
+ updateUI = true;
+ }
+ }
+
+ protected override void OnConnecting()
+ {
+ base.OnConnecting();
+ SetUiMessage("Connecting to broker on " + brokerAddress + ":" + brokerPort.ToString() + "...\\n");
+ }
+
+ protected override void OnConnected()
+ {
+ base.OnConnected();
+ SetUiMessage("Connected to broker on " + brokerAddress + "\\n");
+
+ if (autoTest)
+ {
+ TestPublish();
+ }
+ }
+
+ protected override void SubscribeTopics()
+ {
+ client.Subscribe(new string[] { "M2MQTT_Unity/test" }, new byte[] { MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE });
+ }
+
+```
+
+## MQTTメッセージのパブリッシュ
+
+別のクライアントとして[**MQTTクライアントツール - MQTTX**](https://mqttx.app/)を使用して、メッセージのパブリッシュと受信をテストします。
+
+![MQTTX Client Tool - MQTTX](https://assets.emqx.com/images/e4c4c7b8881eb127ff0555e9eb68084d.png)
+
+接続後、「Test Publish」をクリックします。「Test message」がゲームクライアントとMQTTXの両方で受信されたことが確認できます。
+
+![Click on `Test Publish`](https://assets.emqx.com/images/ca89bd7e9468bea94c68d0346345d8f5.png)
+
+!["Test message" has been received](https://assets.emqx.com/images/6d31b73d694b2e02f31c0e4fd439bba8.png)
+
+対応するコードは、`publish()`関数を使用してトピック「M2MQTT_Unity/test」にメッセージ「Test message」をパブリッシュします。
+
+```
+public void TestPublish()
+ {
+ client.Publish("M2MQTT_Unity/test", System.Text.Encoding.UTF8.GetBytes("Test message"), MqttMsgBase.QOS_LEVEL_EXACTLY_ONCE, false);
+ Debug.Log("Test message published");
+ AddUiMessage("Test message published.");
+ }
+```
+
+## メッセージの受信
+
+![Receive Messages](https://assets.emqx.com/images/d186935dd01c49f768d42e703a8c81a3.png)
+
+MQTTXを使用して別のテストメッセージを送信すると、クライアントがそれを受信し、`Game`タブに表示されます。
+
+![Send another test message](https://assets.emqx.com/images/13304957c825cd5b9a1233aa9ebb4b84.png)
+
+対応するコードは、メッセージをデコード、処理し、`Game`タブに表示します。
+
+```
+protected override void DecodeMessage(string topic, byte[] message)
+ {
+ string msg = System.Text.Encoding.UTF8.GetString(message);
+ Debug.Log("Received: " + msg);
+ StoreMessage(msg);
+ if (topic == "M2MQTT_Unity/test")
+ {
+ if (autoTest)
+ {
+ autoTest = false;
+ Disconnect();
+ }
+ }
+ }
+
+ private void StoreMessage(string eventMsg)
+ {
+ eventMessages.Add(eventMsg);
+ }
+
+ private void ProcessMessage(string msg)
+ {
+ AddUiMessage("Received: " + msg);
+ }
+
+ protected override void Update()
+ {
+ base.Update(); // call ProcessMqttEvents()
+
+ if (eventMessages.Count > 0)
+ {
+ foreach (string msg in eventMessages)
+ {
+ ProcessMessage(msg);
+ }
+ eventMessages.Clear();
+ }
+ if (updateUI)
+ {
+ UpdateUI();
+ }
+ }
+```
+
+
+
+## まとめ
+
+このブログ記事では、Unityを使用してMQTTブローカーと通信するアプリケーションを作成する方法についてのガイドを提供しました。このガイドに従うことで、接続の確立、トピックの購読、メッセージのパブリッシュ、および[M2MQTTライブラリ](https://github.com/CE-SDV-Unity/M2MqttUnity)を使用したリアルタイムメッセージの受信方法を学ぶことができます。
+
+
+
+
diff --git a/zh/202411/emqx-ecp-datalayers-and-open-telemetry-collector.md b/zh/202411/emqx-ecp-datalayers-and-open-telemetry-collector.md
new file mode 100644
index 00000000..78715d04
--- /dev/null
+++ b/zh/202411/emqx-ecp-datalayers-and-open-telemetry-collector.md
@@ -0,0 +1,127 @@
+链路追踪作为一种用于监控和观察分布式系统中请求流动和性能的技术,在现代微服务架构中扮演着重要角色。
+
+在复杂的分布式环境中,它可以记录并可视化跨多个服务与组件的完整请求路径,并提供每个服务节点上的执行时间,帮助开发人员清晰地掌握请求走向、识别性能瓶颈。
+
+在出现故障或错误时,链路追踪能够提供详细的信息,帮助开发人员快速定位问题的根源,加速故障排查过程。通过分析链路追踪数据,团队可以基于实际使用情况优化服务、调整资源配置,从而进行容量规划和设计决策。
+
+本文将介绍 EMQX ECP 和 Datalayers 如何通过 OpenTelemetry Collector 集成以实现链路追踪功能,基于 ECP 通过 Datalayers 的 REST API 查询,可以实现对链路追踪数据的检索和展示,辅助用户对分布式系统的监控和诊断。
+
+## 产品介绍
+
+**[EMQX ECP](https://www.emqx.cn/products/emqx-ecp):**是一款面向工业 4.0 工业互联数据平台,能够满足工业场景大规模数据采集、处理和存储分析的需求,提供边缘服务的快速部署、远程操作和集中管理等功能,助力工业领域数据互联互通,以数据 + AI 驱动生产监测、控制和决策,实现智能化生产,提高效率、质量和可持续性。
+
+**[Datalayers](https://datalayers.cn/):**是澜图未来(成都)数据科技有限公司开发的一款为工业物联网、车联网、能源行业设计的分布式多模态、超融合数据库,具备时序数据存储、多模融合、键值存储、存算分离、读写分离、自适应压缩、原生 SQL、边云同步和云原生等特点,支持边缘向云端的数据同步,并针对受限设备进行优化。
+
+## 链路追踪的实现
+
+### 数据写入
+
+EMQX ECP 相关的链路追踪服务 NeuronEX 和 EMQX 的 Trace 数据都支持通过 otlp protocol 写入到 otlp 协议的服务端,通过 OpenTelemetry Collector 的 otlp receivers 插件,可以开启 http 和 grpc 两种协议的接收器,OpenTelemetry Collector 收到 trace 数据后,通过各种 Exporter 插件可以将数据写入不同的后端数据库中。
+
+由于 Datalayers 也支持 InfluxDB 行协议,可以通过 OpenTelemetry Collector 的 InfluxDB Exporter 插件与 Datalayers 实现集成。
+
+![通过 OpenTelemetry Collector 将链路追踪数据存入 Datalayers](https://assets.emqx.com/images/6f34f3cb1d31389729927fd2595f3a24.png)
+
+通过 OpenTelemetry Collector 将链路追踪数据存入 Datalayers
+
+
+
+[OpenTelemetry Collector](https://opentelemetry.io/docs/collector/) 官方提供了 [Core](https://hub.docker.com/r/otel/opentelemetry-collector/tags)、 [Contrib](https://hub.docker.com/r/otel/opentelemetry-collector-contrib) 两个不同的版本。 其中,前者只包基础的插件, 后者包含了所有的插件。Core 版本中没有 influxdb exporter 插件,而 Contrib 版本中有。用户也可以按需自己构建镜像,只包含自己需要的插件,建议生产环境采用这种方式, 参考:[Building a custom collector](https://github.com/open-telemetry/opentelemetry-collector-contrib/tree/main/exporter/influxdbexporter)。
+
+由于 Datalayers 仅支持 InfluxDB v1.x API 行协议, 因此需要在 OpenTelemetry Collector 的 InfluxDB Exporter 插件配置中开启 `v1_compatibility` 相关配置。通过 `span_dimensions` 可以自定义行协议中的标签, 同时也是 Datalayers 表的联合索引字段, InfluxDB Exporter 默认强制 `span_dimensions` 会加上 `trace_id`, `span_id`, 和我们自己配置的 `span_dimensions` 共同构成协议中的标签。
+
+**InfluxDB Exporter 所有配置如下所示:**
+The following configuration options are supported:
+
+- endpoint (required) HTTP/S destination for line protocol
+ - if path is set to root (/) or is unspecified, it will be changed to /api/v2/write.
+- timeout (default = 5s) Timeout for requests
+- headers: (optional) additional headers attached to each HTTP request
+ - header User-Agent is OpenTelemetry -> Influx by default
+ - if token (below) is set, then header Authorization will overridden with the given token
+- org (required) Name of InfluxDB organization that owns the destination bucket
+- bucket (required) name of InfluxDB bucket to which signals will be written
+- token (optional) The authentication token for InfluxDB
+- v1_compatibility (optional) Options for exporting to InfluxDB v1.x
+ - enabled (optional) Use InfluxDB v1.x API if enabled
+ - db (required if enabled) Name of the InfluxDB database to which signals will be written
+ - username (optional) Basic auth username for authenticating with InfluxDB v1.x
+ - password (optional) Basic auth password for authenticating with InfluxDB v1.x
+- span_dimensions (default = service.name), span.name) Span attributes to use as dimensions (InfluxDB tags)
+- log_record_dimensions (default = service.name) Log Record attributes to use as dimensions (InfluxDB tags)
+- payload_max_lines (default = 10_000) Maximum number of lines allowed per HTTP POST request
+- payload_max_bytes (default = 10_000_000) Maximum number of bytes allowed per HTTP POST request
+- metrics_schema (default = telegraf-prometheus-v1) The chosen metrics schema to write; must be one of:
+ - telegraf-prometheus-v1
+ - telegraf-prometheus-v2
+- sending_queue details here
+ - enabled (default = true)
+ - num_consumers (default = 10) The number of consumers from the queue
+ - queue_size (default = 1000) Maximum number of batches allowed in queue at a given time
+- retry_on_failure details here
+ - enabled (default = true)
+ - initial_interval (default = 5s) Time to wait after the first failure before retrying
+ - max_interval (default = 30s) Upper bound on backoff interval
+ - max_elapsed_time (default = 120s) Maximum amount of time (including retries) spent trying to send a request/batch
+
+详见: [influxdb-exporter configuration](https://github.com/open-telemetry/opentelemetry-collector-contrib/blob/main/exporter/influxdbexporter/README.md)
+
+**最简 OpenTelemetry Collector 配置示例**
+
+```
+receivers:
+ otlp:
+ protocols:
+ grpc:
+ endpoint: 0.0.0.0:4317
+ http:
+ endpoint: 0.0.0.0:4318
+exporters:
+ influxdb:
+ endpoint: http://172.31.104.77:8361
+ v1_compatibility:
+ enabled: true
+ db: demo
+ username: admin
+ password: public
+service:
+ extensions: []
+ pipelines:
+ traces:
+ receivers: [otlp]
+ processors: []
+ exporters: [influxdb]
+```
+
+配置中 Exporter 的 endpoint 需要替换成自己的 Datalayers 地址。由于当前 Datalayers 默认只支持 v1 版本的 InfluxDB Line Protocol,所以需要将 v1_compatibility 设置为 true。要使用的数据库名称需要提前在 Datalayers 中创建。
+
+在 receivers 中选择一个协议(比如 otlp),和协议对应的 endpoint 配置。 从 receivers 中收到的数据会被 processor 处理,这里没有配置,所以直接发送到 exporters,即为 Datalayers。当 Datalayers 收到数据后,会根据配置的数据库名称,将数据写入到对应的数据库中, 如果没有对应的表, 则会自动创建(如果关闭了 Datalayers 的自动创建表功能, 则需要提前在 Datalayers 中创建表)。
+
+### 数据查询
+
+Datalayers 使用 SQL 作为查询语言,SQL 是一种相对简单的语言,易于学习和使用。它使用类似自然语言的语法,使得用户可以快速上手,从而减少了学习成本。
+
+可以通过 REST API 或者 Arrow Flight SQL 进行查询。其中 REST API 是基于 HTTP 的,而 Arrow Flight SQL 是基于 gRPC 的,性能更好,并且提供了常见语言的 SDK 。ECP 目前使用的是 REST API 查询, 后期可能会切换到性能更好的 Arrow Flight SQL方式。此外,Datalayers 还支持按时间窗口进行聚合查询等功能, 此处不多做介绍, 感兴趣可以查阅官方文档。
+
+![image.png](https://assets.emqx.com/images/34245cfae92943c550995b4b349c02e1.png)
+
+ ECP 链路追踪查询界面
+
+
+
+上图展示了 EMQX ECP 的链路追踪 trace_id 列表, 表格中列出了多个请求的追踪信息,包括它们的trace_id、开始时间、服务名称、Span 名称和总耗时。点开后还可以查阅每个 Trace 中所有的 Span, Span 之间的先后顺序, Span 的所有属性, 每个 Span 的耗时等等信息, 这些数据可以帮助开发者分析请求的处理效率,识别性能瓶颈,以及调试系统中的问题。
+
+## 总结
+
+至此,本文完整介绍了 EMQX ECP 和 Datalayers 通过 OpenTelemetry Collector 集成实现链路追踪功能。将 EMQX ECP 的链路追踪数据以 InfluxDB 行协议方式写入 Datalayers,并结合 Datalayers 的 REST API 和 Arrow Flight SQL 两种查询方式,检索和展示链路追踪数据,实现对分布式系统的监控和诊断。
+
+未来,EMQX ECP 还会进一步拓展存储和查询指标数据的功能,敬请期待。
+
+
+
+