blob: 4dca3a9f472dc333f1893d299269befc97c4e2a6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You 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 org.apache.servicecomb.metrics.core;
import java.util.ArrayList;
import java.util.List;
import org.apache.servicecomb.foundation.metrics.PolledEvent;
import org.apache.servicecomb.foundation.metrics.registry.GlobalRegistry;
import org.apache.servicecomb.foundation.test.scaffolding.config.ArchaiusUtils;
import org.apache.servicecomb.foundation.test.scaffolding.log.LogCollector;
import org.apache.servicecomb.foundation.vertx.SharedVertxFactory;
import org.apache.servicecomb.foundation.vertx.VertxUtils;
import org.apache.servicecomb.foundation.vertx.client.http.HttpClients;
import org.apache.servicecomb.metrics.core.publish.DefaultLogPublisher;
import org.junit.After;
import org.junit.Before;
import org.junit.Test;
import com.google.common.collect.Lists;
import com.google.common.eventbus.EventBus;
import com.netflix.spectator.api.DefaultRegistry;
import com.netflix.spectator.api.ManualClock;
import com.netflix.spectator.api.Measurement;
import com.netflix.spectator.api.Meter;
import com.netflix.spectator.api.Registry;
import io.vertx.core.AbstractVerticle;
import io.vertx.core.DeploymentOptions;
import io.vertx.core.Promise;
import io.vertx.core.http.HttpClient;
import io.vertx.core.http.HttpClientRequest;
import io.vertx.core.http.HttpMethod;
import io.vertx.core.http.HttpServer;
import io.vertx.ext.web.Router;
import org.junit.jupiter.api.Assertions;
public class TestVertxMetersInitializer {
GlobalRegistry globalRegistry = new GlobalRegistry(new ManualClock());
Registry registry = new DefaultRegistry(globalRegistry.getClock());
EventBus eventBus = new EventBus();
VertxMetersInitializer vertxMetersInitializer = new VertxMetersInitializer();
DefaultLogPublisher logPublisher = new DefaultLogPublisher();
static int port;
static String body = "body";
public static class TestServerVerticle extends AbstractVerticle {
@Override
public void start(Promise<Void> startPromise) {
Router mainRouter = Router.router(vertx);
mainRouter.route("/").handler(context -> context.response().end(context.body().buffer()));
HttpServer server = vertx.createHttpServer();
server.requestHandler(mainRouter);
server.listen(0, "0.0.0.0", ar -> {
if (ar.succeeded()) {
port = ar.result().actualPort();
startPromise.complete();
return;
}
startPromise.fail(ar.cause());
});
}
}
public static class TestClientVerticle extends AbstractVerticle {
@Override
public void start(Promise<Void> startPromise) {
HttpClient client = vertx.createHttpClient();
client.request(HttpMethod.GET, port, "127.0.0.1", "/", ar -> {
if (ar.succeeded()) {
HttpClientRequest request = ar.result();
request.send(body, resp -> {
if (resp.succeeded()) {
resp.result().bodyHandler((buffer) -> startPromise.complete());
}
});
}
});
}
}
@Before
public void setup() {
HttpClients.load();
}
@After
public void teardown() {
HttpClients.destroy();
}
@Test
public void init() throws InterruptedException {
globalRegistry.add(registry);
vertxMetersInitializer.init(globalRegistry, eventBus, null);
logPublisher.init(null, eventBus, null);
VertxUtils
.blockDeploy(SharedVertxFactory.getSharedVertx(), TestServerVerticle.class, new DeploymentOptions());
VertxUtils
.blockDeploy(SharedVertxFactory.getSharedVertx(), TestClientVerticle.class, new DeploymentOptions());
globalRegistry.poll(1);
List<Meter> meters = Lists.newArrayList(registry.iterator());
List<Measurement> measurements = new ArrayList<>();
for (Meter meter : meters) {
meter.measure().forEach(measurements::add);
}
LogCollector logCollector = new LogCollector();
testLog(logCollector, meters, measurements, true);
logCollector.clear();
testLog(logCollector, meters, measurements, false);
logCollector.teardown();
}
private void testLog(LogCollector logCollector, List<Meter> meters, List<Measurement> measurements,
boolean printDetail) {
ArchaiusUtils.setProperty(DefaultLogPublisher.ENDPOINTS_CLIENT_DETAIL_ENABLED, String.valueOf(printDetail));
logPublisher.onPolledEvent(new PolledEvent(meters, measurements));
StringBuilder sb = new StringBuilder();
logCollector.getEvents().forEach(event -> sb.append(event.getMessage()).append("\n"));
String actual = sb.toString();
int idx = actual.indexOf("vertx:\n");
actual = actual.substring(idx);
String clientLatency;
String serverLatency;
String expect = "vertx:\n"
+ " instances:\n"
+ " name eventLoopContext-created\n"
+ " registry 0\n"
+ " registry-watch 0\n"
+ " transport 0\n"
+ " transport:\n";
int clientLatencyIndex = actual.indexOf("1 0 0 1 1 ")
+ "1 0 0 1 1 ".length();
clientLatency = actual.substring(clientLatencyIndex, actual.indexOf(" ", clientLatencyIndex));
int serverLatencyIndex = actual.lastIndexOf("1 0 0 1 1 ")
+ "1 0 0 1 1 ".length();
serverLatency = actual.substring(serverLatencyIndex, actual.indexOf(" ", serverLatencyIndex));
int portSize = String.valueOf(port).length();
// in new vert.x version, bytes written must be higher than 4K or will be zero
if (printDetail) {
expect = expect + " client.endpoints:\n"
+ " connectCount disconnectCount queue connections requests latency send(Bps) receive(Bps) remote\n";
expect +=
" 1 0 0 1 1 %-7s 4 21 http://127.0.0.1:%-"
+ portSize + "s\n";
}
expect += ""
+ " server.endpoints:\n"
+ " connectCount disconnectCount rejectByLimit connections requests latency send(Bps) receive(Bps) listen\n"
+ " 1 0 0 1 1 %-7s 21 4 0.0.0.0:0\n\n";
if (printDetail) {
expect = String
.format(expect, clientLatency, port, serverLatency);
} else {
expect = String.format(expect, serverLatency);
}
Assertions.assertEquals(expect, actual);
}
}