🦀

はんだ付けから始めるEmbedded Rust on Espressif(3)

2023/12/08に公開

prometheusで値を取得する

前回まででESP32をWifiに接続してDHT11から温湿度を返す簡単なAPIサーバが作成できました。
JSONを返すのを変更してprometheusでmetricsを取得できるように変更してみます。

HTTPのハンドラ部分のURLを/からmetricsにしてpromethuesの書式を返すように変更しました。

    let mut server = EspHttpServer::new(&Configuration::default())?;
    server.fn_handler("/metrics", Method::Get, move |request| {
        let mut metrics_string = String::new();
        let mut dht11_delay = Ets;
        match dht11.lock().unwrap().perform_measurement(&mut dht11_delay) {
            Ok(m) => {
                metrics_string.push_str("# TYPE dht11_temperature gauge");
                metrics_string.push('\n');
                metrics_string.push_str(&*format!("dht11_temperature {}", m.temperature as f32 / 10.0));
                metrics_string.push('\n');
                metrics_string.push_str("# TYPE dht11_humidity gauge");
                metrics_string.push('\n');
                metrics_string.push_str(&*format!("dht11_humidity {}", m.humidity as f32 / 10.0));
                metrics_string.push('\n');
            },
            Err(e) => println!("{:?}", e),
        }
        let mut response = request.into_ok_response()?;
        response.write_all(metrics_string.as_bytes())?;
        Ok(())
    })?;

変更したプログラムを書き込んでESP32にHTTPリクエストを送るとprometheusの書式でレスポンスが返ってくるようになりました。
PCから抜いてモバイルバッテリーから電源供給をして玄関の外に置いておきます。

$ curl http://192.168.0.190/metrics
# TYPE dht11_temperature gauge
dht11_temperature 17
# TYPE dht11_humidity gauge
dht11_humidity 33

prometheusとgrafanaで値を表示する

promethuesとgrafanaでESP32から取得した温湿度を表示してみましょう。
以下のようにフォルダにファイルを置きます。

$ tree .
.
├── docker-compose.yml
└── prometheus
    └── prometheus.yaml

docker-compose.ymlファイルの内容です。

version: '3'
services:
  prometheus:
    image: prom/prometheus
    container_name: prometheus
    volumes:
      - ./prometheus:/etc/prometheus
    command: "--config.file=/etc/prometheus/prometheus.yaml"
    ports:
      - 9090:9090
    restart: always

  grafana:
    image: grafana/grafana:latest
    container_name: grafana
    ports:
      - 3000:3000
    restart: always

prometheus.yamlにはESP32のIPアドレスをセットしておきます。

$ cat prometheus/prometheus.yaml
global:
  scrape_interval: 15s

scrape_configs:
  - job_name: 'ESP32'
    scrape_interval: 30s
    static_configs:
      - targets:
        - '192.168.0.190:80'

設定できたら起動します。

$ docker compose up -d

promethuesのUIにアクセスして、ESP32がtargetとして機能しているか確認します。
ちゃんとスクレイピングしてmetricsを取れてそうです。

grafanaにアクセスしてデータソースにpromethuesを追加して、温湿度をグラフで見てみます。

筆者は川崎市に住んでいますが、ちょうど横浜のアメダスと同じように気温が下降していることがわかります。

追記:朝になりました。明け方に冷え切っているのがわかりますね。

最後に

というわけで3日間連続で所属企業と全く関係のない、ESP32をRustで遊ぶ電子工作の記事を書いてみました。
引き続きESP32とRustで遊んでみたいと思います。

Discussion