Bounded StatsD/DogStatsD codec and native async UDP client
moon add Ryan-1125/moonstatsdmoon add moonbitlang/async@0.20.0import {
"Ryan-1125/moonstatsd/client",
"moonbitlang/async",
"moonbitlang/async/socket",
}
pkgtype(kind: "executable")///|
async fn main {
let address = @socket.Addr::parse("127.0.0.1:8125")
@client.with_client(address, client => {
ignore(client.record("requests", Counter(1.0), tags=["route:home"]))
ignore(client.record("latency", Timer(12.5))) // 毫秒
ignore(client.record("queue", Gauge(7.0)))
let report = client.flush()
println("local submitted=\{report.submitted}, send errors=\{report.send_errors}")
}, mode=DogStatsD, prefix="service.", fixed_tags=["env:dev"])
}moon run . --target nativeimport {
"Ryan-1125/moonstatsd" @statsd,
}
pkgtype(kind: "executable")///|
fn main raise {
let message = @statsd.encode("requests", Counter(1.0))
assert_eq(message.bytes(), b"requests:1|c")
let datagrams = @statsd.pack([message], max_bytes=512)
assert_eq(datagrams.length(), 1)
}| 指标或能力 | StatsD | DogStatsD |
|---|---|---|
| Counter、Timer(毫秒)、Set | 支持 | 支持 |
| Gauge(非负绝对值) | 支持 | 支持 |
| GaugeDelta(相对变化) | 支持 | 显式拒绝 |
| Histogram、Distribution | 显式拒绝 | 支持 |
| 指标名前缀 prefix | 支持 | 支持 |
| 固定标签与调用级标签 | 显式拒绝 | 支持 |
| 概率采样 | Counter、Timer | Counter、Timer、Histogram、Distribution |
| 操作 | 行为 |
|---|---|
| record | 校验、概率采样、入队;队列满时拒绝新记录 |
| 定时刷新 | 按字节预算合并完整指标并发送 |
| flush | 等待调用前已入队记录完成;后续生产者不延长屏障 |
| flush 超时或取消 | 结束当前等待,发送任务继续 |
| close | 立即拒绝新记录,限时排空;可重复调用 |
| close 超时或取消 | 中止发送任务,将剩余记录计入丢弃 |
| 回调正常退出 | 自动关闭;作用域退出时完成资源清理 |
| 回调失败或作用域取消 | 中止发送并清理资源 |
| 验证对象 | 覆盖内容 |
|---|---|
| native:25 项通过 | 协议、真实 UDP、有界队列、定时刷新、错误、取消、flush/close 竞争 |
| 纯核心 wasm-gc:6 项通过 | 编码、校验、采样和打包 |
| StatsD 0.9.0 | counter 采样放大、gauge 相对变化、timer、set 去重 |
| statsd_exporter 0.28.0 | counter、gauge、timer、histogram、distribution 与标签 |
| 官方 DogStatsD Agent 7.60.0 | counter、非负 gauge、timer、histogram、set 与标签的真实聚合输出 |
| datadog-go 5.8.3 | 六种共同指标的 wire 语义差分 |
| 独立 ZIP 消费与包审计 | 解压包独立编译、真实 UDP、包内资源检查 |
| Mooncakes 0.2.0 独立消费 | registry 依赖解析、编码与打包、真实 DogStatsD UDP 收发 |
| Windows / Ubuntu CI | 构建、测试、采集器互操作与独立消费 |
moon info --target native
moon fmt --check
moon test --target native
moon test --target wasm-gc --package Ryan-1125/moonstatsd
./tools/install-collectors.ps1
node tools/test-interop.mjs
node tools/test-reference.mjs
./tools/test-consumer.ps1
./tools/test-registry-consumer.ps1
./tools/test-readme.ps1
./tools/audit-package.ps1
./tools/prepare-release.ps1node tools/test-agent.mjspub struct Message {
// private fields
}pub(all) enum Metric {
Counter(Double)
Gauge(Double)
GaugeDelta(Double)
Timer(Double)
Set(String)
Histogram(Double)
Distribution(Double)
} derive(Debug)fn pack(messages : Array[Message], max_bytes? : Int, max_total_bytes? : Int) -> Array[Bytes] raise EncodeErrorInstall
Download zipBounded StatsD/DogStatsD codec and native async UDP client