@antseed/cli 0.1.107 → 0.1.109
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/cli/commands/metrics.d.ts +3 -0
- package/dist/cli/commands/metrics.d.ts.map +1 -0
- package/dist/cli/commands/metrics.js +353 -0
- package/dist/cli/commands/metrics.js.map +1 -0
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/proxy/buyer-proxy.d.ts.map +1 -1
- package/dist/proxy/buyer-proxy.js +12 -0
- package/dist/proxy/buyer-proxy.js.map +1 -1
- package/dist/proxy/buyer-proxy.test.js +33 -0
- package/dist/proxy/buyer-proxy.test.js.map +1 -1
- package/package.json +19 -19
- package/LICENSE +0 -674
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.d.ts","sourceRoot":"","sources":["../../../src/cli/commands/metrics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAuVzC,wBAAgB,sBAAsB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAiD7D"}
|
|
@@ -0,0 +1,353 @@
|
|
|
1
|
+
import chalk from 'chalk';
|
|
2
|
+
import { createServer } from 'node:http';
|
|
3
|
+
import { existsSync } from 'node:fs';
|
|
4
|
+
import { readFile } from 'node:fs/promises';
|
|
5
|
+
import { join } from 'node:path';
|
|
6
|
+
import { loadConfig } from '../../config/loader.js';
|
|
7
|
+
import { getGlobalOptions } from './types.js';
|
|
8
|
+
import { createDepositsClient } from '../payment-utils.js';
|
|
9
|
+
import { FileIdentityStore, identityFromPrivateKeyHex } from '@antseed/node';
|
|
10
|
+
import { MeteringStorage } from '@antseed/node/metering';
|
|
11
|
+
import { ChannelStore } from '@antseed/node/payments';
|
|
12
|
+
const MICRO_USDC = 1_000_000;
|
|
13
|
+
const DAY_MS = 86_400_000;
|
|
14
|
+
function num(value) {
|
|
15
|
+
if (typeof value === 'number')
|
|
16
|
+
return Number.isFinite(value) ? value : 0;
|
|
17
|
+
if (typeof value === 'bigint')
|
|
18
|
+
return Number(value);
|
|
19
|
+
if (typeof value === 'string') {
|
|
20
|
+
const parsed = Number(value);
|
|
21
|
+
return Number.isFinite(parsed) ? parsed : 0;
|
|
22
|
+
}
|
|
23
|
+
return 0;
|
|
24
|
+
}
|
|
25
|
+
function microsToUsdc(value) {
|
|
26
|
+
return num(value) / MICRO_USDC;
|
|
27
|
+
}
|
|
28
|
+
function utcDayStartMs(now = Date.now()) {
|
|
29
|
+
const d = new Date(now);
|
|
30
|
+
return Date.UTC(d.getUTCFullYear(), d.getUTCMonth(), d.getUTCDate());
|
|
31
|
+
}
|
|
32
|
+
function metricLineName(name) {
|
|
33
|
+
return name.replace(/[^a-zA-Z0-9_:]/g, '_');
|
|
34
|
+
}
|
|
35
|
+
function escapeLabelValue(value) {
|
|
36
|
+
return String(value ?? '')
|
|
37
|
+
.replace(/\\/g, '\\\\')
|
|
38
|
+
.replace(/\n/g, '\\n')
|
|
39
|
+
.replace(/"/g, '\\"');
|
|
40
|
+
}
|
|
41
|
+
function formatLabels(labels) {
|
|
42
|
+
const entries = Object.entries(labels ?? {}).filter(([, value]) => value !== undefined && value !== null && value !== '');
|
|
43
|
+
if (entries.length === 0)
|
|
44
|
+
return '';
|
|
45
|
+
return `{${entries.map(([key, value]) => `${metricLineName(key)}="${escapeLabelValue(value)}"`).join(',')}}`;
|
|
46
|
+
}
|
|
47
|
+
function formatMetricValue(value) {
|
|
48
|
+
if (typeof value === 'bigint')
|
|
49
|
+
return value.toString();
|
|
50
|
+
if (typeof value === 'number')
|
|
51
|
+
return Number.isFinite(value) ? String(value) : '0';
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
function renderPrometheus(samples) {
|
|
55
|
+
const meta = new Map();
|
|
56
|
+
for (const sample of samples) {
|
|
57
|
+
const name = metricLineName(sample.name);
|
|
58
|
+
if (!meta.has(name))
|
|
59
|
+
meta.set(name, { help: sample.help, type: sample.type });
|
|
60
|
+
}
|
|
61
|
+
const lines = [];
|
|
62
|
+
for (const [name, info] of meta.entries()) {
|
|
63
|
+
lines.push(`# HELP ${name} ${info.help.replace(/\n/g, ' ')}`);
|
|
64
|
+
lines.push(`# TYPE ${name} ${info.type}`);
|
|
65
|
+
for (const sample of samples.filter((row) => metricLineName(row.name) === name)) {
|
|
66
|
+
lines.push(`${name}${formatLabels(sample.labels)} ${formatMetricValue(sample.value)}`);
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
lines.push('');
|
|
70
|
+
return lines.join('\n');
|
|
71
|
+
}
|
|
72
|
+
function labels(base, extra) {
|
|
73
|
+
return { ...base, ...(extra ?? {}) };
|
|
74
|
+
}
|
|
75
|
+
function addSample(samples, baseLabels, sample) {
|
|
76
|
+
samples.push({ ...sample, labels: labels(baseLabels, sample.labels) });
|
|
77
|
+
}
|
|
78
|
+
function effectiveMicros(channel) {
|
|
79
|
+
return Math.max(num(channel.authMax), num(channel.settledAmount), num(channel.previousConsumption));
|
|
80
|
+
}
|
|
81
|
+
function channelEventMs(channel) {
|
|
82
|
+
return num(channel.settledAt) || num(channel.updatedAt) || num(channel.createdAt) || num(channel.reservedAt);
|
|
83
|
+
}
|
|
84
|
+
async function loadExistingWalletAddress(dataDir) {
|
|
85
|
+
const rawEnvHex = process.env.ANTSEED_IDENTITY_HEX?.trim();
|
|
86
|
+
const envHex = rawEnvHex?.startsWith('0x') ? rawEnvHex.slice(2) : rawEnvHex;
|
|
87
|
+
if (envHex && envHex.length === 64)
|
|
88
|
+
return identityFromPrivateKeyHex(envHex).wallet.address;
|
|
89
|
+
const existingHex = await new FileIdentityStore(dataDir).load();
|
|
90
|
+
if (existingHex && existingHex.length === 64)
|
|
91
|
+
return identityFromPrivateKeyHex(existingHex).wallet.address;
|
|
92
|
+
return '';
|
|
93
|
+
}
|
|
94
|
+
function listChannels(dataDir, limit) {
|
|
95
|
+
const dbPath = join(dataDir, 'payments', 'sessions.db');
|
|
96
|
+
if (!existsSync(dbPath))
|
|
97
|
+
return [];
|
|
98
|
+
const store = new ChannelStore(join(dataDir, 'payments'));
|
|
99
|
+
try {
|
|
100
|
+
return store.listAllChannels(limit);
|
|
101
|
+
}
|
|
102
|
+
finally {
|
|
103
|
+
store.close();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
async function readDaemonState(dataDir) {
|
|
107
|
+
try {
|
|
108
|
+
return JSON.parse(await readFile(join(dataDir, 'daemon.state.json'), 'utf-8'));
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
return null;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
async function addCommonMetrics(samples, baseLabels, dataDir) {
|
|
115
|
+
const daemon = await readDaemonState(dataDir);
|
|
116
|
+
addSample(samples, baseLabels, {
|
|
117
|
+
name: 'antseed_metrics_scrape_timestamp_seconds',
|
|
118
|
+
help: 'Unix timestamp of the metrics scrape.',
|
|
119
|
+
type: 'gauge',
|
|
120
|
+
value: Math.floor(Date.now() / 1000),
|
|
121
|
+
});
|
|
122
|
+
addSample(samples, baseLabels, {
|
|
123
|
+
name: 'antseed_daemon_up',
|
|
124
|
+
help: 'Whether a local Antseed daemon state file exists and is readable.',
|
|
125
|
+
type: 'gauge',
|
|
126
|
+
value: daemon ? 1 : 0,
|
|
127
|
+
});
|
|
128
|
+
if (daemon) {
|
|
129
|
+
addSample(samples, baseLabels, {
|
|
130
|
+
name: 'antseed_daemon_info',
|
|
131
|
+
help: 'Static daemon info from daemon.state.json.',
|
|
132
|
+
type: 'gauge',
|
|
133
|
+
labels: {
|
|
134
|
+
state: String(daemon.state ?? 'unknown'),
|
|
135
|
+
peer_id: String(daemon.peerId ?? ''),
|
|
136
|
+
dht_port: daemon.dhtPort == null ? '' : String(daemon.dhtPort),
|
|
137
|
+
signaling_port: daemon.signalingPort == null ? '' : String(daemon.signalingPort),
|
|
138
|
+
},
|
|
139
|
+
value: 1,
|
|
140
|
+
});
|
|
141
|
+
addSample(samples, baseLabels, {
|
|
142
|
+
name: 'antseed_daemon_active_channels',
|
|
143
|
+
help: 'Active channel count reported by the running daemon state.',
|
|
144
|
+
type: 'gauge',
|
|
145
|
+
value: num(daemon.activeChannels),
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
async function addBuyerMetrics(samples, baseLabels, dataDir, includeChain, configPath) {
|
|
150
|
+
const wallet = await loadExistingWalletAddress(dataDir);
|
|
151
|
+
const buyerLabels = { ...baseLabels, role: 'buyer', wallet };
|
|
152
|
+
const allChannels = listChannels(dataDir, 1_000_000).filter((channel) => channel.role === 'buyer' && (!wallet || channel.buyerEvmAddr.toLowerCase() === wallet.toLowerCase()));
|
|
153
|
+
const dayStart = utcDayStartMs();
|
|
154
|
+
addSample(samples, buyerLabels, {
|
|
155
|
+
name: 'antseed_buyer_channels_total',
|
|
156
|
+
help: 'Buyer payment channels by status from local channel store.',
|
|
157
|
+
type: 'gauge',
|
|
158
|
+
labels: { status: 'all' },
|
|
159
|
+
value: allChannels.length,
|
|
160
|
+
});
|
|
161
|
+
for (const status of ['active', 'settled', 'timeout', 'ghost']) {
|
|
162
|
+
addSample(samples, buyerLabels, {
|
|
163
|
+
name: 'antseed_buyer_channels_total',
|
|
164
|
+
help: 'Buyer payment channels by status from local channel store.',
|
|
165
|
+
type: 'gauge',
|
|
166
|
+
labels: { status },
|
|
167
|
+
value: allChannels.filter((channel) => channel.status === status).length,
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
const allTimeMicros = allChannels.reduce((sum, channel) => sum + effectiveMicros(channel), 0);
|
|
171
|
+
const todayMicros = allChannels
|
|
172
|
+
.filter((channel) => channelEventMs(channel) >= dayStart)
|
|
173
|
+
.reduce((sum, channel) => sum + effectiveMicros(channel), 0);
|
|
174
|
+
const activeAuthorizedMicros = allChannels
|
|
175
|
+
.filter((channel) => channel.status === 'active')
|
|
176
|
+
.reduce((sum, channel) => sum + num(channel.authMax), 0);
|
|
177
|
+
const requests = allChannels.reduce((sum, channel) => sum + channel.requestCount, 0);
|
|
178
|
+
const tokens = allChannels.reduce((sum, channel) => sum + num(channel.tokensDelivered), 0);
|
|
179
|
+
addSample(samples, buyerLabels, { name: 'antseed_buyer_spend_usdc_total', help: 'Buyer all-time authorized/effective spend in USDC from local channels.', type: 'counter', value: microsToUsdc(allTimeMicros) });
|
|
180
|
+
addSample(samples, buyerLabels, { name: 'antseed_buyer_spend_today_usdc', help: 'Buyer spend attributed to channels updated since UTC day start.', type: 'gauge', value: microsToUsdc(todayMicros) });
|
|
181
|
+
addSample(samples, buyerLabels, { name: 'antseed_buyer_active_authorized_usdc', help: 'Buyer USDC currently authorized in active channels.', type: 'gauge', value: microsToUsdc(activeAuthorizedMicros) });
|
|
182
|
+
addSample(samples, buyerLabels, { name: 'antseed_buyer_requests_total', help: 'Buyer request count from local channels.', type: 'counter', value: requests });
|
|
183
|
+
addSample(samples, buyerLabels, { name: 'antseed_buyer_tokens_total', help: 'Buyer token count from local channels.', type: 'counter', value: tokens });
|
|
184
|
+
const byPeer = new Map();
|
|
185
|
+
for (const channel of allChannels) {
|
|
186
|
+
const row = byPeer.get(channel.peerId) ?? { spend: 0, requests: 0, tokens: 0, channels: 0 };
|
|
187
|
+
row.spend += effectiveMicros(channel);
|
|
188
|
+
row.requests += channel.requestCount;
|
|
189
|
+
row.tokens += num(channel.tokensDelivered);
|
|
190
|
+
row.channels += 1;
|
|
191
|
+
byPeer.set(channel.peerId, row);
|
|
192
|
+
}
|
|
193
|
+
for (const [peerId, row] of byPeer.entries()) {
|
|
194
|
+
addSample(samples, buyerLabels, { name: 'antseed_buyer_peer_spend_usdc_total', help: 'Buyer all-time spend by seller peer.', type: 'counter', labels: { peer_id: peerId }, value: microsToUsdc(row.spend) });
|
|
195
|
+
addSample(samples, buyerLabels, { name: 'antseed_buyer_peer_requests_total', help: 'Buyer all-time requests by seller peer.', type: 'counter', labels: { peer_id: peerId }, value: row.requests });
|
|
196
|
+
addSample(samples, buyerLabels, { name: 'antseed_buyer_peer_tokens_total', help: 'Buyer all-time tokens by seller peer.', type: 'counter', labels: { peer_id: peerId }, value: row.tokens });
|
|
197
|
+
addSample(samples, buyerLabels, { name: 'antseed_buyer_peer_channels_total', help: 'Buyer channel count by seller peer.', type: 'gauge', labels: { peer_id: peerId }, value: row.channels });
|
|
198
|
+
}
|
|
199
|
+
if (includeChain && wallet) {
|
|
200
|
+
try {
|
|
201
|
+
const config = await loadConfig(configPath);
|
|
202
|
+
const deposits = createDepositsClient(config);
|
|
203
|
+
const [account, walletUsdc] = await Promise.all([
|
|
204
|
+
deposits.getBuyerBalance(wallet),
|
|
205
|
+
deposits.getUSDCBalance(wallet),
|
|
206
|
+
]);
|
|
207
|
+
addSample(samples, buyerLabels, { name: 'antseed_buyer_deposits_available_usdc', help: 'Buyer deposits available in the deposits contract.', type: 'gauge', value: microsToUsdc(account.available) });
|
|
208
|
+
addSample(samples, buyerLabels, { name: 'antseed_buyer_deposits_reserved_usdc', help: 'Buyer deposits reserved in the deposits contract.', type: 'gauge', value: microsToUsdc(account.reserved) });
|
|
209
|
+
addSample(samples, buyerLabels, { name: 'antseed_wallet_usdc', help: 'Wallet USDC balance.', type: 'gauge', value: microsToUsdc(walletUsdc) });
|
|
210
|
+
}
|
|
211
|
+
catch (error) {
|
|
212
|
+
addSample(samples, buyerLabels, { name: 'antseed_chain_scrape_error', help: 'Whether chain balance collection failed.', type: 'gauge', labels: { error: error instanceof Error ? error.message : String(error) }, value: 1 });
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
async function addSellerMetrics(samples, baseLabels, dataDir) {
|
|
217
|
+
const wallet = await loadExistingWalletAddress(dataDir);
|
|
218
|
+
const daemon = await readDaemonState(dataDir);
|
|
219
|
+
const sellerLabels = { ...baseLabels, role: 'seller', wallet, peer_id: String(daemon?.peerId ?? '') };
|
|
220
|
+
const allChannels = listChannels(dataDir, 1_000_000).filter((channel) => channel.role === 'seller');
|
|
221
|
+
const dayStart = utcDayStartMs();
|
|
222
|
+
addSample(samples, sellerLabels, {
|
|
223
|
+
name: 'antseed_seller_channels_total',
|
|
224
|
+
help: 'Seller payment channels by status from local channel store.',
|
|
225
|
+
type: 'gauge',
|
|
226
|
+
labels: { status: 'all' },
|
|
227
|
+
value: allChannels.length,
|
|
228
|
+
});
|
|
229
|
+
for (const status of ['active', 'settled', 'timeout', 'ghost']) {
|
|
230
|
+
addSample(samples, sellerLabels, {
|
|
231
|
+
name: 'antseed_seller_channels_total',
|
|
232
|
+
help: 'Seller payment channels by status from local channel store.',
|
|
233
|
+
type: 'gauge',
|
|
234
|
+
labels: { status },
|
|
235
|
+
value: allChannels.filter((channel) => channel.status === status).length,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
const deliveredMicros = allChannels.reduce((sum, channel) => sum + num(channel.tokensDelivered), 0);
|
|
239
|
+
const settledMicros = allChannels.reduce((sum, channel) => sum + num(channel.settledAmount), 0);
|
|
240
|
+
const authorizedMicros = allChannels.reduce((sum, channel) => sum + num(channel.authMax), 0);
|
|
241
|
+
const deliveredTodayMicros = allChannels
|
|
242
|
+
.filter((channel) => channelEventMs(channel) >= dayStart)
|
|
243
|
+
.reduce((sum, channel) => sum + num(channel.tokensDelivered), 0);
|
|
244
|
+
const requests = allChannels.reduce((sum, channel) => sum + channel.requestCount, 0);
|
|
245
|
+
const tokens = allChannels.reduce((sum, channel) => sum + num(channel.tokensDelivered), 0);
|
|
246
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_payment_delivered_usdc_total', help: 'Seller all-time delivered payment amount from local payment channel ledger.', type: 'counter', value: microsToUsdc(deliveredMicros) });
|
|
247
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_payment_delivered_today_usdc', help: 'Seller delivered payment amount since UTC day start.', type: 'gauge', value: microsToUsdc(deliveredTodayMicros) });
|
|
248
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_payment_settled_usdc_total', help: 'Seller all-time settled payment amount from local payment channel ledger.', type: 'counter', value: microsToUsdc(settledMicros) });
|
|
249
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_payment_authorized_usdc_total', help: 'Seller all-time authorized payment amount from local payment channel ledger.', type: 'counter', value: microsToUsdc(authorizedMicros) });
|
|
250
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_channel_requests_total', help: 'Seller request count from local payment channel ledger.', type: 'counter', value: requests });
|
|
251
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_channel_tokens_total', help: 'Seller delivered token/payment counter from local payment channel ledger.', type: 'counter', value: tokens });
|
|
252
|
+
try {
|
|
253
|
+
const meteringPath = join(dataDir, 'metering.db');
|
|
254
|
+
if (!existsSync(meteringPath))
|
|
255
|
+
return;
|
|
256
|
+
const metering = new MeteringStorage(meteringPath);
|
|
257
|
+
try {
|
|
258
|
+
const allEvents = metering.getEventTokenSummary(0, Date.now() + DAY_MS);
|
|
259
|
+
const todayEvents = metering.getEventTokenSummary(dayStart, Date.now() + DAY_MS);
|
|
260
|
+
const allSessions = metering.getSessionSummary(0, Date.now() + DAY_MS);
|
|
261
|
+
const todaySessions = metering.getSessionSummary(dayStart, Date.now() + DAY_MS);
|
|
262
|
+
const receiptCents = metering.getTotalCost(0, Date.now() + DAY_MS);
|
|
263
|
+
const receiptTodayCents = metering.getTotalCost(dayStart, Date.now() + DAY_MS);
|
|
264
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_metering_requests_total', help: 'Seller metering event request count.', type: 'counter', value: allEvents.totalRequests });
|
|
265
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_metering_requests_today', help: 'Seller metering event request count since UTC day start.', type: 'gauge', value: todayEvents.totalRequests });
|
|
266
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_metering_tokens_total', help: 'Seller metering event token count.', type: 'counter', value: allEvents.totalTokens });
|
|
267
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_metering_tokens_today', help: 'Seller metering event token count since UTC day start.', type: 'gauge', value: todayEvents.totalTokens });
|
|
268
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_metering_input_tokens_total', help: 'Seller metering input token count.', type: 'counter', value: allEvents.inputTokens });
|
|
269
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_metering_output_tokens_total', help: 'Seller metering output token count.', type: 'counter', value: allEvents.outputTokens });
|
|
270
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_sessions_total', help: 'Seller metering session count.', type: 'counter', value: allSessions.channelCount });
|
|
271
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_sessions_today', help: 'Seller metering session count since UTC day start.', type: 'gauge', value: todaySessions.channelCount });
|
|
272
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_receipt_revenue_usd_total', help: 'Seller usage receipt revenue in USD from local metering ledger.', type: 'counter', value: receiptCents / 100 });
|
|
273
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_receipt_revenue_today_usd', help: 'Seller usage receipt revenue in USD since UTC day start.', type: 'gauge', value: receiptTodayCents / 100 });
|
|
274
|
+
}
|
|
275
|
+
finally {
|
|
276
|
+
metering.close();
|
|
277
|
+
}
|
|
278
|
+
}
|
|
279
|
+
catch (error) {
|
|
280
|
+
addSample(samples, sellerLabels, { name: 'antseed_seller_metering_scrape_error', help: 'Whether seller metering DB collection failed.', type: 'gauge', labels: { error: error instanceof Error ? error.message : String(error) }, value: 1 });
|
|
281
|
+
}
|
|
282
|
+
}
|
|
283
|
+
async function collectMetrics(options, dataDir, configPath) {
|
|
284
|
+
const role = (options.role ?? 'auto').toLowerCase();
|
|
285
|
+
const instance = options.instance || process.env.ANTSEED_METRICS_INSTANCE || process.env.HOSTNAME || 'antseed';
|
|
286
|
+
const baseLabels = { instance };
|
|
287
|
+
const samples = [];
|
|
288
|
+
await addCommonMetrics(samples, baseLabels, dataDir);
|
|
289
|
+
if (role === 'buyer' || role === 'both' || role === 'auto') {
|
|
290
|
+
await addBuyerMetrics(samples, baseLabels, dataDir, Boolean(options.includeChain), configPath).catch((error) => {
|
|
291
|
+
addSample(samples, { ...baseLabels, role: 'buyer' }, { name: 'antseed_buyer_scrape_error', help: 'Whether buyer metrics collection failed.', type: 'gauge', labels: { error: error instanceof Error ? error.message : String(error) }, value: 1 });
|
|
292
|
+
});
|
|
293
|
+
}
|
|
294
|
+
if (role === 'seller' || role === 'both' || role === 'auto') {
|
|
295
|
+
await addSellerMetrics(samples, baseLabels, dataDir).catch((error) => {
|
|
296
|
+
addSample(samples, { ...baseLabels, role: 'seller' }, { name: 'antseed_seller_scrape_error', help: 'Whether seller metrics collection failed.', type: 'gauge', labels: { error: error instanceof Error ? error.message : String(error) }, value: 1 });
|
|
297
|
+
});
|
|
298
|
+
}
|
|
299
|
+
return renderPrometheus(samples);
|
|
300
|
+
}
|
|
301
|
+
function send(res, status, body, contentType = 'text/plain; charset=utf-8') {
|
|
302
|
+
res.writeHead(status, { 'content-type': contentType });
|
|
303
|
+
res.end(body);
|
|
304
|
+
}
|
|
305
|
+
export function registerMetricsCommand(program) {
|
|
306
|
+
const metricsCmd = program
|
|
307
|
+
.command('metrics')
|
|
308
|
+
.description('Prometheus metrics exporter for Antseed buyers and sellers');
|
|
309
|
+
metricsCmd
|
|
310
|
+
.command('serve')
|
|
311
|
+
.description('Serve Antseed Prometheus metrics over HTTP')
|
|
312
|
+
.option('--role <role>', 'metrics role: buyer, seller, both, auto', process.env.ANTSEED_METRICS_ROLE || 'auto')
|
|
313
|
+
.option('--host <host>', 'listen host', process.env.ANTSEED_METRICS_HOST || '127.0.0.1')
|
|
314
|
+
.option('--port <port>', 'listen port', process.env.ANTSEED_METRICS_PORT || '9108')
|
|
315
|
+
.option('--path <path>', 'metrics path', process.env.ANTSEED_METRICS_PATH || '/metrics')
|
|
316
|
+
.option('--instance <name>', 'instance label for Prometheus series')
|
|
317
|
+
.option('--include-chain', 'include chain balance metrics; may add RPC latency', false)
|
|
318
|
+
.action(async (options) => {
|
|
319
|
+
const globalOpts = getGlobalOptions(metricsCmd);
|
|
320
|
+
const host = options.host || '127.0.0.1';
|
|
321
|
+
const port = Number(options.port || 9108);
|
|
322
|
+
const metricsPath = options.path || '/metrics';
|
|
323
|
+
if (!['buyer', 'seller', 'both', 'auto'].includes(String(options.role || 'auto'))) {
|
|
324
|
+
console.error(chalk.red('Error: --role must be one of buyer, seller, both, auto'));
|
|
325
|
+
process.exit(1);
|
|
326
|
+
}
|
|
327
|
+
const server = createServer((req, res) => {
|
|
328
|
+
void (async () => {
|
|
329
|
+
try {
|
|
330
|
+
const url = new URL(req.url || '/', `http://${req.headers.host || `${host}:${port}`}`);
|
|
331
|
+
if (url.pathname === '/healthz' || url.pathname === '/readyz') {
|
|
332
|
+
send(res, 200, 'ok\n');
|
|
333
|
+
return;
|
|
334
|
+
}
|
|
335
|
+
if (url.pathname !== metricsPath) {
|
|
336
|
+
send(res, 404, 'not found\n');
|
|
337
|
+
return;
|
|
338
|
+
}
|
|
339
|
+
const body = await collectMetrics(options, globalOpts.dataDir, globalOpts.config);
|
|
340
|
+
send(res, 200, body, 'text/plain; version=0.0.4; charset=utf-8');
|
|
341
|
+
}
|
|
342
|
+
catch (error) {
|
|
343
|
+
send(res, 500, `metrics scrape failed: ${error instanceof Error ? error.message : String(error)}\n`);
|
|
344
|
+
}
|
|
345
|
+
})();
|
|
346
|
+
});
|
|
347
|
+
server.listen(port, host, () => {
|
|
348
|
+
console.log(chalk.green(`Antseed metrics exporter listening on http://${host}:${port}${metricsPath}`));
|
|
349
|
+
console.log(chalk.dim(`role=${options.role || 'auto'} dataDir=${globalOpts.dataDir}`));
|
|
350
|
+
});
|
|
351
|
+
});
|
|
352
|
+
}
|
|
353
|
+
//# sourceMappingURL=metrics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metrics.js","sourceRoot":"","sources":["../../../src/cli/commands/metrics.ts"],"names":[],"mappings":"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"}
|
package/dist/cli/index.js
CHANGED
|
@@ -9,6 +9,7 @@ import { registerIdentityCommands } from './commands/identity/index.js';
|
|
|
9
9
|
import { registerAgentCommand } from './commands/agent.js';
|
|
10
10
|
import { registerDevCommand } from './commands/dev.js';
|
|
11
11
|
import { registerPaymentsCommand } from './commands/payments.js';
|
|
12
|
+
import { registerMetricsCommand } from './commands/metrics.js';
|
|
12
13
|
loadEnvFromFiles();
|
|
13
14
|
import pkg from '../../package.json' with { type: 'json' };
|
|
14
15
|
const version = pkg.version;
|
|
@@ -28,5 +29,6 @@ registerIdentityCommands(program);
|
|
|
28
29
|
registerDevCommand(program);
|
|
29
30
|
registerAgentCommand(program);
|
|
30
31
|
registerPaymentsCommand(program);
|
|
32
|
+
registerMetricsCommand(program);
|
|
31
33
|
program.parse(process.argv);
|
|
32
34
|
//# sourceMappingURL=index.js.map
|
package/dist/cli/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/cli/index.ts"],"names":[],"mappings":";AAEA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AACtD,OAAO,EAAE,sBAAsB,EAAE,MAAM,4BAA4B,CAAC;AACpE,OAAO,EAAE,qBAAqB,EAAE,MAAM,2BAA2B,CAAC;AAClE,OAAO,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACnE,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,wBAAwB,EAAE,MAAM,8BAA8B,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,MAAM,qBAAqB,CAAC;AAC3D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC;AAE/D,gBAAgB,EAAE,CAAC;AAEnB,OAAO,GAAG,MAAM,oBAAoB,CAAC,OAAO,IAAI,EAAE,MAAM,EAAE,CAAC;AAC3D,MAAM,OAAO,GAAG,GAAG,CAAC,OAAO,CAAC;AAE5B,MAAM,OAAO,GAAG,IAAI,OAAO,EAAE,CAAC;AAE9B,OAAO;KACJ,IAAI,CAAC,SAAS,CAAC;KACf,WAAW,CAAC,6BAA6B,CAAC;KAC1C,OAAO,CAAC,OAAO,CAAC;KAChB,MAAM,CAAC,qBAAqB,EAAE,4EAA4E,CAAC;KAC3G,MAAM,CAAC,mBAAmB,EAAE,oFAAoF,CAAC;KACjH,MAAM,CAAC,eAAe,EAAE,wBAAwB,EAAE,KAAK,CAAC,CAAC;AAE5D,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAChC,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,qBAAqB,CAAC,OAAO,CAAC,CAAC;AAC/B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,wBAAwB,CAAC,OAAO,CAAC,CAAC;AAClC,kBAAkB,CAAC,OAAO,CAAC,CAAC;AAC5B,oBAAoB,CAAC,OAAO,CAAC,CAAC;AAC9B,uBAAuB,CAAC,OAAO,CAAC,CAAC;AACjC,sBAAsB,CAAC,OAAO,CAAC,CAAC;AAEhC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"buyer-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/buyer-proxy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,
|
|
1
|
+
{"version":3,"file":"buyer-proxy.d.ts","sourceRoot":"","sources":["../../src/proxy/buyer-proxy.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EACV,WAAW,EACX,QAAQ,EAOT,MAAM,eAAe,CAAA;AAyCtB,OAAO,EAAE,8BAA8B,EAAE,KAAK,2BAA2B,EAAE,MAAM,cAAc,CAAA;AAC/F,OAAO,EAAE,oBAAoB,EAAE,MAAM,oBAAoB,CAAA;AAEzD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,WAAW,CAAA;IACjB,6FAA6F;IAC7F,OAAO,EAAE,MAAM,CAAA;IACf,kGAAkG;IAClG,2BAA2B,CAAC,EAAE,MAAM,CAAA;IACpC;;;;;OAKG;IACH,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB;;;;OAIG;IACH,YAAY,CAAC,EAAE,MAAM,CAAA;IACrB;;;;OAIG;IACH,aAAa,CAAC,EAAE,MAAM,CAAA;CACvB;AAkID;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,EACf,KAAK,GAAE,MAAmB,EAC1B,QAAQ,GAAE,MAA6B,GACtC,QAAQ,EAAE,CA4EZ;AAED;;;;;;GAMG;AACH,qBAAa,UAAU;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAQ;IAChC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAa;IACnC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAQ;IAC9B,OAAO,CAAC,QAAQ,CAAC,oBAAoB,CAAQ;IAC7C,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAQ;IACxC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAQ;IAClC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAQ;IACnC,OAAO,CAAC,kBAAkB,CAAQ;IAClC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,cAAc,CAAe;IACrC,OAAO,CAAC,mBAAmB,CAA6C;IAExE,OAAO,CAAC,gBAAgB,CAAmC;IAE3D,OAAO,CAAC,YAAY,CAAiB;IACrC,OAAO,CAAC,qBAAqB,CAAI;IACjC,OAAO,CAAC,mBAAmB,CAAI;IAC/B,OAAO,CAAC,mBAAmB,CAAmC;IAC9D,OAAO,CAAC,sBAAsB,CAAI;IAClC,OAAO,CAAC,gBAAgB,CAA8C;IAEtE;;;;;OAKG;IACH,OAAO,CAAC,aAAa,CAA2F;gBAEpG,MAAM,EAAE,gBAAgB;IA+B9B,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YA2Bd,0BAA0B;IAuBlC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB3B,OAAO,CAAC,eAAe;YAqBT,uBAAuB;IAkBrC,0FAA0F;IAC1F,OAAO,CAAC,eAAe;YAsBT,eAAe;IAe7B,OAAO,CAAC,uBAAuB;IAQ/B,OAAO,CAAC,aAAa;IAmCrB,OAAO,CAAC,oBAAoB;IAmD5B,OAAO,CAAC,UAAU;IAYlB;;;;;;;;OAQG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;;;;OAKG;IACH,OAAO,CAAC,uBAAuB;YASjB,yBAAyB;YASzB,gBAAgB;YA+BhB,SAAS;IA2BvB,OAAO,CAAC,+BAA+B;YAuBzB,mBAAmB;YA+HnB,cAAc;IAoR5B;;;;OAIG;YACW,eAAe;CA6T9B"}
|
|
@@ -191,6 +191,15 @@ export function parsePersistedPeers(parsed, nowMs = Date.now(), maxAgeMs = CARRY
|
|
|
191
191
|
if (typeof entry.onChainStatsFetchedAt === 'number' && Number.isFinite(entry.onChainStatsFetchedAt)) {
|
|
192
192
|
peer.onChainStatsFetchedAt = entry.onChainStatsFetchedAt;
|
|
193
193
|
}
|
|
194
|
+
// Carry sellerContract through the persistence layer so the buyer's
|
|
195
|
+
// SellerAddressResolver can return the facade address for facade-fronted
|
|
196
|
+
// peers (e.g. DiemStakingProxy). Without this, the resolver falls back to
|
|
197
|
+
// peerIdToAddress(peerId), the buyer signs channelId derived from the peer
|
|
198
|
+
// wallet, and `reserve()` reverts on-chain with InvalidSignature() because
|
|
199
|
+
// the contract derives channelId from msg.sender (the facade).
|
|
200
|
+
if (typeof entry.sellerContract === 'string' && entry.sellerContract.length > 0) {
|
|
201
|
+
peer.metadata = { sellerContract: entry.sellerContract };
|
|
202
|
+
}
|
|
194
203
|
peers.push(peer);
|
|
195
204
|
}
|
|
196
205
|
return peers;
|
|
@@ -475,6 +484,9 @@ export class BuyerProxy {
|
|
|
475
484
|
onChainTotalVolumeUsdcMicros: p.onChainTotalVolumeUsdcMicros ?? null,
|
|
476
485
|
onChainLastSettledAtSec: p.onChainLastSettledAtSec ?? null,
|
|
477
486
|
onChainStatsFetchedAt: p.onChainStatsFetchedAt ?? null,
|
|
487
|
+
// Persisted so cold-started buyers can still resolve the facade address
|
|
488
|
+
// for channelId derivation. See parsePersistedPeers for the round-trip.
|
|
489
|
+
sellerContract: p.metadata?.sellerContract ?? null,
|
|
478
490
|
lastSeen: p.lastSeen,
|
|
479
491
|
lastReachedAt: p.lastReachedAt ?? null,
|
|
480
492
|
};
|