031. Prometheus - kimdonggwan337/dongdong GitHub Wiki

[๋ชจ๋‹ˆํ„ฐ๋ง]

  • Node Exporter: ๋ฌผ๋ฆฌ์ /๊ฐ€์ƒ ๋จธ์‹ (๋…ธ๋“œ)์˜ ํ•˜๋“œ์›จ์–ด ๋ฐ OS ์ˆ˜์ค€์˜ ๋ฉ”ํŠธ๋ฆญ์„ ์ˆ˜์ง‘ ์˜ˆ: CPU, ๋ฉ”๋ชจ๋ฆฌ, ๋””์Šคํฌ, ๋„คํŠธ์›Œํฌ, ์˜จ๋„, ์ปค๋„ ํ†ต๊ณ„ ๋“ฑ.

  • Process Exporter: ํŠน์ • ํ”„๋กœ์„ธ์Šค(์• ํ”Œ๋ฆฌ์ผ€์ด์…˜)์˜ ์ƒํƒœ ๋ฐ ๋ฆฌ์†Œ์Šค ์‚ฌ์šฉ๋Ÿ‰์„ ์ถ”์  ์˜ˆ: ํ”„๋กœ์„ธ์Šค์˜ CPU/Memory ์‚ฌ์šฉ๋Ÿ‰, ์‹คํ–‰ ์ค‘์ธ ํ”„๋กœ์„ธ์Šค ์ˆ˜, ๋น„์ •์ƒ ์ข…๋ฃŒ ๊ฐ์ง€ ๋“ฑ.

  • Prometheus: Node Exporter, process exporter ์„œ๋ฒ„ ๋ฐ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ •๋ณด(metrics)๋ฅผ ์ฃผ๊ธฐ์ ์œผ๋กœ pull ์š”์ฒญ, metrics ์ˆ˜์ง‘

  • Garafana: ๋ชจ์€ ์ •๋ณด๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์‹œ๊ฐํ™”ํ•˜๋Š” ๋„๊ตฌ

[๊ตฌ์„ฑ ํ™˜๊ฒฝ]

  • Prometheus Version: 3.1 ** OS: RockyLinux 8.9

  • Node Exporter1 Version: 1.8.2 ** OS: SUSE Linux Enterprise Server 15 SP5

  • Node Exporter1 Version: 1.8.2 ** OS: Red Hat Enterprise Linux 8

# mkdir /opt/monitoring/prometheus    > ์™ธ๋ถ€ ํ”„๋กœ๊ทธ๋žจ์„ ์„ค์น˜ ํŒŒ์ผ

# cd /opt/monitoring/prometheus
# wget https://github.com/prometheus/prometheus/releases/download/v3.1.0/prometheus-3.1.0.linux-amd64.tar.gz
# tar zxvf prometheus-3.1.0.linux-amd64.tar.gz
# cd prometheus-3.1.0.linux-amd64

## config ๋ฌธ๋ฒ• ์˜ค๋ฅ˜ ๊ฒ€์‚ฌ
# ./promtool check config ./prometheus.yml

Checking ./prometheus.yml
 SUCCESS: ./prometheus.yml is valid prometheus config file syntax

## Prometheus user ์ƒ์„ฑ

# useradd --no-create-home --shell /bin/false prometheus 
# cat /etc/passwd | grep "prometheus"
prometheus:x:1001:1001::/home/prometheus:/bin/false

## ๋””๋ ‰ํ† ๋ฆฌ ๊ถŒํ•œ ์„ค์ •

# cd /opt
# chown -R prometheus:prometheus monitoring 
# cd /var/lib/
# chown -R prometheus:prometheus prometheus
# cd /etc
# chown -R prometheus:prometheus prometheus
# cd /usr/bin
# chown -R prometheus:prometheus prometheus

