Skip to content

Commit f3c652a

Browse files
feat: Adicionar arquivos de configuração para o serviço Locust
1 parent 5fdb4a3 commit f3c652a

11 files changed

+430
-0
lines changed

Diff for: docs/LOCUST.md

+61
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
# Teste de carga com Locust
2+
3+
O Locust é uma ferramenta de teste de carga que permite simular um grande número de usuários acessando um sistema ao mesmo tempo. Ele é muito utilizado para testar a escalabilidade de aplicações web.
4+
5+
No caso da nossa aplicação, o Locust será utilizado para simular o acesso de um grande número de usuários ao sistema, a fim de verificar se o mesmo é capaz de suportar a carga gerada. Para isso, será necessário criar um script que simule o comportamento dos usuários ao acessar o sistema.
6+
7+
Além disso conseguiremos verificar se o nosso cluster irá escalar a aplicação, visto que definimos no `values.yaml` a utilização de um `HorizontalPodAutoscaler`. O bloco que define o `HorizontalPodAutoscaler` é o seguinte:
8+
9+
```yaml
10+
11+
autoscaling:
12+
enabled: true
13+
minReplicas: 1
14+
maxReplicas: 100
15+
targetCPUUtilizationPercentage: 80
16+
targetMemoryUtilizationPercentage: 80
17+
```
18+
19+
O `HorizontalPodAutoscaler` irá escalar a aplicação de acordo com a utilização de CPU e memória. O `targetCPUUtilizationPercentage` e `targetMemoryUtilizationPercentage` definem o percentual de utilização de CPU e memória que irá disparar a escala da aplicação. Nesse caso o número máximo de réplicas é 100.
20+
21+
## Instalação
22+
23+
Para instalar o Locust, basta executar o seguinte comando:
24+
25+
```bash
26+
cd locust
27+
kubectl apply -f deployment.yaml -n locust
28+
kubectl apply -f service.yaml -n locust
29+
kubectl apply -f configmap.yaml -n locust
30+
kubectl apply -f ingress.yaml -n locust
31+
```
32+
33+
## Acesso
34+
35+
Para acessar o locust e iniciar os testes de carga, basta acessar o endereço `https://locust.nataliagranato.xyz` no navegador. Ou use o port-forward:
36+
37+
```bash
38+
kubectl port-forward svc/locust 8089:80 -n locust
39+
```
40+
41+
Ao acessar a aplicação, será necessário informar o número de usuários a serem simulados, a taxa de usuários por segundo e o tempo de execução do teste. Após preencher essas informações, basta clicar no botão `Start` para iniciar o teste.
42+
43+
Acompanhe o andamento do teste na aba `Charts`, onde é possível visualizar o número de usuários ativos, a taxa de requisições por segundo, o tempo de resposta e outros dados relevantes.
44+
45+
Para validar se o teste está sendo executado com sucesso, verifique os logs do locust. Você verá algo como:
46+
47+
```bash
48+
[2024-08-20 00:31:03,380] locust-66d9c889d9-s5v5g/INFO/locust.main: Starting web interface at http://0.0.0.0:8089
49+
50+
[2024-08-20 00:31:03,394] locust-66d9c889d9-s5v5g/INFO/locust.main: Starting Locust 2.31.3
51+
52+
[2024-08-20 00:31:11,772] locust-66d9c889d9-s5v5g/INFO/locust.runners: Ramping to 1000 users at a rate of 100.00 per second
53+
54+
[2024-08-20 00:31:20,864] locust-66d9c889d9-s5v5g/INFO/locust.runners: All users spawned: {"Giropops": 1000} (1000 total users)
55+
```
56+
57+
Esses logs indicam que o teste foi iniciado com sucesso na API `https://senhas.nataliagranato.xyz/api/senhas` e que os usuários estão sendo criados conforme o que eu solicitei.
58+
59+
Ao final do teste, é possível visualizar um relatório com os resultados obtidos, incluindo o número total de requisições, o tempo médio de resposta, o tempo total de execução e outros dados importantes.
60+
61+
Para visualizar o meu relatório inicial, acesse o link: [Relatório Inicial](https://locust.nataliagranato.xyz/stats/report?theme=dark)

Diff for: locust/configmap.yaml

+26
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
apiVersion: v1
2+
data:
3+
locustfile.py: |-
4+
from locust import HttpUser, task, between
5+
6+
class Giropops(HttpUser):
7+
wait_time = between(1, 2)
8+
9+
@task(1)
10+
def gerar_senha(self):
11+
self.client.post(
12+
"/api/gerar-senha",
13+
json={
14+
"tamanho": 8,
15+
"incluir_numeros": True,
16+
"incluir_caracteres_especiais": True
17+
}
18+
)
19+
20+
@task(2)
21+
def listar_senha(self):
22+
self.client.get("/api/senhas")
23+
kind: ConfigMap
24+
metadata:
25+
name: locust-scripts
26+
namespace: locust

Diff for: locust/deployment.yaml

+45
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
apiVersion: apps/v1
2+
kind: Deployment
3+
metadata:
4+
labels:
5+
app: locust
6+
name: locust
7+
namespace: locust
8+
spec:
9+
replicas: 1
10+
selector:
11+
matchLabels:
12+
app: locust
13+
template:
14+
metadata:
15+
labels:
16+
app: locust
17+
spec:
18+
containers:
19+
- image: locustio/locust:2.31.3
20+
name: locust
21+
env:
22+
- name: LOCUST_LOCUSTFILE
23+
value: "/usr/src/app/scripts/locustfile.py"
24+
resources:
25+
limits:
26+
cpu: '2'
27+
memory: 4Gi
28+
requests:
29+
cpu: '1'
30+
memory: 2Gi
31+
securityContext:
32+
readOnlyRootFilesystem: true
33+
runAsNonRoot: true
34+
runAsUser: 1000
35+
ports:
36+
- containerPort: 8089
37+
imagePullPolicy: Always
38+
volumeMounts:
39+
- name: locust-scripts
40+
mountPath: /usr/src/app/scripts
41+
volumes:
42+
- name: locust-scripts
43+
configMap:
44+
name: locust-scripts
45+
optional: true

Diff for: locust/ingress.yaml

+28
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
apiVersion: networking.k8s.io/v1
2+
kind: Ingress
3+
metadata:
4+
name: locust
5+
annotations:
6+
cert-manager.io/cluster-issuer: letsencrypt-prod
7+
kubernetes.io/ingress.class: nginx
8+
labels:
9+
app: locust
10+
namespace: locust
11+
12+
spec:
13+
ingressClassName: nginx
14+
rules:
15+
- host: locust.nataliagranato.xyz
16+
http:
17+
paths:
18+
- backend:
19+
service:
20+
name: locust
21+
port:
22+
number: 8089
23+
path: /
24+
pathType: Prefix
25+
tls:
26+
- hosts:
27+
- locust.nataliagranato.xyz
28+
secretName: locust.nataliagranato.xyz

Diff for: locust/report/failures_1724114366.1516452.csv

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
Method,Name,Error,Occurrences
2+
GET,/api/senhas/api/senhas,"gaierror(-3, 'Temporary failure in name resolution')",1
3+
GET,/api/senhas/api/senhas,"SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate (_ssl.c:1006)'))",60103
4+
POST,/api/senhas/api/gerar-senha,"SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate (_ssl.c:1006)'))",30033
5+
POST,/api/senhas/api/gerar-senha,"gaierror(-3, 'Temporary failure in name resolution')",1

Diff for: locust/report/report_1724114389.0576763.html

+248
Large diffs are not rendered by default.

Diff for: locust/report/requests_1724114365.324016.csv

+4
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
Type,Name,Request Count,Failure Count,Median Response Time,Average Response Time,Min Response Time,Max Response Time,Average Content Size,Requests/s,Failures/s,50%,66%,75%,80%,90%,95%,98%,99%,99.9%,99.99%,100%
2+
POST,/api/senhas/api/gerar-senha,30034,30034,180.0,1724.99289370333,7.566047832369804,13242.266472429037,0.0,100.01489098343275,100.01489098343275,180,3000,3600,4000,5100,5800,6500,6700,7600,10000,13000
3+
GET,/api/senhas/api/senhas,60104,60104,190.0,1752.4794916131204,7.740609347820282,13398.4948489815,0.0,200.14966396977567,200.14966396977567,190,3000,3600,4000,5100,5800,6500,6800,7900,10000,13000
4+
,Aggregated,90138,90138,190.0,1743.3209515786957,7.566047832369804,13398.4948489815,0.0,300.16455495320844,300.16455495320844,190,3000,3600,4000,5100,5800,6500,6700,7800,10000,13000

Diff for: locust/service.yaml

+13
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
apiVersion: v1
2+
kind: Service
3+
metadata:
4+
name: locust
5+
namespace: locust
6+
spec:
7+
selector:
8+
app: locust
9+
ports:
10+
- protocol: TCP
11+
port: 80
12+
targetPort: 8089
13+
type: ClusterIP

Diff for: screenshots/number_of_users_1724114404.746.png

188 KB
Loading

Diff for: screenshots/response_times_(ms)_1724114404.732.png

188 KB
Loading
188 KB
Loading

0 commit comments

Comments
 (0)