summaryrefslogtreecommitdiffstats
path: root/src/fluent-bit/plugins/in_windows_exporter_metrics/we.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/fluent-bit/plugins/in_windows_exporter_metrics/we.c')
-rw-r--r--src/fluent-bit/plugins/in_windows_exporter_metrics/we.c1144
1 files changed, 1144 insertions, 0 deletions
diff --git a/src/fluent-bit/plugins/in_windows_exporter_metrics/we.c b/src/fluent-bit/plugins/in_windows_exporter_metrics/we.c
new file mode 100644
index 000000000..0f99fb83f
--- /dev/null
+++ b/src/fluent-bit/plugins/in_windows_exporter_metrics/we.c
@@ -0,0 +1,1144 @@
+/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+
+/* Fluent Bit
+ * ==========
+ * Copyright (C) 2019-2021 The Fluent Bit Authors
+ * Copyright (C) 2015-2018 Treasure Data Inc.
+ *
+ * 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.
+ */
+
+#include <fluent-bit/flb_input_plugin.h>
+#include <fluent-bit/flb_config.h>
+#include <fluent-bit/flb_config_map.h>
+#include <fluent-bit/flb_error.h>
+#include <fluent-bit/flb_pack.h>
+
+#include "we.h"
+#include "we_wmi.h"
+#include "we_config.h"
+
+/* collectors */
+#include "we_cpu.h"
+#include "we_os.h"
+#include "we_net.h"
+#include "we_logical_disk.h"
+#include "we_cs.h"
+
+/* wmi collectors */
+#include "we_wmi_cpu_info.h"
+#include "we_wmi_logon.h"
+#include "we_wmi_system.h"
+#include "we_wmi_thermalzone.h"
+#include "we_wmi_service.h"
+#include "we_wmi_memory.h"
+#include "we_wmi_paging_file.h"
+#include "we_wmi_process.h"
+
+static int we_timer_cpu_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_cpu_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_os_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_os_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_net_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_net_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_logical_disk_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_logical_disk_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_cs_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_cs_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_wmi_thermalzone_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_wmi_thermalzone_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_wmi_cpu_info_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_wmi_cpu_info_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_wmi_logon_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_wmi_logon_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_wmi_system_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_wmi_system_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_wmi_service_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_wmi_service_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_wmi_memory_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_wmi_memory_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_wmi_paging_file_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_wmi_paging_file_update(ctx);
+
+ return 0;
+}
+
+static int we_timer_wmi_process_metrics_cb(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ struct flb_ne *ctx = in_context;
+
+ we_wmi_process_update(ctx);
+
+ return 0;
+}
+
+struct flb_we_callback {
+ char *name;
+ void (*func)(char *, void *, void *);
+};
+
+static int we_update_cb(struct flb_we *ctx, char *name);
+
+static void update_metrics(struct flb_input_instance *ins, struct flb_we *ctx)
+{
+ int ret;
+ struct mk_list *head;
+ struct flb_slist_entry *entry;
+
+ /* Update our metrics */
+ if (ctx->metrics) {
+ mk_list_foreach(head, ctx->metrics) {
+ entry = mk_list_entry(head, struct flb_slist_entry, _head);
+ ret = flb_callback_exists(ctx->callback, entry->str);
+ if (ret == FLB_TRUE) {
+ we_update_cb(ctx, entry->str);
+ }
+ else {
+ flb_plg_debug(ctx->ins, "Callback for metrics '%s' is not registered", entry->str);
+ }
+ }
+ }
+}
+
+/*
+ * Update the metrics, this function is invoked every time 'scrape_interval'
+ * expires.
+ */
+static int cb_we_collect(struct flb_input_instance *ins,
+ struct flb_config *config, void *in_context)
+{
+ int ret;
+ struct flb_we *ctx;
+
+ ctx = in_context;
+
+ update_metrics(ins, ctx);
+
+ /* Append the updated metrics */
+ ret = flb_input_metrics_append(ins, NULL, 0, ctx->cmt);
+
+ if (ret) {
+ flb_plg_error(ins, "could not append metrics");
+ }
+
+ return 0;
+}
+
+static void we_cpu_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_cpu_update(ctx);
+}
+
+static void we_os_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_os_update(ctx);
+}
+
+static void we_net_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_net_update(ctx);
+}
+
+static void we_logical_disk_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_logical_disk_update(ctx);
+}
+
+static void we_cs_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_cs_update(ctx);
+}
+
+static void we_wmi_thermalzone_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_wmi_thermalzone_update(ctx);
+}
+
+static void we_wmi_cpu_info_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_wmi_cpu_info_update(ctx);
+}
+
+static void we_wmi_logon_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_wmi_logon_update(ctx);
+}
+
+static void we_wmi_system_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_wmi_system_update(ctx);
+}
+
+static void we_wmi_service_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_wmi_service_update(ctx);
+}
+
+static void we_wmi_memory_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_wmi_memory_update(ctx);
+}
+
+static void we_wmi_paging_file_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_wmi_paging_file_update(ctx);
+}
+
+static void we_wmi_process_update_cb(char *name, void *p1, void *p2)
+{
+ struct flb_we *ctx = p1;
+
+ we_wmi_process_update(ctx);
+}
+
+static int we_update_cb(struct flb_we *ctx, char *name)
+{
+ int ret;
+
+ ret = flb_callback_do(ctx->callback, name, ctx, NULL);
+ return ret;
+}
+
+/*
+ * Callbacks Table
+ */
+struct flb_we_callback ne_callbacks[] = {
+ /* metrics */
+ { "cpu_info", we_wmi_cpu_info_update_cb },
+ { "cpu", we_cpu_update_cb },
+ { "os", we_os_update_cb },
+ { "net", we_net_update_cb },
+ { "logical_disk", we_logical_disk_update_cb },
+ { "cs", we_cs_update_cb },
+ { "thermalzone", we_wmi_thermalzone_update_cb },
+ { "logon", we_wmi_logon_update_cb },
+ { "system", we_wmi_system_update_cb },
+ { "service", we_wmi_service_update_cb },
+ { "memory", we_wmi_memory_update_cb },
+ { "paging_file", we_wmi_paging_file_update_cb },
+ { "process", we_wmi_process_update_cb },
+ { 0 }
+};
+
+static int in_we_init(struct flb_input_instance *in,
+ struct flb_config *config, void *data)
+{
+ int ret;
+ int metric_idx = -1;
+ struct flb_we *ctx;
+ double windows_version = 0.0;
+ struct mk_list *head;
+ struct flb_slist_entry *entry;
+ struct flb_we_callback *cb;
+
+ /* Create plugin context */
+ ctx = flb_we_config_create(in, config);
+
+ if (ctx == NULL) {
+ flb_errno();
+
+ return -1;
+ }
+
+ /* Initialize fds */
+ ctx->coll_cpu_fd = -1;
+ ctx->coll_net_fd = -1;
+ ctx->coll_logical_disk_fd = -1;
+ ctx->coll_cs_fd = -1;
+ ctx->coll_os_fd = -1;
+ ctx->coll_wmi_thermalzone_fd = -1;
+ ctx->coll_wmi_cpu_info_fd = -1;
+ ctx->coll_wmi_logon_fd = -1;
+ ctx->coll_wmi_system_fd = -1;
+ ctx->coll_wmi_service_fd = -1;
+ ctx->coll_wmi_memory_fd = -1;
+ ctx->coll_wmi_paging_file_fd = -1;
+ ctx->coll_wmi_process_fd = -1;
+
+ ctx->callback = flb_callback_create(in->name);
+ if (!ctx->callback) {
+ flb_plg_error(ctx->ins, "Create callback failed");
+ return -1;
+ }
+
+ /* Associate context with the instance */
+ flb_input_set_context(in, ctx);
+
+ ret = we_get_windows_version(&windows_version);
+
+ if (ret == FLB_FALSE) {
+ flb_plg_error(in, "could not get windows version");
+
+ return -1;
+ }
+ ctx->windows_version = windows_version;
+
+ ret = we_perflib_init(ctx);
+
+ if (ret) {
+ flb_plg_error(in, "could not initialize PERFLIB");
+ return -1;
+ }
+
+ ret = we_wmi_init(ctx);
+
+ if (ret) {
+ flb_plg_error(in, "could not initialize WMI");
+
+ return -1;
+ }
+
+ /* Create the collector */
+ ret = flb_input_set_collector_time(in,
+ cb_we_collect,
+ ctx->scrape_interval, 0,
+ config);
+
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set collector for "
+ "Windows Exporter Metrics plugin");
+ return -1;
+ }
+
+ ctx->coll_fd = ret;
+
+ /* Check and initialize enabled metrics */
+ if (ctx->metrics) {
+ mk_list_foreach(head, ctx->metrics) {
+ entry = mk_list_entry(head, struct flb_slist_entry, _head);
+ ret = flb_callback_exists(ctx->callback, entry->str);
+
+ if (ret == FLB_FALSE) {
+ if (strncmp(entry->str, "cpu_info", 8) == 0) {
+ if (ctx->wmi_cpu_info_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 0;
+ }
+ else {
+ /* Create the cpu_info collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_wmi_cpu_info_metrics_cb,
+ ctx->wmi_cpu_info_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set cpu_info collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_wmi_cpu_info_fd = ret;
+ }
+
+ /* Initialize cpu info metric collectors */
+ ret = we_wmi_cpu_info_init(ctx);
+ if (ret == -1) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "cpu", 3) == 0) {
+ if (ctx->cpu_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 1;
+ }
+ else {
+ /* Create the cpu collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_cpu_metrics_cb,
+ ctx->cpu_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set cpu collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_cpu_fd = ret;
+ }
+
+ /* Initialize cpu metric collectors */
+ ret = we_cpu_init(ctx);
+ if (ret < 0) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "os", 2) == 0) {
+ if (ctx->os_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 2;
+ } else {
+ /* Create the os collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_os_metrics_cb,
+ ctx->os_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set os collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_os_fd = ret;
+ }
+
+ /* Initialize os metric collectors */
+ ret = we_os_init(ctx);
+ if (ret) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "net", 3) == 0) {
+ if (ctx->net_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 3;
+ }
+ else {
+ /* Create the net collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_net_metrics_cb,
+ ctx->net_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set net collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_net_fd = ret;
+ }
+
+ /* Initialize net metric collectors */
+ ret = we_net_init(ctx);
+ if (ret) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "logical_disk", 12) == 0) {
+ if (ctx->logical_disk_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 4;
+ }
+ else {
+ /* Create the logical_disk collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_logical_disk_metrics_cb,
+ ctx->logical_disk_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set logical_disk collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_logical_disk_fd = ret;
+ }
+
+ /* Initialize logical_disk metric collectors */
+ ret = we_logical_disk_init(ctx);
+ if (ret) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "cs", 2) == 0) {
+ if (ctx->cs_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 5;
+ }
+ else {
+ /* Create the logical_disk collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_cs_metrics_cb,
+ ctx->cs_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set cs collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_cs_fd = ret;
+ }
+
+ /* Initialize cs metric collectors */
+ ret = we_cs_init(ctx);
+ if (ret) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "thermalzone", 11) == 0) {
+ if (ctx->wmi_thermalzone_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 6;
+ }
+ else {
+ /* Create the thermalzone collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_wmi_thermalzone_metrics_cb,
+ ctx->wmi_thermalzone_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set thermalzone collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_wmi_thermalzone_fd = ret;
+ }
+
+ /* Initialize thermalzone metric collectors */
+ ret = we_wmi_thermalzone_init(ctx);
+ if (ret) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "logon", 5) == 0) {
+ if (ctx->wmi_logon_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 7;
+ }
+ else {
+ /* Create the logon collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_wmi_logon_metrics_cb,
+ ctx->wmi_logon_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set thermalzone collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_wmi_logon_fd = ret;
+ }
+
+ /* Initialize logon metric collectors */
+ ret = we_wmi_logon_init(ctx);
+ if (ret) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "system", 6) == 0) {
+ if (ctx->wmi_logon_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 8;
+ }
+ else {
+ /* Create the logon collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_wmi_system_metrics_cb,
+ ctx->wmi_system_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set system collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_wmi_system_fd = ret;
+ }
+
+ /* Initialize system metric collectors */
+ ret = we_wmi_system_init(ctx);
+ if (ret) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "service", 7) == 0) {
+ if (ctx->wmi_service_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 9;
+ }
+ else {
+ /* Create the service collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_wmi_service_metrics_cb,
+ ctx->wmi_service_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set service collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_wmi_service_fd = ret;
+ }
+
+ /* Initialize service metric collectors */
+ ret = we_wmi_service_init(ctx);
+ if (ret) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "memory", 6) == 0) {
+ if (ctx->wmi_memory_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 10;
+ }
+ else {
+ /* Create the memory collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_wmi_memory_metrics_cb,
+ ctx->wmi_memory_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set memory collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_wmi_memory_fd = ret;
+ }
+
+ /* Initialize memory metric collectors */
+ ret = we_wmi_memory_init(ctx);
+ if (ret) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "paging_file", 11) == 0) {
+ if (ctx->wmi_paging_file_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 11;
+ }
+ else {
+ /* Create the paging_file collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_wmi_paging_file_metrics_cb,
+ ctx->wmi_paging_file_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set paging_file collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_wmi_paging_file_fd = ret;
+ }
+
+ /* Initialize paging_file metric collectors */
+ ret = we_wmi_paging_file_init(ctx);
+ if (ret) {
+ return -1;
+ }
+ }
+ else if (strncmp(entry->str, "process", 7) == 0) {
+ if (ctx->wmi_process_scrape_interval == 0) {
+ flb_plg_debug(ctx->ins, "enabled metrics %s", entry->str);
+ metric_idx = 12;
+ }
+ else {
+ /* Create the process collector */
+ ret = flb_input_set_collector_time(in,
+ we_timer_wmi_process_metrics_cb,
+ ctx->wmi_process_scrape_interval, 0,
+ config);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins,
+ "could not set process collector for Windows Exporter Metrics plugin");
+ return -1;
+ }
+ ctx->coll_wmi_process_fd = ret;
+ }
+
+ /* Initialize paging_file metric collectors */
+ ret = we_wmi_process_init(ctx);
+ if (ret) {
+ return -1;
+ }
+ }
+ else {
+ flb_plg_warn(ctx->ins, "Unknown metrics: %s", entry->str);
+ metric_idx = -1;
+ }
+
+ if (metric_idx >= 0) {
+ cb = &ne_callbacks[metric_idx];
+ ret = flb_callback_set(ctx->callback, cb->name, cb->func);
+ if (ret == -1) {
+ flb_plg_error(ctx->ins, "error setting up default "
+ "callback '%s'", cb->name);
+ }
+ }
+ }
+ }
+ }
+ else {
+ flb_plg_error(ctx->ins, "No metrics is specified");
+
+ return -1;
+ }
+
+ return 0;
+}
+
+static int in_we_exit(void *data, struct flb_config *config)
+{
+ int ret;
+ struct flb_we* ctx = data;
+ struct mk_list *head;
+ struct flb_slist_entry *entry;
+
+ if (data == NULL) {
+ return 0;
+ }
+
+ /* Teardown for callback tied up resources */
+ if (ctx->metrics) {
+ mk_list_foreach(head, ctx->metrics) {
+ entry = mk_list_entry(head, struct flb_slist_entry, _head);
+ ret = flb_callback_exists(ctx->callback, entry->str);
+
+ if (ret == FLB_TRUE) {
+ if (strncmp(entry->str, "cpu_info", 8) == 0) {
+ we_wmi_cpu_info_exit(ctx);
+ }
+ else if (strncmp(entry->str, "cpu", 3) == 0) {
+ /* nop */
+ }
+ else if (strncmp(entry->str, "os", 2) == 0) {
+ we_os_exit(ctx);
+ }
+ else if (strncmp(entry->str, "net", 3) == 0) {
+ we_net_exit(ctx);
+ }
+ else if (strncmp(entry->str, "logical_disk", 12) == 0) {
+ we_logical_disk_exit(ctx);
+ }
+ else if (strncmp(entry->str, "cs", 2) == 0) {
+ we_cs_exit(ctx);
+ }
+ else if (strncmp(entry->str, "thermalzone", 11) == 0) {
+ we_wmi_thermalzone_exit(ctx);
+ }
+ else if (strncmp(entry->str, "logon", 5) == 0) {
+ we_wmi_logon_exit(ctx);
+ }
+ else if (strncmp(entry->str, "system", 6) == 0) {
+ we_wmi_system_exit(ctx);
+ }
+ else if (strncmp(entry->str, "service", 7) == 0) {
+ we_wmi_service_exit(ctx);
+ }
+ else if (strncmp(entry->str, "memory", 6) == 0) {
+ we_wmi_memory_exit(ctx);
+ }
+ else if (strncmp(entry->str, "paging_file", 11) == 0) {
+ we_wmi_paging_file_exit(ctx);
+ }
+ else if (strncmp(entry->str, "process", 7) == 0) {
+ we_wmi_process_exit(ctx);
+ }
+ else {
+ flb_plg_warn(ctx->ins, "Unknown metrics: %s", entry->str);
+ }
+ }
+ }
+ }
+
+ /* destroy callback context */
+ if (ctx->callback) {
+ flb_callback_destroy(ctx->callback);
+ }
+
+ /* Teardown for timer tied up resources */
+ if (ctx->coll_net_fd != -1) {
+ we_net_exit(ctx);
+ }
+ if (ctx->coll_logical_disk_fd != -1) {
+ we_logical_disk_exit(ctx);
+ }
+ if (ctx->coll_cs_fd != -1) {
+ we_cs_exit(ctx);
+ }
+ if (ctx->coll_os_fd != -1) {
+ we_os_exit(ctx);
+ }
+ if (ctx->coll_wmi_thermalzone_fd != -1) {
+ we_wmi_thermalzone_exit(ctx);
+ }
+ if (ctx->coll_wmi_cpu_info_fd != -1) {
+ we_wmi_cpu_info_exit(ctx);
+ }
+ if (ctx->coll_wmi_logon_fd != -1) {
+ we_wmi_logon_exit(ctx);
+ }
+ if (ctx->coll_wmi_system_fd != -1) {
+ we_wmi_system_exit(ctx);
+ }
+ if (ctx->coll_wmi_service_fd != -1) {
+ we_wmi_service_exit(ctx);
+ }
+ if (ctx->coll_wmi_memory_fd != -1) {
+ we_wmi_memory_exit(ctx);
+ }
+ if (ctx->coll_wmi_paging_file_fd != -1) {
+ we_wmi_paging_file_exit(ctx);
+ }
+ if (ctx->coll_wmi_process_fd != -1) {
+ we_wmi_process_exit(ctx);
+ }
+
+ flb_we_config_destroy(ctx);
+
+ return 0;
+}
+
+static void in_we_pause(void *data, struct flb_config *config)
+{
+ struct flb_we *ctx;
+
+ ctx = (struct flb_we *) data;
+
+ flb_input_collector_pause(ctx->coll_fd, ctx->ins);
+ if (ctx->coll_cpu_fd != -1) {
+ flb_input_collector_pause(ctx->coll_cpu_fd, ctx->ins);
+ }
+ if (ctx->coll_net_fd != -1) {
+ flb_input_collector_pause(ctx->coll_net_fd, ctx->ins);
+ }
+ if (ctx->coll_logical_disk_fd != -1) {
+ flb_input_collector_pause(ctx->coll_logical_disk_fd, ctx->ins);
+ }
+ if (ctx->coll_cs_fd != -1) {
+ flb_input_collector_pause(ctx->coll_cs_fd, ctx->ins);
+ }
+ if (ctx->coll_os_fd != -1) {
+ flb_input_collector_pause(ctx->coll_os_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_thermalzone_fd != -1) {
+ flb_input_collector_pause(ctx->coll_wmi_thermalzone_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_cpu_info_fd != -1) {
+ flb_input_collector_pause(ctx->coll_wmi_cpu_info_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_logon_fd != -1) {
+ flb_input_collector_pause(ctx->coll_wmi_logon_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_system_fd != -1) {
+ flb_input_collector_pause(ctx->coll_wmi_system_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_service_fd != -1) {
+ flb_input_collector_pause(ctx->coll_wmi_service_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_memory_fd != -1) {
+ flb_input_collector_pause(ctx->coll_wmi_memory_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_paging_file_fd != -1) {
+ flb_input_collector_pause(ctx->coll_wmi_paging_file_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_process_fd != -1) {
+ flb_input_collector_pause(ctx->coll_wmi_process_fd, ctx->ins);
+ }
+}
+
+static void in_we_resume(void *data, struct flb_config *config)
+{
+ struct flb_we *ctx;
+
+ ctx = (struct flb_we *) data;
+
+ flb_input_collector_resume(ctx->coll_fd, ctx->ins);
+ if (ctx->coll_cpu_fd != -1) {
+ flb_input_collector_resume(ctx->coll_cpu_fd, ctx->ins);
+ }
+ if (ctx->coll_net_fd != -1) {
+ flb_input_collector_resume(ctx->coll_net_fd, ctx->ins);
+ }
+ if (ctx->coll_logical_disk_fd != -1) {
+ flb_input_collector_resume(ctx->coll_logical_disk_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_process_fd != -1) {
+ flb_input_collector_resume(ctx->coll_wmi_process_fd, ctx->ins);
+ }
+ if (ctx->coll_cs_fd != -1) {
+ flb_input_collector_resume(ctx->coll_cs_fd, ctx->ins);
+ }
+ if (ctx->coll_os_fd != -1) {
+ flb_input_collector_resume(ctx->coll_os_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_thermalzone_fd != -1) {
+ flb_input_collector_resume(ctx->coll_wmi_thermalzone_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_cpu_info_fd != -1) {
+ flb_input_collector_resume(ctx->coll_wmi_cpu_info_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_logon_fd != -1) {
+ flb_input_collector_resume(ctx->coll_wmi_logon_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_system_fd != -1) {
+ flb_input_collector_resume(ctx->coll_wmi_system_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_service_fd != -1) {
+ flb_input_collector_resume(ctx->coll_wmi_service_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_memory_fd != -1) {
+ flb_input_collector_resume(ctx->coll_wmi_memory_fd, ctx->ins);
+ }
+ if (ctx->coll_wmi_paging_file_fd != -1) {
+ flb_input_collector_resume(ctx->coll_wmi_paging_file_fd, ctx->ins);
+ }
+}
+
+/* Configuration properties map */
+static struct flb_config_map config_map[] = {
+ {
+ FLB_CONFIG_MAP_TIME, "scrape_interval", "1",
+ 0, FLB_TRUE, offsetof(struct flb_we, scrape_interval),
+ "scrape interval to collect metrics from the node."
+ },
+ {
+ FLB_CONFIG_MAP_STR, "enable_collector", NULL,
+ FLB_CONFIG_MAP_MULT, FLB_TRUE, offsetof(struct flb_we, collectors),
+ "Collector to enable."
+ },
+ {
+ FLB_CONFIG_MAP_TIME, "collector.cpu.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, cpu_scrape_interval),
+ "scrape interval to collect cpu metrics from the node."
+ },
+
+ {
+ FLB_CONFIG_MAP_TIME, "collector.net.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, net_scrape_interval),
+ "scrape interval to collect net metrics from the node."
+ },
+ {
+ FLB_CONFIG_MAP_TIME, "collector.logical_disk.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, logical_disk_scrape_interval),
+ "scrape interval to collect logical_disk metrics from the node."
+ },
+
+ {
+ FLB_CONFIG_MAP_TIME, "collector.cs.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, cs_scrape_interval),
+ "scrape interval to collect cs metrics from the node."
+ },
+
+ {
+ FLB_CONFIG_MAP_TIME, "collector.os.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, os_scrape_interval),
+ "scrape interval to collect os metrics from the node."
+ },
+
+ {
+ FLB_CONFIG_MAP_TIME, "collector.thermalzone.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, wmi_thermalzone_scrape_interval),
+ "scrape interval to collect thermalzone metrics from the node."
+ },
+
+ {
+ FLB_CONFIG_MAP_TIME, "collector.cpu_info.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, wmi_cpu_info_scrape_interval),
+ "scrape interval to collect cpu_info metrics from the node."
+ },
+
+ {
+ FLB_CONFIG_MAP_TIME, "collector.logon.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, wmi_logon_scrape_interval),
+ "scrape interval to collect logon metrics from the node."
+ },
+ {
+ FLB_CONFIG_MAP_TIME, "collector.system.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, wmi_system_scrape_interval),
+ "scrape interval to collect system metrics from the node."
+ },
+ {
+ FLB_CONFIG_MAP_TIME, "collector.service.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, wmi_service_scrape_interval),
+ "scrape interval to collect service metrics from the node."
+ },
+
+ {
+ FLB_CONFIG_MAP_TIME, "collector.memory.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, wmi_memory_scrape_interval),
+ "scrape interval to collect memory metrics from the node."
+ },
+ {
+ FLB_CONFIG_MAP_TIME, "collector.paging_file.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, wmi_paging_file_scrape_interval),
+ "scrape interval to collect paging_file metrics from the node."
+ },
+
+ {
+ FLB_CONFIG_MAP_TIME, "collector.process.scrape_interval", "0",
+ 0, FLB_TRUE, offsetof(struct flb_we, wmi_process_scrape_interval),
+ "scrape interval to collect process metrics from the node."
+ },
+
+ {
+ FLB_CONFIG_MAP_CLIST, "metrics",
+ "cpu,cpu_info,os,net,logical_disk,cs,thermalzone,logon,system,service",
+ 0, FLB_TRUE, offsetof(struct flb_we, metrics),
+ "Comma separated list of keys to enable metrics."
+ },
+ {
+ FLB_CONFIG_MAP_STR, "we.logical_disk.allow_disk_regex", "/.+/",
+ 0, FLB_TRUE, offsetof(struct flb_we, raw_allowing_disk),
+ "Specify to be scribable regex for logical disk metrics."
+ },
+ {
+ FLB_CONFIG_MAP_STR, "we.logical_disk.deny_disk_regex", NULL,
+ 0, FLB_TRUE, offsetof(struct flb_we, raw_denying_disk),
+ "Specify to be denied regex for logical disk metrics."
+ },
+ {
+ FLB_CONFIG_MAP_STR, "we.net.allow_nic_regex", "/.+/",
+ 0, FLB_TRUE, offsetof(struct flb_we, raw_allowing_nic),
+ "Specify to be scribable regex for net metrics by name of NIC."
+ },
+ {
+ FLB_CONFIG_MAP_STR, "we.service.where", NULL,
+ 0, FLB_TRUE, offsetof(struct flb_we, raw_where_clause),
+ "Specify the where clause for retrieving service metrics."
+ },
+ {
+ FLB_CONFIG_MAP_STR, "we.service.include", NULL,
+ 0, FLB_TRUE, offsetof(struct flb_we, raw_service_include),
+ "Specify the key value condition pairs for includeing condition to construct where clause of service metrics."
+ },
+ {
+ FLB_CONFIG_MAP_STR, "we.service.exclude", NULL,
+ 0, FLB_TRUE, offsetof(struct flb_we, raw_service_exclude),
+ "Specify the key value condition pairs for excludeing condition to construct where clause of service metrics."
+ },
+ {
+ FLB_CONFIG_MAP_STR, "we.process.allow_process_regex", "/.+/",
+ 0, FLB_TRUE, offsetof(struct flb_we, raw_allowing_process),
+ "Specify the regex covering the process metrics to collect."
+ },
+ {
+ FLB_CONFIG_MAP_STR, "we.process.deny_process_regex", NULL,
+ 0, FLB_TRUE, offsetof(struct flb_we, raw_denying_process),
+ "Specify the regex for process metrics to prevent collection of/ignore."
+ },
+ /* EOF */
+ {0}
+};
+
+struct flb_input_plugin in_windows_exporter_metrics_plugin = {
+ .name = "windows_exporter_metrics",
+ .description = "Windows Exporter Metrics (Prometheus Compatible)",
+ .cb_init = in_we_init,
+ .cb_pre_run = NULL,
+ .cb_collect = cb_we_collect,
+ .cb_flush_buf = NULL,
+ .config_map = config_map,
+ .cb_pause = in_we_pause,
+ .cb_resume = in_we_resume,
+ .cb_exit = in_we_exit,
+};