🦀
はんだ付けから始めるEmbedded Rust on Espressif(3)
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