TelegrafからAmazon Managed Service for Prometheus (AMP)にRemote WriteしてスタンドアローンのGrafanaからQueryする方法

ノーコードでエアコンの電力消費を可視化する手順(Telegraf + Promethes + Grafana Mimir + Grafana)ではRaspberry Pi環境内ですべて完結していましたが、Grafana Minirの代わりにAmazon Managed Service for Prometheus (AMP)を使うことも可能です。

目次

目次を開く

全体構成

image.png

用意するもの

ハードウェア

  • SwitchBotプラグミニ
  • Raspberry Pi 4

前回と同じ環境です。

ソフトウェア

  • Telegraf
  • Grafana
  • AWS SigV4 Proxy
  • Amazon Managed service for Prometheus (AMP)

AWS SigV4 Proxy

The AWS SigV4 Proxy will sign incoming HTTP requests and forward them to the host specified in the Host header.
You can strip out arbirtary headers from the incoming request by using the -s option.

出典:公式サイト

AWS SigV4 Proxyは、受信したHTTPリクエストに署名し、Hostヘッダで指定されたホストに転送します。
-sオプションを使用すると、受信リクエストからアービタリ・ヘッダーを取り除くことができます。

翻訳:DeepL

Amazon Managed service for Prometheus (AMP)へのアクセスにはAWSのSigV4署名が必要となりますが、TelegrafはSigV4署名に対応していません。AWS SigV4 ProxyはSigV4署名未対応のアプリケーションからの通信をプロキシし、署名を付けてAWSへリクエストを送信してくれます。

SigV4署名に対応していない製品からもAWSに署名を付けたアクセスが可能になります。他にも色々なケースで利用できると思います。

Amazon Managed service for Prometheus (AMP)

Amazon Managed Service for Prometheus は、Prometheus との互換性を持つモニタリングおよびアラートサービスです。このサービスにより、コンテナ化されたアプリケーションとインフラストラクチャの大規模なモニタリングを簡単に行えるようになります。

出典:公式サイト

AWSマネージドなPrometheusサーバーです。(名前が長い)
利用料は書き込んだメトリクスの量とストレージ容量での従量課金となります。

GrafanaのAWSマネージド・サービスとしてAmazon Managed Grafanaもあります。

Amazon Managed service for Prometheus (AMP)

ワークスペースの作成

マネジメントコンソールでAMPの管理画面を開きます。
作成ボタンをクリックします。

image.png

WorkSpace エイリアスを入力し、ワークスペースを作成するボタンをクリックします。

image.png

エンドポイント - リモート書き込み URLWorkspace IDエンドポイント - クエリ URLは後で使用しますのでメモしておきましょう。

設定と呼べる設定はありませんでした。

IAMポリシーとユーザーの作成

AMPへのアクセスにIAMユーザーのアクセスキーとシークレットアクセスキーが必要です。

必要なポリシーはこちら

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "aps:RemoteWrite",
                "aps:QueryMetrics",
                "aps:GetMetricMetadata",
                "aps:GetLabels",
                "aps:GetSeries"
            ],
            "Resource": "arn:aws:aps:ap-northeast-1:[AWSアカウントID]:workspace/[Workspace ID]"
        }
    ]
}

aps:RemoteWriteがRemote Wirteする際に必要で、その他はGrafanaでクエリーする際に必要なアクションとなります。

略称はAMPですが、アクションの接頭辞はapsです。
ややこしや~

AWS SigV4 Proxy

次にSigV4 Proxyの設定を行います。

.awsディレクトリを作成し先ほど作成したIAMユーザーの認証情報を.aws/config.aws/credentialsに設定します。

docker-compose.yamlのserviceセクションに以下を記述します。

  • docker-compose.yaml (抜粋)
  aws-sigv4-proxy:
    image: public.ecr.aws/aws-observability/aws-sigv4-proxy
    volumes:
      - ./.aws:/root/.aws
    expose:
      - 8080
    environment:
      - AWS_SDK_LOAD_CONFIG=true
    command: [
        "--name", "aps", 
        "--region", "ap-northeast-1", 
        "--host", "aps-workspaces.ap-northeast-1.amazonaws.com", 
        "-v"
        ]

