From 9a9d0275d02b49660b4fac6203c8b318aff96701 Mon Sep 17 00:00:00 2001 From: Tiago Barbosa Date: Mon, 14 Sep 2020 15:50:00 +0100 Subject: [PATCH 01/10] implementation of custom metrics with EMF --- .../Amazon.LambdaPowertools.Metrics.csproj | 5 + .../Amazon.LambdaPowertools.Metrics/Class1.cs | 8 - .../Metrics.cs | 24 ++ .../MetricsManager.cs | 230 ++++++++++++++++++ .../Model/Metric.cs | 29 +++ .../Model/MetricUnit.cs | 32 +++ .../Model/MetricsWrapper.cs | 32 +++ .../SingleMetric.cs | 25 ++ 8 files changed, 377 insertions(+), 8 deletions(-) delete mode 100644 libraries/src/Amazon.LambdaPowertools.Metrics/Class1.cs create mode 100644 libraries/src/Amazon.LambdaPowertools.Metrics/Metrics.cs create mode 100644 libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs create mode 100644 libraries/src/Amazon.LambdaPowertools.Metrics/Model/Metric.cs create mode 100644 libraries/src/Amazon.LambdaPowertools.Metrics/Model/MetricUnit.cs create mode 100644 libraries/src/Amazon.LambdaPowertools.Metrics/Model/MetricsWrapper.cs create mode 100644 libraries/src/Amazon.LambdaPowertools.Metrics/SingleMetric.cs diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj b/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj index 8642d92f3..becaa1fb2 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj @@ -2,6 +2,11 @@ netcoreapp3.1 + Amazon.LambdaPowertools.Metrics + 0.0.9 + awslabs + Amazon + true diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/Class1.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/Class1.cs deleted file mode 100644 index 8ac84b377..000000000 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/Class1.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace Amazon.LambdaPowertools.Metrics -{ - public class Class1 - { - } -} \ No newline at end of file diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/Metrics.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/Metrics.cs new file mode 100644 index 000000000..f65440a5a --- /dev/null +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/Metrics.cs @@ -0,0 +1,24 @@ +using System; +using System.Collections.Generic; +using Amazon.LambdaPowertools.Metrics.Model; + +namespace Amazon.LambdaPowertools.Metrics +{ + public class Metrics : MetricsManager + { + public Metrics( + string metricsNamespace = null, + string serviceName = null, + Dictionary dimensions = null, + Dictionary metrics = null, + Dictionary metadata = null) + : base(metricsNamespace, + serviceName, + dimensions, + metrics, + metadata) + { + + } + } +} \ No newline at end of file diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs new file mode 100644 index 000000000..f5ea9ef4b --- /dev/null +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs @@ -0,0 +1,230 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.Text.Json; +using Amazon.LambdaPowertools.Metrics.Model; + +namespace Amazon.LambdaPowertools.Metrics +{ + + public class MetricsManager : IDisposable + { + private string _namespace; + public string Namespace + { + get { return _namespace; } + set { _namespace = value; } + } + + private string _service; + public string Service + { + get { return _service; } + set { _service = value; } + } + + [MaxLength(9)] + private Dictionary _dimensions; + public Dictionary Dimensions + { + get { return _dimensions; } + set { _dimensions = value; } + } + + [MaxLength(100)] + private Dictionary _metrics; + public Dictionary Metrics + { + get { return _metrics; } + set { _metrics = value; } + } + + private Dictionary _metadata; + private bool disposedValue; + + public Dictionary Metadata + { + get { return _metadata; } + set { _metadata = value; } + } + + public MetricsManager( + string metricsNamespace = null, + string serviceName = null, + Dictionary dimensions = null, + Dictionary metrics = null, + Dictionary metadata = null) + { + _namespace = !string.IsNullOrEmpty(metricsNamespace) ? metricsNamespace : Environment.GetEnvironmentVariable("POWERTOOLS_METRICS_NAMESPACE"); + _service = !string.IsNullOrEmpty(serviceName) ? serviceName : Environment.GetEnvironmentVariable("POWERTOOLS_SERVICE_NAME"); + _dimensions = dimensions != null ? dimensions : new Dictionary(); + _metrics = metrics != null ? metrics : new Dictionary(); + _metadata = metadata != null ? metadata : new Dictionary(); + + if(!string.IsNullOrEmpty(_service)){ + _dimensions.Add("service", _service); + } + } + + public void setNamespace(string metricsNamespace) + { + _namespace = metricsNamespace; + } + + public void setService(string metricsService) + { + _service = metricsService; + } + + public void AddDimension(string key, string value) + { + if (_dimensions.ContainsKey(key)) + { + Console.WriteLine($"Dimension '{key}' already exists. Skipping..."); + return; + } + + if(_dimensions.Count == 9) + { + Console.WriteLine($"Maximum number of dimensions (9) reached. Cannot add '{key}' to dimensions."); + return; + } + + _dimensions.Add(key, value); + } + + public virtual void AddMetric(Metric metric) + { + if (_metrics.ContainsKey(metric.Name)) + { + Console.WriteLine($"Metric '{metric}' already exists. Skipping..."); + return; + } + + _metrics.Add(metric.Name, metric); + + if (_metrics.Count == 100) + { + Flush(); + _metrics.Clear(); + } + } + + public void AddMetadata(string key, dynamic value) + { + if (_metadata.ContainsKey(key)) + { + Console.WriteLine($"Metadata '{key}' already exists. Skipping..."); + return; + } + + _metadata.Add(key, value); + } + + //TODO: Turn this into a private method once decision has been made on the implementation + public void Flush() + { + var metricObj = new MetricsWrapper + { + Root = new MetricsDefinition + { + Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(), + CloudWatchMetrics = new List{ + new CloudWatchMetrics{ + Namespace = Namespace, + Dimensions = new List>{ + extractDimensions(Dimensions) + }, + Metrics = extractMetricDefinitionSet(Metrics) + } + } + } + }; + + var json = JsonSerializer.Serialize(metricObj, typeof(MetricsWrapper)); + + string result = addToJson(json, _dimensions, _metadata, _metrics); + + Console.WriteLine(result); + + _metrics.Clear(); + } + + private List extractDimensions(Dictionary dimensions) + { + List result = new List(); + + result.AddRange(dimensions.Keys); + + return result; + } + + private List extractMetricDefinitionSet(Dictionary metrics) + { + List metricDefintionSet = new List(); + + foreach (var item in metrics) + { + metricDefintionSet.Add(new MetricsDefinitionSet + { + Name = item.Value.Name, + Unit = item.Value.Unit + }); + } + + return metricDefintionSet; + } + + private string addToJson(string json, Dictionary dimensions, Dictionary metadata, Dictionary metrics) + { + string result = ""; + foreach (var item in dimensions) + { + result += $",\"{item.Key}\":\"{item.Value}\""; + } + + foreach (var item in metadata) + { + result += $",\"{item.Key}\":\"{item.Value}\""; + } + + foreach (var item in metrics.Values) + { + result += $",\"{item.Name}\": {item.Value}"; + } + + return $"{json.Remove(json.Length - 1)}{result}}}"; + } + + protected virtual void Dispose(bool disposing) + { + if (!disposedValue) + { + if (disposing) + { + Flush(); + } + + _dimensions = null; + _metrics = null; + _metadata = null; + _namespace=null; + _service=null; + disposedValue = true; + } + } + + ~MetricsManager() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: false); + } + + public void Dispose() + { + // Do not change this code. Put cleanup code in 'Dispose(bool disposing)' method + Dispose(disposing: true); + GC.SuppressFinalize(this); + } + } +} \ No newline at end of file diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/Model/Metric.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/Model/Metric.cs new file mode 100644 index 000000000..eeb8b2a3c --- /dev/null +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/Model/Metric.cs @@ -0,0 +1,29 @@ +using Amazon.LambdaPowertools.Metrics.Model; + +namespace Amazon.LambdaPowertools.Metrics +{ + public class Metric + { + private string _name; + public string Name + { + get { return _name; } + set { _name = value; } + } + + private string _unit; + public string Unit + { + get { return _unit; } + set { _unit = value; } + } + + private double _value; + public double Value + { + get { return _value; } + set { _value = value; } + } + + } +} \ No newline at end of file diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/Model/MetricUnit.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/Model/MetricUnit.cs new file mode 100644 index 000000000..68125f118 --- /dev/null +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/Model/MetricUnit.cs @@ -0,0 +1,32 @@ +namespace Amazon.LambdaPowertools.Metrics.Model +{ + public class MetricUnit + { + public static readonly string Seconds = "Seconds"; + public static readonly string Microseconds = "Microseconds"; + public static readonly string Milliseconds = "Milliseconds"; + public static readonly string Bytes = "Bytes"; + public static readonly string Kilobytes = "Kilobytes"; + public static readonly string Megabytes = "Megabytes"; + public static readonly string Gigabytes = "Gigabytes"; + public static readonly string Terabytes = "Terabytes"; + public static readonly string Bits = "Bits"; + public static readonly string Kilobits = "Kilobits"; + public static readonly string Megabits = "Megabits"; + public static readonly string Gigabits = "Gigabits"; + public static readonly string Terabits = "Terabits"; + public static readonly string Percent = "Percent"; + public static readonly string Count = "Count"; + public static readonly string BytesPerSecond = "Bytes/Second"; + public static readonly string KilobytesPerSecond = "Kilobytes/Second"; + public static readonly string MegabytesPerSecond = "Megabytes/Second"; + public static readonly string GigabytesPerSecond = "Gigabytes/Second"; + public static readonly string TerabytesPerSecond = "Terabytes/Second"; + public static readonly string BitsPerSecond = "Bits/Second"; + public static readonly string KilobitsPerSecond = "Kilobits/Second"; + public static readonly string MegabitsPerSecond = "Megabits/Second"; + public static readonly string GigabitsPerSecond = "Gigabits/Second"; + public static readonly string TerabitsPerSecond = "Terabits/Second"; + public static readonly string CountPerSecond = "Count/Second"; + } +} \ No newline at end of file diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/Model/MetricsWrapper.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/Model/MetricsWrapper.cs new file mode 100644 index 000000000..fe73348cb --- /dev/null +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/Model/MetricsWrapper.cs @@ -0,0 +1,32 @@ +using System.Collections.Generic; +using System.Text.Json.Serialization; +using Amazon.LambdaPowertools.Metrics.Model; + +namespace Amazon.LambdaPowertools.Metrics +{ + + public class MetricsWrapper + { + [JsonPropertyName("_aws")] + public MetricsDefinition Root { get; set; } + } + + public class MetricsDefinition + { + public double Timestamp { get; set; } + public List CloudWatchMetrics { get; set; } + } + + public class CloudWatchMetrics + { + public string Namespace { get; set; } + public List> Dimensions { get; set; } + public List Metrics { get; set; } + } + + public class MetricsDefinitionSet + { + public string Name { get; set; } + public string Unit { get; set; } + } +} \ No newline at end of file diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/SingleMetric.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/SingleMetric.cs new file mode 100644 index 000000000..54bbb4afd --- /dev/null +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/SingleMetric.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; +using Amazon.LambdaPowertools.Metrics.Model; + +namespace Amazon.LambdaPowertools.Metrics +{ + public class SingleMetric : MetricsManager + { + public SingleMetric( + string metricsNamespace = null, + string serviceName = null, + Metric metric = null) + : base(metricsNamespace: metricsNamespace, + serviceName: serviceName) + { + AddMetric(metric); + } + + public override void AddMetric(Metric metric) + { + Metrics.Clear(); + Metrics.Add(metric.Name, metric); + } + } +} \ No newline at end of file From 60befaebaa08eb261c3ac28b7f8de2d4f732fa56 Mon Sep 17 00:00:00 2001 From: Tiago Barbosa Date: Tue, 22 Sep 2020 00:29:53 +0100 Subject: [PATCH 02/10] Update libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs Co-authored-by: Peter Grman --- .../src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs index f5ea9ef4b..deb2a08b6 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs @@ -66,7 +66,7 @@ public MetricsManager( } } - public void setNamespace(string metricsNamespace) + public void SetNamespace(string metricsNamespace) { _namespace = metricsNamespace; } @@ -227,4 +227,4 @@ public void Dispose() GC.SuppressFinalize(this); } } -} \ No newline at end of file +} From 04003a62ca1e43650c09647602aab5fe938d10c4 Mon Sep 17 00:00:00 2001 From: Tiago Barbosa Date: Tue, 22 Sep 2020 00:30:02 +0100 Subject: [PATCH 03/10] Update libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs Co-authored-by: Peter Grman --- libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs index deb2a08b6..974623b61 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs @@ -71,7 +71,7 @@ public void SetNamespace(string metricsNamespace) _namespace = metricsNamespace; } - public void setService(string metricsService) + public void SetService(string metricsService) { _service = metricsService; } From 43f1a4055ab79ad4dbef37dd3f645349a568d5be Mon Sep 17 00:00:00 2001 From: Tiago Barbosa Date: Tue, 22 Sep 2020 00:30:32 +0100 Subject: [PATCH 04/10] Update libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs Co-authored-by: Peter Grman --- libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs index 974623b61..49528d969 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs @@ -175,7 +175,7 @@ private List extractMetricDefinitionSet(Dictionary dimensions, Dictionary metadata, Dictionary metrics) + private string AddToJson(string json, Dictionary dimensions, Dictionary metadata, Dictionary metrics) { string result = ""; foreach (var item in dimensions) From 8f3e9dbe6e2d785a29c7bebb2e3796e5f89635bd Mon Sep 17 00:00:00 2001 From: Tiago Barbosa Date: Tue, 22 Sep 2020 00:33:33 +0100 Subject: [PATCH 05/10] Update MetricsManager.cs Renamed addToJson to AddToJson --- libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs index 49528d969..9d65175a9 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs @@ -143,7 +143,7 @@ public void Flush() var json = JsonSerializer.Serialize(metricObj, typeof(MetricsWrapper)); - string result = addToJson(json, _dimensions, _metadata, _metrics); + string result = AddToJson(json, _dimensions, _metadata, _metrics); Console.WriteLine(result); From b40d4fe8dad45e2fefdc5fa31252d3804e1209b0 Mon Sep 17 00:00:00 2001 From: Tiago Barbosa Date: Fri, 9 Oct 2020 10:57:07 +0100 Subject: [PATCH 06/10] Update libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs Co-authored-by: Peter Grman --- libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs index 9d65175a9..7c4004573 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs @@ -150,7 +150,7 @@ public void Flush() _metrics.Clear(); } - private List extractDimensions(Dictionary dimensions) + private List ExtractDimensions(Dictionary dimensions) { List result = new List(); From 6eefc51f31cdd5380a52eaeba24a901d506c7056 Mon Sep 17 00:00:00 2001 From: Tiago Barbosa Date: Fri, 9 Oct 2020 10:57:47 +0100 Subject: [PATCH 07/10] Update libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs Co-authored-by: Peter Grman --- libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs index 7c4004573..f3df4418f 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs @@ -159,7 +159,7 @@ private List ExtractDimensions(Dictionary dimensions) return result; } - private List extractMetricDefinitionSet(Dictionary metrics) + private List ExtractMetricDefinitionSet(Dictionary metrics) { List metricDefintionSet = new List(); From b6dccfef5f91eaa32605ec1e53a04dc04afe8cee Mon Sep 17 00:00:00 2001 From: Tiago Barbosa Date: Fri, 9 Oct 2020 11:19:18 +0100 Subject: [PATCH 08/10] updated method names to comply to suggestions --- .../Amazon.LambdaPowertools.Metrics/MetricsManager.cs | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs index f3df4418f..e909877b8 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs @@ -133,9 +133,9 @@ public void Flush() new CloudWatchMetrics{ Namespace = Namespace, Dimensions = new List>{ - extractDimensions(Dimensions) + ExtractDimensions(Dimensions) }, - Metrics = extractMetricDefinitionSet(Metrics) + Metrics = ExtractMetricDefinitionSet(Metrics) } } } @@ -161,18 +161,18 @@ private List ExtractDimensions(Dictionary dimensions) private List ExtractMetricDefinitionSet(Dictionary metrics) { - List metricDefintionSet = new List(); + List metricDefinitionSet = new List(); foreach (var item in metrics) { - metricDefintionSet.Add(new MetricsDefinitionSet + metricDefinitionSet.Add(new MetricsDefinitionSet { Name = item.Value.Name, Unit = item.Value.Unit }); } - return metricDefintionSet; + return metricDefinitionSet; } private string AddToJson(string json, Dictionary dimensions, Dictionary metadata, Dictionary metrics) From 7b457dbee97b44204e3c070bf9b3fad32ba8c82f Mon Sep 17 00:00:00 2001 From: Tiago Barbosa Date: Fri, 9 Oct 2020 12:50:43 +0100 Subject: [PATCH 09/10] moved namespace and service to a shared project --- .../Amazon.LambdaPowertools.Metrics.csproj | 10 +++- .../MetricsManager.cs | 37 ++----------- .../Amazon.LambdaPowertools.csproj | 5 ++ .../src/Amazon.LambdaPowertools/Class1.cs | 8 --- .../PowertoolsSettings.cs | 55 +++++++++++++++++++ 5 files changed, 73 insertions(+), 42 deletions(-) delete mode 100644 libraries/src/Amazon.LambdaPowertools/Class1.cs create mode 100644 libraries/src/Amazon.LambdaPowertools/PowertoolsSettings.cs diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj b/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj index becaa1fb2..f6696fdc1 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj @@ -1,11 +1,15 @@ + + + + netcoreapp3.1 Amazon.LambdaPowertools.Metrics - 0.0.9 - awslabs - Amazon + 0.0.12 + AWSLABS + Amazon Web Services true diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs index e909877b8..7aea3f8d1 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs @@ -9,20 +9,6 @@ namespace Amazon.LambdaPowertools.Metrics public class MetricsManager : IDisposable { - private string _namespace; - public string Namespace - { - get { return _namespace; } - set { _namespace = value; } - } - - private string _service; - public string Service - { - get { return _service; } - set { _service = value; } - } - [MaxLength(9)] private Dictionary _dimensions; public Dictionary Dimensions @@ -55,27 +41,18 @@ public MetricsManager( Dictionary metrics = null, Dictionary metadata = null) { - _namespace = !string.IsNullOrEmpty(metricsNamespace) ? metricsNamespace : Environment.GetEnvironmentVariable("POWERTOOLS_METRICS_NAMESPACE"); - _service = !string.IsNullOrEmpty(serviceName) ? serviceName : Environment.GetEnvironmentVariable("POWERTOOLS_SERVICE_NAME"); + PowertoolsSettings.SetNamespace(metricsNamespace); + PowertoolsSettings.SetService(serviceName); + _dimensions = dimensions != null ? dimensions : new Dictionary(); _metrics = metrics != null ? metrics : new Dictionary(); _metadata = metadata != null ? metadata : new Dictionary(); - if(!string.IsNullOrEmpty(_service)){ - _dimensions.Add("service", _service); + if(!string.IsNullOrEmpty(PowertoolsSettings.Service)){ + _dimensions.Add("service", PowertoolsSettings.Service); } } - public void SetNamespace(string metricsNamespace) - { - _namespace = metricsNamespace; - } - - public void SetService(string metricsService) - { - _service = metricsService; - } - public void AddDimension(string key, string value) { if (_dimensions.ContainsKey(key)) @@ -131,7 +108,7 @@ public void Flush() Timestamp = DateTimeOffset.Now.ToUnixTimeMilliseconds(), CloudWatchMetrics = new List{ new CloudWatchMetrics{ - Namespace = Namespace, + Namespace = PowertoolsSettings.Namespace, Dimensions = new List>{ ExtractDimensions(Dimensions) }, @@ -208,8 +185,6 @@ protected virtual void Dispose(bool disposing) _dimensions = null; _metrics = null; _metadata = null; - _namespace=null; - _service=null; disposedValue = true; } } diff --git a/libraries/src/Amazon.LambdaPowertools/Amazon.LambdaPowertools.csproj b/libraries/src/Amazon.LambdaPowertools/Amazon.LambdaPowertools.csproj index 8642d92f3..92ccb265e 100644 --- a/libraries/src/Amazon.LambdaPowertools/Amazon.LambdaPowertools.csproj +++ b/libraries/src/Amazon.LambdaPowertools/Amazon.LambdaPowertools.csproj @@ -2,6 +2,11 @@ netcoreapp3.1 + Amazon.LambdaPowertools + 1.0.0 + AWSLABS + Amazon Web Services + true diff --git a/libraries/src/Amazon.LambdaPowertools/Class1.cs b/libraries/src/Amazon.LambdaPowertools/Class1.cs deleted file mode 100644 index 5c9a9d0cc..000000000 --- a/libraries/src/Amazon.LambdaPowertools/Class1.cs +++ /dev/null @@ -1,8 +0,0 @@ -using System; - -namespace Amazon.LambdaPowertools -{ - public class Class1 - { - } -} \ No newline at end of file diff --git a/libraries/src/Amazon.LambdaPowertools/PowertoolsSettings.cs b/libraries/src/Amazon.LambdaPowertools/PowertoolsSettings.cs new file mode 100644 index 000000000..199018c21 --- /dev/null +++ b/libraries/src/Amazon.LambdaPowertools/PowertoolsSettings.cs @@ -0,0 +1,55 @@ +using System; + +namespace Amazon.LambdaPowertools +{ + public static class PowertoolsSettings + { + private static string _namespace; + public static string Namespace + { + get + { + if (!String.IsNullOrEmpty(_namespace)) + { + return _namespace; + } + else + { + return Environment.GetEnvironmentVariable("POWERTOOLS_METRICS_NAMESPACE"); + } + } + } + + private static string _service; + public static string Service + { + get + { + if (!String.IsNullOrEmpty(_service)) + { + return _service; + } + else + { + return Environment.GetEnvironmentVariable("POWERTOOLS_SERVICE_NAME"); + } + } + } + + public static void SetNamespace(string powertoolsNamespace) + { + if (powertoolsNamespace != null) + { + _namespace = powertoolsNamespace; + } + } + + public static void SetService(string powertoolsService) + { + if (powertoolsService != null) + { + _service = powertoolsService; + } + } + } +} \ No newline at end of file From 1ad3fe5c1fa563cc8b242e59e72b7cadc8a698b0 Mon Sep 17 00:00:00 2001 From: Tiago Barbosa Date: Fri, 9 Oct 2020 23:12:36 +0100 Subject: [PATCH 10/10] added support for multiple values for same metric --- .gitignore | 1 + .../Amazon.LambdaPowertools.Metrics.csproj | 2 +- .../Metrics.cs | 2 +- .../MetricsManager.cs | 63 ++++++++++++------- .../SingleMetric.cs | 2 +- 5 files changed, 45 insertions(+), 25 deletions(-) diff --git a/.gitignore b/.gitignore index 8d2d5f2ab..dbe6b8a52 100644 --- a/.gitignore +++ b/.gitignore @@ -455,3 +455,4 @@ MigrationBackup/ .ionide/ # End of https://www.toptal.com/developers/gitignore/api/dotnetcore,visualstudio,visualstudiocode,rider +.DS_Store diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj b/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj index f6696fdc1..13d8744b4 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/Amazon.LambdaPowertools.Metrics.csproj @@ -7,7 +7,7 @@ netcoreapp3.1 Amazon.LambdaPowertools.Metrics - 0.0.12 + 0.0.15 AWSLABS Amazon Web Services true diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/Metrics.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/Metrics.cs index f65440a5a..1a1326df4 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/Metrics.cs +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/Metrics.cs @@ -10,7 +10,7 @@ public Metrics( string metricsNamespace = null, string serviceName = null, Dictionary dimensions = null, - Dictionary metrics = null, + Dictionary> metrics = null, Dictionary metadata = null) : base(metricsNamespace, serviceName, diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs index 7aea3f8d1..89d7a05e3 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/MetricsManager.cs @@ -14,42 +14,41 @@ public class MetricsManager : IDisposable public Dictionary Dimensions { get { return _dimensions; } - set { _dimensions = value; } } [MaxLength(100)] - private Dictionary _metrics; - public Dictionary Metrics + private Dictionary> _metrics; + public Dictionary> Metrics { get { return _metrics; } - set { _metrics = value; } } private Dictionary _metadata; - private bool disposedValue; - + public Dictionary Metadata { get { return _metadata; } - set { _metadata = value; } } + private bool disposedValue; + private static int _metricCount = 0; + public MetricsManager( string metricsNamespace = null, string serviceName = null, Dictionary dimensions = null, - Dictionary metrics = null, + Dictionary> metrics = null, Dictionary metadata = null) { PowertoolsSettings.SetNamespace(metricsNamespace); PowertoolsSettings.SetService(serviceName); - + _dimensions = dimensions != null ? dimensions : new Dictionary(); - _metrics = metrics != null ? metrics : new Dictionary(); + _metrics = metrics != null ? metrics : new Dictionary>(); _metadata = metadata != null ? metadata : new Dictionary(); if(!string.IsNullOrEmpty(PowertoolsSettings.Service)){ - _dimensions.Add("service", PowertoolsSettings.Service); + AddDimension("service", PowertoolsSettings.Service); } } @@ -74,21 +73,23 @@ public virtual void AddMetric(Metric metric) { if (_metrics.ContainsKey(metric.Name)) { - Console.WriteLine($"Metric '{metric}' already exists. Skipping..."); - return; + _metrics[metric.Name].Add(metric); + _metricCount++; + } + else { + _metrics.Add(metric.Name, new List{metric}); + _metricCount++; } - _metrics.Add(metric.Name, metric); - - if (_metrics.Count == 100) + if (_metricCount == 100) { Flush(); - _metrics.Clear(); } } public void AddMetadata(string key, dynamic value) { + if (_metadata.ContainsKey(key)) { Console.WriteLine($"Metadata '{key}' already exists. Skipping..."); @@ -136,7 +137,7 @@ private List ExtractDimensions(Dictionary dimensions) return result; } - private List ExtractMetricDefinitionSet(Dictionary metrics) + private List ExtractMetricDefinitionSet(Dictionary> metrics) { List metricDefinitionSet = new List(); @@ -144,15 +145,15 @@ private List ExtractMetricDefinitionSet(Dictionary dimensions, Dictionary metadata, Dictionary metrics) + private string AddToJson(string json, Dictionary dimensions, Dictionary metadata, Dictionary> metrics) { string result = ""; foreach (var item in dimensions) @@ -167,7 +168,25 @@ private string AddToJson(string json, Dictionary dimensions, Dic foreach (var item in metrics.Values) { - result += $",\"{item.Name}\": {item.Value}"; + if(item.Count > 1){ + string resultArray = $",\"{item[0].Name}\": ["; + + for (int i = 0; i < item.Count; i++) + { + if(i == item.Count - 1){ + resultArray += $"{item[i].Value}]"; + } + else { + resultArray += $"{item[i].Value},"; + } + } + + result += resultArray; + } + else { + result += $",\"{item[0].Name}\": {item[0].Value}"; + } + } return $"{json.Remove(json.Length - 1)}{result}}}"; diff --git a/libraries/src/Amazon.LambdaPowertools.Metrics/SingleMetric.cs b/libraries/src/Amazon.LambdaPowertools.Metrics/SingleMetric.cs index 54bbb4afd..1593c7b76 100644 --- a/libraries/src/Amazon.LambdaPowertools.Metrics/SingleMetric.cs +++ b/libraries/src/Amazon.LambdaPowertools.Metrics/SingleMetric.cs @@ -19,7 +19,7 @@ public SingleMetric( public override void AddMetric(Metric metric) { Metrics.Clear(); - Metrics.Add(metric.Name, metric); + Metrics.Add(metric.Name, new List{metric}); } } } \ No newline at end of file