{"id":51892149,"url":"https://github.com/cburgosro9303/perfkit","last_synced_at":"2026-07-26T05:30:16.942Z","repository":{"id":366691154,"uuid":"1277427059","full_name":"cburgosro9303/perfkit","owner":"cburgosro9303","description":"Performance testing moderno en Rust/Tokio con app nativa y migración real desde Apache JMeter (importa tu .jmx, ejecuta local, reportes para CI).","archived":false,"fork":false,"pushed_at":"2026-06-22T23:08:52.000Z","size":1148,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-06-23T00:17:53.373Z","etag":null,"topics":["benchmark","ci","http","jmeter","jmeter-alternative","load-testing","performance-testing","qa","react","rust","stress-testing","tauri","testing-tools","tokio"],"latest_commit_sha":null,"homepage":"https://cburgosro9303.github.io/perfkit/","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cburgosro9303.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-06-22T22:16:28.000Z","updated_at":"2026-06-22T23:08:57.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/cburgosro9303/perfkit","commit_stats":null,"previous_names":["cburgosro9303/perfkit"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/cburgosro9303/perfkit","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cburgosro9303%2Fperfkit","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cburgosro9303%2Fperfkit/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cburgosro9303%2Fperfkit/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cburgosro9303%2Fperfkit/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cburgosro9303","download_url":"https://codeload.github.com/cburgosro9303/perfkit/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cburgosro9303%2Fperfkit/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":35902828,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-07-20T02:08:10.276Z","status":"online","status_checked_at":"2026-07-26T02:00:06.503Z","response_time":89,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["benchmark","ci","http","jmeter","jmeter-alternative","load-testing","performance-testing","qa","react","rust","stress-testing","tauri","testing-tools","tokio"],"created_at":"2026-07-26T05:30:16.192Z","updated_at":"2026-07-26T05:30:16.919Z","avatar_url":"https://github.com/cburgosro9303.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# perfkit\n\nSuite moderna de **performance testing** con un camino de migración creíble desde **Apache JMeter**: importa tu `.jmx`, entiende qué migró y qué no, ejecútalo localmente y obtén un reporte que reconoces — sin reescribir todo. CLI para terminal/CI y **app nativa** para QA.\n\n\u003e Nombre `perfkit` temporal/renombrable. Open-core (ver `docs/adr/ADR-001`).\n\n## Principio rector\n\n\u003e *\"Importé mi JMX, entendí qué migró y qué no, ejecuté la prueba localmente, obtuve un reporte que reconozco y puedo llevar esto a CI sin reescribir todo.\"*\n\n## Arquitectura\n\n```\nJMX ─import─▶ IR canónico (YAML/JSON/PKB) ─run─▶ métricas/percentiles ─report─▶ HTML/JSON/JUnit\n       │ reporte de fidelidad                      (motor Rust/Tokio)            (gate en CI)\n       │                                                   │\n       └────────────────────────────────────────── exportar ◀─┘ (YAML/JSON/PKB/JMX, ida y vuelta a JMeter)\n\nUI nativa (Tauri + React): Inicio · Plan (crear/editar) · Ejecutar (dashboard live + captura) ·\n                            Reporte (pestañas) · Histórico · Ayuda\n```\n\n| Crate | Rol |\n|---|---|\n| `scenario-ir` | Modelo IR canónico + serde + JSON Schema + validador |\n| `jmx-importer` | Parser JMX → IR + **reporte de fidelidad** (sin fallos silenciosos) + export IR→JMX |\n| `http-adapter` | Cliente HTTP/HTTPS (reqwest/rustls), mide TTFB y latencia total |\n| `engine` | Scheduler ramp-up/hold/ramp-down, VUs async, timers, assertions, extractores, captura por petición |\n| `metrics` | Histogramas (p50…p99.9), throughput, error rate, series, heatmap, status codes, bytes |\n| `reports` | HTML offline / JSON / JUnit + `gate` por thresholds |\n| `security` | Secretos y redacción (stub MVP) |\n| `kafka-adapter` | Productor Kafka (rskafka) — sampler Kafka (Fase 7) |\n| `cluster` | Ejecución distribuida coordinator/worker (Fase 6) |\n| `history` | Histórico SQLite, baselines, tendencias, regresión, RBAC, auditoría (Fase 10) |\n| `ai-assist` | IA gobernada local/BYOK, redacción, sugerencias revisables (Fase 9) |\n| `plugin-host` | Host de plugins WASM firmados (wasmi) (Fase 8) |\n| `cli` | Binario `perfkit` |\n| `ui/` | App nativa **Tauri 2 + React + TS + Tailwind** |\n\n## Quickstart (CLI)\n\n```bash\ncargo build --workspace\n\n# Importar un JMX → IR + reporte de fidelidad\n./target/debug/perfkit import jmx examples/jmx/checkout-demo.jmx -o scenario.yaml\n./target/debug/perfkit validate scenario.yaml\n\n# Depurar: corrida corta que captura y muestra cada request/response (como el View Results Tree)\n./target/debug/perfkit debug scenario.yaml --base-url http://127.0.0.1:3001 --iterations 1\n#   --no-redact muestra cabeceras/variables en texto plano\n\n# Ejecutar carga y generar reportes\n./target/debug/perfkit run scenario.yaml --base-url http://127.0.0.1:3001 --vus 50 --duration 20 --out reports/run-001\n\n# Quality gate para CI (exit 1 si rompe umbrales)\n./target/debug/perfkit gate reports/run-001/summary.json --thresholds examples/yaml/thresholds.yaml\n```\n\n### Dónde se guardan los resultados\n\n`perfkit run` escribe en **`reports/\u003crun-id\u003e/`** por defecto (relativo a tu directorio actual), o en el directorio que pases con **`--out \u003cdir\u003e`**. Genera:\n\n| Archivo | Cuándo | Para qué |\n|---|---|---|\n| `summary.json` | siempre | machine-readable; **se carga en la UI** para visualizarlo |\n| `report.html` | `--report html` (o por defecto) | reporte offline, compartible |\n| `report.junit.xml` | `--report junit` (o por defecto) | CI |\n\n`perfkit debug` imprime el detalle por **stdout** (no escribe archivos). `perfkit history` usa una base SQLite (`perfkit-history.db`).\n\n## UI nativa\n\n```bash\ncd ui \u0026\u0026 pnpm install \u0026\u0026 pnpm tauri dev      # desarrollo\n# o\npnpm -C ui tauri build                       # binario release\n```\n\nQué puedes hacer en la app (sin escribir código):\n\n- **Inicio:** crear un plan desde cero, importar un `.jmx` (con reporte de fidelidad), abrir un **ejemplo ejecutable** (checkout contra `httpbin.org`) o **cargar resultados** de una corrida de terminal (`summary.json`).\n- **Plan:** construir/editar el árbol nativo (grupos de hilos, controladores, HTTP, timers, assertions, extractores, variables) y **probar una sola petición** mientras construyes.\n- **Ejecutar:** overrides por corrida (URL base/VUs/duración), **dashboard en vivo** y **captura de peticiones** para inspección (request/response, variables, redacción de secretos con flag de texto plano y **límite de captura** configurable).\n- **Reporte (pestañas):** Resumen · **Latencia** (curva de percentiles, histograma, TTFB, Apdex) · **Capacidad** (saturación VUs, bytes) · **Errores** (por código y por tipo) · **SLA** (umbrales + veredicto) · **Heatmap** · **Peticiones** (árbol de resultados). Exportable a HTML/JSON/JUnit.\n- **Histórico:** guardar corridas, fijar baseline, ver regresiones y tendencias.\n- **Ayuda:** guía completa (flujo, tipos de controladores, assertions/variables, métricas, migración, CI).\n\n### Capturas\n\n| Inicio — crear / importar / ejemplo / cargar resultados | Plan — árbol nativo + editor |\n|---|---|\n| ![Inicio](docs/screenshots/readme-01-inicio.png) | ![Plan](docs/screenshots/readme-02-plan.png) |\n| **Ejecutar** — overrides, captura y dashboard en vivo | **Reporte · Resumen** — KPIs + series |\n| ![Ejecutar](docs/screenshots/readme-03-ejecutar.png) | ![Reporte Resumen](docs/screenshots/readme-04-report-resumen.png) |\n| **Reporte · Latencia** — curva de percentiles + histograma | **Reporte · Heatmap** — latencia × tiempo |\n| ![Latencia](docs/screenshots/readme-05-latencia.png) | ![Heatmap](docs/screenshots/readme-06-heatmap.png) |\n\n**Peticiones** — árbol de resultados (request/response, variables, redacción de secretos):\n\n![Peticiones](docs/screenshots/readme-07-peticiones.png)\n\n## Benchmark local vs JMeter\n\nComparación reproducible: el **mismo plan** y el **mismo target** para ambos motores.\n\n```bash\n# Target Node mínimo\nbash tools/benchmark.sh 50 20\n\n# Mock local con Mockoon (5 endpoints; importa tools/mockoon/perfkit-bench.json y dale Play en :3001)\nbash tools/benchmark-mockoon.sh 50 20 3001\n```\n\nResultado típico (target local que satura, mismo plan, JDK 21):\n\n| Métrica | perfkit | JMeter | Ventaja |\n|---|---:|---:|---:|\n| Throughput (req/s) | ~110k | ~108k | ~1.0x (paridad) |\n| Memoria pico RSS (MB) | ~17 | ~900 | **~50x menos** |\n\nComo el target satura antes que el generador, el **throughput sale a la par**; la ventaja real y medible es la **memoria** (~50x menos) y el overhead por VU. Detalle: `docs/benchmarks/`.\n\n## Capacidades avanzadas (CLI)\n\n```bash\n# Distribuido (Fase 6): un worker por nodo + coordinator que reparte y consolida\nperfkit cluster worker --port 7711\nperfkit cluster run scenario.yaml --workers http://n1:7711,http://n2:7711 --vus 200 --duration 60 --out reports/dist\n\n# Histórico / regresión (Fase 10)\nperfkit history record reports/dist/summary.json --db perfkit.db --branch main --environment staging\nperfkit history compare --db perfkit.db --run-id 7 --branch main --environment staging --scenario demo  # exit 1 si hay regresión\n\n# IA gobernada (Fase 9; SaaS apagado por defecto, nada sale sin opt-in)\nperfkit ai explain reports/dist/summary.json\n\n# Plugins WASM firmados (Fase 8)\nperfkit plugin verify plugin.wasm plugin.json --pubkey \u003chex\u003e\n\n# Exportar el IR a otro formato (incluye .jmx para abrir/ejecutar en JMeter)\nperfkit export scenario.yaml --format jmx --out scenario.jmx\n```\n\nFormatos del IR: **YAML** (legible), **JSON**, **PKB** (binario compacto, MessagePack) y **JMX** (ida y vuelta a JMeter). Despliegue distribuido en `deploy/` (Docker Compose, K8s CRD `LoadTest`, Helm, diseño de operator); CI/Docker/release en `docs/deploy/`.\n\n## Estado\n\nPlan completo recorrido (Fases 0–10) como **slices MVP funcionales, compilando y con tests** (`cargo test --workspace` en verde). Lo que requiere infraestructura externa real queda explícitamente **diferido** y documentado: gRPC+mTLS y operator de K8s real (Fase 6), broker Kafka real + SASL/SSL (Fase 7), registry de plugins de terceros (Fase 8), LLM/SaaS de IA real (Fase 9), SSO/multi-tenant gestionado (Fase 10), export Prometheus/OTLP y sidecar JVM para JSR223.\n\nAnálisis honesto de qué está hecho vs. diferido: **`docs/status/gap-analysis.md`**. Decisiones: `docs/adr/` (ADR-001…010). Plan original: `CLAUDE_OPUS_IMPLEMENTATION_PLAN.md`.\n\n## Sitio web (GitHub Pages)\n\nSitio en vivo: **https://cburgosro9303.github.io/perfkit/** (fuente: `docs/index.html`, autocontenida, sin dependencias; `docs/.nojekyll` evita Jekyll). Sus enlaces a GitHub/issues se autoconfiguran desde la URL de Pages.\n\n## Comunidad e issues\n\n¿Un bug, una idea o un problema de migración? Abre un issue con **New issue** y elige la plantilla:\n\n| Plantilla | Para |\n|---|---|\n| 🐞 Reporte de bug | Algo no funciona (incluye área + severidad para priorizar) |\n| ✨ Propuesta de mejora | Funcionalidad o cambio |\n| 🔄 Problema de migración | Un elemento del JMX no migró bien (con el reporte de fidelidad) |\n| ❓ Pregunta / soporte | Dudas de uso |\n\nLas plantillas (formularios estructurados con auto-etiquetado por tipo) están en `.github/ISSUE_TEMPLATE/`. Abre uno en **https://github.com/cburgosro9303/perfkit/issues/new/choose**.\n\n## Licencia\n\nApache-2.0.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcburgosro9303%2Fperfkit","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcburgosro9303%2Fperfkit","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcburgosro9303%2Fperfkit/lists"}