telemetry/csharp/AwsToolkit.Telemetry.Events/Core/MetricDatumExtensionMethods.cs (106 lines of code) (raw):

using System; using System.Diagnostics; using log4net; namespace Amazon.AwsToolkit.Telemetry.Events.Core { public static class MetricDatumExtensionMethods { private static readonly ILog Logger = LogManager.GetLogger(typeof(MetricDatumExtensionMethods)); /// <summary> /// Add metadata to a metric datum, only if the value is non-blank /// </summary> public static void AddMetadata(this MetricDatum metricDatum, string key, string value) { if (string.IsNullOrWhiteSpace(value)) { return; } metricDatum.Metadata[key] = value; } /// <summary> /// Add metadata to a metric datum, only if the value is non-blank (object overload). /// /// The main use-case for this method is the auto-generated code which provides /// strongly typed telemetry events emission. /// /// If you are explicitly calling this method and you have objects that could be any type, /// you should use the overload which accepts 'detectPrimitiveType'. An example of this /// would be to deserialize some JSON content, which contains properties that could be /// a variety of types, but are handled as type object. /// </summary> public static void AddMetadata(this MetricDatum metricDatum, string key, object value) { if (value == null) { return; } metricDatum.AddMetadata(key, value.ToString()); } /// <summary> /// Add metadata to a metric datum, only if the value is non-blank (object overload) /// When requested, this overload will route primitive values like numerics to their specific handling, instead of /// using the default object ToString call. This avoids performing locale specific convertsions. /// </summary> public static void AddMetadata(this MetricDatum metricDatum, string key, object value, bool detectPrimitiveType) { if (value == null) { return; } if (!detectPrimitiveType) { metricDatum.AddMetadata(key, value.ToString()); } switch (value) { case bool boolValue: metricDatum.AddMetadata(key, boolValue); break; case int intValue: metricDatum.AddMetadata(key, intValue); break; case double doubleValue: metricDatum.AddMetadata(key, doubleValue); break; case long longValue: metricDatum.AddMetadata(key, longValue); break; case float floatValue: metricDatum.AddMetadata(key, floatValue); break; case decimal decimalValue: metricDatum.AddMetadata(key, decimalValue); break; default: metricDatum.AddMetadata(key, value.ToString()); break; } } /// <summary> /// Add metadata to a metric datum, only if the value is non-blank (bool overload) /// </summary> public static void AddMetadata(this MetricDatum metricDatum, string key, bool value) { string valueStr = "false"; if (value) { valueStr = "true"; } metricDatum.AddMetadata(key, valueStr); } /// <summary> /// Add metadata to a metric datum, only if the value is non-blank (double overload) /// </summary> public static void AddMetadata(this MetricDatum metricDatum, string key, double value) { metricDatum.AddMetadata(key, value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } /// <summary> /// Add metadata to a metric datum, only if the value is non-blank (int overload) /// </summary> public static void AddMetadata(this MetricDatum metricDatum, string key, int value) { metricDatum.AddMetadata(key, value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } /// <summary> /// Add metadata to a metric datum, only if the value is non-blank (long overload) /// </summary> public static void AddMetadata(this MetricDatum metricDatum, string key, long value) { metricDatum.AddMetadata(key, value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } /// <summary> /// Add metadata to a metric datum, only if the value is non-blank (float overload) /// </summary> public static void AddMetadata(this MetricDatum metricDatum, string key, float value) { metricDatum.AddMetadata(key, value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } /// <summary> /// Add metadata to a metric datum, only if the value is non-blank (decimal overload) /// </summary> public static void AddMetadata(this MetricDatum metricDatum, string key, decimal value) { metricDatum.AddMetadata(key, value.ToString(System.Globalization.CultureInfo.InvariantCulture)); } /// <summary> /// If the transform function isn't null, invoke it and assign metric datum to it's result /// </summary> public static MetricDatum InvokeTransform(this MetricDatum metricDatum, Func<MetricDatum, MetricDatum> transformDatum = null) { try { if (transformDatum != null) { metricDatum = transformDatum.Invoke(metricDatum); } } catch (Exception e) { Logger.Error("Error invoking transform function", e); Debug.Assert(!Debugger.IsAttached, "Error invoking transform function"); } return metricDatum; } } }