
Anglais | 中文
Cassowary est un outil de test de charge HTTP / S moderne, intuitif et multiplateforme intégré à Go pour les développeurs, les testeurs et les systèmes. Cassowary s'inspire de projets impressionnants comme K6, AB & Httpstat.
? 2 Modes de test de charge : un mode standard et un mode d'étalement où les chemins d'url peuvent être spécifiés à partir d'un fichier (idéal si vous souhaitez frapper plusieurs microservices sous-jacents)
? CI Friendly : bien adapté pour faire partie d'une étape du pipeline CI
? Métriques flexibles : métriques CloudWatch, métriques Prometheus (poussant les métriques vers Prometheus Pushgateway), fichier JSON
? Configurable : capable de passer des en-têtes HTTP arbitraires, capable de configurer le client HTTP
? Prise en charge des données GET, POST, PUST & PATCH - POST, PUST ET PATS Les données peuvent être définies dans un fichier
? Cross-plateforme : un seul binaire pré-construit pour Linux, Mac OSX et Windows
? Importable - Outre l'outil CLI Cassowary peut être importé comme un module dans votre application Go
? Visualisations - Cassowary peut exporter les données de demande de demande en tant qu'histogramme et boîte à boîte au format PNG
Prenez un binaire prédéfini de la page GitHub Release. Vous pouvez éventuellement mettre le binaire Cassowary sur votre PATH afin que vous puissiez exécuter Cassowary à partir de n'importe quel emplacement. Alternative vous pouvez:
Vous pouvez installer Cassowary à l'aide du gestionnaire de packages Homebrew sur Mac:
$ brew update && brew install cassowaryVous pouvez exécuter Cassowary directement en utilisant son image Docker officielle:
$ docker run rogerw/cassowary:v0.14.1 -u http://www.example.com -c 1 -n 10Pour le développement local:
$ GOOS=linux go build -o dist/docker/cassowary cmd/cassowary/ * .go
$ docker build -f dist/docker/Dockerfile -t test_cassowary dist/docker
$ docker run test_cassowary -u http://www.example.com -c 1 -n 10Sans argument lors de la "docker run", il imprime une utilisation d'aide
Cassowary peut être installé via le gestionnaire de packages NIX.
nix-env -iA cassowary
Si vous souhaitez déployer votre propre régime, vous pouvez utiliser le fichier de spécifications Cassowary.Spec pour créer un package RPM
Exemple exécutant Cassowary contre www.example.com avec 100 demandes réparties sur 10 utilisateurs simultanés:
$ ./cassowary run -u http://www.example.com -c 10 -n 100
Starting Load Test with 100 requests using 10 concurrent users
100% | ████████████████████████████████████████ | [1s:0s] 1.256773616s
TCP Connect.....................: Avg/mean=101.90ms Median=102.00ms p(95)=105ms
Server Processing...............: Avg/mean=100.18ms Median=100.50ms p(95)=103ms
Content Transfer................: Avg/mean=0.01ms Median=0.00ms p(95)=0ms
Summary:
Total Req.......................: 100
Failed Req......................: 0
DNS Lookup......................: 115.00ms
Req/s...........................: 79.57Exemple exécutant Cassowary en mode Slurp de fichier où tous les chemins d'url sont spécifiés à partir d'un fichier externe (qui peut également être récupéré à partir de HTTP si spécifié). Par défaut, Cassowary sera, sans l'indicateur -n spécifié, effectuera une demande par chemin spécifié dans le fichier. Cependant, avec l'indicateur -n, vous pouvez également spécifier le nombre de demandes que vous souhaitez que Cassowary génère sur ces chemins d'URL. Exemple:
$ ./cassowary run -u http://localhost:8000 -c 1 -f urlpath.txt
# NOTE: from v0.10.0 and below file slurp mode had it's own command
# $ ./cassowary run-file -u http://localhost:8000 -c 1 -f urlpath.txt
Starting Load Test with 5 requests using 1 concurrent users
[ omitted ]
$ ./cassowary run -u http://localhost:8000 -c 10 -n 100 -f urlpath.txt
Starting Load Test with 100 requests using 10 concurrent users
100% | ████████████████████████████████████████ | [0s:0s] 599.467161ms
TCP Connect.....................: Avg/mean=1.80ms Median=2.00ms p(95)=3ms
Server Processing...............: Avg/mean=0.90ms Median=0.00ms p(95)=3ms
Content Transfer................: Avg/mean=0.00ms Median=0.00ms p(95)=0ms
Summary:
Total Req.......................: 3925
Failed Req......................: 0
DNS Lookup......................: 2.00ms
Req/s...........................: 6547.48Exemple d'exportation de métriques JSON Cassowary vers un fichier:
$ ./cassowary run --json-metrics --json-metrics-file=metrics.json -u http://localhost:8000 -c 125 -n 100000
Starting Load Test with 100000 requests using 125 concurrent users
100% | ████████████████████████████████████████ | [0s:0s] 984.9862ms
TCP Connect.....................: Avg/mean=-0.18ms Median=0.00ms p(95)=1ms
Server Processing...............: Avg/mean=0.16ms Median=0.00ms p(95)=1ms
Content Transfer................: Avg/mean=0.01ms Median=0.00ms p(95)=0ms
Summary:
Total Req.......................: 100000
Failed Req......................: 0
DNS Lookup......................: 2.00ms
Req/s...........................: 101524.27Si le drapeau
json-metrics-fileest manquant, le nom de fichier par défaut estout.json.
Si vous voulez plutôt les données brutes de toutes les demandes (au format CSV), vous pouvez l'exporter à l'aide de l'indicateur --raw-output
Le nom de fichier sorti est
raw.csv
Exemple d'exportation de métriques de cassoy à Prometheus en fournissant une URL de Prométhée Pushgatway:
$ ./cassowary run -u http://localhost:8000 -c 125 -n 100000 -p http://pushgatway:9091
Starting Load Test with 100000 requests using 125 concurrent users
[ omitted for brevity ]
Cassowary peut exporter des métriques vers AWS CloudWatch simplement en ajoutant l'indicateur --CloudWatch sans valeur. Notez que vous devrez dire Cassoway quelle région AWS vous souhaitez utiliser. Le moyen le plus simple consiste à utiliser une variable d'environnement comme indiqué ci-dessous:
$ export AWS_REGION=eu-north-1 && ./cassowary run -u http://localhost:8000 -c 125 -n 100000 --cloudwatch
Starting Load Test with 100000 requests using 125 concurrent users
[ omitted for brevity ]
Fournitez l'indicateur - histogramme sans valeur pour laisser Cassowary calculer et sortir un histogramme au format PNG (Hist.png dans Dir actuel) pour la durée totale des demandes dans MS. Exemple:
Fournitez l'indicateur --boxplot sans valeur pour dire à Cassowary de générer une visualisation de boxplot au format PNG (boxplot.png dans le Dir actuel) pour la durée totale des demandes dans MS
Exemple de la frappe d'un point de terminaison par où les données post-JSON sont définies dans un fichier:
$ ./cassowary run -u http://localhost:8000/add-user -c 10 -n 1000 --postfile user.json
Starting Load Test with 1000 requests using 10 concurrent users
[ omitted for brevity ]
Exemple de frappe d'un point de terminaison du correctif où les données JSON Patch sont définies dans un fichier:
$ ./cassowary run -u http://localhost:8000/add-user -c 5 -n 200 --patchfile user.json
Starting Load Test with 200 requests using 5 concurrent users
[ omitted for brevity ]
Exemple spécifiant une durée pour votre test de charge, dans la commande ci-dessous, nous spécifions que nous souhaitons envoyer 100 demandes sur une durée de 30 secondes:
$ ./cassowary run -u http://localhost:8000 -n 100 -d 30
Starting Load Test with 100 requests using 1 concurrent users
[ omitted for brevity ]
Exemple ajoutant un en-tête HTTP lors de l'exécution de Cassowary
$ ./cassowary run -u http://localhost:8000 -c 10 -n 1000 -H ' Host: www.example.com '
Starting Load Test with 1000 requests using 10 concurrent users
[ omitted for brevity ]
Exemple de désactivation HTTP Keep-Alive (par défaut, Keep-Alive est activé):
$ ./cassowary run -u http://localhost:8000 -c 10 -n 1000 --disable-keep-alive
Starting Load Test with 1000 requests using 10 concurrent users
[ omitted for brevity ]
Exemple spécifiant le certificat CA
$ ./cassowary run -u http://localhost:8000 -c 10 -n 1000 --ca /path/to/ca.pem
Starting Load Test with 1000 requests using 10 concurrent users
[ omitted for brevity ]
Exemple spécifiant l'authentification du client pour MTLS
$ ./cassowary run -u https://localhost:8443 -c 10 -n 1000 --cert /path/to/client.pem --key /path/to/client-key.pem --ca /path/to/ca.pem
Starting Load Test with 1000 requests using 10 concurrent users
[ omitted for brevity ]
Vous pouvez exécuter Cassowary de manière distribuée si vous devez augmenter les tests de charge sur plusieurs machines. La façon la plus simple de le faire est d'avoir accès à un cluster Kubernetes. Utilisez le type de lot à Kubernetes et dans la clé Spec.Paralellisme , vous pouvez spécifier le nombre d'instances de Cassowary que vous souhaitez exécuter simultanément:
apiVersion : batch/v1
kind : Job
metadata :
name : cassowary
spec :
parallelism : 10
template :
spec :
containers :
- command : ["-u", "http://my-microservice.com:8000", "-c", "1", "-n", "10"]
image : rogerw/cassowary:v0.14.1
name : cassowary
restartPolicy : NeverAppliquez simplement ce yaml comme tel:
$ kubectl apply -f cassowary.yamlCassowary peut être importé et utilisé comme module dans votre application Go. Commencez par récupérer la dépendance en utilisant le mod go:
$ go mod init test && go get github.com/rogerwelin/cassowary/pkg/clientEt ci-dessous montre un exemple simple sur la façon de déclencher un test de chargement à partir de votre code et d'imprimer les résultats:
package main
import (
"encoding/json"
"fmt"
"github.com/rogerwelin/cassowary/pkg/client"
)
func main () {
cass := & client. Cassowary {
BaseURL : "http://www.example.com" ,
ConcurrencyLevel : 1 ,
Requests : 10 ,
DisableTerminalOutput : true ,
}
metrics , err := cass . Coordinate ()
if err != nil {
panic ( err )
}
// print results
fmt . Printf ( "%+v n " , metrics )
// or print as json
jsonMetrics , err := json . Marshal ( metrics )
if err != nil {
panic ( err )
}
fmt . Println ( string ( jsonMetrics ))
}Plus d'exemples de bibliothèque peuvent être trouvés ici
Cassowary suit le versioning sémantique. La bibliothèque publique (PKG / Client) peut rompre la compatibilité en arrière jusqu'à ce qu'elle atteigne une version stable V1.0.0.
Les contributions sont les bienvenues! Pour demander une fonctionnalité, créez un nouveau problème avec la feature-request d'étiquette. Trouver un bug? Veuillez ajouter un problème avec les bugs d'étiquette. Les demandes de traction sont également accueillies, mais veuillez d'abord ajouter un problème sur la fonction demandée (sauf s'il s'agit d'une simple correction de bogue ou d'un changement de lecture)