From 299d205912af1b3ebdb16a1fc037dd0770288be3 Mon Sep 17 00:00:00 2001 From: Bjørn Christian Seime Date: Mon, 14 Jan 2019 16:40:37 +0100 Subject: Add tracking of jrt metrics - Introduce jrt supervisor factory interface - Add default implementation of factory with metric integration - Add component that regularly propagates jrt metric values --- .../container/jdisc/jrt/DefaultJrtFactory.java | 35 +++++++++++ .../com/yahoo/container/jdisc/jrt/JrtFactory.java | 15 +++++ .../container/jdisc/jrt/JrtMetricsUpdater.java | 70 ++++++++++++++++++++++ .../yahoo/container/jdisc/jrt/package-info.java | 8 +++ 4 files changed, 128 insertions(+) create mode 100644 container-disc/src/main/java/com/yahoo/container/jdisc/jrt/DefaultJrtFactory.java create mode 100644 container-disc/src/main/java/com/yahoo/container/jdisc/jrt/JrtFactory.java create mode 100644 container-disc/src/main/java/com/yahoo/container/jdisc/jrt/JrtMetricsUpdater.java create mode 100644 container-disc/src/main/java/com/yahoo/container/jdisc/jrt/package-info.java 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 new file mode 100644 index 00000000000..93a72e200e0 --- /dev/null +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/DefaultJrtFactory.java @@ -0,0 +1,35 @@ +// 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 new file mode 100644 index 00000000000..052aaad1bd7 --- /dev/null +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/JrtFactory.java @@ -0,0 +1,15 @@ +// 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 new file mode 100644 index 00000000000..ede0f060ec9 --- /dev/null +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/JrtMetricsUpdater.java @@ -0,0 +1,70 @@ +// 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 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 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 new file mode 100644 index 00000000000..a584a9b4fb7 --- /dev/null +++ b/container-disc/src/main/java/com/yahoo/container/jdisc/jrt/package-info.java @@ -0,0 +1,8 @@ +// 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 -- cgit v1.2.3