参考文献

  1. Telegraf
  2. grafana
  3. prometheus

最終成果物

influx_dbのダッシュボード

背景

業務でnginxの運用に携わっているのだが、nginxのrpsやレスポンスステータスごとの返却数など、どうやってモニタリングしているのか気になっていた。telegrafを使っていたのはわかったんだけど、実際にどうやってデータを取って、それをどうやってデータサーバで保存して、可視化をしていたのか、非常に気になっていたのです。それが今日解決しました。Telegraf、grafana、そして、prometheus,結構使えそうです。この記事では、メトリクスを可視化するためのツールを揃えていこうと思います。

Telegrafの概要

Telegraf is an agent for collecting, processing, aggregating, and writing metrics, logs, and other arbitrary data.

他にもTelegrafこういう感じのTelegrafの説明もあります。僕はこっちの方が好きだった

Telegraf, a server-based agent, collects and sends metrics and events from databases, systems, and IoT sensors. Written in Go, Telegraf compiles into a single binary with no external dependencies–requiring very minimal memory.

らしいですね。 collecting and writingなので、データをどこからか取ってきて、どこかに送るというわけです。そうです、inputとoutputを決められるわけですね。それも膨大な数のInputとoutputがあります。正直これは驚きました。こんなにあるんかとね。すごいです。ちょっと使えそうなinputとoutputを何個かpickupしておきたいと思います。

input

  1. Apache Input Plugin
  2. BIND 9 Nameserver Statistics Input Plugin
  3. Ceph Storage Input Plugin
  4. CGroup Input Plugin
  5. Conntrack Input Plugin
  6. CouchDB Input Plugin
  7. CPU Input Plugin
  8. Disk Input Plugin
  9. DNS Query Input Plugin
  10. Docker Input Plugin
  11. Kernel Input Plugin
  12. Kubernetes Input Plugin
  13. Lustre Input Plugin
  14. MySQL Input Plugin
  15. Nginx Input Plugin

って感じで本当になんでもある。これはえぐい。 16. nvidia-smi 17. postgres 18. proxmox 19. prometheus

なんかメトリクスをとって外部に送りたいと思ったらとりあえずはtelegrafを使えば間違いなさそう。これはすごいや。

output

はい、inputでデータを取ってきて、どこかに送るわけですね。どこに遅れるのかな。気になりますね。

  1. SQL Output Plugin
  2. postgres
  3. https://github.com/influxdata/telegraf/tree/master/plugins/outputs/sql

これくらいかな。なかなか素晴らしいです。本当に素晴らしいと思う。 inputで撮りたいデータはtomlファイルから簡単に設定可能。そして、output先もtomlファイルから簡単に設定可能。正直これは素晴らしすぎる。

ってことで、次。grafanaを見ていこうと思う。

grafanaの概要

Grafana allows you to query, visualize, alert on and understand your metrics no matter where they are stored. Create, explore, and share dashboards with your team and foster a data-driven culture:

ってことで、可視化ツールですね。まじでただの便利な可視化ツールです。だから、データソースを指定しないといけないってことです。これが大事な視点ですね。

grafanaのbuilt-in data source

Built-in core data sources
These built-in core data sources are also included in the Grafana documentation:

Alertmanager
AWS CloudWatch
Azure Monitor
Elasticsearch
Google Cloud Monitoring
Graphite
InfluxDB
Jaeger
Loki
Microsoft SQL Server (MSSQL)
MySQL
OpenTSDB
PostgreSQL
Prometheus
Pyroscope
Tempo
Testdata
Zipkin

はい。MysqlとPrometheus、postgresも入ってますね。そんな感じです。はい。ってことで、telegraf -> ? -> grafanaの?に入りそうなのはこの3つですね。それがいいか?正直どれでもいいと思うのですがね。どうしましょうかね。せっかくなのでPrometheusを少し勉強したさはある。

prometheusの概要

