websocket 2 rest api

須要開發一個prometheus 的exporter 使用jmespath 獲取對應metrics的數據,並進行轉換處理,可是由於那個服務
提供的接口是經過websoket 的實時api,因此基於node 進行了簡單的包裝處理,暴露爲一個直接能夠使用的rest api
同時保留了數據的實效性node

實現技術

很簡單,經過express 暴露一個rest api,經過websocket client 鏈接已有websocket 服務,並使用全局變量存儲數據便可
後邊對應的exporter 直接獲取數據進行處理就能夠了git

項目結構

  • 代碼結構
├── Dockerfile
├── README.md
├── app.env
├── docker-compose.yaml
├── index.js
├── package.json
  • 代碼說明
    Dockerfile
FROM node:alpine
WORKDIR /app
COPY . /app
LABEL NORE="ws 2 rest"
ENV NODE_ENV=production
ENV WSADDRESS=ws://localhost:7890/
LABEL AUTHOR="1141591465@qq.com"
EXPOSE 3000
RUN yarn
CMD [ "yarn", "start"]

index.js: 核心處理代碼,和簡單,就是包裝了websocket 服務github

const express = require('express')
const app = express()

var realtimeMetrics ={};
const WebSocketClient = require('websocket').client;

// 經過環境變量配置websocket 服務的地址
const wsAddress = process.env.WSADDRESS || "ws://localhost:7890/"
const client = new WebSocketClient();

client.on('connectFailed', function(error) {
    console.log('Connect Error: ' + error.toString());
});

client.on('connect', function(connection) {
    console.log('WebSocket Client Connected');
    connection.on('error', function(error) {
        console.log("Connection Error: " + error.toString());
    });
    connection.on('close', function() {
        console.log('echo-protocol Connection Closed');
    });
    client.onopen = function() {
        console.log('WebSocket Client Connected');

        function sendNumber() {
            if (client.readyState === client.OPEN) {
                var number = Math.round(Math.random() * 0xFFFFFF);
                client.send(number.toString());
                setTimeout(sendNumber, 1000);
            }
        }
        sendNumber();
    };
    connection.on('message', function(message) {
        if (message.type === 'utf8') {
            console.log("Received: '" + message.utf8Data + "'");
            realtimeMetrics = message.utf8Data;
        }
    });
});

client.connect(wsAddress);
app.get('/', function (req, res) {
    res.contentType("application/json")
    res.send(realtimeMetrics)
})

app.listen(3000)

pacakge.json 內容: 主要是npn 包的引用以及npm script 配置,這個包含了幾個多餘的依賴,可是不影響使用
能夠直接刪除web

{
  "dependencies": {
    "express": "^4.16.4",
    "jmespath": "^0.15.0",
    "node-fetch": "^2.3.0",
    "websocket": "^1.0.28"
  },
  "scripts": {
    "start":"node index.js"
  }
}

docker-compose.yamldocker

version: "3"
services:
    ws2rest:
      image: dalongrong/simplews2rest
      build: ./
      ports:
      - "3000:3000"
      env_file: 
      - app.env

app.env : 主要是方便擴展的express

WSADDRESS=ws://server:port/

使用此服務的demo

  • docker-compose 文件
version: "3"
services:
  metrics:
   image: dalongrong/promethues-jmespath-exporter
   volumes: 
   - "./conf/config.yaml:/etc/prometheus-jsonpath-exporter/config.yml"
   ports:
   - "9158:9158"
   command: /etc/prometheus-jsonpath-exporter/config.yml
  ws2rest:
   image: dalongrong/simplews2rest
   environment:
   - "WSADDRESS=ws://server:7890/"
   ports: 
   - "3000:3000"

參考資料

https://github.com/rongfengliang/ws-rest
https://github.com/rongfengliang/promethues-jmespath-exporter-demonpm

相關文章
相關標籤/搜索