Support for bulk delete of events
This commit is contained in:
		
							parent
							
								
									6a4140bd28
								
							
						
					
					
						commit
						3af07efd7f
					
				@ -259,6 +259,8 @@ sql:
 | 
			
		||||
    batch_max_delay: "${SQL_EVENTS_BATCH_MAX_DELAY_MS:100}"
 | 
			
		||||
    stats_print_interval_ms: "${SQL_EVENTS_BATCH_STATS_PRINT_MS:10000}"
 | 
			
		||||
    batch_threads: "${SQL_EVENTS_BATCH_THREADS:3}" # batch thread count have to be a prime number like 3 or 5 to gain perfect hash distribution
 | 
			
		||||
    partition_size: "${SQL_EVENTS_REGULAR_PARTITION_SIZE_HOURS:168}" # Number of hours to partition the events. The current value corresponds to one week.
 | 
			
		||||
    debug_partition_size: "${SQL_EVENTS_REGULAR_PARTITION_SIZE_HOURS:1}" # Number of hours to partition the debug events. The current value corresponds to one hour.
 | 
			
		||||
  edge_events:
 | 
			
		||||
    batch_size: "${SQL_EDGE_EVENTS_BATCH_SIZE:1000}"
 | 
			
		||||
    batch_max_delay: "${SQL_EDGE_EVENTS_BATCH_MAX_DELAY_MS:100}"
 | 
			
		||||
@ -285,8 +287,10 @@ sql:
 | 
			
		||||
    events:
 | 
			
		||||
      enabled: "${SQL_TTL_EVENTS_ENABLED:true}"
 | 
			
		||||
      execution_interval_ms: "${SQL_TTL_EVENTS_EXECUTION_INTERVAL:3600000}" # Number of milliseconds (max random initial delay and fixed period).
 | 
			
		||||
      events_ttl: "${SQL_TTL_EVENTS_EVENTS_TTL:0}" # Number of seconds
 | 
			
		||||
      debug_events_ttl: "${SQL_TTL_EVENTS_DEBUG_EVENTS_TTL:604800}" # Number of seconds. The current value corresponds to one week
 | 
			
		||||
      # Number of seconds. TTL is disabled by default. Accuracy of the cleanup depends on the sql.events.partition_size parameter.
 | 
			
		||||
      events_ttl: "${SQL_TTL_EVENTS_EVENTS_TTL:0}"
 | 
			
		||||
      # Number of seconds. The current value corresponds to one week. Accuracy of the cleanup depends on the sql.events.debug_partition_size parameter.
 | 
			
		||||
      debug_events_ttl: "${SQL_TTL_EVENTS_DEBUG_EVENTS_TTL:604800}"
 | 
			
		||||
    edge_events:
 | 
			
		||||
      enabled: "${SQL_TTL_EDGE_EVENTS_ENABLED:true}"
 | 
			
		||||
      execution_interval_ms: "${SQL_TTL_EDGE_EVENTS_EXECUTION_INTERVAL:86400000}" # Number of milliseconds. The current value corresponds to one day
 | 
			
		||||
 | 
			
		||||
