Skip to content

Node-exporter

Exporter for machine metrics

Docker 실행방법

docker run -d \
  --net="host" \
  --pid="host" \
  -v "/:/host:ro,rslave" \
  quay.io/prometheus/node-exporter:latest \
  --path.rootfs=/host

Compose

---
version: '3.8'

services:
  node_exporter:
    image: quay.io/prometheus/node-exporter:latest
    container_name: node_exporter
    command:
      - '--path.rootfs=/host'
    network_mode: host
    pid: host
    restart: unless-stopped
    volumes:
      - '/:/host:ro,rslave'

Collectors

Enabled by default

Name

Description

OS

arp

/proc/net/arp에서 ARP 통계를 노출합니다.

Linux

bcache

/sys/fs/bcache/에서 bcache 통계를 노출합니다.

Linux

bonding

Linux 본딩 인터페이스의 구성된 슬레이브와 활성 슬레이브 수를 노출합니다.

Linux

btrfs

btrfs 통계를 노출합니다.

Linux

boottime

kern.boottime sysctl에서 파생된 시스템 부팅 시간을 노출합니다.

Darwin, Dragonfly, FreeBSD, NetBSD, OpenBSD, Solaris

conntrack

conntrack 통계를 표시합니다 (/proc/sys/net/netfilter/가 없으면 아무것도 하지 않음).

Linux

cpu

CPU 통계를 노출합니다.

Darwin, Dragonfly, FreeBSD, Linux, Solaris, OpenBSD

cpufreq

CPU 주파수 통계를 노출합니다.

Linux, Solaris

diskstats

디스크 I/O 통계를 노출합니다.

Darwin, Linux, OpenBSD

dmi

/sys/class/dmi/id/에서 Desktop Management Interface (DMI) 정보를 노출합니다.

Linux

edac

오류 감지 및 정정 통계를 노출합니다.

Linux

entropy

사용 가능한 엔트로피를 노출합니다.

Linux

exec

실행 통계를 노출합니다.

Dragonfly, FreeBSD

fibrechannel

/sys/class/fc_host/에서 파이버 채널 정보 및 통계를 노출합니다.

Linux

filefd

/proc/sys/fs/file-nr에서 파일 디스크립터 통계를 노출합니다.

Linux

filesystem

사용된 디스크 공간과 같은 파일시스템 통계를 노출합니다.

Darwin, Dragonfly, FreeBSD, Linux, OpenBSD

hwmon

/sys/class/hwmon/에서 하드웨어 모니터링 및 센서 데이터를 노출합니다.

Linux

infiniband

InfiniBand 및 Intel OmniPath 구성에 특화된 네트워크 통계를 노출합니다.

Linux

ipvs

/proc/net/ip_vs에서 IPVS 상태를, /proc/net/ip_vs_stats에서 통계를 노출합니다.

Linux

loadavg

로드 평균을 노출합니다.

Darwin, Dragonfly, FreeBSD, Linux, NetBSD, OpenBSD, Solaris

mdadm

/proc/mdstat의 장치에 대한 통계를 노출합니다 (/proc/mdstat이 없으면 아무것도 하지 않음).

Linux

meminfo

메모리 통계를 노출합니다.

Darwin, Dragonfly, FreeBSD, Linux, OpenBSD

netclass

/sys/class/net/에서 네트워크 인터페이스 정보를 노출합니다.

Linux

netdev

전송된 바이트와 같은 네트워크 인터페이스 통계를 노출합니다.

Darwin, Dragonfly, FreeBSD, Linux, OpenBSD

netisr

netisr 통계를 노출합니다.

FreeBSD

netstat

/proc/net/netstat에서 네트워크 통계를 노출합니다. netstat -s와 동일한 정보입니다.

Linux

nfs

/proc/net/rpc/nfs에서 NFS 클라이언트 통계를 노출합니다. nfsstat -c와 동일한 정보입니다.

Linux

nfsd

/proc/net/rpc/nfsd에서 NFS 커널 서버 통계를 노출합니다. nfsstat -s와 동일한 정보입니다.

Linux

nvme

/sys/class/nvme/에서 NVMe 정보를 노출합니다.

Linux

os

/etc/os-release 또는 /usr/lib/os-release에서 OS 릴리스 정보를 노출합니다.

any

powersupplyclass

/sys/class/power_supply에서 전원 공급 장치 통계를 노출합니다.

