| // Copyright (C) 2020 The Android Open Source Project | |
| // | |
| // Licensed under the Apache License, Version 2.0 (the "License"); | |
| // you may not use this file except in compliance with the License. | |
| // You may obtain a copy of the License at | |
| // | |
| // http://www.apache.org/licenses/LICENSE-2.0 | |
| // | |
| // Unless required by applicable law or agreed to in writing, software | |
| // distributed under the License is distributed on an "AS IS" BASIS, | |
| // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| // See the License for the specific language governing permissions and | |
| // limitations under the License. | |
| package com.google.gerrit.pgm.http.jetty; | |
| import com.google.common.collect.ImmutableSet; | |
| import com.google.gerrit.metrics.CallbackMetric; | |
| import com.google.gerrit.metrics.CallbackMetric0; | |
| import com.google.gerrit.metrics.Description; | |
| import com.google.gerrit.metrics.Description.Units; | |
| import com.google.gerrit.metrics.MetricMaker; | |
| import com.google.inject.Inject; | |
| import com.google.inject.Singleton; | |
| @Singleton | |
| public class JettyMetrics { | |
| @Inject | |
| JettyMetrics(JettyServer jetty, MetricMaker metrics) { | |
| CallbackMetric0<Integer> minPoolSize = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/threadpool/min_pool_size", | |
| Integer.class, | |
| new Description("Minimum thread pool size").setGauge()); | |
| CallbackMetric0<Integer> maxPoolSize = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/threadpool/max_pool_size", | |
| Integer.class, | |
| new Description("Maximum thread pool size").setGauge()); | |
| CallbackMetric0<Integer> poolSize = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/threadpool/pool_size", | |
| Integer.class, | |
| new Description("Current thread pool size").setGauge()); | |
| CallbackMetric0<Integer> idleThreads = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/threadpool/idle_threads", | |
| Integer.class, | |
| new Description("Idle threads").setGauge()); | |
| CallbackMetric0<Integer> busyThreads = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/threadpool/active_threads", | |
| Integer.class, | |
| new Description("Active threads").setGauge()); | |
| CallbackMetric0<Integer> reservedThreads = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/threadpool/reserved_threads", | |
| Integer.class, | |
| new Description("Reserved threads").setGauge()); | |
| CallbackMetric0<Integer> queueSize = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/threadpool/queue_size", | |
| Integer.class, | |
| new Description("Queued requests waiting for a thread").setGauge()); | |
| CallbackMetric0<Boolean> lowOnThreads = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/threadpool/is_low_on_threads", | |
| Boolean.class, | |
| new Description("Whether thread pool is low on threads").setGauge()); | |
| CallbackMetric0<Long> connections = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/connections/connections", | |
| Long.class, | |
| new Description("The current number of open connections").setGauge()); | |
| CallbackMetric0<Long> connectionsTotal = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/connections/connections_total", | |
| Long.class, | |
| new Description("The total number of connections opened").setGauge()); | |
| CallbackMetric0<Long> connectionDurationMax = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/connections/connections_duration_max", | |
| Long.class, | |
| new Description("The max duration of a connection") | |
| .setGauge() | |
| .setUnit(Units.MILLISECONDS)); | |
| CallbackMetric0<Double> connectionDurationMean = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/connections/connections_duration_mean", | |
| Double.class, | |
| new Description("The mean duration of a connection") | |
| .setGauge() | |
| .setUnit(Units.MILLISECONDS)); | |
| CallbackMetric0<Double> connectionDurationStDev = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/connections/connections_duration_stdev", | |
| Double.class, | |
| new Description("The standard deviation of the duration of a connection") | |
| .setGauge() | |
| .setUnit(Units.MILLISECONDS)); | |
| CallbackMetric0<Long> receivedMessages = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/connections/received_messages", | |
| Long.class, | |
| new Description("The total number of messages received").setGauge()); | |
| CallbackMetric0<Long> sentMessages = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/connections/sent_messages", | |
| Long.class, | |
| new Description("The total number of messages sent").setGauge()); | |
| CallbackMetric0<Long> receivedBytes = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/connections/received_bytes", | |
| Long.class, | |
| new Description("Total number of bytes received by tracked connections") | |
| .setGauge() | |
| .setUnit(Units.BYTES)); | |
| CallbackMetric0<Long> sentBytes = | |
| metrics.newCallbackMetric( | |
| "http/server/jetty/connections/sent_bytes", | |
| Long.class, | |
| new Description("Total number of bytes sent by tracked connections") | |
| .setGauge() | |
| .setUnit(Units.BYTES)); | |
| JettyServer.Metrics jettyMetrics = jetty.getMetrics(); | |
| metrics.newTrigger( | |
| ImmutableSet.<CallbackMetric<?>>of( | |
| idleThreads, | |
| busyThreads, | |
| reservedThreads, | |
| minPoolSize, | |
| maxPoolSize, | |
| poolSize, | |
| queueSize, | |
| lowOnThreads, | |
| connections, | |
| connectionsTotal, | |
| connectionDurationMax, | |
| connectionDurationMean, | |
| connectionDurationStDev, | |
| receivedMessages, | |
| sentMessages, | |
| receivedBytes, | |
| sentBytes), | |
| () -> { | |
| minPoolSize.set(jettyMetrics.getMinThreads()); | |
| maxPoolSize.set(jettyMetrics.getMaxThreads()); | |
| poolSize.set(jettyMetrics.getThreads()); | |
| idleThreads.set(jettyMetrics.getIdleThreads()); | |
| busyThreads.set(jettyMetrics.getBusyThreads()); | |
| reservedThreads.set(jettyMetrics.getReservedThreads()); | |
| queueSize.set(jettyMetrics.getQueueSize()); | |
| lowOnThreads.set(jettyMetrics.isLowOnThreads()); | |
| connections.set(jettyMetrics.getConnections()); | |
| connectionsTotal.set(jettyMetrics.getConnectionsTotal()); | |
| connectionDurationMax.set(jettyMetrics.getConnectionDurationMax()); | |
| connectionDurationMean.set(jettyMetrics.getConnectionDurationMean()); | |
| connectionDurationStDev.set(jettyMetrics.getConnectionDurationStdDev()); | |
| receivedMessages.set(jettyMetrics.getReceivedMessages()); | |
| sentMessages.set(jettyMetrics.getSentMessages()); | |
| receivedBytes.set(jettyMetrics.getReceivedBytes()); | |
| sentBytes.set(jettyMetrics.getSentBytes()); | |
| }); | |
| } | |
| } |