All Downloads are FREE. Search and download functionalities are using the official Maven repository.

io.stargate.it.grpc.AuthApiServerMetricsTest Maven / Gradle / Ivy

There is a newer version: 2.1.0-BETA-16
Show newest version
package io.stargate.it.grpc;

import static io.stargate.it.MetricsTestsHelper.getMetricValueOptional;
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.awaitility.Awaitility.await;

import com.datastax.oss.driver.api.core.CqlIdentifier;
import com.datastax.oss.driver.api.core.CqlSession;
import io.grpc.StatusRuntimeException;
import io.stargate.grpc.Values;
import io.stargate.it.TestOrder;
import io.stargate.it.driver.CqlSessionExtension;
import io.stargate.it.driver.CqlSessionSpec;
import io.stargate.it.driver.TestKeyspace;
import io.stargate.it.http.RestUtils;
import io.stargate.it.storage.StargateConnectionInfo;
import io.stargate.proto.QueryOuterClass.Batch;
import io.stargate.proto.QueryOuterClass.Query;
import io.stargate.proto.QueryOuterClass.Response;
import io.stargate.proto.StargateGrpc.StargateBlockingStub;
import java.time.Duration;
import java.util.Arrays;
import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;
import java.util.stream.Collectors;
import org.apache.http.HttpStatus;
import org.junit.jupiter.api.AfterEach;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Order;
import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.extension.ExtendWith;

@ExtendWith(CqlSessionExtension.class)
@CqlSessionSpec(
    initQueries = {
      "CREATE TABLE IF NOT EXISTS test (k text, v int, PRIMARY KEY(k, v))",
    })
@Order(AuthApiServerMetricsTest.ORDER)
public class AuthApiServerMetricsTest extends GrpcIntegrationTest {

  // run this at the beginning when there are not a lot of metrics (faster)
  static final int ORDER = TestOrder.FIRST + 1;

  private static String host;

  @BeforeAll
  public static void init(StargateConnectionInfo cluster) {
    host = "http://" + cluster.seedAddress();
  }

  @AfterEach
  public void cleanup(CqlSession session) {
    session.execute("TRUNCATE TABLE test");
  }

  @Test
  public void queryMetrics(@TestKeyspace CqlIdentifier keyspace) {
    StargateBlockingStub stub = stubWithCallCredentials();

    Response response =
        stub.executeQuery(
            cqlQuery("INSERT INTO test (k, v) VALUES ('a', 1)", queryParameters(keyspace)));
    assertThat(response).isNotNull();

    response = stub.executeQuery(cqlQuery("SELECT * FROM test", queryParameters(keyspace)));
    assertThat(response.hasResultSet()).isTrue();

    await()
        .atMost(Duration.ofSeconds(10))
        .untilAsserted(
            () -> {
              String result =
                  RestUtils.get("", String.format("%s:8084/metrics", host), HttpStatus.SC_OK);

              List lines =
                  Arrays.stream(result.split(System.getProperty("line.separator")))
                      .filter(line -> line.startsWith("grpc_server"))
                      .collect(Collectors.toList());

              assertThat(lines)
                  .anySatisfy(
                      metric ->
                          assertThat(metric)
                              .contains("grpc_server_processing_duration_seconds_count")
                              .contains("method=\"ExecuteQuery\"")
                              .contains("methodType=\"UNARY\"")
                              .contains("service=\"stargate.Stargate\"")
                              .contains("statusCode=\"OK\""))
                  .anySatisfy(
                      metric ->
                          assertThat(metric)
                              .contains("grpc_server_processing_duration_seconds_sum")
                              .contains("method=\"ExecuteQuery\"")
                              .contains("methodType=\"UNARY\"")
                              .contains("service=\"stargate.Stargate\"")
                              .contains("statusCode=\"OK\""))
                  .anySatisfy(
                      metric ->
                          assertThat(metric)
                              .contains("grpc_server_processing_duration_seconds_max")
                              .contains("method=\"ExecuteQuery\"")
                              .contains("methodType=\"UNARY\"")
                              .contains("service=\"stargate.Stargate\"")
                              .contains("statusCode=\"OK\""));

              String responsesTotal =
                  "grpc_server_responses_sent_messages_total{method=\"ExecuteQuery\",methodType=\"UNARY\",service=\"stargate.Stargate\",}";
              String requestsTotal =
                  "grpc_server_requests_received_messages_total{method=\"ExecuteQuery\",methodType=\"UNARY\",service=\"stargate.Stargate\",}";

              assertThat(getGrpcMetric(result, responsesTotal))
                  .hasValueSatisfying(v -> assertThat(v).isGreaterThan(0d));

              assertThat(getGrpcMetric(result, requestsTotal))
                  .hasValueSatisfying(v -> assertThat(v).isGreaterThan(0d));
            });
  }

