From 2db17bd9bce5cbb694b943ce8dd2da1f036f6566 Mon Sep 17 00:00:00 2001 From: kimjb Date: Thu, 28 May 2026 01:49:06 +0900 Subject: [PATCH 1/4] =?UTF-8?q?Refactor:=20=ED=97=AC=EC=8A=A4=EC=B2=B4?= =?UTF-8?q?=ED=81=AC=20=EC=8B=9C=EA=B0=84=20=EC=97=B0=EC=9E=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/deploy.yml | 8 ++++---- docker-compose.prod.yml | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/.github/workflows/deploy.yml b/.github/workflows/deploy.yml index 351dfe2..77ebc91 100644 --- a/.github/workflows/deploy.yml +++ b/.github/workflows/deploy.yml @@ -108,17 +108,17 @@ jobs: # 6. app만 교체 (nginx/certbot은 그대로 유지 — 무중단 가까움) sudo docker compose -f "$COMPOSE" up -d --no-deps app - # 7. 헬스체크 (Docker healthcheck 상태 polling, 최대 180초) - # OTel Agent + JPA 16개 repo + Tomcat 등으로 부팅에 약 90초 소요됨 + # 7. 헬스체크 (Docker healthcheck 상태 polling, 최대 300초) + # OTel Agent + JPA repo + Tomcat 등으로 부팅에 약 90~120초 소요. 콜드/지연 대비 여유 확보. echo "Waiting for app to become healthy..." - for i in $(seq 1 36); do + for i in $(seq 1 60); do STATUS=$(sudo docker inspect --format='{{.State.Health.Status}}' catchtable-app 2>/dev/null || echo "starting") if [ "$STATUS" = "healthy" ]; then echo "✅ App is healthy" sudo docker image prune -f exit 0 fi - echo " ($i/36) status=$STATUS" + echo " ($i/60) status=$STATUS" sleep 5 done diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml index 7ab7361..18b08ce 100644 --- a/docker-compose.prod.yml +++ b/docker-compose.prod.yml @@ -24,7 +24,7 @@ services: interval: 30s timeout: 3s retries: 3 - start_period: 60s + start_period: 120s restart: unless-stopped networks: - catchtable-net From d0b7105dff7a595c613152600c9215e3d076cfa8 Mon Sep 17 00:00:00 2001 From: johe00123 Date: Thu, 28 May 2026 20:48:11 +0900 Subject: [PATCH 2/4] =?UTF-8?q?Fix:=20Redis/Kafka=20Micrometer=20=EB=A9=94?= =?UTF-8?q?=ED=8A=B8=EB=A6=AD=20=EB=85=B8=EC=B6=9C=20=EB=88=84=EB=9D=BD=20?= =?UTF-8?q?=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catchtable/global/config/KafkaConfig.java | 15 +++++++++++-- .../catchtable/global/config/RedisConfig.java | 21 +++++++++++++++++++ 2 files changed, 34 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/catchtable/global/config/RedisConfig.java diff --git a/src/main/java/com/catchtable/global/config/KafkaConfig.java b/src/main/java/com/catchtable/global/config/KafkaConfig.java index 5f75cb4..f651f31 100644 --- a/src/main/java/com/catchtable/global/config/KafkaConfig.java +++ b/src/main/java/com/catchtable/global/config/KafkaConfig.java @@ -1,5 +1,6 @@ package com.catchtable.global.config; +import io.micrometer.core.instrument.MeterRegistry; import org.apache.kafka.clients.consumer.ConsumerConfig; import org.apache.kafka.clients.producer.ProducerConfig; import org.apache.kafka.common.serialization.StringDeserializer; @@ -24,6 +25,12 @@ public class KafkaConfig { @Value("${spring.kafka.bootstrap-servers:localhost:9092}") private String bootstrapServers; + private final MeterRegistry meterRegistry; + + public KafkaConfig(MeterRegistry meterRegistry) { + this.meterRegistry = meterRegistry; + } + @Bean public KafkaTemplate kafkaTemplate() { return new KafkaTemplate<>(producerFactory()); @@ -35,7 +42,9 @@ public ProducerFactory producerFactory() { config.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers); config.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class); config.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, "org.springframework.kafka.support.serializer.JsonSerializer"); - return new DefaultKafkaProducerFactory<>(config); + DefaultKafkaProducerFactory factory = new DefaultKafkaProducerFactory<>(config); + factory.addListener(new MicrometerProducerListener<>(meterRegistry)); + return factory; } @Bean @@ -66,6 +75,8 @@ public ConsumerFactory consumerFactory() { config.put("spring.json.trusted.packages", "com.catchtable.notification.event,java.lang.String,java.lang.Object"); config.put("spring.json.use.type.headers", true); - return new DefaultKafkaConsumerFactory<>(config); + DefaultKafkaConsumerFactory factory = new DefaultKafkaConsumerFactory<>(config); + factory.addListener(new MicrometerConsumerListener<>(meterRegistry)); + return factory; } } diff --git a/src/main/java/com/catchtable/global/config/RedisConfig.java b/src/main/java/com/catchtable/global/config/RedisConfig.java new file mode 100644 index 0000000..8321852 --- /dev/null +++ b/src/main/java/com/catchtable/global/config/RedisConfig.java @@ -0,0 +1,21 @@ +package com.catchtable.global.config; + +import io.lettuce.core.metrics.MicrometerCommandLatencyRecorder; +import io.lettuce.core.metrics.MicrometerOptions; +import io.lettuce.core.resource.ClientResources; +import io.lettuce.core.resource.DefaultClientResources; +import io.micrometer.core.instrument.MeterRegistry; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; + +@Configuration +public class RedisConfig { + + @Bean(destroyMethod = "shutdown") + public ClientResources lettuceClientResources(MeterRegistry meterRegistry) { + MicrometerOptions options = MicrometerOptions.create(); + return DefaultClientResources.builder() + .commandLatencyRecorder(new MicrometerCommandLatencyRecorder(meterRegistry, options)) + .build(); + } +} From 25bf06850767dde640cbf2d5444d89460fd7ef6c Mon Sep 17 00:00:00 2001 From: johe00123 Date: Thu, 28 May 2026 20:48:55 +0900 Subject: [PATCH 3/4] =?UTF-8?q?Fix:=20=EA=B7=B8=EB=9D=BC=ED=8C=8C=EB=82=98?= =?UTF-8?q?=20datasource=20UID=20=EB=AA=85=EC=8B=9C=20=EB=B0=8F=20?= =?UTF-8?q?=EB=8C=80=EC=8B=9C=EB=B3=B4=EB=93=9C=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=B9=98=ED=99=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catcheat-backend-dashboard.json | 214 +++++++++--------- .../provisioning/datasources/datasources.yml | 2 + 2 files changed, 109 insertions(+), 107 deletions(-) diff --git a/grafana/provisioning/dashboards/catcheat-backend-dashboard.json b/grafana/provisioning/dashboards/catcheat-backend-dashboard.json index b2b6c90..c0c9214 100644 --- a/grafana/provisioning/dashboards/catcheat-backend-dashboard.json +++ b/grafana/provisioning/dashboards/catcheat-backend-dashboard.json @@ -61,7 +61,7 @@ } ] }, - "description": "CatchEat 백엔드 모니터링 - HTTP / JVM / DB / Redis / Kafka", + "description": "CatchEat 諛깆뿏??紐⑤땲?곕쭅 - HTTP / JVM / DB / Redis / Kafka", "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 1, @@ -73,12 +73,12 @@ "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, - "title": "요약", + "title": "?붿빟", "type": "row" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, @@ -104,11 +104,11 @@ "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "textMode": "auto" }, - "title": "현재 RPS", + "title": "?꾩옱 RPS", "type": "stat", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\"}[1m]))", "instant": true, "refId": "A" @@ -117,7 +117,7 @@ }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, @@ -144,11 +144,11 @@ "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "textMode": "auto" }, - "title": "5xx 에러율", + "title": "5xx ?먮윭??, "type": "stat", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\",status=~\"5..\"}[1m])) / sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\"}[1m])) * 100", "instant": true, "refId": "A" @@ -157,7 +157,7 @@ }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, @@ -184,11 +184,11 @@ "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "textMode": "auto" }, - "title": "p99 응답시간", + "title": "p99 ?묐떟?쒓컙", "type": "stat", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "histogram_quantile(0.99, sum(rate(http_server_requests_seconds_bucket{job=\"catchtable-app\"}[1m])) by (le))", "instant": true, "refId": "A" @@ -197,7 +197,7 @@ }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, @@ -222,11 +222,11 @@ "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "textMode": "auto" }, - "title": "업타임", + "title": "?낇???, "type": "stat", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "process_uptime_seconds{job=\"catchtable-app\"}", "instant": true, "refId": "A" @@ -238,12 +238,12 @@ "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 }, "id": 6, - "title": "HTTP API 현황", + "title": "HTTP API ?꾪솴", "type": "row" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -278,29 +278,29 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "초당 요청수 (상태코드별)", + "title": "珥덈떦 ?붿껌??(?곹깭肄붾뱶蹂?", "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\",status=~\"2..\"}[1m]))", "legendFormat": "2xx", "refId": "A" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\",status=~\"3..\"}[1m]))", "legendFormat": "3xx", "refId": "B" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\",status=~\"4..\"}[1m]))", "legendFormat": "4xx", "refId": "C" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\",status=~\"5..\"}[1m]))", "legendFormat": "5xx", "refId": "D" @@ -309,7 +309,7 @@ }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -350,26 +350,26 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "에러율 (%)", + "title": "?먮윭??(%)", "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\",status=~\"4..\"}[1m])) / sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\"}[1m])) * 100", - "legendFormat": "4xx 에러율", + "legendFormat": "4xx ?먮윭??, "refId": "A" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\",status=~\"5..\"}[1m])) / sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\"}[1m])) * 100", - "legendFormat": "5xx 에러율", + "legendFormat": "5xx ?먮윭??, "refId": "B" } ] }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -404,23 +404,23 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "응답시간 백분위 (p50 / p95 / p99)", + "title": "?묐떟?쒓컙 諛깅텇??(p50 / p95 / p99)", "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "histogram_quantile(0.50, sum(rate(http_server_requests_seconds_bucket{job=\"catchtable-app\"}[1m])) by (le))", "legendFormat": "p50", "refId": "A" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "histogram_quantile(0.95, sum(rate(http_server_requests_seconds_bucket{job=\"catchtable-app\"}[1m])) by (le))", "legendFormat": "p95", "refId": "B" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "histogram_quantile(0.99, sum(rate(http_server_requests_seconds_bucket{job=\"catchtable-app\"}[1m])) by (le))", "legendFormat": "p99", "refId": "C" @@ -429,7 +429,7 @@ }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, @@ -450,7 +450,7 @@ ] }, { - "matcher": { "id": "byName", "options": "평균 응답시간" }, + "matcher": { "id": "byName", "options": "?됯퇏 ?묐떟?쒓컙" }, "properties": [ { "id": "unit", "value": "s" }, { "id": "custom.width", "value": 130 } @@ -466,7 +466,7 @@ "showHeader": true, "sortBy": [{ "desc": true, "displayName": "RPS" }] }, - "title": "엔드포인트별 요청 현황", + "title": "?붾뱶?ъ씤?몃퀎 ?붿껌 ?꾪솴", "transformations": [ { "id": "merge", @@ -477,7 +477,7 @@ "options": { "renameByName": { "Value #A": "RPS", - "Value #B": "평균 응답시간", + "Value #B": "?됯퇏 ?묐떟?쒓컙", "method": "Method", "status": "Status", "uri": "URI" @@ -488,7 +488,7 @@ "type": "table", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\"}[5m])) by (uri, method, status)", "format": "table", "instant": true, @@ -496,7 +496,7 @@ "refId": "A" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_sum{job=\"catchtable-app\"}[5m])) by (uri, method, status) / sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\"}[5m])) by (uri, method, status)", "format": "table", "instant": true, @@ -510,12 +510,12 @@ "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 22 }, "id": 11, - "title": "JVM 상태", + "title": "JVM ?곹깭", "type": "row" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -550,26 +550,26 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "JVM Heap 메모리", + "title": "JVM Heap 硫붾え由?, "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(jvm_memory_used_bytes{job=\"catchtable-app\", area=\"heap\"}) by (id)", - "legendFormat": "사용중 - {{id}}", + "legendFormat": "?ъ슜以?- {{id}}", "refId": "A" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(jvm_memory_max_bytes{job=\"catchtable-app\", area=\"heap\"}) by (id)", - "legendFormat": "최대 - {{id}}", + "legendFormat": "理쒕? - {{id}}", "refId": "B" } ] }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -604,26 +604,26 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "JVM Non-Heap 메모리", + "title": "JVM Non-Heap 硫붾え由?, "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(jvm_memory_used_bytes{job=\"catchtable-app\", area=\"nonheap\"}) by (id)", - "legendFormat": "사용중 - {{id}}", + "legendFormat": "?ъ슜以?- {{id}}", "refId": "A" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(jvm_memory_committed_bytes{job=\"catchtable-app\", area=\"nonheap\"}) by (id)", - "legendFormat": "커밋됨 - {{id}}", + "legendFormat": "而ㅻ컠??- {{id}}", "refId": "B" } ] }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -658,11 +658,11 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "GC 일시정지 시간", + "title": "GC ?쇱떆?뺤? ?쒓컙", "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "rate(jvm_gc_pause_seconds_sum{job=\"catchtable-app\"}[1m])", "legendFormat": "{{action}} - {{cause}}", "refId": "A" @@ -671,7 +671,7 @@ }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -706,32 +706,32 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "JVM 스레드 수", + "title": "JVM ?ㅻ젅????, "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "jvm_threads_live_threads{job=\"catchtable-app\"}", - "legendFormat": "라이브", + "legendFormat": "?쇱씠釉?, "refId": "A" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "jvm_threads_daemon_threads{job=\"catchtable-app\"}", - "legendFormat": "데몬", + "legendFormat": "?곕が", "refId": "B" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "jvm_threads_peak_threads{job=\"catchtable-app\"}", - "legendFormat": "피크", + "legendFormat": "?쇳겕", "refId": "C" } ] }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -774,19 +774,19 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "CPU 사용률", + "title": "CPU ?ъ슜瑜?, "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "process_cpu_usage{job=\"catchtable-app\"} * 100", - "legendFormat": "프로세스 CPU", + "legendFormat": "?꾨줈?몄뒪 CPU", "refId": "A" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "system_cpu_usage{job=\"catchtable-app\"} * 100", - "legendFormat": "시스템 CPU", + "legendFormat": "?쒖뒪??CPU", "refId": "B" } ] @@ -796,12 +796,12 @@ "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 39 }, "id": 17, - "title": "DB 커넥션 풀 (HikariCP)", + "title": "DB 而ㅻ꽖???€ (HikariCP)", "type": "row" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -836,38 +836,38 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "HikariCP 커넥션 현황", + "title": "HikariCP 而ㅻ꽖???꾪솴", "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "hikaricp_connections_active{job=\"catchtable-app\"}", - "legendFormat": "활성", + "legendFormat": "?쒖꽦", "refId": "A" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "hikaricp_connections_idle{job=\"catchtable-app\"}", - "legendFormat": "유휴", + "legendFormat": "?좏쑕", "refId": "B" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "hikaricp_connections_pending{job=\"catchtable-app\"}", - "legendFormat": "대기", + "legendFormat": "?€湲?, "refId": "C" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "hikaricp_connections_max{job=\"catchtable-app\"}", - "legendFormat": "최대", + "legendFormat": "理쒕?", "refId": "D" } ] }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -902,20 +902,20 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "커넥션 획득 대기시간", + "title": "而ㅻ꽖???띾뱷 ?€湲곗떆媛?, "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "rate(hikaricp_connections_acquire_seconds_sum{job=\"catchtable-app\"}[1m]) / rate(hikaricp_connections_acquire_seconds_count{job=\"catchtable-app\"}[1m])", - "legendFormat": "평균 획득 대기시간", + "legendFormat": "?됯퇏 ?띾뱷 ?€湲곗떆媛?, "refId": "A" } ] }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "thresholds" }, @@ -944,11 +944,11 @@ "showThresholdLabels": false, "showThresholdMarkers": true }, - "title": "커넥션 풀 사용률", + "title": "而ㅻ꽖???€ ?ъ슜瑜?, "type": "gauge", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "hikaricp_connections_active{job=\"catchtable-app\"} / hikaricp_connections_max{job=\"catchtable-app\"} * 100", "instant": true, "refId": "A" @@ -960,12 +960,12 @@ "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 48 }, "id": 21, - "title": "Redis (Lettuce 클라이언트)", + "title": "Redis (Lettuce ?대씪?댁뼵??", "type": "row" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -1002,20 +1002,20 @@ "legend": { "calcs": ["mean", "min"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "캐시 히트율 (Spring Cache)", + "title": "罹먯떆 ?덊듃??(Spring Cache)", "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(cache_gets_total{job=\"catchtable-app\",result=\"hit\"}[1m])) / (sum(rate(cache_gets_total{job=\"catchtable-app\",result=\"hit\"}[1m])) + sum(rate(cache_gets_total{job=\"catchtable-app\",result=\"miss\"}[1m]))) * 100", - "legendFormat": "히트율", + "legendFormat": "?덊듃??, "refId": "A" } ] }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -1050,11 +1050,11 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "Lettuce 명령 처리량 (초당)", + "title": "Lettuce 紐낅졊 泥섎━??(珥덈떦)", "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(lettuce_command_completion_seconds_count{job=\"catchtable-app\"}[1m])) by (command)", "legendFormat": "{{command}}", "refId": "A" @@ -1063,7 +1063,7 @@ }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -1098,11 +1098,11 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "Lettuce 명령 응답시간", + "title": "Lettuce 紐낅졊 ?묐떟?쒓컙", "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(lettuce_command_completion_seconds_sum{job=\"catchtable-app\"}[1m])) by (command) / sum(rate(lettuce_command_completion_seconds_count{job=\"catchtable-app\"}[1m])) by (command)", "legendFormat": "{{command}}", "refId": "A" @@ -1119,7 +1119,7 @@ }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -1170,16 +1170,16 @@ "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(kafka_consumer_fetch_manager_records_lag{job=\"catchtable-app\"}) by (topic, partition)", - "legendFormat": "{{topic}} - 파티션 {{partition}}", + "legendFormat": "{{topic}} - ?뚰떚??{{partition}}", "refId": "A" } ] }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "fieldConfig": { "defaults": { "color": { "mode": "palette-classic" }, @@ -1214,19 +1214,19 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "Kafka 메시지 처리량 (초당)", + "title": "Kafka 硫붿떆吏€ 泥섎━??(珥덈떦)", "type": "timeseries", "targets": [ { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(kafka_consumer_fetch_manager_records_consumed_total{job=\"catchtable-app\"}[1m])) by (topic)", - "legendFormat": "소비 - {{topic}}", + "legendFormat": "?뚮퉬 - {{topic}}", "refId": "A" }, { - "datasource": { "type": "prometheus", "uid": "${DS_PROMETHEUS}" }, + "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(kafka_producer_record_send_total{job=\"catchtable-app\"}[1m])) by (topic)", - "legendFormat": "생산 - {{topic}}", + "legendFormat": "?앹궛 - {{topic}}", "refId": "B" } ] @@ -1240,7 +1240,7 @@ "time": { "from": "now-1h", "to": "now" }, "timepicker": {}, "timezone": "Asia/Seoul", - "title": "CatchEat Backend 모니터링", + "title": "CatchEat Backend 紐⑤땲?곕쭅", "uid": "catcheat-dongan-v1", "version": 1, "weekStart": "" diff --git a/grafana/provisioning/datasources/datasources.yml b/grafana/provisioning/datasources/datasources.yml index f233885..e7a60f2 100644 --- a/grafana/provisioning/datasources/datasources.yml +++ b/grafana/provisioning/datasources/datasources.yml @@ -2,6 +2,7 @@ apiVersion: 1 datasources: - name: Prometheus + uid: DS_PROMETHEUS type: prometheus access: proxy url: http://prometheus:9090 @@ -11,6 +12,7 @@ datasources: timeInterval: "15s" - name: Loki + uid: DS_LOKI type: loki access: proxy url: http://loki:3100 From 74455b0f5d0f669ed340324d97a923cb1e3e1569 Mon Sep 17 00:00:00 2001 From: johe00123 Date: Thu, 28 May 2026 21:43:17 +0900 Subject: [PATCH 4/4] =?UTF-8?q?Fix:=20=EA=B7=B8=EB=9D=BC=ED=8C=8C=EB=82=98?= =?UTF-8?q?=20datasource=20UID=20=EB=AA=85=EC=8B=9C=20=EB=B0=8F=20?= =?UTF-8?q?=EB=8C=80=EC=8B=9C=EB=B3=B4=EB=93=9C=20=EB=B3=80=EC=88=98=20?= =?UTF-8?q?=EC=B9=98=ED=99=98=20-=20=EC=A0=9C=EB=AF=B8=EB=82=98=EC=9D=B4?= =?UTF-8?q?=20=EC=BD=94=EB=93=9C=20=EB=A6=AC=EB=B7=B0=20=EB=B0=98=EC=98=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../catcheat-backend-dashboard.json | 98 +++++++++---------- 1 file changed, 49 insertions(+), 49 deletions(-) diff --git a/grafana/provisioning/dashboards/catcheat-backend-dashboard.json b/grafana/provisioning/dashboards/catcheat-backend-dashboard.json index c0c9214..389f848 100644 --- a/grafana/provisioning/dashboards/catcheat-backend-dashboard.json +++ b/grafana/provisioning/dashboards/catcheat-backend-dashboard.json @@ -61,7 +61,7 @@ } ] }, - "description": "CatchEat 諛깆뿏??紐⑤땲?곕쭅 - HTTP / JVM / DB / Redis / Kafka", + "description": "CatchEat 백엔드 모니터링 - HTTP / JVM / DB / Redis / Kafka", "editable": true, "fiscalYearStartMonth": 0, "graphTooltip": 1, @@ -73,7 +73,7 @@ "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 0 }, "id": 1, - "title": "?붿빟", + "title": "요약", "type": "row" }, @@ -104,7 +104,7 @@ "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "textMode": "auto" }, - "title": "?꾩옱 RPS", + "title": "현재 RPS", "type": "stat", "targets": [ { @@ -144,7 +144,7 @@ "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "textMode": "auto" }, - "title": "5xx ?먮윭??, + "title": "5xx 에러율", "type": "stat", "targets": [ { @@ -184,7 +184,7 @@ "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "textMode": "auto" }, - "title": "p99 ?묐떟?쒓컙", + "title": "p99 응답시간", "type": "stat", "targets": [ { @@ -222,7 +222,7 @@ "reduceOptions": { "calcs": ["lastNotNull"], "fields": "", "values": false }, "textMode": "auto" }, - "title": "?낇???, + "title": "업타임", "type": "stat", "targets": [ { @@ -238,7 +238,7 @@ "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 5 }, "id": 6, - "title": "HTTP API ?꾪솴", + "title": "HTTP API 현황", "type": "row" }, @@ -278,7 +278,7 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "珥덈떦 ?붿껌??(?곹깭肄붾뱶蹂?", + "title": "초당 요청수 (상태코드별)", "type": "timeseries", "targets": [ { @@ -350,19 +350,19 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "?먮윭??(%)", + "title": "에러율 (%)", "type": "timeseries", "targets": [ { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\",status=~\"4..\"}[1m])) / sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\"}[1m])) * 100", - "legendFormat": "4xx ?먮윭??, + "legendFormat": "4xx 에러율", "refId": "A" }, { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\",status=~\"5..\"}[1m])) / sum(rate(http_server_requests_seconds_count{job=\"catchtable-app\"}[1m])) * 100", - "legendFormat": "5xx ?먮윭??, + "legendFormat": "5xx 에러율", "refId": "B" } ] @@ -404,7 +404,7 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "?묐떟?쒓컙 諛깅텇??(p50 / p95 / p99)", + "title": "응답시간 백분위 (p50 / p95 / p99)", "type": "timeseries", "targets": [ { @@ -450,7 +450,7 @@ ] }, { - "matcher": { "id": "byName", "options": "?됯퇏 ?묐떟?쒓컙" }, + "matcher": { "id": "byName", "options": "평균 응답시간" }, "properties": [ { "id": "unit", "value": "s" }, { "id": "custom.width", "value": 130 } @@ -466,7 +466,7 @@ "showHeader": true, "sortBy": [{ "desc": true, "displayName": "RPS" }] }, - "title": "?붾뱶?ъ씤?몃퀎 ?붿껌 ?꾪솴", + "title": "엔드포인트별 요청 현황", "transformations": [ { "id": "merge", @@ -477,7 +477,7 @@ "options": { "renameByName": { "Value #A": "RPS", - "Value #B": "?됯퇏 ?묐떟?쒓컙", + "Value #B": "평균 응답시간", "method": "Method", "status": "Status", "uri": "URI" @@ -510,7 +510,7 @@ "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 22 }, "id": 11, - "title": "JVM ?곹깭", + "title": "JVM 상태", "type": "row" }, @@ -550,19 +550,19 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "JVM Heap 硫붾え由?, + "title": "JVM Heap 메모리", "type": "timeseries", "targets": [ { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(jvm_memory_used_bytes{job=\"catchtable-app\", area=\"heap\"}) by (id)", - "legendFormat": "?ъ슜以?- {{id}}", + "legendFormat": "사용중 - {{id}}", "refId": "A" }, { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(jvm_memory_max_bytes{job=\"catchtable-app\", area=\"heap\"}) by (id)", - "legendFormat": "理쒕? - {{id}}", + "legendFormat": "최대 - {{id}}", "refId": "B" } ] @@ -604,19 +604,19 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "JVM Non-Heap 硫붾え由?, + "title": "JVM Non-Heap 메모리", "type": "timeseries", "targets": [ { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(jvm_memory_used_bytes{job=\"catchtable-app\", area=\"nonheap\"}) by (id)", - "legendFormat": "?ъ슜以?- {{id}}", + "legendFormat": "사용중 - {{id}}", "refId": "A" }, { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(jvm_memory_committed_bytes{job=\"catchtable-app\", area=\"nonheap\"}) by (id)", - "legendFormat": "而ㅻ컠??- {{id}}", + "legendFormat": "커밋됨 - {{id}}", "refId": "B" } ] @@ -658,7 +658,7 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "GC ?쇱떆?뺤? ?쒓컙", + "title": "GC 일시정지 시간", "type": "timeseries", "targets": [ { @@ -706,25 +706,25 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "JVM ?ㅻ젅????, + "title": "JVM 스레드 수", "type": "timeseries", "targets": [ { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "jvm_threads_live_threads{job=\"catchtable-app\"}", - "legendFormat": "?쇱씠釉?, + "legendFormat": "라이브", "refId": "A" }, { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "jvm_threads_daemon_threads{job=\"catchtable-app\"}", - "legendFormat": "?곕が", + "legendFormat": "데몬", "refId": "B" }, { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "jvm_threads_peak_threads{job=\"catchtable-app\"}", - "legendFormat": "?쇳겕", + "legendFormat": "피크", "refId": "C" } ] @@ -774,19 +774,19 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "CPU ?ъ슜瑜?, + "title": "CPU 사용률", "type": "timeseries", "targets": [ { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "process_cpu_usage{job=\"catchtable-app\"} * 100", - "legendFormat": "?꾨줈?몄뒪 CPU", + "legendFormat": "프로세스 CPU", "refId": "A" }, { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "system_cpu_usage{job=\"catchtable-app\"} * 100", - "legendFormat": "?쒖뒪??CPU", + "legendFormat": "시스템 CPU", "refId": "B" } ] @@ -796,7 +796,7 @@ "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 39 }, "id": 17, - "title": "DB 而ㅻ꽖???€ (HikariCP)", + "title": "DB 커넥션 풀 (HikariCP)", "type": "row" }, @@ -836,31 +836,31 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "HikariCP 而ㅻ꽖???꾪솴", + "title": "HikariCP 커넥션 현황", "type": "timeseries", "targets": [ { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "hikaricp_connections_active{job=\"catchtable-app\"}", - "legendFormat": "?쒖꽦", + "legendFormat": "활성", "refId": "A" }, { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "hikaricp_connections_idle{job=\"catchtable-app\"}", - "legendFormat": "?좏쑕", + "legendFormat": "유휴", "refId": "B" }, { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "hikaricp_connections_pending{job=\"catchtable-app\"}", - "legendFormat": "?€湲?, + "legendFormat": "대기", "refId": "C" }, { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "hikaricp_connections_max{job=\"catchtable-app\"}", - "legendFormat": "理쒕?", + "legendFormat": "최대", "refId": "D" } ] @@ -902,13 +902,13 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "而ㅻ꽖???띾뱷 ?€湲곗떆媛?, + "title": "커넥션 획득 대기시간", "type": "timeseries", "targets": [ { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "rate(hikaricp_connections_acquire_seconds_sum{job=\"catchtable-app\"}[1m]) / rate(hikaricp_connections_acquire_seconds_count{job=\"catchtable-app\"}[1m])", - "legendFormat": "?됯퇏 ?띾뱷 ?€湲곗떆媛?, + "legendFormat": "평균 획득 대기시간", "refId": "A" } ] @@ -944,7 +944,7 @@ "showThresholdLabels": false, "showThresholdMarkers": true }, - "title": "而ㅻ꽖???€ ?ъ슜瑜?, + "title": "커넥션 풀 사용률", "type": "gauge", "targets": [ { @@ -960,7 +960,7 @@ "collapsed": false, "gridPos": { "h": 1, "w": 24, "x": 0, "y": 48 }, "id": 21, - "title": "Redis (Lettuce ?대씪?댁뼵??", + "title": "Redis (Lettuce 클라이언트)", "type": "row" }, @@ -1002,13 +1002,13 @@ "legend": { "calcs": ["mean", "min"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "罹먯떆 ?덊듃??(Spring Cache)", + "title": "캐시 히트율 (Spring Cache)", "type": "timeseries", "targets": [ { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(cache_gets_total{job=\"catchtable-app\",result=\"hit\"}[1m])) / (sum(rate(cache_gets_total{job=\"catchtable-app\",result=\"hit\"}[1m])) + sum(rate(cache_gets_total{job=\"catchtable-app\",result=\"miss\"}[1m]))) * 100", - "legendFormat": "?덊듃??, + "legendFormat": "히트율", "refId": "A" } ] @@ -1050,7 +1050,7 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "Lettuce 紐낅졊 泥섎━??(珥덈떦)", + "title": "Lettuce 명령 처리량 (초당)", "type": "timeseries", "targets": [ { @@ -1098,7 +1098,7 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "Lettuce 紐낅졊 ?묐떟?쒓컙", + "title": "Lettuce 명령 응답시간", "type": "timeseries", "targets": [ { @@ -1172,7 +1172,7 @@ { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(kafka_consumer_fetch_manager_records_lag{job=\"catchtable-app\"}) by (topic, partition)", - "legendFormat": "{{topic}} - ?뚰떚??{{partition}}", + "legendFormat": "{{topic}} - 파티션 {{partition}}", "refId": "A" } ] @@ -1214,19 +1214,19 @@ "legend": { "calcs": ["mean", "max"], "displayMode": "table", "placement": "bottom", "showLegend": true }, "tooltip": { "mode": "multi", "sort": "desc" } }, - "title": "Kafka 硫붿떆吏€ 泥섎━??(珥덈떦)", + "title": "Kafka 메시지 처리량 (초당)", "type": "timeseries", "targets": [ { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(kafka_consumer_fetch_manager_records_consumed_total{job=\"catchtable-app\"}[1m])) by (topic)", - "legendFormat": "?뚮퉬 - {{topic}}", + "legendFormat": "소비 - {{topic}}", "refId": "A" }, { "datasource": { "type": "prometheus", "uid": "DS_PROMETHEUS" }, "expr": "sum(rate(kafka_producer_record_send_total{job=\"catchtable-app\"}[1m])) by (topic)", - "legendFormat": "?앹궛 - {{topic}}", + "legendFormat": "생산 - {{topic}}", "refId": "B" } ] @@ -1240,7 +1240,7 @@ "time": { "from": "now-1h", "to": "now" }, "timepicker": {}, "timezone": "Asia/Seoul", - "title": "CatchEat Backend 紐⑤땲?곕쭅", + "title": "CatchEat Backend 모니터링", "uid": "catcheat-dongan-v1", "version": 1, "weekStart": ""