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を組み込むと、アプリが自分のダッシュボードを持てます。小さなアプリから試してみてください。