{"componentChunkName":"component---src-templates-docs-js","path":"/es-es/guides/monitoring-as-code","result":{"data":{"site":{"siteMetadata":{"title":"Documentation | LoadFocus","docsLocation":""}},"mdx":{"fields":{"id":"3bd9b13a-7267-50d1-8b31-0b8c39be78cb","title":"Monitoring as Code","slug":"/es-es/guides/monitoring-as-code","locale":"es-ES"},"body":"var _excluded = [\"components\"];\nfunction _extends() { return _extends = Object.assign ? Object.assign.bind() : function (n) { for (var e = 1; e < arguments.length; e++) { var t = arguments[e]; for (var r in t) ({}).hasOwnProperty.call(t, r) && (n[r] = t[r]); } return n; }, _extends.apply(null, arguments); }\nfunction _objectWithoutProperties(e, t) { if (null == e) return {}; var o, r, i = _objectWithoutPropertiesLoose(e, t); if (Object.getOwnPropertySymbols) { var n = Object.getOwnPropertySymbols(e); for (r = 0; r < n.length; r++) o = n[r], -1 === t.indexOf(o) && {}.propertyIsEnumerable.call(e, o) && (i[o] = e[o]); } return i; }\nfunction _objectWithoutPropertiesLoose(r, e) { if (null == r) return {}; var t = {}; for (var n in r) if ({}.hasOwnProperty.call(r, n)) { if (-1 !== e.indexOf(n)) continue; t[n] = r[n]; } return t; }\n/* @jsxRuntime classic */\n/* @jsx mdx */\n\nvar _frontmatter = {\n  \"title\": \"Monitoring as Code\",\n  \"metaTitle\": \"Monitoring as Code: gestiona los monitores de LoadFocus con una CLI | Guias | LoadFocus\",\n  \"metaDescription\": \"Define tus comprobaciones de API, browser, multistep, TCP y heartbeat de LoadFocus, asi como grupos, alertas, ventanas de mantenimiento, paneles y paginas de estado, como archivos versionados, y despliegalos desde la linea de comandos o CI con la CLI @loadfocus/monitoring.\",\n  \"order\": 9\n};\nvar layoutProps = {\n  _frontmatter: _frontmatter\n};\nvar MDXLayout = \"wrapper\";\nreturn function MDXContent(_ref) {\n  var components = _ref.components,\n    props = _objectWithoutProperties(_ref, _excluded);\n  return mdx(MDXLayout, _extends({}, layoutProps, props, {\n    components: components,\n    mdxType: \"MDXLayout\"\n  }), mdx(\"h1\", null, \"Monitoring as Code\"), mdx(\"p\", null, \"Monitoring as Code te permite definir tu configuracion de monitoreo de LoadFocus como archivos versionados y aplicarla desde la linea de comandos o CI, igual que gestionas la infraestructura con Terraform o Pulumi. Describes los monitores, grupos, alertas, ventanas de mantenimiento, paneles y paginas de estado que quieres; la CLI \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"@loadfocus/monitoring\"), \" calcula la diferencia con lo que esta en produccion y la reconcilia (crear, actualizar, eliminar).\"), mdx(\"p\", null, \"Es declarativa e idempotente: ejecutar \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"deploy\"), \" dos veces no cambia nada la segunda vez. Tus archivos son la fuente de verdad, asi que los cambios pasan por pull requests y el historial de tu monitoreo vive en git.\"), mdx(\"p\", null, \"Todo se ejecuta dentro de tu cuenta y tu equipo activo, con los limites de tu plan aplicados por el backend de LoadFocus exactamente igual que en el panel. La CLI solo hace lo que tu mismo podrias hacer en la interfaz.\"), mdx(\"h2\", null, \"Como funciona\"), mdx(\"p\", null, \"Mantienes una carpeta de archivos YAML (o JavaScript) pequenos (un recurso por archivo) mas un \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"loadfocus.config.yaml\"), \" que apunta a ellos. La CLI envia esas definiciones a LoadFocus, que las mapea a recursos en produccion, las compara y devuelve un plan. Revisas el plan y luego lo aplicas.\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Escribe\"), \" \\u2014 describe los recursos como archivos (constructos YAML o JS).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Planifica\"), \" \\u2014 \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"deploy --dry-run\"), \" muestra exactamente que se va a crear, actualizar, adoptar o eliminar.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Aplica\"), \" \\u2014 \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"deploy\"), \" reconcilia tu cuenta para que coincida con los archivos.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Reconcilia la identidad\"), \" \\u2014 cada recurso lleva un \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"logicalId\"), \" estable que tu eliges. Asi es como la CLI rastrea un recurso a traves de los cambios de nombre, de modo que cambiar el nombre visible de una comprobacion nunca la recrea.\")), mdx(\"h2\", null, \"Instalacion\"), mdx(\"p\", null, \"La CLI es un paquete de Node (Node 18+). Ejecutala bajo demanda con \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"npx\"), \":\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"npx @loadfocus/monitoring --help\\n\")), mdx(\"p\", null, \"\\u2026o instalala globalmente para obtener el comando \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"loadfocus-monitoring\"), \":\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"npm install -g @loadfocus/monitoring\\nloadfocus-monitoring --help\\n\")), mdx(\"h2\", null, \"Autenticacion\"), mdx(\"p\", null, \"La CLI se autentica con una clave de API de LoadFocus y un id de equipo. Encuentra tu clave de API en el panel, en los ajustes de tu cuenta/API, y tu id de equipo en la pagina de equipos.\"), mdx(\"p\", null, \"Inicia sesion una vez y las credenciales se guardan en \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"~/.loadfocus/config.json\"), \":\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"loadfocus-monitoring login\\nloadfocus-monitoring whoami        # confirm who you are and which team you're targeting\\n\")), mdx(\"p\", null, \"Para CI, prefiere las variables de entorno (anulan la configuracion guardada y nunca tocan el disco):\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"export LOADFOCUS_API_KEY=\\\"apikey_xxxxxxxx\\\"\\nexport TEAM_ID=\\\"team_xxxxxxxx\\\"\\n# optional: export API_URL=\\\"https://apimonitor.loadfocus.com\\\"\\n\")), mdx(\"h2\", null, \"Crear un proyecto\"), mdx(\"p\", null, \"Genera un archivo de configuracion y un monitor de ejemplo en tu repositorio:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"loadfocus-monitoring init\\n\")), mdx(\"p\", null, \"Esto escribe \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"loadfocus.config.yaml\"), \":\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"project: my-project          # a namespace for this set of resources\\ncheckMatch:\\n  - \\\"monitors/**/*.{check,group,alertRule,maintenanceWindow,dashboard,statusPage,alertChannel,variable}.{yaml,yml,js}\\\"\\ndefaults:\\n  schedule: \\\"300\\\"            # applied to checks that omit a schedule\\n  locations: [us-east-1]\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"project\")), \" delimita todo lo que la CLI gestiona. Los recursos de un proyecto se reconcilian juntos; cualquier cosa del proyecto que ya no este en tus archivos se elimina en \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"deploy\"), \". Usa proyectos separados para gestionar conjuntos independientes de monitores.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"checkMatch\")), \" es el glob (o los globs) de tus archivos de autoria.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"defaults\")), \" rellenan \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"schedule\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"locations\"), \" y \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"alertChannels\"), \" para las comprobaciones que los omiten.\")), mdx(\"h2\", null, \"El flujo de trabajo\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"loadfocus-monitoring validate          # compile locally + server-side dry-run; great as a PR gate\\nloadfocus-monitoring deploy --dry-run  # show the plan (created / updated / adopted / deleted)\\nloadfocus-monitoring deploy            # apply it\\nloadfocus-monitoring list              # inventory of what's deployed in the project\\nloadfocus-monitoring list --status     # \\u2026with each check's latest up/down/degraded status\\nloadfocus-monitoring get <logicalId>   # show one deployed resource\\nloadfocus-monitoring trigger <logicalId>   # run a check now\\nloadfocus-monitoring destroy           # delete everything managed in the project\\n\")), mdx(\"p\", null, mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"deploy\"), \" es seguro por defecto: muestra el plan y, cuando se ejecuta de forma interactiva, pregunta antes de eliminar nada. En CI (no interactivo), se niega a eliminar sin \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"--yes\"), \" y termina con un codigo claro en lugar de quedarse colgado en un prompt. Anade \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"--json\"), \" a los comandos de lectura/resultado para una salida legible por maquina.\"), mdx(\"h2\", null, \"Adoptar monitores existentes\"), mdx(\"p\", null, \"Ya tienes monitores en el panel? Importalos a archivos en lugar de recrearlos:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"loadfocus-monitoring import --project my-project --out monitors\\n\")), mdx(\"p\", null, \"Esto escribe un archivo por recurso y un \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"loadfocus.config.yaml\"), \". Revisa, haz commit y luego ejecuta \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"deploy --dry-run\"), \": los recursos coincidentes se \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"adoptan\"), \" en su lugar (quedan bajo gestion) en vez de duplicarse.\"), mdx(\"h2\", null, \"Recursos\"), mdx(\"p\", null, \"Cada recurso es un archivo con un \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"kind\"), \", un \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"logicalId\"), \" (tu identificador estable) y los campos de ese kind. Las referencias entre recursos usan \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"logicalId\"), \"s (o nombres para los canales de alerta); el servidor las resuelve y el orden de despliegue se gestiona por ti.\"), mdx(\"h3\", null, \"Comprobaciones\"), mdx(\"p\", null, \"Un unico kind \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"Monitor\"), \" cubre todos los tipos de comprobacion mediante \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"type\"), \": \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"api\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"browser\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"multistep\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"tcp\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"heartbeat\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"kind: check\\ntype: api\\nlogicalId: home\\nname: Home API\\nschedule: \\\"300\\\"            # seconds between runs\\nlocations: [us-east-1, eu-west-1]\\nrequest:\\n  url: \\\"https://example.com/health\\\"\\n  method: GET\\nassertions:\\n  - { type: statusCode, comparison: equals, value: 200 }\\n  - { type: responseTime, comparison: lessThan, value: 1000 }\\n\")), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"api\"), \" \\u2014 peticion HTTP con aserciones sobre estado, cuerpo, cabeceras, tiempo de respuesta y expiracion de SSL.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"browser\"), \" \\u2014 un script de flujo de usuario de Playwright con capturas de pantalla y tiempos por paso (de pago).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"multistep\"), \" \\u2014 una secuencia ordenada de peticiones de API que pasan datos entre pasos.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"tcp\"), \" \\u2014 una comprobacion de puerto/alcanzabilidad desde varias regiones.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"heartbeat\"), \" \\u2014 un interruptor de hombre muerto: un trabajo externo hace ping a una URL segun una programacion, y LoadFocus alerta si falta un ping.\")), mdx(\"h3\", null, \"Grupos\"), mdx(\"p\", null, \"Comparte ubicaciones, canales de alerta, frecuencia y activacion entre muchas comprobaciones. Una comprobacion se une a un grupo con \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"group: <logicalId>\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"kind: group\\nlogicalId: web\\nname: Web services\\nlocations: [us-east-1, eu-west-1]\\n\")), mdx(\"h3\", null, \"Reglas de alerta\"), mdx(\"p\", null, \"Alerta cuando la metrica de una comprobacion cruza un umbral.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"kind: alertRule\\nlogicalId: home-latency\\nname: Home API latency\\ncheck: home               # reference a check by logicalId\\nmetric: responseTime      # responseTime | statusCode | duration\\ncondition: above\\nconditionValue: 1500      # milliseconds\\n\")), mdx(\"h3\", null, \"Canales de alerta\"), mdx(\"p\", null, \"Gestiona los canales de notificacion como codigo y referencialos \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"por nombre\"), \" desde una comprobacion, grupo o regla de alerta. Tipos (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"type\"), \") admitidos: \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"email\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"slack\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"microsoftteams\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"webhook\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"discord\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"pagerduty\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"opsgenie\"), \". Los campos secretos (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"webhookUrl\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"routingKey\"), \", \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"apiKey\"), \") toman una referencia \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"{{secrets.NAME}}\"), \": el valor se almacena con \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"env set-secret\"), \" y se resuelve al enviar una alerta, nunca se incluye en tus archivos.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"kind: alertChannel\\nlogicalId: oncall          # the name checks / groups / alert rules reference\\ntype: pagerduty\\nroutingKey: \\\"{{secrets.PAGERDUTY_KEY}}\\\"\\n\")), mdx(\"h3\", null, \"Ventanas de mantenimiento\"), mdx(\"p\", null, \"Suprime las alertas durante el trabajo planificado. Las horas son UTC. \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"startsAt\"), \" / \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"endsAt\"), \" aceptan una cadena ISO-8601 (por ejemplo, \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"\\\"2026-07-01T00:00:00Z\\\"\"), \") o milisegundos unix.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"kind: maintenanceWindow\\nlogicalId: weekly-deploy\\nname: Weekly deploy window\\nenabled: true\\nstartsAt: \\\"2026-07-01T00:00:00Z\\\"   # ISO-8601 or unix ms\\nendsAt: \\\"2026-07-01T02:00:00Z\\\"\\nrepeat: weekly            # none | daily | weekly | monthly\\nweekdays: [2]             # 0=Sun \\u2026 6=Sat\\ntargets:\\n  allChecks: false\\n  checkIds: [home]        # by logicalId\\n\")), mdx(\"h3\", null, \"Paneles\"), mdx(\"p\", null, \"Una vista compartida de comprobaciones seleccionadas, opcionalmente publica mediante un slug.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"kind: dashboard\\nlogicalId: status-overview\\nname: Status overview\\nvisibility: private       # private | public\\nchecks: [home]            # by logicalId\\nwindow: 24h               # 24h | 7d | 30d\\n\")), mdx(\"h3\", null, \"Paginas de estado\"), mdx(\"p\", null, \"Una pagina de estado publica en \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"<slug>.loadfoc.us\"), \", opcionalmente en tu propio dominio personalizado.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"kind: statusPage\\nlogicalId: public-status\\ntitle: Acme Status\\nslug: acme                # -> acme.loadfoc.us (globally unique)\\nenabled: true\\ncustomDomain: status.acme.com   # optional, paid; point a CNAME at cname.loadfoc.us\\ngroups:\\n  - { id: core, name: Core Services, order: 0 }\\ncomponents:\\n  - id: api\\n    name: API\\n    groupId: core\\n    monitors: [home]      # checks shown on this component, by logicalId\\nbranding:\\n  brandColor: \\\"#5353a4\\\"\\n  colorTheme: dark\\n\")), mdx(\"p\", null, \"Un dominio personalizado entra en funcionamiento una vez que creas el CNAME y se emite el certificado: \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"deploy\"), \" lo declara; la verificacion ocurre fuera de banda.\"), mdx(\"h3\", null, \"Variables\"), mdx(\"p\", null, \"Valores no secretos (URLs base, IDs) que las comprobaciones referencian en tiempo de ejecucion como \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"{{vars.NAME}}\"), \". El \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"logicalId\"), \" es la clave de la variable. (Para los secretos, usa \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"env set-secret\"), \": nunca los pongas en archivos.)\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"kind: variable\\nlogicalId: BASE_URL\\nvalue: \\\"https://api.example.com\\\"\\n\")), mdx(\"h2\", null, \"Autoria en JavaScript o TypeScript\"), mdx(\"p\", null, \"Si prefieres codigo en lugar de YAML, construye las mismas definiciones de forma programatica y exportalas: los constructos producen recursos identicos:\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-js\"\n  }, \"const { Monitor, Group, AlertRule, Maintenance, Dashboard, StatusPage, AlertChannel, Variable } = require('@loadfocus/monitoring');\\n\\nnew Monitor({\\n  type: 'api', logicalId: 'home', name: 'Home API', schedule: '300',\\n  locations: ['us-east-1'],\\n  request: { url: 'https://example.com/health', method: 'GET' },\\n  assertions: [{ type: 'statusCode', comparison: 'equals', value: 200 }],\\n});\\n\\nnew Group({ logicalId: 'web', name: 'Web services', locations: ['us-east-1'] });\\n\")), mdx(\"p\", null, \"Apunta \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"checkMatch\"), \" a tus archivos \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \".js\"), \" y la CLI los carga como cualquier otro recurso.\"), mdx(\"h2\", null, \"Secretos y variables\"), mdx(\"p\", null, \"Referencia valores desde tus comprobaciones sin incluirlos en el repositorio. Los \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"secretos\"), \" (tokens, contrasenas) se gestionan unicamente de forma imperativa y se referencian como \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"{{secrets.NAME}}\"), \" en los campos de las comprobaciones y en los campos secretos de los canales de alerta. Las \", mdx(\"strong\", {\n    parentName: \"p\"\n  }, \"variables\"), \" (no secretas) pueden declararse como archivos (\", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"kind: variable\"), \", arriba) o establecerse de forma imperativa, y se referencian como \", mdx(\"inlineCode\", {\n    parentName: \"p\"\n  }, \"{{vars.NAME}}\"), \".\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-bash\"\n  }, \"loadfocus-monitoring env set-secret API_TOKEN \\\"s3cr3t\\\"\\nloadfocus-monitoring env set-variable BASE_URL \\\"https://example.com\\\"\\nloadfocus-monitoring env ls            # list secret + variable keys (values never shown)\\n\")), mdx(\"h2\", null, \"Ejecutarla en CI\"), mdx(\"p\", null, \"Un pipeline tipico valida en cada pull request y despliega al hacer merge a la rama principal.\"), mdx(\"pre\", null, mdx(\"code\", {\n    parentName: \"pre\",\n    \"className\": \"language-yaml\"\n  }, \"# .github/workflows/monitoring.yml\\nname: monitoring\\non:\\n  pull_request:\\n  push:\\n    branches: [main]\\njobs:\\n  monitoring:\\n    runs-on: ubuntu-latest\\n    env:\\n      LOADFOCUS_API_KEY: ${{ secrets.LOADFOCUS_API_KEY }}\\n      TEAM_ID: ${{ secrets.LOADFOCUS_TEAM_ID }}\\n    steps:\\n      - uses: actions/checkout@v4\\n      - uses: actions/setup-node@v4\\n        with: { node-version: 20 }\\n      - run: npx @loadfocus/monitoring validate\\n      - if: github.ref == 'refs/heads/main'\\n        run: npx @loadfocus/monitoring deploy --yes\\n\")), mdx(\"h2\", null, \"Cosas que conviene saber\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, mdx(\"inlineCode\", {\n    parentName: \"strong\"\n  }, \"logicalId\"), \" es la identidad.\"), \" Mantenlo estable. Puedes renombrar libremente el \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"name\"), \" o el \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"title\"), \" de una comprobacion; cambiar su \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"logicalId\"), \" se trata como eliminar un recurso y crear otro.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Las eliminaciones se limitan al proyecto.\"), \" \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"deploy\"), \" solo retira recursos del \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"project\"), \" actual que ya no estan en tus archivos, nunca nada de otro proyecto ni creado fuera de Monitoring as Code (hasta que lo adoptes).\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Los slugs de las paginas de estado son globales.\"), \" El \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"slug\"), \" se convierte en un subdominio, asi que debe ser unico entre todos los clientes de LoadFocus.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Las funciones de pago fallan de forma explicita.\"), \" Un equipo gratuito que declare un campo solo de pago (un dominio personalizado en una pagina de estado, quitar la insignia \\\"Powered by\\\") recibe un error claro en \", mdx(\"inlineCode\", {\n    parentName: \"li\"\n  }, \"deploy\"), \" en lugar de un resultado parcial silencioso.\"), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"strong\", {\n    parentName: \"li\"\n  }, \"Se aplican los limites del plan.\"), \" Crear recursos mediante la CLI esta sujeto a las mismas cuotas de plan que el panel.\")), mdx(\"h2\", null, \"Relacionado\"), mdx(\"ul\", null, mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"/docs/guides/api-monitoring\"\n  }, \"API monitoring\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"/docs/guides/mcp\"\n  }, \"Controla LoadFocus desde tu asistente de IA (MCP)\")), mdx(\"li\", {\n    parentName: \"ul\"\n  }, mdx(\"a\", {\n    parentName: \"li\",\n    \"href\": \"/docs/guides/teams\"\n  }, \"Equipos\"))));\n}\n;\nMDXContent.isMDXComponent = true;","tableOfContents":{"items":[{"url":"#monitoring-as-code","title":"Monitoring as Code","items":[{"url":"#como-funciona","title":"Como funciona"},{"url":"#instalacion","title":"Instalacion"},{"url":"#autenticacion","title":"Autenticacion"},{"url":"#crear-un-proyecto","title":"Crear un proyecto"},{"url":"#el-flujo-de-trabajo","title":"El flujo de trabajo"},{"url":"#adoptar-monitores-existentes","title":"Adoptar monitores existentes"},{"url":"#recursos","title":"Recursos","items":[{"url":"#comprobaciones","title":"Comprobaciones"},{"url":"#grupos","title":"Grupos"},{"url":"#reglas-de-alerta","title":"Reglas de alerta"},{"url":"#canales-de-alerta","title":"Canales de alerta"},{"url":"#ventanas-de-mantenimiento","title":"Ventanas de mantenimiento"},{"url":"#paneles","title":"Paneles"},{"url":"#paginas-de-estado","title":"Paginas de estado"},{"url":"#variables","title":"Variables"}]},{"url":"#autoria-en-javascript-o-typescript","title":"Autoria en JavaScript o TypeScript"},{"url":"#secretos-y-variables","title":"Secretos y variables"},{"url":"#ejecutarla-en-ci","title":"Ejecutarla en CI"},{"url":"#cosas-que-conviene-saber","title":"Cosas que conviene saber"},{"url":"#relacionado","title":"Relacionado"}]}]},"parent":{"__typename":"File","relativePath":"es-es/guides/monitoring-as-code.md"},"frontmatter":{"metaTitle":"Monitoring as Code: gestiona los monitores de LoadFocus con una CLI | Guias | LoadFocus","metaDescription":"Define tus comprobaciones de API, browser, multistep, TCP y heartbeat de LoadFocus, asi como grupos, alertas, ventanas de mantenimiento, paneles y paginas de estado, como archivos versionados, y despliegalos desde la linea de comandos o CI con la CLI @loadfocus/monitoring.","order":9}},"allMdx":{"edges":[{"node":{"fields":{"slug":"/es-es","title":"Bienvenido a la Nueva Documentación de LoadFocus"}}},{"node":{"fields":{"slug":"/es-es/guides","title":"Guías Prácticas"}}},{"node":{"fields":{"slug":"/es-es/knowledge-base","title":"Base de Conocimientos"}}},{"node":{"fields":{"slug":"/es-es/pricing","title":"Preguntas Frecuentes sobre Precios"}}},{"node":{"fields":{"slug":"/es-es/knowledge-base/understanding-declined-card-payments","title":"¿Por qué ha sido rechazado el pago con mi tarjeta?"}}},{"node":{"fields":{"slug":"/es-es/knowledge-base/how-to-update-card-details","title":"Cómo Actualizar los Datos de la Tarjeta para Pagos Fallidos"}}},{"node":{"fields":{"slug":"/es-es/knowledge-base/understanding-differences-between-http-and-https","title":"Diferencias entre HTTP y HTTPS"}}},{"node":{"fields":{"slug":"/es-es/knowledge-base/using-google-analytics-and-no-requests-while-load-testing","title":"Sin tráfico en Google Analytics durante las pruebas de carga"}}},{"node":{"fields":{"slug":"/es-es/knowledge-base/using-3rd-party-tools-to-load-test-website-locally","title":"Cómo hacer pruebas de carga de un sitio web o API alojado localmente"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring","title":"Monitoreo de API"}}},{"node":{"fields":{"slug":"/es-es/knowledge-base/using-query-parameters","title":"Cómo Usar Parámetros de Consulta URL"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing","title":"Pruebas de Carga con Apache JMeter"}}},{"node":{"fields":{"slug":"/es-es/knowledge-base/what-is-an-http-method","title":"Qué es un método de solicitud HTTP"}}},{"node":{"fields":{"slug":"/es-es/guides/external-reports","title":"Informes Externos"}}},{"node":{"fields":{"slug":"/es-es/knowledge-base/using-valid-url-endpoints","title":"Qué es una URL Válida para una Prueba de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/k6-load-testing","title":"k6 pruebas de carga"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing","title":"Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/mcp","title":"Asistentes de IA (MCP)"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance","title":"Monitorear el Rendimiento del Sitio Web"}}},{"node":{"fields":{"slug":"/es-es/guides/monitoring-as-code","title":"Monitoring as Code"}}},{"node":{"fields":{"slug":"/es-es/guides/openapi-import","title":"Importar desde OpenAPI / Swagger"}}},{"node":{"fields":{"slug":"/es-es/guides/onboarding","title":"Onboarding de LoadFocus"}}},{"node":{"fields":{"slug":"/es-es/guides/setup-teardown-scripts","title":"Scripts de configuración y limpieza"}}},{"node":{"fields":{"slug":"/es-es/guides/teams","title":"Gestión de Equipos"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/alert-channels","title":"Canales de alerta: Discord, PagerDuty y Opsgenie"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/downloading-jmx-csv-files","title":"Descargar Archivos .JMX y .CSV en LoadFocus"}}},{"node":{"fields":{"slug":"/es-es/guides/k6-load-testing/analyzing-k6-test-results","title":"Análisis de resultados de tests de carga k6"}}},{"node":{"fields":{"slug":"/es-es/guides/external-reports/azure-app-insights-integration","title":"Integración con Azure App Insights"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/ai-credits","title":"AI Credits"}}},{"node":{"fields":{"slug":"/es-es/guides/external-reports/datadog-integration","title":"Integración con Datadog"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/analyzing-load-test-results","title":"Cómo Verificar los Resultados de Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/how-to-run-new-apache-jmeter-load-test","title":"Cómo Ejecutar una Nueva Prueba de Carga con Apache JMeter"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/authorization-code-grant-type-oauth-2-0","title":"Tipo de Concesión Authorization Code en OAuth 2.0"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/api-check-results","title":"Comprender los Resultados de Verificación de API"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/jmeter-integration-ci-cd","title":"Integración de API de Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/k6-load-testing/how-to-run-k6-load-test","title":"Cómo ejecutar un nuevo test de carga k6"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/check-groups","title":"Grupos de verificaciones"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/baseline-comparison-between-load-tests","title":"Comparación de Línea Base entre Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/load-generators-hardware-infrastructure-jmeter","title":"¿Cuáles son los recursos de hardware asignados a mi cuenta para generadores de carga?"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/client-credentials-grant-type-oauth-2-0","title":"Tipo de Concesión Client Credentials en OAuth 2.0"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/custom-domain-status-page","title":"Cómo añadir un dominio propio a tu página de estado"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/load-testing-anomalies","title":"Anomalías en Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/common-http-error-codes","title":"Códigos de Estado de Error HTTP Comunes"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/heartbeat-monitors","title":"Monitores Heartbeat (tareas cron)"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/crafting-perfect-test-names","title":"Crear Nombres de Prueba Perfectos"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/load-testing-engine-health-monitoring","title":"Monitoreo de Salud del Motor"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/maintenance-windows","title":"Ventanas de mantenimiento"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/load-testing-error-analysis","title":"Análisis de Errores"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/dashboards","title":"Paneles"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/decoding-average-response-times","title":"Decodificar el Tiempo Promedio de Respuesta"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/multistep-api-checks","title":"Verificaciones de API multipaso"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/deep-dive-samples-in-load-testing","title":"¿Qué son las Muestras en Pruebas de Carga?"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/load-testing-jtl-file-analysis","title":"Análisis de Logs y Archivos JTL"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/load-testing-insights","title":"Perspectivas de Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/demo","title":"Demostración"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/load-testing-jtl-jmeter-log-file-analysis","title":"Análisis de Archivo de Log de JMeter"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check","title":"Cómo Crear una Nueva Verificación de API"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/end-time-in-load-testing","title":"Comprender la Importancia del 'Tiempo de Finalización' en Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/load-testing-timeline-analysis","title":"Vista de Línea de Tiempo"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/status-pages","title":"Crea una página de estado pública para tus monitores"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/erros-and-reponse-codes","title":"Errores y Códigos de Respuesta"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/uploading-jmeter-files-step-by-step-guide","title":"Subir Archivos JMeter a LoadFocus: Guía Paso a Paso"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/tcp-monitors","title":"Monitores de puerto TCP"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/geographical-test-location-in-load-testing","title":"Ubicación Geográfica de Prueba en Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/variables","title":"Variables"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/using-multiple-csv-files-with-jmeter-engines","title":"Usar Múltiples Archivos CSV con Motores JMeter en LoadFocus"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/getting-started","title":"Primeros Pasos"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/granularity-in-load-test-results-and-charts","title":"Granularidad en Resultados y Gráficos de Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/headers-and-manage-presets","title":"Encabezados y Presets de Encabezados"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/how-to-run-new-load-test","title":"Cómo Ejecutar una Nueva Prueba de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/how-to-url-query-parameters","title":"Parámetros de Consulta"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/http-methods-overview-load-testing","title":"Métodos HTTP: Una Visión General"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/implicit-grant-type-oauth-2-0","title":"Tipo de Concesión Implicit en OAuth 2.0"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/load-generators-hardware-infrastructure","title":"¿Cuáles son los recursos de hardware asignados a mi cuenta para generadores de carga?"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/refresh-token-grant-type-oauth-2-0","title":"Tipo de Concesión Refresh Token en OAuth 2.0"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/load-test-result-ai-analysis","title":"Análisis de IA de Resultados de Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/start-time-in-load-testing","title":"Comprender la Importancia del Tiempo de Inicio en Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/password-credentials-grant-type-oauth-2-0","title":"Tipo de Concesión Password Credentials en OAuth 2.0"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/using-cookies","title":"Usar Cookies"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/what-are-iterations-load-testing","title":"Dominar las Iteraciones en Pruebas de Carga: Una Inmersión Profunda"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/what-are-virtual-users-load-testing","title":"Qué son los Usuarios Virtuales en Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/use-cases","title":"Casos de Uso"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/what-is-delay-when-running-a-load-test","title":"¿Qué es el Retraso al ejecutar una Prueba de Carga?"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/what-is-duration-in-load-testing","title":"Qué es la Duración en Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/what-is-grant-type","title":"¿Qué es un Tipo de Concesión?"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/what-is-ramp-up-steps-in-load-testing","title":"Qué son los Pasos de Rampa en Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/what-is-oauth-2-0-authorization","title":"Autorización OAuth 2.0"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/what-is-test-run-id","title":"¿Qué es un ID de Ejecución de Prueba?"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/alert-configuration","title":"Configuración de Alertas"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/what-is-ramp-up-time-in-load-testing","title":"Qué es el Tiempo de Rampa en Pruebas de Carga"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/alert-metrics","title":"Métricas de Alerta"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/core-web-vitals-competitor-comparison","title":"Comparación de Core Web Vitals con la Competencia"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/how-to-run-new-website-performance-test","title":"Crear Nueva Prueba de Rendimiento Web"}}},{"node":{"fields":{"slug":"/es-es/guides/load-testing/white-label-report-branding","title":"Informes PDF con tu marca"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/http-authentication","title":"Autenticación HTTP"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/core-web-vitals-metrics","title":"¿Qué son los Core Web Vitals?"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/largest-contentful-paint","title":"Largest Contentful Paint (LCP)"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/how-to-create-new-alert","title":"Crear una Nueva Alerta"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/performance-budgets","title":"Presupuestos de Rendimiento y Alertas"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/pdf-report-branding","title":"Informes PDF con tu marca"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/sitemap-import","title":"Importar desde Sitemap"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/real-user-field-data","title":"Datos de Campo de Usuarios Reales (CrUX)"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/lighthouse-opportunities","title":"Oportunidades de Lighthouse"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/jmeter-integration-ci-cd/azure-devops","title":"Azure DevOps"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/jmeter-integration-ci-cd/circleci","title":"CircleCI"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/activate-deactivate","title":"Activar/Desactivar"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/alert-channels","title":"Canales de Alerta"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/jmeter-integration-ci-cd/github-actions","title":"GitHub Actions"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/assertions","title":"Aserciones"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/jmeter-integration-ci-cd/gitlab-ci-cd","title":"GitLab CI/CD"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/frequency","title":"Frecuencia"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/jmeter-integration-ci-cd/jenkins","title":"Jenkins"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/friendly-check-name","title":"Nombre Amigable de Verificación"}}},{"node":{"fields":{"slug":"/es-es/guides/jmeter-load-testing/jmeter-integration-ci-cd/overview","title":"Integrar el Cliente API de JMeter con Pipelines de CI/CD"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/locations","title":"Ubicaciones"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/mute-unmute","title":"Silenciar/Activar Sonido"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/request-configuration","title":"Configuración de Solicitud"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/request-preview","title":"Vista Previa de Solicitud"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/save-run","title":"Guardar y Ejecutar"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/response-time-limits","title":"Límites de Tiempo de Respuesta"}}},{"node":{"fields":{"slug":"/es-es/guides/api-monitoring/new-api-check/webhook-channels","title":"Canal Webhook"}}},{"node":{"fields":{"slug":"/es-es/guides/monitor-website-performance/getting-started","title":"Primeros Pasos"}}}]}},"pageContext":{"id":"3bd9b13a-7267-50d1-8b31-0b8c39be78cb","locale":"es-ES"}},"staticQueryHashes":["361965504","361965504","417421954","417421954","445494767","445494767"]}