diff --git a/CHANGES.md b/CHANGES.md index 210a0d83c..10c79af5a 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -37,6 +37,7 @@ Release Notes. * Fix RestTemplate plugin recording url tag with wrong port * Support collecting logs and forwarding through gRPC. * Support config `agent.sample_n_per_3_secs` can be changed in the runtime. +* Support DNS periodic resolving mechanism to update backend service. #### OAP-Backend * Make meter receiver support MAL. diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java index b7da770c1..4f4a9816f 100755 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/conf/Config.java @@ -163,11 +163,14 @@ public class Config { * Get profile task list interval */ public static int GET_PROFILE_TASK_INTERVAL = 20; - /** * Get agent dynamic config interval */ public static int GET_AGENT_DYNAMIC_CONFIG_INTERVAL = 20; + /** + * If true, skywalking agent will enable periodically resolving DNS to update receiver service addresses. + */ + public static boolean IS_RESOLVE_DNS_PERIODICALLY = false; } public static class Profile { diff --git a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/GRPCChannelManager.java b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/GRPCChannelManager.java index ca13a48f3..79d114d13 100755 --- a/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/GRPCChannelManager.java +++ b/apm-sniffer/apm-agent-core/src/main/java/org/apache/skywalking/apm/agent/core/remote/GRPCChannelManager.java @@ -21,6 +21,8 @@ package org.apache.skywalking.apm.agent.core.remote; import io.grpc.Channel; import io.grpc.Status; import io.grpc.StatusRuntimeException; + +import java.net.InetAddress; import java.util.Arrays; import java.util.Collections; import java.util.LinkedList; @@ -29,6 +31,8 @@ import java.util.Random; import java.util.concurrent.Executors; import java.util.concurrent.ScheduledFuture; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; + import org.apache.skywalking.apm.agent.core.boot.BootService; import org.apache.skywalking.apm.agent.core.boot.DefaultImplementor; import org.apache.skywalking.apm.agent.core.boot.DefaultNamedThreadFactory; @@ -37,6 +41,8 @@ import org.apache.skywalking.apm.agent.core.logging.api.ILog; import org.apache.skywalking.apm.agent.core.logging.api.LogManager; import org.apache.skywalking.apm.util.RunnableWithExceptionProtection; +import static org.apache.skywalking.apm.agent.core.conf.Config.Collector.IS_RESOLVE_DNS_PERIODICALLY; + @DefaultImplementor public class GRPCChannelManager implements BootService, Runnable { private static final ILog LOGGER = LogManager.getLogger(GRPCChannelManager.class); @@ -92,6 +98,23 @@ public class GRPCChannelManager implements BootService, Runnable { @Override public void run() { LOGGER.debug("Selected collector grpc service running, reconnect:{}.", reconnect); + if (IS_RESOLVE_DNS_PERIODICALLY && reconnect) { + String backendService = Config.Collector.BACKEND_SERVICE.split(",")[0]; + try { + String[] domainAndPort = backendService.split(":"); + + List newGrpcServers = Arrays + .stream(InetAddress.getAllByName(domainAndPort[0])) + .map(InetAddress::getHostAddress) + .map(ip -> String.format("%s:%s", ip, domainAndPort[1])) + .collect(Collectors.toList()); + + grpcServers = newGrpcServers; + } catch (Throwable t) { + LOGGER.error(t, "Failed to resolve {} of backend service.", backendService); + } + } + if (reconnect) { if (grpcServers.size() > 0) { String server = ""; diff --git a/docs/en/setup/service-agent/java-agent/README.md b/docs/en/setup/service-agent/java-agent/README.md index 24a03ba17..b2fd2adbb 100755 --- a/docs/en/setup/service-agent/java-agent/README.md +++ b/docs/en/setup/service-agent/java-agent/README.md @@ -95,6 +95,7 @@ property key | Description | Default | `collector.grpc_upstream_timeout`|How long grpc client will timeout in sending data to upstream. Unit is second.|`30` seconds| `collector.get_profile_task_interval`|Sniffer get profile task list interval.|`20`| `collector.get_agent_dynamic_config_interval`|Sniffer get agent dynamic config interval|`20`| +`collector.dns_period_resolve_active`|If true, skywalking agent will enable periodically resolving DNS to update receiver service addresses.|`false`| `logging.level`|Log level: TRACE, DEBUG, INFO, WARN, ERROR, OFF. Default is info.|`INFO`| `logging.file_name`|Log file name.|`skywalking-api.log`| `logging.output`| Log output. Default is FILE. Use CONSOLE means output to stdout. |`FILE`|