asopi tech
asopi techIndie Developer

Asopitech With · メトリクス監視

Datadog with Alopex Skulk

Datadogは、インフラのメトリクスをグラフとアラートにする監視サービスです。Alopex Skulkで同じものを作るとしたら…?

更新: 2026/10/12

どんなサービスか

Datadogは、クラウドやオンプレミスのインフラを監視するサービスです。メトリクスを集めてグラフとアラートにし、タグで絞り込んで見せます。扱うデータは、ホストやサービスのタグが付いたメトリクスの時系列です。

データの置き場所

  • Skulkの時系列:CPU、メモリ、リクエスト数、遅延などのメトリクスを、ホストとサービスのタグを付けてSkulkに追記します。
  • PromQL:ダッシュボードのグラフとアラートの条件を、PromQLで問い合わせます。
  • 時間で区切る集計:時間ごとの平均や最大を、SQLの時間で区切る集計で出します。

メトリクスを集めて書き込むのも、アラートを送るのも、アプリのコードです。

配置の形

Skulkを、監視するアプリの中に組み込みます。アプリが自分のメトリクスを持ち、自分のダッシュボードを出せます。たくさんのアプリのメトリクスは、同じエンジンのSkulkのサーバー、クラスタで受けられます。

Alopex Skulkが合う理由

監視の基本は、タグ付きの時系列と、それに対する問い合わせです。Skulkは、取り込み、PromQL、時間の集計をアプリの中で行い、アプリの中から監視の基盤まで同じエンジンで広げられます。

コードで見る

メトリクスをホストのタグ付きでSkulkに取り込み、読み出す中心だけを取り出したコードです(Rust)。

use alopex_skulk::ingest::line_protocol::LineProtocolDecoder;
use alopex_skulk::ingest::{IngestLimits, Ingestor};
use alopex_skulk::model::FieldValue;
use alopex_skulk::store::recovery::{RecoveryConfig, RecoveryStore};

fn main() -> alopex_skulk::Result<()> {
    std::fs::create_dir_all("datadog-data").unwrap();
    let store = RecoveryStore::open("datadog-data", RecoveryConfig::default())?;
    let limits = IngestLimits::default();
    let mut ingestor = Ingestor::new(store, limits);

    // CPU 使用率を、ホストのタグ付きで取り込む(measurement,tag field timestamp[ns])
    let base: i64 = 7_200_000_000_000;
    let now = base + 300_000_000_000;
    for (i, usage) in [12.5, 40.0, 78.0].iter().enumerate() {
        let ts = base + (i as i64) * 60_000_000_000;
        let line = format!("cpu,host=web1 usage={usage} {ts}");
        let batch = LineProtocolDecoder::new(limits).decode(line.as_bytes(), now)?;
        assert_eq!(ingestor.ingest(batch, now)?.accepted_count(), 1);
    }
    ingestor.sink_mut().flush_all()?;

    // 取り込んだメトリクスを読み出す
    for row in &ingestor.sink().read_measurement("cpu")? {
        if let Some(FieldValue::Float(usage)) = row.row().field("usage") {
            println!("t={} usage={usage}", row.row().timestamp());
        }
    }
    Ok(())
}

取り込みは ingest() が返った時点でWALに永続します。ダッシュボードのグラフとアラートの条件は、SkulkのPromQL/時間で区切る集計で問い合わせます。

タグ付きの時系列をPromQLで問い合わせられるAlopex Skulkを組み込むと、アプリが自分のダッシュボードを持てます。小さなアプリから試してみてください。

関連リンク