diff options
author | Bjørn Christian Seime <bjorn.christian@seime.no> | 2019-01-24 11:01:50 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-01-24 11:01:50 +0100 |
commit | ee29f449256f4d9d21abe8e1c461399b2cb303ca (patch) | |
tree | ffec96950a75d6963072c2c927c42956faf02a4c | |
parent | b744edad9851fbfe26faa1809ca85ebba92f07c1 (diff) | |
parent | e7a2b1be18fa1b9238ec863f8b99cb73183c3afd (diff) |
Merge pull request #8187 from vespa-engine/bjorncs/jrt-transport-metrics
bjorncs/jrt transport metrics
41 files changed, 204 insertions, 294 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java index a6de284f4b7..7a10a97f4da 100755 --- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java +++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java @@ -26,7 +26,6 @@ import com.yahoo.container.handler.ThreadpoolConfig; import com.yahoo.container.jdisc.ContainerMbusConfig; import com.yahoo.container.jdisc.JdiscBindingsConfig; import com.yahoo.container.jdisc.config.HealthMonitorConfig; -import com.yahoo.container.jdisc.jrt.DefaultJrtFactory; import com.yahoo.container.jdisc.messagebus.MbusServerProvider; import com.yahoo.container.jdisc.state.StateHandler; import com.yahoo.container.logging.AccessLog; @@ -232,7 +231,6 @@ public final class ContainerCluster addSimpleComponent("com.yahoo.container.jdisc.ContainerThreadFactory"); addSimpleComponent("com.yahoo.container.handler.VipStatus"); addSimpleComponent(com.yahoo.container.handler.ClustersStatus.class.getName()); - addSimpleComponent(DefaultJrtFactory.class); addJaxProviders(); } diff --git a/config/src/main/java/com/yahoo/vespa/config/JRTConnectionPool.java b/config/src/main/java/com/yahoo/vespa/config/JRTConnectionPool.java index 82306276617..efeaacf225b 100644 --- a/config/src/main/java/com/yahoo/vespa/config/JRTConnectionPool.java +++ b/config/src/main/java/com/yahoo/vespa/config/JRTConnectionPool.java @@ -28,7 +28,7 @@ public class JRTConnectionPool implements ConnectionPool { private static final Logger log = Logger.getLogger(JRTConnectionPool.class.getName()); - private final Supervisor supervisor; + private final Supervisor supervisor = new Supervisor(new Transport()); private final Map<String, JRTConnection> connections = new LinkedHashMap<>(); // The config sources used by this connection pool. @@ -38,11 +38,6 @@ public class JRTConnectionPool implements ConnectionPool { private volatile JRTConnection currentConnection; public JRTConnectionPool(ConfigSourceSet sourceSet) { - this(new Supervisor(new Transport()), sourceSet); - } - - public JRTConnectionPool(Supervisor supervisor, ConfigSourceSet sourceSet) { - this.supervisor = supervisor; addSources(sourceSet); } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java index 0161cc242f5..16244dd62f3 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/ApplicationRepository.java @@ -21,7 +21,6 @@ import com.yahoo.config.provision.SystemName; import com.yahoo.config.provision.TenantName; import com.yahoo.config.provision.Zone; import com.yahoo.container.jdisc.HttpResponse; -import com.yahoo.container.jdisc.jrt.JrtFactory; import com.yahoo.io.IOUtils; import com.yahoo.log.LogLevel; import com.yahoo.path.Path; @@ -102,22 +101,20 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye public ApplicationRepository(TenantRepository tenantRepository, HostProvisionerProvider hostProvisionerProvider, ConfigConvergenceChecker configConvergenceChecker, - HttpProxy httpProxy, + HttpProxy httpProxy, ConfigserverConfig configserverConfig, - Orchestrator orchestrator, - JrtFactory jrtFactory) { + Orchestrator orchestrator) { this(tenantRepository, hostProvisionerProvider.getHostProvisioner(), configConvergenceChecker, httpProxy, configserverConfig, orchestrator, - Clock.systemUTC(), new FileDistributionStatus(jrtFactory)); + Clock.systemUTC(), new FileDistributionStatus()); } // For testing public ApplicationRepository(TenantRepository tenantRepository, Provisioner hostProvisioner, Orchestrator orchestrator, - Clock clock, - JrtFactory jrtFactory) { - this(tenantRepository, hostProvisioner, orchestrator, clock, new ConfigserverConfig(new ConfigserverConfig.Builder()), jrtFactory); + Clock clock) { + this(tenantRepository, hostProvisioner, orchestrator, clock, new ConfigserverConfig(new ConfigserverConfig.Builder())); } // For testing @@ -125,10 +122,9 @@ public class ApplicationRepository implements com.yahoo.config.provision.Deploye Provisioner hostProvisioner, Orchestrator orchestrator, Clock clock, - ConfigserverConfig configserverConfig, - JrtFactory jrtFactory) { + ConfigserverConfig configserverConfig) { this(tenantRepository, Optional.of(hostProvisioner), new ConfigConvergenceChecker(), new HttpProxy(new SimpleHttpFetcher()), - configserverConfig, orchestrator, clock, new FileDistributionStatus(jrtFactory)); + configserverConfig, orchestrator, clock, new FileDistributionStatus()); } private ApplicationRepository(TenantRepository tenantRepository, diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/application/FileDistributionStatus.java b/configserver/src/main/java/com/yahoo/vespa/config/server/application/FileDistributionStatus.java index 08767467fe6..f37225a7e7b 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/application/FileDistributionStatus.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/application/FileDistributionStatus.java @@ -1,16 +1,15 @@ // Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. package com.yahoo.vespa.config.server.application; -import com.google.inject.Inject; import com.yahoo.component.AbstractComponent; import com.yahoo.concurrent.DaemonThreadFactory; import com.yahoo.config.model.api.PortInfo; import com.yahoo.config.model.api.ServiceInfo; -import com.yahoo.container.jdisc.jrt.JrtFactory; import com.yahoo.jrt.Request; import com.yahoo.jrt.Spec; import com.yahoo.jrt.Supervisor; import com.yahoo.jrt.Target; +import com.yahoo.jrt.Transport; import com.yahoo.log.LogLevel; import com.yahoo.slime.Cursor; import com.yahoo.vespa.config.server.http.JSONResponse; @@ -40,12 +39,7 @@ public class FileDistributionStatus extends AbstractComponent { enum Status {UNKNOWN, FINISHED, IN_PROGRESS} private final ExecutorService rpcExecutor = Executors.newCachedThreadPool(new DaemonThreadFactory("filedistribution status")); - private final Supervisor supervisor; - - @Inject - public FileDistributionStatus(JrtFactory jrtFactory) { - this.supervisor = jrtFactory.createSupervisor(); - } + private final Supervisor supervisor = new Supervisor(new Transport()); public StatusAllHosts status(Application application, Duration timeout) { List<HostStatus> hostStatuses = new ArrayList<>(); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java index 44b103967d7..16aaef048b5 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/filedistribution/FileServer.java @@ -5,7 +5,6 @@ import com.google.inject.Inject; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.config.FileReference; import com.yahoo.config.subscription.ConfigSourceSet; -import com.yahoo.container.jdisc.jrt.JrtFactory; import com.yahoo.jrt.Int32Value; import com.yahoo.jrt.Request; import com.yahoo.jrt.StringValue; @@ -74,13 +73,13 @@ public class FileServer { @SuppressWarnings("WeakerAccess") // Created by dependency injection @Inject - public FileServer(ConfigserverConfig configserverConfig, JrtFactory jrtFactory) { - this(createConnectionPool(configserverConfig, jrtFactory), new File(Defaults.getDefaults().underVespaHome(configserverConfig.fileReferencesDir()))); + public FileServer(ConfigserverConfig configserverConfig) { + this(createConnectionPool(configserverConfig), new File(Defaults.getDefaults().underVespaHome(configserverConfig.fileReferencesDir()))); } // For testing only - public FileServer(File rootDir, JrtFactory jrtFactory) { - this(new EmptyConnectionPool(jrtFactory), rootDir); + public FileServer(File rootDir) { + this(new EmptyConnectionPool(), rootDir); } private FileServer(ConnectionPool connectionPool, File rootDir) { @@ -197,24 +196,18 @@ public class FileServer { } // Connection pool with all config servers except this one (might be an empty pool if there is only one config server) - private static ConnectionPool createConnectionPool(ConfigserverConfig configserverConfig, JrtFactory jrtFactory) { + private static ConnectionPool createConnectionPool(ConfigserverConfig configserverConfig) { List<String> configServers = ConfigServerSpec.fromConfig(configserverConfig) .stream() .filter(spec -> !spec.getHostName().equals(HostName.getLocalhost())) .map(spec -> "tcp/" + spec.getHostName() + ":" + spec.getConfigServerPort()) .collect(Collectors.toList()); - return configServers.size() > 0 ? new JRTConnectionPool(jrtFactory.createSupervisor(), new ConfigSourceSet(configServers)) : new EmptyConnectionPool(jrtFactory); + return configServers.size() > 0 ? new JRTConnectionPool(new ConfigSourceSet(configServers)) : new EmptyConnectionPool(); } private static class EmptyConnectionPool implements ConnectionPool { - final JrtFactory jrtFactory; - - EmptyConnectionPool(JrtFactory jrtFactory) { - this.jrtFactory = jrtFactory; - } - @Override public void close() {} @@ -231,6 +224,6 @@ public class FileServer { public int getSize() { return 0; } @Override - public Supervisor getSupervisor() { return jrtFactory.createSupervisor(); } + public Supervisor getSupervisor() { return new Supervisor(new Transport()); } } } diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java index 0bc2c70d166..1ce90fad465 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/rpc/RpcServer.java @@ -3,13 +3,12 @@ package com.yahoo.vespa.config.server.rpc; import com.google.inject.Inject; import com.yahoo.cloud.config.ConfigserverConfig; -import com.yahoo.component.Version; import com.yahoo.concurrent.ThreadFactoryFactory; import com.yahoo.config.FileReference; import com.yahoo.config.provision.ApplicationId; import com.yahoo.config.provision.HostLivenessTracker; import com.yahoo.config.provision.TenantName; -import com.yahoo.container.jdisc.jrt.JrtFactory; +import com.yahoo.component.Version; import com.yahoo.jrt.Acceptor; import com.yahoo.jrt.DataValue; import com.yahoo.jrt.Int32Value; @@ -21,6 +20,7 @@ import com.yahoo.jrt.Spec; import com.yahoo.jrt.StringValue; import com.yahoo.jrt.Supervisor; import com.yahoo.jrt.Target; +import com.yahoo.jrt.Transport; import com.yahoo.log.LogLevel; import com.yahoo.vespa.config.ErrorCode; import com.yahoo.vespa.config.JRTMethods; @@ -28,14 +28,14 @@ import com.yahoo.vespa.config.protocol.ConfigResponse; import com.yahoo.vespa.config.protocol.JRTServerConfigRequest; import com.yahoo.vespa.config.protocol.JRTServerConfigRequestV3; import com.yahoo.vespa.config.protocol.Trace; -import com.yahoo.vespa.config.server.GetConfigContext; -import com.yahoo.vespa.config.server.ReloadListener; -import com.yahoo.vespa.config.server.RequestHandler; import com.yahoo.vespa.config.server.SuperModelRequestHandler; import com.yahoo.vespa.config.server.application.ApplicationSet; +import com.yahoo.vespa.config.server.GetConfigContext; import com.yahoo.vespa.config.server.filedistribution.FileServer; import com.yahoo.vespa.config.server.host.HostRegistries; import com.yahoo.vespa.config.server.host.HostRegistry; +import com.yahoo.vespa.config.server.ReloadListener; +import com.yahoo.vespa.config.server.RequestHandler; import com.yahoo.vespa.config.server.monitoring.MetricUpdater; import com.yahoo.vespa.config.server.monitoring.MetricUpdaterFactory; import com.yahoo.vespa.config.server.tenant.TenantHandlerProvider; @@ -80,7 +80,7 @@ public class RpcServer implements Runnable, ReloadListener, TenantListener { private static final String THREADPOOL_NAME = "rpcserver worker pool"; private static final long SHUTDOWN_TIMEOUT = 60; - private final Supervisor supervisor; + private final Supervisor supervisor = new Supervisor(new Transport()); private Spec spec; private final boolean useRequestVersion; private final boolean hostedVespa; @@ -119,10 +119,8 @@ public class RpcServer implements Runnable, ReloadListener, TenantListener { @Inject public RpcServer(ConfigserverConfig config, SuperModelRequestHandler superModelRequestHandler, MetricUpdaterFactory metrics, HostRegistries hostRegistries, - HostLivenessTracker hostLivenessTracker, FileServer fileServer, - JrtFactory jrtFactory) { + HostLivenessTracker hostLivenessTracker, FileServer fileServer) { this.superModelRequestHandler = superModelRequestHandler; - this.supervisor = jrtFactory.createSupervisor(); metricUpdaterFactory = metrics; supervisor.setMaxOutputBufferSize(config.maxoutputbuffersize()); this.metrics = metrics.getOrCreateMetricUpdater(Collections.emptyMap()); diff --git a/configserver/src/main/java/com/yahoo/vespa/config/server/session/FileDistributionFactory.java b/configserver/src/main/java/com/yahoo/vespa/config/server/session/FileDistributionFactory.java index a38386b84a0..15bc3c1fb46 100644 --- a/configserver/src/main/java/com/yahoo/vespa/config/server/session/FileDistributionFactory.java +++ b/configserver/src/main/java/com/yahoo/vespa/config/server/session/FileDistributionFactory.java @@ -3,8 +3,8 @@ package com.yahoo.vespa.config.server.session; import com.google.inject.Inject; import com.yahoo.cloud.config.ConfigserverConfig; -import com.yahoo.container.jdisc.jrt.JrtFactory; import com.yahoo.jrt.Supervisor; +import com.yahoo.jrt.Transport; import com.yahoo.vespa.config.server.filedistribution.FileDistributionImpl; import com.yahoo.vespa.config.server.filedistribution.FileDistributionProvider; @@ -19,12 +19,11 @@ import java.io.File; public class FileDistributionFactory { private final ConfigserverConfig configserverConfig; - private final Supervisor supervisor; + private final Supervisor supervisor = new Supervisor(new Transport()); @Inject - public FileDistributionFactory(ConfigserverConfig configserverConfig, JrtFactory jrtFactory) { + public FileDistributionFactory(ConfigserverConfig configserverConfig) { this.configserverConfig = configserverConfig; - this.supervisor = jrtFactory.createSupervisor(); } public FileDistributionProvider createProvider(File applicationPackage) { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java index fe19a2e7f9c..467f4cc84e8 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/ApplicationRepositoryTest.java @@ -94,7 +94,7 @@ public class ApplicationRepositoryTest { tenantRepository.addTenant(tenant3); orchestrator = new OrchestratorMock(); provisioner = new SessionHandlerTest.MockProvisioner(); - applicationRepository = new ApplicationRepository(tenantRepository, provisioner, orchestrator, clock, new SimpleJrtFactory()); + applicationRepository = new ApplicationRepository(tenantRepository, provisioner, orchestrator, clock); timeoutBudget = new TimeoutBudget(clock, Duration.ofSeconds(60)); } @@ -204,7 +204,7 @@ public class ApplicationRepositoryTest { tenantRepository.addTenant(tenant1); Provisioner provisioner = new SessionHandlerTest.MockProvisioner(); - applicationRepository = new ApplicationRepository(tenantRepository, provisioner, orchestrator, clock, new SimpleJrtFactory()); + applicationRepository = new ApplicationRepository(tenantRepository, provisioner, orchestrator, clock); timeoutBudget = new TimeoutBudget(clock, Duration.ofSeconds(60)); // TODO: Deploy an app with a bundle or file that will be a file reference, too much missing in test setup to get this working now diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistryTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistryTest.java index 518ad836219..b2e911c47a4 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistryTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/InjectedGlobalComponentRegistryTest.java @@ -64,9 +64,8 @@ public class InjectedGlobalComponentRegistryTest { .configServerDBDir(temporaryFolder.newFolder("serverdb").getAbsolutePath()) .configDefinitionsDir(temporaryFolder.newFolder("configdefinitions").getAbsolutePath())); sessionPreparer = new SessionTest.MockSessionPreparer(); - SimpleJrtFactory jrtFactory = new SimpleJrtFactory(); rpcServer = new RpcServer(configserverConfig, null, Metrics.createTestMetrics(), - new HostRegistries(), new ConfigRequestHostLivenessTracker(), new FileServer(temporaryFolder.newFolder("filereferences"), jrtFactory), jrtFactory); + new HostRegistries(), new ConfigRequestHostLivenessTracker(), new FileServer(temporaryFolder.newFolder("filereferences"))); generationCounter = new SuperModelGenerationCounter(curator); defRepo = new StaticConfigDefinitionRepo(); permanentApplicationPackage = new PermanentApplicationPackage(configserverConfig); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/SimpleJrtFactory.java b/configserver/src/test/java/com/yahoo/vespa/config/server/SimpleJrtFactory.java deleted file mode 100644 index 92555400dff..00000000000 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/SimpleJrtFactory.java +++ /dev/null @@ -1,18 +0,0 @@ -// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.vespa.config.server; - -import com.yahoo.container.jdisc.jrt.JrtFactory; -import com.yahoo.jrt.Supervisor; -import com.yahoo.jrt.Transport; - -/** - * @author bjorncs - */ -public class SimpleJrtFactory implements JrtFactory { - - @Override - public Supervisor createSupervisor() { - return new Supervisor(new Transport()); - } - -} diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/application/FileDistributionStatusTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/application/FileDistributionStatusTest.java index 87b85eab1a7..0c27066dd6b 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/application/FileDistributionStatusTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/application/FileDistributionStatusTest.java @@ -10,7 +10,6 @@ import com.yahoo.component.Version; import com.yahoo.container.jdisc.HttpResponse; import com.yahoo.vespa.config.server.ServerCache; import com.yahoo.vespa.config.server.http.SessionHandlerTest; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.monitoring.MetricUpdater; import org.junit.Rule; import org.junit.Test; @@ -186,7 +185,6 @@ public class FileDistributionStatusTest { // host status per host to be returned in getHostStatus() MockStatus(Set<HostStatus> status) { - super(new SimpleJrtFactory()); status.forEach(s -> statuses.put(s.hostname(), s)); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java index 8ad6638cdfd..c96113b9462 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/deploy/DeployTester.java @@ -31,7 +31,6 @@ import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.TimeoutBudget; import com.yahoo.vespa.config.server.application.OrchestratorMock; import com.yahoo.vespa.config.server.http.v2.PrepareResult; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.session.LocalSession; @@ -128,8 +127,7 @@ public class DeployTester { new ProvisionerAdapter(provisioner), new OrchestratorMock(), clock, - configserverConfig, - new SimpleJrtFactory()); + configserverConfig); } public Tenant tenant() { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/filedistribution/FileServerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/filedistribution/FileServerTest.java index a2fe391d4e1..43f5d135e45 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/filedistribution/FileServerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/filedistribution/FileServerTest.java @@ -4,7 +4,6 @@ package com.yahoo.vespa.config.server.filedistribution; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.io.IOUtils; import com.yahoo.net.HostName; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.filedistribution.FileReferenceData; import org.junit.Before; import org.junit.Rule; @@ -32,7 +31,7 @@ public class FileServerTest { @Before public void setup() throws IOException { File rootDir = new File(temporaryFolder.newFolder("fileserver-root").getAbsolutePath()); - fileServer = new FileServer(rootDir, new SimpleJrtFactory()); + fileServer = new FileServer(rootDir); } @Test @@ -97,7 +96,7 @@ public class FileServerTest { private FileServer createFileServer(ConfigserverConfig.Builder configBuilder) throws IOException { File fileReferencesDir = temporaryFolder.newFolder(); configBuilder.fileReferencesDir(fileReferencesDir.getAbsolutePath()); - return new FileServer(new ConfigserverConfig(configBuilder), new SimpleJrtFactory()); + return new FileServer(new ConfigserverConfig(configBuilder)); } private static class FileReceiver implements FileServer.Receiver { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java index 61e2b04539e..b0bb3bf244f 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationContentHandlerTest.java @@ -12,7 +12,6 @@ import com.yahoo.vespa.config.server.ApplicationRepository; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.OrchestratorMock; import com.yahoo.vespa.config.server.http.ContentHandlerTestBase; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.session.Session; import com.yahoo.vespa.config.server.tenant.Tenant; import com.yahoo.vespa.config.server.tenant.TenantBuilder; @@ -69,8 +68,7 @@ public class ApplicationContentHandlerTest extends ContentHandlerTestBase { new ApplicationRepository(tenantRepository, new MockProvisioner(), new OrchestratorMock(), - clock, - new SimpleJrtFactory())); + clock)); pathPrefix = createPath(idTenant1, Zone.defaultZone()); baseUrl = baseServer + pathPrefix; } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java index b14db906c86..2c84e2d8ad4 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/ApplicationHandlerTest.java @@ -21,7 +21,6 @@ import com.yahoo.vespa.config.server.http.HandlerTest; import com.yahoo.vespa.config.server.http.HttpErrorResponse; import com.yahoo.vespa.config.server.http.StaticResponse; import com.yahoo.vespa.config.server.http.SessionHandlerTest; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.provision.HostProvisionerProvider; import com.yahoo.vespa.config.server.session.PrepareParams; import com.yahoo.vespa.config.server.tenant.Tenant; @@ -79,8 +78,7 @@ public class ApplicationHandlerTest { applicationRepository = new ApplicationRepository(tenantRepository, provisioner, orchestrator, - Clock.systemUTC(), - new SimpleJrtFactory()); + Clock.systemUTC()); listApplicationsHandler = new ListApplicationsHandler(ListApplicationsHandler.testOnlyContext(), tenantRepository, Zone.defaultZone()); @@ -167,8 +165,7 @@ public class ApplicationHandlerTest { new ConfigConvergenceChecker(stateApiFactory), mockHttpProxy, new ConfigserverConfig(new ConfigserverConfig.Builder()), - new OrchestratorMock(), - new SimpleJrtFactory()); + new OrchestratorMock()); ApplicationHandler mockHandler = createApplicationHandler(applicationRepository); when(mockHttpProxy.get(any(), eq(host), eq("container-clustercontroller"), eq("clustercontroller-status/v1/clusterName1"))) .thenReturn(new StaticResponse(200, "text/html", "<html>...</html>")); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java index a7efa09a281..f384fda8796 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionActiveHandlerTest.java @@ -32,7 +32,6 @@ import com.yahoo.vespa.config.server.http.HandlerTest; import com.yahoo.vespa.config.server.http.HttpErrorResponse; import com.yahoo.vespa.config.server.http.SessionHandler; import com.yahoo.vespa.config.server.http.SessionHandlerTest; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.modelfactory.ModelFactoryRegistry; import com.yahoo.vespa.config.server.session.LocalSession; import com.yahoo.vespa.config.server.session.LocalSessionRepo; @@ -368,8 +367,7 @@ public class SessionActiveHandlerTest extends SessionHandlerTest { new ApplicationRepository(tenantRepository, hostProvisioner, new OrchestratorMock(), - clock, - new SimpleJrtFactory()), + clock), tenantRepository, Zone.defaultZone()); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java index 75105e5e338..42b3fadc0de 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionContentHandlerTest.java @@ -13,7 +13,6 @@ import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.OrchestratorMock; import com.yahoo.vespa.config.server.http.ContentHandlerTestBase; import com.yahoo.vespa.config.server.http.SessionHandlerTest; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.tenant.TenantBuilder; import com.yahoo.vespa.config.server.tenant.TenantRepository; import org.apache.commons.io.FileUtils; @@ -174,7 +173,7 @@ public class SessionContentHandlerTest extends ContentHandlerTestBase { new ApplicationRepository(tenantRepository, new SessionHandlerTest.MockProvisioner(), new OrchestratorMock(), - clock, new SimpleJrtFactory()), + clock), tenantRepository); } } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java index 52f2b099828..803a87ada1c 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionCreateHandlerTest.java @@ -15,7 +15,6 @@ import com.yahoo.vespa.config.server.http.CompressedApplicationInputStreamTest; import com.yahoo.vespa.config.server.http.HandlerTest; import com.yahoo.vespa.config.server.http.HttpErrorResponse; import com.yahoo.vespa.config.server.http.SessionHandlerTest; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.session.LocalSessionRepo; import com.yahoo.vespa.config.server.tenant.TenantBuilder; import com.yahoo.vespa.config.server.tenant.TenantRepository; @@ -230,8 +229,7 @@ public class SessionCreateHandlerTest extends SessionHandlerTest { new ApplicationRepository(tenantRepository, new SessionHandlerTest.MockProvisioner(), new OrchestratorMock(), - clock, - new SimpleJrtFactory()), + clock), tenantRepository, componentRegistry.getConfigserverConfig()); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java index 9007ef1abad..330d6592a2d 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/SessionPrepareHandlerTest.java @@ -28,7 +28,6 @@ import com.yahoo.vespa.config.server.configchange.ConfigChangeActions; import com.yahoo.vespa.config.server.configchange.MockRefeedAction; import com.yahoo.vespa.config.server.configchange.MockRestartAction; import com.yahoo.vespa.config.server.http.*; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.session.*; import com.yahoo.vespa.config.server.tenant.TenantBuilder; import com.yahoo.vespa.config.server.tenant.TenantRepository; @@ -387,8 +386,7 @@ public class SessionPrepareHandlerTest extends SessionHandlerTest { new ApplicationRepository(tenantRepository, new MockProvisioner(), new OrchestratorMock(), - clock, - new SimpleJrtFactory()), + clock), tenantRepository, componentRegistry.getConfigserverConfig()); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java index e0f8b225a4a..6effa3359b1 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/http/v2/TenantHandlerTest.java @@ -17,7 +17,6 @@ import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.OrchestratorMock; import com.yahoo.vespa.config.server.http.SessionHandlerTest; import com.yahoo.vespa.config.server.http.SessionResponse; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.tenant.Tenant; import com.yahoo.vespa.config.server.tenant.TenantRepository; import com.yahoo.vespa.curator.mock.MockCurator; @@ -43,8 +42,7 @@ public class TenantHandlerTest { new ApplicationRepository(tenantRepository, new SessionHandlerTest.MockProvisioner(), new OrchestratorMock(), - Clock.systemUTC(), - new SimpleJrtFactory()); + Clock.systemUTC()); handler = new TenantHandler(TenantHandler.testOnlyContext(), tenantRepository, applicationRepository); } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java index c4e7e4d34e1..659baf5a184 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/maintenance/MaintainerTester.java @@ -6,7 +6,6 @@ import com.yahoo.vespa.config.server.GlobalComponentRegistry; import com.yahoo.vespa.config.server.TestComponentRegistry; import com.yahoo.vespa.config.server.application.OrchestratorMock; import com.yahoo.vespa.config.server.http.SessionHandlerTest; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.tenant.TenantRepository; import com.yahoo.vespa.curator.Curator; import com.yahoo.vespa.curator.mock.MockCurator; @@ -26,8 +25,7 @@ class MaintainerTester { applicationRepository = new ApplicationRepository(tenantRepository, new SessionHandlerTest.MockProvisioner(), new OrchestratorMock(), - Clock.systemUTC(), - new SimpleJrtFactory()); + Clock.systemUTC()); } Curator curator() { return curator; } diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpc.java b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpc.java index f771a5499da..0f8bfa5068c 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpc.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/MockRpc.java @@ -4,14 +4,12 @@ package com.yahoo.vespa.config.server.rpc; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.config.provision.TenantName; import com.yahoo.component.Version; -import com.yahoo.container.jdisc.jrt.JrtFactory; import com.yahoo.vespa.config.protocol.ConfigResponse; import com.yahoo.vespa.config.protocol.JRTServerConfigRequest; import com.yahoo.vespa.config.server.GetConfigContext; import com.yahoo.vespa.config.server.filedistribution.FileServer; import com.yahoo.vespa.config.server.host.ConfigRequestHostLivenessTracker; import com.yahoo.vespa.config.server.host.HostRegistries; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.tenant.MockTenantProvider; @@ -38,16 +36,16 @@ public class MockRpc extends RpcServer { public volatile JRTServerConfigRequest latestRequest = null; - public MockRpc(int port, boolean createDefaultTenant, boolean pretendToHaveLoadedAnyApplication, File tempDir, JrtFactory jrtFactory) { - super(createConfig(port), null, Metrics.createTestMetrics(), - new HostRegistries(), new ConfigRequestHostLivenessTracker(), new FileServer(tempDir, jrtFactory), jrtFactory); + public MockRpc(int port, boolean createDefaultTenant, boolean pretendToHaveLoadedAnyApplication, File tempDir) { + super(createConfig(port), null, Metrics.createTestMetrics(), + new HostRegistries(), new ConfigRequestHostLivenessTracker(), new FileServer(tempDir)); if (createDefaultTenant) { onTenantCreate(TenantName.from("default"), new MockTenantProvider(pretendToHaveLoadedAnyApplication)); } } public MockRpc(int port, boolean createDefaultTenant, File tempDir) { - this(port, createDefaultTenant, true, tempDir, new SimpleJrtFactory()); + this(port, createDefaultTenant, true, tempDir); } public MockRpc(int port, File tempDir) { diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java index 733e414823d..3849fc899de 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/rpc/RpcTester.java @@ -15,7 +15,6 @@ import com.yahoo.vespa.config.server.*; import com.yahoo.vespa.config.server.filedistribution.FileServer; import com.yahoo.vespa.config.server.host.ConfigRequestHostLivenessTracker; import com.yahoo.vespa.config.server.host.HostRegistries; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import com.yahoo.vespa.config.server.monitoring.Metrics; import com.yahoo.vespa.config.server.tenant.MockTenantProvider; import com.yahoo.vespa.config.server.tenant.TenantHandlerProvider; @@ -83,7 +82,6 @@ public class RpcTester implements AutoCloseable { void createAndStartRpcServer() throws IOException { ConfigserverConfig configserverConfig = new ConfigserverConfig(new ConfigserverConfig.Builder()); - SimpleJrtFactory jrtFactory = new SimpleJrtFactory(); rpcServer = new RpcServer(new ConfigserverConfig(new ConfigserverConfig.Builder() .rpcport(port) .numRpcThreads(1) @@ -95,8 +93,7 @@ public class RpcTester implements AutoCloseable { emptyNodeFlavors(), generationCounter)), Metrics.createTestMetrics(), new HostRegistries(), - hostLivenessTracker, new FileServer(temporaryFolder.newFolder(), jrtFactory), - jrtFactory); + hostLivenessTracker, new FileServer(temporaryFolder.newFolder())); rpcServer.onTenantCreate(TenantName.from("default"), tenantProvider); t = new Thread(rpcServer); t.start(); diff --git a/configserver/src/test/java/com/yahoo/vespa/config/server/session/MockFileDistributionFactory.java b/configserver/src/test/java/com/yahoo/vespa/config/server/session/MockFileDistributionFactory.java index dc734ac789c..e1874c622c2 100644 --- a/configserver/src/test/java/com/yahoo/vespa/config/server/session/MockFileDistributionFactory.java +++ b/configserver/src/test/java/com/yahoo/vespa/config/server/session/MockFileDistributionFactory.java @@ -4,7 +4,6 @@ package com.yahoo.vespa.config.server.session; import com.yahoo.cloud.config.ConfigserverConfig; import com.yahoo.vespa.config.server.filedistribution.FileDistributionProvider; import com.yahoo.vespa.config.server.filedistribution.MockFileDistributionProvider; -import com.yahoo.vespa.config.server.SimpleJrtFactory; import java.io.File; @@ -16,7 +15,7 @@ public class MockFileDistributionFactory extends FileDistributionFactory { public final MockFileDistributionProvider mockFileDistributionProvider; public MockFileDistributionFactory(ConfigserverConfig configserverConfig) { - super(configserverConfig, new SimpleJrtFactory()); + super(configserverConfig); mockFileDistributionProvider = new MockFileDistributionProvider(new File(configserverConfig.fileReferencesDir())); } diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/DefaultJrtFactory.java b/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/DefaultJrtFactory.java deleted file mode 100644 index 93a72e200e0..00000000000 --- a/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/DefaultJrtFactory.java +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.container.jdisc.jrt; - -import com.google.inject.Inject; -import com.yahoo.component.AbstractComponent; -import com.yahoo.jdisc.Metric; -import com.yahoo.jrt.Supervisor; -import com.yahoo.jrt.Transport; - -/** - * The default factory for JRT {@link Supervisor}. Tracks jrt metrics. - * - * @author bjorncs - */ -public class DefaultJrtFactory extends AbstractComponent implements JrtFactory { - - private final JrtMetricsUpdater metricsUpdater; - - @Inject - public DefaultJrtFactory(Metric metric) { - this.metricsUpdater = new JrtMetricsUpdater(metric); - } - - @Override - public Supervisor createSupervisor() { - Supervisor supervisor = new Supervisor(new Transport()); - metricsUpdater.register(supervisor); - return supervisor; - } - - @Override - public void deconstruct() { - metricsUpdater.stop(); - } -} diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/JrtFactory.java b/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/JrtFactory.java deleted file mode 100644 index 052aaad1bd7..00000000000 --- a/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/JrtFactory.java +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.container.jdisc.jrt; - -import com.yahoo.jrt.Supervisor; - -/** - * A factory for JRT {@link Supervisor} - * - * @author bjorncs - */ -public interface JrtFactory { - - Supervisor createSupervisor(); - -} diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/JrtMetricsUpdater.java b/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/JrtMetricsUpdater.java deleted file mode 100644 index ede0f060ec9..00000000000 --- a/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/JrtMetricsUpdater.java +++ /dev/null @@ -1,70 +0,0 @@ -// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -package com.yahoo.container.jdisc.jrt; - -import com.google.inject.Inject; -import com.yahoo.jdisc.Metric; -import com.yahoo.jrt.Supervisor; -import com.yahoo.jrt.TransportMetrics; - -import java.util.Map; -import java.util.Timer; -import java.util.TimerTask; -import java.util.WeakHashMap; - -/** - * Propagates JRT metric values ({@link TransportMetrics} to {@link Metric}. - * - * @author bjorncs - */ -public class JrtMetricsUpdater { - - private final Object monitor = new Object(); - private final Timer timer = new Timer("jrt-metrics-updater", true); - private final Map<TransportMetrics, Metric.Context> transportMetricsInstances = new WeakHashMap<>(); - private final Metric metric; - - @Inject - public JrtMetricsUpdater(Metric metric) { - this.metric = metric; - timer.scheduleAtFixedRate(new UpdaterTask(), /*delay ms*/0, /*period ms*/10_000); - } - - public void register(Supervisor supervisor) { - register(supervisor, null); - } - - public void register(Supervisor supervisor, Map<String, ?> dimensions) { - synchronized (monitor) { - this.transportMetricsInstances.put(supervisor.transport().metrics(), metric.createContext(dimensions)); - } - } - - public void deregister(Supervisor supervisor) { - synchronized (monitor) { - this.transportMetricsInstances.remove(supervisor.transport().metrics()); - } - } - - public void stop() { - timer.cancel(); - synchronized (monitor) { - this.transportMetricsInstances.clear(); - } - } - - private class UpdaterTask extends TimerTask { - @Override - public void run() { - synchronized (monitor) { - transportMetricsInstances.forEach((instance, context) -> { - metric.add("jrt.transport.tls-certificate-verification-failures", instance.tlsCertificateVerificationFailures(), context); - metric.add("jrt.transport.peer-authorization-failures", instance.peerAuthorizationFailures(), context); - metric.add("jrt.transport.server.tls-connections-established", instance.serverTlsConnectionsEstablished(), context); - metric.add("jrt.transport.client.tls-connections-established", instance.clientTlsConnectionsEstablished(), context); - metric.add("jrt.transport.server.unencrypted-connections-established", instance.serverUnencryptedConnectionsEstablished(), context); - metric.add("jrt.transport.client.unencrypted-connections-established", instance.clientUnencryptedConnectionsEstablished(), context); - }); - } - } - } -} diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/package-info.java b/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/package-info.java deleted file mode 100644 index a584a9b4fb7..00000000000 --- a/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -// Copyright 2019 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -/** - * @author bjorncs - */ -@ExportPackage -package com.yahoo.container.jdisc.jrt; - -import com.yahoo.osgi.annotation.ExportPackage;
\ No newline at end of file diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/metric/JrtMetrics.java b/container-disc/src/main/java/com/yahoo/container/jdisc/metric/JrtMetrics.java new file mode 100644 index 00000000000..1fff1b2ab33 --- /dev/null +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/metric/JrtMetrics.java @@ -0,0 +1,35 @@ +// Copyright 2019 Oath Inc. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. +package com.yahoo.container.jdisc.metric; + +import com.yahoo.jdisc.Metric; +import com.yahoo.jrt.TransportMetrics; + +import static com.yahoo.jrt.TransportMetrics.Snapshot; + +/** + * Emits jrt metrics + * + * @author bjorncs + */ +class JrtMetrics { + + private final TransportMetrics transportMetrics = TransportMetrics.getInstance(); + private final Metric metric; + private Snapshot previousSnapshot = transportMetrics.snapshot(); + + JrtMetrics(Metric metric) { + this.metric = metric; + } + + void emitMetrics() { + Snapshot snapshot = transportMetrics.snapshot(); + Snapshot changesSincePrevious = snapshot.changesSince(previousSnapshot); + metric.add("jrt.transport.tls-certificate-verification-failures", changesSincePrevious.tlsCertificateVerificationFailures(), null); + metric.add("jrt.transport.peer-authorization-failures", changesSincePrevious.peerAuthorizationFailures(), null); + metric.add("jrt.transport.server.tls-connections-established", changesSincePrevious.serverTlsConnectionsEstablished(), null); + metric.add("jrt.transport.client.tls-connections-established", changesSincePrevious.clientTlsConnectionsEstablished(), null); + metric.add("jrt.transport.server.unencrypted-connections-established", changesSincePrevious.serverUnencryptedConnectionsEstablished(), null); + metric.add("jrt.transport.client.unencrypted-connections-established", changesSincePrevious.clientUnencryptedConnectionsEstablished(), null); + previousSnapshot = snapshot; + } +} diff --git a/container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricUpdater.java b/container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricUpdater.java index 98787eaeeeb..e11622b1fa3 100644 --- a/container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricUpdater.java +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/metric/MetricUpdater.java @@ -88,11 +88,13 @@ public class MetricUpdater extends AbstractComponent { private final Metric metric; private final ContainerWatchdogMetrics containerWatchdogMetrics; private final GarbageCollectionMetrics garbageCollectionMetrics; + private final JrtMetrics jrtMetrics; public UpdaterTask(Metric metric, ContainerWatchdogMetrics containerWatchdogMetrics) { this.metric = metric; this.containerWatchdogMetrics = containerWatchdogMetrics; this.garbageCollectionMetrics = new GarbageCollectionMetrics(Clock.systemUTC()); + this.jrtMetrics = new JrtMetrics(metric); } @SuppressWarnings("deprecation") @@ -109,6 +111,7 @@ public class MetricUpdater extends AbstractComponent { containerWatchdogMetrics.emitMetrics(metric); garbageCollectionMetrics.emitMetrics(metric); + jrtMetrics.emitMetrics(); } } diff --git a/jrt/src/com/yahoo/jrt/CryptoEngine.java b/jrt/src/com/yahoo/jrt/CryptoEngine.java index 41a567a83f2..81bf10be187 100644 --- a/jrt/src/com/yahoo/jrt/CryptoEngine.java +++ b/jrt/src/com/yahoo/jrt/CryptoEngine.java @@ -18,7 +18,7 @@ import java.nio.channels.SocketChannel; * encryption. **/ public interface CryptoEngine extends AutoCloseable { - CryptoSocket createCryptoSocket(TransportMetrics metrics, SocketChannel channel, boolean isServer); + CryptoSocket createCryptoSocket(SocketChannel channel, boolean isServer); static CryptoEngine createDefault() { if (!TransportSecurityUtils.isTransportSecurityEnabled()) { return new NullCryptoEngine(); diff --git a/jrt/src/com/yahoo/jrt/MaybeTlsCryptoEngine.java b/jrt/src/com/yahoo/jrt/MaybeTlsCryptoEngine.java index a0d56281744..801f2075c4e 100644 --- a/jrt/src/com/yahoo/jrt/MaybeTlsCryptoEngine.java +++ b/jrt/src/com/yahoo/jrt/MaybeTlsCryptoEngine.java @@ -21,13 +21,13 @@ public class MaybeTlsCryptoEngine implements CryptoEngine { } @Override - public CryptoSocket createCryptoSocket(TransportMetrics metrics, SocketChannel channel, boolean isServer) { + public CryptoSocket createCryptoSocket(SocketChannel channel, boolean isServer) { if (isServer) { - return new MaybeTlsCryptoSocket(metrics, channel, tlsEngine, isServer); + return new MaybeTlsCryptoSocket(channel, tlsEngine, isServer); } else if (useTlsWhenClient) { - return tlsEngine.createCryptoSocket(metrics, channel, false); + return tlsEngine.createCryptoSocket(channel, false); } else { - return new NullCryptoSocket(metrics, channel, isServer); + return new NullCryptoSocket(channel, isServer); } } diff --git a/jrt/src/com/yahoo/jrt/MaybeTlsCryptoSocket.java b/jrt/src/com/yahoo/jrt/MaybeTlsCryptoSocket.java index ba34bed11c0..2e0d41b28d1 100644 --- a/jrt/src/com/yahoo/jrt/MaybeTlsCryptoSocket.java +++ b/jrt/src/com/yahoo/jrt/MaybeTlsCryptoSocket.java @@ -56,13 +56,12 @@ public class MaybeTlsCryptoSocket implements CryptoSocket { private class MyCryptoSocket extends NullCryptoSocket { - private final TransportMetrics metrics; + private final TransportMetrics metrics = TransportMetrics.getInstance(); private TlsCryptoEngine factory; private Buffer buffer; - MyCryptoSocket(TransportMetrics metrics, SocketChannel channel, TlsCryptoEngine factory, boolean isServer) { - super(metrics, channel, isServer); - this.metrics = metrics; + MyCryptoSocket(SocketChannel channel, TlsCryptoEngine factory, boolean isServer) { + super(channel, isServer); this.factory = factory; this.buffer = new Buffer(4096); } @@ -81,7 +80,7 @@ public class MaybeTlsCryptoSocket implements CryptoSocket { data[i] = src.get(i); } if (looksLikeTlsToMe(data)) { - TlsCryptoSocket tlsSocket = factory.createCryptoSocket(metrics, channel(), true); + TlsCryptoSocket tlsSocket = factory.createCryptoSocket(channel(), true); tlsSocket.injectReadData(buffer); socket = tlsSocket; return socket.handshake(); @@ -117,8 +116,8 @@ public class MaybeTlsCryptoSocket implements CryptoSocket { } } - public MaybeTlsCryptoSocket(TransportMetrics metrics, SocketChannel channel, TlsCryptoEngine factory, boolean isServer) { - this.socket = new MyCryptoSocket(metrics, channel, factory, isServer); + public MaybeTlsCryptoSocket(SocketChannel channel, TlsCryptoEngine factory, boolean isServer) { + this.socket = new MyCryptoSocket(channel, factory, isServer); } @Override public SocketChannel channel() { return socket.channel(); } diff --git a/jrt/src/com/yahoo/jrt/NullCryptoEngine.java b/jrt/src/com/yahoo/jrt/NullCryptoEngine.java index 7a7773ed855..b5a53accf92 100644 --- a/jrt/src/com/yahoo/jrt/NullCryptoEngine.java +++ b/jrt/src/com/yahoo/jrt/NullCryptoEngine.java @@ -9,7 +9,7 @@ import java.nio.channels.SocketChannel; * CryptoEngine implementation that performs no encryption. **/ public class NullCryptoEngine implements CryptoEngine { - @Override public CryptoSocket createCryptoSocket(TransportMetrics metrics, SocketChannel channel, boolean isServer) { - return new NullCryptoSocket(metrics, channel, isServer); + @Override public CryptoSocket createCryptoSocket(SocketChannel channel, boolean isServer) { + return new NullCryptoSocket(channel, isServer); } } diff --git a/jrt/src/com/yahoo/jrt/NullCryptoSocket.java b/jrt/src/com/yahoo/jrt/NullCryptoSocket.java index 1473f288306..0d7b83f1c7d 100644 --- a/jrt/src/com/yahoo/jrt/NullCryptoSocket.java +++ b/jrt/src/com/yahoo/jrt/NullCryptoSocket.java @@ -13,17 +13,14 @@ import java.nio.channels.SocketChannel; public class NullCryptoSocket implements CryptoSocket { private final boolean isServer; private SocketChannel channel; - private TransportMetrics metrics; - public NullCryptoSocket(TransportMetrics metrics, SocketChannel channel, boolean isServer) { this.metrics = metrics; this.channel = channel; this.isServer = isServer; } + private final TransportMetrics metrics = TransportMetrics.getInstance(); + public NullCryptoSocket(SocketChannel channel, boolean isServer) { this.channel = channel; this.isServer = isServer; } @Override public SocketChannel channel() { return channel; } @Override public HandshakeResult handshake() throws IOException { - if (metrics != null) { - if (isServer) { - metrics.incrementServerUnencryptedConnectionsEstablished(); - } else { - metrics.incrementClientUnencryptedConnectionsEstablished(); - } - metrics = null; + if (isServer) { + metrics.incrementServerUnencryptedConnectionsEstablished(); + } else { + metrics.incrementClientUnencryptedConnectionsEstablished(); } return HandshakeResult.DONE; } diff --git a/jrt/src/com/yahoo/jrt/TlsCryptoEngine.java b/jrt/src/com/yahoo/jrt/TlsCryptoEngine.java index 7e5e6fd9dc4..41302a4c725 100644 --- a/jrt/src/com/yahoo/jrt/TlsCryptoEngine.java +++ b/jrt/src/com/yahoo/jrt/TlsCryptoEngine.java @@ -20,11 +20,11 @@ public class TlsCryptoEngine implements CryptoEngine { } @Override - public TlsCryptoSocket createCryptoSocket(TransportMetrics metrics, SocketChannel channel, boolean isServer) { + public TlsCryptoSocket createCryptoSocket(SocketChannel channel, boolean isServer) { SSLEngine sslEngine = tlsContext.createSslEngine(); sslEngine.setNeedClientAuth(true); sslEngine.setUseClientMode(!isServer); - return new TlsCryptoSocket(metrics, channel, sslEngine); + return new TlsCryptoSocket(channel, sslEngine); } @Override diff --git a/jrt/src/com/yahoo/jrt/TlsCryptoSocket.java b/jrt/src/com/yahoo/jrt/TlsCryptoSocket.java index 184b8824877..f25a45169a8 100644 --- a/jrt/src/com/yahoo/jrt/TlsCryptoSocket.java +++ b/jrt/src/com/yahoo/jrt/TlsCryptoSocket.java @@ -31,7 +31,7 @@ public class TlsCryptoSocket implements CryptoSocket { private enum HandshakeState { NOT_STARTED, NEED_READ, NEED_WRITE, COMPLETED } - private final TransportMetrics metrics; + private final TransportMetrics metrics = TransportMetrics.getInstance(); private final SocketChannel channel; private final SSLEngine sslEngine; private final Buffer wrapBuffer; @@ -42,8 +42,7 @@ public class TlsCryptoSocket implements CryptoSocket { private HandshakeState handshakeState; private AuthorizationResult authorizationResult; - public TlsCryptoSocket(TransportMetrics metrics, SocketChannel channel, SSLEngine sslEngine) { - this.metrics = metrics; + public TlsCryptoSocket(SocketChannel channel, SSLEngine sslEngine) { this.channel = channel; this.sslEngine = sslEngine; SSLSession nullSession = sslEngine.getSession(); diff --git a/jrt/src/com/yahoo/jrt/Transport.java b/jrt/src/com/yahoo/jrt/Transport.java index 717c39d403b..8da4c737f79 100644 --- a/jrt/src/com/yahoo/jrt/Transport.java +++ b/jrt/src/com/yahoo/jrt/Transport.java @@ -77,7 +77,7 @@ public class Transport { private Scheduler scheduler; private int state; private Selector selector; - private final TransportMetrics metrics = new TransportMetrics(); + private final TransportMetrics metrics = TransportMetrics.getInstance(); private void handleAddConnection(Connection conn) { if (conn.isClosed()) { @@ -197,7 +197,7 @@ public class Transport { * @param isServer flag indicating which end of the connection we are **/ CryptoSocket createCryptoSocket(SocketChannel channel, boolean isServer) { - return cryptoEngine.createCryptoSocket(metrics, channel, isServer); + return cryptoEngine.createCryptoSocket(channel, isServer); } /** diff --git a/jrt/src/com/yahoo/jrt/TransportMetrics.java b/jrt/src/com/yahoo/jrt/TransportMetrics.java index e0afbc495e7..507a925572f 100644 --- a/jrt/src/com/yahoo/jrt/TransportMetrics.java +++ b/jrt/src/com/yahoo/jrt/TransportMetrics.java @@ -2,6 +2,7 @@ package com.yahoo.jrt; import java.util.concurrent.atomic.AtomicLong; +import java.util.function.ToLongFunction; /** * Metric values produced by {@link Transport}. @@ -10,6 +11,8 @@ import java.util.concurrent.atomic.AtomicLong; */ public class TransportMetrics { + private static final TransportMetrics instance = new TransportMetrics(); + private final AtomicLong tlsCertificateVerificationFailures = new AtomicLong(0); private final AtomicLong peerAuthorizationFailures = new AtomicLong(0); private final AtomicLong serverTlsConnectionsEstablished = new AtomicLong(0); @@ -17,6 +20,10 @@ public class TransportMetrics { private final AtomicLong serverUnencryptedConnectionsEstablished = new AtomicLong(0); private final AtomicLong clientUnencryptedConnectionsEstablished = new AtomicLong(0); + private TransportMetrics() {} + + public static TransportMetrics getInstance() { return instance; } + public long tlsCertificateVerificationFailures() { return tlsCertificateVerificationFailures.get(); } @@ -41,6 +48,8 @@ public class TransportMetrics { return clientUnencryptedConnectionsEstablished.get(); } + public Snapshot snapshot() { return new Snapshot(this); } + void incrementTlsCertificateVerificationFailures() { tlsCertificateVerificationFailures.incrementAndGet(); } @@ -76,4 +85,69 @@ public class TransportMetrics { ", clientUnencryptedConnectionsEstablished=" + clientUnencryptedConnectionsEstablished + '}'; } + + public static class Snapshot { + private final long tlsCertificateVerificationFailures; + private final long peerAuthorizationFailures; + private final long serverTlsConnectionsEstablished; + private final long clientTlsConnectionsEstablished; + private final long serverUnencryptedConnectionsEstablished; + private final long clientUnencryptedConnectionsEstablished; + + private Snapshot(TransportMetrics metrics) { + this(metrics.tlsCertificateVerificationFailures.get(), + metrics.peerAuthorizationFailures.get(), + metrics.serverTlsConnectionsEstablished.get(), + metrics.clientTlsConnectionsEstablished.get(), + metrics.serverUnencryptedConnectionsEstablished.get(), + metrics.clientUnencryptedConnectionsEstablished.get()); + } + + private Snapshot(long tlsCertificateVerificationFailures, + long peerAuthorizationFailures, + long serverTlsConnectionsEstablished, + long clientTlsConnectionsEstablished, + long serverUnencryptedConnectionsEstablished, + long clientUnencryptedConnectionsEstablished) { + this.tlsCertificateVerificationFailures = tlsCertificateVerificationFailures; + this.peerAuthorizationFailures = peerAuthorizationFailures; + this.serverTlsConnectionsEstablished = serverTlsConnectionsEstablished; + this.clientTlsConnectionsEstablished = clientTlsConnectionsEstablished; + this.serverUnencryptedConnectionsEstablished = serverUnencryptedConnectionsEstablished; + this.clientUnencryptedConnectionsEstablished = clientUnencryptedConnectionsEstablished; + } + + public long tlsCertificateVerificationFailures() { return tlsCertificateVerificationFailures; } + public long peerAuthorizationFailures() { return peerAuthorizationFailures; } + public long serverTlsConnectionsEstablished() { return serverTlsConnectionsEstablished; } + public long clientTlsConnectionsEstablished() { return clientTlsConnectionsEstablished; } + public long serverUnencryptedConnectionsEstablished() { return serverUnencryptedConnectionsEstablished; } + public long clientUnencryptedConnectionsEstablished() { return clientUnencryptedConnectionsEstablished; } + + public Snapshot changesSince(Snapshot base) { + return new Snapshot( + changesSince(base, Snapshot::tlsCertificateVerificationFailures), + changesSince(base, Snapshot::peerAuthorizationFailures), + changesSince(base, Snapshot::serverTlsConnectionsEstablished), + changesSince(base, Snapshot::clientTlsConnectionsEstablished), + changesSince(base, Snapshot::serverUnencryptedConnectionsEstablished), + changesSince(base, Snapshot::clientUnencryptedConnectionsEstablished)); + } + + private long changesSince(Snapshot base, ToLongFunction<Snapshot> metricProperty) { + return metricProperty.applyAsLong(this) - metricProperty.applyAsLong(base); + } + + @Override + public String toString() { + return "Snapshot{" + + "tlsCertificateVerificationFailures=" + tlsCertificateVerificationFailures + + ", peerAuthorizationFailures=" + peerAuthorizationFailures + + ", serverTlsConnectionsEstablished=" + serverTlsConnectionsEstablished + + ", clientTlsConnectionsEstablished=" + clientTlsConnectionsEstablished + + ", serverUnencryptedConnectionsEstablished=" + serverUnencryptedConnectionsEstablished + + ", clientUnencryptedConnectionsEstablished=" + clientUnencryptedConnectionsEstablished + + '}'; + } + } } diff --git a/jrt/src/com/yahoo/jrt/XorCryptoEngine.java b/jrt/src/com/yahoo/jrt/XorCryptoEngine.java index 6912a58e394..4ba6d00faa4 100644 --- a/jrt/src/com/yahoo/jrt/XorCryptoEngine.java +++ b/jrt/src/com/yahoo/jrt/XorCryptoEngine.java @@ -11,7 +11,7 @@ import java.nio.channels.SocketChannel; * from TLS. **/ public class XorCryptoEngine implements CryptoEngine { - @Override public CryptoSocket createCryptoSocket(TransportMetrics metrics, SocketChannel channel, boolean isServer) { + @Override public CryptoSocket createCryptoSocket(SocketChannel channel, boolean isServer) { return new XorCryptoSocket(channel, isServer); } } diff --git a/jrt/tests/com/yahoo/jrt/EchoTest.java b/jrt/tests/com/yahoo/jrt/EchoTest.java index 1c600e0918c..8fe98ff3510 100644 --- a/jrt/tests/com/yahoo/jrt/EchoTest.java +++ b/jrt/tests/com/yahoo/jrt/EchoTest.java @@ -16,6 +16,8 @@ import static org.junit.Assert.assertTrue; @RunWith(Parameterized.class) public class EchoTest { + TransportMetrics metrics; + TransportMetrics.Snapshot startSnapshot; Supervisor server; Acceptor acceptor; Supervisor client; @@ -23,7 +25,7 @@ public class EchoTest { Values refValues; private interface MetricsAssertions { - void assertMetrics(TransportMetrics serverMetrics, TransportMetrics clientMetrics) throws AssertionError; + void assertMetrics(TransportMetrics.Snapshot snapshot) throws AssertionError; } @Parameter(value = 0) public CryptoEngine crypto; @@ -34,33 +36,35 @@ public class EchoTest { return new Object[][] { { new NullCryptoEngine(), - (MetricsAssertions) (serverMetrics, clientMetrics) -> { - assertEquals(1, serverMetrics.serverUnencryptedConnectionsEstablished()); - assertEquals(1, clientMetrics.clientUnencryptedConnectionsEstablished()); + (MetricsAssertions) metrics -> { + assertEquals(1, metrics.serverUnencryptedConnectionsEstablished()); + assertEquals(1, metrics.clientUnencryptedConnectionsEstablished()); }}, {new XorCryptoEngine(), null}, { new TlsCryptoEngine(createTestTlsContext()), - (MetricsAssertions) (serverMetrics, clientMetrics) -> { - assertEquals(1, serverMetrics.serverTlsConnectionsEstablished()); - assertEquals(1, clientMetrics.clientTlsConnectionsEstablished()); + (MetricsAssertions) metrics -> { + assertEquals(1, metrics.serverTlsConnectionsEstablished()); + assertEquals(1, metrics.clientTlsConnectionsEstablished()); }}, { new MaybeTlsCryptoEngine(new TlsCryptoEngine(createTestTlsContext()), false), - (MetricsAssertions) (serverMetrics, clientMetrics) -> { - assertEquals(1, serverMetrics.serverUnencryptedConnectionsEstablished()); - assertEquals(1, clientMetrics.clientUnencryptedConnectionsEstablished()); + (MetricsAssertions) metrics -> { + assertEquals(1, metrics.serverUnencryptedConnectionsEstablished()); + assertEquals(1, metrics.clientUnencryptedConnectionsEstablished()); }}, { new MaybeTlsCryptoEngine(new TlsCryptoEngine(createTestTlsContext()), true), - (MetricsAssertions) (serverMetrics, clientMetrics) -> { - assertEquals(1, serverMetrics.serverTlsConnectionsEstablished()); - assertEquals(1, clientMetrics.clientTlsConnectionsEstablished()); + (MetricsAssertions) metrics -> { + assertEquals(1, metrics.serverTlsConnectionsEstablished()); + assertEquals(1, metrics.clientTlsConnectionsEstablished()); }}}; } @Before public void setUp() throws ListenFailedException { + metrics = TransportMetrics.getInstance(); + startSnapshot = metrics.snapshot(); server = new Supervisor(new Transport(crypto)); client = new Supervisor(new Transport(crypto)); acceptor = server.listen(new Spec(0)); @@ -131,7 +135,7 @@ public class EchoTest { assertTrue(Test.equals(req.returnValues(), refValues)); assertTrue(Test.equals(req.parameters(), refValues)); if (metricsAssertions != null) { - metricsAssertions.assertMetrics(server.transport().metrics(), client.transport().metrics()); + metricsAssertions.assertMetrics(metrics.snapshot().changesSince(startSnapshot)); } } } |