Skip to content

Commit 94d8ead

Browse files
vjkoskelaBrandonArp
authored andcommitted
Add periodic status counts to http server (#69)
1 parent 1576706 commit 94d8ead

File tree

2 files changed

+24
-14
lines changed

2 files changed

+24
-14
lines changed

src/main/java/com/arpnetworking/http/Routes.java

Lines changed: 22 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,14 @@
5353
import com.arpnetworking.steno.LoggerFactory;
5454
import com.google.common.base.Charsets;
5555
import com.google.common.base.Stopwatch;
56+
import com.google.common.collect.ImmutableList;
5657
import com.google.common.io.Resources;
5758
import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
5859
import scala.compat.java8.FutureConverters;
5960
import scala.concurrent.Future;
6061
import scala.concurrent.duration.FiniteDuration;
6162

62-
import java.util.List;
63+
import java.util.Objects;
6364
import java.util.Optional;
6465
import java.util.concurrent.CompletableFuture;
6566
import java.util.concurrent.CompletionStage;
@@ -87,7 +88,7 @@ public Routes(
8788
final PeriodicMetrics metrics,
8889
final String healthCheckPath,
8990
final String statusPath,
90-
final List<SupplementalRoutes> supplementalRoutes) {
91+
final ImmutableList<SupplementalRoutes> supplementalRoutes) {
9192
_actorSystem = actorSystem;
9293
_metrics = metrics;
9394
_healthCheckPath = healthCheckPath;
@@ -126,6 +127,14 @@ public CompletionStage<HttpResponse> apply(final HttpRequest request) {
126127
createMetricName(request, REQUEST_METRIC),
127128
requestTimer.elapsed(TimeUnit.NANOSECONDS),
128129
Optional.of(Units.NANOSECOND));
130+
131+
final int responseStatusClass = response.status().intValue() / 100;
132+
for (final int i : STATUS_CLASSES) {
133+
_metrics.recordCounter(
134+
createMetricName(request, String.format("%s/%dxx", STATUS_METRIC, i)),
135+
responseStatusClass == i ? 1 : 0);
136+
}
137+
129138
final LogBuilder log = LOGGER.trace()
130139
.setEvent("http.in")
131140
.addData("method", request.method())
@@ -141,12 +150,12 @@ public CompletionStage<HttpResponse> apply(final HttpRequest request) {
141150

142151
private CompletionStage<HttpResponse> process(final HttpRequest request) {
143152
final String path = request.getUri().path();
144-
if (HttpMethods.GET.equals(request.method())) {
145-
if (TELEMETRY_STREAM_V1_PATH.equals(path)) {
153+
if (Objects.equals(HttpMethods.GET, request.method())) {
154+
if (Objects.equals(TELEMETRY_STREAM_V1_PATH, path)) {
146155
return getHttpResponseForTelemetry(request, TELEMETRY_V1_FACTORY);
147-
} else if (TELEMETRY_STREAM_V2_PATH.equals(path)) {
156+
} else if (Objects.equals(TELEMETRY_STREAM_V2_PATH, path)) {
148157
return getHttpResponseForTelemetry(request, TELEMETRY_V2_FACTORY);
149-
} else if (_healthCheckPath.equals(path)) {
158+
} else if (Objects.equals(_healthCheckPath, path)) {
150159
return ask("/user/status", Status.IS_HEALTHY, Boolean.FALSE)
151160
.thenApply(
152161
isHealthy -> HttpResponse.create()
@@ -159,16 +168,16 @@ private CompletionStage<HttpResponse> process(final HttpRequest request) {
159168
"{\"status\":\""
160169
+ (isHealthy ? HEALTHY_STATE : UNHEALTHY_STATE)
161170
+ "\"}")));
162-
} else if (_statusPath.equals(path)) {
171+
} else if (Objects.equals(_statusPath, path)) {
163172
return CompletableFuture.completedFuture(
164173
HttpResponse.create()
165174
.withStatus(StatusCodes.OK)
166175
.withEntity(JSON_CONTENT_TYPE, ByteString.fromString(STATUS_JSON)));
167176
}
168-
} else if (HttpMethods.POST.equals(request.method())) {
169-
if (path.equals(COLLECTD_V1_SOURCE_PREFIX)) {
177+
} else if (Objects.equals(HttpMethods.POST, request.method())) {
178+
if (Objects.equals(path, COLLECTD_V1_SOURCE_PREFIX)) {
170179
return dispatchHttpRequest(request, ACTOR_COLLECTD_V1);
171-
} else if (path.equals(APP_V1_SOURCE_PREFIX)) {
180+
} else if (Objects.equals(path, APP_V1_SOURCE_PREFIX)) {
172181
return dispatchHttpRequest(request, ACTOR_APP_V1);
173182
}
174183
}
@@ -274,7 +283,7 @@ private String createMetricName(final HttpRequest request, final String actionPa
274283
private final String _healthCheckPath;
275284
private final String _statusPath;
276285
@SuppressFBWarnings("SE_BAD_FIELD")
277-
private final List<SupplementalRoutes> _supplementalRoutes;
286+
private final ImmutableList<SupplementalRoutes> _supplementalRoutes;
278287

279288
private static final Logger LOGGER = LoggerFactory.getLogger(Routes.class);
280289

@@ -291,6 +300,8 @@ private String createMetricName(final HttpRequest request, final String actionPa
291300
private static final String REST_SERVICE_METRIC_ROOT = "rest_service/";
292301
private static final String BODY_SIZE_METRIC = "body_size";
293302
private static final String REQUEST_METRIC = "request";
303+
private static final String STATUS_METRIC = "status";
304+
private static final ImmutableList<Integer> STATUS_CLASSES = ImmutableList.of(2, 3, 4, 5);
294305

295306
// Ping
296307
private static final HttpHeader PING_CACHE_CONTROL_HEADER = CacheControl.create(

src/main/java/com/arpnetworking/metrics/mad/Main.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,6 @@
6666

6767
import java.io.File;
6868
import java.net.URI;
69-
import java.util.ArrayList;
7069
import java.util.Collections;
7170
import java.util.List;
7271
import java.util.Locale;
@@ -212,7 +211,7 @@ private void launchActors(final Injector injector) {
212211
actorSystem.actorOf(Props.create(Telemetry.class, injector.getInstance(MetricsFactory.class)), "telemetry");
213212

214213
// Load supplemental routes
215-
final List<SupplementalRoutes> supplementalHttpRoutes = new ArrayList<>();
214+
final ImmutableList.Builder<SupplementalRoutes> supplementalHttpRoutes = ImmutableList.builder();
216215
_configuration.getSupplementalHttpRoutesClass().ifPresent(clazz -> {
217216
supplementalHttpRoutes.add(injector.getInstance(clazz));
218217
});
@@ -224,7 +223,7 @@ private void launchActors(final Injector injector) {
224223
injector.getInstance(PeriodicMetrics.class),
225224
_configuration.getHttpHealthCheckPath(),
226225
_configuration.getHttpStatusPath(),
227-
supplementalHttpRoutes);
226+
supplementalHttpRoutes.build());
228227
final Http http = Http.get(actorSystem);
229228
final akka.stream.javadsl.Source<IncomingConnection, CompletionStage<ServerBinding>> binding = http.bind(
230229
ConnectHttp.toHost(

0 commit comments

Comments
 (0)