Docker work
CI / test (push) Successful in 56s
Release rolling / release (push) Successful in 7m4s

This commit is contained in:
Raven Scott
2026-07-19 13:13:45 -04:00
parent 4b8d194b21
commit 1458915d78
14 changed files with 447 additions and 64 deletions
+38 -7
View File
@@ -16,6 +16,7 @@ import { EventEmitter } from 'events'
import { PearDataConnection } from '../../../client/connection.js'
import { Methods } from '../../../shared/protocol.js'
import { registerChart } from '../../../shared/metrics.js'
import { isHexId, resolveContainerLabel } from '../../../shared/container-names.js'
import logger from '../../utils/logger.js'
const log = logger.child('peardock')
@@ -68,7 +69,7 @@ export function remapDockChart(chartId) {
export function extractDockCharts(metrics) {
const root = metrics?.body || metrics
const charts = root?.charts || {}
/** @type {Array<{ chart: string, context: string, values: Record<string, number|null>, sourceChart: string }>} */
/** @type {Array<{ chart: string, context: string, values: Record<string, number|null>, sourceChart: string, title?: string, family?: string }>} */
const out = []
for (const [chartId, point] of Object.entries(charts)) {
const mapped = remapDockChart(chartId)
@@ -87,25 +88,47 @@ export function extractDockCharts(metrics) {
context,
values: nums,
sourceChart: chartId,
title: point?.title || point?.name || undefined,
family: point?.family || undefined,
})
}
return out
}
function registerMappedChart(mappedId, context, values) {
/**
* @param {string} mappedId
* @param {string} context
* @param {Record<string, number|null>} values
* @param {{ title?: string, family?: string }} [meta]
*/
function registerMappedChart(mappedId, context, values, meta = {}) {
const dims = Object.keys(values).map((id) => ({
id,
name: id,
algorithm: 'absolute',
}))
if (!dims.length) dims.push({ id: 'value', name: 'value', algorithm: 'absolute' })
const short = mappedId.split('.').pop() || mappedId
const fromMeta = meta.family || meta.title
let display
if (fromMeta) {
// Titles look like "nginx · CPU" — keep the name side
const base = String(fromMeta).includes('·')
? String(fromMeta).split('·')[0].trim()
: String(fromMeta).trim()
display = resolveContainerLabel(base || fromMeta, null)
} else {
display = isHexId(short, 12) ? `container ${short.slice(0, 12)}` : short
}
const kind = context.includes('mem') ? 'memory' : context.includes('cpu') ? 'CPU' : 'metrics'
const units = context.includes('mem') ? 'MiB' : context.includes('cpu') ? 'percentage' : 'count'
registerChart({
id: mappedId,
name: mappedId,
context,
title: mappedId,
units: context.includes('mem') ? 'MiB' : context.includes('cpu') ? 'percentage' : 'count',
family: 'peardock',
title: `${display} · ${kind}`,
units,
family: display,
chartType: 'line',
priority: 8500,
plugin: 'peardock',
@@ -193,11 +216,19 @@ export class PearDockCollector extends EventEmitter {
const conn = await this._ensure(pk)
if (!conn) continue
try {
const metrics = await conn.request(Methods.getAllMetrics, { format: 'json' })
const [metrics, catalog] = await Promise.all([
conn.request(Methods.getAllMetrics, { format: 'json' }),
conn.request(Methods.listCharts, {}).catch(() => ({ charts: {} })),
])
const chartMeta = catalog?.charts || {}
const mapped = extractDockCharts(metrics)
peersUp++
for (const row of mapped) {
registerMappedChart(row.chart, row.context, row.values)
const remote = chartMeta[row.sourceChart] || {}
registerMappedChart(row.chart, row.context, row.values, {
title: remote.title || row.title,
family: remote.family || row.family,
})
batch.push({
chart: row.chart,
context: row.context,