26 changed files with 752 additions and 1422 deletions
File diff suppressed because it is too large
@ -0,0 +1,24 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2023 The Thingsboard Authors |
||||
|
* |
||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
* you may not use this file except in compliance with the License. |
||||
|
* You may obtain a copy of the License at |
||||
|
* |
||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
* |
||||
|
* Unless required by applicable law or agreed to in writing, software |
||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
* See the License for the specific language governing permissions and |
||||
|
* limitations under the License. |
||||
|
*/ |
||||
|
package org.thingsboard.server.common.data; |
||||
|
|
||||
|
public interface FstStatsService { |
||||
|
|
||||
|
void incrementEncode(Class<?> clazz); |
||||
|
|
||||
|
void incrementDecode(Class<?> clazz); |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,42 @@ |
|||||
|
/** |
||||
|
* Copyright © 2016-2023 The Thingsboard Authors |
||||
|
* |
||||
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
||||
|
* you may not use this file except in compliance with the License. |
||||
|
* You may obtain a copy of the License at |
||||
|
* |
||||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
* |
||||
|
* Unless required by applicable law or agreed to in writing, software |
||||
|
* distributed under the License is distributed on an "AS IS" BASIS, |
||||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
||||
|
* See the License for the specific language governing permissions and |
||||
|
* limitations under the License. |
||||
|
*/ |
||||
|
package org.thingsboard.server.common.stats; |
||||
|
|
||||
|
import org.springframework.beans.factory.annotation.Autowired; |
||||
|
import org.springframework.stereotype.Service; |
||||
|
import org.thingsboard.server.common.data.FstStatsService; |
||||
|
|
||||
|
import java.util.concurrent.ConcurrentHashMap; |
||||
|
|
||||
|
@Service |
||||
|
public class FstStatsServiceImpl implements FstStatsService { |
||||
|
private final ConcurrentHashMap<String, StatsCounter> encodeCounters = new ConcurrentHashMap<>(); |
||||
|
private final ConcurrentHashMap<String, StatsCounter> decodeCounters = new ConcurrentHashMap<>(); |
||||
|
|
||||
|
@Autowired |
||||
|
private StatsFactory statsFactory; |
||||
|
|
||||
|
@Override |
||||
|
public void incrementEncode(Class<?> clazz) { |
||||
|
encodeCounters.computeIfAbsent(clazz.getSimpleName(), key -> statsFactory.createStatsCounter("fstEncode", key)).increment(); |
||||
|
} |
||||
|
|
||||
|
@Override |
||||
|
public void incrementDecode(Class<?> clazz) { |
||||
|
decodeCounters.computeIfAbsent(clazz.getSimpleName(), key -> statsFactory.createStatsCounter("fstDecode", key)).increment(); |
||||
|
} |
||||
|
|
||||
|
} |
||||
@ -0,0 +1,436 @@ |
|||||
|
{ |
||||
|
"ruleChain": { |
||||
|
"additionalInfo": null, |
||||
|
"name": "Root Rule Chain", |
||||
|
"type": "CORE", |
||||
|
"firstRuleNodeId": null, |
||||
|
"root": false, |
||||
|
"debugMode": false, |
||||
|
"configuration": null, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
"metadata": { |
||||
|
"firstNodeIndex": 12, |
||||
|
"nodes": [ |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"description": null, |
||||
|
"layoutX": 1202, |
||||
|
"layoutY": 221 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode", |
||||
|
"name": "Save Timeseries", |
||||
|
"debugMode": true, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"defaultTTL": 0 |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"layoutX": 1000, |
||||
|
"layoutY": 167 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.telemetry.TbMsgAttributesNode", |
||||
|
"name": "Save Attributes", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 1, |
||||
|
"configuration": { |
||||
|
"scope": "CLIENT_SCOPE", |
||||
|
"notifyDevice": false, |
||||
|
"sendAttributesUpdatedNotification": false, |
||||
|
"updateAttributesOnlyOnValueChange": false |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"layoutX": 566, |
||||
|
"layoutY": 302 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.filter.TbMsgTypeSwitchNode", |
||||
|
"name": "Message Type Switch", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"version": 0 |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"layoutX": 1000, |
||||
|
"layoutY": 381 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.action.TbLogNode", |
||||
|
"name": "Log RPC from Device", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"scriptLang": "TBEL", |
||||
|
"jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);", |
||||
|
"tbelScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);" |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"layoutX": 1000, |
||||
|
"layoutY": 494 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.action.TbLogNode", |
||||
|
"name": "Log Other", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"scriptLang": "TBEL", |
||||
|
"jsScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);", |
||||
|
"tbelScript": "return '\\nIncoming message:\\n' + JSON.stringify(msg) + '\\nIncoming metadata:\\n' + JSON.stringify(metadata);" |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"layoutX": 1000, |
||||
|
"layoutY": 583 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.rpc.TbSendRPCRequestNode", |
||||
|
"name": "RPC Call Request", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"timeoutInSeconds": 60 |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"layoutX": 255, |
||||
|
"layoutY": 301 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.filter.TbOriginatorTypeFilterNode", |
||||
|
"name": "Is Entity Group", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"originatorTypes": [ |
||||
|
"ENTITY_GROUP" |
||||
|
] |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"layoutX": 319, |
||||
|
"layoutY": 109 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.filter.TbMsgTypeFilterNode", |
||||
|
"name": "Post attributes or RPC request", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"messageTypes": [ |
||||
|
"POST_ATTRIBUTES_REQUEST", |
||||
|
"RPC_CALL_FROM_SERVER_TO_DEVICE" |
||||
|
] |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"layoutX": 627, |
||||
|
"layoutY": 108 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.transform.TbDuplicateMsgToGroupNode", |
||||
|
"name": "Duplicate To Group Entities", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"entityGroupId": null, |
||||
|
"entityGroupIsMessageOriginator": true |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"description": "Process incoming messages from devices with the alarm rules defined in the device profile. Dispatch all incoming messages with \"Success\" relation type.", |
||||
|
"layoutX": 45, |
||||
|
"layoutY": 359 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.profile.TbDeviceProfileNode", |
||||
|
"name": "Device Profile Node", |
||||
|
"debugMode": true, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"persistAlarmRulesState": false, |
||||
|
"fetchAlarmRulesStateOnStart": false |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"description": "", |
||||
|
"layoutX": 160, |
||||
|
"layoutY": 631 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.filter.TbJsFilterNode", |
||||
|
"name": "Test JS script", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"scriptLang": "JS", |
||||
|
"jsScript": "var test = {\n a: 'a',\n b: 'b'\n};\nreturn test.a === 'a' && test.b === 'b';", |
||||
|
"tbelScript": "return msg.temperature > 20;" |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"description": "", |
||||
|
"layoutX": 427, |
||||
|
"layoutY": 541 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.filter.TbJsFilterNode", |
||||
|
"name": "Test TBEL script", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"scriptLang": "TBEL", |
||||
|
"jsScript": "return msg.temperature > 20;", |
||||
|
"tbelScript": "var a = \"a\";\nvar b = \"b\";\nreturn a.equals(\"a\") && b.equals(\"b\");" |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"description": "", |
||||
|
"layoutX": 40, |
||||
|
"layoutY": 252 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.transform.TbTransformMsgNode", |
||||
|
"name": "Add arrival timestamp", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"scriptLang": "TBEL", |
||||
|
"jsScript": "return {msg: msg, metadata: metadata, msgType: msgType};", |
||||
|
"tbelScript": "metadata.arrivalTs = Date.now();\nreturn {msg: msg, metadata: metadata, msgType: msgType};" |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"description": "", |
||||
|
"layoutX": 1467, |
||||
|
"layoutY": 267 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.transform.TbTransformMsgNode", |
||||
|
"name": "Calculate additional latencies", |
||||
|
"debugMode": true, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"scriptLang": "TBEL", |
||||
|
"jsScript": "return {msg: msg, metadata: metadata, msgType: msgType};", |
||||
|
"tbelScript": "var arrivalLatency = metadata.arrivalTs - metadata.ts;\nvar processingTime = Date.now() - metadata.arrivalTs;\nmsg = {\n arrivalLatency: arrivalLatency,\n processingTime: processingTime\n};\nreturn {msg: msg, metadata: metadata, msgType: msgType};" |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"description": "", |
||||
|
"layoutX": 1438, |
||||
|
"layoutY": 403 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.transform.TbChangeOriginatorNode", |
||||
|
"name": "To latencies asset", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"originatorSource": "ENTITY", |
||||
|
"entityType": "ASSET", |
||||
|
"entityNamePattern": "[Monitoring] Latencies", |
||||
|
"relationsQuery": { |
||||
|
"direction": "FROM", |
||||
|
"maxLevel": 1, |
||||
|
"filters": [ |
||||
|
{ |
||||
|
"relationType": "Contains", |
||||
|
"entityTypes": [] |
||||
|
} |
||||
|
], |
||||
|
"fetchLastLevelOnly": false |
||||
|
} |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"description": null, |
||||
|
"layoutX": 1458, |
||||
|
"layoutY": 505 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode", |
||||
|
"name": "Save Timeseries", |
||||
|
"debugMode": true, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"defaultTTL": 0 |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"description": "", |
||||
|
"layoutX": 928, |
||||
|
"layoutY": 266 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.filter.TbCheckMessageNode", |
||||
|
"name": "Has testData", |
||||
|
"debugMode": false, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"messageNames": [ |
||||
|
"testData" |
||||
|
], |
||||
|
"metadataNames": [], |
||||
|
"checkAllKeys": true |
||||
|
}, |
||||
|
"externalId": null |
||||
|
}, |
||||
|
{ |
||||
|
"additionalInfo": { |
||||
|
"description": null, |
||||
|
"layoutX": 1203, |
||||
|
"layoutY": 327 |
||||
|
}, |
||||
|
"type": "org.thingsboard.rule.engine.telemetry.TbMsgTimeseriesNode", |
||||
|
"name": "Save Timeseries with TTL", |
||||
|
"debugMode": true, |
||||
|
"singletonMode": false, |
||||
|
"configurationVersion": 0, |
||||
|
"configuration": { |
||||
|
"defaultTTL": 180, |
||||
|
"skipLatestPersistence": null, |
||||
|
"useServerTs": null |
||||
|
}, |
||||
|
"externalId": null |
||||
|
} |
||||
|
], |
||||
|
"connections": [ |
||||
|
{ |
||||
|
"fromIndex": 2, |
||||
|
"toIndex": 1, |
||||
|
"type": "Post attributes" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 2, |
||||
|
"toIndex": 3, |
||||
|
"type": "RPC Request from Device" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 2, |
||||
|
"toIndex": 4, |
||||
|
"type": "Other" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 2, |
||||
|
"toIndex": 5, |
||||
|
"type": "RPC Request to Device" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 2, |
||||
|
"toIndex": 16, |
||||
|
"type": "Post telemetry" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 6, |
||||
|
"toIndex": 2, |
||||
|
"type": "False" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 6, |
||||
|
"toIndex": 7, |
||||
|
"type": "True" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 7, |
||||
|
"toIndex": 2, |
||||
|
"type": "False" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 7, |
||||
|
"toIndex": 8, |
||||
|
"type": "True" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 8, |
||||
|
"toIndex": 2, |
||||
|
"type": "Success" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 9, |
||||
|
"toIndex": 10, |
||||
|
"type": "Success" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 10, |
||||
|
"toIndex": 11, |
||||
|
"type": "True" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 11, |
||||
|
"toIndex": 6, |
||||
|
"type": "True" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 12, |
||||
|
"toIndex": 9, |
||||
|
"type": "Success" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 13, |
||||
|
"toIndex": 14, |
||||
|
"type": "Success" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 14, |
||||
|
"toIndex": 15, |
||||
|
"type": "Success" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 16, |
||||
|
"toIndex": 0, |
||||
|
"type": "False" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 16, |
||||
|
"toIndex": 17, |
||||
|
"type": "True" |
||||
|
}, |
||||
|
{ |
||||
|
"fromIndex": 17, |
||||
|
"toIndex": 13, |
||||
|
"type": "Success" |
||||
|
} |
||||
|
], |
||||
|
"ruleChainConnections": null |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue