{"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\/ko\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/","title":{"rendered":"Prometheus, Grafana \ubc0f CouchBase\ub85c \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\ub97c \uad6c\ucd95\ud558\ub294 \ubc29\ubc95"},"content":{"rendered":"<p><strong>\uc804\uc5d0\ub3c4 \ub4e4\uc5b4\ubcf4\uc168\uc744 \uac81\ub2c8\ub2e4:<\/strong> \"\uce21\uc815\ub41c \uac83\uc740 \ubc18\ub4dc\uc2dc \uc2e4\ud589\ub429\ub2c8\ub2e4.\"<\/p>\n<p>\uad00\ucc30\ud558\uace0 \uce21\uc815\ud558\ub294 \uac83\uc774 \uace7 \uac1c\uc120\ud560 \uc218 \uc788\ub294 \uac83\uc785\ub2c8\ub2e4.<\/p>\n<p>\uac1c\uc120\uc758 \ud575\uc2ec\uc740 \uba3c\uc800 \ub2e4\uc74c\uacfc \uac19\uc740 \uc0ac\ud56d\uc744 \ud30c\uc545\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. <em>\ubb34\uc5c7<\/em> \ub97c \uc0ac\uc6a9\ud558\uc5ec \uad00\ub828 \uc9c0\ud45c\ub97c \uce21\uc815\ud55c \ub2e4\uc74c \uc218\uc9d1\ud569\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc9c0\ud45c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uae30\ubcf8 \uc791\uc5c5\uc744 \uc870\uc815\ud558\uace0 \ubcc0\uacbd \uc0ac\ud56d\uc758 \ud6a8\uacfc\ub97c \ubd84\uc11d\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uadf8\ub7f0 \ub2e4\uc74c \ucda9\ubd84\ud788 \uac1c\uc120\ub420 \ub54c\uae4c\uc9c0 \uc774 \uacfc\uc815\uc744 \ubc18\ubcf5\ud558\uc138\uc694.<\/p>\n<p>Couchbase\uc5d0\uc11c\ub294 \uc77c\uc0c1\uc801\uc778 \uc6b4\uc601\uc758 \uc77c\ubd80\ub97c \uac1c\uc120\ud574\uc57c \ud588\uae30 \ub54c\ubb38\uc5d0 \ubb38\uc81c\ub97c \uc2dd\ubcc4\ud558\uace0 \uac1c\uc120 \uc0ac\ud56d\uc744 \ucd94\uc801\ud558\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub418\ub294 \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \uc6b0\ub9ac\ub294 \ub2e4\uc74c\uacfc \uac19\uc740 \uc870\ud569\uc744 \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/prometheus.io\/?ref=hello-from-couchbase\" target=\"_blank\" rel=\"noopener\">\ud504\ub85c\uba54\ud14c\uc6b0\uc2a4<\/a>\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc2dc\uacc4\uc5f4 \ub370\uc774\ud130\uc758 \uc800\uc7a5 \ubc0f \ucffc\ub9ac\ub97c \uac04\uc18c\ud654\ud569\ub2c8\ub2e4. <a href=\"https:\/\/grafana.com\/?ref=hello-from-couchbase\" target=\"_blank\" rel=\"noopener\">Grafana<\/a>\ub97c \uc0ac\uc6a9\ud558\uc5ec \uba4b\uc9c4 \ub370\uc774\ud130 \uc2dc\uac01\ud654\ub97c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub610\ud55c <a href=\"https:\/\/developer.couchbase.com\/new-to-couchbase\/?ref=blog\" target=\"_blank\" rel=\"noopener\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/a> \ub97c \uc0ac\uc6a9\ud558\uc5ec \ub098\uc911\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub3c4\ub85d \uae30\ub85d \ub370\uc774\ud130\ub97c \uc800\uc7a5\ud569\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/products\/full-text-search\/?ref=blog\" target=\"_blank\" rel=\"noopener\">\uc804\uccb4 \ud14d\uc2a4\ud2b8 \uac80\uc0c9<\/a> \uadf8\ub9ac\uace0 <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/products\/analytics\/?ref=blog\" target=\"_blank\" rel=\"noopener\">\ubd84\uc11d<\/a> \ub3c4\uad6c.<\/p>\n<p>\uc774 \ubb38\uc11c\uc5d0\uc11c\ub294 Prometheus, Grafana \ubc0f Couchbase\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc790\uc2e0\ub9cc\uc758 \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\ub97c \uad6c\ucd95\ud558\ub294 \ubc29\ubc95\uc744 \uc548\ub0b4\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc0ac\ub0b4 \ub370\uc774\ud130 \uc6d0\ubcf8 \ud30c\uc774\ud504\ub77c\uc778\uc740 \ub370\uc774\ud130 \uc2dc\uac01\ud654 \uc18c\ud504\ud2b8\uc6e8\uc5b4\uc640 \ub9c8\ucc2c\uac00\uc9c0\ub85c \ub2e4\ub97c \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc624\ub298 \ubcf4\uc5ec\ub4dc\ub9ac\ub294 \ub2e8\uacc4\ub294 \uc5ec\ub7ec \ub3c4\uad6c\uc640 \ubc30\ud3ec\uc5d0 \uc801\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\uc77c\ubc18 \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc: \ub514\uc790\uc778 \ubc0f \uc544\ud0a4\ud14d\ucc98<\/h2>\n<p>\uc7ac\uc0ac\uc6a9 \uac00\ub2a5\ud558\uace0 \ud655\uc7a5 \uac00\ub2a5\ud55c \ub3c4\uad6c\ub97c \uad6c\ucd95\ud558\ub824\uba74 \uba3c\uc800 \uc77c\ubc18\uc801\uc778 \ub514\uc790\uc778\uacfc \ud15c\ud50c\ub9bf\uc73c\ub85c \uc791\uc5c5\ud558\ub294 \uac83\uc774 \uc88b\uc2b5\ub2c8\ub2e4. \uadf8 \ub2e4\uc74c\uc5d0\ub294 \ud544\uc694\uc5d0 \ub530\ub77c \uc0ac\uc6a9\uc790 \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc774 \uc811\uadfc \ubc29\uc2dd\uc744 \uc0ac\uc6a9\ud558\uba74 \ud5a5\ud6c4 \ub300\uc2dc\ubcf4\ub4dc\ub97c \ube60\ub974\uace0 \uc27d\uac8c \uac1c\ubc1c\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc740 \uc6b0\ub9ac\uac00 \ud568\uaed8 \uad6c\ucd95\ud560 \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\uc758 \uc77c\ubc18\uc801\uc778 \uc544\ud0a4\ud14d\ucc98\ub97c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4:<\/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>\uc774 \uc544\ud0a4\ud14d\ucc98\uc5d0\uc11c\ub294 \ub450 \uac1c\uc758 \uc11c\ub85c \ub2e4\ub978 \ub370\uc774\ud130 \uc785\ub825\uc774 \ub300\uc2dc\ubcf4\ub4dc \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \uc778\ud130\ud398\uc774\uc2a4\ub97c \ud615\uc131\ud569\ub2c8\ub2e4. \uc544\ub798\uc5d0\uc11c \uac01\uac01\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<ol>\n<li><strong>\ub300\uc2dc\ubcf4\ub4dc\uc5d0 \ub300\ud55c JSON \uba54\ud0c0\ub370\uc774\ud130<\/strong>\n<ul>\n<li>\ub370\uc774\ud130 \uc18c\uc2a4 \uc815\uc758 - \ub370\uc774\ud130 \uc18c\uc2a4(\uc608: DB URL, SQL, \uc790\uaca9 \uc99d\uba85), \ud30c\uc77c \uacbd\ub85c \ubc0f Jenkins \uc544\ud2f0\ud329\ud2b8 URL\uc5d0 \ub300\ud55c \uc815\ubcf4\ub97c \ud3ec\ud568\ud569\ub2c8\ub2e4.<\/li>\n<li>\uba3c\uc800 \ub514\uc790\uc778\ud55c \ub2e4\uc74c \ub098\uc911\uc5d0 \ub300\uc2dc\ubcf4\ub4dc\uc5d0\uc11c \ud328\ub110\uc758 \ud15c\ud50c\ub9bf\uc73c\ub85c \uc0ac\uc6a9\ud560 Grafana \ub808\uc774\uc544\uc6c3 \ud15c\ud50c\ub9bf(\ub610\ub294 \uc2dc\uac01\uc801 \ub300\uc2dc\ubcf4\ub4dc \ubcf4\uae30)\uc785\ub2c8\ub2e4.<\/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>\uc774\ub7ec\ud55c \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\uc758 \ub514\uc790\uc778\uc740 Couchbase Server\uc640 \uac19\uc740 \ub2e4\uc591\ud55c \ub370\uc774\ud130 \uc6d0\ubcf8\uacfc \ub2e4\uc74c\uacfc \uac19\uc740 \uc9c1\uc811 \ud30c\uc77c\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/json-database\/?ref=blog\" target=\"_blank\" rel=\"noopener\">JSON \ubb38\uc11c<\/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>\uc608\uc0c1 \ucd9c\ub825\uc740 \uc704\uc5d0 \ub098\uc5f4\ub41c \ub450 \uc785\ub825\uc5d0\uc11c \uc218\uc9d1\ub41c Grafana \ub300\uc2dc\ubcf4\ub4dc UI\uc640 Prometheus \uc2dc\uacc4\uc5f4 \uba54\ud2b8\ub9ad\uc774 \ub420 \uac83\uc785\ub2c8\ub2e4. \uc704 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc758 \uc911\uc559 \ubd80\ubd84\uc740 \ub300\uc2dc\ubcf4\ub4dc \uc0dd\uc131\uc744 \uc9c0\uc6d0\ud558\ub294 \uceec\ub809\uc158\uc758 \ub2e4\uc591\ud55c \uc11c\ube44\uc2a4\ub97c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<\/p>\n<p>\uc544\ud0a4\ud14d\ucc98 \ub2e4\uc774\uc5b4\uadf8\ub7a8\uc5d0 \ud3ec\ud568\ub41c \ub2e4\uc591\ud55c \uce21\uba74\uacfc \uc11c\ube44\uc2a4\uc5d0 \ub300\ud574 \uc790\uc138\ud788 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4:<\/p>\n<ul>\n<li><strong>\ub300\uc2dc\ubcf4\ub4dc \ud504\ub85d\uc2dc \uc11c\ube44\uc2a4:<\/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>\ud504\ub85c\uba54\ud14c\uc6b0\uc2a4 \ub0b4\ubcf4\ub0b4\uae30 \uc11c\ube44\uc2a4:<\/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>Grafana \uc11c\ube44\uc2a4:<\/strong>\n<ul>\n<li>\uc774\uac83\uc740 \ud328\ub110\uc744 \ub9cc\ub4e4\uace0 \ub300\uc2dc\ubcf4\ub4dc\ub85c \ud45c\uc2dc\ud558\ub294 \ub370 \uc0ac\uc6a9\ud558\ub294 \uc77c\ubc18 Grafana \ub3c4\uad6c \uc790\uccb4\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\ud504\ub85c\uba54\ud14c\uc6b0\uc2a4 \uc11c\ube44\uc2a4:<\/strong>\n<ul>\n<li>\uc774\uac83\uc740 \uba54\ud2b8\ub9ad\uc744 \uc2dc\uacc4\uc5f4 \ub370\uc774\ud130\ub85c \ubcf4\uad00\ud558\ub294 \uc77c\ubc18 Prometheus \ub3c4\uad6c \uc790\uccb4\uc785\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li><strong>\uc54c\ub9bc \uad00\ub9ac\uc790:<\/strong>\n<ul>\n<li>\uc54c\ub9bc \uad00\ub9ac\uc790\uc5d0\ub294 \ud2b9\uc815 \uc784\uacc4\uac12\uc774 \ucda9\uc871\ub420 \ub54c \uc54c\ub9bc\uc744 \uc218\uc2e0\ud558\ub294 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc54c\ub9bc \uaddc\uce59\uc774 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<li>\uae30\ud0c0 \uc11c\ube44\uc2a4:\n<ul>\n<li><strong>\uce74\uc6b0\uce58\ubca0\uc774\uc2a4:<\/strong> \uc774\ubbf8 \uc0ac\uc6a9 \uc911\uc77c \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/resources\/why-nosql\/?ref=blog\" target=\"_blank\" rel=\"noopener\">NoSQL<\/a> \ubb38\uc11c \ub370\uc774\ud130\ubca0\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc774 \uc88b\uc9c0\ub9cc, \uadf8\ub807\uc9c0 \uc54a\uc740 \uacbd\uc6b0 \ucee8\ud14c\uc774\ub108\ub97c \ud1b5\ud574 \ub610\ub294 \ub2e4\ub978 \ud638\uc2a4\ud2b8\uc5d0 \uc9c1\uc811 \uc124\uce58\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uce74\uc6b0\uce58\ubca0\uc774\uc2a4\ub294 \ub370\uc774\ud130\ub97c JSON \ubb38\uc11c\ub85c \uc800\uc7a5\ud558\uac70\ub098, \uc0c1\ud0dc \ub610\ub294 \ud2b8\ub80c\ub4dc \ub370\uc774\ud130\ub97c \uc900\ube44\ud558\ub294 \ub3d9\uc548 \uae30\ub85d \ucd94\uc138\ub97c \uc704\ud574 \ud544\uc218 \ud544\ub4dc\ub97c \ubcc4\ub3c4\uc758 \ubb38\uc11c\ub85c \uc800\uc7a5\ud558\ub3c4\ub85d \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/li>\n<li><strong>Docker:<\/strong> \uc774 \ucee8\ud14c\uc774\ub108\ud654\ub41c \uc11c\ube44\uc2a4 \ubc30\ud3ec\ub97c \uc0ac\uc6a9\ud558\ub824\uba74 \ud638\uc2a4\ud2b8\uc5d0 \ub3c4\ucee4 \uc5d0\uc774\uc804\ud2b8 \uc18c\ud504\ud2b8\uc6e8\uc5b4\ub97c \uc124\uce58\ud574\uc57c \ud569\ub2c8\ub2e4.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<div class=\"wp-block-spacer\" style=\"height: 15px\" aria-hidden=\"true\"><\/div>\n<h3>\ub300\uc2dc\ubcf4\ub4dc JSON \uad6c\uc870 \uc0d8\ud50c<\/h3>\n<p>\uc544\ub798 \ud45c\uc5d0\uc11c \uc785\ub825 \uba54\ud0c0\ub370\uc774\ud130\uc640 \uc785\ub825 \ub370\uc774\ud130 \uc18c\uc2a4\uc758 \uad6c\uc870 \uc0d8\ud50c\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<table>\n<tbody>\n<tr>\n<td>\uc785\ub825 \uba54\ud0c0\ub370\uc774\ud130 JSON \uad6c\uc870:<\/td>\n<td>\uc785\ub825 \ub370\uc774\ud130 \uc18c\uc2a4 \uad6c\uc870:<\/td>\n<\/tr>\n<tr>\n<td><code>{<br \/>\n\"\ub300\uc2dc\ubcf4\ub4dc_\uc81c\ubaa9\": \"\",<br \/>\n\"\ub370\uc774\ud130\": [<br \/>\n{<br \/>\n\"\uc18c\uc2a4\": \"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4|\uc81c\uc774\uc2a8|CSV\",<br \/>\n\"type\": \"\uc2dc\uacc4\uc5f4|\ud45c\",<br \/>\n\"name\": \"\",<br \/>\n\"\uc0c8\ub85c \uace0\uce68\": \"\"<br \/>\n}<br \/>\n],<br \/>\n\"\uadf8\ub77c\ud30c\ub098\": [<br \/>\n{ \"\ud15c\ud50c\ub9bf\": \"\ud15c\ud50c\ub9bf JSON \ub9c1\ud06c\" },<br \/>\n{<br \/>\n\"title\": \"\ub9c1\ud06c\",<br \/>\n\"\uadf8\ub9ac\ub4dc_\uc704\uce58\": {},<br \/>\n\"type\": \"\ud14d\uc2a4\ud2b8\",<br \/>\n\"\ub9c1\ud06c\": []<br \/>\n},<br \/>\n]<br \/>\n}<br \/>\n<\/code><\/td>\n<td><code>\/\/Couchbase \uc18c\uc2a4<br \/>\n{<br \/>\n\"\ud638\uc2a4\ud2b8\": \"\",<br \/>\n\"\uc0ac\uc6a9\uc790 \uc774\ub984\": \"\",<br \/>\n\"\ube44\ubc00\ubc88\ud638\": \"\",<br \/>\n\"\ucffc\ub9ac\": \"\"<br \/>\n}<br \/>\n\/\/JSON \ub610\ub294 CSV \uc18c\uc2a4<br \/>\n{<br \/>\n\"\ud30c\uc77c\": \"\uc744 \ud1b5\ud574 \uc81c\uacf5\ub418\ub294 \ud30c\uc77c \ub9c1\ud06c\"<br \/>\n}<br \/>\n\/\/CSV \uc18c\uc2a4<br \/>\n{<br \/>\n\"\uad6c\ubd84 \uae30\ud638\": \"\"<br \/>\n}<\/code><\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h3>\ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc \uc11c\ube44\uc2a4 \ubc30\ud3ec\ud558\uae30<\/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>\uc704\uc758 \uc11c\ube44\uc2a4 \ucc38\uc870 \ud30c\uc77c \ucf58\ud150\uce20(\ub610\ub294 \uac04\uacb0\ud558\uac8c \ud558\uae30 \uc704\ud55c \uc2a4\ub2c8\ud3ab)\ub294 \ub2e4\uc74c\uc5d0\uc11c \ucc3e\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. <a href=\"#implementation\">\uc544\ub798 \uad6c\ud604 \uc139\uc158\uc744 \ucc38\uc870\ud558\uc2ed\uc2dc\uc624.<\/a>.<\/p>\n<p>\uc774\ub7ec\ud55c \ub3c4\uad6c\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc694\uad6c\uc0ac\ud56d\uc5d0 \ub9de\ub294 \ub2e4\uc591\ud55c \ub300\uc2dc\ubcf4\ub4dc\ub97c \ub9cc\ub4e4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc138 \uac00\uc9c0 \uc720\ud615\uc758 \ub300\uc2dc\ubcf4\ub4dc \uc608\uc2dc\ub97c \ud1b5\ud574 \uc5b4\ub5a4 \uac83\uc774 \uac00\ub2a5\ud55c\uc9c0 \uc544\uc774\ub514\uc5b4\ub97c \uc5bb\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<h2>\ub300\uc2dc\ubcf4\ub4dc \uc608\uc2dc: \uac1c\uc694<\/h2>\n<table>\n<tbody>\n<tr>\n<td><strong>#<\/strong><\/td>\n<td><strong>\ub300\uc2dc\ubcf4\ub4dc<\/strong><\/td>\n<td><strong>\uce21\uc815<\/strong><\/td>\n<td><strong>\uba54\ud2b8\ub9ad<\/strong><\/td>\n<\/tr>\n<tr>\n<td>1<\/td>\n<td>\uae30\ub2a5 \ud68c\uadc0 \ud14c\uc2a4\ud2b8 \uc8fc\uae30 \ub300\uc2dc\ubcf4\ub4dc<\/td>\n<td>\ube4c\ub4dc \uc218\uc900\uacfc \ucef4\ud3ec\ub10c\ud2b8 \uc218\uc900 \ubaa8\ub450\uc5d0\uc11c \uae30\ub2a5 \ud68c\uadc0 \ud14c\uc2a4\ud2b8 \uc8fc\uae30 \uc0ac\uc774\uc758 \ucd94\uc138<\/td>\n<td>\ucd1d \ud14c\uc2a4\ud2b8, \ud1b5\uacfc, \uc2e4\ud328, \uc911\ub2e8, \ucd1d \uc2dc\uac04, \uc0c8\ub85c \uc2e4\ud589 \uc2dc\uac04 \ub4f1\uc785\ub2c8\ub2e4.<\/td>\n<\/tr>\n<tr>\n<td>2<\/td>\n<td>\uc815\uc801 \uac00\uc0c1 \uba38\uc2e0 \ubc0f \ub3d9\uc801 \uac00\uc0c1 \uba38\uc2e0\uc744 \ud3ec\ud568\ud55c \uc778\ud504\ub77c \uac00\uc0c1 \uba38\uc2e0 \uc0ac\uc6a9 \ub300\uc2dc\ubcf4\ub4dc<\/td>\n<td>\ub9ac\uc18c\uc2a4 \ud65c\uc6a9 \ubc0f \uae30\ub85d<\/td>\n<td>\ud65c\uc131 \uac1c\uc218, \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uac1c\uc218, \uc77c, \uc8fc, \uc6d4\ubcc4 \uacc4\uc0b0 \uc2dc\uac04\/\ucd5c\ub300\/\uc791\uc131\ub41c \uac1c\uc218<\/td>\n<\/tr>\n<tr>\n<td>3<\/td>\n<td>\uc778\ud504\ub77c \uac00\uc0c1 \uba38\uc2e0 \uc0c1\ud0dc \ub300\uc2dc\ubcf4\ub4dc, \uc815\uc801 \uc11c\ubc84, \uc820\ud0a8\uc2a4 \uc2ac\ub808\uc774\ube0c \uac00\uc0c1 \uba38\uc2e0<\/td>\n<td>VM \uc0c1\ud0dc \ubaa8\ub2c8\ud130\ub9c1, \uacbd\uace0 \ubc0f VM\uc758 \uc774\ub825 \ucd94\uc801<\/td>\n<td>ssh_fail, \ud480_os \ub300 \uc2e4\uc81c_os, CPU-\uba54\ubaa8\ub9ac-\ub514\uc2a4\ud06c-\uc2a4\uc651 \uc0ac\uc6a9\ub7c9, \ud30c\uc77c \uc124\uba85\uc790, \ubc29\ud654\ubcbd \uaddc\uce59, \ud480_\ub9e5\uc8fc\uc18c \ub300 \uc2e4\uc81c_\ub9e5\uc8fc\uc18c, \ubd80\ud305\uc77c, \ucd1d \ubc0f \uc81c\ud488 \ud504\ub85c\uc138\uc2a4, \uc124\uce58\ub41c \uc571 \ubc84\uc804 \ubc0f \uc11c\ube44\uc2a4 \ub4f1\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h2>\ub300\uc2dc\ubcf4\ub4dc #1: \uae30\ub2a5 \ud68c\uadc0 \ud14c\uc2a4\ud2b8 \uc8fc\uae30 \ub300\uc2dc\ubcf4\ub4dc<\/h2>\n<p><strong>\ubb38\uc81c<\/strong>: \uc774 \ub300\uc2dc\ubcf4\ub4dc\ub97c \uc9c1\uc811 \ub9cc\ub4e4\uae30 \uc804\uc5d0\ub294 \ucd1d \uc18c\uc694 \uc2dc\uac04, \ud569\uaca9\ub960, \uc0c8\ub85c \uc2e4\ud589 \ub300 \uc7ac\uc2e4\ud589(\uc608: \uc778\ud504\ub77c \ubb38\uc81c\ub85c \uc778\ud55c), \uc77c\uad00\ub418\uc9c0 \uc54a\uc740 \uc911\ub2e8 \ubc0f \uc2e4\ud328 \ud69f\uc218\uc640 \uac19\uc740 \uba54\ud2b8\ub9ad\uc774 \ud3ec\ud568\ub41c \ud68c\uadc0 \ud14c\uc2a4\ud2b8 \uc8fc\uae30\uc5d0 \ub300\ud55c \ucd94\uc138 \uadf8\ub798\ud504\uac00 \uc5c6\uc5c8\uc73c\uba70, \ubcc4\ub3c4\uc758 \uad6c\uc131 \uc694\uc18c \ub610\ub294 \ubaa8\ub4c8 \uc218\uc900 \ucd94\uc138\ub3c4 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>\uc194\ub8e8\uc158<\/strong>: \uacc4\ud68d\uc740 \uc774\ubbf8 Couchbase \ubc84\ud0b7\uc5d0 \uc800\uc7a5\ub418\uc5b4 \uc788\ub294 \ud14c\uc2a4\ud2b8 \ub370\uc774\ud130\ub97c \ubd84\uc11d\ud558\ub294 \uc2e4\ud589 \ubd84\uc11d\uae30 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ub9cc\ub4dc\ub294 \uac83\uc774\uc5c8\uc2b5\ub2c8\ub2e4. \uadf8 \ud6c4, \ub9c8\uc9c0\ub9c9\uc5d0 \ub300\ud55c \uc2dc\uacc4\uc5f4 \ub370\uc774\ud130\ub97c \uac00\uc838\uc635\ub2c8\ub2e4. <em>n<\/em> \uac01 \ube4c\ub4dc\uc5d0 \ub300\ud55c \ube4c\ub4dc \uc218 \ubc0f \ub300\uc0c1 \uba54\ud2b8\ub9ad\uc744 \ud655\uc778\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>\ub300\uc2dc\ubcf4\ub4dc \uc2a4\ub0c5\uc0f7:<\/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>\ub300\uc2dc\ubcf4\ub4dc #2: \uc778\ud504\ub77c \ub9ac\uc18c\uc2a4\/VM \uc0ac\uc6a9\ub7c9 \ub300\uc2dc\ubcf4\ub4dc<\/h2>\n<p><strong>\ubb38\uc81c\uc785\ub2c8\ub2e4:<\/strong> \uc774 \ub300\uc2dc\ubcf4\ub4dc\ub97c \uad6c\ucd95\ud558\uae30 \uc804\uc5d0\ub294 \ub9ce\uc740 \uc218\uc758 \uc815\uc801 \ubc0f \ub3d9\uc801 \uac00\uc0c1 \uba38\uc2e0\uc744 \ubcf4\uc720\ud558\uace0 \uc788\uc5c8\uc9c0\ub9cc \ud558\ub4dc\uc6e8\uc5b4 \ub9ac\uc18c\uc2a4\uac00 \uc5b4\ub5bb\uac8c \ud65c\uc6a9\ub418\ub294\uc9c0 \ucd94\uc801\ud560 \uc218 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4. \ub2f9\uc2dc \uc0ac\uc6a9\ub41c \ud65c\uc131 \uac00\uc0c1 \uba38\uc2e0, \uc0ac\uc6a9 \uac00\ub2a5\ud55c \uac1c\uc218, \uba38\uc2e0 \uc0ac\uc6a9 \uc2dc\uac04, \uc77c\ubcc4, \uc8fc\ubcc4 \ub610\ub294 \uc6d4\ubcc4 \ucef4\ud4e8\ud305 \uc2dc\uac04 \ub4f1\uc758 \uba54\ud2b8\ub9ad\uc5d0 \ub300\ud55c \uc778\uc0ac\uc774\ud2b8\uac00 \uc5c6\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>\uc194\ub8e8\uc158:<\/strong> \uc800\ud76c \uacc4\ud68d\uc740 \uba3c\uc800 \ub3d9\uc801 IP \ud560\ub2f9 \ubc0f \ud574\uc81c, \uc815\ud655\ud55c \uc0dd\uc131 \uc2dc\uac04, \ud574\uc81c \uc2dc\uac04, \ud480\uacfc \uac19\uc740 \uadf8\ub8f9\ud654 \ub4f1 \ubaa8\ub4e0 VM\uc5d0 \ub300\ud55c \ub370\uc774\ud130\ub97c \uc218\uc9d1\ud558\ub294 \uac83\uc774\uc5c8\uc2b5\ub2c8\ub2e4. \uc774 \ub370\uc774\ud130\uc758 \ub300\ubd80\ubd84\uc740 \uc774\ubbf8 <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/products\/server\/?ref=blog\" target=\"_blank\" rel=\"noopener\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84<\/a> (\uac01 \uc11c\ube44\uc2a4 \uad00\ub9ac\uc790\uac00 \uad00\ub9ac). \uc720\uc5f0\uc131 \uc0ac\uc6a9 <a href=\"https:\/\/query-tutorial.couchbase.com\/tutorial\/?ref=blog\/#1\" target=\"_blank\" rel=\"noopener\">SQL++ \ucffc\ub9ac \uc5b8\uc5b4<\/a> (\uc77c\uba85 N1QL)\uc744 \uc0ac\uc6a9\ud558\uc5ec \uc774 \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\uc5d0 \ud45c\uc2dc\ud558\ub824\ub294 \uadf8\ub798\ud504\uc5d0 \uc801\ud569\ud55c \ud615\uc2dd\uc73c\ub85c \ud574\ub2f9 \ub370\uc774\ud130\ub97c \ucd94\ucd9c\ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p><strong>\ub300\uc2dc\ubcf4\ub4dc \uc2a4\ub0c5\uc0f7<\/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>\ub300\uc2dc\ubcf4\ub4dc #3: \uc778\ud504\ub77c VM \uc0c1\ud0dc \ub300\uc2dc\ubcf4\ub4dc<\/h2>\n<p><strong>\ubb38\uc81c\uc785\ub2c8\ub2e4:<\/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>\uc194\ub8e8\uc158:<\/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>\ub300\uc2dc\ubcf4\ub4dc \uc2a4\ub0c5\uc0f7:<\/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\">\uad6c\ud604<\/h2>\n<p>\uc9c0\uae08\uae4c\uc9c0 \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\uc758 \ub192\uc740 \uc218\uc900\uc758 \uc544\ud0a4\ud14d\ucc98, \ud544\uc694\ud55c \uc11c\ube44\uc2a4, \ud544\uc694\ud55c \ub300\uc2dc\ubcf4\ub4dc\uc758 \uc885\ub958, \uadf8\ub9ac\uace0 \uc774\ub7ec\ud55c \uc11c\ube44\uc2a4\ub97c \ubc30\ud3ec\ud558\ub294 \ubc29\ubc95\uc5d0 \ub300\ud574 \uc0b4\ud3b4\ubcf4\uc558\uc2b5\ub2c8\ub2e4. \uc774\uc81c \uba87 \uac00\uc9c0 \uad6c\ud604 \uc138\ubd80 \uc0ac\ud56d\uc744 \uc0b4\ud3b4\ubcfc \ucc28\ub840\uc785\ub2c8\ub2e4.<\/p>\n<p>\uccab \ubc88\uc9f8 \ub2e8\uacc4\ub294 \uba54\ud2b8\ub9ad\uc758 \uc218\uc9d1 \ubc0f \uc800\uc7a5\uacfc \ub300\uc2dc\ubcf4\ub4dc\uc758 \ub370\uc774\ud130 \uc2dc\uac01\ud654\uc785\ub2c8\ub2e4. \ub300\ubd80\ubd84\uc758 \ub370\uc774\ud130 \uc800\uc7a5 \ubc0f \ud45c\uc2dc \ub2e8\uacc4\ub294 \ubaa8\ub4e0 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0\uc11c \uc720\uc0ac\ud558\uc9c0\ub9cc, \uba54\ud2b8\ub9ad \ub370\uc774\ud130 \uc218\uc9d1\uc740 \ud0c0\uae43\uc73c\ub85c \uc120\ud0dd\ud55c \uba54\ud2b8\ub9ad\uc5d0 \ub530\ub77c \ub2e4\ub985\ub2c8\ub2e4.<\/p>\n<h3>\ub300\uc2dc\ubcf4\ub4dc\uc5d0 \uc0ac\uc6a9\ud560 \uc0c1\ud0dc \ub370\uc774\ud130\ub97c \uc5bb\ub294 \ubc29\ubc95<\/h3>\n<p>\uc778\ud504\ub77c \ubaa8\ub2c8\ud130\ub9c1 \uc0ac\uc6a9 \uc0ac\ub840\uc758 \uacbd\uc6b0, \uc548\uc815\uc801\uc778 \uc778\ud504\ub77c\ub97c \ub9cc\ub4e4\uae30 \uc704\ud574 \uc218\ubc31 \uac1c\uc758 VM\uc5d0\uc11c \ub2e4\uc591\ud55c \uc0c1\ud0dc \uba54\ud2b8\ub9ad\uc744 \uc218\uc9d1\ud574\uc57c \ud569\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ub2e8\uacc4\uc5d0\uc11c\ub294 VM\uc5d0 \ub300\ud55c SSH \uc5f0\uacb0\uc744 \ubcd1\ub82c\ub85c \uc218\ud589\ud558\uace0(\uba40\ud2f0\ud504\ub85c\uc138\uc2f1 \ud480) \ud544\uc694\ud55c \ub370\uc774\ud130\ub97c \uc218\uc9d1\ud558\ub294 Python \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \uc800\ud76c\uc758 \uacbd\uc6b0 \uc774 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \uc8fc\uae30\uc801\uc73c\ub85c \uc2e4\ud589\ud558\uc5ec \uc0c1\ud0dc \ub370\uc774\ud130(CSV)\ub97c \uc218\uc9d1\ud55c \ub2e4\uc74c \uc774\ub97c Couchbase \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \uc800\uc7a5\ud558\ub294 Jenkins \uc791\uc5c5\ub3c4 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>Prometheus\uc5d0\uc11c \uc81c\uacf5\ud558\ub294 \uc989\uc2dc \uc0ac\uc6a9 \uac00\ub2a5\ud55c \ub178\ub4dc \ub0b4\ubcf4\ub0b4\uae30 \ub300\uc2e0 \uc774 \uc0ac\uc6a9\uc790 \uc815\uc758 \uc2a4\ud06c\ub9bd\ud2b8\ub97c \ub9cc\ub4e0 \uc774\uc720\ub294 \uc77c\ubd80 \ud544\uc218 \uba54\ud2b8\ub9ad\uc774 \uc9c0\uc6d0\ub418\uc9c0 \uc54a\uc558\uae30 \ub54c\ubb38\uc785\ub2c8\ub2e4. \ub610\ud55c \uc774 \uc194\ub8e8\uc158\uc740 1000\ub300 \uc774\uc0c1\uc758 \uc11c\ubc84\uc5d0 \uc0c8 \uc18c\ud504\ud2b8\uc6e8\uc5b4\ub97c \ubc30\ud3ec\ud558\uace0 \uc720\uc9c0 \uad00\ub9ac\ud558\ub294 \uac83\ubcf4\ub2e4 \ub354 \uac04\ub2e8\ud588\uc2b5\ub2c8\ub2e4. \uc544\ub798 \ucf54\ub4dc \uc2a4\ub2c8\ud3ab\uc740 VM \uc218\uc900\uc5d0\uc11c \uc218\ud589\ub418\ub294 \uba87 \uac00\uc9c0 \uac80\uc0ac\ub97c \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<\/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>\uc544\ub798 \ucf54\ub4dc \uc2a4\ub2c8\ud3ab\uc740 \ud0a4-\uac12 \uc5f0\uc0b0, \ubb38\uc11c \uac00\uc838\uc624\uae30 \ub610\ub294 \ub370\uc774\ud130\ubca0\uc774\uc2a4\uc5d0 \ubb38\uc11c \uc800\uc7a5\uc744 \ud1b5\ud574 Python SDK 3.x\ub97c \uc0ac\uc6a9\ud558\uc5ec Couchbase\uc5d0 \uc5f0\uacb0\ud558\ub294 \ubc29\ubc95\uc744 \ubcf4\uc5ec\uc90d\ub2c8\ub2e4.<\/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>\ub300\uc2dc\ubcf4\ub4dc \ud504\ub85d\uc2dc \uc11c\ube44\uc2a4 \uad6c\ud604\ud558\uae30<\/h3>\n<p>\ud14c\uc2a4\ud2b8 \ud1b5\ud569 \uac00\uc2dc\uc131 \uc0ac\uc6a9 \uc0ac\ub840\uc758 \uacbd\uc6b0, \ub370\uc774\ud130\ub294 Jenkins \uc544\ud2f0\ud329\ud2b8 URL\uacfc Couchbase Server\uc5d0 \uc788\uc2b5\ub2c8\ub2e4. \uc774\ub7ec\ud55c \uc5ec\ub7ec \ub370\uc774\ud130 \uc18c\uc2a4(CSV, DB)\ub97c \uc11c\ub85c \uc5f0\uacb0\ud558\uae30 \uc704\ud574, \uc800\ud76c\ub294 Grafana\uc758 \uc694\uccad\uc744 \uc218\ub77d\ud558\uace0 Grafana\uac00 \uc774\ud574\ud558\ub294 \ub370\uc774\ud130 \ud615\uc2dd\uc744 \ubc18\ud658\ud558\ub294 \ud504\ub85d\uc2dc API \uc11c\ube44\uc2a4\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc544\ub798 \ucf54\ub4dc \uc2a4\ub2c8\ud3ab\uc740 \uad6c\ud604 \ubc0f \uc11c\ube44\uc2a4 \uc900\ube44\uc5d0 \ub300\ud55c \uc138\ubd80 \uc815\ubcf4\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4.<\/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>Grafana\uc5d0\uc11c \ud45c \ud615\uc2dd\uc758 \ub370\uc774\ud130\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95<\/h3>\n<p>Grafana\ub294 \uc2dc\uacc4\uc5f4 \ub370\uc774\ud130\ub97c \ubcf4\uae30\uc5d0 \ud6cc\ub96d\ud55c \ub3c4\uad6c\uc785\ub2c8\ub2e4. \ud558\uc9c0\ub9cc \uc2dc\uacc4\uc5f4\uc774 \uc544\ub2cc \ub370\uc774\ud130\ub97c \ub3d9\uc77c\ud55c \uc778\ud130\ud398\uc774\uc2a4\uc5d0 \ud45c\uc2dc\ud558\uace0 \uc2f6\uc744 \ub54c\uac00 \uc788\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc6b0\ub9ac\ub294 \uc774 \ubaa9\ud45c\ub97c \ub2ec\uc131\ud558\uae30 \uc704\ud574 <a href=\"https:\/\/grafana.com\/grafana\/plugins\/ae3e-plotly-panel\/?ref=hello-from-couchbase\" target=\"_blank\" rel=\"noopener\">\ud50c\ub86f\ub9ac \ud50c\ub7ec\uadf8\uc778<\/a> \ub77c\ub294 \uc790\ubc14\uc2a4\ud06c\ub9bd\ud2b8 \uadf8\ub798\ud504 \ub77c\uc774\ube0c\ub7ec\ub9ac\ub97c \uc0ac\uc6a9\ud588\uc2b5\ub2c8\ub2e4. \uc800\ud76c\uc758 \uc8fc\uc694 \uc0ac\uc6a9 \uc0ac\ub840\ub294 \uc8fc\uac04 \ud68c\uadc0 \ud14c\uc2a4\ud2b8 \uc2e4\ud589\uc5d0 \ub300\ud55c \ub2e4\uc591\ud55c \uc911\uc694 \uc9c0\ud45c\uc758 \ucd94\uc138\ub97c \ubcf4\uc5ec\uc8fc\ub294 \uac83\uc774\uc5c8\uc2b5\ub2c8\ub2e4. \uc800\ud76c\uac00 \ucd94\uc801\ud558\uace0\uc790 \ud588\ub358 \uac00\uc7a5 \uc911\uc694\ud55c \uc9c0\ud45c\ub294 \ud569\uaca9\ub960, \ud14c\uc2a4\ud2b8 \ud69f\uc218, \uc911\ub2e8\ub41c \uc791\uc5c5, \ucd1d \uc18c\uc694 \uc2dc\uac04\uc774\uc5c8\uc2b5\ub2c8\ub2e4. Grafana 8 \ucd9c\uc2dc \uc774\ud6c4 \ub9c9\ub300 \uadf8\ub798\ud504\uc5d0 \ub300\ud55c \uc9c0\uc6d0\uc774 \uc81c\ud55c\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc774 \uae00\uc744 \uc4f0\ub294 \uc2dc\uc810\uc5d0\uc11c \ub9c9\ub300 \uadf8\ub798\ud504 \uae30\ub2a5\uc740 \uc544\uc9c1 \ubca0\ud0c0 \ubc84\uc804\uc774\uba70 \uc2a4\ud0dc\ud0b9\uacfc \uac19\uc774 \ud544\uc694\ud55c \ubaa8\ub4e0 \uae30\ub2a5\uc744 \uc81c\uacf5\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc800\ud76c\uc758 \ubaa9\ud45c\ub294 \uc77c\ubc18 CSV\/JSON \ud30c\uc77c \ub610\ub294 Couchbase SQL++ \ucffc\ub9ac\ub97c \uc9c0\uc6d0\ud558\uace0 Grafana\uc5d0\uc11c \ub370\uc774\ud130\ub97c \ud14c\uc774\ube14\ub85c \ubcf4\ub294 \uac83\uc774\uc5c8\uc2b5\ub2c8\ub2e4. \uc774\uc2dd\uc131\uc744 \uadf9\ub300\ud654\ud558\uae30 \uc704\ud574 \ub370\uc774\ud130 \uc18c\uc2a4\uc640 Grafana \ud15c\ud50c\ub9bf \ub808\uc774\uc544\uc6c3\uc744 \ud568\uaed8 \uc815\uc758\ud558\ub294 \ub2e8\uc77c \ud30c\uc77c\uc744 \ub9cc\ub4e4\uace0 \uc2f6\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\ud45c \ud615\uc2dd\uc758 \ub370\uc774\ud130\ub97c \ud45c\uc2dc\ud558\ub294 \ub370 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ub450 \uac00\uc9c0 \uc635\uc158\uc740 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4.<\/p>\n<ol>\n<li>Grafana\uc6a9 UI \ud50c\ub7ec\uadf8\uc778 \uc791\uc131<\/li>\n<li>\ub97c \uc0ac\uc6a9\ud558\uc5ec JSON \ud504\ub85d\uc2dc\ub97c \uc81c\uacf5\ud558\uc138\uc694. <a href=\"https:\/\/grafana.com\/grafana\/plugins\/grafana-simple-json-datasource\/?ref=hello-from-couchbase\" target=\"_blank\" rel=\"noopener\">JSON \ub370\uc774\ud130 \uc18c\uc2a4 \ud50c\ub7ec\uadf8\uc778<\/a><\/li>\n<\/ol>\n<p>\uc800\ud76c\ub294 Grafana \ud50c\ub7ec\uadf8\uc778 \ub3c4\uad6c\ub97c \uc775\ud788\uace0 \uad6c\uc131\uc744 \uc704\ud55c \ubcc4\ub3c4\uc758 UI \ud50c\ub7ec\uadf8\uc778\uc744 \ub9cc\ub4dc\ub294 \uac83\ubcf4\ub2e4 \ub354 \uac04\ub2e8\ud574 \ubcf4\uc600\uae30 \ub54c\ubb38\uc5d0 \uc635\uc158 2\ub97c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc120\ud0dd\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774 \ud504\ub85c\uc81d\ud2b8\ub97c \uc644\ub8cc\ud55c \uc774\ud6c4 <a href=\"https:\/\/grafana.com\/grafana\/plugins\/marcusolsson-csv-datasource\/?ref=hello-from-couchbase\" target=\"_blank\" rel=\"noopener\">\uc0c8\ub85c\uc6b4 \ud50c\ub7ec\uadf8\uc778<\/a> \uac00 \ucd9c\uc2dc\ub418\uc5b4 Grafana\uc5d0 CSV \ub370\uc774\ud130\ub97c \uc9c1\uc811 \ucd94\uac00\ud560 \uc218 \uc788\uac8c \ub418\uc5c8\uc2b5\ub2c8\ub2e4. CSV\uc5d0\uc11c \ud45c \ud615\uc2dd\uc758 \ub370\uc774\ud130\ub97c \ubcf4\ub294 \uac83\uc774 \uc720\uc77c\ud55c \uc694\uad6c \uc0ac\ud56d\uc774\ub77c\uba74 \uc774 \ud50c\ub7ec\uadf8\uc778\uc774 \uc88b\uc740 \uc194\ub8e8\uc158\uc785\ub2c8\ub2e4.<\/p>\n<h3>\ud504\ub85c\uba54\ud14c\uc6b0\uc2a4 \uc11c\ube44\uc2a4 \uad6c\ud604\ud558\uae30<\/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>Prometheus \ub0b4\ubcf4\ub0b4\uae30\ub97c \ud1b5\ud574 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \uc9c0\ud45c\ub97c \uac00\uc838\uc624\ub294 \ubc29\ubc95<\/h3>\n<p>\ub9ce\uc740 \ud074\ub77c\uc6b0\ub4dc \ub124\uc774\ud2f0\ube0c \uc11c\ube44\uc2a4\uac00 Prometheus\uc640 \uc9c1\uc811 \ud1b5\ud569\ub418\uc5b4 \ubaa8\ub4e0 \uc11c\ube44\uc2a4\uc5d0 \ub300\ud55c \uc911\uc559 \uc9d1\uc911\uc2dd \uba54\ud2b8\ub9ad \uc218\uc9d1\uc774 \uac00\ub2a5\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc800\ud76c\ub294 \uc774 \uae30\uc220\uc744 \ud65c\uc6a9\ud558\uc5ec \uae30\uc874 \uc778\ud504\ub77c\ub97c \ubaa8\ub2c8\ud130\ub9c1\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc744 \ucc3e\uace0 \uc2f6\uc5c8\uc2b5\ub2c8\ub2e4. Prometheus \uba54\ud2b8\ub9ad \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \uc9c1\uc811 \ub178\ucd9c\ud558\uc9c0 \uc54a\ub294 \uc11c\ube44\uc2a4\uac00 \uc788\ub294 \uacbd\uc6b0, \uc774 \ubb38\uc81c\ub97c \ud574\uacb0\ud558\ub294 \ubc29\ubc95\uc740 \ub0b4\ubcf4\ub0b4\uae30\ub97c \uc0ac\uc6a9\ud558\ub294 \uac83\uc785\ub2c8\ub2e4. \uc2e4\uc81c\ub85c \ud074\ub7ec\uc2a4\ud130\uc758 \ubaa8\ub4e0 \uc911\uc694\ud55c \uba54\ud2b8\ub9ad\uc744 \ub178\ucd9c\ud558\ub294 Couchbase \uc775\uc2a4\ud3ec\ud130\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. (\ucc38\uace0: In <a href=\"https:\/\/www.couchbase.com\/blog\/ko\/couchbase-server-7-0-release\/?ref=blog\" target=\"_blank\" rel=\"noopener\">\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \uc11c\ubc84 7.0<\/a>Prometheus \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \uc9c1\uc811 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc73c\uba70, \ub0b4\ubd80\uc801\uc73c\ub85c Couchbase 7\uc740 \uc11c\ubc84 \ud1b5\uacc4 \uc218\uc9d1 \ubc0f \uad00\ub9ac\ub97c \uc704\ud574 Prometheus\ub97c \uc0ac\uc6a9\ud558\uc5ec \ub2e4\uc74c\uacfc \uac19\uc740 \uc11c\ube44\uc2a4\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. <a href=\"https:\/\/docs.couchbase.com\/server\/current\/manage\/manage-ui\/manage-ui.html?ref=blog\" target=\"_blank\" rel=\"noopener\">\uc6f9 UI<\/a>).<\/p>\n<p>\ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\ub97c \ub9cc\ub4dc\ub294 \ub3d9\uc548 JSON \ud30c\uc77c, CSV \ud30c\uc77c, Couchbase \ubc84\ud0b7\uc5d0 \ub2e4\uc591\ud55c \ub370\uc774\ud130\uac00 \uc800\uc7a5\ub418\uc5b4 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \uc6b0\ub9ac\ub294 \uc774 \ubaa8\ub4e0 \ub370\uc774\ud130\ub97c \ud45c \ud615\uc2dd\uacfc Prometheus\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc2dc\uacc4\uc5f4 \ub370\uc774\ud130\ub85c Grafana\uc5d0 \ud45c\uc2dc\ud560 \uc218 \uc788\ub294 \ubc29\ubc95\uc744 \uc6d0\ud588\uc2b5\ub2c8\ub2e4.<\/p>\n<p>Prometheus\ub294 \uac04\ub2e8\ud55c \uc904 \uae30\ubc18 \ud14d\uc2a4\ud2b8 \ucd9c\ub825\uc744 \uae30\ub300\ud569\ub2c8\ub2e4. \ub2e4\uc74c\uc740 \uc11c\ubc84 \ud480 \ubaa8\ub2c8\ud130\ub9c1\uc758 \uc608\uc2dc\uc785\ub2c8\ub2e4:<\/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>CSV \ud30c\uc77c\uacfc Couchbase\uc5d0\uc11c \uc9c1\uc811 \ub370\uc774\ud130 \uc18c\uc2a4\ub97c \uad6c\ud604\ud558\ub294 \ubc29\ubc95\uc744 \uc790\uc138\ud788 \uc0b4\ud3b4\ubcf4\uaca0\uc2b5\ub2c8\ub2e4.<\/p>\n<h4>\ub370\uc774\ud130 \uc18c\uc2a4\ub85c\uc11c\uc758 CSV \ud30c\uc77c<\/h4>\n<p>Prometheus\ub294 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \ud3f4\ub9c1\ud560 \ub54c\ub9c8\ub2e4 CSV\ub97c \uac00\uc838\uc624\uace0, \uac01 \uc5f4\uc5d0 \ub300\ud574 \uba54\ud2b8\ub9ad\uc744 \ub178\ucd9c\ud558\uba70, \uad6c\uc131\uc5d0 \ub808\uc774\ube14\uc774 \uc81c\uacf5\ub41c \uacbd\uc6b0 \uc5ec\ub7ec \ud589\uc5d0 \ub300\ud55c \ub808\uc774\ube14\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<p>\uc704\uc758 \uc608\uc81c\uc5d0\uc11c CSV\ub294 \ub2e4\uc74c\uacfc \uac19\uc2b5\ub2c8\ub2e4:<\/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>\ub370\uc774\ud130 \uc18c\uc2a4\ub85c\uc11c\uc758 \uce74\uc6b0\uce58\ubca0\uc774\uc2a4<\/h4>\n<p>Prometheus\ub294 \uc5d4\ub4dc\ud3ec\uc778\ud2b8\ub97c \ud3f4\ub9c1\ud560 \ub54c\ub9c8\ub2e4 \uad6c\uc131\uc5d0 \uc815\uc758\ub41c SQL++ \ucffc\ub9ac\ub97c \uc2e4\ud589\ud558\uace0, \uac01 \ucffc\ub9ac\uc5d0 \ub300\ud574 \uba54\ud2b8\ub9ad\uc744 \ub178\ucd9c\ud558\uba70, \uad6c\uc131\uc5d0 \ub808\uc774\ube14\uc774 \uc81c\uacf5\ub41c \uacbd\uc6b0 \uc5ec\ub7ec \ud589\uc5d0 \ub300\ud55c \ub808\uc774\ube14\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4.<\/p>\n<p>\ub2e4\uc74c\uc740 \uc704 \uba54\ud2b8\ub9ad\uc744 \uc0dd\uc131\ud558\ub294 SQL++ \uc751\ub2f5 \uc608\uc2dc\uc785\ub2c8\ub2e4:<\/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>\uc54c\ub9bc \uad00\ub9ac\uc790 \uc11c\ube44\uc2a4 \uad6c\ud604\ud558\uae30<\/h3>\n<p>Prometheus\ub294 \uc2dc\uac04 \uacbd\uacfc\uc5d0 \ub530\ub77c \ud2b9\uc815 \uba54\ud2b8\ub9ad\uc744 \ucd94\uc801\ud558\ub294 \uc54c\ub9bc \uae30\ub2a5\ub3c4 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \ud574\ub2f9 \uc9c0\ud45c\uac00 \uacb0\uacfc\ub97c \ubc18\ud658\ud558\uae30 \uc2dc\uc791\ud558\uba74 \uc54c\ub9bc\uc774 \ud2b8\ub9ac\uac70\ub429\ub2c8\ub2e4.<\/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>\uc54c\ub9bc \uad00\ub9ac\uc790\ub97c \uc0ac\uc6a9\ud558\uba74 \ud55c \ub2e8\uacc4 \ub354 \ub098\uc544\uac00 \ucee4\ubba4\ub2c8\ucf00\uc774\uc158 \uc11c\ube44\uc2a4\ub97c \uc5f0\uacb0\ud558\uc5ec \uc608\ub97c \ub4e4\uc5b4 \uc54c\ub9bc\uc774 \ubc1c\uc0dd\ud588\uc744 \ub54c \uc774\uba54\uc77c\uc774\ub098 Slack \ucc44\ub110\uc744 \ud1b5\ud574 Prometheus\uac00 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc54c\ub9bc\uc744 \ubcf4\ub0b4\ub3c4\ub85d \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc989, \ubb38\uc81c\uac00 \ubc1c\uc0dd\ud558\uba74 \uc6d0\ud558\ub294 \ubc29\ubc95\uc744 \ud1b5\ud574 \uc989\uc2dc \uc54c\ub9bc\uc744 \ubc1b\uc744 \uc218 \uc788\uc2b5\ub2c8\ub2e4. Couchbase\uc5d0\uc11c\ub294 \uc11c\ubc84\uc758 \ub514\uc2a4\ud06c \uc0ac\uc6a9\ub7c9\uc774 \ub9ce\uc744 \ub54c\uc640 SSH\ub97c \ud1b5\ud574 \uc11c\ubc84\uc5d0 \uc5f0\uacb0\ud560 \uc218 \uc5c6\uc744 \ub54c \uc54c\ub9bc\uc744 \ubc1b\ub3c4\ub85d \uacbd\uace0\ub97c \uc124\uc815\ud588\uc2b5\ub2c8\ub2e4. \uc544\ub798 \uc608\uc2dc\ub97c \ucc38\uc870\ud558\uc138\uc694:<\/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>\uacb0\ub860<\/h2>\n<p>\uacb0\ub860\uc801\uc73c\ub85c, \ub370\uc774\ud130 \uc2dc\uac01\ud654\uc758 \uac15\ub825\ud55c \uae30\ub2a5\uc744 \ud1b5\ud574 \uad6c\ud604 \ub610\ub294 \uc0ac\uc6a9 \uc0ac\ub840\uc5d0\uc11c \uac00\uc7a5 \uc911\uc694\ud55c \uba54\ud2b8\ub9ad\uc5d0 \uc9d1\uc911\ud558\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub418\ub294 \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\ub97c \ub9cc\ub4e0 \uacbd\ud5d8\uc744 \ud1b5\ud574 \ub9ce\uc740 \uac83\uc744 \ubc30\uc6b8 \uc218 \uc788\uae30\ub97c \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n<p>\uc800\ud76c\uc758 \uacbd\uc6b0 \uc774\ub7ec\ud55c \ub178\ub825\uc744 \ud1b5\ud574 \uc11c\ubc84 \uc778\ud504\ub77c\uc640 \ud14c\uc2a4\ud2b8 \uc548\uc815\uc131 \ubb38\uc81c\ub97c \ucc3e\uc744 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \ub300\uc2dc\ubcf4\ub4dc\ub97c \uad6c\ucd95\ud568\uc73c\ub85c\uc368 \ud14c\uc2a4\ud2b8 \uc2e4\ud328 \ud69f\uc218\uc640 \uc5ec\ub7ec \uc81c\ud488 \ub9b4\ub9ac\uc2a4\uc5d0 \uac78\ub9ac\ub294 \ucd1d \ud68c\uadc0 \uc2dc\uac04\ub3c4 \uc904\uc5c8\uc2b5\ub2c8\ub2e4.<\/p>\n<p>\uc774 \uc548\ub0b4\ub97c \ud1b5\ud574 \uc55e\uc73c\ub85c \ub354 \ub098\uc740 \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\ub97c \uad6c\ucd95\ud558\ub294 \ub370 \ub3c4\uc6c0\uc774 \ub418\uae30\ub97c \ubc14\ub78d\ub2c8\ub2e4.<\/p>\n<p><em>\ub610\ud55c, \ubaa9\ud45c \uc9c0\ud45c \uac1c\uc120\uc5d0 \ub300\ud55c \ud53c\ub4dc\ubc31\uc744 \uc81c\uacf5\ud574 \uc8fc\uc2e0 Raju\uc640 QE \ud300\uc5d0\uac8c\ub3c4 \ud2b9\ubcc4\ud55c \uac10\uc0ac\uc758 \ub9d0\uc500\uc744 \uc804\ud569\ub2c8\ub2e4.<\/em><\/p>\n<div class=\"wp-block-spacer\" style=\"height: 30px\" aria-hidden=\"true\"><\/div>\n<div style=\"text-align: center\"><strong>\uba4b\uc9c4 \ubb34\uc5b8\uac00\ub97c \ub9cc\ub4e4\uace0 \uc788\ub098\uc694? <br \/><a href=\"https:\/\/www.couchbase.com\/blog\/ko\/downloads\/?ref=blog\" target=\"_blank\" rel=\"noopener\">Couchbase\uc5d0\uc11c \uad6c\ucd95\ud574 \ubcf4\uc2dc\uaca0\uc2b5\ub2c8\uae4c?<\/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 v26.2 (Yoast SEO v26.2) - 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\/ko\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/\" \/>\n<meta property=\"og:locale\" content=\"ko_KR\" \/>\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\/ko\/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\ubd84\" \/>\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\":\"ko-KR\",\"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\":\"ko-KR\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@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\":\"ko-KR\"},{\"@type\":\"Organization\",\"@id\":\"https:\/\/www.couchbase.com\/blog\/#organization\",\"name\":\"The Couchbase Blog\",\"url\":\"https:\/\/www.couchbase.com\/blog\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"ko-KR\",\"@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\":\"ko-KR\",\"@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\/ko\/author\/jake-and-jagadesh\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Observability Dashboards: Prometheus, Grafana + Couchbase","description":"\uc774 \ube14\ub85c\uadf8\uc5d0\uc11c\ub294 Prometheus, Grafana \ubc0f Couchbase\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc790\uc2e0\ub9cc\uc758 \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\ub97c \uad6c\ucd95\ud558\uae30 \uc704\ud574 \ub530\ub77c\uc57c \ud558\ub294 \ud504\ub85c\uc138\uc2a4\ub97c \uc548\ub0b4\ud569\ub2c8\ub2e4.","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\/ko\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/","og_locale":"ko_KR","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\/ko\/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\ubd84"},"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":"ko-KR","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":"\uc774 \ube14\ub85c\uadf8\uc5d0\uc11c\ub294 Prometheus, Grafana \ubc0f Couchbase\ub97c \uc0ac\uc6a9\ud558\uc5ec \uc790\uc2e0\ub9cc\uc758 \ud1b5\ud569 \uac00\uc2dc\uc131 \ub300\uc2dc\ubcf4\ub4dc\ub97c \uad6c\ucd95\ud558\uae30 \uc704\ud574 \ub530\ub77c\uc57c \ud558\ub294 \ud504\ub85c\uc138\uc2a4\ub97c \uc548\ub0b4\ud569\ub2c8\ub2e4.","breadcrumb":{"@id":"https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/#breadcrumb"},"inLanguage":"ko-KR","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.couchbase.com\/blog\/how-to-build-observability-dashboards-prometheus-grafana-couchbase\/"]}]},{"@type":"ImageObject","inLanguage":"ko-KR","@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":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","description":"NoSQL \ub370\uc774\ud130\ubca0\uc774\uc2a4, Couchbase","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":"ko-KR"},{"@type":"Organization","@id":"https:\/\/www.couchbase.com\/blog\/#organization","name":"\uce74\uc6b0\uce58\ubca0\uc774\uc2a4 \ube14\ub85c\uadf8","url":"https:\/\/www.couchbase.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"ko-KR","@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":"\uc81c\uc774\ud06c &amp; \uc790\uac00\ub370\uc2dc \uacf5\uc720 \ubc14\uc774\ub77c\uc778","image":{"@type":"ImageObject","inLanguage":"ko-KR","@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\/ko\/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\/ko\/wp-json\/wp\/v2\/posts\/11527","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/users\/78989"}],"replies":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/comments?post=11527"}],"version-history":[{"count":0,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/posts\/11527\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media\/12083"}],"wp:attachment":[{"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/media?parent=11527"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/categories?post=11527"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/tags?post=11527"},{"taxonomy":"author","embeddable":true,"href":"https:\/\/www.couchbase.com\/blog\/ko\/wp-json\/wp\/v2\/ppma_author?post=11527"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}