Prometheus, a Cloud Native Computing Foundation project, is a systems and service monitoring system. It collects metrics from configured targets at given intervals, evaluates rule expressions, displays the results, and can trigger alerts when specified conditions are observed.

って感じですね。データを保管しておいてくれるってことでいいんかな?DBと可視化のどちらも担当してくれているという認識であってそうか?まあ、あってそうだな。

prometheusのアーキテクチャ

って感じなので、問題なさそう。いいね!では以上を踏まえて、どこでどのサーバを動かすかだな。はい。いいじゃないですか。 まずは、grafanaだね。これ入って仕舞えばフロントエンドアプリケーションですね。うん。なので、blog.ingenboy.comで動かせば良さそう。ただデータを取ってきて可視化するだけなのでね。 次。prometheus。これは、自宅のゲートウェイで動かすって話だな。で、ゲートウェイまでのアクセスは外部からでもvpnのsite2siteでいけるから問題ないと思う。で、telegrafは書くサーバ上で動かして、prometheusに送信すれば問題なさそうかね??はい、そんな気がします。ってことで、まずはgrafanaをインストールするのがいいのかな?

grafanaのインストール

インストール先:blog.ingenboy.com

インストール手順

手順書通りにやれば問題ないと思うけど。どうだろう?

sudo apt-get install -y apt-transport-https software-properties-common wget
sudo mkdir -p /etc/apt/keyrings/
wget -q -O - https://apt.grafana.com/gpg.key | gpg --dearmor | sudo tee /etc/apt/keyrings/grafana.gpg > /dev/null
echo "deb [signed-by=/etc/apt/keyrings/grafana.gpg] https://apt.grafana.com stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list
# Updates the list of available packages
sudo apt-get update

# Installs the latest OSS release:
sudo apt-get install grafana

これでインストールが完了しますね。でこんな感じの案内が来ます。

sudo /bin/systemctl daemon-reload
sudo /bin/systemctl enable grafana-server
### You can start grafana-server by executing
sudo /bin/systemctl start grafana-server
# sudo systemctl status grafana-server
○ grafana-server.service - Grafana instance
Loaded: loaded (/usr/lib/systemd/system/grafana-server.service; disabled; preset: enabled)
Active: inactive (dead)
Docs: http://docs.grafana.org

はい、でsystemctlでenableして、startして起動完了。 しかし起動が失敗してしまう。/var/log/grafana/grafana.log | grep error で確認していますと、

logger=server t=2024-08-01T20:07:01.18833137+09:00 level=error msg="Stopped background service" service=*api.HTTPServer reason="failed to open listener on address 0.0.0.0:3000: listen tcp 0.0.0.0:3000: bind: address already in use"
logger=serviceaccounts t=2024-08-01T20:07:01.188631021+09:00 lev

てことですね。これはWEB-UIツールですでに使っているポートだからだな。じゃあどうするか。

cat /etc/grafana/grafana.ini | grep 3000
;http_port = 3000

ということなので、ここを変えれば良さそうですね。8000で動かすように変更

いや、結局8888で生で動かすことにした。しかし、これだとちょっと大変なのよね。正直。passwordとか入力すると思うんだけど、いつも使ってるやつで入力すると 漏れる可能性がある。ってことで、今回は適当に very_strong_passwordにしようか。んで入ると普通に見られるようになっていると。素晴らしい。んで、ゆーざめいも変えましたー。OK。

あとは、インターネットから見られるように色々変えたってところかな。 一応暗号化されている通信ですね。あの、GPTの方も怖かったので、nginxを通したsslで 8001 -> 3001にプロキシされるように変更しました。 確かにこれは怖すぎますね。まじで危ないことをしていたね。 どっかのルータがパケットダンプとかしてたら、普通にバレていますね。

はい、ここまでOK!ではここからどうするか??

installing telegraf

You can easily install telegraf by using apt package manager. this is the installation guide.

