aboutsummaryrefslogtreecommitdiffstats
path: root/VES5.0/evel/evel-library/code/evel_library/evel_reporting_measurement.c
diff options
context:
space:
mode:
Diffstat (limited to 'VES5.0/evel/evel-library/code/evel_library/evel_reporting_measurement.c')
-rw-r--r--VES5.0/evel/evel-library/code/evel_library/evel_reporting_measurement.c450
1 files changed, 0 insertions, 450 deletions
diff --git a/VES5.0/evel/evel-library/code/evel_library/evel_reporting_measurement.c b/VES5.0/evel/evel-library/code/evel_library/evel_reporting_measurement.c
deleted file mode 100644
index 265d9899..00000000
--- a/VES5.0/evel/evel-library/code/evel_library/evel_reporting_measurement.c
+++ /dev/null
@@ -1,450 +0,0 @@
-/**************************************************************************//**
- * @file
- * Implementation of EVEL functions relating to the Measurement for VF
- * Reporting event.
- *
- * @note This is an experimental event tytpe and does not form part of the
- * currently approved AT&T event schema. It is intended to allow a
- * less-onerous event reporting mechanism because it avoids having to
- * return all the platform statistics which are mandatory in the
- * **measurementsForVfScaling** event.
- *
- * License
- * -------
- *
- * Copyright(c) <2016>, AT&T Intellectual Property. All other rights reserved.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- * 2. Redistributions in binary form must reproduce the above copyright notice,
- * this list of conditions and the following disclaimer in the documentation
- * and/or other materials provided with the distribution.
- * 3. All advertising materials mentioning features or use of this software
- * must display the following acknowledgement: This product includes
- * software developed by the AT&T.
- * 4. Neither the name of AT&T nor the names of its contributors may be used to
- * endorse or promote products derived from this software without specific
- * prior written permission.
- *
- * THIS SOFTWARE IS PROVIDED BY AT&T INTELLECTUAL PROPERTY ''AS IS'' AND ANY
- * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
- * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
- * DISCLAIMED. IN NO EVENT SHALL AT&T INTELLECTUAL PROPERTY BE LIABLE FOR ANY
- * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
- * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
- * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
- * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
- * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
- *****************************************************************************/
-
-#include <string.h>
-#include <assert.h>
-#include <stdlib.h>
-
-#include "evel.h"
-#include "evel_internal.h"
-#include "evel_throttle.h"
-
-/**************************************************************************//**
- * Create a new Report event.
- *
- * @note The mandatory fields on the Report must be supplied to this
- * factory function and are immutable once set. Optional fields have
- * explicit setter functions, but again values may only be set once so
- * that the Report has immutable properties.
- *
- * @param measurement_interval
-
- * @returns pointer to the newly manufactured ::EVENT_REPORT. If the event is
- * not used (i.e. posted) it must be released using ::evel_free_event.
- * @retval NULL Failed to create the event.
- *****************************************************************************/
-EVENT_REPORT * evel_new_report(double measurement_interval)
-{
- EVENT_REPORT * report = NULL;
-
- EVEL_ENTER();
-
- /***************************************************************************/
- /* Check preconditions. */
- /***************************************************************************/
- assert(measurement_interval >= 0.0);
-
- /***************************************************************************/
- /* Allocate the report. */
- /***************************************************************************/
- report = malloc(sizeof(EVENT_REPORT));
- if (report == NULL)
- {
- log_error_state("Out of memory for Report");
- goto exit_label;
- }
- memset(report, 0, sizeof(EVENT_REPORT));
- EVEL_DEBUG("New report is at %lp", report);
-
- /***************************************************************************/
- /* Initialize the header & the report fields. */
- /***************************************************************************/
- evel_init_header(&report->header,"Report");
- report->header.event_domain = EVEL_DOMAIN_REPORT;
- report->measurement_interval = measurement_interval;
-
- dlist_initialize(&report->feature_usage);
- dlist_initialize(&report->measurement_groups);
- report->major_version = EVEL_REPORT_MAJOR_VERSION;
- report->minor_version = EVEL_REPORT_MINOR_VERSION;
-
-exit_label:
- EVEL_EXIT();
- return report;
-}
-
-/**************************************************************************//**
- * Set the Event Type property of the Report.
- *
- * @note The property is treated as immutable: it is only valid to call
- * the setter once. However, we don't assert if the caller tries to
- * overwrite, just ignoring the update instead.
- *
- * @param report Pointer to the Report.
- * @param type The Event Type to be set. ASCIIZ string. The caller
- * does not need to preserve the value once the function
- * returns.
- *****************************************************************************/
-void evel_report_type_set(EVENT_REPORT * report,
- const char * const type)
-{
- EVEL_ENTER();
-
- /***************************************************************************/
- /* Check preconditions and call evel_header_type_set. */
- /***************************************************************************/
- assert(report != NULL);
- assert(report->header.event_domain == EVEL_DOMAIN_REPORT);
- evel_header_type_set(&report->header, type);
-
- EVEL_EXIT();
-}
-
-/**************************************************************************//**
- * Add a Feature usage value name/value pair to the Report.
- *
- * The name is null delimited ASCII string. The library takes
- * a copy so the caller does not have to preserve values after the function
- * returns.
- *
- * @param report Pointer to the report.
- * @param feature ASCIIZ string with the feature's name.
- * @param utilization Utilization of the feature.
- *****************************************************************************/
-void evel_report_feature_use_add(EVENT_REPORT * report,
- char * feature,
- int utilization)
-{
- MEASUREMENT_FEATURE_USE * feature_use = NULL;
- EVEL_ENTER();
-
- /***************************************************************************/
- /* Check assumptions. */
- /***************************************************************************/
- assert(report != NULL);
- assert(report->header.event_domain == EVEL_DOMAIN_REPORT);
- assert(feature != NULL);
- assert(utilization >= 0);
-
- /***************************************************************************/
- /* Allocate a container for the value and push onto the list. */
- /***************************************************************************/
- EVEL_DEBUG("Adding Feature=%s Use=%d", feature, utilization);
- feature_use = malloc(sizeof(MEASUREMENT_FEATURE_USE));
- assert(feature_use != NULL);
- memset(feature_use, 0, sizeof(MEASUREMENT_FEATURE_USE));
- feature_use->feature_id = strdup(feature);
- assert(feature_use->feature_id != NULL);
- feature_use->feature_utilization = utilization;
-
- dlist_push_last(&report->feature_usage, feature_use);
-
- EVEL_EXIT();
-}
-
-/**************************************************************************//**
- * Add a Additional Measurement value name/value pair to the Report.
- *
- * The name is null delimited ASCII string. The library takes
- * a copy so the caller does not have to preserve values after the function
- * returns.
- *
- * @param report Pointer to the report.
- * @param group ASCIIZ string with the measurement group's name.
- * @param name ASCIIZ string containing the measurement's name.
- * @param value ASCIIZ string containing the measurement's value.
- *****************************************************************************/
-void evel_report_custom_measurement_add(EVENT_REPORT * report,
- const char * const group,
- const char * const name,
- const char * const value)
-{
- MEASUREMENT_GROUP * measurement_group = NULL;
- CUSTOM_MEASUREMENT * measurement = NULL;
- DLIST_ITEM * item = NULL;
- EVEL_ENTER();
-
- /***************************************************************************/
- /* Check assumptions. */
- /***************************************************************************/
- assert(report != NULL);
- assert(report->header.event_domain == EVEL_DOMAIN_REPORT);
- assert(group != NULL);
- assert(name != NULL);
- assert(value != NULL);
-
- /***************************************************************************/
- /* Allocate a container for the name/value pair. */
- /***************************************************************************/
- EVEL_DEBUG("Adding Measurement Group=%s Name=%s Value=%s",
- group, name, value);
- measurement = malloc(sizeof(CUSTOM_MEASUREMENT));
- assert(measurement != NULL);
- memset(measurement, 0, sizeof(CUSTOM_MEASUREMENT));
- measurement->name = strdup(name);
- assert(measurement->name != NULL);
- measurement->value = strdup(value);
- assert(measurement->value != NULL);
-
- /***************************************************************************/
- /* See if we have that group already. */
- /***************************************************************************/
- item = dlist_get_first(&report->measurement_groups);
- while (item != NULL)
- {
- measurement_group = (MEASUREMENT_GROUP *) item->item;
- assert(measurement_group != NULL);
-
- EVEL_DEBUG("Got measurement group %s", measurement_group->name);
- if (strcmp(group, measurement_group->name) == 0)
- {
- EVEL_DEBUG("Found existing Measurement Group");
- break;
- }
- item = dlist_get_next(item);
- }
-
- /***************************************************************************/
- /* If we didn't have the group already, create it. */
- /***************************************************************************/
- if (item == NULL)
- {
- EVEL_DEBUG("Creating new Measurement Group");
- measurement_group = malloc(sizeof(MEASUREMENT_GROUP));
- assert(measurement_group != NULL);
- memset(measurement_group, 0, sizeof(MEASUREMENT_GROUP));
- measurement_group->name = strdup(group);
- assert(measurement_group->name != NULL);
- dlist_initialize(&measurement_group->measurements);
- dlist_push_last(&report->measurement_groups, measurement_group);
- }
-
- /***************************************************************************/
- /* If we didn't have the group already, create it. */
- /***************************************************************************/
- dlist_push_last(&measurement_group->measurements, measurement);
-
- EVEL_EXIT();
-}
-
-/**************************************************************************//**
- * Encode the report as a JSON report.
- *
- * @param jbuf Pointer to the ::EVEL_JSON_BUFFER to encode into.
- * @param event Pointer to the ::EVENT_HEADER to encode.
- *****************************************************************************/
-void evel_json_encode_report(EVEL_JSON_BUFFER * jbuf,
- EVENT_REPORT * event)
-{
- MEASUREMENT_FEATURE_USE * feature_use = NULL;
- MEASUREMENT_GROUP * measurement_group = NULL;
- CUSTOM_MEASUREMENT * custom_measurement = NULL;
- DLIST_ITEM * item = NULL;
- DLIST_ITEM * nested_item = NULL;
-
- EVEL_ENTER();
-
- /***************************************************************************/
- /* Check preconditions. */
- /***************************************************************************/
- assert(event != NULL);
- assert(event->header.event_domain == EVEL_DOMAIN_REPORT);
-
- evel_json_encode_header(jbuf, &event->header);
- evel_json_open_named_object(jbuf, "measurementsForVfReportingFields");
- evel_enc_kv_double(jbuf, "measurementInterval", event->measurement_interval);
-
- /***************************************************************************/
- /* Feature Utilization list. */
- /***************************************************************************/
- evel_json_checkpoint(jbuf);
- if (evel_json_open_opt_named_list(jbuf, "featureUsageArray"))
- {
- bool item_added = false;
-
- item = dlist_get_first(&event->feature_usage);
- while (item != NULL)
- {
- feature_use = (MEASUREMENT_FEATURE_USE*) item->item;
- assert(feature_use != NULL);
-
- if (!evel_throttle_suppress_nv_pair(jbuf->throttle_spec,
- "featureUsageArray",
- feature_use->feature_id))
- {
- evel_json_open_object(jbuf);
- evel_enc_kv_string(jbuf, "featureIdentifier", feature_use->feature_id);
- evel_enc_kv_int(
- jbuf, "featureUtilization", feature_use->feature_utilization);
- evel_json_close_object(jbuf);
- item_added = true;
- }
- item = dlist_get_next(item);
- }
- evel_json_close_list(jbuf);
-
- /*************************************************************************/
- /* If we've not written anything, rewind to before we opened the list. */
- /*************************************************************************/
- if (!item_added)
- {
- evel_json_rewind(jbuf);
- }
- }
-
- /***************************************************************************/
- /* Additional Measurement Groups list. */
- /***************************************************************************/
- evel_json_checkpoint(jbuf);
- if (evel_json_open_opt_named_list(jbuf, "additionalMeasurements"))
- {
- bool item_added = false;
-
- item = dlist_get_first(&event->measurement_groups);
- while (item != NULL)
- {
- measurement_group = (MEASUREMENT_GROUP *) item->item;
- assert(measurement_group != NULL);
-
- if (!evel_throttle_suppress_nv_pair(jbuf->throttle_spec,
- "additionalMeasurements",
- measurement_group->name))
- {
- evel_json_open_object(jbuf);
- evel_enc_kv_string(jbuf, "name", measurement_group->name);
- evel_json_open_named_list(jbuf, "measurements");
-
- /*********************************************************************/
- /* Measurements list. */
- /*********************************************************************/
- nested_item = dlist_get_first(&measurement_group->measurements);
- while (nested_item != NULL)
- {
- custom_measurement = (CUSTOM_MEASUREMENT *) nested_item->item;
- assert(custom_measurement != NULL);
-
- evel_json_open_object(jbuf);
- evel_enc_kv_string(jbuf, "name", custom_measurement->name);
- evel_enc_kv_string(jbuf, "value", custom_measurement->value);
- evel_json_close_object(jbuf);
- nested_item = dlist_get_next(nested_item);
- }
- evel_json_close_list(jbuf);
- evel_json_close_object(jbuf);
- item_added = true;
- }
- item = dlist_get_next(item);
- }
- evel_json_close_list(jbuf);
-
- /*************************************************************************/
- /* If we've not written anything, rewind to before we opened the list. */
- /*************************************************************************/
- if (!item_added)
- {
- evel_json_rewind(jbuf);
- }
- }
-
- /***************************************************************************/
- /* Although optional, we always generate the version. Note that this */
- /* closes the object, too. */
- /***************************************************************************/
- evel_enc_version(jbuf,
- "measurementFieldsVersion",
- event->major_version,
- event->minor_version);
- evel_json_close_object(jbuf);
-
- EVEL_EXIT();
-}
-
-/**************************************************************************//**
- * Free a Report.
- *
- * Free off the Report supplied. Will free all the contained allocated memory.
- *
- * @note It does not free the Report itself, since that may be part of a
- * larger structure.
- *****************************************************************************/
-void evel_free_report(EVENT_REPORT * event)
-{
- MEASUREMENT_FEATURE_USE * feature_use = NULL;
- MEASUREMENT_GROUP * measurement_group = NULL;
- CUSTOM_MEASUREMENT * custom_measurement = NULL;
-
- EVEL_ENTER();
-
- /***************************************************************************/
- /* Check preconditions. As an internal API we don't allow freeing NULL */
- /* events as we do on the public API. */
- /***************************************************************************/
- assert(event != NULL);
- assert(event->header.event_domain == EVEL_DOMAIN_REPORT);
-
- /***************************************************************************/
- /* Free all internal strings then the header itself. */
- /***************************************************************************/
- feature_use = dlist_pop_last(&event->feature_usage);
- while (feature_use != NULL)
- {
- EVEL_DEBUG("Freeing Feature use Info (%s)", feature_use->feature_id);
- free(feature_use->feature_id);
- free(feature_use);
- feature_use = dlist_pop_last(&event->feature_usage);
- }
- measurement_group = dlist_pop_last(&event->measurement_groups);
- while (measurement_group != NULL)
- {
- EVEL_DEBUG("Freeing Measurement Group (%s)", measurement_group->name);
-
- custom_measurement = dlist_pop_last(&measurement_group->measurements);
- while (custom_measurement != NULL)
- {
- EVEL_DEBUG("Freeing mesaurement (%s)", custom_measurement->name);
-
- free(custom_measurement->name);
- free(custom_measurement->value);
- free(custom_measurement);
- custom_measurement = dlist_pop_last(&measurement_group->measurements);
- }
-
- free(measurement_group->name);
- free(measurement_group);
- measurement_group = dlist_pop_last(&event->measurement_groups);
- }
-
- evel_free_header(&event->header);
-
- EVEL_EXIT();
-}