我目前正在扩展使用 Flask-RESTPlus 创建的现有 REST API,并支持 WebSocket。这个想法是创建一个符合 Web 事物模型的Web 事物(网关)。我的用例中的“事物”是动态添加或删除的。
当前设置允许消费者使用对/thingId/properties/temperature的 HTTP GET 请求从 Thing(例如温度传感器)获取最新值。这些值实际上是从 Kafka 消费的,并临时存储在 Redis 中。
现在我想知道如何扩展此设置并允许消费者不仅轮询最新值,而且使用 WebSockets 订阅事物的属性。我有一个工作解决方案,我为每个属性创建“房间”,但这需要两个单独的服务器和端点的重复。
对于 REST 我有
@app.route('/<thingId>/properties/<propertyId>')
# get latest datapoint
return latestDatapoint
Run Code Online (Sandbox Code Playgroud)
对于 Flask-SocketIO 我有
@socketio.on('join')
def on_join(data):
username = data['username']
room = data['room'] # e.g. /thingId/properties/temperature
join_room(room)
send(username + ' has entered the room.', room=room)
Run Code Online (Sandbox Code Playgroud)
然后我将数据转发到正确的房间,因为它来自 Kafka。在客户端,我需要连接到 WebSocket 服务器并加入房间
socket.on('connection', function(socket){
socket.emit('join', 'some room');
});
Run Code Online (Sandbox Code Playgroud)
此实现有效,但我强烈希望有如下图所示的替代工作流程,其中客户端连接到 REST API 中使用的相同端点,但使用 WebSocket 协议而不是加入房间等。
您是否知道这是否已经存在或是否可行?
我正在尝试使用label_values函数在 Grafana 中设置模板。该文档指定了查询 label_values 的可能性,例如:
label_values(metric, label)
Run Code Online (Sandbox Code Playgroud)
在我的用例中,有两个主要的度量标准组,其名称类似于:
他们每个人都有一个名为'uid'的标签。我希望使用上述查询仅过滤一个仪表板上的“app1”和另一个仪表板上的“app2”的用户 ID。
我试过了
label_values(app1_current_sensor1, uid)
Run Code Online (Sandbox Code Playgroud)
但是,如果由于某种原因 sensor1 有一段时间没有发送数据,即使 sensor2 正在发送数据,我也不会在仪表板上看到更多用户 ID。
是否可以使用正则表达式作为度量变量的输入?这样的事情对我有用:
label_values(metric=~(app1_[^\s]+), uid)
Run Code Online (Sandbox Code Playgroud)
但我不确定这在 Grafana 中是否可行。