## prometheus๋ฅผ ๊ด€๋ฆฌํ•  ๋””๋ ‰ํ† ๋ฆฌ ์ƒ์„ฑ ๋ฐ ๋ช…๋ น์–ด ๋ณต์‚ฌ
# mkdir /var/lib/prometheus           >  ํŒŒ์ผ, ๋กœ๊ทธ ๋ฐ์ดํ„ฐ ๊ทธ๋ฆฌ๊ณ  ์ž„์‹œํŒŒ์ผ ๊ฐ™์€ ๊ฐ€๋ณ€ ๋ฐ์ดํ„ฐ ํŒŒ์ผ
# mkdir /etc/prometheus               > ์‹œ์Šคํ…œ์˜ ๋ถ€ํŒ…, ์…ง๋‹ค์šด ์‹œ์— ํ•„์š”ํ•œ ํŒŒ์ผ๋“ค๊ณผ ์‹œ์Šคํ…œ์˜ ์ „๋ฐ˜์— ๊ฑธ์นœ ์„ค์ • ํŒŒ์ผ๋“ค ๋ฐ ์ดˆ๊ธฐ ์Šคํฌ๋ฆฝํŠธ ํŒŒ์ผ
# mkdir /usr/bin/prometheus            
# mkdir /opt/monitoring/prometheus/prometheus-3.1.0.linux-amd64/consoles 
# mkdir /opt/monitoring/prometheus/prometheus-3.1.0.linux-amd64/console_libraries 


# cp ./prometheus /usr/bin/prometheus
# cp ./promtool /usr/bin/prometheus
# cp ./prometheus.yml /etc/prometheus/
# cp -r ./consoles /etc/prometheus
# cp -r ./console_libraries /etc/prometheus

## prometheus.service ํŒŒ์ผ ๋“ฑ๋ก
# cd /etc/systemd/system
# vi prometheus.service

[Unit]
Description=Monitoring system and time series database
After=network-online.target

[Service]
User=prometheus
Type=simple
ExecStart=/usr/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus \
  --web.console.templates=/etc/prometheus/consoles \
  --web.console.libraries=/etc/prometheus/console_libraries

[Install]
WantedBy=multi-user.target


# systemctl daemon-reload
# systemctl start prometheus

# ss -lntu
tcp                 LISTEN               0                    2048                                           *:9090                                           

 prometheus.service - Prometheus Server
   Loaded: loaded (/etc/systemd/system/prometheus.service; disabled; vendor preset: disabled)
   Active: active (running) since Wed 2025-02-12 07:42:12 UTC; 4min 28s ago
 Main PID: 18690 (prometheus)
    Tasks: 7 (limit: 22938)
   Memory: 28.0M
   CGroup: /system.slice/prometheus.service
           โ””โ”€18690 /usr/bin/prometheus/prometheus --config.file /etc/prometheus/prometheus.yml --storage.tsdb.path /var/lib/prometheus --web.console.templates=/etc/prometheus/consoles --web.console.li>


[Node Exporter]

      
# mkdir /opt/monitoring/node_exporter
# cd /opt/monitoring/node_exporter
# wget https://github.com/prometheus/node_exporter/releases/download/v1.8.2/node_exporter-1.8.2.linux-amd64.tar.gz
# tar xvfz node_exporter-1.2.2.linux-amd64.tar.gz

# cp ./node_exporter /usr/local/bin/
# useradd --no-create-home --shell /bin/false node_exporter

# vi /etc/systemd/system/node_exporter.service

[Unit]
Description=Node Exporter
After=network.target

[Unit]
Description=Node Exporter
Wants=network-online.target
After=network-online.target

[Service]
Environment="NODE_EXPORTER_ARGS=--web.listen-address=\":9100\" "
ExecStart=/usr/local/bin/node_exporter $NODE_EXPORTER_ARGS

[Install]
WantedBy=multi-user.target

# systemctl daemon-reload
# systemctl start node_exporter


### [Prometheus.yml]
 
# vi /etc/prometheus/prometheus.yml
------------------------------- ์ƒ๋žต -------------------------------

scrape_configs:
  # The job name is added as a label `job=<job_name>` to any timeseries scraped from this config.
  - job_name: "prometheus"

    # metrics_path defaults to '/metrics'
    # scheme defaults to 'http'.

    static_configs:
      - targets: ["20.41.83.18:9090"]


  - job_name: 'Suse_node-exporter1'
    scrape_interval: 5s

    static_configs:
       - targets: ["52.231.10.251:9100"]

  - job_name: 'Redhat_node-exporter2'
    scrape_interval: 5s

    static_configs:
       - targets: ["4.218.17.32:9100"]

---------------------------------------------------------------------

