OSS版のSensu GoとSensu Go Webの使い方

Sensuとは

Sensu is a complete solution for monitoring and observability at scale. Sensu Go is designed to give you visibility into everything you care about: traditional server closets, containers, applications, the cloud, and more.

Sensuは、大規模な監視と観測のための完全なソリューションです。Sensu Goは、従来のサーバークローゼット、コンテナ、アプリケーション、クラウドなど、気になるものをすべて可視化できるように設計されています。

Go言語で書かれた実装がSensu Goとなります。

Sensu Goには商用版とOSS版があります。機能の差異があるのと、バイナリ提供が商用版のみで、OSS版はソースからビルドする必要があります。今回はOSS版のビルドから実際に試してみました。

目次

目次を開く

環境

  • Raspberry Pi 4

Sensu Goのビルド

Dockerコンテナ内でビルドします。

docker run -it --rm -v $PWD:/work golang:1.19

次のコマンドはコンテナ内で実行

cd /tmp
git clone https://github.com/sensu/sensu-go.git -b v6.8.0
cd sensu-go

CGO_ENABLED=0 go build -o /work/bin/sensu-agent ./cmd/sensu-agent
CGO_ENABLED=0 go build -o /work/bin/sensu-backend ./cmd/sensu-backend
CGO_ENABLED=0 go build -o /work/bin/sensuctl ./cmd/sensuctl

exit

ポイント:mainブランチではなくリリースブランチのv6.8.0を使う

一日ハマったのですが、mainブランチは組み込みetcdを削除する途中のようで、backendサーバーがどうしても起動させられませんでした。
そのため、リリース版のv6.8.0を使いましょう。