コンテナイメージはDocker HubではなくECR Publicで公開されています。GitHubにはDockerfileが用意されているので自前でビルドすることも可能です。

SwitchBot APIから電力消費量を取得

前回の記事を参考にしてください。

Telegraf

前回はOutputプラグインとしてPrometheus Clientを利用しましたが、Telegrafから直接Remote Wirteできることがわかりましたので、変更しました。

種別 Plugin名 内容
Input HTTP 1つまたは複数の HTTP(または HTTPS)エンドポイントからメトリックスを収集します。エンドポイントは、サポートされている入力データ形式の 1 つでフォーマットされたメトリッ クを持っている必要があります。各データ形式は、入力設定に追加できる独自の設定オプションのセットを持っています。
Output HTTP HTTP 出力プラグインは、出力データ形式の 1 つを使用してエンコードされた HTTP メッセージでメトリックスを送信します。バッチ処理をサポートする data_formats の場合、メトリクスはバッチ処理で送信されます。

HTTP OutputプラグインでPrometheus Remote Writeを行う方法はこちらに記載がありました。

https://github.com/influxdata/telegraf/tree/master/plugins/serializers/prometheusremotewrite

  • telegraf.conf (抜粋)
[[outputs.http]]
  ## URL is the address to send metrics to
  url = "http://aws-sigv4-proxy:8080/workspaces/[Workspace ID]/api/v1/remote_write"

  ## Data format to output.
  data_format = "prometheusremotewrite"

  [outputs.http.headers]
     Content-Type = "application/x-protobuf"
     Content-Encoding = "snappy"
     X-Prometheus-Remote-Write-Version = "0.1.0"

urlがSigV4 Proxy宛になっていることがポイントです。

Grafana

バージョン7.3.5以降でSigV4による署名がサポートされたようです。
SigV4による署名を有効にするには環境変数でAWS_SDK_LOAD_CONFIG=trueGF_AUTH_SIGV4_AUTH_ENABLED=trueを指定する必要があります。

参考サイト
https://docs.aws.amazon.com/prometheus/latest/userguide/AMP-onboard-query-standalone-grafana.html

  • docker-compose.yaml (抜粋)
  grafana:
    image: grafana/grafana-oss
    ports:
      - "3000:3000"
    volumes:
      - grafana-storage:/var/lib/grafana
    environment:
      - AWS_SDK_LOAD_CONFIG=true
      - GF_AUTH_SIGV4_AUTH_ENABLED=true

docker compose up後、データソース設定の際にAuth部分のSigV4 authを有効にした上で、SigV4 Auth Detailsにてアクセスキーとシークレットアクセスキーを指定します。

).png

URL欄はhttps://aps-workspaces.ap-northeast-1.amazonaws.com/workspaces/[Workspace ID]/を入力します。

リージョンの指定も必要です。

以上で設定完了です。

image.png

  • docker-compose.yaml (全体)
version: '3'

services:

  grafana:
    image: grafana/grafana-oss
    ports:
      - "3000:3000"
    volumes:
      - grafana-storage:/var/lib/grafana
    environment:
      - AWS_SDK_LOAD_CONFIG=true
      - GF_AUTH_SIGV4_AUTH_ENABLED=true

  telegraf:
    image: telegraf
    volumes:
      - ./telegraf.conf:/etc/telegraf/telegraf.conf:ro

  aws-sigv4-proxy:
    image: public.ecr.aws/aws-observability/aws-sigv4-proxy
    volumes:
      - ./.aws:/root/.aws
    expose:
      - 8080
    environment:
      - AWS_SDK_LOAD_CONFIG=true
    command: [
        "--name", "aps", 
        "--region", "ap-northeast-1", 
        "--host", "aps-workspaces.ap-northeast-1.amazonaws.com", 
        "-v"
        ]

volumes:
  grafana-storage:

おまけ

電力量と電気料金を算出してみました。

扇風機

1時間使用した場合

image.png

洗濯機

1回の選択

image.png

在宅勤務

ノートPCとモニターの消費電力。9:00~19:00の合計

grafana.moritalous.tk_d_o-MPJxnVk_zai-zhai-qin-wu_orgId=1.png

12:00~13:00の休憩中は電力消費も抑えられるんですね