Configurando uma pipeline para Testes de Carga com k6 e New Relic

Sabrina Morales
SysAdminas
3 min readFeb 2, 2024

--

O k6 é uma ferramenta open source utilizada para realizar testes de carga e desempenho em aplicações, os testes são escritos em JavaScript ES2015/ES6 e podem ser executados de forma eficiente tanto em ambientes locais quanto em nuvem.

O k6 tem integração para mostrar o output dos testes em tempo real para diversas ferramentas, o intuito desse artigo é exibir os dados em tempo real no New Relic através de uma pipeline no Github Actions.

New Relic StatsD Integration

Essa é a integração oficial utilizada na documentação do k6 para mostrar os dados de teste no New Relic, o exemplo roda o NRStatsD num container com o seguinte comando:

docker run --rm \
-d --restart unless-stopped \
--name newrelic-statsd \
-h $(hostname) \
-e NR_ACCOUNT_ID=<NR-ACCOUNT-ID> \
-e NR_API_KEY="<NR-INSERT-API-KEY>" \
-p 8125:8125/udp \
newrelic/nri-statsd:latest

Rodando este comando localmente dentro de uma máquina que já tenha o k6 instalado, a integração funciona normalmente com a flag "- - out statsd" apontando para o arquivo de teste.

k6 run --out statsd tests/web_view/homepage.js

Mas para rodar de forma automatizada, é preciso fazer alguns ajustes.

Criando a pipeline pelo Github Actions

Para simular o mesmo comportamento local da integração vamos utilizar o service container do Github Actions para criar um container que fica ativo durante toda a execução da pipeline de testes. O service container permite a execução de serviços adicionais durante a pipeline, como banco de dados, containers e servidores.

Neste exemplo, o Service Container fornece um ambiente PostgreSQL auxiliar para os testes, permitindo que a aplicação consiga criar uma tabela de exemplo, inserir dados e realizar qualquer teste adicional necessário durante a execução da pipeline.

jobs:
test:
runs-on: ubuntu-latest

services:
postgres:
image: postgres:latest
env:
POSTGRES_USER: user
POSTGRES_PASSWORD: password
POSTGRES_DB: testdb
ports:
- 5432:5432

Vamos construir a pipeline de forma que a cada push na branch main ela seja acionada, criando o service container do NRStatsD e executando o teste no k6.

O job, k6, é o responsável por rodar o teste e enviar o output para o service do NRStatsD.

O service container, newrelic-statsd, utiliza a imagem da integração com as variáveis de autenticação do new relic e expõe a porta 8125, permitindo a conexão com o k6.

# Path: .github/workflows/main.yml

name: Performance Test
on:
push:
branches: [main]

jobs:
k6:
name: k6 Performance Test
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v2

- name: Run k6 test
uses: grafana/k6-action@v0.3.0
with:
filename: tests/web_view/homepage.js
flags: --out statsd --env K6_STATSD_ADDR=newrelic-statsd:8125

services:
newrelic-statsd:
image: newrelic/nri-statsd:latest
env:
NR_ACCOUNT_ID: ${{ secrets.NR_ACCOUNT_ID }}
NR_API_KEY: ${{ secrets.NR_API_KEY }}
ports:
- 8125:8125

A comunicação entre o service criado do NRStatsD e o job do k6 é feita através da porta 8125 na pipeline, igual ao comando rodado localmente. Além da flag “- -out statsd” ao rodar o k6, também passamos a referência ao service newrelic-statsd na porta 8125.

Ao finalizar a execução da pipeline podemos conferir os dados no New Relic na aba de Metrics, filtrando por "k6", e posteriormente é possível criar dashboards personalizados com as informações mais relevantes.

--

--