{"id":20703646,"url":"https://github.com/cppmx/monitoreo","last_synced_at":"2026-02-15T14:39:53.013Z","repository":{"id":237735176,"uuid":"756002719","full_name":"cppmx/monitoreo","owner":"cppmx","description":null,"archived":false,"fork":false,"pushed_at":"2025-08-22T03:39:04.000Z","size":911,"stargazers_count":0,"open_issues_count":4,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-09-11T22:34:54.336Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":null,"has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/cppmx.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2024-02-11T17:50:35.000Z","updated_at":"2024-12-12T18:20:06.000Z","dependencies_parsed_at":"2024-05-03T03:58:05.332Z","dependency_job_id":"7999f133-ca98-4316-903e-eab490be9b8c","html_url":"https://github.com/cppmx/monitoreo","commit_stats":null,"previous_names":["cppmx/monitoreo"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/cppmx/monitoreo","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cppmx%2Fmonitoreo","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cppmx%2Fmonitoreo/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cppmx%2Fmonitoreo/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cppmx%2Fmonitoreo/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cppmx","download_url":"https://codeload.github.com/cppmx/monitoreo/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cppmx%2Fmonitoreo/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29481731,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-15T11:35:25.641Z","status":"ssl_error","status_checked_at":"2026-02-15T11:34:57.128Z","response_time":118,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":[],"created_at":"2024-11-17T01:08:54.908Z","updated_at":"2026-02-15T14:39:52.999Z","avatar_url":"https://github.com/cppmx.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Monitorización de un despliegue de Apollo Server\n\n## ¿Por qué es importante monitorear una aplicación en producción?\n\nMonitorear una aplicación en producción es fundamental para garantizar su rendimiento, detectar problemas potenciales y mejorar la experiencia del usuario. Proporciona información valiosa sobre el estado del sistema, la disponibilidad de recursos y el comportamiento de la aplicación en tiempo real.\n\n## ¿Qué herramientas podemos utilizar para monitorear una aplicación?\n\nRespuesta: Existen varias herramientas disponibles para monitorear aplicaciones, entre las cuales se incluyen Elastic Search, Kibana y herramientas de APM (Application Performance Monitoring) como Elastic APM. Estas herramientas ofrecen capacidades de registro, análisis de registros, visualización de datos y monitoreo del rendimiento de la aplicación.\n\n## ¿Qué es Elastic Search y cuál es su función en el monitoreo de aplicaciones?\n\nElastic Search es un motor de búsqueda y análisis de datos distribuido y altamente escalable. En el contexto del monitoreo de aplicaciones, Elastic Search se utiliza para almacenar y analizar datos de registro y métricas generados por la aplicación en producción.\n\n## ¿Qué es Kibana y cómo se integra con Elastic Search?\n\nKibana es una plataforma de visualización de datos que se utiliza junto con Elastic Search para crear gráficos, paneles y visualizaciones de datos. Se integra con Elastic Search para acceder y visualizar los datos almacenados en los índices de Elastic Search.\n\n## ¿Qué es Elastic APM y cómo ayuda en el monitoreo de aplicaciones?\n\nElastic APM es una solución de monitoreo de rendimiento de aplicaciones que permite rastrear y analizar el rendimiento de las transacciones en una aplicación en tiempo real. Proporciona información detallada sobre la latencia, los errores y la salud de la aplicación, lo que facilita la identificación y resolución de problemas de rendimiento.\n\n## ¿Cómo se configura y despliega Elastic Search y Elastic APM para monitorear una aplicación Apollo Server?\n\nLa configuración y el despliegue de Elastic Search y Elastic APM para monitorear una aplicación Apollo Server implican la instalación y configuración de estos servicios en un entorno de producción, la integración de la aplicación con Elastic APM para rastrear el rendimiento de las transacciones, y la visualización de los datos de monitoreo en Kibana para realizar análisis y tomar decisiones informadas.\n\n## ¿Cuáles son algunos de los beneficios de monitorear una aplicación con Elastic Search y Elastic APM?\n\nAlgunos de los beneficios de monitorear una aplicación con Elastic Search y Elastic APM incluyen la capacidad de identificar y resolver problemas de rendimiento de manera proactiva, mejorar la experiencia del usuario al garantizar un rendimiento óptimo de la aplicación, y obtener información valiosa sobre el comportamiento y la salud de la aplicación en tiempo real.\n\n## Envío de logs e información APM\n\nEn la aplicación Apollo vamos a habilitar los logs con Winston y vamos a configurarlo para que la información tenga el formato ECS.\n\nPara esto vamos a requerir los siguientes paquetes:\n\n```bash\nnpm install winston --save\nnpm install @elastic/ecs-winston-format --save\n```\n\nPara la información APM vamos a requerir instalar el siguiente paquete:\n\n```bash\nnpm install elastic-apm-node --save\n```\n\nDespués vamos a configurar el logger de la siguiente forma:\n\n```javascript\nconst winston = require('winston');\nconst { ecsFormat } = require('@elastic/ecs-winston-format');\n\nexport const logger = winston.createLogger({\n    level: process.env.LOG_LEVEL || 'info',\n    format: ecsFormat(\n        {\n            convertReqRes: true,\n            apmIntegration: true\n        }\n    ),\n    defaultMeta: { service: 'apollo-client' },\n    transports: [\n        new winston.transports.Console()\n    ],\n});\n```\n\n## Estadísticas APM y transacciones\n\nPara etiquetar las transacciones y poder monitorearlas en ElasticSearch vamos a instalar el siguiente paquete en la aplicación con Apollo Server:\n\n```bash\nnpm install elastic-apm-node --save\n```\n\nEse paquete nos dará acceso a la API del APM de ElasticSearch.\n\nHay que definir las siguientes variables de ambiente:\n\n```bash\nELASTIC_APM_SERVICE_NAME=\u003cservice name\u003e\nELASTIC_APM_SECRET_TOKEN=\u003ctoken\u003e\nELASTIC_APM_SERVER_URL=\u003cserver url\u003e\n```\n\nAhora, en el archivo principal de la aplicación, lo primero que haremos será inicializar el agente APM. En nuestro caso será en el archivo [`server.js`](server.js):\n\n```javascript\nimport Agent from 'elastic-apm-node/start.js'\n\nexport const apm = Agent;\n```\n\nCon la primera línea es suficiente para que el agente se inicialice de forma automática. El agente usará los valores de las variables de ambiente definidas anteriormente para enviarle estadísticas del rendimiento de la aplicación al servidor APM.\n\nLa segunda línea creará una variable llamada `apm` con el Agente como valor, y la va a exportar para que podamos usarla en cualquier parte del código. Esa variable nos va a servir para etiquetar las transacciones.\n\nPor ejemplo, en el archivo [`resolvers.js`](resolvers.js) vamos a importar la variable  `apm` definida anteriormente y la usaremos para etiquetar transacciones de la siguiente forma:\n\n```javascript\nimport { apm } from './server.js'\n\n    ...\n    company: async (_root, { id }) =\u003e {\n      const transaction = apm.startTransaction('company-resolver', 'graphql'); // Se crea la transacción company-resolver\n      const company = await getCompany(id);\n      if (!company) {\n        const span = transaction.startSpan('No Company found');\n        span.end();\n        logger.error('No Company found with id ' + id);\n        throw notFoundError('No Company found with id ' + id);\n      }\n      transaction.end('success'); // Se termina la transacción company-resolver\n      logger.info('Company found with id ' + id);\n      return company;\n    },\n  ...\n```\n\nDentro de Kibana, en el menú de observabilidad encontraremos la opción de servicios, ahí podremos ver las estadísticas APM de la aplicación. También ahí, podremos encontrar las transacciones.\n\n## Elasitc Search y Kibana\n\nDe ser necesario, hay que aumentar la memoria de intercambio antes de iniciar el despliegue de los servicios:\n\n```bash\nsudo sysctl -w vm.max_map_count=262144\n```\n\nDespliegue de los servicios:\n\n```bash\ndocker compose up –d\n```\n\nPara acceder a la aplicación hay que abrir en el navegador la siguiente URL: [http://localhost:5601/](http://localhost:5601/). Las credenciales de acceso están definidas en el archivo [.env](.env)\n\nVer los logs de los servicios:\n\n```bash\ndocker compose logs\n```\n\nDetener los servicios:\n\n```bash\ndocker compose stop\n```\n\n## Video\n\nPuedes ver el video con la explicación en [Youtube](https://youtu.be/-ODgh-q39WQ)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcppmx%2Fmonitoreo","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcppmx%2Fmonitoreo","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcppmx%2Fmonitoreo/lists"}