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