Grafana는 Grafana Labs에서 개발한 오픈소스로, 수집된 데이터들을 시각화하고 모니터링을 합니다.
Grafana의 특징은 다음과 같습니다.
kubectl exec -it -n monitoring **sts**/kube-prometheus-stack-grafana -- **grafana cli --version** 
# ingress 확인
kubectl get ingress -n monitoring kube-prometheus-stack-grafana
kubectl describe ingress -n monitoring kube-prometheus-stack-grafana 
# ingress 도메인으로 웹 접속 : 기본 계정 - **admin / prom-operator**
echo -e "Grafana Web URL = https://grafana.$MyDomain" 
# 테스트용 파드 배포
cat <<EOF | kubectl create -f -
apiVersion: v1
kind: Pod
metadata:
name: netshoot-pod
spec:
containers:
- name: netshoot-pod
image: nicolaka/netshoot
command: ["tail"]
args: ["-f", "/dev/null"]
terminationGracePeriodSeconds: 0
EOF
kubectl get pod netshoot-pod 
# 접속 확인
kubectl exec -it netshoot-pod -- nslookup kube-prometheus-stack-prometheus.monitoring
kubectl exec -it netshoot-pod -- curl -s kube-prometheus-stack-prometheus.monitoring:9090/graph -v ; echo 
해당 패널에서 Edit → 아래 수정 쿼리 입력 후 Run queries 클릭 → 상단 Save 후 Apply

sum by (node) (irate(node_cpu_seconds_total{mode!~"guest.*|idle|iowait", node="$node"}[5m]))Prometheus 확인
avg(node_cpu_seconds_total{mode!~"guest.*|idle|iowait"}) by (**node**)
avg(node_cpu_seconds_total{mode!~"guest.*|idle|iowait"}) by (instance)


설정 변경
node → instance 변경시 동작 됨을 확인
sum by (instance) (irate(node_cpu_seconds_total{mode!~"guest.*|idle|iowait", instance="$instance"}[5m]))

# memory 점유율
sum(node_memory_MemTotal_bytes{node="$node"}-node_memory_MemAvailable_bytes{node="$node"})/node_memory_MemTotal_bytes{node="$node"}
# 디스크 사용률
sum(node_filesystem_size_bytes{node="$node"} - node_filesystem_avail_bytes{node="$node"}) by (node) / sum(node_filesystem_size_bytes{node="$node"}) by (node)변경 할 경우 지표 조회 되는 것을 확인
# 수정 : 메모리 점유율
(node_memory_MemTotal_bytes{instance="$instance"}-node_memory_MemAvailable_bytes{instance="$instance"})/node_memory_MemTotal_bytes{instance="$instance"}
# 수정 : 디스크 사용률
sum(node_filesystem_size_bytes{instance="$instance"} - node_filesystem_avail_bytes{instance="$instance"}) by (instance) / sum(node_filesystem_size_bytes{instance="$instance"}) by (instance)

Pod 지표 또한 아래와 같이 보여지지 않는다

다만 앞에 CPU, Memory, Disk I/O하고 다르게 namespace/ pod parameter가 조회되지 않는다.

이런 경우 대시보드 우측 상단에 Setting 버튼을 클릭한다.

해당 버튼을 클릭한 다음 ‘Variables’ 탭을 클릭한 뒤 namespace, pod 설정 된 값이 Prometheus에서 조회 되는지 확인한다.

해당 값은 namespace가 조회 되지 않아서 발생하는 문제이므로 다음과 같이 변경한다.
label_values(kube_pod_labels,namespace)
-> label_values(kube_pod_info,namespace)
변경이 완료되면 다음과 같이 조회 되는 것을 확인할 수 있다.


리소스 설정을 확인하면 다음과 같이 설정 되어 있다.
# cpu
sum(kube_pod_container_resource_limits_cpu_cores{pod="$pod"})
# memory
sum(kube_pod_container_resource_limits_memory_bytes{pod="$pod"})
우선 프로메테우스에서 조회가 되는지 확인이 필요함
# cpu
kube_pod_container_resource_limits_cpu_cores
# memory
kube_pod_container_resource_limits_memory_byte
확인한 결과 cpu, memory 전부 조회 되지 않음


prometheus 버전에 따라서 PromQL을 검색해본 결과 다음과 같이 변경
# cpu
kube_pod_container_resource_limits{resource="cpu"}
# memory
kube_pod_container_resource_limits{resource="memory"}
해당 조건으로 검색하면 다음과 같이 조회 되는 것을 확인 가능


해당 값을 기반으로 Grafana 대시보드에서 적용하려면 다음과 같이 변경
# cpu
sum(kube_pod_container_resource_limits{resource="cpu", pod="$pod"})
# memory
sum(kube_pod_container_resource_limits{resource="memory", pod="$pod"})
변경한 결과 다음과 같이 변경 되는것을 확인

OpenTelemetry(OTel)는 추적(Tracing), 메트릭(Metrics), 로그(Logs) 등의 원격 측정 데이터를 생성하고 관리하도록 설계된 Observability 프레임워크 및 툴킷이다.
클라우드 네이티브 애플리케이션의 요청이 여러 애플리케이션을 거치며 처리되기 때문에, 서비스 간 경계를 넘는 추적이 필수적이다.