Linux

pressure

/proc/pressure/에서 압력 정체(pressure stall) 통계를 노출합니다.

Linux (kernel 4.20+ and/or CONFIG_PSI)

rapl

/sys/class/powercap에서 다양한 통계를 노출합니다.

Linux

schedstat

/proc/schedstat에서 태스크 스케줄러 통계를 노출합니다.

Linux

selinux

SELinux 통계를 노출합니다.

Linux

sockstat

/proc/net/sockstat에서 다양한 통계를 노출합니다.

Linux

softnet

/proc/net/softnet_stat에서 통계를 노출합니다.

Linux

stat

/proc/stat에서 다양한 통계를 노출합니다. 부팅 시간, 포크 및 인터럽트를 포함합니다.

Linux

tapestats

/sys/class/scsi_tape에서 통계를 노출합니다.

Linux

textfile

로컬 디스크에서 읽은 통계를 노출합니다. --collector.textfile.directory 플래그를 설정해야 합니다.

any

thermal

pmset -g therm과 같은 열 통계를 노출합니다.

Darwin

thermal_zone

/sys/class/thermal에서 열 영역 및 냉각 장치 통계를 노출합니다.

Linux

time

현재 시스템 시간을 노출합니다.

any

timex

선택된 adjtimex(2) 시스템 콜 통계를 노출합니다.

Linux

udp_queues

/proc/net/udp/proc/net/udp6에서 rx_queuetx_queue의 UDP 총 길이를 노출합니다.

Linux

uname

uname 시스템 콜에서 제공하는 시스템 정보를 노출합니다.

Darwin, FreeBSD, Linux, OpenBSD

vmstat

/proc/vmstat에서 통계를 노출합니다.

Linux

watchdog

/sys/class/watchdog에서 통계를 노출합니다.

Linux

xfs

XFS 런타임 통계를 노출합니다.

Linux (kernel 4.4+)

zfs

ZFS 성능 통계를 노출합니다.

FreeBSD, Linux, Solaris

Disabled by default

Name

Description

OS

buddyinfo

/proc/buddyinfo에서 보고되는 메모리 조각 통계를 노출합니다.

Linux

cgroups

활성 및 활성화된 cgroup 수의 요약을 제공합니다.

Linux

cpu_vulnerabilities

sysfs에서 CPU 취약점 정보를 노출합니다.

Linux

devstat

장치 통계를 노출합니다.

Dragonfly, FreeBSD

drm

sysfs / DRM을 사용하여 GPU 메트릭을 노출합니다. amdgpu는 DRM을 통해 이 정보를 노출하는 유일한 드라이버입니다.

Linux

drbd

Distributed Replicated Block Device 통계를 노출합니다 (버전 8.4까지).

Linux

ethtool

ethtool, ethtool -S, ethtool -i와 동등한 네트워크 인터페이스 정보 및 네트워크 드라이버 통계를 노출합니다.

Linux

interrupts

상세한 인터럽트 통계를 노출합니다.

Linux, OpenBSD

kernel_hung

/proc/sys/kernel/hung_task_detect_count에서 정지된 것으로 감지된 태스크 수를 노출합니다.

Linux

ksmd

/sys/kernel/mm/ksm에서 커널 및 시스템 통계를 노출합니다.

Linux

lnstat

/proc/net/stat/에서 통계를 노출합니다.

Linux

logind

logind에서 세션 수를 노출합니다.

Linux

meminfo_numa

/sys/devices/system/node/node[0-9]*/meminfo, /sys/devices/system/node/node[0-9]*/numastat에서 메모리 통계를 노출합니다.

Linux

mountstats

/proc/self/mountstats에서 파일시스템 통계를 노출합니다. 상세한 NFS 클라이언트 통계를 노출합니다.

Linux

network_route

라우팅 테이블을 메트릭으로 노출합니다.

Linux

pcidevice

링크 상태 및 상위 장치를 포함한 PCI 장치 정보를 노출합니다.

Linux

perf

perf 기반 메트릭을 노출합니다 (경고: 메트릭은 커널 구성 및 설정에 따라 다릅니다).

Linux

processes

/proc에서 집계된 프로세스 통계를 노출합니다.

Linux

qdisc

큐잉 규칙(queuing discipline) 통계를 노출합니다.

Linux

slabinfo

