Minor load test fixes (#9394)

This commit is contained in:
s-christoff 2020-12-15 17:03:44 -06:00 committed by GitHub
parent 3bf8849d14
commit a907922ddb
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 45 additions and 52 deletions

2
test/load/README.md Normal file
View File

@ -0,0 +1,2 @@
## Terraform Consul Load Testing
Consul Load Testing is used to capture baseline performance metrics for Consul under stress. This will assist in ensuring there are no performance regressions during releases and substainal changes to Consul. Per the defaults, the test runs for 10 minutes with 25 virtual users spawned by k6. Instance sizes for test instance are `t2.small` and for the Consul cluster `m5n.large`. As long as the thresholds stay under 2 seconds, it passes. All metrics from Consul are pushed to a datadog dashboard for user review.

View File

@ -1,8 +1,8 @@
import http from 'k6/http'; import http from 'k6/http';
import { uuidv4 } from "https://jslib.k6.io/k6-utils/1.0.0/index.js"; import { uuidv4 } from "https://jslib.k6.io/k6-utils/1.0.0/index.js";
let data = JSON.parse(open('service.json')); import { check, fail } from 'k6';
let check = JSON.parse(open('service-check.json'));
let data = JSON.parse(open('service.json'));
export default function() { export default function() {
@ -14,49 +14,35 @@ export default function() {
const kv_address = `${ipaddress + kv_uri + key}` const kv_address = `${ipaddress + kv_uri + key}`
//Put valid K/V //Put valid K/V
let res = http.put(kv_address, JSON.stringify(value)); let kvres = http.put(kv_address, JSON.stringify(value));
if ( if (
!check(res, { !check(kvres, {
'kv status code MUST be 200': (res) => res.status == 200, 'kv status code MUST be 200': (kvres) => kvres.status == 200,
}) })
) { ) {
fail('kv status code was *not* 200'); fail(`registry check status code was *not* 200. error: ${kvres.error}. body: ${kvres.body}`)
} }
//Register Service //Register Service
data["ID"] = key;
data["Name"] = key; data["Name"] = key;
const service_uri = '/v1/agent/service/register'; const service_uri = '/v1/agent/service/register';
const service_address = `${ipaddress + service_uri }` const service_address = `${ipaddress + service_uri }`
let res = http.put(service_address, JSON.stringify(data)) let servres = http.put(service_address, JSON.stringify(data));
if ( if (
!check(res, { !check(servres, {
'register service status code MUST be 200': (res) => res.status == 200, 'register service status code MUST be 200': (servres) => servres.status == 200,
}) })
) { ) {
fail('register service status code was *not* 200'); fail(`registry check status code was *not* 200. error: ${servres.error}. body: ${servres.body}`)
} }
//Register Check
check["ServiceID"] = key;
const check_uri = '/v1/agent/check/register';
const check_address = `${ipaddress + check_uri }`
let res = http.put(check_address, JSON.stringify(check))
if (
!check(res, {
'register check status code MUST be 200': (res) => res.status == 200,
})
) {
fail('register check status code was *not* 200');
}
} }
export let options = { export let options = {
// 1 virtual user // 25 virtual users
vus: 100, vus: 25,
// 1 minute // 10 minute
duration: "15m", duration: "10m",
// 95% of requests must complete below 0.280s // 95% of requests must complete below 2s
thresholds: { http_req_duration: ["p(95)<280"] }, thresholds: { http_req_duration: ["p(95)<2000"] },
}; };

View File

@ -1,12 +0,0 @@
{
"ID": "api",
"Name": "Invalid Check so Services Will Automagically Deregister",
"HTTP": "https://example.com:850040220",
"tls_skip_verify": true,
"Method": "POST",
"Header": {"Content-Type": ["application/json"]},
"Body": "{\"method\":\"health\"}",
"Interval": "10s",
"Timeout": "5s",
"DeregisterCriticalServiceAfter": "2m"
}

View File

@ -1,8 +1,16 @@
{ {
"Tags": ["primary", "v1"], "Address": "127.0.0.1",
"Address": "127.0.0.1", "Port": 8000,
"Port": 8000, "Meta": {
"Meta": { "redis_version": "4.0"
"redis_version": "4.0" },
} "Check": {
} "HTTP": "https://example.com:850040220",
"Method": "POST",
"Header": {"Content-Type": ["application/json"]},
"Body": "{\"method\":\"health\"}",
"Timeout": "5s",
"DeregisterCriticalServiceAfter": "2m",
"Interval": "10s"
}
}

View File

@ -30,7 +30,7 @@ If `consul_version` or `consul_download_url` is not set within the Terraform var
6. Upon completion k6 should run and push metrics to desired Datadog dashboard. 6. Upon completion k6 should run and push metrics to desired Datadog dashboard.
# Customization # Customization
All customization for infrastructure that is available can be found by looking through the `variables.tf` file. However, if customization of tests is desired then the `start-k6.sh` leverages user-data to place a `puts_script.js` onto the loadtest servers for k6 to run. This can be customized. All customization for infrastructure that is available can be found by looking through the `variables.tf` file.
# How to SSH # How to SSH
After `terraform apply` is ran Terraform should create a `keys/` directory which will give access to all instances created. After `terraform apply` is ran Terraform should create a `keys/` directory which will give access to all instances created.

View File

@ -113,6 +113,13 @@ module "alb" {
backend_protocol = "HTTP" backend_protocol = "HTTP"
backend_port = 8500 backend_port = 8500
target_type = "instance" target_type = "instance"
health_check = {
interval = 5
timeout = 3
protocol = "HTTP"
healthy_threshold = 2
path = "/v1/status/leader"
}
} }
] ]

View File

@ -57,7 +57,7 @@ resource "aws_instance" "test-server" {
provisioner "remote-exec" { provisioner "remote-exec" {
inline = [ inline = [
"export LB_ENDPOINT=${module.alb.this_lb_dns_name}", "export LB_ENDPOINT=${module.alb.this_lb_dns_name}",
"k6 run /home/ubuntu/scripts/loadtest.js" "k6 run -q /home/ubuntu/scripts/loadtest.js"
] ]
connection { connection {
type = "ssh" type = "ssh"

View File

@ -96,6 +96,7 @@ variable "test_server_ami" {
variable "test_instance_type" { variable "test_instance_type" {
type = string type = string
description = "AWS Instance type for all test servers" description = "AWS Instance type for all test servers"
default = "t2.small"
} }
variable "test_public_ip" { variable "test_public_ip" {
@ -106,6 +107,7 @@ variable "test_public_ip" {
variable "instance_type" { variable "instance_type" {
type = string type = string
description = "Instance Type for all instances in the Consul Cluster" description = "Instance Type for all instances in the Consul Cluster"
default = "m5n.large"
} }
variable "ami_owners" { variable "ami_owners" {