{"id":11527,"date":"2021-09-23T00:00:10","date_gmt":"2021-09-23T07:00:10","guid":{"rendered":"https:\/\/www.couchbase.com\/blog\/?p=11527&#038;preview=true&#038;preview_id=11527"},"modified":"2025-06-13T21:25:14","modified_gmt":"2025-06-14T04:25:14","slug":"how-to-build-observability-dashboards-prometheus-grafana-couchbase","status":"publish","type":"post","link":"https:\/\/www.couchbase.com\/blog\/es\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/","title":{"rendered":"C\u00f3mo crear cuadros de mando de observabilidad con Prometheus, Grafana y Couchbase"},"content":{"rendered":"<p><strong>Seguro que ya lo ha o\u00eddo antes:<\/strong> \"Lo que se mide, se hace\".<\/p>\n<p>Es cierto: lo que observas y mides es lo que puedes mejorar.<\/p>\n<p>La clave de cualquier mejora es identificar primero <em>qu\u00e9<\/em> para medir y, a continuaci\u00f3n, recopilar las m\u00e9tricas relacionadas. Con esas m\u00e9tricas puede ajustar el trabajo subyacente y analizar la eficacia de los cambios. A continuaci\u00f3n, repite el ciclo hasta que hayas mejorado lo suficiente.<\/p>\n<p>En Couchbase, necesit\u00e1bamos mejorar algunas de nuestras operaciones diarias, as\u00ed que creamos paneles de observabilidad para ayudarnos a identificar problemas y realizar un seguimiento de las mejoras. Utilizamos una combinaci\u00f3n de <a href=\"https:\/\/prometheus.io\/?ref=hello-from-couchbase\" target=\"_blank\" rel=\"noopener\">Prometeo<\/a>que simplifica el almacenamiento y la consulta de datos de series temporales, y <a href=\"https:\/\/grafana.com\/?ref=hello-from-couchbase\" target=\"_blank\" rel=\"noopener\">Grafana<\/a>con el que se pueden crear impresionantes visualizaciones de datos. Adem\u00e1s, utilizamos <a href=\"https:\/\/developer.couchbase.com\/new-to-couchbase\/?ref=blog\" target=\"_blank\" rel=\"noopener\">Couchbase<\/a> para almacenar datos hist\u00f3ricos para su uso posterior con su <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/full-text-search\/?ref=blog\" target=\"_blank\" rel=\"noopener\">B\u00fasqueda de texto completo<\/a> y <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/analytics\/?ref=blog\" target=\"_blank\" rel=\"noopener\">Anal\u00edtica<\/a> herramientas.<\/p>\n<p>En este art\u00edculo, te mostraremos c\u00f3mo crear tu propio panel de control de observabilidad utilizando Prometheus, Grafana y Couchbase.<\/p>\n<p>Sus canales de fuentes de datos internos pueden variar, al igual que su software de visualizaci\u00f3n de datos. Sin embargo, los pasos que te mostraremos hoy deber\u00edan ser aplicables a varias herramientas e implementaciones.<\/p>\n<h2>Cuadro de mando gen\u00e9rico de observabilidad: Dise\u00f1o y arquitectura<\/h2>\n<p>Para construir una herramienta reutilizable y escalable, es mejor trabajar a partir de dise\u00f1os y plantillas comunes como primer paso. A partir de ah\u00ed, se puede personalizar seg\u00fan sea necesario. Con este enfoque, es r\u00e1pido y f\u00e1cil desarrollar futuros cuadros de mando.<\/p>\n<p>El siguiente diagrama muestra la arquitectura gen\u00e9rica de los cuadros de mando de observabilidad que construiremos juntos:<\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/architecture-diagram-couchbase-grafana-prometheus-dashboard.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12097\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/architecture-diagram-couchbase-grafana-prometheus-dashboard.png\" alt=\"An observability dashboard architecture using Prometheus, Couchbase and Grafana\" width=\"1000\" height=\"526\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/architecture-diagram-couchbase-grafana-prometheus-dashboard.png 1000w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/architecture-diagram-couchbase-grafana-prometheus-dashboard-300x158.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/architecture-diagram-couchbase-grafana-prometheus-dashboard-768x404.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/architecture-diagram-couchbase-grafana-prometheus-dashboard-20x11.png 20w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>En esta arquitectura, dos entradas de datos diferentes forman una interfaz con el servicio de cuadro de mando. Ve\u00e1moslas en detalle a continuaci\u00f3n.<\/p>\n<ol>\n<li><strong>Metadatos JSON sobre el cuadro de mandos<\/strong>\n<ul>\n<li>Definiciones de fuentes de datos, incluyendo informaci\u00f3n sobre las fuentes de datos (como la URL de la base de datos, SQL, credenciales), las rutas de los archivos y las URL de los artefactos Jenkins.<\/li>\n<li>La plantilla de dise\u00f1o de Grafana (o vista visual del dashboard), que dise\u00f1aremos primero y luego usaremos como plantillas para paneles en nuestros dashboards posteriores.<\/li>\n<\/ul>\n<\/li>\n<li><strong>The actual data source files from `.json` and `.csv` files and from Couchbase<\/strong>.\n<ul>\n<li>El dise\u00f1o de estos cuadros de mando de observabilidad admite varias fuentes de datos como Couchbase Server, y archivos directos como <a href=\"https:\/\/www.couchbase.com\/blog\/es\/json-database\/?ref=blog\" target=\"_blank\" rel=\"noopener\">Documentos JSON<\/a> and CSV (Comma Separated Values) files. You can extend the databoard proxy service code (in `dashboard.py`) to parse other data formats as needed.<\/li>\n<\/ul>\n<\/li>\n<\/ol>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>El resultado esperado ser\u00e1 una interfaz de usuario de cuadro de mando de Grafana y m\u00e9tricas recogidas en series temporales de Prometheus a partir de las dos entradas enumeradas anteriormente. La parte central del diagrama anterior muestra los diferentes servicios de la colecci\u00f3n que soportan la creaci\u00f3n de los cuadros de mando.<\/p>\n<p>Veamos con m\u00e1s detalle las distintas facetas y servicios incluidos en el diagrama de arquitectura:<\/p>\n<ul>\n<li><strong>Servicio proxy del salpicadero:<\/strong>\n<ul>\n<li>This is a generic Python Flask web app service (`dashboard.py`) that interacts with the Grafana service to serve the tabular data and other APIs like `\/query`, `\/add`, `\/import` and `\/export` endpoints. You can develop a similar one to have a generic template (JSON) for the panels on Grafana and attach the graph data points and tabular-data points as target JSON to display on your Grafana dashboard.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Servicio de exportaci\u00f3n Prometheus:<\/strong>\n<ul>\n<li>This is a custom Prometheus exporter (say `prometheus.py`) Flask web app service that connects to the data sources and serves the requests from Prometheus itself. At a high level, this acts as a bridge between the Prometheus and datasources. Note that this service is needed only when the data source is to be maintained for time series (many trends need this).<\/li>\n<\/ul>\n<\/li>\n<li><strong>Servicio Grafana:<\/strong>\n<ul>\n<li>Se trata de la propia herramienta Grafana que se utiliza para crear paneles y mostrarlos como cuadros de mando.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Servicio Prometheus:<\/strong>\n<ul>\n<li>Se trata de la propia herramienta Prometheus que contiene sus m\u00e9tricas como datos de series temporales.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Gestor de alertas:<\/strong>\n<ul>\n<li>El Gestor de Alertas dispone de reglas de alerta personalizadas que reciben alertas cuando se alcanzan determinados umbrales.<\/li>\n<\/ul>\n<\/li>\n<li>Otros servicios:\n<ul>\n<li><strong>Couchbase:<\/strong> Es posible que ya lo est\u00e9 utilizando <a href=\"https:\/\/www.couchbase.com\/blog\/es\/resources\/why-nosql\/?ref=blog\" target=\"_blank\" rel=\"noopener\">NoSQL<\/a> pero si no, puedes instalarlo a trav\u00e9s de un contenedor o directamente en un host diferente. Couchbase almacena tus datos como documentos JSON, o puedes hacer que almacene campos requeridos como documentos separados para tendencias hist\u00f3ricas mientras preparas tus datos de salud o tendencias.<\/li>\n<li><strong>Docker:<\/strong> Deber\u00e1 instalar el software del agente Docker en el host para poder utilizar este despliegue de servicios en contenedores.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>Ejemplo de estructura JSON del cuadro de mando<\/h3>\n<p>En la tabla siguiente, ver\u00e1 una muestra de la estructura tanto de los metadatos de entrada como de la fuente de datos de entrada.<\/p>\n<table>\n<tbody>\n<tr>\n<td>Estructura JSON de metadatos de entrada:<\/td>\n<td>Estructura de las fuentes de datos de entrada:<\/td>\n<\/tr>\n<tr>\n<td><code>{<br \/>\n\"dashboard_title\": \"\",<br \/>\n\"datos\": [<br \/>\n{<br \/>\n\"source\": \"couchbase|json|csv\",<br \/>\n\"tipo\": \"timeseries|table\",<br \/>\n\"name\": \"\",<br \/>\n\"refresh\": \"\"<br \/>\n}<br \/>\n],<br \/>\n\"grafana\": [<br \/>\n{ \"plantilla\": \"enlace a plantilla json\" },<br \/>\n{<br \/>\n\"t\u00edtulo\": \"Enlaces\",<br \/>\n\"grid_position\": {},<br \/>\n\"tipo\": \"texto\",<br \/>\n\"enlaces\": []<br \/>\n},<br \/>\n]<br \/>\n}<br \/>\n<\/code><\/td>\n<td><code>\/\/Fuente de base de datos<br \/>\n{<br \/>\n\"host\": \"\",<br \/>\n\"nombredeusuario\": \"\",<br \/>\n\"password\": \"\",<br \/>\n\"query\": \"\"<br \/>\n}<br \/>\n\/\/Fuente JSON o CSV<br \/>\n{<br \/>\n\"archivo\": \"\"<br \/>\n}<br \/>\n\/\/Fuente CSV<br \/>\n{<br \/>\n\"delimitador\": \"\"<br \/>\n}<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>Despliegue de los servicios del panel de control de observabilidad<\/h3>\n<p>Use the `docker-compose` file below to bring up all of the required services \u2013 e.g., Dashboard proxy, Grafana, Prometheus, Exporter, Alert manager \u2013 that appear in the architecture diagram above for our observability dashboards. You can install Couchbase on a different host to store your growing high-volume data.<\/p>\n<p>To bring up: `docker-compose up`<\/p>\n<p>Next, visit `https:\/\/host:3000` for the Grafana page.<\/p>\n<p>To bring down: `docker-compose down`<\/p>\n<pre>version: \"2\"\r\nservices:\r\n dashboard:\r\n   restart: unless-stopped\r\n   build: ..\/..\/\r\n   ports:\r\n     - 5001:5000\r\n   environment:\r\n     - GRAFANA_HOST=https:\/\/admin:password@grafana:3000\r\n   volumes:\r\n     - .\/config\/targets.json:\/app\/targets.json\r\n \r\n grafana:\r\n   image: grafana\/grafana:8.0.1\r\n   restart: unless-stopped\r\n   volumes:\r\n     - .\/config\/grafana:\/var\/lib\/grafana\r\n   environment:\r\n     GF_INSTALL_PLUGINS: \"simpod-json-datasource,marcusolsson-csv-datasource,ae3e-plotly-panel\"\r\n     GF_AUTH_ANONYMOUS_ENABLED: \"true\"\r\n     GF_PLUGINS_ALLOW_LOADING_UNSIGNED_PLUGINS: \"ae3e-plotly-panel\"\r\n     GF_RENDERING_SERVER_URL: https:\/\/renderer:8081\/render\r\n     GF_RENDERING_CALLBACK_URL: https:\/\/grafana:3000\/\r\n   ports:\r\n     - 4000:3000\r\n \r\n renderer:\r\n   image: grafana\/grafana-image-renderer:latest\r\n \r\n prometheus:\r\n   restart: unless-stopped\r\n   image: prom\/prometheus\r\n   volumes:\r\n     - .\/config\/prometheus.yml:\/etc\/prometheus\/prometheus.yml\r\n     - .\/config\/alert.rules.yml:\/etc\/prometheus\/alert.rules.yml\r\n \r\n exporter:\r\n   restart: unless-stopped\r\n   build: ..\/..\/exporter\r\n   volumes:\r\n     - .\/config\/queries.json:\/app\/queries.json\r\n \r\n alertmanager:\r\n   restart: unless-stopped\r\n   image: prom\/alertmanager\r\n   ports:\r\n     - 9093:9093\r\n   volumes:\r\n     - .\/config\/alertmanager.yml:\/etc\/alertmanager\/alertmanager.yml\r\n     - .\/config\/alert_templates:\/etc\/alertmanager\/templates\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>El contenido de los archivos de referencia de servicios anteriores -o fragmentos para abreviar- puede encontrarse en <a href=\"#implementation\">la secci\u00f3n de aplicaci\u00f3n<\/a>.<\/p>\n<p>Con estas herramientas, puede crear una amplia variedad de cuadros de mando que se adapten a sus necesidades. Le mostraremos tres ejemplos de cuadros de mando para que se haga una idea de las posibilidades.<\/p>\n<h2>Ejemplos de cuadros de mando: Visi\u00f3n general<\/h2>\n<table>\n<tbody>\n<tr>\n<td><strong>#<\/strong><\/td>\n<td><strong>Cuadro de mandos<\/strong><\/td>\n<td><strong>Medidas<\/strong><\/td>\n<td><strong>M\u00e9tricas<\/strong><\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>Cuadros de mando de los ciclos de pruebas de regresi\u00f3n funcionales<\/td>\n<td>Tendencias entre los ciclos de pruebas de regresi\u00f3n funcional tanto a nivel de construcci\u00f3n como de componentes<\/td>\n<td>total de pruebas, superadas, fallidas, abortadas, tiempo total, tiempo de ejecuci\u00f3n nuevo, etc.<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>Paneles de uso de Infra VMs, incluyendo VMs est\u00e1ticas y VMs din\u00e1micas<\/td>\n<td>Utilizaci\u00f3n e historia de los recursos<\/td>\n<td>recuento activo, recuento disponible, c\u00e1lculo de horas\/m\u00e1x\/creadas por d\u00eda, semana, mes<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>Infra VMs Health dashboards, Static Servers, Jenkins Slaves VMs<\/td>\n<td>Supervisi\u00f3n del estado de las m\u00e1quinas virtuales, alertas y seguimiento del historial de las m\u00e1quinas virtuales<\/td>\n<td>ssh_fail, pool_os vs real_os, usos de cpu-memory-disk-swap, descriptores de archivo, reglas de firewall, pool_mac_address vs real_mac_address, d\u00edas de arranque, procesos totales y de producto, versiones de aplicaciones y servicios instalados, etc.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>Cuadro de mando #1: Tablero de ciclos de pruebas de regresi\u00f3n funcional<\/h2>\n<p><strong>Problema<\/strong>: Antes de crear este cuadro de mandos para nosotros, no exist\u00edan gr\u00e1ficos de tendencias sobre los ciclos de pruebas de regresi\u00f3n con m\u00e9tricas como el tiempo total empleado, la tasa de aprobados, las nuevas ejecuciones frente a las repetidas (por ejemplo, debido a problemas de infraestructura), el n\u00famero incoherente de abortos y fallos, ni tampoco tendencias separadas a nivel de componentes o m\u00f3dulos.<\/p>\n<p><strong>Soluci\u00f3n<\/strong>: El plan era crear un script analizador de ejecuci\u00f3n que analice los datos de prueba que ya est\u00e1n almacenados en el bucket de Couchbase. Despu\u00e9s de eso, obtenemos los datos de la serie temporal de los \u00faltimos <em>n<\/em> n\u00famero de compilaciones y m\u00e9tricas objetivo para cada compilaci\u00f3n.<\/p>\n<p><strong>Instant\u00e1neas del cuadro de mandos:<\/strong><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12098\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-1.png\" alt=\"Weekly functional regression testing cycles Grafana dashboard, part 1\" width=\"1000\" height=\"484\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-1.png 1000w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-1-300x145.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-1-768x372.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-1-20x10.png 20w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12099\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-2.png\" alt=\"Weekly functional regression testing cycles Grafana dashboard, part 2\" width=\"1000\" height=\"511\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-2.png 1000w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-2-300x153.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-2-768x392.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-2-20x10.png 20w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-3.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12100\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-3.png\" alt=\"Weekly functional regression testing cycles Grafana dashboard, part 3\" width=\"1000\" height=\"456\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-3.png 1000w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-3-300x137.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-3-768x350.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-3-20x9.png 20w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-4.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12101\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-4.png\" alt=\"Weekly functional regression testing cycles Grafana dashboard, part 4\" width=\"1000\" height=\"453\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-4.png 1000w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-4-300x136.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-4-768x348.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-4-20x9.png 20w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-5.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12102\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-5.png\" alt=\"Weekly functional regression testing cycles Grafana dashboard, part 5\" width=\"1000\" height=\"429\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-5.png 1000w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-5-300x129.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-5-768x329.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/functional-regression-testing-cycles-Grafana-dashboard-5-20x9.png 20w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h2>Cuadro de mando #2: Cuadro de mando de uso de recursos de infraestructura \/ m\u00e1quinas virtuales<\/h2>\n<p><strong>Problema:<\/strong> Antes de crear este cuadro de mandos, ten\u00edamos un gran n\u00famero de m\u00e1quinas virtuales est\u00e1ticas y din\u00e1micas, pero no hab\u00eda seguimiento de c\u00f3mo se utilizaban los recursos de hardware. No ten\u00edamos informaci\u00f3n sobre m\u00e9tricas como las m\u00e1quinas virtuales activas utilizadas en ese momento, el recuento disponible, el tiempo de m\u00e1quina utilizado o las horas de computaci\u00f3n diarias, semanales o mensuales.<\/p>\n<p><strong>Soluci\u00f3n:<\/strong> Nuestro plan consist\u00eda en recopilar primero los datos de todas las m\u00e1quinas virtuales, como la asignaci\u00f3n y liberaci\u00f3n din\u00e1micas de IP, las horas exactas de creaci\u00f3n y liberaci\u00f3n, as\u00ed como cualquier agrupaci\u00f3n, como pools, etc. La mayor\u00eda de estos datos ya exist\u00edan en <a href=\"https:\/\/www.couchbase.com\/blog\/es\/products\/server\/?ref=blog\" target=\"_blank\" rel=\"noopener\">Servidor Couchbase<\/a> (gestionados por los respectivos gestores de servicios). Utilizando la flexibilidad de <a href=\"https:\/\/query-tutorial.couchbase.com\/tutorial\/?ref=blog\/#1\" target=\"_blank\" rel=\"noopener\">el lenguaje de consulta SQL<\/a> (tambi\u00e9n conocido como N1QL), pudimos extraer esos datos en un formato adecuado para los gr\u00e1ficos que quer\u00edamos mostrar en este panel de observabilidad.<\/p>\n<p><strong>Instant\u00e1neas del cuadro de mandos<\/strong>:<\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/static-pool-VMs-Grafana-dashboard-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12104\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/static-pool-VMs-Grafana-dashboard-1.png\" alt=\"Static pool VMs Grafana dashboard, part 1\" width=\"1000\" height=\"534\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/static-pool-VMs-Grafana-dashboard-1.png 1000w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/static-pool-VMs-Grafana-dashboard-1-300x160.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/static-pool-VMs-Grafana-dashboard-1-768x410.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/static-pool-VMs-Grafana-dashboard-1-20x11.png 20w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/static-pool-VMs-Grafana-dashboard-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12105\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/static-pool-VMs-Grafana-dashboard-2.png\" alt=\"Static pool VMs Grafana dashboard, part 2\" width=\"1000\" height=\"378\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/static-pool-VMs-Grafana-dashboard-2.png 1000w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/static-pool-VMs-Grafana-dashboard-2-300x113.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/static-pool-VMs-Grafana-dashboard-2-768x290.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/static-pool-VMs-Grafana-dashboard-2-20x8.png 20w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/server-dynamic-VMs-Grafana-dashboard.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12103\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/server-dynamic-VMs-Grafana-dashboard.png\" alt=\"Server dynamic VMs Grafana dashboard\" width=\"1000\" height=\"534\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/server-dynamic-VMs-Grafana-dashboard.png 1000w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/server-dynamic-VMs-Grafana-dashboard-300x160.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/server-dynamic-VMs-Grafana-dashboard-768x410.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/server-dynamic-VMs-Grafana-dashboard-20x11.png 20w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h2>Cuadro de mando #3: Cuadro de mando del estado de las m\u00e1quinas virtuales de infraestructura<\/h2>\n<p><strong>Problema:<\/strong> Before we had this dashboard, regression test runs were failing inconsistently, and there were low-hanging issues with the VMs. Some of the issues included SSH Failures, OS mismatches, VM IP switches, too many open files, swap issues, need reboots, duplicate IPs among multiple runs, high memory usage, disk full (`\/` or `\/data`), firewall rules stopping the endpoint connection, slave issues due to high memory, and disk usage were all common. There was no observability dashboard to look at and observe these metrics and also no checks and alerts for the test infrastructure health.<\/p>\n<p><strong>Soluci\u00f3n:<\/strong> We decided to create an automatic periodic health check that captures metrics data for the targeted VMs such as `ssh_fail`, `pool_os` vs `real_os`, `cpu-memory-disk-swap` usages, file descriptors, firewall rules, `pool_mac_address` vs `real_mac_address`, booted days, total and Couchbase processes, installed Couchbase version and services. (In sum, we captured ~50 metrics). These metrics are exposed as a Prometheus endpoint that is displayed in Grafana, and the information is also saved in Couchbase for future data analysis. Alerts were also created to monitor the key health metrics for issues to allow for quick intervention and finally achieve increased stability of the test runs.<\/p>\n<p><strong>Instant\u00e1neas del cuadro de mandos:<\/strong><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/VM-health-Grafana-dashboard-1.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12106\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/VM-health-Grafana-dashboard-1.png\" alt=\"VM health Grafana dashboard, part 1\" width=\"1000\" height=\"536\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/VM-health-Grafana-dashboard-1.png 1000w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/VM-health-Grafana-dashboard-1-300x161.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/VM-health-Grafana-dashboard-1-768x412.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/VM-health-Grafana-dashboard-1-20x11.png 20w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p><a href=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/VM-health-Grafana-dashboard-2.png\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter size-full wp-image-12107\" src=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2021\/09\/VM-health-Grafana-dashboard-2.png\" alt=\"VM health Grafana dashboard, part 2\" width=\"1000\" height=\"526\" srcset=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/VM-health-Grafana-dashboard-2.png 1000w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/VM-health-Grafana-dashboard-2-300x158.png 300w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/VM-health-Grafana-dashboard-2-768x404.png 768w, https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/VM-health-Grafana-dashboard-2-20x11.png 20w\" sizes=\"auto, (max-width: 1000px) 100vw, 1000px\" \/><\/a><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h2 id=\"implementation\">Aplicaci\u00f3n<\/h2>\n<p>Hasta ahora, has visto la arquitectura de alto nivel de los cuadros de mando de observabilidad, qu\u00e9 servicios se requieren, qu\u00e9 tipo de cuadros de mando puedes necesitar, y tambi\u00e9n c\u00f3mo desplegar estos servicios. Ahora, es el momento de ver algunos detalles de implementaci\u00f3n.<\/p>\n<p>Nuestra primera parada es la recopilaci\u00f3n y almacenamiento de m\u00e9tricas y la visualizaci\u00f3n de datos de los cuadros de mando. La mayor\u00eda de los pasos de almacenamiento y visualizaci\u00f3n de datos son similares para todos los casos de uso, pero la recopilaci\u00f3n de datos de m\u00e9tricas depende de las m\u00e9tricas que elijas como objetivo.<\/p>\n<h3>C\u00f3mo obtener datos sanitarios para sus cuadros de mando<\/h3>\n<p>Para el caso de uso de la monitorizaci\u00f3n de infraestructuras, hay que recopilar diversas m\u00e9tricas de estado de cientos de m\u00e1quinas virtuales para crear una infraestructura estable.<\/p>\n<p>Para este paso, creamos un script en Python que realiza la conexi\u00f3n SSH a las VMs en paralelo (pool multiproceso) y recoge los datos necesarios. En nuestro caso, tambi\u00e9n tenemos un trabajo Jenkins que ejecuta peri\u00f3dicamente este script y recoge los datos de salud (CSV), y luego los guarda en la base de datos Couchbase.<\/p>\n<p>La raz\u00f3n por la que creamos este script personalizado -en lugar del exportador de nodos f\u00e1cilmente disponible proporcionado por Prometheus- es que algunas de las m\u00e9tricas necesarias no eran compatibles. Adem\u00e1s, esta soluci\u00f3n era m\u00e1s sencilla que desplegar y mantener el nuevo software en m\u00e1s de 1000 servidores. El siguiente fragmento de c\u00f3digo muestra algunas de las comprobaciones que se realizan a nivel de m\u00e1quina virtual.<\/p>\n<pre>def check_vm(os_name, host):    \r\n        client = SSHClient()\r\n        client.set_missing_host_key_policy(AutoAddPolicy())\r\n        ...\r\n        cpus = get_cpuinfo(client)\r\n        meminfo = get_meminfo(client)\r\n        diskinfo = get_diskinfo(client)\r\n        uptime = get_uptime(client)\r\n        ...\r\n    return ssh_status, '', ssh_resp_time, real_os_version, cpus, meminfo, diskinfo, uptime, uptime_days, systime, cpu_load, cpu_total_processes, fdinfo, \\\r\n        iptables_rules_count, mac_address, swapinfo, cb_processes, cb_version, cb_running_serv, cb_ind_serv\r\n\r\ndef get_cpuinfo(ssh_client):\r\n    return ssh_command(ssh_client,\"cat \/proc\/cpuinfo  |egrep processor |wc -l\")\r\n\r\ndef get_meminfo(ssh_client):\r\n    return ssh_command(ssh_client,\"cat \/proc\/meminfo |egrep Mem |cut -f2- -d':'|sed 's\/ \/\/g'|xargs|sed 's\/ \/,\/g'|sed 's\/kB\/\/g'\")\r\n\r\ndef get_diskinfo(ssh_client):\r\n    return ssh_command(ssh_client,\"df -ml --output=size,used,avail,pcent \/ |tail -1 |sed 's\/ \\+\/,\/g'|cut -f2- -d','|sed 's\/%\/\/g'\")\r\n\r\ndef get_uptime(ssh_client):\r\n    return ssh_command(ssh_client, \"uptime -s\")\r\n\r\ndef get_cpu_users_load_avg(ssh_client):\r\n    return ssh_command(ssh_client, \"uptime |rev|cut -f1-4 -d','|rev|sed 's\/load average:\/\/g'|sed 's\/ \\+\/\/g'|sed 's\/users,\/,\/g'|sed 's\/user,\/,\/g'\")\r\n\r\ndef get_file_descriptors(ssh_client):\r\n    return ssh_command(ssh_client, \"echo $(cat \/proc\/sys\/fs\/file-nr;ulimit -n)|sed 's\/ \/,\/g'\")\r\n\r\ndef get_mac_address(ssh_client):\r\n    return ssh_command(ssh_client, \"ifconfig `ip link show | egrep eth[0-9]: -A 1 |tail -2 |xargs|cut -f2 -d' '|sed 's\/:\/\/g'`|egrep ether |xargs|cut -f2 -d' '\")\r\n\r\ndef get_mac_address_ip(ssh_client):\r\n    return ssh_command(ssh_client, \"ip a show `ip link show | egrep eth[0-9]: -A 1 |tail -2 |xargs|cut -f2 -d' '|sed 's\/:\/\/g'`|egrep ether |xargs|cut -f2 -d' '\")\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>El siguiente fragmento de c\u00f3digo muestra c\u00f3mo conectarse a Couchbase utilizando Python SDK 3.x con operaciones clave-valor, obteniendo un documento o guardando un documento en la base de datos.<\/p>\n<pre>        try:\r\n            self.cb_cluster = Cluster(\"couchbase:\/\/\"+self.cb_host, ClusterOptions(PasswordAuthenticator(self.cb_username, self.cb_userpassword), \\\r\ntimeout_options=ClusterTimeoutOptions(kv_timeout=timedelta(seconds=10))))\r\n            self.cb_b = self.cb_cluster.bucket(self.cb_bucket)\r\n            self.cb = self.cb_b.default_collection()\r\n        except Exception as e:\r\n            print('Connection Failed: %s ' % self.cb_host)\r\n            print(e)\r\n\r\n    def get_doc(self, doc_key, retries=3):\r\n        # ..\r\n         return self.cb.get(doc_key)\r\n            \r\n    def save_doc(self, doc_key, doc_value, retries=3):\r\n        #...\r\n        self.cb.upsert(doc_key, doc_value)\r\n        #...        \r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>Implantaci\u00f3n del servicio proxy del cuadro de mandos<\/h3>\n<p>Para los casos de uso de observabilidad de pruebas, los datos est\u00e1n en una URL de artefacto de Jenkins y tambi\u00e9n en Couchbase Server. Para unir estas m\u00faltiples fuentes de datos (CSV, DB), creamos un servicio API proxy que aceptar\u00eda peticiones de Grafana y devolver\u00eda el formato de datos entendido por Grafana.<\/p>\n<p>Los siguientes fragmentos de c\u00f3digo muestran los detalles de implementaci\u00f3n y preparaci\u00f3n del servicio.<\/p>\n<p>`dashboard.py`<\/p>\n<pre># Dashboard API service\r\n@app.route(\"\/query\", methods=['POST'])\r\ndef query():\r\n\t\"\"\"\r\n\t\/query responds to a Grafana data request and is \r\nformatted as either data points for time series data\r\n\tor rows and columns for tabular data\r\n\t\"\"\"\r\n\tfor target in request.json['targets']:\r\n   \t \tdata_type = target['type']\r\n   \t \r\n    \tif data_type == \"timeseries\":\r\n   \t\t datapoints = calculate_datapoints(target)\r\n    \telif data_type == \"table\":\r\n   \t\t datapoints = calculate_rows_and_columns(target)   \t \r\n\t...\r\n    \r\ndef calculate_datapoints(target):\r\n\t\"\"\"\r\n\tReturns data in a time series format\r\n\tdatapoints is formatted as a list of 2 item tuples in the format [value, timestamp]\r\n\t\"\"\"\r\n\t...\r\n    \r\n\tif target['source'] == \"couchbase\":\r\n   \t\t...\r\n\telif target['source'] == \"json\":\r\n \t\t ...\r\n\telif target['source'] == \"csv\":\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>`Dockerfile`<\/p>\n<pre>FROM ubuntu:latest\r\nENV DEBIAN_FRONTEND \"noninteractive\"\r\nRUN apt-get update -y &amp;&amp; apt-get install -y python3-dev python3-pip python3-setuptools cmake build-essential\r\nRUN mkdir \/app\r\nCOPY .\/requirements.txt \/app\r\nWORKDIR \/app\r\nRUN pip3 install -r requirements.txt\r\nCOPY .\/dashboard.py \/app\r\nCOPY .\/entrypoint.sh \/app\r\n\r\nENTRYPOINT [\".\/entrypoint.sh\"]\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>`entrypoint.sh`<\/p>\n<pre>#!\/bin\/bash\r\npython3 dashboard.py $GRAFANA_HOST\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>`requirements.txt`<\/p>\n<pre>couchbase==3.0.7\r\nFlask==1.1.2\r\nrequests==2.24.0\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>C\u00f3mo obtener los datos tabulares en Grafana<\/h3>\n<p>Grafana es una gran herramienta para visualizar datos de series temporales. Sin embargo, a veces quieres mostrar algunos datos de series no temporales en la misma interfaz.<\/p>\n<p>Logramos este objetivo utilizando el <a href=\"https:\/\/grafana.com\/grafana\/plugins\/ae3e-plotly-panel\/?ref=hello-from-couchbase\" target=\"_blank\" rel=\"noopener\">Plugin Plotly<\/a> que es una biblioteca de gr\u00e1ficos de JavaScript. Nuestro caso de uso principal era ilustrar las tendencias a trav\u00e9s de una variedad de m\u00e9tricas importantes para nuestras pruebas de regresi\u00f3n semanales. Algunas de las m\u00e9tricas m\u00e1s importantes que quer\u00edamos rastrear eran la tasa de aprobaci\u00f3n, el n\u00famero de pruebas, trabajos abortados, y el tiempo total se toma. Desde el lanzamiento de Grafana 8, hay un soporte limitado para los gr\u00e1ficos de barras. En el momento de escribir esto, la funcionalidad de gr\u00e1ficos de barras todav\u00eda est\u00e1 en beta y no ofrece todas las caracter\u00edsticas que necesitamos, como el apilamiento.<\/p>\n<p>Nuestro objetivo era admitir archivos CSV\/JSON gen\u00e9ricos o una consulta SQL++ de Couchbase y ver los datos como una tabla en Grafana. Para lograr la m\u00e1xima portabilidad, quer\u00edamos tener un \u00fanico archivo que definiera tanto las fuentes de datos como el dise\u00f1o de la plantilla de Grafana.<\/p>\n<p>Para mostrar los datos tabulares, a continuaci\u00f3n se presentan las dos opciones viables.<\/p>\n<ol>\n<li>Escribir un plugin de interfaz de usuario para Grafana<\/li>\n<li>Proporcionar un proxy JSON utilizando el m\u00e9todo <a href=\"https:\/\/grafana.com\/grafana\/plugins\/grafana-simple-json-datasource\/?ref=hello-from-couchbase\" target=\"_blank\" rel=\"noopener\">Plugin de fuentes de datos JSON<\/a><\/li>\n<\/ol>\n<p>Elegimos la opci\u00f3n 2 para nuestra implementaci\u00f3n, ya que parec\u00eda m\u00e1s sencillo que intentar aprender las herramientas del plugin de Grafana y crear un plugin de interfaz de usuario independiente para la configuraci\u00f3n.<\/p>\n<p>Tenga en cuenta que desde que termin\u00f3 este proyecto, <a href=\"https:\/\/grafana.com\/grafana\/plugins\/marcusolsson-csv-datasource\/?ref=hello-from-couchbase\" target=\"_blank\" rel=\"noopener\">un nuevo plugin<\/a> que te permite a\u00f1adir datos CSV a Grafana directamente. Si la visualizaci\u00f3n de datos tabulares de un CSV es su \u00fanico requisito, entonces este plugin es una buena soluci\u00f3n.<\/p>\n<h3>Implantaci\u00f3n del servicio Prometheus<\/h3>\n<p>`prometheus.yml`<\/p>\n<pre># Prometheus global config\r\nglobal:\r\n  scrape_interval: 1m # Set the scrape interval to every 15 seconds. Default is every 1 minute.\r\n  scrape_timeout: 30s\r\n# Alertmanager configuration\r\nalerting:\r\n  alertmanagers:\r\n    - static_configs:\r\n        - targets:\r\n            - alertmanager:9093\r\nrule_files:\r\n  - \"alert.rules.yml\"\r\n  - job_name: \"prometheus\"\r\n    static_configs:\r\n      - targets: [\"localhost:9090\"]\r\n  - job_name: \"automation_exporter\"\r\n    static_configs:\r\n      - targets: [\"exporter:8000\"]\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>`alert.rules.yml`<\/p>\n<pre>groups:\r\n  - name: alert.rules\r\n    rules:\r\n      - alert: PoolVMDown\r\n        expr: vm_health_ssh_status == 0\r\n        for: 1m\r\n        annotations:\r\n          title: \"Server Pool VM {{ $labels.ipaddr }} SSH Failed\"\r\n          description: \"{{ $labels.ipaddr }} SSH failed with error: {{ $labels.ssh_error }}.\"\r\n        labels:\r\n          severity: \"critical\"\r\n      - alert: PoolVMHighDiskUsage\r\n        expr: disk_usage &gt;= 95\r\n        for: 1m\r\n        annotations:\r\n          title: \"Server Pool VM {{ $labels.ipaddr }} high disk usage\"\r\n          description: \"{{ $labels.ipaddr }} has disk usage of {{ $value }}%\"\r\n        labels:\r\n          severity: \"critical\"\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>C\u00f3mo obtener m\u00e9tricas personalizadas a trav\u00e9s del exportador de Prometheus<\/h3>\n<p>Muchos servicios nativos de la nube se integran directamente con Prometheus para permitir la recopilaci\u00f3n centralizada de m\u00e9tricas para todos sus servicios.<\/p>\n<p>Quer\u00edamos ver c\u00f3mo pod\u00edamos utilizar esta tecnolog\u00eda para supervisar nuestra infraestructura existente. Si tienes servicios que no exponen directamente un punto final de m\u00e9tricas de Prometheus, la forma de resolverlo es utilizar un exportador. De hecho, hay incluso un exportador Couchbase para exponer todas las m\u00e9tricas importantes de su cl\u00faster. (Nota: En <a href=\"https:\/\/www.couchbase.com\/blog\/es\/couchbase-server-7-0-release\/?ref=blog\" target=\"_blank\" rel=\"noopener\">Servidor Couchbase 7.0<\/a>Couchbase 7 utiliza Prometheus para la recopilaci\u00f3n y gesti\u00f3n de las estad\u00edsticas del servidor para dar servicio a los usuarios de Couchbase. <a href=\"https:\/\/docs.couchbase.com\/server\/current\/manage\/manage-ui\/manage-ui.html?ref=blog\" target=\"_blank\" rel=\"noopener\">la interfaz web<\/a>).<\/p>\n<p>Al crear nuestros paneles de observabilidad, ten\u00edamos varios datos almacenados en archivos JSON, en archivos CSV y en buckets de Couchbase. Quer\u00edamos una forma de exponer todos estos datos y mostrarlos en Grafana tanto en formato tabular como en forma de datos de series temporales mediante Prometheus.<\/p>\n<p>Prometheus espera una salida de texto simple basada en l\u00edneas. He aqu\u00ed un ejemplo de nuestra monitorizaci\u00f3n de grupos de servidores:<\/p>\n<pre>available_vms{pool=\"12hrreg\"} 1\r\navailable_vms{pool=\"regression\"} 16\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>Veamos con m\u00e1s detalle c\u00f3mo implementar fuentes de datos tanto desde archivos CSV como desde Couchbase directamente.<\/p>\n<h4>Archivos CSV como fuente de datos<\/h4>\n<p>Cada vez que Prometheus sondea el punto final, obtenemos el CSV y, para cada columna, exponemos una m\u00e9trica, a\u00f1adiendo etiquetas para varias filas si se proporciona una etiqueta en la configuraci\u00f3n.<\/p>\n<p>Para el ejemplo anterior, el CSV tiene el siguiente aspecto:<\/p>\n<pre>pool,available_count\r\n12hrreg,1\r\nregression,16\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h4>Couchbase como fuente de datos<\/h4>\n<p>Cada vez que Prometheus sondea el endpoint, ejecutamos las consultas SQL++ definidas en la configuraci\u00f3n, y para cada consulta, exponemos una m\u00e9trica, a\u00f1adiendo etiquetas para m\u00faltiples filas si se proporciona una etiqueta en la configuraci\u00f3n.<\/p>\n<p>A continuaci\u00f3n se muestra un ejemplo de respuesta SQL++ que produce las m\u00e9tricas anteriores:<\/p>\n<pre class=\"\">[{\r\n\t\u201cpool\u201d, \u201c12hrreg\u201d,\r\n\t\u201ccount\u201d: 1\r\n },\r\n {\r\n\t\u201cpool\u201d, \u201cregression\u201d,\r\n\t\u201ccount\u201d: 16\r\n }]\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>This exporter Python service exposes a `\/metrics` endpoint to be used in Prometheus. These metrics are defined in `queries.json` and define which queries and CSV columns should be exposed as metrics. See the below JSON snippet (reduced for brevity) as an example.<\/p>\n<p>`queries.json`<\/p>\n<pre>{\r\n  \"clusters\": {\r\n    \"static_vms\": {\r\n      \"host\": \"&lt;ip-address&gt;\",\r\n      \"username\": \"Administrator\",\r\n      \"password\": \"xxxx\"\r\n    },\r\n    ...\r\n  },\r\n  \"queries\": [\r\n    {\r\n      \"name\": \"available_vms\",\r\n      \"cluster\": \"static_vms\",\r\n      \"query\": \"SELECT poolId as `pool`, COUNT(*) AS count FROM (SELECT poolId FROM `QE-server-pool` WHERE IS_ARRAY(poolId)=FALSE and state='available' UNION ALL SELECT poolId FROM `QE-server-pool` UNNEST poolId where `QE-server-pool`.state = 'available'  ) AS pools group by poolId\",\r\n      \"description\": \"Available VMs for each server pool\",\r\n      \"value_key\": \"count\",\r\n      \"labels\": [\"pool\"]\r\n    },\r\n    ...\r\n  ],\r\n  \"csvs\": {\r\n    \"vm_health\": \"https:\/\/&lt;jenkins-host-job-url&gt;\/lastSuccessfulBuild\/artifact\/vm_health_info.csv\/\",\r\n   ...\r\n  },\r\n  \"columns\": [\r\n    {\r\n      \"name\": \"memory_usage\",\r\n      \"csv\": \"vm_health\",\r\n      \"description\": \"Memory usage\",\r\n      \"column\": \"memory_use(%)\",\r\n      \"labels\": [\"ipaddr\"]\r\n    },\r\n    {\r\n      \"name\": \"disk_usage\",\r\n      \"csv\": \"vm_health\",\r\n      \"description\": \"Disk usage\",\r\n      \"column\": \"disk_use%\",\r\n      \"labels\": [\"ipaddr\"]\r\n    },\r\n    {\r\n      \"name\": \"cpu_load_avg_5mins\",\r\n      \"csv\": \"vm_health\",\r\n      \"description\": \"CPU load average (5mins)\",\r\n      \"column\": \"cpu_load_avg_5mins\",\r\n      \"labels\": [\"ipaddr\"]\r\n    },\r\n    {\r\n      \"name\": \"vm_health_ssh_status\",\r\n      \"csv\": \"vm_health\",\r\n      \"description\": \"SSH Status\",\r\n      \"column\": \"ssh_status\",\r\n      \"labels\": [\"ipaddr\", \"ssh_error\", \"pool_state\", \"couchbase_version\", \"pool_ids\"]\r\n    },\r\n    ...\r\n  ]\r\n}\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>`exporter.py`<\/p>\n<pre>for options in settings['queries'] + settings[\"columns\"]:\r\n    log.info(\"Registered metrics collection for {}\".format(options['name']))\r\n\r\ndef get_labels(row, options):\r\n    rename_map = options.get(\"rename\", {})\r\n    return [\"{}=\\\"{}\\\"\".format(rename_map[label] if label in rename_map else label, row[label]) for label in options[\"labels\"]]\r\n\r\ndef collect_cb(clusters, metrics, options):\r\n    rows = clusters[options[\"cluster\"]].query(options[\"query\"]).rows()\r\n    for row in rows:\r\n        if len(options[\"labels\"]) &gt; 0:\r\n            labels = get_labels(row, options)\r\n            metrics.append(\"{}{{{}}} {}\".format(\r\n                options[\"name\"], \",\".join(labels), row[options[\"value_key\"]]))\r\n        else:\r\n            metrics.append(\"{} {}\".format(\r\n                options[\"name\"], row[options[\"value_key\"]]))\r\n\r\ndef collect_csv(metrics, options)\r\n    csvfile = requests.get(csvs[options[\"csv\"]]).text.splitlines()\r\n    reader = DictReader(csvfile)\r\n    for row in reader:\r\n        if options[\"column\"] not in row or row[options[\"column\"]] == \"\":\r\n            continue\r\n        if len(options[\"labels\"]) &gt; 0:\r\n            labels = get_labels(row, options)\r\n            metrics.append(\"{}{{{}}} {}\".format(\r\n                options[\"name\"], \",\".join(labels), row[options[\"column\"]]))\r\n        else:\r\n            metrics.append(\"{} {}\".format(\r\n                options[\"name\"], row[options[\"column\"]]))\r\n\r\n@app.route(\"\/metrics\")\r\ndef metrics():\r\n    metrics = []\r\n    clusters = {}\r\n    for [cluster_name, options] in settings['clusters'].items():\r\n        if cluster_name not in clusters:\r\n            try:\r\n                clusters[cluster_name] = Cluster('couchbase:\/\/'+options['host'],\r\n                                                ClusterOptions(\r\n                    PasswordAuthenticator(options['username'], options['password'])))\r\n            except Exception as e:\r\n                log.warning(\"Couldn't connect to cluster {}\".format(e))\r\n            log.debug(\"Connected to {}\".format(options['host']))\r\n    for options in settings[\"queries\"] + settings[\"columns\"]:\r\n        log.debug(\"Collecting metrics for {}\".format(options[\"name\"]))\r\n        try:\r\n            if \"cluster\" in options:\r\n                collect_cb(clusters, metrics, options)\r\n            elif \"csv\" in options:\r\n                collect_csv(metrics, options)\r\n            else:\r\n                raise Exception(\"Invalid type\")\r\n        except Exception as e:\r\n            log.warning(\"Error while collecting {}: {}\".format(\r\n                options[\"name\"], e))\r\n    return Response(\"\\n\".join(metrics), mimetype=\"text\/plain\")\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>Implementaci\u00f3n del servicio de gesti\u00f3n de alertas<\/h3>\n<p>Prometheus tambi\u00e9n admite alertas en las que realiza un seguimiento de m\u00e9tricas espec\u00edficas a lo largo del tiempo. Si esa m\u00e9trica empieza a dar resultados, se activar\u00e1 una alerta.<\/p>\n<p>For the example above you could add an alert for when the regression pool has no servers available. If you specify the query as `available_vms{pool=&#8221;regression&#8221;} == 0` that will return a series when there are `0` available. Once added, Prometheus tracks this for you (default is every minute). If that is all you do, you can visit the Prometheus UI and the alerts tab will show you which alerts are firing.<\/p>\n<p>Con el Gestor de Alertas, puede ir un paso m\u00e1s all\u00e1 y conectar servicios de comunicaciones para que Prometheus le avise por correo electr\u00f3nico o un canal de Slack, por ejemplo, cuando se dispare una alerta. Esto significa que puede ser informado inmediatamente a trav\u00e9s de su m\u00e9todo preferido cuando algo va mal. En Couchbase, configuramos alertas para ser notificados de un alto uso de disco en los servidores, as\u00ed como cuando no se pod\u00eda acceder a los servidores a trav\u00e9s de SSH. Mira el ejemplo de abajo:<\/p>\n<p>`alertmanager.yml`<\/p>\n<pre>global:\r\n  resolve_timeout: 1m\r\n  smtp_from: qa@couchbase.com\r\n  smtp_smarthost: mail-com.mail.protection.outlook.com:25\r\n\r\nroute:\r\n  group_by: [\"alertname\"]\r\n  group_wait: 10s\r\n  group_interval: 10s\r\n  repeat_interval: 24h\r\n  receiver: \"infra-email\"\r\n  matchers:\r\n   - alertname =~ PoolVMDown|PoolVMOSMismatch|PoolVMHighDiskUsage|SlaveVMHighDiskUsage|SlaveVMHighDiskUsageData\r\n\r\nreceivers:\r\n  - name: \"infra-email\"\r\n    email_configs:\r\n      - to: jake.rawsthorne@couchbase.com,jagadesh.munta@couchbase.com\r\n<\/pre>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h2>Conclusi\u00f3n<\/h2>\n<p>En conclusi\u00f3n, esperamos que puedas aprender de nuestra experiencia en la creaci\u00f3n de cuadros de mando de observabilidad que te ayuden a afinar en las m\u00e9tricas que m\u00e1s importan en tu implementaci\u00f3n o caso de uso con el poder de la visualizaci\u00f3n de datos.<\/p>\n<p>En nuestro caso, este esfuerzo nos permiti\u00f3 detectar problemas de infraestructura de servidores y de estabilidad de las pruebas. La creaci\u00f3n de cuadros de mando tambi\u00e9n redujo el n\u00famero de pruebas fallidas, as\u00ed como el tiempo total de regresi\u00f3n de varias versiones del producto.<\/p>\n<p>Esperamos que este tutorial le ayude a crear mejores cuadros de mando de observabilidad en el futuro.<\/p>\n<p><em>Tambi\u00e9n nos gustar\u00eda agradecer especialmente a Raju y al equipo de QE sus comentarios sobre la mejora de las m\u00e9tricas espec\u00edficas.<\/em><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 30px\" aria-hidden=\"true\"><\/div>\n<div style=\"text-align: center\"><strong>\u00bfConstruyendo algo impresionante?<a href=\"https:\/\/www.couchbase.com\/blog\/es\/downloads\/?ref=blog\" target=\"_blank\" rel=\"noopener\">\u00bfPor qu\u00e9 no construirlo en Couchbase?<\/a><\/strong><\/div>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<p>&nbsp;<\/p>","protected":false},"excerpt":{"rendered":"<p>You&#8217;ve certainly heard it before: &#8220;What gets measured gets done.&#8221; It&#8217;s true: what you observe and measure is what you can improve. The key to any improvement is to first identify what to measure and then collect the related metrics. [&hellip;]<\/p>","protected":false},"author":78989,"featured_media":12083,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[1815,2381,1816,9327,2334,9139,1812,2201],"tags":[2250,2384,1261,2313,2383],"ppma_author":[9435],"class_list":["post-11527","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-best-practices-and-tutorials","category-community","category-couchbase-server","category-javascript","category-monitoring","category-python","category-n1ql-query","category-tools-sdks","tag-data-visualization","tag-grafana","tag-json","tag-key-value","tag-prometheus"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v25.8 (Yoast SEO v25.8) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Observability Dashboards: Prometheus, Grafana + Couchbase<\/title>\n<meta name=\"description\" content=\"In this blog, we take you through the process you need to follow to build your own observability dashboard using Prometheus, Grafana and Couchbase.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.couchbase.com\/blog\/es\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"es_MX\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"How to Build Observability Dashboards with Prometheus, Grafana &amp; Couchbase\" \/>\n<meta property=\"og:description\" content=\"In this blog, we take you through the process you need to follow to build your own observability dashboard using Prometheus, Grafana and Couchbase.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.couchbase.com\/blog\/es\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/\" \/>\n<meta property=\"og:site_name\" content=\"The Couchbase Blog\" \/>\n<meta property=\"article:published_time\" content=\"2021-09-23T07:00:10+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-06-14T04:25:14+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus-social.png\" \/>\n\t<meta property=\"og:image:width\" content=\"800\" \/>\n\t<meta property=\"og:image:height\" content=\"418\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Jake Rawsthorne &amp; Jagadesh Munta\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus-social.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Jake Rawsthorne &amp; Jagadesh Munta\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 minutos\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"TechArticle\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/\"},\"author\":{\"name\":\"Jake &amp; Jagadesh Shared byline\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/777a6aa1a9bad7851380e8095da38ce1\"},\"headline\":\"How to Build Observability Dashboards with Prometheus, Grafana &amp; Couchbase\",\"datePublished\":\"2021-09-23T07:00:10+00:00\",\"dateModified\":\"2025-06-14T04:25:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/\"},\"wordCount\":2667,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png\",\"keywords\":[\"data visualization\",\"Grafana\",\"JSON\",\"key value\",\"Prometheus\"],\"articleSection\":[\"Best Practices and Tutorials\",\"Community\",\"Couchbase Server\",\"JavaScript\",\"Monitoring\",\"Python\",\"SQL++ \/ N1QL Query\",\"Tools &amp; SDKs\"],\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/\",\"name\":\"Observability Dashboards: Prometheus, Grafana + Couchbase\",\"isPartOf\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#primaryimage\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#primaryimage\"},\"thumbnailUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png\",\"datePublished\":\"2021-09-23T07:00:10+00:00\",\"dateModified\":\"2025-06-14T04:25:14+00:00\",\"description\":\"In this blog, we take you through the process you need to follow to build your own observability dashboard using Prometheus, Grafana and Couchbase.\",\"breadcrumb\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#primaryimage\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png\",\"width\":1200,\"height\":628,\"caption\":\"Learn how to make observability dashboards with Couchbase, Grafana & Prometheus for time-series data\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.couchbase.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"How to Build Observability Dashboards with Prometheus, Grafana &amp; Couchbase\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#website\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"name\":\"The Couchbase Blog\",\"description\":\"Couchbase, the NoSQL Database\",\"publisher\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png\",\"width\":218,\"height\":34,\"caption\":\"The Couchbase Blog\"},\"image\":{\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/777a6aa1a9bad7851380e8095da38ce1\",\"name\":\"Jake &amp; Jagadesh Shared byline\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/6b5c82568cb218e8a06486a2bd0cc6e7\",\"url\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/jake-rawsthorne-jagadesh-munta-couchbase.png\",\"contentUrl\":\"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/jake-rawsthorne-jagadesh-munta-couchbase.png\",\"caption\":\"Jake &amp; Jagadesh Shared byline\"},\"url\":\"https:\/\/www.couchbase.com\/blog\/es\/author\/jake-and-jagadesh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Observability Dashboards: Prometheus, Grafana + Couchbase","description":"En este blog, te llevamos a trav\u00e9s del proceso que necesitas seguir para construir tu propio dashboard de observabilidad usando Prometheus, Grafana y Couchbase.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.couchbase.com\/blog\/es\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/","og_locale":"es_MX","og_type":"article","og_title":"How to Build Observability Dashboards with Prometheus, Grafana &amp; Couchbase","og_description":"In this blog, we take you through the process you need to follow to build your own observability dashboard using Prometheus, Grafana and Couchbase.","og_url":"https:\/\/www.couchbase.com\/blog\/es\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/","og_site_name":"The Couchbase Blog","article_published_time":"2021-09-23T07:00:10+00:00","article_modified_time":"2025-06-14T04:25:14+00:00","og_image":[{"width":800,"height":418,"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus-social.png","type":"image\/png"}],"author":"Jake Rawsthorne &amp; Jagadesh Munta","twitter_card":"summary_large_image","twitter_image":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus-social.png","twitter_misc":{"Written by":"Jake Rawsthorne &amp; Jagadesh Munta","Est. reading time":"14 minutos"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"TechArticle","@id":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#article","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/"},"author":{"name":"Jake &amp; Jagadesh Shared byline","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/777a6aa1a9bad7851380e8095da38ce1"},"headline":"How to Build Observability Dashboards with Prometheus, Grafana &amp; Couchbase","datePublished":"2021-09-23T07:00:10+00:00","dateModified":"2025-06-14T04:25:14+00:00","mainEntityOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/"},"wordCount":2667,"commentCount":1,"publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png","keywords":["data visualization","Grafana","JSON","key value","Prometheus"],"articleSection":["Best Practices and Tutorials","Community","Couchbase Server","JavaScript","Monitoring","Python","SQL++ \/ N1QL Query","Tools &amp; SDKs"],"inLanguage":"es","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/","url":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/","name":"Observability Dashboards: Prometheus, Grafana + Couchbase","isPartOf":{"@id":"https:\/\/www.couchbase.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#primaryimage"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#primaryimage"},"thumbnailUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png","datePublished":"2021-09-23T07:00:10+00:00","dateModified":"2025-06-14T04:25:14+00:00","description":"En este blog, te llevamos a trav\u00e9s del proceso que necesitas seguir para construir tu propio dashboard de observabilidad usando Prometheus, Grafana y Couchbase.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#primaryimage","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/how-to-make-observability-dashboard-couchbase-grafana-prometheus.png","width":1200,"height":628,"caption":"Learn how to make observability dashboards with Couchbase, Grafana & Prometheus for time-series data"},{"@type":"BreadcrumbList","@id":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.couchbase.com\/blog\/"},{"@type":"ListItem","position":2,"name":"How to Build Observability Dashboards with Prometheus, Grafana &amp; Couchbase"}]},{"@type":"WebSite","@id":"https:\/\/www.couchbase.com\/blog\/#website","url":"https:\/\/www.couchbase.com\/blog\/","name":"El blog de Couchbase","description":"Couchbase, la base de datos NoSQL","publisher":{"@id":"https:\/\/www.couchbase.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.couchbase.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"El blog de Couchbase","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/2023\/04\/admin-logo.png","width":218,"height":34,"caption":"The Couchbase Blog"},"image":{"@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/777a6aa1a9bad7851380e8095da38ce1","name":"Jake &amp; Jagadesh Titular compartido","image":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/www.couchbase.com\/blog\/#\/schema\/person\/image\/6b5c82568cb218e8a06486a2bd0cc6e7","url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/jake-rawsthorne-jagadesh-munta-couchbase.png","contentUrl":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/jake-rawsthorne-jagadesh-munta-couchbase.png","caption":"Jake &amp; Jagadesh Shared byline"},"url":"https:\/\/www.couchbase.com\/blog\/es\/author\/jake-and-jagadesh\/"}]}},"authors":[{"term_id":9435,"user_id":78989,"is_guest":0,"slug":"jake-and-jagadesh","display_name":"Jake Rawsthorne &amp; Jagadesh Munta","avatar_url":{"url":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/jake-rawsthorne-jagadesh-munta-couchbase.png","url2x":"https:\/\/www.couchbase.com\/blog\/wp-content\/uploads\/sites\/1\/2021\/09\/jake-rawsthorne-jagadesh-munta-couchbase.png"},"author_category":"","last_name":"& Jagadesh Munta","first_name":"Jake Rawsthorne","job_title":"","user_url":"","description":"Jake Rawsthorne and Jagadesh Munta are software engineers at Couchbase."}],"_links":{"self":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/11527","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/users\/78989"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/comments?post=11527"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/posts\/11527\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media\/12083"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/media?parent=11527"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/categories?post=11527"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/tags?post=11527"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/es\/wp-json\/wp\/v2\/ppma_author?post=11527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}