%PDF- %PDF-
Direktori : /backups/router/usr/local/include/syslog-ng/stats/ |
Current File : //backups/router/usr/local/include/syslog-ng/stats/stats-cluster.h |
/* * Copyright (c) 2002-2017 Balabit * Copyright (c) 1998-2013 Balázs Scheidler * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA * * As an additional exemption you are allowed to compile & link against the * OpenSSL libraries as published by the OpenSSL project. See the file * COPYING for details. * */ #ifndef STATS_CLUSTER_H_INCLUDED #define STATS_CLUSTER_H_INCLUDED 1 #include "stats/stats-counter.h" #include "stats/stats-cluster-logpipe.h" enum { /* direction bits, used to distinguish between source/destination drivers */ SCS_SOURCE = 0x0100, SCS_DESTINATION = 0x0200, SCS_GROUP = 1, SCS_GLOBAL, SCS_CENTER, SCS_HOST, SCS_SENDER, SCS_PROGRAM, SCS_SEVERITY, SCS_FACILITY, SCS_TAG, SCS_FILTER, SCS_PARSER, SCS_SOURCE_MASK = 0xff }; typedef enum _StatsClusterUnit { SCU_NONE = 0, SCU_SECONDS, SCU_MINUTES, SCU_HOURS, SCU_MILLISECONDS, SCU_NANOSECONDS, SCU_BYTES, SCU_KIB, SCU_MIB, SCU_GIB, } StatsClusterUnit; typedef enum _StatsClusterFrameOfReference { SCFOR_NONE = 0, SCFOR_ABSOLUTE, /* * Only applicable for counters with seconds, minutes or hours unit. * Has a 1 second precision. * Results in a positive value for timestamps older than the time of query. */ SCFOR_RELATIVE_TO_TIME_OF_QUERY, } StatsClusterFrameOfReference; typedef struct _StatsCounterGroup StatsCounterGroup; typedef struct _StatsCounterGroupInit StatsCounterGroupInit; struct _StatsCounterGroup { StatsCounterItem *counters; const gchar **counter_names; guint16 capacity; gboolean (*get_type_label)(StatsCounterGroup *self, gint type, StatsClusterLabel *label); void (*free_fn)(StatsCounterGroup *self); }; struct _StatsCounterGroupInit { union { const gchar **names; const gchar *name; } counter; void (*init)(StatsCounterGroupInit *self, StatsCounterGroup *counter_group); gboolean (*equals)(const StatsCounterGroupInit *self, const StatsCounterGroupInit *other); void (*clone)(StatsCounterGroupInit *dst, const StatsCounterGroupInit *src); void (*cloned_free)(StatsCounterGroupInit *self); }; gboolean stats_counter_group_init_equals(const StatsCounterGroupInit *self, const StatsCounterGroupInit *other); void stats_counter_group_free(StatsCounterGroup *self); struct _StatsClusterLabel { const gchar *name; const gchar *value; }; static inline StatsClusterLabel stats_cluster_label(const gchar *name, const gchar *value) { return (StatsClusterLabel) { .name = name, .value = value }; } struct _StatsClusterKey { const gchar *name; StatsClusterLabel *labels; gsize labels_len; struct { StatsClusterUnit stored_unit; StatsClusterFrameOfReference frame_of_reference; } formatting; struct { const gchar *id; /* syslog-ng component/driver/subsystem that registered this cluster */ guint16 component; const gchar *instance; guint set:1; } legacy; StatsCounterGroupInit counter_group_init; }; /* NOTE: This struct can only be used by the stats implementation and not by client code. */ /* StatsCluster encapsulates a set of related counters that are registered * to the same stats source. In a lot of cases, the same stats source uses * multiple counters, so keeping them at the same location makes sense. * * This also improves performance for dynamic counters that relate to * information found in the log stream. In that case multiple counters can * be registered with a single hash lookup */ typedef struct _StatsCluster { StatsClusterKey key; StatsCounterGroup counter_group; guint16 use_count; guint16 live_mask; guint16 dynamic:1; gchar *query_key; } StatsCluster; typedef void (*StatsForeachCounterFunc)(StatsCluster *sc, gint type, StatsCounterItem *counter, gpointer user_data); void stats_cluster_init(void); void stats_cluster_deinit(void); guint stats_register_type(const gchar *type_name); const gchar *stats_cluster_get_type_name(StatsCluster *self, gint type); const gchar *stats_cluster_get_component_name(StatsCluster *self, gchar *buf, gsize buf_len); void stats_cluster_foreach_counter(StatsCluster *self, StatsForeachCounterFunc func, gpointer user_data); StatsClusterKey *stats_cluster_key_clone(StatsClusterKey *dst, const StatsClusterKey *src); void stats_cluster_key_cloned_free(StatsClusterKey *self); void stats_cluster_key_free(StatsClusterKey *self); gboolean stats_cluster_key_equal(const StatsClusterKey *key1, const StatsClusterKey *key2); guint stats_cluster_key_hash(const StatsClusterKey *self); StatsCounterItem *stats_cluster_track_counter(StatsCluster *self, gint type); StatsCounterItem *stats_cluster_get_counter(StatsCluster *self, gint type); void stats_cluster_untrack_counter(StatsCluster *self, gint type, StatsCounterItem **counter); gboolean stats_cluster_is_alive(StatsCluster *self, gint type); void stats_cluster_reset_counter_if_needed(StatsCluster *sc, StatsCounterItem *counter); static inline gboolean stats_cluster_is_orphaned(StatsCluster *self) { return self->use_count == 0; } static inline gboolean stats_cluster_get_type_label(StatsCluster *self, gint type, StatsClusterLabel *label) { if (!self->counter_group.get_type_label) return FALSE; return self->counter_group.get_type_label(&self->counter_group, type, label); } StatsCluster *stats_cluster_new(const StatsClusterKey *key); StatsCluster *stats_cluster_dynamic_new(const StatsClusterKey *key); void stats_cluster_free(StatsCluster *self); void stats_cluster_key_set(StatsClusterKey *self, const gchar *name, StatsClusterLabel *labels, gsize labels_len, StatsCounterGroupInit counter_group_ctor); void stats_cluster_key_legacy_set(StatsClusterKey *self, guint16 component, const gchar *id, const gchar *instance, StatsCounterGroupInit counter_group_ctor); void stats_cluster_key_add_legacy_alias(StatsClusterKey *self, guint16 component, const gchar *id, const gchar *instance, StatsCounterGroupInit counter_group_ctor); static inline gboolean stats_cluster_key_is_legacy(const StatsClusterKey *self) { return self->legacy.set; } #endif