須要開發一個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
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/
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