On debian based OS just type the command below.

# influxdata-archive_compat.key GPG fingerprint:
#     9D53 9D90 D332 8DC7 D6C8 D3B9 D8FF 8E1F 7DF8 B07E
wget -q https://repos.influxdata.com/influxdata-archive_compat.key
echo '393e8779c89ac8d958f81f942f9ad7fb82a25e133faddaf92e15b16e6ac9ce4c influxdata-archive_compat.key' | sha256sum -c && cat influxdata-archive_compat.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg > /dev/null
echo 'deb [signed-by=/etc/apt/trusted.gpg.d/influxdata-archive_compat.gpg] https://repos.influxdata.com/debian stable main' | sudo tee /etc/apt/sources.list.d/influxdata.list
sudo apt-get update && sudo apt-get install telegraf

configuring telegraf

You can find the configuration file on

/etc/telegraf/telegraf.conf

on top of the configuration file you can see

# Telegraf Configuration
#
# Telegraf is entirely plugin driven. All metrics are gathered from the
# declared inputs, and sent to the declared outputs.
#
# Plugins must be declared in here to be active.
# To deactivate a plugin, comment out the name and any variables.
#
# Use 'telegraf -config telegraf.conf -test' to see what metrics a config
# file would generate.
#
# Environment variables can be used anywhere in this config file, simply surround
# them with ${}. For strings the variable must be within quotes (ie, "${STR_VAR}"),
# for numbers and booleans they should be plain (ie, ${INT_VAR}, ${BOOL_VAR})

which means you need to just write all the setting files here.

The main setting to configure is input by which you defined the metricis you want to collect, and output by which you define the data store to store the metrixis.

The nice thing about telegraf is that you can get all information only by reading the setting file. That is really helpful.

But this config file is too long to read so dont read. Instead you can generate config files by using the following command.

telegraf config --input-filter cpu:mem:net:swap --output-filter influxdb:kafka

In my case I want to check cpu:mem:net:nginx:kubenetes for input and want to put data on influxdb:kafka:prometheus:mysql so the command is

telegraf config --input-filter cpu:mem:net:swap:nginx:kubernetes --output-filter influxdb_v2 > telegraf.conf

This is so useful. This is The order of the plugin configuration in the file is

  1. global setting
  2. output plugins
  3. processor plugins
  4. aggregate plugins
  5. input plugins.

はい、とても使いやすくてすらばらしい。

nginxプラグインが使えるようにするにはnginx側でも設定の変更が必要だから少し面倒くさいけど。 具体的にはlocationディレクティブの下にどのパスでメトリクスを提示するかを決めてあげる必要がある、というお話だ。 次の設定をただ、次の設定を書いておけば全くもって十分だ。

server {
    listen 127.0.0.1:8080; # Adjust the IP and port if necessary
    server_name localhost; # You can use a different server_name if desired

    location /nginx_status {
        stub_status on;
        # Optionally restrict access to IP addresses if needed
        # allow 127.0.0.1;
        # deny all;
    }
}

これでnginxのメトリクスが/nginx_statusで取れるようになる。それでいいのだ。