/proc/slabinfo에서 슬랩 통계를 노출합니다. /proc/slabinfo의 권한은 일반적으로 0400이므로 적절히 설정하십시오.

Linux

softirqs

/proc/softirqs에서 상세한 softirq 통계를 노출합니다.

Linux

sysctl

/proc/sys에서 sysctl 값을 노출합니다. 구성하려면 --collector.sysctl.include(-info)를 사용하십시오.

Linux

swap

/proc/swaps에서 스왑 정보를 노출합니다.

Linux

systemd

systemd에서 서비스 및 시스템 상태를 노출합니다.

Linux

tcpstat

/proc/net/tcp/proc/net/tcp6에서 TCP 연결 상태 정보를 노출합니다 (경고: 현재 버전은 고부하 상황에서 잠재적인 성능 문제가 있습니다).

Linux

wifi

WiFi 장치 및 스테이션 통계를 노출합니다.

Linux

xfrm

/proc/net/xfrm_stat에서 통계를 노출합니다.

Linux

zoneinfo

NUMA 메모리 영역 메트릭을 노출합니다.

Linux

PromQL Examples

CPU

# 1. CPU 사용률 (%) - 전체 평균
100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)

# 2. CPU 사용률 - 코어별
100 - (rate(node_cpu_seconds_total{mode="idle"}[5m]) * 100)

# 3. CPU 사용률 - mode별 분류
sum by (mode, instance) (rate(node_cpu_seconds_total[5m])) * 100

# 4. System CPU 사용률
rate(node_cpu_seconds_total{mode="system"}[5m]) * 100

# 5. User CPU 사용률
rate(node_cpu_seconds_total{mode="user"}[5m]) * 100

# 6. I/O Wait 시간
rate(node_cpu_seconds_total{mode="iowait"}[5m]) * 100

# 7. CPU 코어 개수
count(node_cpu_seconds_total{mode="idle"}) by (instance)

Memory

