Monitoring for IPs associated with the domain

This commit is contained in:
ViacheslavKlimov 2023-11-27 11:42:54 +02:00
parent 797e365892
commit e8ba1e17eb
6 changed files with 59 additions and 11 deletions

View File

@ -21,4 +21,8 @@ public interface MonitoringTarget {
UUID getDeviceId(); UUID getDeviceId();
String getBaseUrl();
boolean isCheckDomainIps();
} }

View File

@ -23,9 +23,8 @@ import java.util.List;
@Data @Data
public abstract class TransportMonitoringConfig implements MonitoringConfig<TransportMonitoringTarget> { public abstract class TransportMonitoringConfig implements MonitoringConfig<TransportMonitoringTarget> {
private int requestTimeoutMs;
private List<TransportMonitoringTarget> targets; private List<TransportMonitoringTarget> targets;
private int requestTimeoutMs;
public abstract TransportType getTransportType(); public abstract TransportType getTransportType();

View File

@ -25,6 +25,7 @@ public class TransportMonitoringTarget implements MonitoringTarget {
private String baseUrl; private String baseUrl;
private DeviceConfig device; // set manually during initialization private DeviceConfig device; // set manually during initialization
private boolean checkDomainIps;
@Override @Override
public UUID getDeviceId() { public UUID getDeviceId() {

View File

@ -15,6 +15,7 @@
*/ */
package org.thingsboard.monitoring.service; package org.thingsboard.monitoring.service;
import lombok.SneakyThrows;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext; import org.springframework.context.ApplicationContext;
@ -29,9 +30,14 @@ import org.thingsboard.monitoring.service.transport.TransportHealthChecker;
import org.thingsboard.monitoring.util.TbStopWatch; import org.thingsboard.monitoring.util.TbStopWatch;
import javax.annotation.PostConstruct; import javax.annotation.PostConstruct;
import java.net.InetAddress;
import java.net.URI;
import java.util.Arrays;
import java.util.LinkedList; import java.util.LinkedList;
import java.util.List; import java.util.List;
import java.util.Set;
import java.util.UUID; import java.util.UUID;
import java.util.stream.Collectors;
@Slf4j @Slf4j
public abstract class BaseMonitoringService<C extends MonitoringConfig<T>, T extends MonitoringTarget> { public abstract class BaseMonitoringService<C extends MonitoringConfig<T>, T extends MonitoringTarget> {
@ -60,15 +66,36 @@ public abstract class BaseMonitoringService<C extends MonitoringConfig<T>, T ext
tbClient.logIn(); tbClient.logIn();
configs.forEach(config -> { configs.forEach(config -> {
config.getTargets().forEach(target -> { config.getTargets().forEach(target -> {
BaseHealthChecker<C, T> healthChecker = (BaseHealthChecker<C, T>) createHealthChecker(config, target); initHealthChecker(target, config);
log.info("Initializing {}", healthChecker.getClass().getSimpleName()); if (target.isCheckDomainIps()) {
healthChecker.initialize(tbClient); initIpsHealthCheckers(target, config);
devices.add(target.getDeviceId()); }
healthCheckers.add(healthChecker);
}); });
}); });
} }
private void initHealthChecker(T target, C config) {
BaseHealthChecker<C, T> healthChecker = (BaseHealthChecker<C, T>) createHealthChecker(config, target);
log.info("Initializing {} for {}", healthChecker.getClass().getSimpleName(), target.getBaseUrl());
healthChecker.initialize(tbClient);
devices.add(target.getDeviceId());
healthCheckers.add(healthChecker);
}
@SneakyThrows
private void initIpsHealthCheckers(T target, C config) {
URI baseUrl = new URI(target.getBaseUrl());
String domain = baseUrl.getHost();
Set<String> ips = Arrays.stream(InetAddress.getAllByName(domain))
.map(InetAddress::getHostAddress)
.collect(Collectors.toSet());
for (String ip : ips) {
String url = new URI(baseUrl.getScheme(), null, ip, baseUrl.getPort(), "", null, null).toString();
initHealthChecker(createTarget(url), config);
}
}
public final void runChecks() { public final void runChecks() {
if (healthCheckers.isEmpty()) { if (healthCheckers.isEmpty()) {
return; return;
@ -99,6 +126,8 @@ public abstract class BaseMonitoringService<C extends MonitoringConfig<T>, T ext
protected abstract BaseHealthChecker<?, ?> createHealthChecker(C config, T target); protected abstract BaseHealthChecker<?, ?> createHealthChecker(C config, T target);
protected abstract T createTarget(String baseUrl);
protected abstract String getName(); protected abstract String getName();
} }

View File

@ -33,6 +33,13 @@ public final class TransportsMonitoringService extends BaseMonitoringService<Tra
return applicationContext.getBean(config.getTransportType().getServiceClass(), config, target); return applicationContext.getBean(config.getTransportType().getServiceClass(), config, target);
} }
@Override
protected TransportMonitoringTarget createTarget(String baseUrl) {
TransportMonitoringTarget target = new TransportMonitoringTarget();
target.setBaseUrl(baseUrl);
return target;
}
@Override @Override
protected String getName() { protected String getName() {
return "transports check"; return "transports check";

View File

@ -51,8 +51,10 @@ monitoring:
# MQTT QoS # MQTT QoS
qos: '${MQTT_QOS_LEVEL:1}' qos: '${MQTT_QOS_LEVEL:1}'
targets: targets:
# MQTT transport base url, tcp://DOMAIN:1883 by default # MQTT transport base url, tcp://DOMAIN:1883 by default
- base_url: '${MQTT_TRANSPORT_BASE_URL:tcp://${monitoring.domain}:1883}' - base_url: '${MQTT_TRANSPORT_BASE_URL:tcp://${monitoring.domain}:1883}'
# Whether to monitor IPs associated with the domain from base url
check_domain_ips: '${MQTT_TRANSPORT_CHECK_DOMAIN_IPS:false}'
# To add more targets, use following environment variables: # To add more targets, use following environment variables:
# monitoring.transports.mqtt.targets[1].base_url, monitoring.transports.mqtt.targets[2].base_url, etc. # monitoring.transports.mqtt.targets[1].base_url, monitoring.transports.mqtt.targets[2].base_url, etc.
@ -62,8 +64,10 @@ monitoring:
# CoAP request timeout in milliseconds # CoAP request timeout in milliseconds
request_timeout_ms: '${COAP_REQUEST_TIMEOUT_MS:4000}' request_timeout_ms: '${COAP_REQUEST_TIMEOUT_MS:4000}'
targets: targets:
# CoAP transport base url, coap://DOMAIN by default # CoAP transport base url, coap://DOMAIN by default
- base_url: '${COAP_TRANSPORT_BASE_URL:coap://${monitoring.domain}}' - base_url: '${COAP_TRANSPORT_BASE_URL:coap://${monitoring.domain}}'
# Whether to monitor IPs associated with the domain from base url
check_domain_ips: '${COAP_TRANSPORT_CHECK_DOMAIN_IPS:false}'
# To add more targets, use following environment variables: # To add more targets, use following environment variables:
# monitoring.transports.coap.targets[1].base_url, monitoring.transports.coap.targets[2].base_url, etc. # monitoring.transports.coap.targets[1].base_url, monitoring.transports.coap.targets[2].base_url, etc.
@ -73,8 +77,10 @@ monitoring:
# HTTP request timeout in milliseconds # HTTP request timeout in milliseconds
request_timeout_ms: '${HTTP_REQUEST_TIMEOUT_MS:4000}' request_timeout_ms: '${HTTP_REQUEST_TIMEOUT_MS:4000}'
targets: targets:
# HTTP transport base url, http://DOMAIN by default # HTTP transport base url, http://DOMAIN by default
- base_url: '${HTTP_TRANSPORT_BASE_URL:http://${monitoring.domain}}' - base_url: '${HTTP_TRANSPORT_BASE_URL:http://${monitoring.domain}}'
# Whether to monitor IPs associated with the domain from base url
check_domain_ips: '${HTTP_TRANSPORT_CHECK_DOMAIN_IPS:false}'
# To add more targets, use following environment variables: # To add more targets, use following environment variables:
# monitoring.transports.http.targets[1].base_url, monitoring.transports.http.targets[2].base_url, etc. # monitoring.transports.http.targets[1].base_url, monitoring.transports.http.targets[2].base_url, etc.
@ -84,8 +90,10 @@ monitoring:
# LwM2M request timeout in milliseconds # LwM2M request timeout in milliseconds
request_timeout_ms: '${LWM2M_REQUEST_TIMEOUT_MS:4000}' request_timeout_ms: '${LWM2M_REQUEST_TIMEOUT_MS:4000}'
targets: targets:
# LwM2M transport base url, coap://DOMAIN:5685 by default # LwM2M transport base url, coap://DOMAIN:5685 by default
- base_url: '${LWM2M_TRANSPORT_BASE_URL:coap://${monitoring.domain}:5685}' - base_url: '${LWM2M_TRANSPORT_BASE_URL:coap://${monitoring.domain}:5685}'
# Whether to monitor IPs associated with the domain from base url
check_domain_ips: '${LWM2M_TRANSPORT_CHECK_DOMAIN_IPS:false}'
# To add more targets, use following environment variables: # To add more targets, use following environment variables:
# monitoring.transports.lwm2m.targets[1].base_url, monitoring.transports.lwm2m.targets[2].base_url, etc. # monitoring.transports.lwm2m.targets[1].base_url, monitoring.transports.lwm2m.targets[2].base_url, etc.