urls = [“http://localhost/server_status”]

prometheusのインストール

deltaのストレージ容量

hogehoge@delta:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           380M  3.1M  376M   1% /run
/dev/mmcblk0p2   59G  3.9G   52G   7% /
tmpfs           1.9G     0  1.9G   0% /dev/shm
tmpfs           5.0M     0  5.0M   0% /run/lock
/dev/mmcblk0p1  253M  137M  116M  55% /boot/firmware
tmpfs           379M  4.0K  379M   1% /run/user/1001

全く問題なさそう。ってことでここにprometheusをインストールしていこうとおもう。 手順書はこちら はい、やっていきましょう。 はい、せっかくなのでgoのバイナリを持ってきてビルドしましょうかね。せっかくなのでね。はい。 ってことでまずはgoのインストールからかー。やるか。

  1. goの公式サイトで最新のgo (arm) の圧縮ファイルをダウンロード
  2. 解凍しながらインストールする
sudo tar -C /usr/local -xzf go1.22.5.linux-arm64.tar.gz
  1. パスを通す
export PATH=$PATH:/usr/local/go/bin
  1. .bashrcにも追記

以上! では、prometheusのbuildをやっていきせう。

  1. latesリリースのコードをダウンロード
  2. OH!なんとbuildするにはnode.jsがひつようだと!じゃあいいや。 普通にarm64のバイナリをダウンロードしておしまいや。はいはい、おしまいやおしまい。

promethesuの設定 & 起動

まずは、どうやってデータを貯めておくのかってところ、気になるんすよね。 まあ、mysqlも普通のfaileで管理していたし、まあファイルだろうなとは思うのですが。 あとは、普通にsystemdに登録したいんだよね。サーバとして動かさないと意味ないでしょーが!!ってことでね。

まずはサンプルのconfig.yamlを見てみましょう!

# 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"]

なるほど、普通に設定するの難しそうだね。そういうことか、設定が普通にむずいって話だ。きちーな。もう少しドキュメント読んだ方がいいな。

prometheusのドキュメント

  1. 全体のドキュメント
  2. 簡単なチュートリアルもありますが
  3. 設定ファイルに関するドキュメント うん、ちょっと使い方勉強しないと厳しいと思う!!頑張ろう!

データ保存周りの設定

その他の重要な設定

ポート番号の設定とか、そこらへん。telegrafからの通信をどうやって受け取るかとか、そういうのも調べないときつそうじゃない??

起動方法

./prometheus --config.file=your_config.yml

実はこれで起動できる。というお話。

unitファイルを書いてデーモン化

これは、systemdの思想って本を読んでからやった方が良さそうだよね。ってことで

InfluxDbの方がいい気がしてきました。

InfluxDb, 現在かなりきているopen sourceの time seriese data baseですね。 2013年から開発が始まって、かなり時間も経っている。いいプロダクトだと思います。Rustで書かれています。バイナリに還元されるという点では、まあ結局どの言語でも一緒だね。 c/c++, go, rustどれも一緒だ。そして、この会社エンジニアを雇っているんだけど、かなりいい会社だと思う。えぐいな、$160kって日本円に直すと2000万くらいじゃないか。結構えぐいぜ。Telegrafを開発しているinfluxData と連携しているわけだし、使いやすい設計になっている。てことでInfluxDBにすることにした。いつか、OSSにコントリビュートしたい。ほんまに。

install guide

This is how to install influxDB on arm 64 based computer.

curl -LO https://download.influxdata.com/influxdb/releases/influxdb2_2.7.8-1_arm64.deb
sudo dpkg -i influxdb2_2.7.8-1_arm64.deb

これでもう普通に使えるようになる。 設定ファイルは、

/etc/influxdb/config.toml

に入っているし、完璧です。

packageでインストールするとunitファイルも一緒に入ってくるのでsystemdにすでに登録されているということですね。ということで

sudo systemctl start influxd

でスタートします。

初期設定は、なんとinfluxっていうcliコマンドがあるので、これを使って初期設定をやっていくことになります。いいですねー。 やっていきましょうかー。

influxdbの起動とinfluxdb client toolのインストール

sudo systemctl start influxd
# arm
wget https://download.influxdata.com/influxdb/releases/influxdb2-client-2.7.5-linux-arm64.tar.gz
# arm
wget https://download.influxdata.com/influxdb/releases/influxdb2-client-2.7.5-linux-arm64.tar.gz

sudo mv influx /usr/local/bin

influxdbの初期設定

influx setup

これを入力すると、インタラクティブに設定できるようになります。

> Welcome to InfluxDB 2.0!
? Please type your primary username ray
? Please type your password *********
? Please type your password again *********
? Please type your primary organization name ingenboy.inc
? Please type your primary bucket name bucket
? Please type your retention period in hours, or 0 for infinite 0
? Setup with these parameters?
  Username:          ray
  Organization:      ingenboy.inc
  Bucket:            bucket
  Retention Period:  infinite

という感じで。

all access api tokenの発行

influx auth create \
  --all-access \
  --host http://localhost:8086 \
  --org ingenboy.inc \
  --token test_token

6AbQHYM0IRK6z-otm-EHfddkx1THSaNU9osgRaZbmhafn1Ej-3A8sLnvnhA79Xqh44IYMGA7nqHlI-h7l9zGXg==

configure authentication credentials

influx config create \
  --config-name get-started \
  --host-url http://localhost:8086 \
  --org ingenboy.inc \
  --token test_token

実は非常に使いやすいconsoleもあったという話

http://100.64.1.48:8086/

にアクセスしてみてください。非常に使いやすいですね。

influxDBの書き込みで使われるline protocolについて

All data written to InfluxDB is written using line protocol, a text-based format that lets you provide the necessary information to write a data point to InfluxDB

ってことで、時系列データだから、RDBMSとは結構異なる形式になっているということは理解した方がいいですね。

measurement, tag=value1,tag2=value2 field1=“v1”,field2=1i unixTimestamp

measurement: String that identifies the measurement to store the data in.
tag set: Comma-delimited list of key value pairs, each representing a tag. Tag keys and values are unquoted strings. Spaces, commas, and equal characters must be escaped.
* field set: Comma-delimited list key value pairs, each representing a field. Field keys are unquoted strings. Spaces and commas must be escaped. Field values can be strings (quoted), floats, integers, unsigned integers, or booleans.
timestamp: Unix timestamp associated with the data. InfluxDB supports up to nanosecond precision. If the precision of the timestamp is not in nanoseconds, you must specify the precision when writing the data to InfluxDB.

まあこれくらいにしておいて、ここからはどうやってtelegrafを使うのか、それをみていきましょう。

telegrafとinfluxDBを連携させる。

さっきのwebコンソールから入るとTelegrafのための設定を作るところがあるので、そこに書いてある方法に従えば大丈夫そう

うん、influxDBにアクセスするにはアクセストークンが必要なんだけど、それを自動で発行してくれるなどしてくれる。いいね。やりやすい。

でtelegrafの方ではちゃんとこれで設定ファイルを発行しよう

telegraf config --input-filter cpu:mem:net:swap:nginx --output-filter influxdb > telegraf.conf

うん、複雑な設定もいらないし、非常に使いやすいと思う。 mysqlはやはり結構設定が面倒くさかったんだな、っておもうわ、こういうの使うと。

んでね、grafanaとinfluxDBを繋げようと思ったんんだけど、influxDBの可視化が綺麗すぎて、もはややる必要がなくなってしまったかもしれない。厳しいぜ。 ちなみに、influxDBは apache licenseだから、問題なく使えるというお話です。素晴らしい代物だ。 おそらく、grafanaを超えていると思う。可視化ツール単体で見てもgrafana超えている。そして、telegrafとの連携も完璧。 まじでいうことないんじゃないか??素晴らしすぎる!!何も文句はない!grafanaには消えてもらいましょう!

ちなみに、influxDBで単調増加していくメトリクスがあるとするじゃない。例えば、nginxのrequestsは今までのトータルのリクエストを数えているんだけど、これ単調増加なんだよね。でも見たいのは微分じゃない。こういう時どうすればいいかなんだけど、aggregation functionでderivativeを選んでください。そして、微分機関も選べる。なるほどね。って感じですね。はい。

結論

Telegraf + influxDBが普通にすごい。どちらもinfluxDataが開発しているやつだからね、すごく使いやすいし、見栄えもいい。