偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

部署一套完整的 Prometheus+Grafana 智能監(jiān)控告警系統(tǒng)

開(kāi)發(fā) 前端
現(xiàn)在你再遇到線(xiàn)上 Java 服務(wù)出問(wèn)題,不用再半夜瞎摸 —— 打開(kāi) Grafana 看圖表,能快速定位是 CPU 高了、內(nèi)存滿(mǎn)了還是 GC 頻繁;告警郵件會(huì)提前通知你,把問(wèn)題扼殺在萌芽里。

兄弟們,凌晨三點(diǎn),又是運(yùn)維兄弟的奪命連環(huán) call:“哥!線(xiàn)上 Java 服務(wù)崩了!日志刷得飛快,根本找不到哪兒出問(wèn)題!” 你揉著眼睛爬起來(lái)遠(yuǎn)程連服務(wù)器,CPU 飆到 100%、內(nèi)存滿(mǎn)了、JVM 堆溢出…… 一堆問(wèn)題堆在眼前,可因?yàn)闆](méi)監(jiān)控,連問(wèn)題啥時(shí)候開(kāi)始的都不知道。

這種 “兩眼一抹黑” 的崩潰時(shí)刻,我猜每個(gè) Java 開(kāi)發(fā) / 運(yùn)維都經(jīng)歷過(guò)。今天咱們就來(lái)搞個(gè) “運(yùn)維救星套餐”—— 把 Prometheus+Grafana 這套監(jiān)控告警系統(tǒng)從頭到尾搭明白,以后服務(wù)器、Java 應(yīng)用的風(fēng)吹草動(dòng),咱們都能提前知道,再也不用半夜被電話(huà)嚇醒!

先跟新手兄弟說(shuō)句大實(shí)話(huà):這倆工具聽(tīng)著挺唬人,其實(shí)就是 “采集數(shù)據(jù)的小弟(Prometheus)” 加 “畫(huà)圖表的大哥(Grafana)”,再配上 “喊人的喇叭(Alertmanager)”。咱們一步步來(lái),保證你看完就能上手,全程大白話(huà),不整那些繞人的技術(shù)黑話(huà)。

一、先把 “地基” 打牢:環(huán)境準(zhǔn)備

在搭系統(tǒng)前,咱們得先確認(rèn)服務(wù)器環(huán)境 —— 別跟我似的,當(dāng)年第一次搭的時(shí)候,服務(wù)器連 Docker 都沒(méi)裝,愣生生折騰了倆小時(shí)才發(fā)現(xiàn)問(wèn)題。這里我分兩種情況說(shuō):Linux 服務(wù)器(生產(chǎn)常用)和 Windows(本地測(cè)試用),你按需取用。

1.1 服務(wù)器基礎(chǔ)要求

不管啥系統(tǒng),至少滿(mǎn)足這幾點(diǎn):

  • 內(nèi)存:2G 以上(監(jiān)控 10 臺(tái)以?xún)?nèi)機(jī)器足夠,機(jī)器多就加內(nèi)存,Prometheus 吃?xún)?nèi)存)
  • 硬盤(pán):20G 以上(要存監(jiān)控?cái)?shù)據(jù),默認(rèn)存 15 天,不夠再擴(kuò))
  • 系統(tǒng):Linux 建議 CentOS 7+/Ubuntu 18+,Windows 建議 Win10/Server 2019
  • 網(wǎng)絡(luò):服務(wù)器之間能互通(比如 Prometheus 要連被監(jiān)控的 Java 服務(wù),端口得開(kāi))