Remove support for embedded etcd (#4704)

This is a substantial breaking commit. It removes several etcd configuration options for configuring embedded etcd clustering. At one time, this was the only way that sensu-go worked.
We've learned that embedded etcd introduces a lot of operational fragility, and are now mandating that etcd be an external dependency.
To improve hackability and developer velocity, there is now a zero-dependency developer mode for sensu-go. The developer mode makes use of a single-node etcd instance, but we reserve the right to change it to something else in the future of the 7 series releases.

これは実質的なブレークスルーとなるコミットです。このコミットでは、組み込みの etcd クラスタリングを設定するためのいくつかの etcd の設定オプションを削除します。一時期、これが sensu-go の唯一の動作方法でした。
埋め込みetcdは多くの運用上の脆弱性をもたらすことを学びました。ということがわかり、etcdを外部依存とすることを義務付けました。
ハッキングのしやすさと開発者の速度を向上させるために、現在、sensu-goにはゼロ依存の開発者モードがあります。sensu-go にはゼロディペンデンシー開発者モードがあります。この開発者モードでは 開発者モードでは、シングルノードのetcdインスタンスを使用しますが、将来的に他のものに変更する権利を留保しています。開発者モードはシングルノードのetcdインスタンスを利用しますが、将来7シリーズをリリースする際に他のものに変更する権利を留保します。
www.DeepL.com/Translator (無料版)で翻訳しました。

ポイント:Goのスタティックビルドを行う。

Goのことはよくわかりませんが、普通にビルドすると動的リンクになるようです。コンテナ内でビルドしたバイナリを他の環境で利用したいので、静的リンクにする必要があります。
静的リンクにするにはgo buildの際に環境変数CGO_ENABLED=0を指定して実行します。

参考サイト:golangで書いたアプリケーションのstatic link化

sensu-backend sensu-agent sensuctl の3つのバイナリが生成されました。

Sensu GoのDockerイメージを作成

Dockerfileが公式で用意されているのでこれを使用します。

  • Clone
git clone https://github.com/sensu/sensu-docker.git
cd sensu-docker
mkdir -p target/linux/arm64
cp ../bin/* target/linux/arm64/
docker build . --build-arg TARGETPLATFORM=linux/arm64 --file dockerfiles/alpine/Dockerfile -t sensu

ポイント:TARGETPLATFORMを明示的に指定

buildxでマルチアーキテクチャに対応したビルドを行うようになっているようですが、今回は単一のアーキテクチャ用にbuildします。そのため、TARGETPLATFORMを環境変数で指定してビルドを実行しています。

これでSensu Goのコンテナイメージが作成できました。

Sensu Go WebのDockerイメージを作成

商用版のSensu GoにはWeb UIが含まれていますが、OSS版には含まれていないので、別で用意します。
また、商用版と同じ機能が提供されるわけではなさそうです。

This project does not aim to provide a web-based interface for every feature of the open-source Sensu Go platform, specifically including the configuration of Sensu Go pipelines.

このプロジェクトは、オープンソースのSensu Goプラットフォームのすべての機能、特にSensu Goパイプラインの設定を含む、Webベースのインタフェースを提供することを目的としていません。

Dockerfileは用意されていないので作成しました。

cd ..
  • sensu-go-web/Dockerfile
FROM node:14-alpine

RUN apk add --no-cache git tini

RUN mkdir -p /opt/sensu && \
    chown -R node.node /opt/sensu

USER node

WORKDIR /opt/sensu
RUN git clone https://github.com/sensu/web.git -b v1.2.1

WORKDIR /opt/sensu/web
RUN yarn install \
        --frozen-lockfile \
        --network-timeout 600000 \
        --production=false && \
    yarn cache clean

USER node

WORKDIR /opt/sensu/web
ENTRYPOINT ["/sbin/tini", "--"]
CMD [ "yarn", "node", "scripts", "serve" ]
docker build ./sensu-go-web --file sensu-go-web/Dockerfile -t sensu-go-web

Sensu Goの起動

  1. Networkの作成

    docker network create sensu-net
    
  2. Volumeの作成

    docker volume create sensu-backend-data
    
  3. Sensu Go Backendの起動

    docker run -it --rm --name sensu-backend \
        --network sensu-net \
        -e SENSU_BACKEND_CLUSTER_ADMIN_USERNAME=admin \
        -e SENSU_BACKEND_CLUSTER_ADMIN_PASSWORD=admin \
        -p 8080:8080 \
        -v sensu-backend-data:/var/lib/sensu \
        sensu:latest sensu-backend start
    
  4. Sensu Go Agentの起動

    docker run -it --rm \
        --network sensu-net \
        -p 3030:3030 \
        sensu:latest sensu-agent start \
            --backend-url ws://sensu-backend:8081 \
            --deregister \
            --keepalive-interval=5 \
            --keepalive-warning-timeout=10 \
            --subscriptions linux
    
  5. Sensu Go Webの起動

    docker run -it --rm \
        --network sensu-net \
        -e PORT=3000 \
        -e API_URL=http://sensu-backend:8080 \
        -p 3000:3000 \
        sensu-go-web:latest
    

Sensuctl CLIの設定

  1. ディレクトリの作成

    mkdir sensuctl
    cd sensuctl
    
  2. 何度も実行するのでエイリアス登録

    alias sensuctl="docker run -it --rm  \
      --network sensu-net \
      -v $PWD/.config/sensu/sensuctl:/root/.config/sensu/sensuctl \
      -v $PWD:/work \
      -w /work \
      sensu:latest sensuctl"
    
  3. sensuctlの初期設定
    初期設定をしておくことで、sensuctl実行時に毎回認証情報やAPIのURLを指定せずにすみます。

    sensuctl configure
    

    ウィザードに答える

    ? Sensu Backend API URL: http://sensu-backend:8080
    ? Username: admin
    ? Password: admin
    ? Namespace: default
    ? Preferred output format: tabular
    

    sensuctl/.config/sensu/sensuctlclusterprofileが生成されます。

Sensu Go Webを使ってみる

http://[IPアドレス]:3000/にアクセスします。

image.png

ログインするとEvents一覧画面へ遷移します。

  • Events一覧画面

192.168.1.113_3000_signin_redirect-to=%2F(1280x720) (2).png

  • Event詳細画面

image.png

  • Entities一覧画面

image.png

  • Entity詳細画面

image.png

  • Silences一覧画面

Silenceの詳細画面はありません。

image.png

  • Configuration

Checks、Filters、handlers、Mutatorsの設定が閲覧できます。設定を追加することはできなさそうです。

image.png

OSS版のWeb UIは最低限の機能という印象です。

Sensuctl CLIを使ってみる

Sensu Go Webで確認できた内容はCLIで取得することも可能です。

  • event list

eventがリストアップされます。

sensuctl event list
     Entity        Check                                     Output                                   Status   Silenced             Timestamp                             UUID                  
─────────────── ─────────── ──────────────────────────────────────────────────────────────────────── ──────── ────────── ─────────────────────────────── ───────────────────────────────────────
  8955f57fbd0a   keepalive   Keepalive last sent from 8955f57fbd0a at 2022-09-03 13:51:32 +0000 UTC        0   false      2022-09-03 13:51:32 +0000 UTC   27a5aad5-e973-4e9b-9965-8f7ec7e799b3  
  • entity list

entityがリストアップされます。

sensuctl entity list
       ID        Class    OS           Subscriptions                   Last Seen            
─────────────── ─────── ─────── ─────────────────────────── ────────────────────────────────
  8955f57fbd0a   agent   linux   linux,entity:8955f57fbd0a   2022-09-03 13:46:52 +0000 UTC 

OSS版のWeb UIでできたことはCLIでもできそうです。

  • asset add

CLIでは閲覧だけでなく、設定の追加も可能です。assetを追加します。
assetはBonsaiというHubに登録されているものから追加できます。
sensu/system-checkの詳細はこちら

sensuctl asset add sensu/system-check
no version specified, using latest: 0.1.2
fetching bonsai asset: sensu/system-check:0.1.2
added asset: sensu/system-check:0.1.2

You have successfully added the Sensu asset resource, but the asset will not get downloaded until
it's invoked by another Sensu resource (ex. check). To add this runtime asset to the appropriate
resource, populate the "runtime_assets" field with ["sensu/system-check"].
  • check create

続いてcheckを作成します。

sensuctl check create system-check-metrics \
--command 'system-check' \
--interval 15 \
--subscriptions linux \
--runtime-assets sensu/system-check \
--output-metric-format nagios_perfdata
Created

作成したcheckの情報は以下で取得が可能です。

sensuctl check info system-check-metrics
=== system-check-metrics
Name:              system-check-metrics
Interval:          15
Command:           system-check
Cron:              
Timeout:           0
TTL:               0
Subscriptions:     linux
Handlers:          
Runtime Assets:    sensu/system-check
Hooks:             
Publish?:          true
Stdin?:            false
Proxy Entity Name: 
Namespace:         default
Metric Format:     nagios_perfdata
Metric Handlers: 

--formatを指定するとYAMLやJSON形式で出力が可能です。
YAMLやJSON形式のファイルを保存しておくと、ファイルをインプットとしてcheckを作成することもできます。

  • ファイルに出力
sensuctl check info system-check-metrics --format yaml > check_system-check-metrics.yaml
  • 一旦削除
sensuctl check delete system-check-metrics
  • ファイルから作成
sensuctl create -f check_system-check-metrics.yaml

作成したcheckはSensu Go Webで閲覧が可能です。

image.png

CLIでは設定の追加・変更も可能です。

以上、Sensu Go単体での基本的な使い方です。
収集したデータの永続化はInfluxDBを使うのが一般的のようです。