/// <summary>
        /// Sends the data asynchronously.
        /// </summary>
        /// <returns>A task.</returns>
        private async Task SendDataAsync()
        {
            // use a copy of the data so we can limit the time in the blocking state
            Amazon.CloudWatch.Model.MetricDatum[] copy = null;

            try
            {
                await semaphore.WaitAsync();

                copy = new Amazon.CloudWatch.Model.MetricDatum[data.Count];
                data.CopyTo(copy);
                data.Clear();
                lastSend = DateTimeOffset.UtcNow;
            }
            finally
            {
                semaphore.Release();
            }

            var t = Task.Factory.StartNew(() =>
            {
                // send the metrics to AWS CloudWatch
                // NOTE: for now this is fire and forget
                cloudWatch.PutMetricDataAsync(new Amazon.CloudWatch.Model.PutMetricDataRequest
                {
                    MetricData = copy.ToList(),
                    Namespace  = configuration.MetricNamespace
                });
            }, TaskCreationOptions.LongRunning);
        }
예제 #2
0
        private void RenderAWSMetricDatum(Amazon.CloudWatch.Model.MetricDatum metricDatum, TextWriter writer)
        {
            if (!String.IsNullOrEmpty(metricDatum.MetricName))
            {
                writer.Write("MetricName: {0}, ", metricDatum.MetricName);
            }
            if (!String.IsNullOrEmpty(metricDatum.Unit))
            {
                writer.Write("Unit: {0}, ", metricDatum.Unit);
            }

            if (metricDatum.StatisticValues == null)
            {
                writer.Write("Value: {0}, ", metricDatum.Value.ToString(CultureInfo.InvariantCulture));
            }

            if (metricDatum.Dimensions != null && metricDatum.Dimensions.Any())
            {
                writer.Write("Dimensions: {0}, ", String.Join(", ",
                                                              metricDatum.Dimensions.Select(
                                                                  x =>
                                                                  String.Format("{0}: {1}", x.Name, x.Value)).ToArray()));
            }

            if (metricDatum.Timestamp != default(DateTime))
            {
                writer.Write("Timestamp: {0}, ", metricDatum.Timestamp.ToString(CultureInfo.CurrentCulture));
            }

            if (metricDatum.StatisticValues != null)
            {
                if (metricDatum.StatisticValues.Maximum > 0)
                {
                    writer.Write("Maximum: {0}, ", metricDatum.StatisticValues.Maximum.ToString(CultureInfo.InvariantCulture));
                }

                writer.Write("Minimum: {0}, ", metricDatum.StatisticValues.Minimum.ToString(CultureInfo.InvariantCulture));

                if (metricDatum.StatisticValues.SampleCount > 1)
                {
                    writer.Write("SampleCount: {0}, ", metricDatum.StatisticValues.SampleCount.ToString(CultureInfo.InvariantCulture));
                }

                if (metricDatum.StatisticValues.Sum > 0)
                {
                    writer.Write("Sum: {0}, ", metricDatum.StatisticValues.Sum.ToString(CultureInfo.InvariantCulture));
                }
            }
        }