1.2 依賴(lài)工具安裝(重點(diǎn)?。?/h4>

咱們用 Docker 部署,比源碼編譯簡(jiǎn)單 10 倍,新手別頭鐵去搞源碼!先裝 Docker 和 Docker Compose(管理多容器用)。

Linux 下裝 Docker(以 CentOS 7 為例)

直接復(fù)制命令就行,記得每步跑完看一眼有沒(méi)有 “success”:

# 先卸載舊版本(防止沖突,沒(méi)裝過(guò)也沒(méi)事)
sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine
# 裝依賴(lài)
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
# 設(shè)置Docker倉(cāng)庫(kù)(用阿里云的,快?。?sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 裝Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io
# 啟動(dòng)Docker并設(shè)為開(kāi)機(jī)啟動(dòng)
sudo systemctl start docker
sudo systemctl enable docker
# 驗(yàn)證是否裝好(出現(xiàn)版本號(hào)就成)
docker --version

然后裝 Docker Compose:

# 下載Compose(注意:如果報(bào)錯(cuò),把后面的版本號(hào)換成最新的,去官網(wǎng)查)
sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 給權(quán)限
sudo chmod +x /usr/local/bin/docker-compose
# 驗(yàn)證(出現(xiàn)版本號(hào)就OK)
docker-compose --version
Windows 下裝 Docker

去 Docker 官網(wǎng)下 “Docker Desktop”,一路下一步就行(記得勾上 “Add shortcut to desktop”)。裝完打開(kāi),等右下角圖標(biāo)變綠,打開(kāi)命令提示符(CMD)輸docker --version,能看到版本號(hào)就成。

這里插句嘴:Windows 家庭版可能會(huì)提示 “需要 WSL 2”,別慌,按提示去微軟商店裝個(gè) Ubuntu,再重啟 Docker 就好了,比當(dāng)年我裝雙系統(tǒng)簡(jiǎn)單多了。

二、第一步:把 “數(shù)據(jù)采集員” Prometheus 架起來(lái)

Prometheus 的核心工作就是 “定期去被監(jiān)控的機(jī)器 / 應(yīng)用上拿數(shù)據(jù)”—— 比如每隔 10 秒查一次 Linux 的 CPU 使用率,每隔 5 秒查一次 Java 服務(wù)的堆內(nèi)存。咱們先把它跑起來(lái),再慢慢配置。

2.1 先搞個(gè) “工作目錄”(別亂建文件夾?。?/h4>

不管 Linux 還是 Windows,先建個(gè)統(tǒng)一的目錄,比如/opt/prometheus-grafana(Linux)或D:\prometheus-grafana(Windows),所有配置文件都放這里,以后好找。

Linux 下建目錄:

mkdir -p /opt/prometheus-grafana/{prometheus,alertmanager,grafana}
cd /opt/prometheus-grafana

Windows 下直接在 D 盤(pán)右鍵新建文件夾,命名成 “prometheus-grafana”,再里面建三個(gè)子文件夾:prometheus、alertmanager、grafana。

2.2 寫(xiě) Prometheus 的配置文件(核心?。?/h4>

Prometheus 啟動(dòng)靠的是prometheus.yml這個(gè)配置文件,咱們先寫(xiě)個(gè)基礎(chǔ)版,能監(jiān)控它自己就行(先確保自身能跑,再監(jiān)控別的)。

在prometheus文件夾里新建prometheus.yml,內(nèi)容如下(我加了詳細(xì)注釋?zhuān)瑒e復(fù)制注釋里的 #號(hào)?。?/p>

# 全局配置(所有監(jiān)控任務(wù)都能用)
global:
  scrape_interval: 15s  # 每隔15秒采集一次數(shù)據(jù)(新手別設(shè)太短,會(huì)把服務(wù)器累死)
  evaluation_interval: 15s  # 每隔15秒評(píng)估一次告警規(guī)則
# 告警規(guī)則文件(后面配Alertmanager會(huì)用到,先空著)
rule_files:
  # - "alert_rules.yml"  # 注釋掉,后面再開(kāi)
# 監(jiān)控目標(biāo)配置(告訴Prometheus要監(jiān)控誰(shuí))
scrape_configs:
  # 監(jiān)控Prometheus自己(必填,先看自己活沒(méi)活)
  - job_name: "prometheus"  # 任務(wù)名,隨便起,好認(rèn)就行
    static_configs:
      - targets: ["localhost:9090"]  # 監(jiān)控地址,localhost就是自己,端口9090是Prometheus默認(rèn)端口

這里插個(gè)坑:如果你的 Prometheus 是用 Docker 跑的,localhost要改成 “容器名” 或 “宿主機(jī) IP”,別傻乎乎寫(xiě)localhost,到時(shí)候監(jiān)控不到還找不到原因(我當(dāng)年踩過(guò)這個(gè)坑,查了半小時(shí)日志)。

2.3 用 Docker 啟動(dòng) Prometheus

咱們用 Docker Compose 來(lái)啟動(dòng),比單獨(dú)用 docker run 方便,以后重啟、停止都一鍵搞定。

在/opt/prometheus-grafana(Linux)或D:\prometheus-grafana(Windows)目錄下,新建docker-compose.yml文件,內(nèi)容如下:

version: '3.8'  # Compose版本,跟你裝的版本匹配就行
services:
  # Prometheus服務(wù)
  prometheus:
    image: prom/prometheus:v2.47.0  # 用2.47.0版本,穩(wěn)定!別用latest,容易出兼容問(wèn)題
    container_name: prometheus  # 容器名,好記
    restart: always  # 開(kāi)機(jī)自啟,服務(wù)器重啟后不用手動(dòng)開(kāi)
    ports:
      - "9090:9090"  # 端口映射:宿主機(jī)9090端口 -> 容器9090端口
    volumes:
      # 把本地的配置文件掛載到容器里(改本地文件,容器里就生效)
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      # 把監(jiān)控?cái)?shù)據(jù)掛載到本地(防止容器刪了數(shù)據(jù)丟了)
      - ./prometheus/data:/prometheus/data
    command:
      # 告訴Prometheus用哪個(gè)配置文件,以及數(shù)據(jù)存哪里
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus/data'
      - '--storage.tsdb.retention.time=15d'  # 數(shù)據(jù)保留15天,夠了,多了占硬盤(pán)

然后啟動(dòng)!在當(dāng)前目錄下執(zhí)行命令:

# Linux下
docker-compose up -d
# Windows下(打開(kāi)CMD,進(jìn)入D:\prometheus-grafana目錄,再執(zhí)行)
docker-compose up -d

執(zhí)行完后,輸docker ps(Linux)或在 Docker Desktop 里看,能看到prometheus容器狀態(tài)是 “Up” 就成了。

2.4 驗(yàn)證 Prometheus 是否跑通

打開(kāi)瀏覽器,輸入http://你的服務(wù)器IP:9090(比如 Linux 服務(wù)器 IP 是 192.168.1.100,就輸http://192.168.1.100:9090)。

能看到 Prometheus 的界面,點(diǎn)擊頂部 “Status”→“Targets”,如果 “prometheus” 那一行的 “State” 是 “UP”,說(shuō)明沒(méi)問(wèn)題!如果是 “DOWN”,別慌,先檢查端口是不是被占用了(Linux 用netstat -tuln | grep 9090,Windows 用netstat -ano | findstr 9090),再看看配置文件里的 targets 對(duì)不對(duì)。

三、第二步:給 Java 應(yīng)用裝 “監(jiān)控插件”(重點(diǎn)?。?/h3>

咱們是 Java 技術(shù)號(hào),監(jiān)控 Linux 服務(wù)器只是基礎(chǔ),重點(diǎn)是監(jiān)控 Java 應(yīng)用 —— 比如 Spring Boot 服務(wù)的 JVM 堆內(nèi)存、GC 次數(shù)、接口響應(yīng)時(shí)間這些。這時(shí)候得用 “JMX Exporter” 這個(gè)工具,它能把 Java 應(yīng)用的 JVM 指標(biāo)轉(zhuǎn)成 Prometheus 能認(rèn)的格式。

3.1 下載 JMX Exporter

JMX Exporter 是個(gè) JAR 包,直接從 GitHub 下載:https://github.com/prometheus/jmx_exporter/releases 。找最新的 “jmx_prometheus_javaagent-xxx.jar”,比如 “jmx_prometheus_javaagent-0.19.0.jar”。

下載后,放到被監(jiān)控的 Java 應(yīng)用服務(wù)器上,比如/opt/jmx-exporter(Linux)或D:\jmx-exporter(Windows)目錄下。

3.2 寫(xiě) JMX Exporter 的配置文件

在同一個(gè)目錄下,新建config.yml文件,內(nèi)容如下(這個(gè)配置能監(jiān)控大部分 JVM 指標(biāo),夠用了):

lowercaseOutputLabelNames: true
lowercaseOutputName: true
rules:
  - pattern: 'java.lang<type=Memory><HeapMemoryUsage>(\w+):'
    name: jvm_memory_heap_usage_$1
    type: GAUGE
  - pattern: 'java.lang<type=Memory><NonHeapMemoryUsage>(\w+):'
    name: jvm_memory_nonheap_usage_$1
    type: GAUGE
  - pattern: 'java.lang<type=GarbageCollector, name=(\w+)><CollectionCount>:'
    name: jvm_gc_collection_count_$1
    type: COUNTER
  - pattern: 'java.lang<type=GarbageCollector, name=(\w+)><CollectionTime>:'
    name: jvm_gc_collection_time_$1
    type: COUNTER
  - pattern: 'java.lang<type=Threading><ThreadCount>:'
    name: jvm_thread_count
    type: GAUGE

簡(jiǎn)單解釋下:這個(gè)配置告訴 JMX Exporter,要把 JVM 的堆內(nèi)存、非堆內(nèi)存、GC 次數(shù)、線(xiàn)程數(shù)這些指標(biāo)抓出來(lái),起個(gè) Prometheus 能認(rèn)的名字(比如jvm_memory_heap_usage_used就是堆內(nèi)存已用大?。?。

3.3 給 Java 應(yīng)用加啟動(dòng)參數(shù)(關(guān)鍵?。?/h4>

不管你的 Java 應(yīng)用是用java -jar啟動(dòng),還是用 Tomcat 部署,都要加個(gè) JVM 啟動(dòng)參數(shù),讓 JMX Exporter 跟著應(yīng)用一起跑。

比如你的 Spring Boot 應(yīng)用 JAR 包叫demo.jar,啟動(dòng)命令就改成這樣:

# Linux下(注意路徑要對(duì)?。?java -javaagent:/opt/jmx-exporter/jmx_prometheus_javaagent-0.19.0.jar=9100:/opt/jmx-exporter/config.yml -jar demo.jar
# Windows下(路徑用反斜杠,或者雙斜杠)
java -javaagent:D:\jmx-exporter\jmx_prometheus_javaagent-0.19.0.jar=9100:D:\jmx-exporter\config.yml -jar demo.jar

這里的9100是 JMX Exporter 的端口,以后 Prometheus 就從這個(gè)端口拿 Java 應(yīng)用的指標(biāo)。記住這個(gè)端口,后面要用到!啟動(dòng)后,驗(yàn)證一下:用瀏覽器訪(fǎng)問(wèn)http://Java應(yīng)用服務(wù)器IP:9100/metrics,能看到一堆以jvm_開(kāi)頭的指標(biāo),就說(shuō)明 JMX Exporter 跑通了。

3.4 讓 Prometheus 監(jiān)控 Java 應(yīng)用

回到 Prometheus 的prometheus.yml文件,在scrape_configs里加一個(gè)監(jiān)控任務(wù):

scrape_configs:
  # 原來(lái)的prometheus監(jiān)控任務(wù)保留
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]
  
  # 新增:監(jiān)控Java應(yīng)用
  - job_name: "java_app"  # 任務(wù)名,叫java_app好認(rèn)
    static_configs:
      # 這里填Java應(yīng)用服務(wù)器的IP和JMX Exporter的端口,多個(gè)應(yīng)用用逗號(hào)分隔
      - targets: ["192.168.1.101:9100", "192.168.1.102:9100"]
    scrape_interval: 10s  # Java應(yīng)用指標(biāo)變化快,采集間隔設(shè)短點(diǎn),10秒一次

改完配置文件后,重啟 Prometheus 讓配置生效:

# Linux下(在docker-compose.yml所在目錄)
docker-compose restart prometheus

# Windows下同理
docker-compose restart prometheus

再去 Prometheus 的 Targets 頁(yè)面(http:// 服務(wù)器 IP:9090/targets),能看到 “java_app” 任務(wù)下的目標(biāo)狀態(tài)是 “UP”,就說(shuō)明 Prometheus 能拿到 Java 應(yīng)用的指標(biāo)了!這里再插個(gè)坑:如果是云服務(wù)器(比如阿里云、騰訊云),要在安全組里開(kāi) 9100 端口,不然 Prometheus 連不上 —— 我之前幫朋友搭的時(shí)候,查了一小時(shí)才發(fā)現(xiàn)是安全組沒(méi)開(kāi),血的教訓(xùn)!

四、第三步:用 Grafana 把數(shù)據(jù) “畫(huà)成畫(huà)”(可視化核心)

Prometheus 采集的數(shù)據(jù)是一堆文字,看著頭疼 ——Grafana 就是來(lái)解決這個(gè)問(wèn)題的,它能把文字轉(zhuǎn)成漂亮的圖表,比如 CPU 使用率曲線(xiàn)、JVM 內(nèi)存餅圖,一眼就能看出問(wèn)題。

4.1 用 Docker 啟動(dòng) Grafana

還是在docker-compose.yml里加 Grafana 的配置,完整的docker-compose.yml現(xiàn)在長(zhǎng)這樣:

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:v2.47.0
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/data:/prometheus/data
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus/data'
      - '--storage.tsdb.retention.time=15d'

  # 新增Grafana服務(wù)
  grafana:
    image: grafana/grafana:10.1.2  # 10.x版本穩(wěn)定,界面也好看
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"  # Grafana默認(rèn)端口3000
    volumes:
      # 掛載數(shù)據(jù)目錄,防止容器刪了配置丟了
      - ./grafana/data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=123456  # 管理員密碼,第一次登錄用,后面可以改
      - GF_USERS_ALLOW_SIGN_UP=false # 禁止注冊(cè),防止別人亂注冊(cè)
    depends_on:
      - prometheus # 先啟動(dòng)Prometheus,再啟動(dòng)Grafana

然后啟動(dòng) Grafana(如果之前已經(jīng)啟動(dòng)了 Prometheus,直接執(zhí)行這個(gè)命令就行):

docker-compose up -d

啟動(dòng)后,用瀏覽器訪(fǎng)問(wèn)http://服務(wù)器IP:3000,第一次登錄用戶(hù)名是admin,密碼是剛才配置的123456,登錄后會(huì)讓你改密碼,改成自己好記的(別用 123456,生產(chǎn)環(huán)境要復(fù)雜點(diǎn))。

4.2 給 Grafana 加 Prometheus 數(shù)據(jù)源

Grafana 要畫(huà)圖,得先知道數(shù)據(jù)從哪兒來(lái) —— 也就是把 Prometheus 設(shè)為數(shù)據(jù)源。

步驟如下(跟著點(diǎn)就行,很簡(jiǎn)單):

  1. 登錄后,點(diǎn)擊左側(cè) “Configuration”(齒輪圖標(biāo))→“Data Sources”;
  2. 點(diǎn)擊 “Add data source”,搜索 “Prometheus”,選中它;
  3. 在 “HTTP”→“URL” 里填http://prometheus:9090(因?yàn)橛?Docker Compose,容器間能通過(guò)容器名訪(fǎng)問(wèn),不用寫(xiě) IP);
  4. 其他默認(rèn),拉到最下面點(diǎn)擊 “Save & Test”,出現(xiàn) “Data source is working” 就成了!

這里再插個(gè)坑:如果你的 Grafana 和 Prometheus 不在同一臺(tái)服務(wù)器,URL 要填http://Prometheus服務(wù)器IP:9090,還要確保兩臺(tái)服務(wù)器能通 9090 端口。

4.3 導(dǎo)入現(xiàn)成的 Dashboard(不用自己畫(huà)?。?/h4>

Grafana 有個(gè) “Dashboard 市場(chǎng)”,里面有無(wú)數(shù)現(xiàn)成的圖表模板,咱們不用自己從零開(kāi)始畫(huà),直接導(dǎo)入就行,省時(shí)間還專(zhuān)業(yè)。

4.3.1 導(dǎo)入 Linux 服務(wù)器監(jiān)控 Dashboard

先搞個(gè) Linux 監(jiān)控的,看服務(wù)器 CPU、內(nèi)存、磁盤(pán)這些。

  1. 打開(kāi) Grafana,左側(cè)點(diǎn)擊 “Dashboards”→“Browse”;
  2. 點(diǎn)擊右上角 “Import”,在 “Import via grafana.com” 里輸入模板 ID:8919(這個(gè)是官方推薦的 Linux 監(jiān)控模板,超全);
  3. 點(diǎn)擊 “Load”,然后在 “Data source” 里選擇咱們剛才加的 “Prometheus”,點(diǎn)擊 “Import”;
  4. 搞定!現(xiàn)在能看到 Linux 服務(wù)器的 CPU 使用率、內(nèi)存使用率、磁盤(pán) IO、網(wǎng)絡(luò)流量這些圖表,實(shí)時(shí)更新,賊直觀(guān)。
4.3.2 導(dǎo)入 Java 應(yīng)用監(jiān)控 Dashboard

重點(diǎn)來(lái)了,Java 應(yīng)用的 JVM 監(jiān)控模板,用這個(gè) ID:4701(這個(gè)模板能監(jiān)控堆內(nèi)存、非堆內(nèi)存、GC 次數(shù)、線(xiàn)程數(shù),Java 開(kāi)發(fā)者必備)。

  1. 同樣點(diǎn)擊 “Import”,輸入4701,點(diǎn)擊 “Load”;
  2. 選擇 Prometheus 數(shù)據(jù)源,點(diǎn)擊 “Import”;
  3. 現(xiàn)在能看到 Java 應(yīng)用的 JVM 堆內(nèi)存使用情況、GC 時(shí)間、線(xiàn)程數(shù)這些關(guān)鍵指標(biāo)了!比如 “JVM Heap Memory Usage” 圖表,能清楚看到堆內(nèi)存的已用、空閑、最大大小,再也不用靠jstat命令看一堆數(shù)字了。

這里給個(gè)小技巧:把常用的 Dashboard 設(shè)為 “Home Dashboard”,下次登錄直接看。方法是:打開(kāi) Dashboard,點(diǎn)擊右上角 “Star”(星標(biāo)),然后點(diǎn)擊左側(cè) “Dashboards”→“Home”,就能看到了。

五、第四步:搭告警系統(tǒng)(有問(wèn)題早通知?。?/h3>

光監(jiān)控還不夠,得有問(wèn)題的時(shí)候主動(dòng)通知咱們 —— 比如 CPU 超過(guò) 80%、Java 應(yīng)用堆內(nèi)存超過(guò) 90%,這時(shí)候 Alertmanager 就要上場(chǎng)了,它能把 Prometheus 的告警信息發(fā)給郵件、釘釘、企業(yè)微信。

5.1 啟動(dòng) Alertmanager

先在docker-compose.yml里加 Alertmanager 的配置,完整文件如下:

version: '3.8'

services:
  prometheus:
    image: prom/prometheus:v2.47.0
    container_name: prometheus
    restart: always
    ports:
      - "9090:9090"
    volumes:
      - ./prometheus/prometheus.yml:/etc/prometheus/prometheus.yml
      - ./prometheus/alert_rules.yml:/etc/prometheus/alert_rules.yml # 新增告警規(guī)則文件
      - ./prometheus/data:/prometheus/data
    command:
      - '--config.file=/etc/prometheus/prometheus.yml'
      - '--storage.tsdb.path=/prometheus/data'
      - '--storage.tsdb.retention.time=15d'
    depends_on:
      - alertmanager # 先啟動(dòng)Alertmanager

  grafana:
    image: grafana/grafana:10.1.2
    container_name: grafana
    restart: always
    ports:
      - "3000:3000"
    volumes:
      - ./grafana/data:/var/lib/grafana
    environment:
      - GF_SECURITY_ADMIN_PASSWORD=123456
      - GF_USERS_ALLOW_SIGN_UP=false
    depends_on:
      - prometheus

  # 新增Alertmanager服務(wù)
  alertmanager:
    image: prom/alertmanager:v0.26.0
    container_name: alertmanager
    restart: always
    ports:
      - "9093:9093"  # Alertmanager默認(rèn)端口9093
    volumes:
      - ./alertmanager/alertmanager.yml:/etc/alertmanager/alertmanager.yml # 告警配置文件
    command:
      - '--config.file=/etc/alertmanager/alertmanager.yml'

5.2 寫(xiě) Alertmanager 配置文件(以郵件告警為例)

在alertmanager文件夾里新建alertmanager.yml文件,內(nèi)容如下(我用 QQ 郵箱舉例,其他郵箱類(lèi)似):

global:
  # 郵件配置
smtp_smarthost: 'smtp.qq.com:465'  # QQ郵箱SMTP服務(wù)器,端口465(SSL)
smtp_from: '你的QQ郵箱@qq.com'  # 發(fā)件人郵箱
smtp_auth_username: '你的QQ郵箱@qq.com'  # 用戶(hù)名
smtp_auth_password: '你的QQ郵箱授權(quán)碼'  # 不是QQ密碼!是授權(quán)碼,去QQ郵箱設(shè)置里開(kāi)
smtp_require_tls: false # QQ郵箱SSL不用TLS,設(shè)為false

# 路由配置(告警往哪兒發(fā))
route:
group_by: ['alertname'] # 按告警名分組,比如同是CPU告警的放一組
group_wait: 10s  # 組內(nèi)第一個(gè)告警觸發(fā)后,等10秒再發(fā),防止頻繁告警
group_interval: 1m # 同一組告警,每隔1分鐘發(fā)一次
repeat_interval: 1h # 同一告警,1小時(shí)內(nèi)只發(fā)一次,避免刷屏
receiver: 'email_receiver'  # 默認(rèn)發(fā)給email_receiver這個(gè)接收器

# 接收器配置(誰(shuí)接收告警)
receivers:
- name: 'email_receiver'
email_configs:
  - to: '接收人郵箱@xxx.com'  # 比如你的工作郵箱
    send_resolved: true # 問(wèn)題解決后,發(fā)“已恢復(fù)”的通知

# 抑制規(guī)則(避免重復(fù)告警)
inhibit_rules:
  - source_match:
      severity: 'critical'  # 當(dāng)有緊急告警時(shí)
    target_match:
      severity: 'warning'  # 抑制警告級(jí)別的告警
    equal: ['alertname', 'instance'] # 按告警名和實(shí)例名匹配

這里重點(diǎn)說(shuō)下 QQ 郵箱授權(quán)碼怎么弄:

  1. 登錄 QQ 郵箱,點(diǎn)擊頂部 “設(shè)置”→“賬戶(hù)”;
  2. 拉到 “POP3/IMAP/SMTP/Exchange/CardDAV/CalDAV 服務(wù)”,開(kāi)啟 “IMAP/SMTP 服務(wù)”;
  3. 點(diǎn)擊 “生成授權(quán)碼”,用手機(jī)掃碼,得到的字符串就是smtp_auth_password,別填 QQ 密碼!

5.3 寫(xiě) Prometheus 告警規(guī)則

在prometheus文件夾里新建alert_rules.yml文件,定義什么時(shí)候觸發(fā)告警。咱們寫(xiě)幾個(gè)常用的規(guī)則:

groups:
- name: 服務(wù)器監(jiān)控告警
rules:
  # 1. CPU使用率超過(guò)80%,持續(xù)5分鐘
  - alert: 服務(wù)器CPU使用率過(guò)高
    expr: 100 - (avg(irate(node_cpu_seconds_total{mode="idle"}[5m])) by (instance) * 100) > 80
    for: 5m
    labels:
      severity: warning # 告警級(jí)別:warning(警告)、critical(緊急)
    annotations:
      summary: "服務(wù)器{{ $labels.instance }} CPU使用率過(guò)高"
      description: "服務(wù)器{{ $labels.instance }} CPU使用率已超過(guò)80%,當(dāng)前值:{{ $value | round 2 }}%,已持續(xù)5分鐘"

  # 2. 內(nèi)存使用率超過(guò)90%,持續(xù)5分鐘
  - alert: 服務(wù)器內(nèi)存使用率過(guò)高
    expr: 100 - (node_memory_Available_bytes / node_memory_Total_bytes * 100) > 90
    for: 5m
    labels:
      severity: critical
    annotations:
      summary: "服務(wù)器{{ $labels.instance }} 內(nèi)存使用率過(guò)高"
      description: "服務(wù)器{{ $labels.instance }} 內(nèi)存使用率已超過(guò)90%,當(dāng)前值:{{ $value | round 2 }}%,已持續(xù)5分鐘"

- name: Java應(yīng)用監(jiān)控告警
rules:
  # 3. Java堆內(nèi)存使用率超過(guò)90%,持續(xù)3分鐘
  - alert: Java應(yīng)用堆內(nèi)存使用率過(guò)高
    expr: jvm_memory_heap_usage_used / jvm_memory_heap_usage_max * 100 > 90
    for: 3m
    labels:
      severity: critical
    annotations:
      summary: "Java應(yīng)用{{ $labels.instance }} 堆內(nèi)存使用率過(guò)高"
      description: "Java應(yīng)用{{ $labels.instance }} 堆內(nèi)存使用率已超過(guò)90%,當(dāng)前值:{{ $value | round 2 }}%,已持續(xù)3分鐘"

  # 4. Java線(xiàn)程數(shù)超過(guò)200,持續(xù)3分鐘
  - alert: Java應(yīng)用線(xiàn)程數(shù)過(guò)多
    expr: jvm_thread_count > 200
    for: 3m
    labels:
      severity: warning
    annotations:
      summary: "Java應(yīng)用{{ $labels.instance }} 線(xiàn)程數(shù)過(guò)多"
      description: "Java應(yīng)用{{ $labels.instance }} 線(xiàn)程數(shù)已超過(guò)200,當(dāng)前值:{{ $value | round 0 }},已持續(xù)3分鐘"

簡(jiǎn)單解釋下:

  • expr:告警觸發(fā)的條件,比如jvm_memory_heap_usage_used / jvm_memory_heap_usage_max * 100 > 90就是堆內(nèi)存使用率超過(guò) 90%;
  • for:持續(xù)多久才觸發(fā)告警,避免瞬時(shí)峰值誤報(bào);
  • annotations:告警內(nèi)容,{{ $labels.instance }}是被監(jiān)控的實(shí)例 IP,{{ $value }}是當(dāng)前指標(biāo)值。

5.4 讓 Prometheus 用告警規(guī)則和 Alertmanager

回到prometheus.yml文件,修改兩處:

  • 打開(kāi)rule_files,指定告警規(guī)則文件;
  • 加alerting配置,告訴 Prometheus 告警發(fā)給 Alertmanager。

修改后的prometheus.yml如下:

global:
scrape_interval: 15s
evaluation_interval: 15s

# 打開(kāi)告警規(guī)則文件
rule_files:
  - "alert_rules.yml"

# 新增:告訴Prometheus Alertmanager的地址
alerting:
alertmanagers:
  - static_configs:
    - targets: ["alertmanager:9093"] # Docker Compose用容器名訪(fǎng)問(wèn)

scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]

  - job_name: "java_app"
    static_configs:
      - targets: ["192.168.1.101:9100", "192.168.1.102:9100"]
    scrape_interval: 10s

  # 新增:監(jiān)控Linux服務(wù)器(需要裝node_exporter,下面說(shuō))
  - job_name: "linux_server"
    static_configs:
      - targets: ["192.168.1.100:9100", "192.168.1.101:9100"]
    scrape_interval: 15s

這里注意:監(jiān)控 Linux 服務(wù)器需要裝node_exporter(和 JMX Exporter 類(lèi)似,采集 Linux 系統(tǒng)指標(biāo)),步驟很簡(jiǎn)單:

  • 下載 node_exporter:https://github.com/prometheus/node_exporter/releases ;
  • 解壓后啟動(dòng):./node_exporter(默認(rèn)端口 9100);
  • 加到 Prometheus 的 scrape_configs 里,就像上面的 “l(fā)inux_server” 任務(wù)。

5.5 測(cè)試告警是否生效

咱們手動(dòng)觸發(fā)一個(gè)告警來(lái)測(cè)試,比如把 Linux 服務(wù)器的 CPU 使用率打滿(mǎn):

# Linux下執(zhí)行這個(gè)命令,會(huì)讓CPU使用率飆升
stress --cpu 4 --timeout 60s

然后等 5 分鐘(因?yàn)楦婢?guī)則里for:5m),如果配置沒(méi)問(wèn)題,你會(huì)收到郵件告警,內(nèi)容里會(huì)寫(xiě)清楚哪個(gè)服務(wù)器、CPU 使用率多少、持續(xù)了多久。問(wèn)題解決后(stress 命令結(jié)束),還會(huì)收到 “已恢復(fù)” 的郵件。也可以在 Alertmanager 的界面看告警狀態(tài):訪(fǎng)問(wèn)http://服務(wù)器IP:9093,能看到當(dāng)前的告警和歷史告警。

六、進(jìn)階優(yōu)化:讓監(jiān)控系統(tǒng)更穩(wěn)、更高效

到這里,基礎(chǔ)的監(jiān)控告警系統(tǒng)已經(jīng)搭好了,但生產(chǎn)環(huán)境用還得優(yōu)化一下,比如數(shù)據(jù)存更久、支持更多機(jī)器、防止單點(diǎn)故障。

6.1 存儲(chǔ)優(yōu)化:數(shù)據(jù)存更久,不占滿(mǎn)硬盤(pán)

Prometheus 默認(rèn)存 15 天數(shù)據(jù),要是想存 30 天,改docker-compose.yml里的--storage.tsdb.retention.time=30d就行。如果數(shù)據(jù)量很大,比如監(jiān)控 100 臺(tái)機(jī)器,建議用遠(yuǎn)程存儲(chǔ),比如 InfluxDB 或 Thanos,把數(shù)據(jù)存在專(zhuān)門(mén)的數(shù)據(jù)庫(kù)里,Prometheus 只負(fù)責(zé)采集。

6.2 性能優(yōu)化:減少資源占用

  • 調(diào)整 scrape 間隔:不是所有指標(biāo)都要 10 秒采一次,比如磁盤(pán)使用率 1 分鐘采一次就行,在 scrape_configs 里加scrape_interval: 60s;
  • 過(guò)濾無(wú)用指標(biāo):用relabel_configs過(guò)濾掉不需要的指標(biāo),比如 Java 應(yīng)用的某些冷門(mén) JVM 指標(biāo),減少數(shù)據(jù)量。示例:
- job_name: "java_app"
  static_configs:
    - targets: ["192.168.1.101:9100"]
  # 過(guò)濾掉jvm_memory_pool_開(kāi)頭的指標(biāo)
  relabel_configs:
    - source_labels: [__name__]
      regex: 'jvm_memory_pool_.*'
      action: drop

6.3 高可用:防止 Prometheus 掛了

生產(chǎn)環(huán)境不能只有一個(gè) Prometheus,萬(wàn)一它掛了,整個(gè)監(jiān)控就廢了??梢愿阒鲝募軜?gòu):

  1. 部署兩個(gè) Prometheus,一個(gè)主(負(fù)責(zé)采集和告警),一個(gè)從(只采集,備用);
  2. 用 Consul 或 etcd 做服務(wù)發(fā)現(xiàn),自動(dòng)發(fā)現(xiàn)被監(jiān)控的目標(biāo);
  3. 當(dāng)主 Prometheus 掛了,從的自動(dòng)接管,保證監(jiān)控不中斷。

七、總結(jié):從 0 到 1 的監(jiān)控系統(tǒng)搭建之路

咱們從環(huán)境準(zhǔn)備到最后優(yōu)化,把 Prometheus+Grafana+Alertmanager 這套監(jiān)控告警系統(tǒng)完整搭了一遍,核心流程其實(shí)就三步:

  1. Prometheus 采集數(shù)據(jù)(用 JMX Exporter/node_exporter);
  2. Grafana 可視化數(shù)據(jù)(導(dǎo)入現(xiàn)成 Dashboard);
  3. Alertmanager 發(fā)送告警(郵件 / 釘釘 / 企業(yè)微信)。

現(xiàn)在你再遇到線(xiàn)上 Java 服務(wù)出問(wèn)題,不用再半夜瞎摸 —— 打開(kāi) Grafana 看圖表,能快速定位是 CPU 高了、內(nèi)存滿(mǎn)了還是 GC 頻繁;告警郵件會(huì)提前通知你,把問(wèn)題扼殺在萌芽里。

責(zé)任編輯:武曉燕 來(lái)源: 石杉的架構(gòu)筆記
相關(guān)推薦

2022-07-29 21:23:54

Grafana微服務(wù)

2023-02-28 22:52:47

2020-12-30 05:34:25

監(jiān)控PrometheusGrafana

2009-03-03 13:00:00

虛擬化技術(shù)vmwarexen

2023-10-23 12:31:40

2022-07-28 06:50:52

微服務(wù)業(yè)務(wù)系統(tǒng)

2023-03-03 17:00:00

部署Linux內(nèi)核

2025-02-21 08:17:13

2024-04-09 08:00:00

Kubernetes管理系統(tǒng)云原生

2025-08-27 04:00:00

2019-02-20 10:22:20

監(jiān)控HDFSHadoop

2025-08-27 07:22:12

自定義接口Prometheus

2021-05-27 07:12:19

單點(diǎn)登錄系統(tǒng)

2022-05-05 07:25:03

Supervisor監(jiān)控Python

2020-11-20 08:15:40

Grafana + P

2023-11-21 08:57:16

2023-12-20 08:13:54

K8S監(jiān)控管理

2023-11-13 08:15:36

2025-04-27 03:00:00

Spring流程業(yè)務(wù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)