需要开发一个prometheus 的exporter 使用jmespath 获取对应metrics的数据,并进行转换处理,但是因为那个服务
提供的接口是通过websoket 的实时api,所以基于node 进行了简单的包装处理,暴露为一个直接可以使用的rest api
同时保留了数据的实效性

实现技术

很简单,通过express 暴露一个rest api,通过websocket client 连接已有websocket 服务,并使用全局变量存储数据即可
后边对应的exporter 直接获取数据进行处理就可以了

项目结构

  • 代码结构
├── 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 服务

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 配置,这个包含了几个多余的依赖,但是不影响使用
可以直接删除

{
"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.yaml

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

app.env : 主要是方便扩展的

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-demo

 
 
 
 

最新文章

  1. 共有31款PHP 图形/图像处理开源软件(转)
  2. UGUI
  3. python连接mysql的驱动
  4. UVA 10090 Marbles 扩展欧几里得
  5. 【Phylab2.0】Alpha版本发布说明
  6. django 添加动态表格的方法
  7. Entity Framework CodeFirst commands
  8. 【译】RabbitMQ:"Hello World"
  9. 第四章 跨平台图像显示库——SDL 第一节 与SDL第一次亲密接触
  10. CSU 1160 把十进制整数转换为十六进制,格式为0x开头,10~15由大写字母A~F表示
  11. Delphi控件的停靠功能
  12. Linux入门(三)搭建服务器linux运行环境LAMP/LNMP
  13. 建立、配置和使用Activity——启动其他Activity并返回结果
  14. SQL Server使用导入导出向导导入超过4000个字符的字段的数据
  15. Jmeter之性能测试类型
  16. Android 6.0 以后webview不加载图片的问题
  17. CSS3动画属性:动画(animation)
  18. MySQL经典编程问题
  19. hdoj:2086
  20. 我的第一个python爬虫

热门文章

  1. JVM CUP占用率过高排除方法,windows环境
  2. 关于react的分页
  3. Delphi10.2 关于Http 下载
  4. GUI开发:实时显示摄像头图像
  5. 初读"Thinking in Java"读书笔记之第七章 --- 复用类
  6. mybatis(2)--配置mybatis实现连接数据库查询
  7. web前端页面设计小笔记
  8. VB Mouse Pointer
  9. Android 底部导航栏的xml
  10. Netty 基本组件与线程模型