需要开发一个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

 
 
 
 

websocket 2 rest api的更多相关文章

  1. XT交易所Websocket API

    WebSocketAPI xt为用户提供了一个简单的而又强大的API,旨在帮助用户快速高效的将xt交易功能整合到自己应用当中. WebSocket服务地址 xt WebSocket服务连接地址:wss ...

  2. 微服务实战(二):使用API Gateway--转

    原文地址:http://dockone.io/article/482 [编者的话]本系列的第一篇介绍了微服务架构模式.它讨论了采用微服务的优点和缺点,除了一些复杂的微服务,这种模式还是复杂应用的理想选 ...

  3. webSocket详解

    WebSocket 实战http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/index.html 转自IBMdeveloperWorks ...

  4. HTML5学习总结-08 WebSocket 服务器推送

    一 WebSocket 随着互联网的发展,传统的HTTP协议已经很难满足Web应用日益复杂的需求了.近年来,随着HTML5的诞生,WebSocket协议被提出,它实现了浏览器与服务器的全双工通信,扩展 ...

  5. HTML5 直播协议之 WebSocket 和 MSE

    当前为了满足比较火热的移动 Web 端直播需求, 一系列的 HTML5 直播技术迅速的发展了起来. 常见的可用于 HTML5 的直播技术有 HLS, WebSocket 与 WebRTC. 今天我要向 ...

  6. [转载] 构建微服务:使用API Gateway

    原文: http://mp.weixin.qq.com/s?__biz=MzA5OTAyNzQ2OA==&mid=206889381&idx=1&sn=478ccb35294c ...

  7. WebSocket 浅析

    版权声明:本文由史燕飞原创文章,转载请注明出处: 文章原文链接:https://www.qcloud.com/community/article/241 来源:腾云阁 https://www.qclo ...

  8. ASP.NET Web API上实现 Web Socket

    1. 什么是Web Socket Web Socket是Html5中引入的通信机制,它为浏览器与后台服务器之间提供了基于TCP的全双工的通信通道.用以替代以往的LongPooling等comet st ...

  9. WebSocket 实战

    http://www.ibm.com/developerworks/cn/java/j-lo-WebSocket/ 本文介绍了 HTML5 WebSocket 的由来,运作机制及客户端和服务端的 AP ...

随机推荐

  1. 常见的操作系统及linux发展史

    目前我们常见的操作系统有: 1> 桌面操作系统 Windows 系列 用户群体大 macOS 适合于开发人员 Linux 应用软件少 2> 服务器操作系统 Linux 安全.稳定.免费 占 ...

  2. 构建--> 部署-->

    这一篇中我们会写一些关于自动化部署的代码.我们会使用 Powershell 书写这类代码. 你将发现这篇文章中涉及的东西非常具体,有的要求甚至相当苛刻且可能不具有通用性.这是因为部署从来都是跟环境打交 ...

  3. java的重写

    重写是子类对父类的允许访问的方法的实现过程进行重新编写, 返回值和形参都不能改变.即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为. 也就是说子类能够根据需要实现父类的方法 ...

  4. Django中Model-Form验证

    Django中Model-Form验证 class UserType(models.Model): caption=models.CharField(max_length=32) class User ...

  5. C++的qsort函数

    void qsort(void * base,int nelem,int width,int (*fcmp)(const void*,const void *) 1.待排序数组首地址 2.数组中待排序 ...

  6. 浅谈requireJS 摘自http://www.cnblogs.com/giggle/p/5436710.html

    项目中大都使用模块化开发,requireJS作为AMD模块开发的典范,所以有必要学习下.通过一步步利用requireJS编写demo,从而学习requireJS的一个整体开发流程以及自我使用requi ...

  7. 基于ZYNQ的双核启动与通信问题解决

    1    处理器间的通信 为AMP 设计创建应用之前,您需要考虑应用如何进行通信(如有需要).最简单的方法是使用片上存储器.Zynq SoC 配备256KB 的片上SRAM,可从以下四个源地址进行访问 ...

  8. 配置xml报错:URI is not registered ( Setting | Project Settings | Schemas and DTDs )

    报红提示:URI is not registered ( Setting | Project Settings | Schemas and DTDs ) 解决方法:打开Schemas and DTDs ...

  9. 浅谈HTTP协议与TCP协议

    HTTP协议是Hyper Text Transfer Protocol(超文本传输协议)的缩写,是用于从万维网(WWW:World Wide Web )服务器传输超文本到本地浏览器的传送议. 主要特点 ...

  10. windows下postgreSQL安装与启动

    转:https://www.yiibai.com/postgresql/install-postgresql.html https://blog.csdn.net/irainreally/articl ...