  @Test
  public void batchMetrics(@TestKeyspace CqlIdentifier keyspace) {
    StargateBlockingStub stub = stubWithCallCredentials();

    Response response =
        stub.executeBatch(
            Batch.newBuilder()
                .addQueries(cqlBatchQuery("INSERT INTO test (k, v) VALUES ('a', 1)"))
                .addQueries(
                    cqlBatchQuery(
                        "INSERT INTO test (k, v) VALUES (?, ?)", Values.of("b"), Values.of(2)))
                .addQueries(
                    cqlBatchQuery(
                        "INSERT INTO test (k, v) VALUES (?, ?)", Values.of("c"), Values.of(3)))
                .setParameters(batchParameters(keyspace))
                .build());
    assertThat(response).isNotNull();

    await()
        .atMost(Duration.ofSeconds(10))
        .untilAsserted(
            () -> {
              String result =
                  RestUtils.get("", String.format("%s:8084/metrics", host), HttpStatus.SC_OK);

              List lines =
                  Arrays.stream(result.split(System.getProperty("line.separator")))
                      .filter(line -> line.startsWith("grpc_server"))
                      .collect(Collectors.toList());

              System.out.println(lines);
              assertThat(lines)
                  .anySatisfy(
                      metric ->
                          assertThat(metric)
                              .contains("grpc_server_processing_duration_seconds_count")
                              .contains("method=\"ExecuteBatch\"")
                              .contains("methodType=\"UNARY\"")
                              .contains("service=\"stargate.Stargate\"")
                              .contains("statusCode=\"OK\""))
                  .anySatisfy(
                      metric ->
                          assertThat(metric)
                              .contains("grpc_server_processing_duration_seconds_sum")
                              .contains("method=\"ExecuteBatch\"")
                              .contains("methodType=\"UNARY\"")
                              .contains("service=\"stargate.Stargate\"")
                              .contains("statusCode=\"OK\""))
                  .anySatisfy(
                      metric ->
                          assertThat(metric)
                              .contains("grpc_server_processing_duration_seconds_max")
                              .contains("method=\"ExecuteBatch\"")
                              .contains("methodType=\"UNARY\"")
                              .contains("service=\"stargate.Stargate\"")
                              .contains("statusCode=\"OK\""));

              String responsesTotal =
                  "grpc_server_responses_sent_messages_total{method=\"ExecuteBatch\",methodType=\"UNARY\",service=\"stargate.Stargate\",}";
              String requestsTotal =
                  "grpc_server_requests_received_messages_total{method=\"ExecuteBatch\",methodType=\"UNARY\",service=\"stargate.Stargate\",}";

              assertThat(getGrpcMetric(result, responsesTotal))
                  .hasValueSatisfying(v -> assertThat(v).isGreaterThan(0d));

              assertThat(getGrpcMetric(result, requestsTotal))
                  .hasValueSatisfying(v -> assertThat(v).isGreaterThan(0d));
            });
  }

  @Test
  public void unauthenticatedMetrics() {
    assertThatThrownBy(
            () ->
                stubWithCallCredentials("not-a-token-that-exists")
                    .executeQuery(Query.newBuilder().setCql("SELECT * FROM system.local").build()))
        .isInstanceOf(StatusRuntimeException.class)
        .hasMessageContaining("UNAUTHENTICATED")
        .hasMessageContaining("Invalid token");

    await()
        .atMost(Duration.ofSeconds(10))
        .untilAsserted(
            () -> {
              String result =
                  RestUtils.get("", String.format("%s:8084/metrics", host), HttpStatus.SC_OK);

              List lines =
                  Arrays.stream(result.split(System.getProperty("line.separator")))
                      .filter(line -> line.startsWith("grpc_server"))
                      .collect(Collectors.toList());

              assertThat(lines)
                  .anySatisfy(
                      metric ->
                          assertThat(metric)
                              .contains("grpc_server_processing_duration_seconds_count")
                              .contains("method=\"ExecuteQuery\"")
                              .contains("methodType=\"UNARY\"")
                              .contains("service=\"stargate.Stargate\"")
                              .contains("statusCode=\"UNAUTHENTICATED\""))
                  .anySatisfy(
                      metric ->
                          assertThat(metric)
                              .contains("grpc_server_processing_duration_seconds_sum")
                              .contains("method=\"ExecuteQuery\"")
                              .contains("methodType=\"UNARY\"")
                              .contains("service=\"stargate.Stargate\"")
                              .contains("statusCode=\"UNAUTHENTICATED\""))
                  .anySatisfy(
                      metric ->
                          assertThat(metric)
                              .contains("grpc_server_processing_duration_seconds_max")
                              .contains("method=\"ExecuteQuery\"")
                              .contains("methodType=\"UNARY\"")
                              .contains("service=\"stargate.Stargate\"")
                              .contains("statusCode=\"UNAUTHENTICATED\""));

              String durationCount =
                  "grpc_server_processing_duration_seconds_count{method=\"ExecuteQuery\",methodType=\"UNARY\",service=\"stargate.Stargate\",statusCode=\"UNAUTHENTICATED\",}";

              assertThat(getGrpcMetric(result, durationCount))
                  .hasValueSatisfying(v -> assertThat(v).isGreaterThan(0d));
            });
  }

  private Optional getGrpcMetric(String body, String metric) {
    String regex =
        String.format("(%s\\s*)(\\d+.\\d+)", metric)
            .replace(",", "\\,")
            .replace("{", "\\{")
            .replace("}", "\\}");
    return getMetricValueOptional(body, metric, Pattern.compile(regex));
  }
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy