diff options
Diffstat (limited to 'src/fluent-bit/plugins/in_podman_metrics/podman_metrics_config.h')
-rw-r--r-- | src/fluent-bit/plugins/in_podman_metrics/podman_metrics_config.h | 211 |
1 files changed, 211 insertions, 0 deletions
diff --git a/src/fluent-bit/plugins/in_podman_metrics/podman_metrics_config.h b/src/fluent-bit/plugins/in_podman_metrics/podman_metrics_config.h new file mode 100644 index 000000000..fabdc0a8d --- /dev/null +++ b/src/fluent-bit/plugins/in_podman_metrics/podman_metrics_config.h @@ -0,0 +1,211 @@ +/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */ + +/* Fluent Bit + * ========== + * Copyright (C) 2015-2022 The Fluent Bit Authors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef FLB_IN_PODMAN_METRICS_CONFIG_H +#define FLB_IN_PODMAN_METRICS_CONFIG_H + +#include <fluent-bit/flb_info.h> +#include <fluent-bit/flb_config.h> +#include <fluent-bit/flb_input.h> +#include <fluent-bit/flb_utils.h> +#include <fluent-bit/flb_jsmn.h> + +#include <monkey/mk_core/mk_list.h> + +/* Buffers and sizes */ +#define JSON_TOKENS 2048 +#define CONTAINER_NAME_SIZE 50 +#define CONTAINER_ID_SIZE 80 +#define CONTAINER_METADATA_SIZE 512 +#define IMAGE_NAME_SIZE 512 +#define PID_BUFFER_SIZE 21 +#define SYSFS_FILE_PATH_SIZE 512 +#define PROCFS_FILE_PATH_SIZE 512 +#define CGROUP_PATH_SIZE 25 + +/* Special paths for sysfs traversal */ +#define CURRENT_DIR "." +#define PREV_DIR ".." + +/* Ignored network interfaces */ +#define VETH_INTERFACE "veth" + +#define JSON_FIELD_NAMES "names" +#define JSON_FIELD_ID "id" +#define JSON_FIELD_METADATA "metadata" + +#define JSON_SUBFIELD_IMAGE_NAME "image-name\\\":\\\"" +#define JSON_SUBFIELD_SIZE_IMAGE_NAME 15 + +#define CGROUP_V2_PATH "cgroup.controllers" +#define CGROUP_V1 1 +#define CGROUP_V2 2 + +/* Paths in /proc subsystem */ +#define PROCFS_PATH "/proc" +#define PROC_NET_SUFFIX "net/dev" + +/* Paths in /sys subsystem */ +#define SYSFS_PATH "/sys/fs/cgroup" +#define V1_SYSFS_MEMORY "memory" +#define V1_SYSFS_CPU "cpuacct" +#define V1_SYSFS_SYSTEMD "systemd" +#define SYSFS_CONTAINER_PREFIX "libpod" +#define SYSFS_LIBPOD_PARENT "libpod_parent" +#define SYSFS_CONMON "conmon" + +/* Default podman config file path, in case of not provided one */ +#define PODMAN_CONFIG_DEFAULT_PATH "/var/lib/containers/storage/overlay-containers/containers.json" + +/* Markers of network values in /proc/<pid>/dev/net */ +#define DEV_NET_IGNORE_LINES 2 +#define DEV_NET_NAME 0 +#define DEV_NET_RX_BYTES 1 +#define DEV_NET_RX_ERRORS 3 +#define DEV_NET_TX_BYTES 9 +#define DEV_NET_TX_ERRORS 11 + +/* Key names in .stat files */ +#define STAT_KEY_RSS "rss" +#define STAT_KEY_CPU "usage_usec" +#define STAT_KEY_CPU_USER "user_usec" + +/* Static lists of fields in counters or gauges */ +#define FIELDS_METRIC (char*[3]){"id", "name", "image" } +#define FIELDS_METRIC_WITH_IFACE (char*[4]){"id", "name", "image", "interface" } + +/* Files from sysfs containing required data (cgroups v1) */ +#define V1_SYSFS_FILE_MEMORY "memory.usage_in_bytes" +#define V1_SYSFS_FILE_MAX_MEMORY "memory.max_usage_in_bytes" +#define V1_SYSFS_FILE_MEMORY_STAT "memory.stat" +#define V1_SYSFS_FILE_MEMORY_LIMIT "memory.limit_in_bytes" +#define V1_SYSFS_FILE_CPU_USER "cpuacct.usage_user" +#define V1_SYSFS_FILE_CPU "cpuacct.usage" +#define V1_SYSFS_FILE_PIDS "cgroup.procs" + +/* Files from sysfs containing required data (cgroups v2) */ +#define V2_SYSFS_FILE_MEMORY "memory.current" +#define V2_SYSFS_FILE_MAX_MEMORY "memory.peak" +#define V2_SYSFS_FILE_MEMORY_STAT "memory.stat" +#define V2_SYSFS_FILE_MEMORY_LIMIT "memory.max" +#define V2_SYSFS_FILE_CPU_STAT "cpu.stat" +#define V2_SYSFS_FILE_PIDS "cgroup.procs" +#define V2_SYSFS_FILE_PIDS_ALT "containers/cgroup.procs" + +/* Values used to construct counters/gauges names and descriptions */ +#define COUNTER_PREFIX "container" + +#define COUNTER_MEMORY_PREFIX "memory" +#define COUNTER_SPEC_MEMORY_PREFIX "spec_memory" +#define COUNTER_MEMORY_USAGE "usage_bytes" +#define DESCRIPTION_MEMORY_USAGE "Container memory usage in bytes" +#define COUNTER_MEMORY_MAX_USAGE "max_usage_bytes" +#define DESCRIPTION_MEMORY_MAX_USAGE "Container max memory usage in bytes" +#define COUNTER_MEMORY_LIMIT "limit_bytes" +#define DESCRIPTION_MEMORY_LIMIT "Container memory limit in bytes" +#define GAUGE_MEMORY_RSS "rss" +#define DESCRIPTION_MEMORY_RSS "Container RSS in bytes" + +#define COUNTER_CPU_PREFIX "cpu" +#define COUNTER_CPU_USER "user_seconds_total" +#define DESCRIPTION_CPU_USER "Container cpu usage in seconds in user mode" +#define COUNTER_CPU "usage_seconds_total" +#define DESCRIPTION_CPU "Container cpu usage in seconds" + +#define COUNTER_NETWORK_PREFIX "network" +#define COUNTER_RX_BYTES "receive_bytes_total" +#define DESCRIPTION_RX_BYTES "Network received bytes" +#define COUNTER_RX_ERRORS "receive_errors_total" +#define DESCRIPTION_RX_ERRORS "Network received errors" +#define COUNTER_TX_BYTES "transmit_bytes_total" +#define DESCRIPTION_TX_BYTES "Network transmited bytes" +#define COUNTER_TX_ERRORS "transmit_errors_total" +#define DESCRIPTION_TX_ERRORS "Network transmitedd errors" + + +struct net_iface { + flb_sds_t name; + uint64_t rx_bytes; + uint64_t rx_errors; + uint64_t tx_bytes; + uint64_t tx_errors; + struct mk_list _head; +}; + +struct container { + flb_sds_t name; + flb_sds_t id; + flb_sds_t image_name; + struct mk_list _head; + + uint64_t memory_usage; + uint64_t memory_max_usage; + uint64_t memory_limit; + uint64_t cpu; + uint64_t cpu_user; + uint64_t rss; + + struct mk_list net_data; +}; + +struct sysfs_path { + flb_sds_t path; + struct mk_list _head; +}; + +struct flb_in_metrics { + /* config map options */ + int scrape_on_start; + int scrape_interval; + flb_sds_t podman_config_path; + + /* container list */ + struct mk_list items; + + /* sysfs path list */ + struct mk_list sysfs_items; + + /* counters */ + struct cmt_counter *c_memory_usage; + struct cmt_counter *c_memory_max_usage; + struct cmt_counter *c_memory_limit; + struct cmt_gauge *g_rss; + struct cmt_counter *c_cpu_user; + struct cmt_counter *c_cpu; + struct cmt_counter *rx_bytes; + struct cmt_counter *rx_errors; + struct cmt_counter *tx_bytes; + struct cmt_counter *tx_errors; + + /* cgroup version used by host */ + int cgroup_version; + + /* podman config file path */ + flb_sds_t config; + + /* proc and sys paths, overwriting mostly for testing */ + flb_sds_t sysfs_path; + flb_sds_t procfs_path; + + /* internal */ + int coll_fd_runtime; + struct flb_input_instance *ins; +}; + +#endif |