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,13 +66,34 @@ 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 -> {
initHealthChecker(target, config);
if (target.isCheckDomainIps()) {
initIpsHealthCheckers(target, config);
}
});
});
}
private void initHealthChecker(T target, C config) {
BaseHealthChecker<C, T> healthChecker = (BaseHealthChecker<C, T>) createHealthChecker(config, target); BaseHealthChecker<C, T> healthChecker = (BaseHealthChecker<C, T>) createHealthChecker(config, target);
log.info("Initializing {}", healthChecker.getClass().getSimpleName()); log.info("Initializing {} for {}", healthChecker.getClass().getSimpleName(), target.getBaseUrl());
healthChecker.initialize(tbClient); healthChecker.initialize(tbClient);
devices.add(target.getDeviceId()); devices.add(target.getDeviceId());
healthCheckers.add(healthChecker); 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() {
@ -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

@ -53,6 +53,8 @@ monitoring:
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.
@ -64,6 +66,8 @@ monitoring:
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.
@ -75,6 +79,8 @@ monitoring:
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.
@ -86,6 +92,8 @@ monitoring:
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.