# 1. 메모리 사용률 (%)
(1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100

# 2. 메모리 사용량 (bytes)
node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes

# 3. 메모리 사용량 (GB)
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / 1024 / 1024 / 1024

# 4. Swap 사용률 (%)
(1 - (node_memory_SwapFree_bytes / node_memory_SwapTotal_bytes)) * 100

# 5. Swap 사용량 (bytes)
node_memory_SwapTotal_bytes - node_memory_SwapFree_bytes

# 6. 캐시 메모리 (bytes)
node_memory_Cached_bytes + node_memory_Buffers_bytes

# 7. 사용 가능한 메모리 (%)
(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100

# 8. Free 메모리 (GB)
node_memory_MemFree_bytes / 1024 / 1024 / 1024

# 9. 메모리 사용률 - 인스턴스별
avg by (instance) ((1 - (node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes)) * 100)

# 10. 메모리 압박 상태 (Available memory < 10%)
(node_memory_MemAvailable_bytes / node_memory_MemTotal_bytes) * 100 < 10

Network

# 1. 네트워크 수신 속도 (bytes/sec)
rate(node_network_receive_bytes_total[5m])

# 2. 네트워크 송신 속도 (bytes/sec)
rate(node_network_transmit_bytes_total[5m])

# 3. 네트워크 수신 속도 (MB/sec)
rate(node_network_receive_bytes_total[5m]) / 1024 / 1024

# 4. 네트워크 송신 속도 (MB/sec)
rate(node_network_transmit_bytes_total[5m]) / 1024 / 1024

# 5. 네트워크 총 트래픽 (bytes/sec)
rate(node_network_receive_bytes_total[5m]) + rate(node_network_transmit_bytes_total[5m])

# 6. 네트워크 에러 수신
rate(node_network_receive_errs_total[5m])

# 7. 네트워크 에러 송신
rate(node_network_transmit_errs_total[5m])

# 8. 네트워크 패킷 수신 속도 (packets/sec)
rate(node_network_receive_packets_total[5m])

# 9. 네트워크 패킷 송신 속도 (packets/sec)
rate(node_network_transmit_packets_total[5m])

# 10. 네트워크 드롭 패킷 수신
rate(node_network_receive_drop_total[5m])

# 11. 네트워크 드롭 패킷 송신
rate(node_network_transmit_drop_total[5m])

# 12. 특정 인터페이스 수신 속도 (eth0)
rate(node_network_receive_bytes_total{device="eth0"}[5m])

# 13. 특정 인터페이스 송신 속도 (eth0)
rate(node_network_transmit_bytes_total{device="eth0"}[5m])

# 14. loopback 제외 네트워크 수신 속도
rate(node_network_receive_bytes_total{device!="lo"}[5m])

# 15. 인터페이스별 네트워크 사용량 (MB/sec)
sum by (device) (rate(node_network_receive_bytes_total[5m]) + rate(node_network_transmit_bytes_total[5m])) / 1024 / 1024

# 16. 네트워크 에러율 (%)
(rate(node_network_receive_errs_total[5m]) / rate(node_network_receive_packets_total[5m])) * 100

# 17. 네트워크 대역폭 사용률 (1Gbps 기준)
(rate(node_network_transmit_bytes_total[5m]) * 8 / 1000000000) * 100

Filesystem

# 1. 디스크 사용률 (%)
(1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100

# 2. 디스크 사용률 - 마운트 포인트별
(1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100

# 3. 디스크 사용 공간 (bytes)
node_filesystem_size_bytes - node_filesystem_avail_bytes

# 4. 디스크 사용 공간 (GB)
(node_filesystem_size_bytes - node_filesystem_avail_bytes) / 1024 / 1024 / 1024

# 5. 사용 가능한 디스크 공간 (GB)
node_filesystem_avail_bytes / 1024 / 1024 / 1024

# 6. 전체 디스크 크기 (GB)
node_filesystem_size_bytes / 1024 / 1024 / 1024

# 7. tmpfs, devtmpfs 제외한 디스크 사용률
(1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|devtmpfs"} / node_filesystem_size_bytes{fstype!~"tmpfs|devtmpfs"})) * 100

# 8. 특정 파일시스템 타입만 (ext4, xfs)
(1 - (node_filesystem_avail_bytes{fstype=~"ext4|xfs"} / node_filesystem_size_bytes{fstype=~"ext4|xfs"})) * 100

# 9. 디스크 여유 공간 10GB 미만인 마운트 포인트
node_filesystem_avail_bytes / 1024 / 1024 / 1024 < 10

# 10. 디스크 사용률 90% 이상인 파일시스템
(1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100 > 90

# 11. inode 사용률 (%)
(1 - (node_filesystem_files_free / node_filesystem_files)) * 100

# 12. 사용 가능한 inode 개수
node_filesystem_files_free

# 13. 전체 inode 개수
node_filesystem_files

# 14. inode 사용률 80% 이상
(1 - (node_filesystem_files_free / node_filesystem_files)) * 100 > 80

# 15. Read-only 파일시스템 감지
node_filesystem_readonly == 1

# 16. 인스턴스별 디스크 사용률 평균
avg by (instance) ((1 - (node_filesystem_avail_bytes{fstype!~"tmpfs|devtmpfs"} / node_filesystem_size_bytes{fstype!~"tmpfs|devtmpfs"})) * 100)

# 17. 마운트 포인트별 디스크 사용률 정렬 (높은 순)
sort_desc((1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100)

# 18. /var 디렉토리 사용률
(1 - (node_filesystem_avail_bytes{mountpoint="/var"} / node_filesystem_size_bytes{mountpoint="/var"})) * 100

# 19. 디스크 여유 공간 퍼센트
(node_filesystem_avail_bytes / node_filesystem_size_bytes) * 100

# 20. 특정 디바이스 사용률 (예: /dev/sda1)
(1 - (node_filesystem_avail_bytes{device="/dev/sda1"} / node_filesystem_size_bytes{device="/dev/sda1"})) * 100

# 21. 로컬 파일시스템만 (NFS, CIFS 제외)
(1 - (node_filesystem_avail_bytes{fstype!~"nfs|cifs|tmpfs|devtmpfs"} / node_filesystem_size_bytes{fstype!~"nfs|cifs|tmpfs|devtmpfs"})) * 100

# 22. 마운트 포인트 개수
count(node_filesystem_size_bytes)

# 23. 디스크 사용량 총합 (GB)
sum(node_filesystem_size_bytes - node_filesystem_avail_bytes) / 1024 / 1024 / 1024

# 24. 디스크 여유 공간이 가장 적은 파일시스템 (GB)
bottomk(1, node_filesystem_avail_bytes{fstype!~"tmpfs|devtmpfs"} / 1024 / 1024 / 1024)

# 25. 디스크 사용률이 가장 높은 파일시스템
topk(5, (1 - (node_filesystem_avail_bytes / node_filesystem_size_bytes)) * 100)

# 26. 디스크 사용률 예측 (4시간 후)
predict_linear(node_filesystem_avail_bytes{fstype!~"tmpfs|devtmpfs"}[1h], 4 * 3600) / node_filesystem_size_bytes * 100

# 27. 디스크 사용률 증가율 (1시간 기준)
rate(node_filesystem_size_bytes{fstype!~"tmpfs|devtmpfs"}[1h]) - rate(node_filesystem_avail_bytes{fstype!~"tmpfs|devtmpfs"}[1h])

# 28. 마운트 포인트가 루트(/)인 디스크 사용률
(1 - (node_filesystem_avail_bytes{mountpoint="/"} / node_filesystem_size_bytes{mountpoint="/"})) * 100

# 29. 모든 파일시스템의 총 크기 (TB)
sum(node_filesystem_size_bytes{fstype!~"tmpfs|devtmpfs"}) / 1024 / 1024 / 1024 / 1024

# 30. 특정 임계값 이하의 여유 공간 (예: 5GB)
node_filesystem_avail_bytes{fstype!~"tmpfs|devtmpfs"} / 1024 / 1024 / 1024 < 5

Alertmanager example

# prometheus_rules.yml
groups:
  - name: cpu_alerts
    interval: 30s
    rules:
      # High CPU usage alert
      - alert: HighCPUUsage
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High CPU usage detected on {{ $labels.instance }}"
          description: "CPU usage is above 80% (current value: {{ $value }}%)"

      # Critical CPU usage alert  
      - alert: CriticalCPUUsage
        expr: 100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 95
        for: 2m
        labels:
          severity: critical
        annotations:
          summary: "Critical CPU usage on {{ $labels.instance }}"
          description: "CPU usage is above 95% (current value: {{ $value }}%)"

      # High I/O wait alert
      - alert: HighIOWait
        expr: rate(node_cpu_seconds_total{mode="iowait"}[5m]) * 100 > 20
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High I/O wait on {{ $labels.instance }}"
          description: "I/O wait is above 20% (current value: {{ $value }}%)"

      # High system CPU usage
      - alert: HighSystemCPU
        expr: rate(node_cpu_seconds_total{mode="system"}[5m]) * 100 > 30
        for: 5m
        labels:
          severity: warning
        annotations:
          summary: "High system CPU on {{ $labels.instance }}"
          description: "System CPU usage is above 30% (current value: {{ $value }}%)"

Grafana Pannel example

{
  "targets": [
    {
      "expr": "100 - (avg by (instance) (rate(node_cpu_seconds_total{mode=\"idle\"}[5m])) * 100)",
      "legendFormat": "{{instance}}"
    }
  ],
  "title": "CPU Usage (%)",
  "type": "graph"
}

Grafana Dashboard example

# Python으로 Prometheus 쿼리 실행 예시
import requests
from datetime import datetime

def query_prometheus(query, prometheus_url="http://localhost:9090"):
    """
    Prometheus에서 CPU 메트릭 조회
    Query CPU metrics from Prometheus
    """
    params = {
        'query': query,
        'time': datetime.now().isoformat()
    }

    response = requests.get(
        f"{prometheus_url}/api/v1/query",
        params=params
    )

    return response.json()

# 사용 예시 / Usage example
if __name__ == "__main__":
    # CPU 사용률 조회 / Query CPU usage
    cpu_usage_query = '100 - (avg by (instance) (rate(node_cpu_seconds_total{mode="idle"}[5m])) * 100)'
    result = query_prometheus(cpu_usage_query)

    # 결과 출력 / Print results
    for item in result['data']['result']:
        instance = item['metric']['instance']
        cpu_usage = float(item['value'][1])
        print(f"Instance: {instance}, CPU Usage: {cpu_usage:.2f}%")

prometheus.yml example

scrape_configs:
  - job_name: 'node-exporter'
    scrape_interval: 15s  # 수집 간격 / Scrape interval
    scrape_timeout: 10s   # 타임아웃 / Timeout
    static_configs:
      - targets:
          - 'localhost:9100'
          - 'server1:9100'
          - 'server2:9100'
        labels:
          env: 'production'

See also

Favorite site