Docker work
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user