import { DynamicProperty, MetricProperty, StaticProperty } from "./properties.js";
import system from "./system.js";
import { JsonType, ProcessType } from "./types.js";
// Definition of client stats based on specification
// See https://docs.google.com/document/d/1qPWAVRjPCENlyAjUBwGkHMvz9qLdd_6u9DPZcNxDBpc
const CLIENT_STATS_SPEC_VERSION = 1;
const CLIENT_NAME = "lodestar";
export function createClientStats(client, collectSystemStats) {
    const clientStats = [];
    if (client === "beacon") {
        clientStats.push(createBeaconNodeStats());
    }
    else if (client === "validator") {
        clientStats.push(createValidatorStats());
    }
    if (collectSystemStats) {
        clientStats.push(createSystemStats());
    }
    return clientStats;
}
function createCommonStats(process) {
    return {
        version: new StaticProperty({
            jsonKey: "version",
            value: CLIENT_STATS_SPEC_VERSION,
            description: "Client Stats data specification version",
        }),
        timestamp: new DynamicProperty({
            jsonKey: "timestamp",
            provider: Date.now,
            description: "Unix timestamp in milliseconds",
        }),
        process: new StaticProperty({
            jsonKey: "process",
            value: process,
            description: "Process type, can be one of: validator, beaconnode, system",
        }),
    };
}
function createProcessStats(process) {
    return {
        ...createCommonStats(process),
        cpuProcessSecondsTotal: new MetricProperty({
            jsonKey: "cpu_process_seconds_total",
            metricName: "process_cpu_user_seconds_total",
            jsonType: JsonType.Number,
            defaultValue: 0,
            description: "CPU seconds consumed by the process",
        }),
        memoryProcessBytes: new MetricProperty({
            jsonKey: "memory_process_bytes",
            metricName: "process_resident_memory_bytes",
            jsonType: JsonType.Number,
            defaultValue: 0,
            description: "Amount of memory in bytes allocated to the process",
        }),
        clientName: new StaticProperty({
            jsonKey: "client_name",
            value: CLIENT_NAME,
            description: "Name of client, e.g. lodestar, prysm, lighthouse, teku, nimbus, grandine",
        }),
        clientVersion: new MetricProperty({
            jsonKey: "client_version",
            metricName: "lodestar_version",
            fromLabel: "version",
            formatter: (value) => {
                // remove "v" prefix from value
                return value.substring(1);
            },
            jsonType: JsonType.String,
            cacheResult: true,
            defaultValue: "",
            description: "Version of client, e.g. 1.3.0/2d0938e",
        }),
        clientBuild: new StaticProperty({
            jsonKey: "client_build",
            value: 0,
            description: "Incrementing integer representation of build for easier comparison",
        }),
        syncEth2FallbackConfigured: new StaticProperty({
            jsonKey: "sync_eth2_fallback_configured",
            value: false,
            description: "Whether the client has a fallback eth2 endpoint configured",
        }),
        syncEth2FallbackConnected: new StaticProperty({
            jsonKey: "sync_eth2_fallback_connected",
            value: false,
            description: "Whether the client is currently connected to a fallback eth2 endpoint",
        }),
    };
}
function createBeaconNodeStats() {
    return {
        ...createProcessStats(ProcessType.BeaconNode),
        diskBeaconChainBytesTotal: new MetricProperty({
            jsonKey: "disk_beaconchain_bytes_total",
            metricName: "lodestar_db_size_bytes_total",
            jsonType: JsonType.Number,
            defaultValue: 0,
            description: "Amount of bytes consumed on disk by the beacon node's database",
        }),
        networkLibp2pBytesTotalReceive: new MetricProperty({
            jsonKey: "network_libp2p_bytes_total_receive",
            metricName: "libp2p_data_transfer_bytes_total",
            withLabel: { name: "protocol", value: "global received" },
            jsonType: JsonType.Number,
            defaultValue: 0,
            description: "Number of bytes received via libp2p traffic",
        }),
        networkLibp2pBytesTotalTransmit: new MetricProperty({
            jsonKey: "network_libp2p_bytes_total_transmit",
            metricName: "libp2p_data_transfer_bytes_total",
            withLabel: { name: "protocol", value: "global sent" },
            jsonType: JsonType.Number,
            defaultValue: 0,
            description: "Number of bytes transmitted via libp2p traffic",
        }),
        networkPeersConnected: new MetricProperty({
            jsonKey: "network_peers_connected",
            metricName: "libp2p_peers",
            jsonType: JsonType.Number,
            defaultValue: 0,
            description: "Number of connected peers",
        }),
        syncEth1Connected: new MetricProperty({
            jsonKey: "sync_eth1_connected",
            metricName: "lodestar_execution_engine_http_client_config_urls_count",
            jsonType: JsonType.Boolean,
            defaultValue: false,
            description: "Whether the beacon node is connected to a eth1 node",
        }),
        syncEth2Synced: new MetricProperty({
            jsonKey: "sync_eth2_synced",
            metricName: "lodestar_sync_status",
            rangeValue: 3,
            jsonType: JsonType.Boolean,
            defaultValue: true,
            description: "Whether the beacon node is in sync with the beacon chain network",
        }),
        syncBeaconHeadSlot: new MetricProperty({
            jsonKey: "sync_beacon_head_slot",
            metricName: "beacon_head_slot",
            jsonType: JsonType.Number,
            defaultValue: 0,
            description: "Slot of the head block of the beacon chain",
        }),
        syncEth1FallbackConfigured: new MetricProperty({
            jsonKey: "sync_eth1_fallback_configured",
            metricName: "lodestar_execution_engine_http_client_config_urls_count",
            threshold: 2,
            jsonType: JsonType.Boolean,
            defaultValue: false,
            description: "Whether the beacon node has a fallback eth1 endpoint configured",
        }),
        syncEth1FallbackConnected: new StaticProperty({
            jsonKey: "sync_eth1_fallback_connected",
            value: false,
            description: "Whether the beacon node is currently connected to a fallback eth1 endpoint",
        }),
        slasherActive: new StaticProperty({
            jsonKey: "slasher_active",
            value: false,
            description: "Whether slasher functionality is enabled",
        }),
    };
}
function createValidatorStats() {
    return {
        ...createProcessStats(ProcessType.Validator),
        validatorTotal: new MetricProperty({
            jsonKey: "validator_total",
            metricName: "vc_indices_count",
            jsonType: JsonType.Number,
            defaultValue: 0,
            description: "Number of validator keys in use",
        }),
        validatorActive: new MetricProperty({
            jsonKey: "validator_active",
            metricName: "vc_indices_count",
            jsonType: JsonType.Number,
            defaultValue: 0,
            description: "Number of validator keys that are currently active",
        }),
    };
}
function createSystemStats() {
    return {
        ...createCommonStats(ProcessType.System),
        cpuCores: new DynamicProperty({
            jsonKey: "cpu_cores",
            provider: () => system.cpuCores,
            description: "Number of CPU cores available",
        }),
        cpuThreads: new DynamicProperty({
            jsonKey: "cpu_threads",
            provider: () => system.cpuThreads,
            description: "Number of CPU threads available",
        }),
        cpuNodeSystemSecondsTotal: new DynamicProperty({
            jsonKey: "cpu_node_system_seconds_total",
            provider: () => system.cpuNodeSystemSecondsTotal,
            description: "CPU seconds consumed by all processes",
        }),
        cpuNodeUserSecondsTotal: new DynamicProperty({
            jsonKey: "cpu_node_user_seconds_total",
            provider: () => system.cpuNodeUserSecondsTotal,
            description: "CPU seconds consumed by user processes",
        }),
        cpuNodeIOWaitSecondsTotal: new DynamicProperty({
            jsonKey: "cpu_node_iowait_seconds_total",
            provider: () => system.cpuNodeIOWaitSecondsTotal,
            description: "CPU seconds spent in I/O wait state",
        }),
        cpuNodeIdleSecondsTotal: new DynamicProperty({
            jsonKey: "cpu_node_idle_seconds_total",
            provider: () => system.cpuNodeIdleSecondsTotal,
            description: "CPU seconds spent in idle state",
        }),
        memoryNodeBytesTotal: new DynamicProperty({
            jsonKey: "memory_node_bytes_total",
            provider: () => system.memoryNodeBytesTotal,
            description: "Total amount of memory in bytes available",
        }),
        memoryNodeBytesFree: new DynamicProperty({
            jsonKey: "memory_node_bytes_free",
            provider: () => system.memoryNodeBytesFree,
            description: "Amount of free memory in bytes",
        }),
        memoryNodeBytesCached: new DynamicProperty({
            jsonKey: "memory_node_bytes_cached",
            provider: () => system.memoryNodeBytesCached,
            description: "Amount of memory in bytes used by cache",
        }),
        memoryNodeBytesBuffers: new DynamicProperty({
            jsonKey: "memory_node_bytes_buffers",
            provider: () => system.memoryNodeBytesBuffers,
            description: "Amount of memory in bytes used by buffers",
        }),
        diskNodeBytesTotal: new DynamicProperty({
            jsonKey: "disk_node_bytes_total",
            provider: () => system.diskNodeBytesTotal,
            description: "Total amount of available disk space in bytes",
        }),
        diskNodeBytesFree: new DynamicProperty({
            jsonKey: "disk_node_bytes_free",
            provider: () => system.diskNodeBytesFree,
            description: "Amount of free disk space in bytes",
        }),
        diskNodeIOSeconds: new DynamicProperty({
            jsonKey: "disk_node_io_seconds",
            provider: () => system.diskNodeIOSeconds,
            description: "Total time spent in seconds on disk I/O operations",
        }),
        diskNodeReadsTotal: new DynamicProperty({
            jsonKey: "disk_node_reads_total",
            provider: () => system.diskNodeReadsTotal,
            description: "Total number of disk read I/O operations",
        }),
        diskNodeWritesTotal: new DynamicProperty({
            jsonKey: "disk_node_writes_total",
            provider: () => system.diskNodeWritesTotal,
            description: "Total number of disk write I/O operations",
        }),
        networkNodeBytesTotalReceive: new DynamicProperty({
            jsonKey: "network_node_bytes_total_receive",
            provider: () => system.networkNodeBytesTotalReceive,
            description: "Total amount of bytes received over the network",
        }),
        networkNodeBytesTotalTransmit: new DynamicProperty({
            jsonKey: "network_node_bytes_total_transmit",
            provider: () => system.networkNodeBytesTotalTransmit,
            description: "Total amount of bytes transmitted over the network",
        }),
        miscNodeBootTsSeconds: new DynamicProperty({
            jsonKey: "misc_node_boot_ts_seconds",
            provider: () => system.miscNodeBootTsSeconds,
            description: "Unix timestamp in seconds of boot time",
        }),
        miscOs: new DynamicProperty({
            jsonKey: "misc_os",
            provider: () => system.miscOs,
            description: "Operating system, can be one of: lin, win, mac, unk for unknown",
        }),
    };
}
//# sourceMappingURL=clientStats.js.map