Featured image of post Grafana Alloy でメトリクス収集

Grafana Alloy でメトリクス収集

Raspberry Pi を新しくしてからメトリクスの可視化を行っていなかったので Grafana Cloud で見れるようにセットアップしようと Grafana のサイトを見ていたら Alloy というものの存在を知ったので試してみる。

Grafana Alloy is a vendor-neutral distribution of the OpenTelemetry (OTel) Collector. Alloy uniquely combines the very best OSS observability signals in the community.

Alloy はベーダーニュートラルな OpenTelemetry Collector で、なんか最高らしいです 😊😊

Alloy collection diagram
(https://grafana.com/docs/alloy/latest/get-started/deploy/)

Prometheus のメトリクス収集と Remote Write もできるし、node_exporter をはじめとする数多くの prometheus exporter も内包しているし、Log 収集して Grafana Loki にも送れる。もちろん OpenTelemetry Collector として Trace も処理する。Windows にも対応。 今回は DietPi (Linux) でそれ自身の Metrics 送信を試します。

Install

deb や rpm もありますし、Windows 用の exe もあります、 mac も Homebrew でインストール可能です。 今回のインストール先は DietPi なので ARM 用の Linux バイナリをダウンロードして配置することにします。

GitHub の release ページからダウンロードできます。 最新の v1.0.0 をインストールします。

curl -LO https://github.com/grafana/alloy/releases/download/v1.0.0/alloy-linux-arm64.zip
unzip alloy-linux-arm64.zip
install -o root -g root -m 0755 alloy-linux-arm64 /usr/local/bin/alloy

Systemd 設定

https://grafana.com/docs/alloy/latest/get-started/run/binary/ に Systemd の Unit ファイルのサンプルもあるのでほぼそれのコピペで OK

実行ユーザー作成

sudo useradd --no-create-home --shell /bin/false alloy

systemd service 設定

cat <<'EOF' | sudo tee /etc/systemd/system/alloy.service
[Unit]
Description=Vendor-neutral programmable observability pipelines.
Documentation=https://grafana.com/docs/alloy/
Wants=network-online.target
After=network-online.target

[Service]
Restart=always
User=alloy
Environment=HOSTNAME=%H
EnvironmentFile=/etc/default/alloy
WorkingDirectory=/tmp
ExecStart=/usr/local/bin/alloy run $CUSTOM_ARGS --storage.path=/tmp $CONFIG_FILE
ExecReload=/usr/bin/env kill -HUP $MAINPID
TimeoutStopSec=20s
SendSIGKILL=no

[Install]
WantedBy=multi-user.target
EOF

ラズパイで SD カードに無駄に書き込みしたくないので storage.path/tmp にしました。

引数設定

cat <<'EOF' | sudo tee /etc/default/alloy
## Path:
## Description: Grafana Alloy settings
## Type:        string
## Default:     ""
## ServiceRestart: alloy
#
# Command line options for alloy
#
# The configuration file holding the Grafana Alloy configuration.
CONFIG_FILE="/etc/alloy/config.alloy"

# User-defined arguments to pass to the run command.
CUSTOM_ARGS=""

# Restart on system upgrade. Defaults to true.
RESTART_ON_UPGRADE=true
EOF

Token 発行と config ファイル設定

grafana.net のサイトで Connections → Collector → Alloy を開くと Token の作成フォームがあります

Manage Alloy configuration Screenshot

ここで token の作成を行うと次のような変数を指定して

ARCH="arm64"
GCLOUD_HOSTED_METRICS_URL="https://prometheus-us-central1.grafana.net/api/prom/push"
GCLOUD_HOSTED_METRICS_ID="00000"
GCLOUD_SCRAPE_INTERVAL="15s"
GCLOUD_HOSTED_LOGS_URL="https://logs-prod-us-central1.grafana.net/loki/api/v1/push"
GCLOUD_HOSTED_LOGS_ID="00000"
GCLOUD_RW_API_KEY="glc_**********"

Cloud Storage にある shell script を実行するスニペットが表示されるのでコピペで実行します

/bin/sh -c "$(curl -fsSL https://storage.googleapis.com/cloud-onboarding/alloy/scripts/install-linux-binary.sh)"

すると、カレントディレクトリに alloy のバイナリがダウンロードされて config.alloy ファイルが作られて alloy が実行されます。

config.alloy も Cloud Storage からダウンロードしたものに先の変数を展開したもので、Alloy の内部メトリクスを Prometheus の remote write で送信する設定になっています。 メトリクスが遅れていることを確認するボタンがあるのでそれをクリックして動作確認ができたら Ctrl-C で alloy を停止して config.alloy 以外を削除します。 config.alloy は Systemd の設定で指定した /etc/alloy/config.alloy に移動させて、追加の設定を行います。

node_exporter 設定

Alloy には node_exporter も内包されているので alloy を実行しているホストに別途 node_exporter をセットアップする必要はありません。

prometheus.exporter.unix で scrape できます。

次の設定は Linux Server integration for Grafana Cloud にある例です。 node_exporter や prometheus を使ったことがあればなじみのある設定項目かと思います。

discovery.relabel "integrations_node_exporter" {
  targets = prometheus.exporter.unix.integrations_node_exporter.targets

  rule {
    target_label = "instance"
    replacement  = constants.hostname
  }

  rule {
    target_label = "job"
    replacement = "integrations/node_exporter"
  }
}

prometheus.exporter.unix "integrations_node_exporter" {
  disable_collectors = ["ipvs", "btrfs", "infiniband", "xfs", "zfs"]

  filesystem {
    fs_types_exclude     = "^(autofs|binfmt_misc|bpf|cgroup2?|configfs|debugfs|devpts|devtmpfs|tmpfs|fusectl|hugetlbfs|iso9660|mqueue|nsfs|overlay|proc|procfs|pstore|rpc_pipefs|securityfs|selinuxfs|squashfs|sysfs|tracefs)$"
    mount_points_exclude = "^/(dev|proc|run/credentials/.+|sys|var/lib/docker/.+)($|/)"
    mount_timeout        = "5s"
  }

  netclass {
    ignored_devices = "^(veth.*|cali.*|[a-f0-9]{15})$"
  }

  netdev {
    device_exclude = "^(veth.*|cali.*|[a-f0-9]{15})$"
  }
}

prometheus.scrape "integrations_node_exporter" {
  targets    = discovery.relabel.integrations_node_exporter.output
  forward_to = [prometheus.relabel.integrations_node_exporter.receiver]
}

prometheus.relabel "integrations_node_exporter" {
  forward_to = [prometheus.remote_write.metrics_service.receiver]

  rule {
    source_labels = ["__name__"]
    regex         = "node_scrape_collector_.+"
    action        = "drop"
  }
}

metrics の送信先設定ですが、install script では username, password がべた書きされますが、次のようにして環境変数から読み込んだり、変更を watch する別ファイルの値を変更を使うことができます。

local.file "password" {
  filename = "/etc/alloy/alloy.password"
  is_secret = true
  poll_frequency = "1s"
}

prometheus.remote_write "metrics_service" {
  endpoint {
    url = "https://prometheus-us-central1.grafana.net/api/prom/push"

    basic_auth {
      username = env("PROM_USERNAME")
      password = local.file.password.content
    }
  }
}

その他

今回使ってないけどなんでもそろってる。

Autodiscovery

AWS(EC2lightsail), Azure, Google CloudDigitalOceanlinode の compute instance の自動ディスカバリも可能ですし、Consul や DNS、nomad、Openstack などなどでのディスカバリも可能です。 Prometheus も内包してる感じなので prometheus と同じように動的に変わる scrape 対象に問題なく対応可能です。

Kubernetes にも対応していますし、Prometheus Operator の ServiceMonitorPodMonitor にも対応しています。

送信先

Grafana Cloud でしか使えないわけではなく、metrics は自前の Prometheus にも送信可能ですし、AWS や Azure の Managed Service for Prometheus への送信も可能っぽいです。 Loki の managed service は3大クラウドにはないと思うのでログの送信は Grafana Cloud だけかな。

OpenTelemetry 関連

receiver, processor, exporter など一通りそろってそうですが、まだ使ってないのでわからない。

感想

なんでもかんでも内包してるのが良いとは一概に言えない気もしますが、しばらくおうちのラズパイで使ってみます。

Built with Hugo
テーマ StackJimmy によって設計されています。