使用Prometheus / Loki / Grafana来监视指标和日志
首先
由于对监控工具成本的重新评估,公司内部正在考虑和引入使用开源软件的监控工具。为了深入理解,首先在验证环境中进行实际构建,以增加个人的理解。
我想做的事情
使用监控服务器(Grafana仪表盘)可视化以下监控目标服务器的指标和日志。
-
- CPU使用率
-
- メモリ使用率
-
- sshdプロセスの死活監視
-
- /var/log/messagesのログ
- /var/log/crondのログ
简略图
项目的结果
在这次验证中,我们使用Grafana创建了下图所示的日志和度量指标的仪表盘,使其可以进行可视化。
确认术语
监视的三大支柱
日志
- サービスやアプリケーションから吐き出される特定のコードブロックが実行されたときにシステムが生成する単なるテキスト行
度量衡系统
- 定期的にグループ化または収集された測定値の集合。特定の期間のデータの集合
追踪 (zhuī
- マイクロサービスエコシステムの異なるコンポーネント間のイベント(またはトランザクション)の因果連鎖のサンプル。命令の実行を順番にたどって各段階の状態・状況を確認する作業をトレースという。
请参考以下链接:
https://newrelic.com/jp/blog/how-to-relic/metrics-events-logs-and-traces
https://e-words.jp/w/%E3%83%88%E3%83%AC%E3%83%BC%E3%82%B9.html
工具
普罗米修斯
- サービスやアプリケーションのメトリクスを収集し、可視化することができるツール
洛基
- ログ収集およびクエリシステム
Grafana = 图纳
- データの可視化ツール
节点导出器
-
- メトリクスを収集するためのツール
- 転送はpull型で監視サーバ側の設定でprometheusから被監視サーバのNoe Exporterの情報を取得する設定を入れる
出口程序
-
- プロセスの状態を収集するためのツール
- 転送はpull型で監視サーバ側の設定でprometheusから被監視サーバのProcess Exporterの情報を取得する設定を入れる
Promtail 是一个日志收集和传输工具。
-
- ログを転送するツール
- 転送はpush型で被監視サーバから監視サーバに向けてログを転送する設定をいれる
组成
监视服务器和被监视服务器将按照以下配置进行创建。
・Process Exporter
・Promtail監視サーバ172.16.10.106t2.large・Grafana
・Loki
・Prometheus
设定步骤
首先
为了避免管理变得复杂,可以按照以下目录结构进行源代码的下载和部署。
# ソースのダウンロード用ディレクトリ
# e.g. /usr/local/src/prometheus
/usr/local/src/[ツール名]
# バイナリの配置先
/usr/bin
# コンフィグの格納用ディレクトリ
# e.g. /etc/prometheus
/etc/[ツール名]
被监视服务器设置
在被监视的服务器上(172.16.10.125)进行以下三项设置。
-
- node exporter
-
- process exporter
- promtail
安装Node Exporter
请在以下网址下载并安装最新版本:
https://github.com/prometheus/node_exporter/releases
# ソースダウンロード用ディレクトリの作成
$ mkdir /usr/local/src/prometheus
# ソースダウンロード用ディレクトリに移動
$ cd /usr/local/src/prometheus
# ソースの圧縮ファイルをダウンロード
$ wget https://github.com/prometheus/node_exporter/releases/download/v0.16.0/node_exporter-0.16.0.linux-amd64.tar.gz
# 圧縮ファイルの解凍
$ tar zxvf node_exporter-0.16.0.linux-amd64.tar.gz
# /usr/binに格納
$ cp -r node_exporter-0.16.0.linux-amd64 /usr/bin
创建启动脚本
vi /usr/lib/systemd/system/prometheus-node-exporter.service
[Unit]
Description=Node Exporter
Documentation=https://github.com/prometheus/node_exporter
[Service]
Type=simple
ExecStart=/usr/bin/prometheus/node_exporter/node_exporter $OPTIONS
Restart=always
[Install]
WantedBy=multi-user.target
启动和运行测试
# デーモンのリロード
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable prometheus-node-exporter.service
# 起動
$ systemctl start prometheus-node-exporter.service
# ステータス確認
$ systemctl status prometheus-node-exporter.service
尝试访问node exporter的API。
curl localhost:9100/metrics
安装进程导出器。
请从下方链接下载最新版本
https://github.com/ncabatoff/process-exporter/releases/tag/v0.7.10/process-exporter-0.7.10.linux-386.tar.gz
# ソースダウンロード用ディレクトリの作成
$ mkdir /usr/local/src/process-exporter
# ソースダウンロード用ディレクトリに移動
$ cd /usr/local/src/process-exporter
# ソースの圧縮ファイルをダウンロード
$ wget https://github.com/ncabatoff/process-exporter/releases/download/v0.7.10/process-exporter-0.7.10.linux-amd64.tar.gz
# 圧縮ファイルの解凍
$ tar zxvf process-exporter-0.7.10.linux-amd64.tar.gz
# process exporter本体を自動起動するソース配下へコピー
$ cp -r /usr/local/src/process-exporter /usr/bin
# process exporter設定ファイルの配置
## コンフィグの格納用ディレクトリ作成
$ mkdir /etc/process-exporter
## コンフィグの作成
$ vi /etc/process-exporter/process-exporterconfig.yml
将下列脚本写入/etc/process-exporter/process-exporterconfig.yml文件中。
# comm is the second field of /proc/<pid>/stat minus parens.
# It is the base executable name, truncated at 15 chars.
# It cannot be modified by the program, unlike exe.
process_names:
- cmdline:
- .+
制作启动脚本
[Unit]
Description=Process Exporter
Documentation=https://github.com/ncabatoff/process-exporter
[Service]
Type=simple
ExecStart=/usr/bin/process-exporter \
-config.path /etc/process-exporter/config.yml
[Install]
WantedBy=multi-user.target
开始运行和确认操作
# デーモンのリロード
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable process-exporter.service
# 起動
$ systemctl start process-exporter.service
# ステータス確認
$ systemctl status process-exporter.service
尝试调用进程导出器的API
curl localhost:9256/metrics
安装promtail。
# ソースダウンロード用ディレクトリの作成
$ mkdir /usr/local/src/promtail
# ソースダウンロード用ディレクトリに移動
$ cd /usr/local/src/promtail
$ ソースの圧縮ファイルをダウンロード
$ curl -O -L "https://github.com/grafana/loki/releases/download/v2.4.1/promtail-linux-amd64.zip"
# 圧縮ファイルの解凍
$ unzip "promtail-linux-amd64.zip"
# 実行権限を付与
$ chmod a+x "promtail-linux-amd64.zip"
# /usr/binにコピー
$ cp -r /usr/local/src/promtail/promtail-linux-amd64 /usr/bin
下载config文件
# コンフィグ格納用ディレクトリの作成
$ mkdir /etc/promtail
# コンフィグ格納用ディレクトリに移動
$ cd /etc/promtail
# コンフィグのダウンロード
$ wget https://raw.githubusercontent.com/grafana/loki/main/clients/cmd/promtail/promtail-local-config.yaml
修改配置
-
- localhostから監視サーバへ送信先を変更
- /var/log/messagesと/var/log/crondのログを収集するように設定
server:
http_listen_port: 9080
grpc_listen_port: 0
positions:
filename: /tmp/positions.yam
clients:
- url: http://172.16.10.106:3100/loki/api/v1/push
scrape_configs:
- job_name: system
static_configs:
- targets:
- localhost
labels:
job: varlogs
__path__: /var/log/messages
- job_name: cron
static_configs:
- targets:
- localhost
labels:
job: cronlogs
__path__: /var/log/cron
创建启动脚本
[Unit]
Description=Promtail
Documentation=https://github.com/grafana/loki/releases/
[Service]
Type=simple
ExecStart=/usr/bin/promtail-linux-amd64 \
--config.file=/etc/promtail/promtail-local-config.yaml
[Install]
WantedBy=multi-user.target
启动和操作确认
# デーモンの再起動
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable promtail.service
# 起動
$ systemctl start promtail.service
# ステータス確認
$ systemctl status promtail.service
尝试从本地向Promtail发出API请求
curl localhost:9080/targets
请使用浏览器访问 http://[全球IP]:9080/targets,确认Promtail是否正常显示。
请确保在安全组中开放了9080端口。
在使用Amazon Linux 2023时遇到的问题
-
- 今回、/var/log/messagesと/var/log/cronのログを連携したいが、amazon linux 2023にはrsyslogとchronyが標準で入っていないため、別途入れる必要があった。
- cronieインストール
$ dnf -y install cronie
# /var/log/cronのファイルを生成する
$ crontab -e
安装rsyslog
$ yum install -y rsyslog
$ systemctl enable rsyslog.service
$ systemctl start rsyslog.service
监视服务器
进行以下三个工具的安装
-
- Prometheus
-
- Loki
- Grafana
Prometheus的安装
wget https://github.com/prometheus/prometheus/releases/download/v2.25.2/prometheus-2.25.2.linux-amd64.tar.gz
tar zxvf prometheus-2.25.2.linux-amd64.tar.gz
cd prometheus-2.25.2.linux-amd64
./prometheus
#prometheus本体を自動起動するソース配下へコピー
cp -r ./prometheus /usr/bin
#prometheus設定ファイルの配置
mkdir /etc/prometheus
cd /etc/prometheus
## wget https://raw.githubusercontent.com/prometheus/prometheus/master/documentation/examples/prometheus.yml
# my global config
global:
scrape_interval: 15s # Set the scrape interval to every 15 seconds. Default is every 1 minute.
evaluation_interval: 15s # Evaluate rules every 15 seconds. The default is every 1 minute.
# scrape_timeout is set to the global default (10s).
# Alertmanager configuration
alerting:
alertmanagers:
- static_configs:
- targets:
# - alertmanager:9093
# Load rules once and periodically evaluate them according to the global 'evaluation_interval'.
rule_files:
# - "first_rules.yml"
# - "second_rules.yml"
# A scrape configuration containing exactly one endpoint to scrape:
# Here it's Prometheus itself.
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: ["localhost:9090"]
- job_name: 'node-exporter'
static_configs:
- targets: ["172.16.10.125:9100"]
- job_name: 'process-exporter'
static_configs:
- targets: ["172.16.10.125:9256"]
以下是用于自动启动的prometheus.service的内容
[Unit]
Description=Prometheus - Monitoring system and time series database
Documentation=https://prometheus.io/docs/introduction/overview/
After=network-online.target
[Service]
Type=simple
ExecStart=/usr/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
[Install]
WantedBy=multi-user.target
启动和操作确认
# デーモンのリロード
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable prometheus.service
# 起動
$ systemctl start prometheus.service
洛基的安装
$ mkdir /usr/local/src/loki
$ cd /usr/loca/src/loki
$ curl -O -L "https://github.com/grafana/loki/releases/download/v2.8.3/loki-linux-amd64.zip"
$ unzip "loki-linux-amd64.zip"
$ chmod a+x "loki-linux-amd64"
$ cp -r loki-linux-amd64 /usr/bin
$ mkdir /etc/loki
$ cd /etc/loki
$ wget https://raw.githubusercontent.com/grafana/loki/main/cmd/loki/loki-local-config.yaml
$ ./loki-linux-amd64 -config.file=/etc/loki/loki-local-config.yaml
请参考以下链接:https://github.com/grafana/loki/releases/。
[Unit]
Description=Loki
Documentation=https://github.com/grafana/loki/releases/
[Service]
Type=simple
ExecStart=/usr/bin/loki-linux-amd64 \
-config.file=/etc/loki/loki-local-config.yaml
[Install]
WantedBy=multi-user.target
启动和操作确认
# デーモンのリロード
$ systemctl daemon-reload
# 自動起動設定
$ systemctl enable loki.service
# 起動
$ systemctl start loki.service
-
- 実行完了後、ブラウザから[IP]:3100/metricsにアクセスすると下記画面が表示されることを確認(セキュリティグループで3100番ポートを開けること)
-
- 実行後はずらずら情報が出力されるが10分ほど待っても終わらなかったためctrl+cで強制終了した。
- プロセスも立ち上がっており、ブラウザからもアクセスが確認できたためとりあえずよさそう
确认进程
ps -ax | grep loki
安装Grafana
# Grafanaリポジトリを追加
[grafana]
name=grafana
baseurl=https://packages.grafana.com/oss/rpm
repo_gpgcheck=1
enabled=1
gpgcheck=1
gpgkey=https://packages.grafana.com/gpg.key
sslverify=1
sslcacert=/etc/pki/tls/certs/ca-bundle.crt
# Grafanaインストール、起動
yum install grafana
systemctl start grafana-server
仪表盘设置
中央处理器利用率
获取指标
点击菜单栏中的“探索”选项。
数据源:Prometheus
度量:node_cpu_seconds_total
标签过滤器:mode != 空闲
速率:范围1分钟
将其添加到仪表板
在“添加到仪表盘”中选择目标的仪表盘并添加。
内存使用率
获取度量指标
选择菜单>探索
从右上角的模式切换中选择“Code”。
(node_memory_MemTotal_bytes - node_memory_MemAvailable_bytes) / node_memory_MemTotal_bytes * 100
参照这篇文章并进行内存负载测试能更直观地了解其运行情况。
https://qiita.com/keita0322/items/8fba88debe66fa8d2b39
将其添加到仪表盘上
在“Add to dashboard”中选择并添加目标的仪表板。
选择「…」后选择“编辑”,将标题更改为任意名称,将标准选项更改为单位为“百分比(0-100)”,然后保存。
ssh连接进程的生存监控
选择菜单中的“探索”选项。
数据源:Prometheus
指标:nodeprocess_namegroup_num_procs
标签过滤器:groupname =~ .*sshd.*
将其添加到仪表盘上。
在Add to dashboard中选择Target的仪表板并添加
从「…」中选择Edit,更改Title为任意的名字,然后保存。
/var/log/messages 的日志
数据源:Prometheus
标签过滤器:文件名 = /var/log/messages
将其添加到仪表盘上。
在Add to dashboard中选择Target的仪表板并添加。
从”…”菜单中选择Edit,将Title更改为任意名称,并保存。
/var/log/crond的日志
数据源:Prometheus
标签过滤器:文件名 = /var/log/crond
将其添加至仪表板上。
在”Add to dashboard”上选择”Target的仪表板”并添加。
在”…”中选择”Edit”,将标题更改为任意名称,并保存。
仪表盘微调整
个人感受
这次是我第一次搭建监控基础设施,虽然参考了官方文档和其他文章,但好在最终能够成功显示仪表板。
Grafana的操作很直观,不需要太多查找,只需简单点击就能完成设置,这让我感到非常有趣!
未来,我还想验证一些警报协作等功能,并将其引入公司的基础设施中。
非常感谢您一直阅读到最后!