added logs

This commit is contained in:
IrynaMatveieva 2024-11-14 14:44:40 +02:00
parent f75eaf8226
commit 8079ef66ef
7 changed files with 31 additions and 19 deletions

View File

@ -26,6 +26,9 @@ public class CalculatedFieldCtx {
private EntityId entityId; private EntityId entityId;
private CalculatedFieldState state; private CalculatedFieldState state;
public CalculatedFieldCtx() {
}
public CalculatedFieldCtx(CalculatedFieldId calculatedFieldId, EntityId entityId, CalculatedFieldState state) { public CalculatedFieldCtx(CalculatedFieldId calculatedFieldId, EntityId entityId, CalculatedFieldState state) {
this.calculatedFieldId = calculatedFieldId; this.calculatedFieldId = calculatedFieldId;
this.entityId = entityId; this.entityId = entityId;

View File

@ -24,6 +24,7 @@ import java.util.Map;
@Builder @Builder
public class CalculatedFieldState { public class CalculatedFieldState {
// TODO: use value object(TsKv) instead of string
Map<String, String> arguments; Map<String, String> arguments;
String result; String result;

View File

@ -67,7 +67,6 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.Random;
import java.util.UUID; import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
@ -113,7 +112,7 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
Math.max(4, Runtime.getRuntime().availableProcessors()), "calculated-field")); Math.max(4, Runtime.getRuntime().availableProcessors()), "calculated-field"));
calculatedFieldCallbackExecutor = MoreExecutors.listeningDecorator(ThingsBoardExecutors.newWorkStealingPool( calculatedFieldCallbackExecutor = MoreExecutors.listeningDecorator(ThingsBoardExecutors.newWorkStealingPool(
Math.max(4, Runtime.getRuntime().availableProcessors()), "calculated-field-callback")); Math.max(4, Runtime.getRuntime().availableProcessors()), "calculated-field-callback"));
scheduledExecutor.scheduleWithFixedDelay(this::fetchCalculatedFields, new Random().nextInt(defaultCalculatedFieldCheckIntervalInSec), defaultCalculatedFieldCheckIntervalInSec, TimeUnit.SECONDS); scheduledExecutor.scheduleWithFixedDelay(this::fetchCalculatedFields, 0, defaultCalculatedFieldCheckIntervalInSec, TimeUnit.SECONDS);
} }
@PreDestroy @PreDestroy
@ -136,11 +135,15 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
try { try {
TenantId tenantId = TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB())); TenantId tenantId = TenantId.fromUUID(new UUID(proto.getTenantIdMSB(), proto.getTenantIdLSB()));
CalculatedFieldId calculatedFieldId = new CalculatedFieldId(new UUID(proto.getCalculatedFieldIdMSB(), proto.getCalculatedFieldIdLSB())); CalculatedFieldId calculatedFieldId = new CalculatedFieldId(new UUID(proto.getCalculatedFieldIdMSB(), proto.getCalculatedFieldIdLSB()));
log.info("Received CalculatedFieldMsgProto for processing: tenantId=[{}], calculatedFieldId=[{}]", tenantId, calculatedFieldId);
if (proto.getDeleted()) { if (proto.getDeleted()) {
log.warn("Executing onCalculatedFieldDelete, calculatedFieldId=[{}]", calculatedFieldId);
onCalculatedFieldDelete(calculatedFieldId, callback); onCalculatedFieldDelete(calculatedFieldId, callback);
callback.onSuccess(); callback.onSuccess();
} }
if (proto.getUpdated()) { if (proto.getUpdated()) {
log.info("Executing onCalculatedFieldUpdate, calculatedFieldId=[{}]", calculatedFieldId);
//TODO: improve the check. Maybe it was renamed or just the name of the result changed.
onCalculatedFieldDelete(calculatedFieldId, callback); onCalculatedFieldDelete(calculatedFieldId, callback);
} }
CalculatedField cf = calculatedFieldService.findById(tenantId, calculatedFieldId); CalculatedField cf = calculatedFieldService.findById(tenantId, calculatedFieldId);
@ -150,13 +153,18 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
calculatedFields.put(calculatedFieldId, cf); calculatedFields.put(calculatedFieldId, cf);
calculatedFieldLinks.put(calculatedFieldId, links); calculatedFieldLinks.put(calculatedFieldId, links);
switch (entityId.getEntityType()) { switch (entityId.getEntityType()) {
case ASSET, DEVICE -> initializeStateForEntity(tenantId, cf, entityId, callback); case ASSET, DEVICE -> {
log.info("Initializing state for entity: tenantId=[{}], entityId=[{}]", tenantId, entityId);
initializeStateForEntity(tenantId, cf, entityId, callback);
}
case ASSET_PROFILE -> { case ASSET_PROFILE -> {
log.info("Initializing state for all assets in profile: tenantId=[{}], assetProfileId=[{}]", tenantId, entityId);
PageDataIterable<AssetId> assetIds = new PageDataIterable<>(pageLink -> PageDataIterable<AssetId> assetIds = new PageDataIterable<>(pageLink ->
assetService.findAssetIdsByTenantIdAndAssetProfileId(tenantId, (AssetProfileId) entityId, pageLink), initFetchPackSize); assetService.findAssetIdsByTenantIdAndAssetProfileId(tenantId, (AssetProfileId) entityId, pageLink), initFetchPackSize);
assetIds.forEach(assetId -> initializeStateForEntity(tenantId, cf, assetId, callback)); assetIds.forEach(assetId -> initializeStateForEntity(tenantId, cf, assetId, callback));
} }
case DEVICE_PROFILE -> { case DEVICE_PROFILE -> {
log.info("Initializing state for all devices in profile: tenantId=[{}], deviceProfileId=[{}]", tenantId, entityId);
PageDataIterable<DeviceId> deviceIds = new PageDataIterable<>(pageLink -> PageDataIterable<DeviceId> deviceIds = new PageDataIterable<>(pageLink ->
deviceService.findDeviceIdsByTenantIdAndDeviceProfileId(tenantId, (DeviceProfileId) entityId, pageLink), initFetchPackSize); deviceService.findDeviceIdsByTenantIdAndDeviceProfileId(tenantId, (DeviceProfileId) entityId, pageLink), initFetchPackSize);
deviceIds.forEach(deviceId -> initializeStateForEntity(tenantId, cf, deviceId, callback)); deviceIds.forEach(deviceId -> initializeStateForEntity(tenantId, cf, deviceId, callback));
@ -164,12 +172,14 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
default -> default ->
throw new IllegalArgumentException("Entity type '" + calculatedFieldId.getEntityType() + "' does not support calculated fields."); throw new IllegalArgumentException("Entity type '" + calculatedFieldId.getEntityType() + "' does not support calculated fields.");
} }
log.info("Successfully processed calculated field message for calculatedFieldId: [{}]", calculatedFieldId);
} else { } else {
//Calculated field or entity was probably deleted while message was in queue; //Calculated field was probably deleted while message was in queue;
log.warn("Calculated field not found, possibly deleted: {}", calculatedFieldId);
callback.onSuccess(); callback.onSuccess();
} }
} catch (Exception e) { } catch (Exception e) {
log.trace("Failed to process calculated field add msg: [{}]", proto, e); log.trace("Failed to process calculated field msg: [{}]", proto, e);
callback.onFailure(e); callback.onFailure(e);
} }
} }
@ -210,7 +220,6 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
} }
} }
private void onCalculatedFieldDelete(CalculatedFieldId calculatedFieldId, TbCallback callback) { private void onCalculatedFieldDelete(CalculatedFieldId calculatedFieldId, TbCallback callback) {
try { try {
calculatedFieldLinks.remove(calculatedFieldId); calculatedFieldLinks.remove(calculatedFieldId);
@ -221,7 +230,7 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
.collect(Collectors.toList()); .collect(Collectors.toList());
rocksDBService.deleteAll(statesToRemove); rocksDBService.deleteAll(statesToRemove);
} catch (Exception e) { } catch (Exception e) {
log.trace("Failed to delete calculated field.", e); log.trace("Failed to delete calculated field: [{}]", calculatedFieldId, e);
callback.onFailure(e); callback.onFailure(e);
} }
} }
@ -231,7 +240,7 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
cfs.forEach(cf -> calculatedFields.putIfAbsent(cf.getId(), cf)); cfs.forEach(cf -> calculatedFields.putIfAbsent(cf.getId(), cf));
PageDataIterable<CalculatedFieldLink> cfls = new PageDataIterable<>(calculatedFieldService::findAllCalculatedFieldLinks, initFetchPackSize); PageDataIterable<CalculatedFieldLink> cfls = new PageDataIterable<>(calculatedFieldService::findAllCalculatedFieldLinks, initFetchPackSize);
cfls.forEach(link -> calculatedFieldLinks.computeIfAbsent(link.getCalculatedFieldId(), id -> new ArrayList<>()).add(link)); cfls.forEach(link -> calculatedFieldLinks.computeIfAbsent(link.getCalculatedFieldId(), id -> new ArrayList<>()).add(link));
rocksDBService.getAll().forEach((ctxId, ctx) -> states.put(ctxId, JacksonUtil.convertValue(ctx, CalculatedFieldCtx.class))); rocksDBService.getAll().forEach((ctxId, ctx) -> states.put(ctxId, JacksonUtil.fromString(ctx, CalculatedFieldCtx.class)));
states.keySet().removeIf(ctxId -> calculatedFields.keySet().stream().noneMatch(id -> ctxId.startsWith(id.toString()))); states.keySet().removeIf(ctxId -> calculatedFields.keySet().stream().noneMatch(id -> ctxId.startsWith(id.toString())));
} }
@ -276,7 +285,7 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
@Override @Override
public void onFailure(Throwable t) { public void onFailure(Throwable t) {
log.warn("Failed to fetch data for type: {}", argument.getType(), t); log.warn("Failed to initialize state for entity: [{}]", entityId, t);
callback.onFailure(t); callback.onFailure(t);
} }
}, calculatedFieldCallbackExecutor)); }, calculatedFieldCallbackExecutor));
@ -327,7 +336,7 @@ public class DefaultTbCalculatedFieldService extends AbstractTbEntityService imp
} }
calculatedFieldCtx.setState(state); calculatedFieldCtx.setState(state);
states.put(ctxId, calculatedFieldCtx); states.put(ctxId, calculatedFieldCtx);
rocksDBService.put(ctxId, Objects.requireNonNull(JacksonUtil.toString(calculatedFieldCtx))); rocksDBService.put(ctxId, Objects.requireNonNull(JacksonUtil.writeValueAsString(calculatedFieldCtx)));
} }
private String performCalculation(Map<String, String> argumentValues, CalculatedFieldConfiguration calculatedFieldConfiguration) { private String performCalculation(Map<String, String> argumentValues, CalculatedFieldConfiguration calculatedFieldConfiguration) {

View File

@ -41,7 +41,6 @@ public interface CalculatedFieldConfiguration {
Map<String, BaseCalculatedFieldConfiguration.Argument> getArguments(); Map<String, BaseCalculatedFieldConfiguration.Argument> getArguments();
@JsonIgnore
BaseCalculatedFieldConfiguration.Output getOutput(); BaseCalculatedFieldConfiguration.Output getOutput();
@JsonIgnore @JsonIgnore

View File

@ -56,7 +56,7 @@ public class CalculatedFieldEntity extends BaseSqlEntity<CalculatedField> implem
private UUID tenantId; private UUID tenantId;
@Column(name = CALCULATED_FIELD_ENTITY_TYPE) @Column(name = CALCULATED_FIELD_ENTITY_TYPE)
private EntityType entityType; private String entityType;
@Column(name = CALCULATED_FIELD_ENTITY_ID) @Column(name = CALCULATED_FIELD_ENTITY_ID)
private UUID entityId; private UUID entityId;
@ -88,12 +88,12 @@ public class CalculatedFieldEntity extends BaseSqlEntity<CalculatedField> implem
this.setUuid(calculatedField.getUuidId()); this.setUuid(calculatedField.getUuidId());
this.createdTime = calculatedField.getCreatedTime(); this.createdTime = calculatedField.getCreatedTime();
this.tenantId = calculatedField.getTenantId().getId(); this.tenantId = calculatedField.getTenantId().getId();
this.entityType = calculatedField.getEntityId().getEntityType(); this.entityType = calculatedField.getEntityId().getEntityType().name();
this.entityId = calculatedField.getEntityId().getId(); this.entityId = calculatedField.getEntityId().getId();
this.type = calculatedField.getType(); this.type = calculatedField.getType();
this.name = calculatedField.getName(); this.name = calculatedField.getName();
this.configurationVersion = calculatedField.getConfigurationVersion(); this.configurationVersion = calculatedField.getConfigurationVersion();
this.configuration = calculatedField.getConfiguration().calculatedFieldConfigToJson(entityType, entityId); this.configuration = calculatedField.getConfiguration().calculatedFieldConfigToJson(EntityType.valueOf(entityType), entityId);
this.version = calculatedField.getVersion(); this.version = calculatedField.getVersion();
if (calculatedField.getExternalId() != null) { if (calculatedField.getExternalId() != null) {
this.externalId = calculatedField.getExternalId().getId(); this.externalId = calculatedField.getExternalId().getId();
@ -109,7 +109,7 @@ public class CalculatedFieldEntity extends BaseSqlEntity<CalculatedField> implem
calculatedField.setType(type); calculatedField.setType(type);
calculatedField.setName(name); calculatedField.setName(name);
calculatedField.setConfigurationVersion(configurationVersion); calculatedField.setConfigurationVersion(configurationVersion);
calculatedField.setConfiguration(readCalculatedFieldConfiguration(configuration, entityType, entityId)); calculatedField.setConfiguration(readCalculatedFieldConfiguration(configuration, EntityType.valueOf(entityType), entityId));
calculatedField.setVersion(version); calculatedField.setVersion(version);
if (externalId != null) { if (externalId != null) {
calculatedField.setExternalId(new CalculatedFieldId(externalId)); calculatedField.setExternalId(new CalculatedFieldId(externalId));

View File

@ -53,7 +53,7 @@ public class CalculatedFieldLinkEntity extends BaseSqlEntity<CalculatedFieldLink
private UUID tenantId; private UUID tenantId;
@Column(name = CALCULATED_FIELD_LINK_ENTITY_TYPE) @Column(name = CALCULATED_FIELD_LINK_ENTITY_TYPE)
private EntityType entityType; private String entityType;
@Column(name = CALCULATED_FIELD_LINK_ENTITY_ID) @Column(name = CALCULATED_FIELD_LINK_ENTITY_ID)
private UUID entityId; private UUID entityId;
@ -73,7 +73,7 @@ public class CalculatedFieldLinkEntity extends BaseSqlEntity<CalculatedFieldLink
this.setUuid(calculatedFieldLink.getUuidId()); this.setUuid(calculatedFieldLink.getUuidId());
this.createdTime = calculatedFieldLink.getCreatedTime(); this.createdTime = calculatedFieldLink.getCreatedTime();
this.tenantId = calculatedFieldLink.getTenantId().getId(); this.tenantId = calculatedFieldLink.getTenantId().getId();
this.entityType = calculatedFieldLink.getEntityId().getEntityType(); this.entityType = calculatedFieldLink.getEntityId().getEntityType().name();
this.entityId = calculatedFieldLink.getEntityId().getId(); this.entityId = calculatedFieldLink.getEntityId().getId();
this.calculatedFieldId = calculatedFieldLink.getCalculatedFieldId().getId(); this.calculatedFieldId = calculatedFieldLink.getCalculatedFieldId().getId();
this.configuration = JacksonUtil.valueToTree(calculatedFieldLink.getConfiguration()); this.configuration = JacksonUtil.valueToTree(calculatedFieldLink.getConfiguration());

View File

@ -76,7 +76,7 @@ public class DefaultNativeCalculatedFieldRepository implements NativeCalculatedF
String type = (String) row.get("type"); String type = (String) row.get("type");
String name = (String) row.get("name"); String name = (String) row.get("name");
int configurationVersion = (int) row.get("configuration_version"); int configurationVersion = (int) row.get("configuration_version");
JsonNode configuration = JacksonUtil.valueToTree(row.get("configuration")); JsonNode configuration = JacksonUtil.toJsonNode((String) row.get("configuration"));
long version = (long) row.get("version"); long version = (long) row.get("version");
Object externalIdObj = row.get("external_id"); Object externalIdObj = row.get("external_id");
@ -117,7 +117,7 @@ public class DefaultNativeCalculatedFieldRepository implements NativeCalculatedF
EntityType entityType = EntityType.valueOf((String) row.get("entity_type")); EntityType entityType = EntityType.valueOf((String) row.get("entity_type"));
UUID entityId = (UUID) row.get("entity_id"); UUID entityId = (UUID) row.get("entity_id");
UUID calculatedFieldId = (UUID) row.get("calculated_field_id"); UUID calculatedFieldId = (UUID) row.get("calculated_field_id");
JsonNode configuration = JacksonUtil.valueToTree(row.get("configuration")); JsonNode configuration = JacksonUtil.toJsonNode((String) row.get("configuration"));
CalculatedFieldLink calculatedFieldLink = new CalculatedFieldLink(); CalculatedFieldLink calculatedFieldLink = new CalculatedFieldLink();
calculatedFieldLink.setId(new CalculatedFieldLinkId(id)); calculatedFieldLink.setId(new CalculatedFieldLinkId(id));