@ -27,9 +27,13 @@ public class StatisticsEventFilter implements EventFilter {
 | 
			
		||||
    @ApiModelProperty(position = 1, value = "String value representing the server name, identifier or ip address where the platform is running", example = "ip-172-31-24-152")
 | 
			
		||||
    protected String server;
 | 
			
		||||
    @ApiModelProperty(position = 2, value = "The minimum number of successfully processed messages", example = "25")
 | 
			
		||||
    protected Integer messagesProcessed;
 | 
			
		||||
    @ApiModelProperty(position = 3, value = "The minimum number of errors occurred during messages processing", example = "30")
 | 
			
		||||
    protected Integer errorsOccurred;
 | 
			
		||||
    protected Integer minMessagesProcessed;
 | 
			
		||||
    @ApiModelProperty(position = 3, value = "The maximum number of successfully processed messages", example = "250")
 | 
			
		||||
    protected Integer maxMessagesProcessed;
 | 
			
		||||
    @ApiModelProperty(position = 4, value = "The minimum number of errors occurred during messages processing", example = "30")
 | 
			
		||||
    protected Integer minErrorsOccurred;
 | 
			
		||||
    @ApiModelProperty(position = 5, value = "The maximum number of errors occurred during messages processing", example = "300")
 | 
			
		||||
    protected Integer maxErrorsOccurred;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public EventType getEventType() {
 | 
			
		||||
@ -38,6 +42,8 @@ public class StatisticsEventFilter implements EventFilter {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public boolean isNotEmpty() {
 | 
			
		||||
        return !StringUtils.isEmpty(server) || (messagesProcessed != null && messagesProcessed > 0) || (errorsOccurred != null && errorsOccurred > 0);
 | 
			
		||||
        return !StringUtils.isEmpty(server)
 | 
			
		||||
                || (minMessagesProcessed != null && minMessagesProcessed > 0) || (minErrorsOccurred != null && minErrorsOccurred > 0)
 | 
			
		||||
                || (maxMessagesProcessed != null && maxMessagesProcessed > 0) || (maxErrorsOccurred != null && maxErrorsOccurred > 0);
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -117,19 +117,11 @@ public class BaseEventService implements EventService {
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void removeEvents(TenantId tenantId, EntityId entityId, EventFilter eventFilter, Long startTime, Long endTime) {
 | 
			
		||||
//        TimePageLink eventsPageLink = new TimePageLink(1000, 0, null, null, startTime, endTime);
 | 
			
		||||
//        PageData<EventInfo> eventsPageData;
 | 
			
		||||
//        do {
 | 
			
		||||
//            if (eventFilter == null) {
 | 
			
		||||
//                eventsPageData = findEvents(tenantId, entityId, eventsPageLink);
 | 
			
		||||
//            } else {
 | 
			
		||||
//                eventsPageData = findEventsByFilter(tenantId, entityId, eventFilter, eventsPageLink);
 | 
			
		||||
//            }
 | 
			
		||||
//
 | 
			
		||||
//            eventDao.removeAllByIds(eventsPageData.getData().stream()
 | 
			
		||||
//                    .map(IdBased::getUuidId)
 | 
			
		||||
//                    .collect(Collectors.toList()));
 | 
			
		||||
//        } while (eventsPageData.hasNext());
 | 
			
		||||
        if (eventFilter == null) {
 | 
			
		||||
            eventDao.removeEvents(tenantId.getId(), entityId.getId(), startTime, endTime);
 | 
			
		||||
        } else {
 | 
			
		||||
            eventDao.removeEvents(tenantId.getId(), entityId.getId(), eventFilter, startTime, endTime);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
 | 
			
		||||
@ -21,6 +21,7 @@ import org.thingsboard.server.common.data.event.Event;
 | 
			
		||||
import org.thingsboard.server.common.data.event.EventFilter;
 | 
			
		||||
import org.thingsboard.server.common.data.event.EventType;
 | 
			
		||||
import org.thingsboard.server.common.data.id.EntityId;
 | 
			
		||||
import org.thingsboard.server.common.data.id.TenantId;
 | 
			
		||||
import org.thingsboard.server.common.data.page.PageData;
 | 
			
		||||
import org.thingsboard.server.common.data.page.TimePageLink;
 | 
			
		||||
import org.thingsboard.server.dao.Dao;
 | 
			
		||||
@ -71,4 +72,26 @@ public interface EventDao {
 | 
			
		||||
     * @param debugEventExpTs the expiration time of the debug events
 | 
			
		||||
     */
 | 
			
		||||
    void cleanupEvents(long regularEventExpTs, long debugEventExpTs);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     * Removes all events for the specified entity and time interval
 | 
			
		||||
     *
 | 
			
		||||
     * @param tenantId
 | 
			
		||||
     * @param entityId
 | 
			
		||||
     * @param startTime
 | 
			
		||||
     * @param endTime
 | 
			
		||||
     */
 | 
			
		||||
    void removeEvents(UUID tenantId, UUID entityId, Long startTime, Long endTime);
 | 
			
		||||
 | 
			
		||||
    /**
 | 
			
		||||
     *
 | 
			
		||||
     * Removes all events for the specified entity, event filter and time interval
 | 
			
		||||
     *
 | 
			
		||||
     * @param tenantId
 | 
			
		||||
     * @param entityId
 | 
			
		||||
     * @param eventFilter
 | 
			
		||||
     * @param startTime
 | 
			
		||||
     * @param endTime
 | 
			
		||||
     */
 | 
			
		||||
    void removeEvents(UUID tenantId, UUID entityId, EventFilter eventFilter, Long startTime, Long endTime);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -18,8 +18,10 @@ package org.thingsboard.server.dao.sql.event;
 | 
			
		||||
import org.springframework.data.domain.Page;
 | 
			
		||||
import org.springframework.data.domain.Pageable;
 | 
			
		||||
import org.springframework.data.jpa.repository.JpaRepository;
 | 
			
		||||
import org.springframework.data.jpa.repository.Modifying;
 | 
			
		||||
import org.springframework.data.jpa.repository.Query;
 | 
			
		||||
import org.springframework.data.repository.query.Param;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
import org.thingsboard.server.common.data.event.ErrorEvent;
 | 
			
		||||
import org.thingsboard.server.common.data.event.LifecycleEvent;
 | 
			
		||||
import org.thingsboard.server.dao.model.sql.ErrorEventEntity;
 | 
			
		||||
@ -77,4 +79,36 @@ public interface ErrorEventRepository extends EventRepository<ErrorEventEntity,
 | 
			
		||||
                                      @Param("error") String error,
 | 
			
		||||
                                      Pageable pageable);
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
    @Query("DELETE FROM ErrorEventEntity e WHERE " +
 | 
			
		||||
            "e.tenantId = :tenantId " +
 | 
			
		||||
            "AND e.entityId = :entityId " +
 | 
			
		||||
            "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
            "AND (:endTime IS NULL OR e.ts <= :endTime)"
 | 
			
		||||
    )
 | 
			
		||||
    void removeEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                      @Param("entityId") UUID entityId,
 | 
			
		||||
                      @Param("startTime") Long startTime,
 | 
			
		||||
                      @Param("endTime") Long endTime);
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
    @Query(nativeQuery = true,
 | 
			
		||||
            value = "DELETE FROM error_event e WHERE " +
 | 
			
		||||
                    "e.tenant_id = :tenantId " +
 | 
			
		||||
                    "AND e.entity_id = :entityId " +
 | 
			
		||||
                    "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
                    "AND (:endTime IS NULL OR e.ts <= :endTime) " +
 | 
			
		||||
                    "AND (:serviceId IS NULL OR e.service_id ILIKE concat('%', :serviceId, '%')) " +
 | 
			
		||||
                    "AND (:method IS NULL OR e.e_method ILIKE concat('%', :method, '%')) " +
 | 
			
		||||
                    "AND (:error IS NULL OR e.e_error ILIKE concat('%', :error, '%'))"
 | 
			
		||||
    )
 | 
			
		||||
    void removeEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                      @Param("entityId") UUID entityId,
 | 
			
		||||
                      @Param("startTime") Long startTime,
 | 
			
		||||
                      @Param("endTime") Long endTime,
 | 
			
		||||
                      @Param("serviceId") String server,
 | 
			
		||||
                      @Param("method") String method,
 | 
			
		||||
                      @Param("error") String error);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -0,0 +1,45 @@
 | 
			
		||||
/**
 | 
			
		||||
 * Copyright © 2016-2022 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.dao.sql.event;
 | 
			
		||||
 | 
			
		||||
import org.springframework.beans.factory.annotation.Value;
 | 
			
		||||
import org.springframework.stereotype.Component;
 | 
			
		||||
import org.thingsboard.server.common.data.event.EventType;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.PostConstruct;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
 | 
			
		||||
@Component
 | 
			
		||||
public class EventPartitionConfiguration {
 | 
			
		||||
 | 
			
		||||
    @Value("${sql.events.partition_size:168}")
 | 
			
		||||
    private int regularPartitionSizeInHours;
 | 
			
		||||
    @Value("${sql.events.debug_partition_size:1}")
 | 
			
		||||
    private int debugPartitionSizeInHours;
 | 
			
		||||
 | 
			
		||||
    private long regularPartitionSizeInMs;
 | 
			
		||||
    private long debugPartitionSizeInMs;
 | 
			
		||||
 | 
			
		||||
    @PostConstruct
 | 
			
		||||
    public void init() {
 | 
			
		||||
        regularPartitionSizeInMs = TimeUnit.HOURS.toMillis(regularPartitionSizeInHours);
 | 
			
		||||
        debugPartitionSizeInMs = TimeUnit.HOURS.toMillis(debugPartitionSizeInHours);
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public long getPartitionSizeInMs(EventType eventType) {
 | 
			
		||||
        return eventType.isDebug() ? debugPartitionSizeInMs : regularPartitionSizeInMs;
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
@ -28,137 +28,12 @@ import org.thingsboard.server.dao.model.sql.EventEntity;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Created by Valerii Sosliuk on 5/3/2017.
 | 
			
		||||
 */
 | 
			
		||||
public interface EventRepository<T extends EventEntity<V>, V extends Event> {
 | 
			
		||||
 | 
			
		||||
    List<T> findLatestEvents(UUID tenantId, UUID entityId, int limit);
 | 
			
		||||
 | 
			
		||||
    Page<T> findEvents(UUID tenantId, UUID entityId, Long startTime, Long endTime, Pageable pageable);
 | 
			
		||||
 | 
			
		||||
//
 | 
			
		||||
//    @Query(nativeQuery = true,
 | 
			
		||||
//            value = "SELECT e.id, e.created_time, e.body, e.entity_id, e.entity_type, e.event_type, e.event_uid, e.tenant_id, ts  FROM " +
 | 
			
		||||
//                    "(SELECT *, e.body\\:\\:jsonb as json_body FROM event e WHERE " +
 | 
			
		||||
//                    "e.tenant_id = :tenantId " +
 | 
			
		||||
//                    "AND e.entity_type = :entityType " +
 | 
			
		||||
//                    "AND e.entity_id = :entityId " +
 | 
			
		||||
//                    "AND e.event_type = :eventType " +
 | 
			
		||||
//                    "AND e.created_time >= :startTime AND (:endTime = 0 OR e.created_time <= :endTime) " +
 | 
			
		||||
//                    ") AS e WHERE " +
 | 
			
		||||
//                    "(:type IS NULL OR lower(json_body->>'type') LIKE concat('%', lower(:type\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:server IS NULL OR lower(json_body->>'server') LIKE concat('%', lower(:server\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:entityName IS NULL OR lower(json_body->>'entityName') LIKE concat('%', lower(:entityName\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:relationType IS NULL OR lower(json_body->>'relationType') LIKE concat('%', lower(:relationType\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:bodyEntityId IS NULL OR lower(json_body->>'entityId') LIKE concat('%', lower(:bodyEntityId\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:msgType IS NULL OR lower(json_body->>'msgType') LIKE concat('%', lower(:msgType\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND ((:isError = FALSE) OR (json_body->>'error') IS NOT NULL) " +
 | 
			
		||||
//                    "AND (:error IS NULL OR lower(json_body->>'error') LIKE concat('%', lower(:error\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:data IS NULL OR lower(json_body->>'data') LIKE concat('%', lower(:data\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:metadata IS NULL OR lower(json_body->>'metadata') LIKE concat('%', lower(:metadata\\:\\:varchar), '%')) ",
 | 
			
		||||
//            countQuery = "SELECT count(*) FROM " +
 | 
			
		||||
//                    "(SELECT *, e.body\\:\\:jsonb as json_body FROM event e WHERE " +
 | 
			
		||||
//                    "e.tenant_id = :tenantId " +
 | 
			
		||||
//                    "AND e.entity_type = :entityType " +
 | 
			
		||||
//                    "AND e.entity_id = :entityId " +
 | 
			
		||||
//                    "AND e.event_type = :eventType " +
 | 
			
		||||
//                    "AND e.created_time >= :startTime AND (:endTime = 0 OR e.created_time <= :endTime) " +
 | 
			
		||||
//                    ") AS e WHERE " +
 | 
			
		||||
//                    "(:type IS NULL OR lower(json_body->>'type') LIKE concat('%', lower(:type\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:server IS NULL OR lower(json_body->>'server') LIKE concat('%', lower(:server\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:entityName IS NULL OR lower(json_body->>'entityName') LIKE concat('%', lower(:entityName\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:relationType IS NULL OR lower(json_body->>'relationType') LIKE concat('%', lower(:relationType\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:bodyEntityId IS NULL OR lower(json_body->>'entityId') LIKE concat('%', lower(:bodyEntityId\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:msgType IS NULL OR lower(json_body->>'msgType') LIKE concat('%', lower(:msgType\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND ((:isError = FALSE) OR (json_body->>'error') IS NOT NULL) " +
 | 
			
		||||
//                    "AND (:error IS NULL OR lower(json_body->>'error') LIKE concat('%', lower(:error\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:data IS NULL OR lower(json_body->>'data') LIKE concat('%', lower(:data\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:metadata IS NULL OR lower(json_body->>'metadata') LIKE concat('%', lower(:metadata\\:\\:varchar), '%'))"
 | 
			
		||||
//    )
 | 
			
		||||
//    Page<EventEntity> findDebugRuleNodeEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
//                                              @Param("entityId") UUID entityId,
 | 
			
		||||
//                                              @Param("entityType") String entityType,
 | 
			
		||||
//                                              @Param("eventType") String eventType,
 | 
			
		||||
//                                              @Param("startTime") Long startTime,
 | 
			
		||||
//                                              @Param("endTime") Long endTime,
 | 
			
		||||
//                                              @Param("type") String type,
 | 
			
		||||
//                                              @Param("server") String server,
 | 
			
		||||
//                                              @Param("entityName") String entityName,
 | 
			
		||||
//                                              @Param("relationType") String relationType,
 | 
			
		||||
//                                              @Param("bodyEntityId") String bodyEntityId,
 | 
			
		||||
//                                              @Param("msgType") String msgType,
 | 
			
		||||
//                                              @Param("isError") boolean isError,
 | 
			
		||||
//                                              @Param("error") String error,
 | 
			
		||||
//                                              @Param("data") String data,
 | 
			
		||||
//                                              @Param("metadata") String metadata,
 | 
			
		||||
//                                              Pageable pageable);
 | 
			
		||||
//
 | 
			
		||||
//    @Query(nativeQuery = true,
 | 
			
		||||
//            value = "SELECT e.id, e.created_time, e.body, e.entity_id, e.entity_type, e.event_type, e.event_uid, e.tenant_id, ts  FROM " +
 | 
			
		||||
//                    "(SELECT *, e.body\\:\\:jsonb as json_body FROM event e WHERE " +
 | 
			
		||||
//                    "e.tenant_id = :tenantId " +
 | 
			
		||||
//                    "AND e.entity_type = :entityType " +
 | 
			
		||||
//                    "AND e.entity_id = :entityId " +
 | 
			
		||||
//                    "AND e.event_type = 'ERROR' " +
 | 
			
		||||
//                    "AND e.created_time >= :startTime AND (:endTime = 0 OR e.created_time <= :endTime) " +
 | 
			
		||||
//                    ") AS e WHERE " +
 | 
			
		||||
//                    "(:server IS NULL OR lower(json_body->>'server') LIKE concat('%', lower(:server\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:method IS NULL OR lower(json_body->>'method') LIKE concat('%', lower(:method\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:error IS NULL OR lower(json_body->>'error') LIKE concat('%', lower(:error\\:\\:varchar), '%'))",
 | 
			
		||||
//            countQuery = "SELECT count(*) FROM " +
 | 
			
		||||
//                    "(SELECT *, e.body\\:\\:jsonb as json_body FROM event e WHERE " +
 | 
			
		||||
//                    "e.tenant_id = :tenantId " +
 | 
			
		||||
//                    "AND e.entity_type = :entityType " +
 | 
			
		||||
//                    "AND e.entity_id = :entityId " +
 | 
			
		||||
//                    "AND e.event_type = 'ERROR' " +
 | 
			
		||||
//                    "AND e.created_time >= :startTime AND (:endTime = 0 OR e.created_time <= :endTime) " +
 | 
			
		||||
//                    ") AS e WHERE " +
 | 
			
		||||
//                    "(:server IS NULL OR lower(json_body->>'server') LIKE concat('%', lower(:server\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:method IS NULL OR lower(json_body->>'method') LIKE concat('%', lower(:method\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:error IS NULL OR lower(json_body->>'error') LIKE concat('%', lower(:error\\:\\:varchar), '%'))")
 | 
			
		||||
//    Page<EventEntity> findErrorEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
//                                      @Param("entityId") UUID entityId,
 | 
			
		||||
//                                      @Param("entityType") String entityType,
 | 
			
		||||
//                                      @Param("startTime") Long startTime,
 | 
			
		||||
//                                      @Param("endTime") Long endTIme,
 | 
			
		||||
//                                      @Param("server") String server,
 | 
			
		||||
//                                      @Param("method") String method,
 | 
			
		||||
//                                      @Param("error") String error,
 | 
			
		||||
//                                      Pageable pageable);
 | 
			
		||||
//
 | 
			
		||||
//
 | 
			
		||||
//    @Query(nativeQuery = true,
 | 
			
		||||
//            value = "SELECT e.id, e.created_time, e.body, e.entity_id, e.entity_type, e.event_type, e.event_uid, e.tenant_id, ts  FROM " +
 | 
			
		||||
//                    "(SELECT *, e.body\\:\\:jsonb as json_body FROM event e WHERE " +
 | 
			
		||||
//                    "e.tenant_id = :tenantId " +
 | 
			
		||||
//                    "AND e.entity_type = :entityType " +
 | 
			
		||||
//                    "AND e.entity_id = :entityId " +
 | 
			
		||||
//                    "AND e.event_type = 'STATS' " +
 | 
			
		||||
//                    "AND e.created_time >= :startTime AND (:endTime = 0 OR e.created_time <= :endTime) " +
 | 
			
		||||
//                    ") AS e WHERE " +
 | 
			
		||||
//                    "(:server IS NULL OR lower(e.body\\:\\:json->>'server') LIKE concat('%', lower(:server\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:messagesProcessed = 0 OR (json_body->>'messagesProcessed')\\:\\:integer >= :messagesProcessed) " +
 | 
			
		||||
//                    "AND (:errorsOccurred = 0 OR (json_body->>'errorsOccurred')\\:\\:integer >= :errorsOccurred) ",
 | 
			
		||||
//            countQuery = "SELECT count(*) FROM " +
 | 
			
		||||
//                    "(SELECT *, e.body\\:\\:jsonb as json_body FROM event e WHERE " +
 | 
			
		||||
//                    "e.tenant_id = :tenantId " +
 | 
			
		||||
//                    "AND e.entity_type = :entityType " +
 | 
			
		||||
//                    "AND e.entity_id = :entityId " +
 | 
			
		||||
//                    "AND e.event_type = 'LC_EVENT' " +
 | 
			
		||||
//                    "AND e.created_time >= :startTime AND (:endTime = 0 OR e.created_time <= :endTime) " +
 | 
			
		||||
//                    ") AS e WHERE " +
 | 
			
		||||
//                    "(:server IS NULL OR lower(e.body\\:\\:json->>'server') LIKE concat('%', lower(:server\\:\\:varchar), '%')) " +
 | 
			
		||||
//                    "AND (:messagesProcessed = 0 OR (json_body->>'messagesProcessed')\\:\\:integer >= :messagesProcessed) " +
 | 
			
		||||
//                    "AND (:errorsOccurred = 0 OR (json_body->>'errorsOccurred')\\:\\:integer >= :errorsOccurred) ")
 | 
			
		||||
//    Page<EventEntity> findStatisticsEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
//                                           @Param("entityId") UUID entityId,
 | 
			
		||||
//                                           @Param("entityType") String entityType,
 | 
			
		||||
//                                           @Param("startTime") Long startTime,
 | 
			
		||||
//                                           @Param("endTime") Long endTIme,
 | 
			
		||||
//                                           @Param("server") String server,
 | 
			
		||||
//                                           @Param("messagesProcessed") Integer messagesProcessed,
 | 
			
		||||
//                                           @Param("errorsOccurred") Integer errorsOccurred,
 | 
			
		||||
//                                           Pageable pageable);
 | 
			
		||||
//
 | 
			
		||||
    void removeEvents(UUID tenantId, UUID entityId, Long startTime, Long endTime);
 | 
			
		||||
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -48,13 +48,11 @@ import org.thingsboard.server.dao.timeseries.SqlPartition;
 | 
			
		||||
import javax.annotation.PostConstruct;
 | 
			
		||||
import javax.annotation.PreDestroy;
 | 
			
		||||
import java.util.Comparator;
 | 
			
		||||
import java.util.HashMap;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.Objects;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.concurrent.ConcurrentHashMap;
 | 
			
		||||
import java.util.concurrent.TimeUnit;
 | 
			
		||||
import java.util.concurrent.locks.ReentrantLock;
 | 
			
		||||
import java.util.function.Function;
 | 
			
		||||
 | 
			
		||||
@ -65,12 +63,12 @@ import java.util.function.Function;
 | 
			
		||||
@Component
 | 
			
		||||
public class JpaBaseEventDao implements EventDao {
 | 
			
		||||
 | 
			
		||||
    public static final long REGULAR_PARTITION_DURATION = TimeUnit.DAYS.toMillis(1);
 | 
			
		||||
    public static final long DEBUG_PARTITION_DURATION = TimeUnit.HOURS.toMillis(1);
 | 
			
		||||
 | 
			
		||||
    private final Map<EventType, Map<Long, SqlPartition>> partitionsByEventType = new ConcurrentHashMap<>();
 | 
			
		||||
    private static final ReentrantLock partitionCreationLock = new ReentrantLock();
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private EventPartitionConfiguration partitionConfiguration;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private SqlPartitioningRepository partitioningRepository;
 | 
			
		||||
 | 
			
		||||
@ -170,12 +168,12 @@ public class JpaBaseEventDao implements EventDao {
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void savePartitionIfNotExist(Event event) {
 | 
			
		||||
        var partitionsMap = partitionsByEventType.get(event.getType());
 | 
			
		||||
        var partitionDuration = event.getType().isDebug() ? DEBUG_PARTITION_DURATION : REGULAR_PARTITION_DURATION;
 | 
			
		||||
        EventType type = event.getType();
 | 
			
		||||
        var partitionsMap = partitionsByEventType.get(type);
 | 
			
		||||
        var partitionDuration = partitionConfiguration.getPartitionSizeInMs(type);
 | 
			
		||||
        long partitionStartTs = event.getCreatedTime() - (event.getCreatedTime() % partitionDuration);
 | 
			
		||||
        if (partitionsMap.get(partitionStartTs) == null) {
 | 
			
		||||
            savePartition(partitionsMap, new SqlPartition(event.getType().getTable(), partitionStartTs,
 | 
			
		||||
                    partitionStartTs + partitionDuration, Long.toString(partitionStartTs)));
 | 
			
		||||
            savePartition(partitionsMap, new SqlPartition(type.getTable(), partitionStartTs, partitionStartTs + partitionDuration, Long.toString(partitionStartTs)));
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -228,6 +226,42 @@ public class JpaBaseEventDao implements EventDao {
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void removeEvents(UUID tenantId, UUID entityId, Long startTime, Long endTime) {
 | 
			
		||||
        log.debug("[{}][{}] Remove events [{}-{}] ", tenantId, entityId, startTime, endTime);
 | 
			
		||||
        for (EventType eventType : EventType.values()) {
 | 
			
		||||
            getEventRepository(eventType).removeEvents(tenantId, entityId, startTime, endTime);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public void removeEvents(UUID tenantId, UUID entityId, EventFilter eventFilter, Long startTime, Long endTime) {
 | 
			
		||||
        if (eventFilter.isNotEmpty()) {
 | 
			
		||||
            switch (eventFilter.getEventType()) {
 | 
			
		||||
                case DEBUG_RULE_NODE:
 | 
			
		||||
                    removeEventsByFilter(tenantId, entityId, (RuleNodeDebugEventFilter) eventFilter, startTime, endTime);
 | 
			
		||||
                    break;
 | 
			
		||||
                case DEBUG_RULE_CHAIN:
 | 
			
		||||
                    removeEventsByFilter(tenantId, entityId, (RuleChainDebugEventFilter) eventFilter, startTime, endTime);
 | 
			
		||||
                    break;
 | 
			
		||||
                case LC_EVENT:
 | 
			
		||||
                    removeEventsByFilter(tenantId, entityId, (LifeCycleEventFilter) eventFilter, startTime, endTime);
 | 
			
		||||
                    break;
 | 
			
		||||
                case ERROR:
 | 
			
		||||
                    removeEventsByFilter(tenantId, entityId, (ErrorEventFilter) eventFilter, startTime, endTime);
 | 
			
		||||
                    break;
 | 
			
		||||
                case STATS:
 | 
			
		||||
                    removeEventsByFilter(tenantId, entityId, (StatisticsEventFilter) eventFilter, startTime, endTime);
 | 
			
		||||
                    break;
 | 
			
		||||
                default:
 | 
			
		||||
                    throw new RuntimeException("Not supported event type: " + eventFilter.getEventType());
 | 
			
		||||
            }
 | 
			
		||||
        } else {
 | 
			
		||||
            getEventRepository(eventFilter.getEventType()).removeEvents(tenantId, entityId, startTime, endTime);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    private PageData<? extends Event> findEventByFilter(UUID tenantId, UUID entityId, RuleChainDebugEventFilter eventFilter, TimePageLink pageLink) {
 | 
			
		||||
        return DaoUtil.toPageData(
 | 
			
		||||
                ruleChainDebugEventRepository.findEvents(
 | 
			
		||||
@ -305,12 +339,88 @@ public class JpaBaseEventDao implements EventDao {
 | 
			
		||||
                        pageLink.getStartTime(),
 | 
			
		||||
                        pageLink.getEndTime(),
 | 
			
		||||
                        eventFilter.getServer(),
 | 
			
		||||
                        eventFilter.getMessagesProcessed(),
 | 
			
		||||
                        eventFilter.getErrorsOccurred(),
 | 
			
		||||
                        eventFilter.getMinMessagesProcessed(),
 | 
			
		||||
                        eventFilter.getMaxMessagesProcessed(),
 | 
			
		||||
                        eventFilter.getMinErrorsOccurred(),
 | 
			
		||||
                        eventFilter.getMaxErrorsOccurred(),
 | 
			
		||||
                        DaoUtil.toPageable(pageLink))
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void removeEventsByFilter(UUID tenantId, UUID entityId, RuleChainDebugEventFilter eventFilter, Long startTime, Long endTime) {
 | 
			
		||||
        ruleChainDebugEventRepository.removeEvents(
 | 
			
		||||
                tenantId,
 | 
			
		||||
                entityId,
 | 
			
		||||
                startTime,
 | 
			
		||||
                endTime,
 | 
			
		||||
                eventFilter.getServer(),
 | 
			
		||||
                eventFilter.getMessage(),
 | 
			
		||||
                eventFilter.isError(),
 | 
			
		||||
                eventFilter.getErrorStr());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void removeEventsByFilter(UUID tenantId, UUID entityId, RuleNodeDebugEventFilter eventFilter, Long startTime, Long endTime) {
 | 
			
		||||
        parseUUID(eventFilter.getEntityId(), "Entity Id");
 | 
			
		||||
        parseUUID(eventFilter.getMsgId(), "Message Id");
 | 
			
		||||
        ruleNodeDebugEventRepository.removeEvents(
 | 
			
		||||
                tenantId,
 | 
			
		||||
                entityId,
 | 
			
		||||
                startTime,
 | 
			
		||||
                endTime,
 | 
			
		||||
                eventFilter.getServer(),
 | 
			
		||||
                eventFilter.getMsgDirectionType(),
 | 
			
		||||
                eventFilter.getEntityId(),
 | 
			
		||||
                eventFilter.getEntityType(),
 | 
			
		||||
                eventFilter.getMsgId(),
 | 
			
		||||
                eventFilter.getMsgType(),
 | 
			
		||||
                eventFilter.getRelationType(),
 | 
			
		||||
                eventFilter.getDataSearch(),
 | 
			
		||||
                eventFilter.getMetadataSearch(),
 | 
			
		||||
                eventFilter.isError(),
 | 
			
		||||
                eventFilter.getErrorStr());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void removeEventsByFilter(UUID tenantId, UUID entityId, ErrorEventFilter eventFilter, Long startTime, Long endTime) {
 | 
			
		||||
        errorEventRepository.removeEvents(
 | 
			
		||||
                tenantId,
 | 
			
		||||
                entityId,
 | 
			
		||||
                startTime,
 | 
			
		||||
                endTime,
 | 
			
		||||
                eventFilter.getServer(),
 | 
			
		||||
                eventFilter.getMethod(),
 | 
			
		||||
                eventFilter.getErrorStr());
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void removeEventsByFilter(UUID tenantId, UUID entityId, LifeCycleEventFilter eventFilter, Long startTime, Long endTime) {
 | 
			
		||||
        boolean statusFilterEnabled = !StringUtils.isEmpty(eventFilter.getStatus());
 | 
			
		||||
        boolean statusFilter = statusFilterEnabled && eventFilter.getStatus().equalsIgnoreCase("Success");
 | 
			
		||||
        lcEventRepository.removeEvents(
 | 
			
		||||
                tenantId,
 | 
			
		||||
                entityId,
 | 
			
		||||
                startTime,
 | 
			
		||||
                endTime,
 | 
			
		||||
                eventFilter.getServer(),
 | 
			
		||||
                eventFilter.getEvent(),
 | 
			
		||||
                statusFilterEnabled,
 | 
			
		||||
                statusFilter,
 | 
			
		||||
                eventFilter.getErrorStr());
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void removeEventsByFilter(UUID tenantId, UUID entityId, StatisticsEventFilter eventFilter, Long startTime, Long endTime) {
 | 
			
		||||
        statsEventRepository.removeEvents(
 | 
			
		||||
                tenantId,
 | 
			
		||||
                entityId,
 | 
			
		||||
                startTime,
 | 
			
		||||
                endTime,
 | 
			
		||||
                eventFilter.getServer(),
 | 
			
		||||
                eventFilter.getMinMessagesProcessed(),
 | 
			
		||||
                eventFilter.getMaxMessagesProcessed(),
 | 
			
		||||
                eventFilter.getMinErrorsOccurred(),
 | 
			
		||||
                eventFilter.getMaxErrorsOccurred()
 | 
			
		||||
        );
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
    public List<? extends Event> findLatestEvents(UUID tenantId, UUID entityId, EventType eventType, int limit) {
 | 
			
		||||
        return DaoUtil.convertDataList(getEventRepository(eventType).findLatestEvents(tenantId, entityId, limit));
 | 
			
		||||
 | 
			
		||||
@ -18,8 +18,10 @@ package org.thingsboard.server.dao.sql.event;
 | 
			
		||||
import org.springframework.data.domain.Page;
 | 
			
		||||
import org.springframework.data.domain.Pageable;
 | 
			
		||||
import org.springframework.data.jpa.repository.JpaRepository;
 | 
			
		||||
import org.springframework.data.jpa.repository.Modifying;
 | 
			
		||||
import org.springframework.data.jpa.repository.Query;
 | 
			
		||||
import org.springframework.data.repository.query.Param;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
import org.thingsboard.server.common.data.event.LifecycleEvent;
 | 
			
		||||
import org.thingsboard.server.dao.model.sql.LifecycleEventEntity;
 | 
			
		||||
 | 
			
		||||
@ -77,4 +79,39 @@ public interface LifecycleEventRepository extends EventRepository<LifecycleEvent
 | 
			
		||||
                                          @Param("error") String error,
 | 
			
		||||
                                          Pageable pageable);
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
    @Query("DELETE FROM LifecycleEventEntity e WHERE " +
 | 
			
		||||
            "e.tenantId = :tenantId " +
 | 
			
		||||
            "AND e.entityId = :entityId " +
 | 
			
		||||
            "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
            "AND (:endTime IS NULL OR e.ts <= :endTime)"
 | 
			
		||||
    )
 | 
			
		||||
    void removeEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                      @Param("entityId") UUID entityId,
 | 
			
		||||
                      @Param("startTime") Long startTime,
 | 
			
		||||
                      @Param("endTime") Long endTime);
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
    @Query(nativeQuery = true,
 | 
			
		||||
            value = "DELETE FROM lc_event e WHERE " +
 | 
			
		||||
                    "e.tenant_id = :tenantId " +
 | 
			
		||||
                    "AND e.entity_id = :entityId " +
 | 
			
		||||
                    "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
                    "AND (:endTime IS NULL OR e.ts <= :endTime) " +
 | 
			
		||||
                    "AND (:serviceId IS NULL OR e.service_id ILIKE concat('%', :serviceId, '%')) " +
 | 
			
		||||
                    "AND (:eventType IS NULL OR e.e_type ILIKE concat('%', :eventType, '%')) " +
 | 
			
		||||
                    "AND ((:statusFilterEnabled = FALSE) OR e.e_success = :statusFilter) " +
 | 
			
		||||
                    "AND (:error IS NULL OR e.e_error ILIKE concat('%', :error, '%'))"
 | 
			
		||||
    )
 | 
			
		||||
    void removeEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                      @Param("entityId") UUID entityId,
 | 
			
		||||
                      @Param("startTime") Long startTime,
 | 
			
		||||
                      @Param("endTime") Long endTime,
 | 
			
		||||
                      @Param("serviceId") String server,
 | 
			
		||||
                      @Param("eventType") String eventType,
 | 
			
		||||
                      @Param("statusFilterEnabled") boolean statusFilterEnabled,
 | 
			
		||||
                      @Param("statusFilter") boolean statusFilter,
 | 
			
		||||
                      @Param("error") String error);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -18,8 +18,10 @@ package org.thingsboard.server.dao.sql.event;
 | 
			
		||||
import org.springframework.data.domain.Page;
 | 
			
		||||
import org.springframework.data.domain.Pageable;
 | 
			
		||||
import org.springframework.data.jpa.repository.JpaRepository;
 | 
			
		||||
import org.springframework.data.jpa.repository.Modifying;
 | 
			
		||||
import org.springframework.data.jpa.repository.Query;
 | 
			
		||||
import org.springframework.data.repository.query.Param;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
import org.thingsboard.server.common.data.event.RuleChainDebugEvent;
 | 
			
		||||
import org.thingsboard.server.common.data.event.RuleNodeDebugEvent;
 | 
			
		||||
import org.thingsboard.server.dao.model.sql.RuleChainDebugEventEntity;
 | 
			
		||||
@ -43,10 +45,10 @@ public interface RuleChainDebugEventRepository extends EventRepository<RuleChain
 | 
			
		||||
            "AND (:endTime IS NULL OR e.ts <= :endTime)"
 | 
			
		||||
    )
 | 
			
		||||
    Page<RuleChainDebugEventEntity> findEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                                              @Param("entityId") UUID entityId,
 | 
			
		||||
                                              @Param("startTime") Long startTime,
 | 
			
		||||
                                              @Param("endTime") Long endTime,
 | 
			
		||||
                                              Pageable pageable);
 | 
			
		||||
                                               @Param("entityId") UUID entityId,
 | 
			
		||||
                                               @Param("startTime") Long startTime,
 | 
			
		||||
                                               @Param("endTime") Long endTime,
 | 
			
		||||
                                               Pageable pageable);
 | 
			
		||||
 | 
			
		||||
    @Query(nativeQuery = true,
 | 
			
		||||
            value = "SELECT * FROM rule_chain_debug_event e WHERE " +
 | 
			
		||||
@ -70,13 +72,46 @@ public interface RuleChainDebugEventRepository extends EventRepository<RuleChain
 | 
			
		||||
                    "AND (:error IS NULL OR e.e_error ILIKE concat('%', :error, '%'))"
 | 
			
		||||
    )
 | 
			
		||||
    Page<RuleChainDebugEventEntity> findEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                                              @Param("entityId") UUID entityId,
 | 
			
		||||
                                              @Param("startTime") Long startTime,
 | 
			
		||||
                                              @Param("endTime") Long endTime,
 | 
			
		||||
                                              @Param("serviceId") String server,
 | 
			
		||||
                                              @Param("message") String message,
 | 
			
		||||
                                              @Param("isError") boolean isError,
 | 
			
		||||
                                              @Param("error") String error,
 | 
			
		||||
                                              Pageable pageable);
 | 
			
		||||
                                               @Param("entityId") UUID entityId,
 | 
			
		||||
                                               @Param("startTime") Long startTime,
 | 
			
		||||
                                               @Param("endTime") Long endTime,
 | 
			
		||||
                                               @Param("serviceId") String server,
 | 
			
		||||
                                               @Param("message") String message,
 | 
			
		||||
                                               @Param("isError") boolean isError,
 | 
			
		||||
                                               @Param("error") String error,
 | 
			
		||||
                                               Pageable pageable);
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
    @Query("DELETE FROM RuleChainDebugEventEntity e WHERE " +
 | 
			
		||||
            "e.tenantId = :tenantId " +
 | 
			
		||||
            "AND e.entityId = :entityId " +
 | 
			
		||||
            "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
            "AND (:endTime IS NULL OR e.ts <= :endTime)"
 | 
			
		||||
    )
 | 
			
		||||
    void removeEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                      @Param("entityId") UUID entityId,
 | 
			
		||||
                      @Param("startTime") Long startTime,
 | 
			
		||||
                      @Param("endTime") Long endTime);
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
    @Query(nativeQuery = true,
 | 
			
		||||
            value = "DELETE FROM rule_chain_debug_event e WHERE " +
 | 
			
		||||
                    "e.tenant_id = :tenantId " +
 | 
			
		||||
                    "AND e.entity_id = :entityId " +
 | 
			
		||||
                    "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
                    "AND (:endTime IS NULL OR e.ts <= :endTime) " +
 | 
			
		||||
                    "AND (:serviceId IS NULL OR e.service_id ILIKE concat('%', :serviceId, '%')) " +
 | 
			
		||||
                    "AND (:message IS NULL OR e.e_message ILIKE concat('%', :message, '%')) " +
 | 
			
		||||
                    "AND ((:isError = FALSE) OR e.e_error IS NOT NULL) " +
 | 
			
		||||
                    "AND (:error IS NULL OR e.e_error ILIKE concat('%', :error, '%'))")
 | 
			
		||||
    void removeEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                      @Param("entityId") UUID entityId,
 | 
			
		||||
                      @Param("startTime") Long startTime,
 | 
			
		||||
                      @Param("endTime") Long endTime,
 | 
			
		||||
                      @Param("serviceId") String server,
 | 
			
		||||
                      @Param("message") String message,
 | 
			
		||||
                      @Param("isError") boolean isError,
 | 
			
		||||
                      @Param("error") String error);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -18,8 +18,10 @@ package org.thingsboard.server.dao.sql.event;
 | 
			
		||||
import org.springframework.data.domain.Page;
 | 
			
		||||
import org.springframework.data.domain.Pageable;
 | 
			
		||||
import org.springframework.data.jpa.repository.JpaRepository;
 | 
			
		||||
import org.springframework.data.jpa.repository.Modifying;
 | 
			
		||||
import org.springframework.data.jpa.repository.Query;
 | 
			
		||||
import org.springframework.data.repository.query.Param;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
import org.thingsboard.server.common.data.event.ErrorEvent;
 | 
			
		||||
import org.thingsboard.server.common.data.event.RuleNodeDebugEvent;
 | 
			
		||||
import org.thingsboard.server.dao.model.sql.ErrorEventEntity;
 | 
			
		||||
@ -100,4 +102,51 @@ public interface RuleNodeDebugEventRepository extends EventRepository<RuleNodeDe
 | 
			
		||||
                                              @Param("error") String error,
 | 
			
		||||
                                              Pageable pageable);
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
    @Query("DELETE FROM RuleNodeDebugEventEntity e WHERE " +
 | 
			
		||||
            "e.tenantId = :tenantId " +
 | 
			
		||||
            "AND e.entityId = :entityId " +
 | 
			
		||||
            "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
            "AND (:endTime IS NULL OR e.ts <= :endTime)"
 | 
			
		||||
    )
 | 
			
		||||
    void removeEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                      @Param("entityId") UUID entityId,
 | 
			
		||||
                      @Param("startTime") Long startTime,
 | 
			
		||||
                      @Param("endTime") Long endTime);
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
    @Query(nativeQuery = true,
 | 
			
		||||
            value = "DELETE FROM rule_node_debug_event e WHERE " +
 | 
			
		||||
                    "e.tenant_id = :tenantId " +
 | 
			
		||||
                    "AND e.entity_id = :entityId " +
 | 
			
		||||
                    "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
                    "AND (:endTime IS NULL OR e.ts <= :endTime) " +
 | 
			
		||||
                    "AND (:serviceId IS NULL OR e.service_id ILIKE concat('%', :serviceId, '%')) " +
 | 
			
		||||
                    "AND (:eventType IS NULL OR e.e_type ILIKE concat('%', :eventType, '%')) " +
 | 
			
		||||
                    "AND (:eventEntityId IS NULL OR e.e_entity_id = uuid(:eventEntityId)) " +
 | 
			
		||||
                    "AND (:eventEntityType IS NULL OR e.e_entity_type ILIKE concat('%', :eventEntityType, '%')) " +
 | 
			
		||||
                    "AND (:msgId IS NULL OR e.e_msg_id = uuid(:msgId)) " +
 | 
			
		||||
                    "AND (:msgType IS NULL OR e.e_msg_type ILIKE concat('%', :msgType, '%')) " +
 | 
			
		||||
                    "AND (:relationType IS NULL OR e.e_relation_type ILIKE concat('%', :relationType, '%')) " +
 | 
			
		||||
                    "AND (:data IS NULL OR e.e_data ILIKE concat('%', :data, '%')) " +
 | 
			
		||||
                    "AND (:metadata IS NULL OR e.e_metadata ILIKE concat('%', :metadata, '%')) " +
 | 
			
		||||
                    "AND ((:isError = FALSE) OR e.e_error IS NOT NULL) " +
 | 
			
		||||
                    "AND (:error IS NULL OR e.e_error ILIKE concat('%', :error, '%'))")
 | 
			
		||||
    void removeEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                      @Param("entityId") UUID entityId,
 | 
			
		||||
                      @Param("startTime") Long startTime,
 | 
			
		||||
                      @Param("endTime") Long endTime,
 | 
			
		||||
                      @Param("serviceId") String server,
 | 
			
		||||
                      @Param("eventType") String type,
 | 
			
		||||
                      @Param("eventEntityId") String eventEntityId,
 | 
			
		||||
                      @Param("eventEntityType") String eventEntityType,
 | 
			
		||||
                      @Param("msgId") String eventMsgId,
 | 
			
		||||
                      @Param("msgType") String eventMsgType,
 | 
			
		||||
                      @Param("relationType") String relationType,
 | 
			
		||||
                      @Param("data") String data,
 | 
			
		||||
                      @Param("metadata") String metadata,
 | 
			
		||||
                      @Param("isError") boolean isError,
 | 
			
		||||
                      @Param("error") String error);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@
 | 
			
		||||
package org.thingsboard.server.dao.sql.event;
 | 
			
		||||
 | 
			
		||||
import lombok.extern.slf4j.Slf4j;
 | 
			
		||||
import org.postgresql.util.PSQLException;
 | 
			
		||||
import org.springframework.beans.factory.annotation.Autowired;
 | 
			
		||||
import org.springframework.stereotype.Repository;
 | 
			
		||||
import org.thingsboard.server.common.data.event.EventType;
 | 
			
		||||
import org.thingsboard.server.dao.sql.JpaAbstractDaoListeningExecutorService;
 | 
			
		||||
@ -28,8 +28,6 @@ import java.sql.SQLException;
 | 
			
		||||
import java.util.ArrayList;
 | 
			
		||||
import java.util.List;
 | 
			
		||||
 | 
			
		||||
import static org.thingsboard.server.dao.sql.event.JpaBaseEventDao.DEBUG_PARTITION_DURATION;
 | 
			
		||||
import static org.thingsboard.server.dao.sql.event.JpaBaseEventDao.REGULAR_PARTITION_DURATION;
 | 
			
		||||
 | 
			
		||||
@Slf4j
 | 
			
		||||
@Repository
 | 
			
		||||
@ -38,6 +36,9 @@ public class SqlEventCleanupRepository extends JpaAbstractDaoListeningExecutorSe
 | 
			
		||||
    private static final String SELECT_PARTITIONS_STMT = "SELECT tablename from pg_tables WHERE schemaname = 'public' and tablename like concat(?, '_%')";
 | 
			
		||||
    private static final int PSQL_VERSION_14 = 140000;
 | 
			
		||||
 | 
			
		||||
    @Autowired
 | 
			
		||||
    private EventPartitionConfiguration partitionConfiguration;
 | 
			
		||||
 | 
			
		||||
    private volatile Integer currentServerVersion;
 | 
			
		||||
 | 
			
		||||
    @Override
 | 
			
		||||
@ -50,7 +51,7 @@ public class SqlEventCleanupRepository extends JpaAbstractDaoListeningExecutorSe
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    private void cleanupEvents(EventType eventType, long eventExpTime) {
 | 
			
		||||
        var partitionDuration = eventType.isDebug() ? DEBUG_PARTITION_DURATION : REGULAR_PARTITION_DURATION;
 | 
			
		||||
        var partitionDuration = partitionConfiguration.getPartitionSizeInMs(eventType);
 | 
			
		||||
        List<Long> partitions = fetchPartitions(eventType);
 | 
			
		||||
        for (var partitionTs : partitions) {
 | 
			
		||||
            var partitionEndTs = partitionTs + partitionDuration;
 | 
			
		||||
 | 
			
		||||
@ -18,8 +18,10 @@ package org.thingsboard.server.dao.sql.event;
 | 
			
		||||
import org.springframework.data.domain.Page;
 | 
			
		||||
import org.springframework.data.domain.Pageable;
 | 
			
		||||
import org.springframework.data.jpa.repository.JpaRepository;
 | 
			
		||||
import org.springframework.data.jpa.repository.Modifying;
 | 
			
		||||
import org.springframework.data.jpa.repository.Query;
 | 
			
		||||
import org.springframework.data.repository.query.Param;
 | 
			
		||||
import org.springframework.transaction.annotation.Transactional;
 | 
			
		||||
import org.thingsboard.server.common.data.event.StatisticsEvent;
 | 
			
		||||
import org.thingsboard.server.dao.model.sql.StatisticsEventEntity;
 | 
			
		||||
 | 
			
		||||
@ -51,8 +53,10 @@ public interface StatisticsEventRepository extends EventRepository<StatisticsEve
 | 
			
		||||
                    "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
                    "AND (:endTime IS NULL OR e.ts <= :endTime) " +
 | 
			
		||||
                    "AND (:serviceId IS NULL OR e.service_id ILIKE concat('%', :serviceId, '%')) " +
 | 
			
		||||
                    "AND (:messagesProcessed IS NULL OR e.e_messages_processed >= :messagesProcessed) " +
 | 
			
		||||
                    "AND (:errorsOccurred IS NULL OR e.e_errors_occurred >= :errorsOccurred)"
 | 
			
		||||
                    "AND (:minMessagesProcessed IS NULL OR e.e_messages_processed >= :minMessagesProcessed) " +
 | 
			
		||||
                    "AND (:maxMessagesProcessed IS NULL OR e.e_messages_processed < :maxMessagesProcessed) " +
 | 
			
		||||
                    "AND (:minErrorsOccurred IS NULL OR e.e_errors_occurred >= :minErrorsOccurred) " +
 | 
			
		||||
                    "AND (:maxErrorsOccurred IS NULL OR e.e_errors_occurred < :maxErrorsOccurred)"
 | 
			
		||||
            ,
 | 
			
		||||
            countQuery = "SELECT count(*) FROM stats_event e WHERE " +
 | 
			
		||||
                    "e.tenant_id = :tenantId " +
 | 
			
		||||
@ -60,16 +64,57 @@ public interface StatisticsEventRepository extends EventRepository<StatisticsEve
 | 
			
		||||
                    "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
                    "AND (:endTime IS NULL OR e.ts <= :endTime) " +
 | 
			
		||||
                    "AND (:serviceId IS NULL OR e.service_id ILIKE concat('%', :serviceId, '%')) " +
 | 
			
		||||
                    "AND (:messagesProcessed IS NULL OR e.e_messages_processed >= :messagesProcessed) " +
 | 
			
		||||
                    "AND (:errorsOccurred IS NULL OR e.e_errors_occurred >= :errorsOccurred)"
 | 
			
		||||
                    "AND (:minMessagesProcessed IS NULL OR e.e_messages_processed >= :minMessagesProcessed) " +
 | 
			
		||||
                    "AND (:maxMessagesProcessed IS NULL OR e.e_messages_processed < :maxMessagesProcessed) " +
 | 
			
		||||
                    "AND (:minErrorsOccurred IS NULL OR e.e_errors_occurred >= :minErrorsOccurred) " +
 | 
			
		||||
                    "AND (:maxErrorsOccurred IS NULL OR e.e_errors_occurred < :maxErrorsOccurred)"
 | 
			
		||||
    )
 | 
			
		||||
    Page<StatisticsEventEntity> findEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                                           @Param("entityId") UUID entityId,
 | 
			
		||||
                                           @Param("startTime") Long startTime,
 | 
			
		||||
                                           @Param("endTime") Long endTime,
 | 
			
		||||
                                           @Param("serviceId") String server,
 | 
			
		||||
                                           @Param("messagesProcessed") Integer messagesProcessed,
 | 
			
		||||
                                           @Param("errorsOccurred") Integer errorsOccurred,
 | 
			
		||||
                                           @Param("minMessagesProcessed") Integer minMessagesProcessed,
 | 
			
		||||
                                           @Param("maxMessagesProcessed") Integer maxMessagesProcessed,
 | 
			
		||||
                                           @Param("minErrorsOccurred") Integer minErrorsOccurred,
 | 
			
		||||
                                           @Param("maxErrorsOccurred") Integer maxErrorsOccurred,
 | 
			
		||||
                                           Pageable pageable);
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
    @Query("DELETE FROM StatisticsEventEntity e WHERE " +
 | 
			
		||||
            "e.tenantId = :tenantId " +
 | 
			
		||||
            "AND e.entityId = :entityId " +
 | 
			
		||||
            "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
            "AND (:endTime IS NULL OR e.ts <= :endTime)"
 | 
			
		||||
    )
 | 
			
		||||
    void removeEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                      @Param("entityId") UUID entityId,
 | 
			
		||||
                      @Param("startTime") Long startTime,
 | 
			
		||||
                      @Param("endTime") Long endTime);
 | 
			
		||||
 | 
			
		||||
    @Transactional
 | 
			
		||||
    @Modifying
 | 
			
		||||
    @Query(nativeQuery = true,
 | 
			
		||||
            value = "DELETE FROM stats_event e WHERE " +
 | 
			
		||||
                    "e.tenant_id = :tenantId " +
 | 
			
		||||
                    "AND e.entity_id = :entityId " +
 | 
			
		||||
                    "AND (:startTime IS NULL OR e.ts >= :startTime) " +
 | 
			
		||||
                    "AND (:endTime IS NULL OR e.ts <= :endTime) " +
 | 
			
		||||
                    "AND (:serviceId IS NULL OR e.service_id ILIKE concat('%', :serviceId, '%')) " +
 | 
			
		||||
                    "AND (:minMessagesProcessed IS NULL OR e.e_messages_processed >= :minMessagesProcessed) " +
 | 
			
		||||
                    "AND (:maxMessagesProcessed IS NULL OR e.e_messages_processed < :maxMessagesProcessed) " +
 | 
			
		||||
                    "AND (:minErrorsOccurred IS NULL OR e.e_errors_occurred >= :minErrorsOccurred) " +
 | 
			
		||||
                    "AND (:maxErrorsOccurred IS NULL OR e.e_errors_occurred < :maxErrorsOccurred)"
 | 
			
		||||
 | 
			
		||||
    )
 | 
			
		||||
    void removeEvents(@Param("tenantId") UUID tenantId,
 | 
			
		||||
                      @Param("entityId") UUID entityId,
 | 
			
		||||
                      @Param("startTime") Long startTime,
 | 
			
		||||
                      @Param("endTime") Long endTime,
 | 
			
		||||
                      @Param("serviceId") String server,
 | 
			
		||||
                      @Param("minMessagesProcessed") Integer minMessagesProcessed,
 | 
			
		||||
                      @Param("maxMessagesProcessed") Integer maxMessagesProcessed,
 | 
			
		||||
                      @Param("minErrorsOccurred") Integer minErrorsOccurred,
 | 
			
		||||
                      @Param("maxErrorsOccurred") Integer maxErrorsOccurred);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user