Improve Remote JS Invoke Service statistics
This commit is contained in:
		
							parent
							
								
									562917649c
								
							
						
					
					
						commit
						3c3ad1ac38
					
				@ -15,6 +15,7 @@
 | 
			
		||||
 */
 | 
			
		||||
package org.thingsboard.server.service.script;
 | 
			
		||||
 | 
			
		||||
import com.google.common.util.concurrent.FutureCallback;
 | 
			
		||||
import com.google.common.util.concurrent.Futures;
 | 
			
		||||
import com.google.common.util.concurrent.ListenableFuture;
 | 
			
		||||
import lombok.Getter;
 | 
			
		||||
@ -31,11 +32,13 @@ import org.thingsboard.server.kafka.TbKafkaRequestTemplate;
 | 
			
		||||
import org.thingsboard.server.kafka.TbKafkaSettings;
 | 
			
		||||
import org.thingsboard.server.kafka.TbNodeIdProvider;
 | 
			
		||||
 | 
			
		||||
import javax.annotation.Nullable;
 | 
			
		||||
import javax.annotation.PostConstruct;
 | 
			
		||||
import javax.annotation.PreDestroy;
 | 
			
		||||
import java.util.Map;
 | 
			
		||||
import java.util.UUID;
 | 
			
		||||
import java.util.concurrent.ConcurrentHashMap;
 | 
			
		||||
import java.util.concurrent.TimeoutException;
 | 
			
		||||
import java.util.concurrent.atomic.AtomicInteger;
 | 
			
		||||
import java.util.concurrent.atomic.AtomicLong;
 | 
			
		||||
 | 
			
		||||
@ -79,6 +82,7 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
 | 
			
		||||
    private final AtomicInteger kafkaInvokeMsgs = new AtomicInteger(0);
 | 
			
		||||
    private final AtomicInteger kafkaEvalMsgs = new AtomicInteger(0);
 | 
			
		||||
    private final AtomicInteger kafkaFailedMsgs = new AtomicInteger(0);
 | 
			
		||||
    private final AtomicInteger kafkaTimeoutMsgs = new AtomicInteger(0);
 | 
			
		||||
 | 
			
		||||
    @Scheduled(fixedDelayString = "${js.remote.stats.print_interval_ms}")
 | 
			
		||||
    public void printStats() {
 | 
			
		||||
@ -86,8 +90,9 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
 | 
			
		||||
            int invokeMsgs = kafkaInvokeMsgs.getAndSet(0);
 | 
			
		||||
            int evalMsgs = kafkaEvalMsgs.getAndSet(0);
 | 
			
		||||
            int failed = kafkaFailedMsgs.getAndSet(0);
 | 
			
		||||
            log.info("Kafka JS Invoke Stats: pushed [{}] received [{}] invoke [{}] eval [{}] failed [{}]",
 | 
			
		||||
                    kafkaPushedMsgs.getAndSet(0), invokeMsgs + evalMsgs, invokeMsgs, evalMsgs, failed);
 | 
			
		||||
            int timedOut = kafkaTimeoutMsgs.getAndSet(0);
 | 
			
		||||
            log.info("Kafka JS Invoke Stats: pushed [{}] received [{}] invoke [{}] eval [{}] failed [{}] timedOut [{}]",
 | 
			
		||||
                    kafkaPushedMsgs.getAndSet(0), invokeMsgs + evalMsgs, invokeMsgs, evalMsgs, failed, timedOut);
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
@ -145,16 +150,28 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
 | 
			
		||||
        log.trace("Post compile request for scriptId [{}]", scriptId);
 | 
			
		||||
        ListenableFuture<JsInvokeProtos.RemoteJsResponse> future = kafkaTemplate.post(scriptId.toString(), jsRequestWrapper);
 | 
			
		||||
        kafkaPushedMsgs.incrementAndGet();
 | 
			
		||||
        Futures.addCallback(future, new FutureCallback<JsInvokeProtos.RemoteJsResponse>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onSuccess(@Nullable JsInvokeProtos.RemoteJsResponse result) {
 | 
			
		||||
                kafkaEvalMsgs.incrementAndGet();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onFailure(Throwable t) {
 | 
			
		||||
                if (t instanceof TimeoutException || (t.getCause() != null && t.getCause() instanceof TimeoutException)) {
 | 
			
		||||
                    kafkaTimeoutMsgs.incrementAndGet();
 | 
			
		||||
                }
 | 
			
		||||
                kafkaFailedMsgs.incrementAndGet();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        return Futures.transform(future, response -> {
 | 
			
		||||
            JsInvokeProtos.JsCompileResponse compilationResult = response.getCompileResponse();
 | 
			
		||||
            UUID compiledScriptId = new UUID(compilationResult.getScriptIdMSB(), compilationResult.getScriptIdLSB());
 | 
			
		||||
            if (compilationResult.getSuccess()) {
 | 
			
		||||
                kafkaEvalMsgs.incrementAndGet();
 | 
			
		||||
                scriptIdToNameMap.put(scriptId, functionName);
 | 
			
		||||
                scriptIdToBodysMap.put(scriptId, scriptBody);
 | 
			
		||||
                return compiledScriptId;
 | 
			
		||||
            } else {
 | 
			
		||||
                kafkaFailedMsgs.incrementAndGet();
 | 
			
		||||
                log.debug("[{}] Failed to compile script due to [{}]: {}", compiledScriptId, compilationResult.getErrorCode().name(), compilationResult.getErrorDetails());
 | 
			
		||||
                throw new RuntimeException(compilationResult.getErrorDetails());
 | 
			
		||||
            }
 | 
			
		||||
@ -182,16 +199,27 @@ public class RemoteJsInvokeService extends AbstractJsInvokeService {
 | 
			
		||||
                .setInvokeRequest(jsRequestBuilder.build())
 | 
			
		||||
                .build();
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
        ListenableFuture<JsInvokeProtos.RemoteJsResponse> future = kafkaTemplate.post(scriptId.toString(), jsRequestWrapper);
 | 
			
		||||
        kafkaPushedMsgs.incrementAndGet();
 | 
			
		||||
        Futures.addCallback(future, new FutureCallback<JsInvokeProtos.RemoteJsResponse>() {
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onSuccess(@Nullable JsInvokeProtos.RemoteJsResponse result) {
 | 
			
		||||
                kafkaInvokeMsgs.incrementAndGet();
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            @Override
 | 
			
		||||
            public void onFailure(Throwable t) {
 | 
			
		||||
                if (t instanceof TimeoutException || (t.getCause() != null && t.getCause() instanceof TimeoutException)) {
 | 
			
		||||
                    kafkaTimeoutMsgs.incrementAndGet();
 | 
			
		||||
                }
 | 
			
		||||
                kafkaFailedMsgs.incrementAndGet();
 | 
			
		||||
            }
 | 
			
		||||
        });
 | 
			
		||||
        return Futures.transform(future, response -> {
 | 
			
		||||
            JsInvokeProtos.JsInvokeResponse invokeResult = response.getInvokeResponse();
 | 
			
		||||
            if (invokeResult.getSuccess()) {
 | 
			
		||||
                kafkaInvokeMsgs.incrementAndGet();
 | 
			
		||||
                return invokeResult.getResult();
 | 
			
		||||
            } else {
 | 
			
		||||
                kafkaFailedMsgs.incrementAndGet();
 | 
			
		||||
                log.debug("[{}] Failed to compile script due to [{}]: {}", scriptId, invokeResult.getErrorCode().name(), invokeResult.getErrorDetails());
 | 
			
		||||
                throw new RuntimeException(invokeResult.getErrorDetails());
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user