[process exporter]


# mkdir /opt/monitoring/process_exporter/
# wget https://github.com/ncabatoff/process-exporter/releases/download/v0.8.4/process-exporter-0.8.4.linux-amd64.tar.gz
# tar xvfz process-exporter-0.8.4.linux-amd64.tar.gz
# cp  ./process-exporter /usr/local/bin/

# [process exporter config.yml]

process_names:
  - name: "{{.Matches}}"
    cmdline:
    - 'nginx'  # Nginx ํ”„๋กœ์„ธ์Šค ์ถ”์ 
  - name: "{{.Matches}}"
    cmdline:
    - 'sshd'   # SSH ํ”„๋กœ์„ธ์Šค ์ถ”์ 


# vi /etc/systemd/system/process-exporter.service

[Unit]
Description=Process Exporter
After=network.target

[Service]
User=process-exporter
ExecStart=/usr/local/bin/process-exporter -config.path /etc/process_exporter/config.yml
Restart=always

[Install]
WantedBy=multi-user.target

# useradd --no-create-home --shell /bin/false process-exporter
# chown -R process-exporter:process-exporter /etc/process-exporter
# chmod 640 /etc/process-exporter/config.yml

# systemctl daemon-reload
# systemctl start process-exporter

### [prometheus.yml]


  - job_name: 'Suse_process-exporter1'
    scrape_interval: 5s

    static_configs:
       - targets: ["52.231.10.251:9256"]


  - job_name: 'Redhat_process-exporter2'
    scrape_interval: 5s

    static_configs:
       - targets: ["4.218.17.32:9256"]

redhat linux firewall

# firewall-cmd --permanent --add-port=9100/tcp
# firewall-cmd --reload

import time
import requests
import os

# Slack Webhook URL (Slack์—์„œ ๋ฐœ๊ธ‰๋ฐ›์€ ๊ฑธ ๋„ฃ์–ด์ฃผ์„ธ์š”)
SLACK_WEBHOOK_URL = "https://hooks.slack.com/services/XXXX/YYYY/ZZZZ"

# Prometheus ๋กœ๊ทธ ํŒŒ์ผ ๊ฒฝ๋กœ
PROMETHEUS_LOG = "/var/log/prometheus/prometheus.log"

def send_slack_alert(message: str):
    """Slack์œผ๋กœ ์•Œ๋ฆผ ์ „์†ก"""
    payload = {
        "text": f":rotating_light: Prometheus Error Detected!\n```\n{message}\n```"
    }
    try:
        response = requests.post(SLACK_WEBHOOK_URL, json=payload)
        if response.status_code != 200:
            print(f"Slack ์ „์†ก ์‹คํŒจ: {response.text}")
    except Exception as e:
        print(f"Slack ์š”์ฒญ ์ค‘ ์˜ค๋ฅ˜: {e}")

def monitor_log():
    """๋กœ๊ทธ ํŒŒ์ผ ๋ชจ๋‹ˆํ„ฐ๋ง (tail -f)"""
    # ํŒŒ์ผ์ด ์—ด๋ฆด ๋•Œ๊นŒ์ง€ ๋Œ€๊ธฐ
    while not os.path.exists(PROMETHEUS_LOG):
        print("๋กœ๊ทธ ํŒŒ์ผ์„ ์ฐพ์„ ์ˆ˜ ์—†์Œ. ๋Œ€๊ธฐ ์ค‘...")
        time.sleep(5)

    with open(PROMETHEUS_LOG, "r") as f:
        # ๊ธฐ์กด ๋กœ๊ทธ๋Š” ๋ฌด์‹œํ•˜๊ณ , ์ƒˆ๋กœ์šด ๋กœ๊ทธ๋งŒ ๊ฐ์‹œ
        f.seek(0, os.SEEK_END)

        while True:
            line = f.readline()
            if not line:
                time.sleep(1)
                continue

            # error ํฌํ•จ๋œ ๋กœ๊ทธ๋งŒ ํ•„ํ„ฐ๋ง
            if "error" in line.lower():
                print(f"[ERROR DETECTED] {line.strip()}")
                send_slack_alert(line.strip())

if __name__ == "__main__":
    monitor_log()

โš ๏ธ **GitHub.com Fallback** โš ๏ธ