统计
统计(Statistic)
目录
Statistic 资源是一个只读端点,返回扁平的数字计数器。它专为仪表盘以及监控/告警系统(例如 Zabbix)设计:每个值都有稳定的 JSONPath,因此可以直接映射到监控项或触发器上。
- 基础路径:
/api/v2/statistic - 作用域:
statistic:read - 起始版本: 3.1.0
注意
请先阅读 API v2 概览,了解认证、响应封装与错误码。
端点
| 动词 | 路径 | 作用域 | 用途 | 起始版本 |
|---|---|---|---|---|
GET |
/api/v2/statistic |
statistic:read |
返回一个或多个统计主题 | 3.1.0 |
查询参数:
| 参数 | 默认值 | 取值 |
|---|---|---|
profile |
qso |
qso、confirmations、system、full |
每个主题都嵌套在自己的键下,因此无论你单独请求该主题,还是把它作为 full 的一部分请求,某个值的 JSONPath 都完全相同(例如 $.data.qso.total)。响应的 meta 会报告所请求的 profile,以及令牌所有者是否为 admin。
注意(集体台令牌报告全台数据)
与 QSO 资源不同,这些计数器不会收窄到当前操作的成员:每个集体台令牌在任何权限级别下都能看到整个集体台的数字。这些值是聚合数据,而不是 QSO 数据。
有一点后果值得了解:对于低于干事级别的成员,
$.data.qso.total会大于GET /api/v2/qso的meta.total。
主题
qso(默认)
QSO 统计分析,范围限定在令牌所有者的台站位置——这些是你自己的数字,而不是整个实例的。
curl "https://<WAVELOG_URL>/index.php/api/v2/statistic?profile=qso" \
-H "Authorization: Bearer wl2_your_token_here"
{
"data": {
"qso": {
"total": 28,
"activity": { "today": 2, "month": 5, "year": 7 },
"breakdown": {
"by_band": [ { "band": "20m", "count": 12 } ],
"by_mode": [ { "mode": "CW", "count": 7 } ]
},
"dxcc": {
"worked": 15,
"confirmed": 9,
"confirmed_paper": 6,
"confirmed_lotw": 7,
"available": 340,
"deleted": { "worked": 1, "confirmed": 1, "confirmed_paper": 1, "confirmed_lotw": 0 }
}
}
},
"meta": { "profile": "qso", "admin": false }
}
注意(Wavelog 3.1.1 新增)
dxcc块新增了纸质/LoTW 确认的拆分以及一个deleted子对象,与仪表盘的 DXCC 卡片一致(PR #3663,对应 #3656 / #3615)。
confirmed_paper、confirmed_lotw:confirmed按纸质 QSL 与按 LoTW 的拆分(允许重叠,因此各自<= confirmed)。deleted:对已通联但此后从有效列表中移除的 DXCC 实体,给出同样三个键——即卡片上带括号显示的数字。available现在只统计当前有效的 DXCC 实体(不含已删除的),从而与仪表盘「Needed」的分母保持一致。
dxcc 对应仪表盘的 DXCC 卡片。confirmed 统计通过纸质 QSL 或 LoTW 确认的实体(两者合并并去重——也就是卡片上「Needed」的分子);confirmed_paper 与 confirmed_lotw 是卡片在 Confirmed 行展示的拆分,因此各自 <= confirmed,而它们的和可能超过它。available 是当前有效 DXCC 实体的数量(不含已删除的)。deleted 对已通联但此后从有效列表中移除的实体提供同样的结构——即卡片上带括号的数字。eQSL 被有意排除在 dxcc.confirmed 之外,尽管它会出现在下文的确认主题中。
by_band 与 by_mode 返回按数量排序的靠前条目。
confirmations
按确认类型统计的 QSL 确认数量,并连同总计一起按波段和按模式细分。与 qso 一样,其范围限定在令牌所有者的台站位置。
与其他主题不同,confirmations 接受筛选条件。它们全部可选,并且可以组合使用:
| 参数 | 默认值 | 取值 |
|---|---|---|
type |
全部 | 以逗号分隔的 lotw、eqsl、qsl、qrz、clublog 列表 |
since |
无 | YYYY-MM-DD — 仅限该日期当天或之后收到的确认 |
qso_since |
无 | YYYY-MM-DD — 仅限该日期当天或之后完成的 QSO |
qso_until |
无 | YYYY-MM-DD — 仅限该日期当天或之前完成的 QSO |
band |
全部 | 波段,例如 20m;卫星 QSO 用 SAT |
mode |
全部 | 模式或子模式,例如 CW 或 FT8 |
since 与 qso_since 回答的是不同的问题。since 按确认到达的日期筛选——「这一周来了多少条确认」——并且按类型分别套用该类型自己的收件日期列。qso_since/qso_until 按 QSO 本身的日期筛选——「我从一月以来有多少 QSO 被确认了」,或者成对使用,「去年的比赛 QSO 最后确认情况如何」。两端都是包含式的,也可以单独使用。它们与 QSO 列表 上的筛选条件相同。
非法的 type 取值或格式错误的日期会返回 400 validation_error。请注意 HRDLog 不是确认类型:Wavelog 只向它上传,没有任何接收状态可统计。
每一行都在各类型计数旁边带有两个框定用的数字:
| 字段 | 含义 |
|---|---|
qsos |
经过全部筛选后,这些计数器所依据的 QSO 数 |
confirmed |
被所请求类型中至少一种确认的 QSO 数 |
注意(关于
confirmed的说明)
confirmed刻意不是各类型计数之和:一个同时通过 LoTW 和 eQSL 确认的 QSO 是一个已确认 QSO,而不是两个。因此confirmed <= lotw + eqsl + …,而confirmed <= qsos始终成立。把一行读作「17m 上有 68 个 QSO,其中 50 个已确认,这 50 个中有 36 个通过 LoTW」才是本意。
完全没有一条确认的分组仍会列出——有 QSO 却没有任何确认的波段,往往才是你关注的那个。filters 对象会回显解析后的筛选条件,因此轮询程序无需记住自己发送过的查询,也能解读这些数字。
curl "https://<WAVELOG_URL>/index.php/api/v2/statistic?profile=confirmations&type=lotw,eqsl&since=2026-07-01" \
-H "Authorization: Bearer wl2_your_token_here"
{
"data": {
"confirmations": {
"counts": { "qsos": 2480, "lotw": 812, "eqsl": 430, "confirmed": 1024 },
"by_band": [
{ "band": "20m", "qsos": 1120, "lotw": 402, "eqsl": 210, "confirmed": 501 },
{ "band": "40m", "qsos": 780, "lotw": 236, "eqsl": 118, "confirmed": 297 }
],
"by_mode": [
{ "mode": "FT8", "qsos": 1503, "lotw": 610, "eqsl": 300, "confirmed": 700 },
{ "mode": "CW", "qsos": 640, "lotw": 202, "eqsl": 130, "confirmed": 324 }
],
"filters": {
"type": ["lotw", "eqsl"],
"since": "2026-07-01",
"qso_since": null,
"qso_until": null,
"band": null,
"mode": null
}
}
},
"meta": { "profile": "confirmations", "admin": false }
}
只有所请求的类型会出现在 counts 以及各细分行中。把细分结果的某一列相加,总能得到 counts 中对应的值。
卫星 QSO 也被包含在内,并以其所属波段出现在 by_band 中;使用 band=SAT 可以单独查看它们。
system(仅管理员)
版本、构建与实例内部信息——用户数、数据库与 PHP 版本、Worker 状态、缓存与进程统计。
警告
system主题仅限 Wavelog 管理员所拥有的令牌。对于非管理员令牌,该主题会被完全隐藏:它不会出现在full中,而请求profile=system会返回400 validation_error(未知 profile),因此它的存在永远不会被透露。
{
"data": {
"system": {
"wavelog": "2.0",
"adif": "3.1.4",
"migration_db": 287,
"migration_config": 287,
"database": "8.0.36",
"php": "8.3.0",
"environment": "production",
"time": "2026-06-16 17:06:00",
"wavelog_stats": { "users": 3, "stations": 5, "logbooks": 4, "radios": 2 },
"system_stats": { "memory_usage": 8388608, "memory_peak": 10485760, "cpu_time": 0 },
"cache": {},
"worker": {
"enabled": true,
"client_url": "wss://log.example.org/ws",
"nodes": [
{ "name": "worker-1", "url": null, "alive": true, "version": "0.3.0", "active_topics": 2, "connected_clients": 5, "uptime": "3h22m0s" },
{ "name": "worker-2", "url": null, "alive": false, "version": "0.3.0", "active_topics": 1, "connected_clients": 3, "uptime": "1h02m11s" }
],
"nodes_alive": 1,
"nodes_total": 2,
"active_topics": 2,
"connected_clients": 5
}
}
},
"meta": { "profile": "system", "admin": true }
}
当 Worker 集成关闭时,worker 为 { "enabled": false }。否则:
| 字段 | 含义 |
|---|---|
nodes[] |
每个 Worker 节点一条记录。使用 Worker 0.3.0+ 时,该列表是 Worker 自身报告的集群名册(name = 主机名,url = null)。使用更旧的 Worker,或在 Redis 不可达期间,Wavelog 改为轮询每个已配置的 URL(name = url = 被轮询的 URL)。 |
nodes[].alive |
名册模式:心跳在 15 秒以内。轮询模式:/internal/status 返回 HTTP 200。已崩溃的节点会在 15 分钟内继续以 alive: false 列出。 |
nodes_total / nodes_alive |
nodes[] 的条目数,以及其中存活的节点数。nodes_alive < nodes_total 就是调试页面显示为「Degraded」的情形。 |
active_topics / connected_clients |
存活节点上的合计值;如果没有节点响应,则为 null。 |
full
返回该令牌有权查看的每个主题。对普通令牌来说就是 qso 和 confirmations;对管理员令牌还会包含 system。confirmations 的筛选条件在这里同样适用。
curl "https://<WAVELOG_URL>/index.php/api/v2/statistic?profile=full" \
-H "Authorization: Bearer wl2_your_token_here"
监控建议
- 只需要少数几个数值时,轮询单个开销较小的主题(
profile=qso),而不是full。 - 由于 JSONPath 是稳定的,你可以把 Zabbix(或类似系统)的监控项直接指向例如
$.data.qso.total或$.data.qso.activity.today。确认计数器同样如此,例如$.data.confirmations.counts.lotw。 - 要对新到的确认告警,轮询
profile=confirmations&since=<yesterday>,并在$.data.confirmations.counts.confirmed上触发。 - 遵守实例所有者设置的任何速率限制。