//------------------------------------------------------------------------------
// <auto-generated>
//     This code was generated by a tool.
//
//     Changes to this file may cause incorrect behavior and will be lost if
//     the code is regenerated.
// </auto-generated>
//------------------------------------------------------------------------------

using Amazon.AwsToolkit.Telemetry.Events.Core;
using System;
using System.Collections.Generic;

/// --------------------------------------------------------------------------------
/// This file is generated from https://github.com/aws/aws-toolkit-common/tree/main/telemetry
/// --------------------------------------------------------------------------------

namespace Amazon.AwsToolkit.Telemetry.Events.Generated
{
    
    
    /// Contains methods to record telemetry events
    public static partial class ToolkitTelemetryEvent
    {
        
        /// Records Telemetry Event:
        /// Copying an API Gateway remote URL
        public static void RecordApigatewayCopyUrl(this ITelemetryLogger telemetryLogger, ApigatewayCopyUrl payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apigateway_copyUrl";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Invoking one simulated API Gateway call using the SAM cli
        public static void RecordApigatewayInvokeLocal(this ITelemetryLogger telemetryLogger, ApigatewayInvokeLocal payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apigateway_invokeLocal";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                if (payload.Runtime.HasValue)
                {
                    datum.AddMetadata("runtime", payload.Runtime.Value);
                }

                datum.AddMetadata("httpMethod", payload.HttpMethod);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("debug", payload.Debug);

                if (payload.LambdaArchitecture.HasValue)
                {
                    datum.AddMetadata("lambdaArchitecture", payload.LambdaArchitecture.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Calling a remote API Gateway
        public static void RecordApigatewayInvokeRemote(this ITelemetryLogger telemetryLogger, ApigatewayInvokeRemote payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apigateway_invokeRemote";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("httpMethod", payload.HttpMethod);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when starting a local API Gateway server simulator with SAM. Only called when starting it for long running testing, not for single invokes
        public static void RecordApigatewayStartLocalServer(this ITelemetryLogger telemetryLogger, ApigatewayStartLocalServer payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apigateway_startLocalServer";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open the service URL in a browser
        public static void RecordApprunnerOpenServiceUrl(this ITelemetryLogger telemetryLogger, ApprunnerOpenServiceUrl payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apprunner_openServiceUrl";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Copy the service URL
        public static void RecordApprunnerCopyServiceUrl(this ITelemetryLogger telemetryLogger, ApprunnerCopyServiceUrl payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apprunner_copyServiceUrl";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create an App Runner service
        public static void RecordApprunnerCreateService(this ITelemetryLogger telemetryLogger, ApprunnerCreateService payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apprunner_createService";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("appRunnerServiceSource", payload.AppRunnerServiceSource);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Pause a running App Runner service
        public static void RecordApprunnerPauseService(this ITelemetryLogger telemetryLogger, ApprunnerPauseService payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apprunner_pauseService";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Resume a paused App Runner service
        public static void RecordApprunnerResumeService(this ITelemetryLogger telemetryLogger, ApprunnerResumeService payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apprunner_resumeService";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete an App Runner service
        public static void RecordApprunnerDeleteService(this ITelemetryLogger telemetryLogger, ApprunnerDeleteService payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apprunner_deleteService";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.AppRunnerServiceStatus.HasValue)
                {
                    datum.AddMetadata("appRunnerServiceStatus", payload.AppRunnerServiceStatus.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Start a new deployment for an App Runner service
        public static void RecordApprunnerStartDeployment(this ITelemetryLogger telemetryLogger, ApprunnerStartDeployment payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apprunner_startDeployment";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// View the App Runner application logs (the logs for your running service)
        public static void RecordApprunnerViewApplicationLogs(this ITelemetryLogger telemetryLogger, ApprunnerViewApplicationLogs payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apprunner_viewApplicationLogs";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// View the App Runner service logs (the logs produced by App Runner)
        public static void RecordApprunnerViewServiceLogs(this ITelemetryLogger telemetryLogger, ApprunnerViewServiceLogs payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "apprunner_viewServiceLogs";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Captures the result of adding a new connection in the 'Add New Connection' workflow
        public static void RecordAuthAddConnection(this ITelemetryLogger telemetryLogger, AuthAddConnection payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "auth_addConnection";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("source", payload.Source);

                datum.AddMetadata("featureId", payload.FeatureId);

                datum.AddMetadata("credentialSourceId", payload.CredentialSourceId);

                datum.AddMetadata("isAggregated", payload.IsAggregated);

                datum.AddMetadata("result", payload.Result);

                if (payload.Attempts.HasValue)
                {
                    datum.AddMetadata("attempts", payload.Attempts.Value);
                }

                datum.AddMetadata("invalidInputFields", payload.InvalidInputFields);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// The diff/change in Auth connections
        public static void RecordAuthAddedConnections(this ITelemetryLogger telemetryLogger, AuthAddedConnections payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "auth_addedConnections";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("source", payload.Source);

                datum.AddMetadata("authConnectionsCount", payload.AuthConnectionsCount);

                datum.AddMetadata("newAuthConnectionsCount", payload.NewAuthConnectionsCount);

                datum.AddMetadata("enabledAuthConnections", payload.EnabledAuthConnections);

                datum.AddMetadata("newEnabledAuthConnections", payload.NewEnabledAuthConnections);

                datum.AddMetadata("attempts", payload.Attempts);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user clicks yes or no to switch role upon adding new connection
        public static void RecordAuthSwitchRoles(this ITelemetryLogger telemetryLogger, AuthSwitchRoles payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "auth_switchRoles";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("authConnectionsCount", payload.AuthConnectionsCount);

                datum.AddMetadata("userChoice", payload.UserChoice);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Copy the ARN of an AWS resource
        public static void RecordAwsCopyArn(this ITelemetryLogger telemetryLogger, AwsCopyArn payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_copyArn";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete an AWS resource
        public static void RecordAwsDeleteResource(this ITelemetryLogger telemetryLogger, AwsDeleteResource payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_deleteResource";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Select a credentials profile
        public static void RecordAwsSetCredentials(this ITelemetryLogger telemetryLogger, AwsSetCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_setCredentials";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                if (payload.CredentialType.HasValue)
                {
                    datum.AddMetadata("credentialType", payload.CredentialType.Value);
                }

                if (payload.CredentialSourceId.HasValue)
                {
                    datum.AddMetadata("credentialSourceId", payload.CredentialSourceId.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// A region change occurred
        public static void RecordAwsSetRegion(this ITelemetryLogger telemetryLogger, AwsSetRegion payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_setRegion";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// A partition change occurred
        public static void RecordAwsSetPartition(this ITelemetryLogger telemetryLogger, AwsSetPartition payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_setPartition";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("partitionId", payload.PartitionId);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open the credentials file
        public static void RecordAwsOpenCredentials(this ITelemetryLogger telemetryLogger, AwsOpenCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_openCredentials";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Opens a url
        public static void RecordAwsOpenUrl(this ITelemetryLogger telemetryLogger, AwsOpenUrl payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_openUrl";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("url", payload.Url);

                datum.AddMetadata("source", payload.Source);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Save credentials
        public static void RecordAwsSaveCredentials(this ITelemetryLogger telemetryLogger, AwsSaveCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_saveCredentials";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Modify credentials (e.g. Add, Edit, Delete)
        public static void RecordAwsModifyCredentials(this ITelemetryLogger telemetryLogger, AwsModifyCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_modifyCredentials";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("credentialModification", payload.CredentialModification);

                datum.AddMetadata("source", payload.Source);

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Load credentials from a credential source
        public static void RecordAwsLoadCredentials(this ITelemetryLogger telemetryLogger, AwsLoadCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_loadCredentials";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("credentialSourceId", payload.CredentialSourceId);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create a new credentials file
        public static void RecordAwsCreateCredentials(this ITelemetryLogger telemetryLogger, AwsCreateCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_createCredentials";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Inject selected AWS credentials into a third-party run (e.g. RunConfiguration)
        public static void RecordAwsInjectCredentials(this ITelemetryLogger telemetryLogger, AwsInjectCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_injectCredentials";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("runtimeString", payload.RuntimeString);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Validate credentials when selecting new credentials
        public static void RecordAwsValidateCredentials(this ITelemetryLogger telemetryLogger, AwsValidateCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_validateCredentials";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.CredentialType.HasValue)
                {
                    datum.AddMetadata("credentialType", payload.CredentialType.Value);
                }

                if (payload.CredentialSourceId.HasValue)
                {
                    datum.AddMetadata("credentialSourceId", payload.CredentialSourceId.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Emitted when credentials are automatically refreshed by the AWS SDK or Toolkit
        public static void RecordAwsRefreshCredentials(this ITelemetryLogger telemetryLogger, AwsRefreshCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_refreshCredentials";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.CredentialType.HasValue)
                {
                    datum.AddMetadata("credentialType", payload.CredentialType.Value);
                }

                if (payload.CredentialSourceId.HasValue)
                {
                    datum.AddMetadata("credentialSourceId", payload.CredentialSourceId.Value);
                }

                if (payload.SessionDuration.HasValue)
                {
                    datum.AddMetadata("sessionDuration", payload.SessionDuration.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when a connection requires login using the browser
        public static void RecordAwsLoginWithBrowser(this ITelemetryLogger telemetryLogger, AwsLoginWithBrowser payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_loginWithBrowser";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.CredentialType.HasValue)
                {
                    datum.AddMetadata("credentialType", payload.CredentialType.Value);
                }

                if (payload.CredentialSourceId.HasValue)
                {
                    datum.AddMetadata("credentialSourceId", payload.CredentialSourceId.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open docs for the extension
        public static void RecordAwsHelp(this ITelemetryLogger telemetryLogger, AwsHelp payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_help";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("name", payload.Name);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open the quickstart guide
        public static void RecordAwsHelpQuickstart(this ITelemetryLogger telemetryLogger, AwsHelpQuickstart payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_helpQuickstart";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open the repo for the extension
        public static void RecordAwsShowExtensionSource(this ITelemetryLogger telemetryLogger, AwsShowExtensionSource payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_showExtensionSource";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Refresh the AWS explorer window
        public static void RecordAwsRefreshExplorer(this ITelemetryLogger telemetryLogger, AwsRefreshExplorer payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_refreshExplorer";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Expand a service root node in the AWS explorer window
        public static void RecordAwsExpandExplorerNode(this ITelemetryLogger telemetryLogger, AwsExpandExplorerNode payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_expandExplorerNode";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Report an issue with the plugin
        public static void RecordAwsReportPluginIssue(this ITelemetryLogger telemetryLogger, AwsReportPluginIssue payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_reportPluginIssue";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when deploying an application to Elastic Beanstalk
        public static void RecordBeanstalkDeploy(this ITelemetryLogger telemetryLogger, BeanstalkDeploy payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "beanstalk_deploy";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("initialDeploy", payload.InitialDeploy);

                datum.AddMetadata("name", payload.Name);

                datum.AddMetadata("framework", payload.Framework);

                if (payload.XrayEnabled.HasValue)
                {
                    datum.AddMetadata("xrayEnabled", payload.XrayEnabled.Value);
                }

                if (payload.EnhancedHealthEnabled.HasValue)
                {
                    datum.AddMetadata("enhancedHealthEnabled", payload.EnhancedHealthEnabled.Value);
                }

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum.AddMetadata("source", payload.Source);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user completes the Elastic Beanstalk publish wizard
        public static void RecordBeanstalkPublishWizard(this ITelemetryLogger telemetryLogger, BeanstalkPublishWizard payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "beanstalk_publishWizard";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum.AddMetadata("source", payload.Source);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view the status of the Beanstalk Application
        public static void RecordBeanstalkOpenApplication(this ITelemetryLogger telemetryLogger, BeanstalkOpenApplication payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "beanstalk_openApplication";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view the status of the Beanstalk Environment
        public static void RecordBeanstalkOpenEnvironment(this ITelemetryLogger telemetryLogger, BeanstalkOpenEnvironment payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "beanstalk_openEnvironment";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user deletes a Beanstalk application
        public static void RecordBeanstalkDeleteApplication(this ITelemetryLogger telemetryLogger, BeanstalkDeleteApplication payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "beanstalk_deleteApplication";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user deletes a Beanstalk environment
        public static void RecordBeanstalkDeleteEnvironment(this ITelemetryLogger telemetryLogger, BeanstalkDeleteEnvironment payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "beanstalk_deleteEnvironment";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Restart application server for a Beanstalk environment
        public static void RecordBeanstalkRestartApplication(this ITelemetryLogger telemetryLogger, BeanstalkRestartApplication payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "beanstalk_restartApplication";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Rebuild a Beanstalk environment
        public static void RecordBeanstalkRebuildEnvironment(this ITelemetryLogger telemetryLogger, BeanstalkRebuildEnvironment payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "beanstalk_rebuildEnvironment";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Edit configuration of a Beanstalk environment
        public static void RecordBeanstalkEditEnvironment(this ITelemetryLogger telemetryLogger, BeanstalkEditEnvironment payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "beanstalk_editEnvironment";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view the status of the CloudFront Distribution
        public static void RecordCloudfrontOpenDistribution(this ITelemetryLogger telemetryLogger, CloudfrontOpenDistribution payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudfront_openDistribution";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view the status of the CloudFront Streaming Distribution
        public static void RecordCloudfrontOpenStreamingDistribution(this ITelemetryLogger telemetryLogger, CloudfrontOpenStreamingDistribution payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudfront_openStreamingDistribution";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view the Cloudfront Invalidation requests
        public static void RecordCloudfrontOpenInvalidationRequest(this ITelemetryLogger telemetryLogger, CloudfrontOpenInvalidationRequest payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudfront_openInvalidationRequest";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user deletes a CloudFront Distribution
        public static void RecordCloudfrontDeleteDistribution(this ITelemetryLogger telemetryLogger, CloudfrontDeleteDistribution payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudfront_deleteDistribution";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user deletes a CloudFront Streaming Distribution
        public static void RecordCloudfrontDeleteStreamingDistribution(this ITelemetryLogger telemetryLogger, CloudfrontDeleteStreamingDistribution payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudfront_deleteStreamingDistribution";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create a CloudFront Distribution
        public static void RecordCloudfrontCreateDistribution(this ITelemetryLogger telemetryLogger, CloudfrontCreateDistribution payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudfront_createDistribution";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create a CloudFront Streaming Distribution
        public static void RecordCloudfrontCreateStreamingDistribution(this ITelemetryLogger telemetryLogger, CloudfrontCreateStreamingDistribution payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudfront_createStreamingDistribution";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Copy the ARN of a CloudWatch Logs entity
        public static void RecordCloudwatchlogsCopyArn(this ITelemetryLogger telemetryLogger, CloudwatchlogsCopyArn payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_copyArn";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("cloudWatchResourceType", payload.CloudWatchResourceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a CloudWatch Logs entity. ServiceType and source indicate where the request came from (example: while viewing an ECS container)
        public static void RecordCloudwatchlogsOpen(this ITelemetryLogger telemetryLogger, CloudwatchlogsOpen payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_open";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("cloudWatchResourceType", payload.CloudWatchResourceType);

                if (payload.CloudWatchLogsPresentation.HasValue)
                {
                    datum.AddMetadata("cloudWatchLogsPresentation", payload.CloudWatchLogsPresentation.Value);
                }

                datum.AddMetadata("serviceType", payload.ServiceType);

                if (payload.HasTextFilter.HasValue)
                {
                    datum.AddMetadata("hasTextFilter", payload.HasTextFilter.Value);
                }

                if (payload.HasTimeFilter.HasValue)
                {
                    datum.AddMetadata("hasTimeFilter", payload.HasTimeFilter.Value);
                }

                datum.AddMetadata("source", payload.Source);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open the CloudWatch Logs group window. ServiceType indicates that it was opened from a different service (like directly from an ECS container) (Deprecated - use cloudwatchlogs_open)
        public static void RecordCloudwatchlogsOpenGroup(this ITelemetryLogger telemetryLogger, CloudwatchlogsOpenGroup payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_openGroup";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a CloudWatch Logs stream in the window. ServiceType indicates that it was opened from a different service (like directly from an ECS container) (Deprecated - use cloudwatchlogs_open)
        public static void RecordCloudwatchlogsOpenStream(this ITelemetryLogger telemetryLogger, CloudwatchlogsOpenStream payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_openStream";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete a CloudWatch Logs entity.
        public static void RecordCloudwatchlogsDelete(this ITelemetryLogger telemetryLogger, CloudwatchlogsDelete payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_delete";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("cloudWatchResourceType", payload.CloudWatchResourceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Download a CloudWatch Logs entity. Value indicates the final size of the formatted stream in bytes.
        public static void RecordCloudwatchlogsDownload(this ITelemetryLogger telemetryLogger, CloudwatchlogsDownload payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_download";
                datum.Unit = Unit.Bytes;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("cloudWatchResourceType", payload.CloudWatchResourceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Download a stream to a file on disk. Value indicates the final size of the formatted stream. (Deprecated - use cloudwatchlogs_download)
        public static void RecordCloudwatchlogsDownloadStreamToFile(this ITelemetryLogger telemetryLogger, CloudwatchlogsDownloadStreamToFile payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_downloadStreamToFile";
                datum.Unit = Unit.Bytes;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Download a stream to memory then open in an editor.
        public static void RecordCloudwatchlogsOpenStreamInEditor(this ITelemetryLogger telemetryLogger, CloudwatchlogsOpenStreamInEditor payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_openStreamInEditor";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Copy the currently open (possibly filtered) messages to an editor
        public static void RecordCloudwatchlogsViewCurrentMessagesInEditor(this ITelemetryLogger telemetryLogger, CloudwatchlogsViewCurrentMessagesInEditor payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_viewCurrentMessagesInEditor";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Word wrap events off/on
        public static void RecordCloudwatchlogsWrapEvents(this ITelemetryLogger telemetryLogger, CloudwatchlogsWrapEvents payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_wrapEvents";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("enabled", payload.Enabled);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Tail stream off/on
        public static void RecordCloudwatchlogsTailStream(this ITelemetryLogger telemetryLogger, CloudwatchlogsTailStream payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_tailStream";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("enabled", payload.Enabled);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Refresh a CloudWatch Logs entity
        public static void RecordCloudwatchlogsRefresh(this ITelemetryLogger telemetryLogger, CloudwatchlogsRefresh payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_refresh";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("cloudWatchResourceType", payload.CloudWatchResourceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Refresh group is pressed (Deprecated, use cloudwatchlogs_refresh)
        public static void RecordCloudwatchlogsRefreshGroup(this ITelemetryLogger telemetryLogger, CloudwatchlogsRefreshGroup payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_refreshGroup";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Refresh stream is pressed (Deprecated, use cloudwatchlogs_refresh)
        public static void RecordCloudwatchlogsRefreshStream(this ITelemetryLogger telemetryLogger, CloudwatchlogsRefreshStream payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_refreshStream";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Filters a CloudWatch Logs entity. (Essentially a subset of cloudwatchlogs_open)
        public static void RecordCloudwatchlogsFilter(this ITelemetryLogger telemetryLogger, CloudwatchlogsFilter payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_filter";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("cloudWatchResourceType", payload.CloudWatchResourceType);

                datum.AddMetadata("source", payload.Source);

                if (payload.HasTextFilter.HasValue)
                {
                    datum.AddMetadata("hasTextFilter", payload.HasTextFilter.Value);
                }

                if (payload.HasTimeFilter.HasValue)
                {
                    datum.AddMetadata("hasTimeFilter", payload.HasTimeFilter.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when a stream is searched
        public static void RecordCloudwatchlogsSearchStream(this ITelemetryLogger telemetryLogger, CloudwatchlogsSearchStream payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_searchStream";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when a group is searched
        public static void RecordCloudwatchlogsSearchGroup(this ITelemetryLogger telemetryLogger, CloudwatchlogsSearchGroup payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_searchGroup";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Show event around a time period in ms specified by Value
        public static void RecordCloudwatchlogsShowEventsAround(this ITelemetryLogger telemetryLogger, CloudwatchlogsShowEventsAround payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchlogs_showEventsAround";
                datum.Unit = Unit.Milliseconds;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when creating a CloudFormation project
        public static void RecordCloudformationCreateProject(this ITelemetryLogger telemetryLogger, CloudformationCreateProject payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudformation_createProject";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("templateName", payload.TemplateName);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when deploying a CloudFormation template
        public static void RecordCloudformationDeploy(this ITelemetryLogger telemetryLogger, CloudformationDeploy payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudformation_deploy";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("initialDeploy", payload.InitialDeploy);

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum.AddMetadata("source", payload.Source);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user completes the CloudFormation template publish wizard
        public static void RecordCloudformationPublishWizard(this ITelemetryLogger telemetryLogger, CloudformationPublishWizard payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudformation_publishWizard";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum.AddMetadata("source", payload.Source);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a CloudFormation stack in the stack viewer
        public static void RecordCloudformationOpen(this ITelemetryLogger telemetryLogger, CloudformationOpen payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudformation_open";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// A repo is cloned from CodeCommit
        public static void RecordCodecommitCloneRepo(this ITelemetryLogger telemetryLogger, CodecommitCloneRepo payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codecommit_cloneRepo";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// A repo is created in CodeCommit
        public static void RecordCodecommitCreateRepo(this ITelemetryLogger telemetryLogger, CodecommitCreateRepo payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codecommit_createRepo";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// A connection is established to CodeCommit to perform actions on repos
        public static void RecordCodecommitSetCredentials(this ITelemetryLogger telemetryLogger, CodecommitSetCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codecommit_setCredentials";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.CredentialType.HasValue)
                {
                    datum.AddMetadata("credentialType", payload.CredentialType.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create a DynamoDB table
        public static void RecordDynamodbCreateTable(this ITelemetryLogger telemetryLogger, DynamodbCreateTable payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "dynamodb_createTable";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete a DynamoDB table
        public static void RecordDynamodbDeleteTable(this ITelemetryLogger telemetryLogger, DynamodbDeleteTable payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "dynamodb_deleteTable";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Modify a DynamoDB entity
        public static void RecordDynamodbEdit(this ITelemetryLogger telemetryLogger, DynamodbEdit payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "dynamodb_edit";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("dynamoDbTarget", payload.DynamoDbTarget);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Fetch records from a DynamoDB table in the table browser
        public static void RecordDynamodbFetchRecords(this ITelemetryLogger telemetryLogger, DynamodbFetchRecords payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "dynamodb_fetchRecords";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("dynamoDbFetchType", payload.DynamoDbFetchType);

                if (payload.DynamoDbIndexType.HasValue)
                {
                    datum.AddMetadata("dynamoDbIndexType", payload.DynamoDbIndexType.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a DynamoDB table in the table browser
        public static void RecordDynamodbOpenTable(this ITelemetryLogger telemetryLogger, DynamodbOpenTable payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "dynamodb_openTable";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// View a DynamoDB entity
        public static void RecordDynamodbView(this ITelemetryLogger telemetryLogger, DynamodbView payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "dynamodb_view";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("dynamoDbTarget", payload.DynamoDbTarget);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Change the state of an EC2 Instance
        public static void RecordEc2ChangeState(this ITelemetryLogger telemetryLogger, Ec2ChangeState payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_changeState";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("ec2InstanceState", payload.Ec2InstanceState);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Remove the private key of an EC2 Key Pair from internal storage
        public static void RecordEc2ClearPrivateKey(this ITelemetryLogger telemetryLogger, Ec2ClearPrivateKey payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_clearPrivateKey";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Perform a connection to an EC2 Instance
        public static void RecordEc2ConnectToInstance(this ITelemetryLogger telemetryLogger, Ec2ConnectToInstance payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_connectToInstance";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("ec2ConnectionType", payload.Ec2ConnectionType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Copy AMI image to another region
        public static void RecordEc2CopyAmiToRegion(this ITelemetryLogger telemetryLogger, Ec2CopyAmiToRegion payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_copyAmiToRegion";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create an image from an EC2 Instance
        public static void RecordEc2CreateAmi(this ITelemetryLogger telemetryLogger, Ec2CreateAmi payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_createAmi";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create (allocate) an Elastic IP address
        public static void RecordEc2CreateElasticIp(this ITelemetryLogger telemetryLogger, Ec2CreateElasticIp payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_createElasticIp";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create an EC2 Key Pair
        public static void RecordEc2CreateKeyPair(this ITelemetryLogger telemetryLogger, Ec2CreateKeyPair payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_createKeyPair";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create an EC2 security group
        public static void RecordEc2CreateSecurityGroup(this ITelemetryLogger telemetryLogger, Ec2CreateSecurityGroup payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_createSecurityGroup";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create an EC2 volume snapshot
        public static void RecordEc2CreateSnapshot(this ITelemetryLogger telemetryLogger, Ec2CreateSnapshot payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_createSnapshot";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create an EC2 volume
        public static void RecordEc2CreateVolume(this ITelemetryLogger telemetryLogger, Ec2CreateVolume payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_createVolume";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete (de-register) an AMI image
        public static void RecordEc2DeleteAmi(this ITelemetryLogger telemetryLogger, Ec2DeleteAmi payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_deleteAmi";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete (release) an Elastic IP address
        public static void RecordEc2DeleteElasticIp(this ITelemetryLogger telemetryLogger, Ec2DeleteElasticIp payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_deleteElasticIp";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete an EC2 Key Pair
        public static void RecordEc2DeleteKeyPair(this ITelemetryLogger telemetryLogger, Ec2DeleteKeyPair payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_deleteKeyPair";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete an EC2 security group
        public static void RecordEc2DeleteSecurityGroup(this ITelemetryLogger telemetryLogger, Ec2DeleteSecurityGroup payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_deleteSecurityGroup";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete an EC2 Volume Snapshot
        public static void RecordEc2DeleteSnapshot(this ITelemetryLogger telemetryLogger, Ec2DeleteSnapshot payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_deleteSnapshot";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete an EC2 Volume
        public static void RecordEc2DeleteVolume(this ITelemetryLogger telemetryLogger, Ec2DeleteVolume payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_deleteVolume";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Edit AMI image permissions
        public static void RecordEc2EditAmiPermission(this ITelemetryLogger telemetryLogger, Ec2EditAmiPermission payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_editAmiPermission";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Associate or disassociate an Elastic IP with an EC2 Instance
        public static void RecordEc2EditInstanceElasticIp(this ITelemetryLogger telemetryLogger, Ec2EditInstanceElasticIp payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_editInstanceElasticIp";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.Enabled.HasValue)
                {
                    datum.AddMetadata("enabled", payload.Enabled.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Adjust the shutdown behavior of an EC2 Instance
        public static void RecordEc2EditInstanceShutdownBehavior(this ITelemetryLogger telemetryLogger, Ec2EditInstanceShutdownBehavior payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_editInstanceShutdownBehavior";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Adjust the termination protection of an EC2 Instance
        public static void RecordEc2EditInstanceTerminationProtection(this ITelemetryLogger telemetryLogger, Ec2EditInstanceTerminationProtection payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_editInstanceTerminationProtection";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.Enabled.HasValue)
                {
                    datum.AddMetadata("enabled", payload.Enabled.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Adjust the instance type of an EC2 Instance
        public static void RecordEc2EditInstanceType(this ITelemetryLogger telemetryLogger, Ec2EditInstanceType payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_editInstanceType";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Adjust an EC2 Instance's user data
        public static void RecordEc2EditInstanceUserData(this ITelemetryLogger telemetryLogger, Ec2EditInstanceUserData payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_editInstanceUserData";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Alter an EC2 security group permission
        public static void RecordEc2EditSecurityGroupPermission(this ITelemetryLogger telemetryLogger, Ec2EditSecurityGroupPermission payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_editSecurityGroupPermission";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Attach (enabled = true) or detach a volume
        public static void RecordEc2EditVolumeAttachment(this ITelemetryLogger telemetryLogger, Ec2EditVolumeAttachment payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_editVolumeAttachment";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("enabled", payload.Enabled);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Save the private key of an EC2 Key Pair out to disk
        public static void RecordEc2ExportPrivateKey(this ITelemetryLogger telemetryLogger, Ec2ExportPrivateKey payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_exportPrivateKey";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Store the private key of an EC2 Key Pair in internal storage
        public static void RecordEc2ImportPrivateKey(this ITelemetryLogger telemetryLogger, Ec2ImportPrivateKey payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_importPrivateKey";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Launch an EC2 Instance
        public static void RecordEc2LaunchInstance(this ITelemetryLogger telemetryLogger, Ec2LaunchInstance payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_launchInstance";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view EC2 Instances
        public static void RecordEc2OpenInstances(this ITelemetryLogger telemetryLogger, Ec2OpenInstances payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_openInstances";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view EC2 AMIs
        public static void RecordEc2OpenAMIs(this ITelemetryLogger telemetryLogger, Ec2OpenAMIs payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_openAMIs";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view EC2 Elastic IPs
        public static void RecordEc2OpenElasticIPs(this ITelemetryLogger telemetryLogger, Ec2OpenElasticIPs payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_openElasticIPs";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open to view EC2 Key pairs
        public static void RecordEc2OpenKeyPairs(this ITelemetryLogger telemetryLogger, Ec2OpenKeyPairs payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_openKeyPairs";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view EC2 Security Groups
        public static void RecordEc2OpenSecurityGroups(this ITelemetryLogger telemetryLogger, Ec2OpenSecurityGroups payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_openSecurityGroups";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view EC2 Volumes
        public static void RecordEc2OpenVolumes(this ITelemetryLogger telemetryLogger, Ec2OpenVolumes payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_openVolumes";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// View the system log of an EC2 Instance
        public static void RecordEc2ViewInstanceSystemLog(this ITelemetryLogger telemetryLogger, Ec2ViewInstanceSystemLog payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_viewInstanceSystemLog";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open to view status of an ECS Cluster
        public static void RecordEcsOpenCluster(this ITelemetryLogger telemetryLogger, EcsOpenCluster payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_openCluster";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// View an EC2 Instance's user data
        public static void RecordEc2ViewInstanceUserData(this ITelemetryLogger telemetryLogger, Ec2ViewInstanceUserData payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ec2_viewInstanceUserData";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when ECS execute command is enabled
        public static void RecordEcsEnableExecuteCommand(this ITelemetryLogger telemetryLogger, EcsEnableExecuteCommand payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_enableExecuteCommand";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when ECS execute command is disabled
        public static void RecordEcsDisableExecuteCommand(this ITelemetryLogger telemetryLogger, EcsDisableExecuteCommand payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_disableExecuteCommand";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when the ECS execute command is run
        public static void RecordEcsRunExecuteCommand(this ITelemetryLogger telemetryLogger, EcsRunExecuteCommand payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_runExecuteCommand";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("ecsExecuteCommandType", payload.EcsExecuteCommandType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when the user copies the repository uri from a node
        public static void RecordEcrCopyRepositoryUri(this ITelemetryLogger telemetryLogger, EcrCopyRepositoryUri payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecr_copyRepositoryUri";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when the user copies the repository tag uri from a node. The tag uri is the repository uri + : + the tag name
        public static void RecordEcrCopyTagUri(this ITelemetryLogger telemetryLogger, EcrCopyTagUri payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecr_copyTagUri";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when creating a new ECR repository
        public static void RecordEcrCreateRepository(this ITelemetryLogger telemetryLogger, EcrCreateRepository payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecr_createRepository";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when deleting an existing ECR repository
        public static void RecordEcrDeleteRepository(this ITelemetryLogger telemetryLogger, EcrDeleteRepository payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecr_deleteRepository";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when deleting a tag in an ECR repository. The operation is a batch operation by default, value represents the number of tags deleted.
        public static void RecordEcrDeleteTags(this ITelemetryLogger telemetryLogger, EcrDeleteTags payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecr_deleteTags";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when deploying an image to ECR
        public static void RecordEcrDeployImage(this ITelemetryLogger telemetryLogger, EcrDeployImage payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecr_deployImage";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.EcrDeploySource.HasValue)
                {
                    datum.AddMetadata("ecrDeploySource", payload.EcrDeploySource.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when deploying a scheduled task to an ECS cluster
        public static void RecordEcsDeployScheduledTask(this ITelemetryLogger telemetryLogger, EcsDeployScheduledTask payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_deployScheduledTask";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("ecsLaunchType", payload.EcsLaunchType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when deploying a service to an ECS cluster
        public static void RecordEcsDeployService(this ITelemetryLogger telemetryLogger, EcsDeployService payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_deployService";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("ecsLaunchType", payload.EcsLaunchType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when deploying a task to an ECS cluster
        public static void RecordEcsDeployTask(this ITelemetryLogger telemetryLogger, EcsDeployTask payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_deployTask";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("ecsLaunchType", payload.EcsLaunchType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user completes the ECS publish wizard
        public static void RecordEcsPublishWizard(this ITelemetryLogger telemetryLogger, EcsPublishWizard payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_publishWizard";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open to view status of an ECS Repository
        public static void RecordEcsOpenRepository(this ITelemetryLogger telemetryLogger, EcsOpenRepository payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_openRepository";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user deletes an ECS service
        public static void RecordEcsDeleteService(this ITelemetryLogger telemetryLogger, EcsDeleteService payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_deleteService";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Edit configuration of an ECS service
        public static void RecordEcsEditService(this ITelemetryLogger telemetryLogger, EcsEditService payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_editService";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete an ECS cluster
        public static void RecordEcsDeleteCluster(this ITelemetryLogger telemetryLogger, EcsDeleteCluster payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_deleteCluster";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Stop ECS task(s)
        public static void RecordEcsStopTask(this ITelemetryLogger telemetryLogger, EcsStopTask payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_stopTask";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete ECS Scheduled task(s)
        public static void RecordEcsDeleteScheduledTask(this ITelemetryLogger telemetryLogger, EcsDeleteScheduledTask payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ecs_deleteScheduledTask";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called while submitting in-IDE feedback
        public static void RecordFeedbackResult(this ITelemetryLogger telemetryLogger, FeedbackResult payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "feedback_result";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Use authoring features such as autocompletion, syntax checking, and highlighting, for AWS filetypes (CFN, SAM, etc.). Emit this _once_ per file-editing session for a given file. Ideally this is emitted only if authoring features are used, rather than merely opening or touching a file.
        public static void RecordFileEditAwsFile(this ITelemetryLogger telemetryLogger, FileEditAwsFile payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "file_editAwsFile";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("awsFiletype", payload.AwsFiletype);

                datum.AddMetadata("filenameExt", payload.FilenameExt);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view/edit IAM Role Policy
        public static void RecordIamOpenRole(this ITelemetryLogger telemetryLogger, IamOpenRole payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "iam_openRole";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view/edit IAM Group Policy
        public static void RecordIamOpenGroup(this ITelemetryLogger telemetryLogger, IamOpenGroup payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "iam_openGroup";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view/edit IAM User Configuration
        public static void RecordIamOpenUser(this ITelemetryLogger telemetryLogger, IamOpenUser payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "iam_openUser";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view/edit an IAM resource
        public static void RecordIamOpen(this ITelemetryLogger telemetryLogger, IamOpen payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "iam_open";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("iamResourceType", payload.IamResourceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create an IAM resource
        public static void RecordIamCreate(this ITelemetryLogger telemetryLogger, IamCreate payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "iam_create";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("iamResourceType", payload.IamResourceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete an IAM resource
        public static void RecordIamDelete(this ITelemetryLogger telemetryLogger, IamDelete payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "iam_delete";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("iamResourceType", payload.IamResourceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Edits policy/configuration associated with an IAM resource
        public static void RecordIamEdit(this ITelemetryLogger telemetryLogger, IamEdit payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "iam_edit";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("iamResourceType", payload.IamResourceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create Access Key for an IAM user
        public static void RecordIamCreateUserAccessKey(this ITelemetryLogger telemetryLogger, IamCreateUserAccessKey payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "iam_createUserAccessKey";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete Access Key for an IAM user
        public static void RecordIamDeleteUserAccessKey(this ITelemetryLogger telemetryLogger, IamDeleteUserAccessKey payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "iam_deleteUserAccessKey";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// called when deleting lambdas remotely
        public static void RecordLambdaDelete(this ITelemetryLogger telemetryLogger, LambdaDelete payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_delete";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when opening the local configuration of a Lambda to edit
        public static void RecordLambdaConfigure(this ITelemetryLogger telemetryLogger, LambdaConfigure payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_configure";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when creating lambdas remotely
        public static void RecordLambdaCreate(this ITelemetryLogger telemetryLogger, LambdaCreate payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_create";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("runtime", payload.Runtime);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when creating a lambda project
        public static void RecordLambdaCreateProject(this ITelemetryLogger telemetryLogger, LambdaCreateProject payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_createProject";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("language", payload.Language);

                datum.AddMetadata("templateName", payload.TemplateName);

                datum.AddMetadata("variant", payload.Variant);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Jump to a lambda handler from elsewhere
        public static void RecordLambdaGoToHandler(this ITelemetryLogger telemetryLogger, LambdaGoToHandler payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_goToHandler";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when creating lambdas remotely
        public static void RecordLambdaEditFunction(this ITelemetryLogger telemetryLogger, LambdaEditFunction payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_editFunction";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                if (payload.Update.HasValue)
                {
                    datum.AddMetadata("update", payload.Update.Value);
                }

                datum.AddMetadata("lambdaPackageType", payload.LambdaPackageType);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when invoking lambdas remotely
        public static void RecordLambdaInvokeRemote(this ITelemetryLogger telemetryLogger, LambdaInvokeRemote payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_invokeRemote";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                if (payload.Runtime.HasValue)
                {
                    datum.AddMetadata("runtime", payload.Runtime.Value);
                }

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when invoking lambdas locally (with SAM in most toolkits)
        public static void RecordLambdaInvokeLocal(this ITelemetryLogger telemetryLogger, LambdaInvokeLocal payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_invokeLocal";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                if (payload.Runtime.HasValue)
                {
                    datum.AddMetadata("runtime", payload.Runtime.Value);
                }

                datum.AddMetadata("version", payload.Version);

                datum.AddMetadata("lambdaPackageType", payload.LambdaPackageType);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("debug", payload.Debug);

                if (payload.LambdaArchitecture.HasValue)
                {
                    datum.AddMetadata("lambdaArchitecture", payload.LambdaArchitecture.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when importing a remote Lambda function
        public static void RecordLambdaImport(this ITelemetryLogger telemetryLogger, LambdaImport payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_import";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                if (payload.Runtime.HasValue)
                {
                    datum.AddMetadata("runtime", payload.Runtime.Value);
                }

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when updating a Lambda function's code outside the context of a SAM template
        public static void RecordLambdaUpdateFunctionCode(this ITelemetryLogger telemetryLogger, LambdaUpdateFunctionCode payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_updateFunctionCode";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                if (payload.Runtime.HasValue)
                {
                    datum.AddMetadata("runtime", payload.Runtime.Value);
                }

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when deploying a Lambda Function
        public static void RecordLambdaDeploy(this ITelemetryLogger telemetryLogger, LambdaDeploy payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_deploy";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("lambdaPackageType", payload.LambdaPackageType);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("initialDeploy", payload.InitialDeploy);

                if (payload.Runtime.HasValue)
                {
                    datum.AddMetadata("runtime", payload.Runtime.Value);
                }

                datum.AddMetadata("platform", payload.Platform);

                if (payload.LambdaArchitecture.HasValue)
                {
                    datum.AddMetadata("lambdaArchitecture", payload.LambdaArchitecture.Value);
                }

                datum.AddMetadata("language", payload.Language);

                if (payload.XrayEnabled.HasValue)
                {
                    datum.AddMetadata("xrayEnabled", payload.XrayEnabled.Value);
                }

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum.AddMetadata("source", payload.Source);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user completes the Lambda publish wizard
        public static void RecordLambdaPublishWizard(this ITelemetryLogger telemetryLogger, LambdaPublishWizard payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "lambda_publishWizard";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum.AddMetadata("source", payload.Source);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when deleting a cloudformation stack
        public static void RecordCloudformationDelete(this ITelemetryLogger telemetryLogger, CloudformationDelete payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudformation_delete";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when getting IAM/SecretsManager credentials for a RDS database. Value represents how long it takes in ms.
        public static void RecordRdsGetCredentials(this ITelemetryLogger telemetryLogger, RdsGetCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "rds_getCredentials";
                datum.Unit = Unit.Milliseconds;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("databaseCredentials", payload.DatabaseCredentials);

                datum.AddMetadata("databaseEngine", payload.DatabaseEngine);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view RDS DB Instances
        public static void RecordRdsOpenInstances(this ITelemetryLogger telemetryLogger, RdsOpenInstances payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "rds_openInstances";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view RDS Security Groups
        public static void RecordRdsOpenSecurityGroups(this ITelemetryLogger telemetryLogger, RdsOpenSecurityGroups payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "rds_openSecurityGroups";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view RDS Subnet Groups
        public static void RecordRdsOpenSubnets(this ITelemetryLogger telemetryLogger, RdsOpenSubnets payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "rds_openSubnets";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Launch a RDS DB instance
        public static void RecordRdsLaunchInstance(this ITelemetryLogger telemetryLogger, RdsLaunchInstance payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "rds_launchInstance";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create a RDS security group
        public static void RecordRdsCreateSecurityGroup(this ITelemetryLogger telemetryLogger, RdsCreateSecurityGroup payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "rds_createSecurityGroup";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create a RDS subnet group
        public static void RecordRdsCreateSubnetGroup(this ITelemetryLogger telemetryLogger, RdsCreateSubnetGroup payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "rds_createSubnetGroup";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete a RDS DB instance
        public static void RecordRdsDeleteInstance(this ITelemetryLogger telemetryLogger, RdsDeleteInstance payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "rds_deleteInstance";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete RDS security group(s)
        public static void RecordRdsDeleteSecurityGroup(this ITelemetryLogger telemetryLogger, RdsDeleteSecurityGroup payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "rds_deleteSecurityGroup";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete RDS subnet group(s)
        public static void RecordRdsDeleteSubnetGroup(this ITelemetryLogger telemetryLogger, RdsDeleteSubnetGroup payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "rds_deleteSubnetGroup";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when creating a new database connection configuration to for a RDS database. In Datagrip we do not get this infromation if it is created directly, so this is only counts actions.
        public static void RecordRdsCreateConnectionConfiguration(this ITelemetryLogger telemetryLogger, RdsCreateConnectionConfiguration payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "rds_createConnectionConfiguration";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("databaseCredentials", payload.DatabaseCredentials);

                datum.AddMetadata("databaseEngine", payload.DatabaseEngine);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when getting IAM/SecretsManager credentials for a Redshift database. Value represents how long it takes in ms.
        public static void RecordRedshiftGetCredentials(this ITelemetryLogger telemetryLogger, RedshiftGetCredentials payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "redshift_getCredentials";
                datum.Unit = Unit.Milliseconds;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("databaseCredentials", payload.DatabaseCredentials);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when creating a new database connection configuration to for a Redshift database. In Datagrip we do not get this infromation if it is created directly, so this only counts actions.
        public static void RecordRedshiftCreateConnectionConfiguration(this ITelemetryLogger telemetryLogger, RedshiftCreateConnectionConfiguration payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "redshift_createConnectionConfiguration";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("databaseCredentials", payload.DatabaseCredentials);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when deploying a SAM application
        public static void RecordSamDeploy(this ITelemetryLogger telemetryLogger, SamDeploy payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sam_deploy";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("version", payload.Version);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when syncing a SAM application
        public static void RecordSamSync(this ITelemetryLogger telemetryLogger, SamSync payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sam_sync";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("syncedResources", payload.SyncedResources);

                datum.AddMetadata("lambdaPackageType", payload.LambdaPackageType);

                datum.AddMetadata("version", payload.Version);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when initing a SAM application
        public static void RecordSamInit(this ITelemetryLogger telemetryLogger, SamInit payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sam_init";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.Runtime.HasValue)
                {
                    datum.AddMetadata("runtime", payload.Runtime.Value);
                }

                datum.AddMetadata("templateName", payload.TemplateName);

                datum.AddMetadata("version", payload.Version);

                if (payload.LambdaPackageType.HasValue)
                {
                    datum.AddMetadata("lambdaPackageType", payload.LambdaPackageType.Value);
                }

                datum.AddMetadata("eventBridgeSchema", payload.EventBridgeSchema);

                if (payload.LambdaArchitecture.HasValue)
                {
                    datum.AddMetadata("lambdaArchitecture", payload.LambdaArchitecture.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when selecting an EventBridge schema to view
        public static void RecordSchemasView(this ITelemetryLogger telemetryLogger, SchemasView payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "schemas_view";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when downloading an EventBridge schema
        public static void RecordSchemasDownload(this ITelemetryLogger telemetryLogger, SchemasDownload payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "schemas_download";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.SchemaLanguage.HasValue)
                {
                    datum.AddMetadata("schemaLanguage", payload.SchemaLanguage.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when searching an EventBridge schema registry
        public static void RecordSchemasSearch(this ITelemetryLogger telemetryLogger, SchemasSearch payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "schemas_search";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when starting the plugin
        public static void RecordSessionStart(this ITelemetryLogger telemetryLogger, SessionStart payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "session_start";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when stopping the IDE on a best effort basis
        public static void RecordSessionEnd(this ITelemetryLogger telemetryLogger, SessionEnd payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "session_end";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Copy the bucket name to the clipboard
        public static void RecordS3CopyBucketName(this ITelemetryLogger telemetryLogger, S3CopyBucketName payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_copyBucketName";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Copy the path of a S3 object to the clipboard
        public static void RecordS3CopyPath(this ITelemetryLogger telemetryLogger, S3CopyPath payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_copyPath";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Copy the S3 URI of a S3 object to the clipboard (e.g. s3://<bucketName>/abc.txt)
        public static void RecordS3CopyUri(this ITelemetryLogger telemetryLogger, S3CopyUri payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_copyUri";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Copy the URL of a S3 object to the clipboard
        public static void RecordS3CopyUrl(this ITelemetryLogger telemetryLogger, S3CopyUrl payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_copyUrl";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("presigned", payload.Presigned);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create a S3 bucket
        public static void RecordS3CreateBucket(this ITelemetryLogger telemetryLogger, S3CreateBucket payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_createBucket";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete a S3 bucket
        public static void RecordS3DeleteBucket(this ITelemetryLogger telemetryLogger, S3DeleteBucket payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_deleteBucket";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete S3 object(s)
        public static void RecordS3DeleteObject(this ITelemetryLogger telemetryLogger, S3DeleteObject payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_deleteObject";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.SuccessCount.HasValue)
                {
                    datum.AddMetadata("successCount", payload.SuccessCount.Value);
                }

                if (payload.FailedCount.HasValue)
                {
                    datum.AddMetadata("failedCount", payload.FailedCount.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create an S3 folder
        public static void RecordS3CreateFolder(this ITelemetryLogger telemetryLogger, S3CreateFolder payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_createFolder";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Download S3 object(s)
        public static void RecordS3DownloadObject(this ITelemetryLogger telemetryLogger, S3DownloadObject payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_downloadObject";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.SuccessCount.HasValue)
                {
                    datum.AddMetadata("successCount", payload.SuccessCount.Value);
                }

                if (payload.FailedCount.HasValue)
                {
                    datum.AddMetadata("failedCount", payload.FailedCount.Value);
                }

                if (payload.Component.HasValue)
                {
                    datum.AddMetadata("component", payload.Component.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Download multiple S3 objects
        public static void RecordS3DownloadObjects(this ITelemetryLogger telemetryLogger, S3DownloadObjects payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_downloadObjects";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Upload S3 object(s)
        public static void RecordS3UploadObject(this ITelemetryLogger telemetryLogger, S3UploadObject payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_uploadObject";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.SuccessCount.HasValue)
                {
                    datum.AddMetadata("successCount", payload.SuccessCount.Value);
                }

                if (payload.FailedCount.HasValue)
                {
                    datum.AddMetadata("failedCount", payload.FailedCount.Value);
                }

                if (payload.Component.HasValue)
                {
                    datum.AddMetadata("component", payload.Component.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Rename a single S3 object
        public static void RecordS3RenameObject(this ITelemetryLogger telemetryLogger, S3RenameObject payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_renameObject";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Upload multiple S3 objects
        public static void RecordS3UploadObjects(this ITelemetryLogger telemetryLogger, S3UploadObjects payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_uploadObjects";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a view of a S3 bucket
        public static void RecordS3OpenEditor(this ITelemetryLogger telemetryLogger, S3OpenEditor payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_openEditor";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Edit or view one or more S3 objects in the IDE
        public static void RecordS3EditObject(this ITelemetryLogger telemetryLogger, S3EditObject payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_editObject";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.Component.HasValue)
                {
                    datum.AddMetadata("component", payload.Component.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view S3 bucket properties
        public static void RecordS3OpenBucketProperties(this ITelemetryLogger telemetryLogger, S3OpenBucketProperties payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_openBucketProperties";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view S3 Multipart upload
        public static void RecordS3OpenMultipartUpload(this ITelemetryLogger telemetryLogger, S3OpenMultipartUpload payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "s3_openMultipartUpload";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// The Toolkit has completed initialization
        public static void RecordToolkitInit(this ITelemetryLogger telemetryLogger, ToolkitInit payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "toolkit_init";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                if (payload.Result.HasValue)
                {
                    datum.AddMetadata("result", payload.Result.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// View logs for the toolkit
        public static void RecordToolkitViewLogs(this ITelemetryLogger telemetryLogger, ToolkitViewLogs payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "toolkit_viewLogs";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open an SQS queue. Initially opens to either the send message pane or poll messages pane.
        public static void RecordSqsOpenQueue(this ITelemetryLogger telemetryLogger, SqsOpenQueue payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sqs_openQueue";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("sqsQueueType", payload.SqsQueueType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create a new SQS queue
        public static void RecordSqsCreateQueue(this ITelemetryLogger telemetryLogger, SqsCreateQueue payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sqs_createQueue";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.SqsQueueType.HasValue)
                {
                    datum.AddMetadata("sqsQueueType", payload.SqsQueueType.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Send a message to an SQS queue
        public static void RecordSqsSendMessage(this ITelemetryLogger telemetryLogger, SqsSendMessage payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sqs_sendMessage";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("sqsQueueType", payload.SqsQueueType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Delete one or more messages from an SQS queue. Value indicates the number of messages that we tried to delete.
        public static void RecordSqsDeleteMessages(this ITelemetryLogger telemetryLogger, SqsDeleteMessages payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sqs_deleteMessages";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("sqsQueueType", payload.SqsQueueType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Subscribe the queue to messages from an sns topic
        public static void RecordSqsSubscribeSns(this ITelemetryLogger telemetryLogger, SqsSubscribeSns payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sqs_subscribeSns";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("sqsQueueType", payload.SqsQueueType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Configure the queue as a trigger for a Lambda
        public static void RecordSqsConfigureLambdaTrigger(this ITelemetryLogger telemetryLogger, SqsConfigureLambdaTrigger payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sqs_configureLambdaTrigger";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("sqsQueueType", payload.SqsQueueType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Edit the Queue parameters
        public static void RecordSqsEditQueueParameters(this ITelemetryLogger telemetryLogger, SqsEditQueueParameters payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sqs_editQueueParameters";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("sqsQueueType", payload.SqsQueueType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Purge all messages from the queue
        public static void RecordSqsPurgeQueue(this ITelemetryLogger telemetryLogger, SqsPurgeQueue payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sqs_purgeQueue";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("sqsQueueType", payload.SqsQueueType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user deletes a SQS queue
        public static void RecordSqsDeleteQueue(this ITelemetryLogger telemetryLogger, SqsDeleteQueue payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sqs_deleteQueue";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                if (payload.SqsQueueType.HasValue)
                {
                    datum.AddMetadata("sqsQueueType", payload.SqsQueueType.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create a SNS Topic
        public static void RecordSnsCreateTopic(this ITelemetryLogger telemetryLogger, SnsCreateTopic payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sns_createTopic";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create a SNS Subscription
        public static void RecordSnsCreateSubscription(this ITelemetryLogger telemetryLogger, SnsCreateSubscription payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sns_createSubscription";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view details of SNS Topic
        public static void RecordSnsOpenTopic(this ITelemetryLogger telemetryLogger, SnsOpenTopic payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sns_openTopic";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view SNS Subscriptions
        public static void RecordSnsOpenSubscriptions(this ITelemetryLogger telemetryLogger, SnsOpenSubscriptions payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sns_openSubscriptions";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user deletes a SNS Topic
        public static void RecordSnsDeleteTopic(this ITelemetryLogger telemetryLogger, SnsDeleteTopic payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sns_deleteTopic";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Called when user deletes SNS subscription(s)
        public static void RecordSnsDeleteSubscription(this ITelemetryLogger telemetryLogger, SnsDeleteSubscription payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sns_deleteSubscription";
                datum.Unit = Unit.Count;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Publish message to a SNS topic
        public static void RecordSnsPublishMessage(this ITelemetryLogger telemetryLogger, SnsPublishMessage payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "sns_publishMessage";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view VPC RouteTable
        public static void RecordVpcOpenRouteTables(this ITelemetryLogger telemetryLogger, VpcOpenRouteTables payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "vpc_openRouteTables";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view VPC Internet Gateway
        public static void RecordVpcOpenGateways(this ITelemetryLogger telemetryLogger, VpcOpenGateways payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "vpc_openGateways";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view VPC Network ACLs
        public static void RecordVpcOpenACLs(this ITelemetryLogger telemetryLogger, VpcOpenACLs payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "vpc_openACLs";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view VPC Subnets
        public static void RecordVpcOpenSubnets(this ITelemetryLogger telemetryLogger, VpcOpenSubnets payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "vpc_openSubnets";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open a window to view VPC details
        public static void RecordVpcOpenVPCs(this ITelemetryLogger telemetryLogger, VpcOpenVPCs payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "vpc_openVPCs";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open the insights query editor
        public static void RecordCloudwatchinsightsOpenEditor(this ITelemetryLogger telemetryLogger, CloudwatchinsightsOpenEditor payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchinsights_openEditor";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("insightsDialogOpenSource", payload.InsightsDialogOpenSource);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Start an insights query
        public static void RecordCloudwatchinsightsExecuteQuery(this ITelemetryLogger telemetryLogger, CloudwatchinsightsExecuteQuery payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchinsights_executeQuery";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("insightsQueryTimeType", payload.InsightsQueryTimeType);

                datum.AddMetadata("insightsQueryStringType", payload.InsightsQueryStringType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Save query parameters to AWS
        public static void RecordCloudwatchinsightsSaveQuery(this ITelemetryLogger telemetryLogger, CloudwatchinsightsSaveQuery payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchinsights_saveQuery";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Retrieve list of available saved queries from AWS
        public static void RecordCloudwatchinsightsRetrieveQuery(this ITelemetryLogger telemetryLogger, CloudwatchinsightsRetrieveQuery payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchinsights_retrieveQuery";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Get all details for the selected log record
        public static void RecordCloudwatchinsightsOpenDetailedLogRecord(this ITelemetryLogger telemetryLogger, CloudwatchinsightsOpenDetailedLogRecord payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "cloudwatchinsights_openDetailedLogRecord";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// The toolkit tried to retrieve blob data from a url
        public static void RecordToolkitGetExternalResource(this ITelemetryLogger telemetryLogger, ToolkitGetExternalResource payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "toolkit_getExternalResource";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("url", payload.Url);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// The toolkit tried to show a notification message
        public static void RecordToolkitShowNotification(this ITelemetryLogger telemetryLogger, ToolkitShowNotification payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "toolkit_showNotification";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("id", payload.Id);

                datum.AddMetadata("component", payload.Component);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// The toolkit tried to show an action. Source represents the notification that produced the action
        public static void RecordToolkitShowAction(this ITelemetryLogger telemetryLogger, ToolkitShowAction payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "toolkit_showAction";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("id", payload.Id);

                datum.AddMetadata("source", payload.Source);

                datum.AddMetadata("component", payload.Component);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// A user invoked an action. Source represents the notification that produced the action
        public static void RecordToolkitInvokeAction(this ITelemetryLogger telemetryLogger, ToolkitInvokeAction payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "toolkit_invokeAction";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("id", payload.Id);

                datum.AddMetadata("source", payload.Source);

                datum.AddMetadata("component", payload.Component);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Open the dynamic resource model in the IDE
        public static void RecordDynamicresourceGetResource(this ITelemetryLogger telemetryLogger, DynamicresourceGetResource payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "dynamicresource_getResource";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("resourceType", payload.ResourceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Expand a Resource Type node
        public static void RecordDynamicresourceListResource(this ITelemetryLogger telemetryLogger, DynamicresourceListResource payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "dynamicresource_listResource";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("resourceType", payload.ResourceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Change the list of available dynamic resources in the AWS Explorer
        public static void RecordDynamicresourceSelectResources(this ITelemetryLogger telemetryLogger, DynamicresourceSelectResources payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "dynamicresource_selectResources";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Copy the dynamic resource identifier
        public static void RecordDynamicresourceCopyIdentifier(this ITelemetryLogger telemetryLogger, DynamicresourceCopyIdentifier payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "dynamicresource_copyIdentifier";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("resourceType", payload.ResourceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// A dynamic resource mutation request completed
        public static void RecordDynamicresourceMutateResource(this ITelemetryLogger telemetryLogger, DynamicresourceMutateResource payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "dynamicresource_mutateResource";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("resourceType", payload.ResourceType);

                datum.AddMetadata("dynamicResourceOperation", payload.DynamicResourceOperation);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// An experiment was activated or deactivated in the Toolkit
        public static void RecordAwsExperimentActivation(this ITelemetryLogger telemetryLogger, AwsExperimentActivation payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_experimentActivation";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("experimentId", payload.ExperimentId);

                datum.AddMetadata("experimentState", payload.ExperimentState);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// An external tool was installed automatically
        public static void RecordAwsToolInstallation(this ITelemetryLogger telemetryLogger, AwsToolInstallation payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_toolInstallation";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("toolId", payload.ToolId);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// An setting was changed by users in the Toolkit. This metric can optionally provide the new state of the setting via settingState.
        public static void RecordAwsModifySetting(this ITelemetryLogger telemetryLogger, AwsModifySetting payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "aws_modifySetting";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("settingId", payload.SettingId);

                datum.AddMetadata("settingState", payload.SettingState);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// User clicked/activated a UI element. This does not necessarily have to be an explicit mouse click. Any user action that has the same behavior as a mouse click can use this event.
        public static void RecordUiClick(this ITelemetryLogger telemetryLogger, UiClick payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "ui_click";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("elementId", payload.ElementId);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// User requested that a resource be opened in the browser using the deeplink service
        public static void RecordDeeplinkOpen(this ITelemetryLogger telemetryLogger, DeeplinkOpen payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "deeplink_open";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("source", payload.Source);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("serviceType", payload.ServiceType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Percentage of user tokens against suggestions until 5 mins of time
        public static void RecordCodewhispererCodePercentage(this ITelemetryLogger telemetryLogger, CodewhispererCodePercentage payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codewhisperer_codePercentage";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("codewhispererAcceptedTokens", payload.CodewhispererAcceptedTokens);

                datum.AddMetadata("codewhispererLanguage", payload.CodewhispererLanguage);

                datum.AddMetadata("codewhispererPercentage", payload.CodewhispererPercentage);

                datum.AddMetadata("codewhispererTotalTokens", payload.CodewhispererTotalTokens);

                datum.AddMetadata("codewhispererUserGroup", payload.CodewhispererUserGroup);

                datum.AddMetadata("successCount", payload.SuccessCount);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Client side invocation of the CodeWhisperer Security Scan
        public static void RecordCodewhispererSecurityScan(this ITelemetryLogger telemetryLogger, CodewhispererSecurityScan payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codewhisperer_securityScan";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("codewhispererCodeScanLines", payload.CodewhispererCodeScanLines);

                datum.AddMetadata("codewhispererCodeScanJobId", payload.CodewhispererCodeScanJobId);

                if (payload.CodewhispererCodeScanProjectBytes.HasValue)
                {
                    datum.AddMetadata("codewhispererCodeScanProjectBytes", payload.CodewhispererCodeScanProjectBytes.Value);
                }

                datum.AddMetadata("codewhispererCodeScanSrcPayloadBytes", payload.CodewhispererCodeScanSrcPayloadBytes);

                if (payload.CodewhispererCodeScanBuildPayloadBytes.HasValue)
                {
                    datum.AddMetadata("codewhispererCodeScanBuildPayloadBytes", payload.CodewhispererCodeScanBuildPayloadBytes.Value);
                }

                datum.AddMetadata("codewhispererCodeScanSrcZipFileBytes", payload.CodewhispererCodeScanSrcZipFileBytes);

                if (payload.CodewhispererCodeScanBuildZipFileBytes.HasValue)
                {
                    datum.AddMetadata("codewhispererCodeScanBuildZipFileBytes", payload.CodewhispererCodeScanBuildZipFileBytes.Value);
                }

                datum.AddMetadata("codewhispererCodeScanTotalIssues", payload.CodewhispererCodeScanTotalIssues);

                datum.AddMetadata("codewhispererLanguage", payload.CodewhispererLanguage);

                datum.AddMetadata("contextTruncationDuration", payload.ContextTruncationDuration);

                datum.AddMetadata("artifactsUploadDuration", payload.ArtifactsUploadDuration);

                datum.AddMetadata("codeScanServiceInvocationsDuration", payload.CodeScanServiceInvocationsDuration);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("credentialStartUrl", payload.CredentialStartUrl);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Client side invocation of the CodeWhisperer service for suggestion
        public static void RecordCodewhispererServiceInvocation(this ITelemetryLogger telemetryLogger, CodewhispererServiceInvocation payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codewhisperer_serviceInvocation";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                if (payload.CodewhispererAutomatedTriggerType.HasValue)
                {
                    datum.AddMetadata("codewhispererAutomatedTriggerType", payload.CodewhispererAutomatedTriggerType.Value);
                }

                if (payload.CodewhispererCompletionType.HasValue)
                {
                    datum.AddMetadata("codewhispererCompletionType", payload.CodewhispererCompletionType.Value);
                }

                datum.AddMetadata("codewhispererCursorOffset", payload.CodewhispererCursorOffset);

                datum.AddMetadata("codewhispererLanguage", payload.CodewhispererLanguage);

                if (payload.CodewhispererLastSuggestionIndex.HasValue)
                {
                    datum.AddMetadata("codewhispererLastSuggestionIndex", payload.CodewhispererLastSuggestionIndex.Value);
                }

                datum.AddMetadata("codewhispererLineNumber", payload.CodewhispererLineNumber);

                datum.AddMetadata("codewhispererRequestId", payload.CodewhispererRequestId);

                if (payload.CodewhispererRuntime.HasValue)
                {
                    datum.AddMetadata("codewhispererRuntime", payload.CodewhispererRuntime.Value);
                }

                datum.AddMetadata("codewhispererRuntimeSource", payload.CodewhispererRuntimeSource);

                datum.AddMetadata("codewhispererSessionId", payload.CodewhispererSessionId);

                if (payload.CodewhispererSupplementalContextTimeout.HasValue)
                {
                    datum.AddMetadata("codewhispererSupplementalContextTimeout", payload.CodewhispererSupplementalContextTimeout.Value);
                }

                if (payload.CodewhispererSupplementalContextIsUtg.HasValue)
                {
                    datum.AddMetadata("codewhispererSupplementalContextIsUtg", payload.CodewhispererSupplementalContextIsUtg.Value);
                }

                if (payload.CodewhispererSupplementalContextLatency.HasValue)
                {
                    datum.AddMetadata("codewhispererSupplementalContextLatency", payload.CodewhispererSupplementalContextLatency.Value);
                }

                if (payload.CodewhispererSupplementalContextLength.HasValue)
                {
                    datum.AddMetadata("codewhispererSupplementalContextLength", payload.CodewhispererSupplementalContextLength.Value);
                }

                datum.AddMetadata("codewhispererTriggerType", payload.CodewhispererTriggerType);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("credentialStartUrl", payload.CredentialStartUrl);

                if (payload.CodewhispererImportRecommendationEnabled.HasValue)
                {
                    datum.AddMetadata("codewhispererImportRecommendationEnabled", payload.CodewhispererImportRecommendationEnabled.Value);
                }

                datum.AddMetadata("codewhispererUserGroup", payload.CodewhispererUserGroup);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Client side invocation blocked by another invocation in progress
        public static void RecordCodewhispererBlockedInvocation(this ITelemetryLogger telemetryLogger, CodewhispererBlockedInvocation payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codewhisperer_blockedInvocation";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                if (payload.CodewhispererAutomatedTriggerType.HasValue)
                {
                    datum.AddMetadata("codewhispererAutomatedTriggerType", payload.CodewhispererAutomatedTriggerType.Value);
                }

                datum.AddMetadata("codewhispererCursorOffset", payload.CodewhispererCursorOffset);

                datum.AddMetadata("codewhispererLanguage", payload.CodewhispererLanguage);

                datum.AddMetadata("codewhispererLineNumber", payload.CodewhispererLineNumber);

                datum.AddMetadata("codewhispererTriggerType", payload.CodewhispererTriggerType);

                datum.AddMetadata("credentialStartUrl", payload.CredentialStartUrl);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// User acceptance or rejection of each suggestion returned by the CodeWhisperer service request
        public static void RecordCodewhispererUserDecision(this ITelemetryLogger telemetryLogger, CodewhispererUserDecision payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codewhisperer_userDecision";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("codewhispererCompletionType", payload.CodewhispererCompletionType);

                datum.AddMetadata("codewhispererLanguage", payload.CodewhispererLanguage);

                if (payload.CodewhispererPaginationProgress.HasValue)
                {
                    datum.AddMetadata("codewhispererPaginationProgress", payload.CodewhispererPaginationProgress.Value);
                }

                datum.AddMetadata("codewhispererRequestId", payload.CodewhispererRequestId);

                if (payload.CodewhispererRuntime.HasValue)
                {
                    datum.AddMetadata("codewhispererRuntime", payload.CodewhispererRuntime.Value);
                }

                datum.AddMetadata("codewhispererRuntimeSource", payload.CodewhispererRuntimeSource);

                datum.AddMetadata("codewhispererSessionId", payload.CodewhispererSessionId);

                datum.AddMetadata("codewhispererSuggestionIndex", payload.CodewhispererSuggestionIndex);

                datum.AddMetadata("codewhispererSuggestionReferenceCount", payload.CodewhispererSuggestionReferenceCount);

                datum.AddMetadata("codewhispererSuggestionReferences", payload.CodewhispererSuggestionReferences);

                if (payload.CodewhispererSuggestionImportCount.HasValue)
                {
                    datum.AddMetadata("codewhispererSuggestionImportCount", payload.CodewhispererSuggestionImportCount.Value);
                }

                datum.AddMetadata("codewhispererSuggestionState", payload.CodewhispererSuggestionState);

                if (payload.CodewhispererSupplementalContextTimeout.HasValue)
                {
                    datum.AddMetadata("codewhispererSupplementalContextTimeout", payload.CodewhispererSupplementalContextTimeout.Value);
                }

                if (payload.CodewhispererSupplementalContextIsUtg.HasValue)
                {
                    datum.AddMetadata("codewhispererSupplementalContextIsUtg", payload.CodewhispererSupplementalContextIsUtg.Value);
                }

                if (payload.CodewhispererSupplementalContextLength.HasValue)
                {
                    datum.AddMetadata("codewhispererSupplementalContextLength", payload.CodewhispererSupplementalContextLength.Value);
                }

                datum.AddMetadata("codewhispererTriggerType", payload.CodewhispererTriggerType);

                datum.AddMetadata("credentialStartUrl", payload.CredentialStartUrl);

                datum.AddMetadata("codewhispererUserGroup", payload.CodewhispererUserGroup);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// User decision aggregated at trigger level
        public static void RecordCodewhispererUserTriggerDecision(this ITelemetryLogger telemetryLogger, CodewhispererUserTriggerDecision payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codewhisperer_userTriggerDecision";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("codewhispererSessionId", payload.CodewhispererSessionId);

                datum.AddMetadata("codewhispererFirstRequestId", payload.CodewhispererFirstRequestId);

                datum.AddMetadata("credentialStartUrl", payload.CredentialStartUrl);

                if (payload.CodewhispererIsPartialAcceptance.HasValue)
                {
                    datum.AddMetadata("codewhispererIsPartialAcceptance", payload.CodewhispererIsPartialAcceptance.Value);
                }

                if (payload.CodewhispererPartialAcceptanceCount.HasValue)
                {
                    datum.AddMetadata("codewhispererPartialAcceptanceCount", payload.CodewhispererPartialAcceptanceCount.Value);
                }

                if (payload.CodewhispererCharactersAccepted.HasValue)
                {
                    datum.AddMetadata("codewhispererCharactersAccepted", payload.CodewhispererCharactersAccepted.Value);
                }

                if (payload.CodewhispererCharactersRecommended.HasValue)
                {
                    datum.AddMetadata("codewhispererCharactersRecommended", payload.CodewhispererCharactersRecommended.Value);
                }

                datum.AddMetadata("codewhispererCompletionType", payload.CodewhispererCompletionType);

                datum.AddMetadata("codewhispererLanguage", payload.CodewhispererLanguage);

                datum.AddMetadata("codewhispererTriggerType", payload.CodewhispererTriggerType);

                if (payload.CodewhispererAutomatedTriggerType.HasValue)
                {
                    datum.AddMetadata("codewhispererAutomatedTriggerType", payload.CodewhispererAutomatedTriggerType.Value);
                }

                datum.AddMetadata("codewhispererLineNumber", payload.CodewhispererLineNumber);

                datum.AddMetadata("codewhispererCursorOffset", payload.CodewhispererCursorOffset);

                datum.AddMetadata("codewhispererSuggestionCount", payload.CodewhispererSuggestionCount);

                datum.AddMetadata("codewhispererSuggestionImportCount", payload.CodewhispererSuggestionImportCount);

                if (payload.CodewhispererTotalShownTime.HasValue)
                {
                    datum.AddMetadata("codewhispererTotalShownTime", payload.CodewhispererTotalShownTime.Value);
                }

                datum.AddMetadata("codewhispererTriggerCharacter", payload.CodewhispererTriggerCharacter);

                datum.AddMetadata("codewhispererTypeaheadLength", payload.CodewhispererTypeaheadLength);

                if (payload.CodewhispererTimeSinceLastDocumentChange.HasValue)
                {
                    datum.AddMetadata("codewhispererTimeSinceLastDocumentChange", payload.CodewhispererTimeSinceLastDocumentChange.Value);
                }

                if (payload.CodewhispererTimeSinceLastUserDecision.HasValue)
                {
                    datum.AddMetadata("codewhispererTimeSinceLastUserDecision", payload.CodewhispererTimeSinceLastUserDecision.Value);
                }

                if (payload.CodewhispererTimeToFirstRecommendation.HasValue)
                {
                    datum.AddMetadata("codewhispererTimeToFirstRecommendation", payload.CodewhispererTimeToFirstRecommendation.Value);
                }

                if (payload.CodewhispererPreviousSuggestionState.HasValue)
                {
                    datum.AddMetadata("codewhispererPreviousSuggestionState", payload.CodewhispererPreviousSuggestionState.Value);
                }

                datum.AddMetadata("codewhispererSuggestionState", payload.CodewhispererSuggestionState);

                if (payload.CodewhispererClassifierResult.HasValue)
                {
                    datum.AddMetadata("codewhispererClassifierResult", payload.CodewhispererClassifierResult.Value);
                }

                if (payload.CodewhispererSupplementalContextTimeout.HasValue)
                {
                    datum.AddMetadata("codewhispererSupplementalContextTimeout", payload.CodewhispererSupplementalContextTimeout.Value);
                }

                if (payload.CodewhispererSupplementalContextIsUtg.HasValue)
                {
                    datum.AddMetadata("codewhispererSupplementalContextIsUtg", payload.CodewhispererSupplementalContextIsUtg.Value);
                }

                if (payload.CodewhispererSupplementalContextLength.HasValue)
                {
                    datum.AddMetadata("codewhispererSupplementalContextLength", payload.CodewhispererSupplementalContextLength.Value);
                }

                if (payload.CodewhispererClassifierThreshold.HasValue)
                {
                    datum.AddMetadata("codewhispererClassifierThreshold", payload.CodewhispererClassifierThreshold.Value);
                }

                datum.AddMetadata("codewhispererUserGroup", payload.CodewhispererUserGroup);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Percentage of user modifications for the selected suggestion until a fixed period of time
        public static void RecordCodewhispererUserModification(this ITelemetryLogger telemetryLogger, CodewhispererUserModification payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codewhisperer_userModification";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("codewhispererCompletionType", payload.CodewhispererCompletionType);

                datum.AddMetadata("codewhispererLanguage", payload.CodewhispererLanguage);

                datum.AddMetadata("codewhispererModificationPercentage", payload.CodewhispererModificationPercentage);

                datum.AddMetadata("codewhispererRequestId", payload.CodewhispererRequestId);

                if (payload.CodewhispererRuntime.HasValue)
                {
                    datum.AddMetadata("codewhispererRuntime", payload.CodewhispererRuntime.Value);
                }

                datum.AddMetadata("codewhispererRuntimeSource", payload.CodewhispererRuntimeSource);

                datum.AddMetadata("codewhispererSessionId", payload.CodewhispererSessionId);

                datum.AddMetadata("codewhispererSuggestionIndex", payload.CodewhispererSuggestionIndex);

                datum.AddMetadata("codewhispererTriggerType", payload.CodewhispererTriggerType);

                datum.AddMetadata("credentialStartUrl", payload.CredentialStartUrl);

                datum.AddMetadata("codewhispererUserGroup", payload.CodewhispererUserGroup);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// The duration from user last modification to the first recommendation shown in milliseconds
        public static void RecordCodewhispererPerceivedLatency(this ITelemetryLogger telemetryLogger, CodewhispererPerceivedLatency payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codewhisperer_perceivedLatency";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("codewhispererRequestId", payload.CodewhispererRequestId);

                datum.AddMetadata("codewhispererSessionId", payload.CodewhispererSessionId);

                datum.AddMetadata("codewhispererTriggerType", payload.CodewhispererTriggerType);

                datum.AddMetadata("codewhispererCompletionType", payload.CodewhispererCompletionType);

                datum.AddMetadata("codewhispererLanguage", payload.CodewhispererLanguage);

                datum.AddMetadata("credentialStartUrl", payload.CredentialStartUrl);

                datum.AddMetadata("codewhispererUserGroup", payload.CodewhispererUserGroup);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// The latency from each CodeWhisperer components in milliseconds
        public static void RecordCodewhispererClientComponentLatency(this ITelemetryLogger telemetryLogger, CodewhispererClientComponentLatency payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codewhisperer_clientComponentLatency";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("codewhispererRequestId", payload.CodewhispererRequestId);

                datum.AddMetadata("codewhispererSessionId", payload.CodewhispererSessionId);

                datum.AddMetadata("codewhispererPreprocessingLatency", payload.CodewhispererPreprocessingLatency);

                datum.AddMetadata("codewhispererCredentialFetchingLatency", payload.CodewhispererCredentialFetchingLatency);

                datum.AddMetadata("codewhispererPostprocessingLatency", payload.CodewhispererPostprocessingLatency);

                datum.AddMetadata("codewhispererFirstCompletionLatency", payload.CodewhispererFirstCompletionLatency);

                datum.AddMetadata("codewhispererEndToEndLatency", payload.CodewhispererEndToEndLatency);

                datum.AddMetadata("codewhispererAllCompletionsLatency", payload.CodewhispererAllCompletionsLatency);

                datum.AddMetadata("codewhispererCompletionType", payload.CodewhispererCompletionType);

                datum.AddMetadata("codewhispererTriggerType", payload.CodewhispererTriggerType);

                datum.AddMetadata("codewhispererLanguage", payload.CodewhispererLanguage);

                datum.AddMetadata("credentialStartUrl", payload.CredentialStartUrl);

                datum.AddMetadata("codewhispererUserGroup", payload.CodewhispererUserGroup);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Create an Amazon CodeCatalyst Dev Environment
        public static void RecordCodecatalystCreateDevEnvironment(this ITelemetryLogger telemetryLogger, CodecatalystCreateDevEnvironment payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codecatalyst_createDevEnvironment";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("userId", payload.UserId);

                datum.AddMetadata("result", payload.Result);

                if (payload.CodecatalystCreateDevEnvironmentRepoType.HasValue)
                {
                    datum.AddMetadata("codecatalyst_createDevEnvironmentRepoType", payload.CodecatalystCreateDevEnvironmentRepoType.Value);
                }

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Update properties of a Amazon CodeCatalyst Dev Environment
        public static void RecordCodecatalystUpdateDevEnvironmentSettings(this ITelemetryLogger telemetryLogger, CodecatalystUpdateDevEnvironmentSettings payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codecatalyst_updateDevEnvironmentSettings";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("userId", payload.UserId);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("codecatalyst_updateDevEnvironmentLocationType", payload.CodecatalystUpdateDevEnvironmentLocationType);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Trigger a devfile update on a Amazon CodeCatalyst dev environment
        public static void RecordCodecatalystUpdateDevfile(this ITelemetryLogger telemetryLogger, CodecatalystUpdateDevfile payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codecatalyst_updateDevfile";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("userId", payload.UserId);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Clone a Amazon CodeCatalyst code repository locally
        public static void RecordCodecatalystLocalClone(this ITelemetryLogger telemetryLogger, CodecatalystLocalClone payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codecatalyst_localClone";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("userId", payload.UserId);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Connect to a Amazon CodeCatalyst dev environment
        public static void RecordCodecatalystConnect(this ITelemetryLogger telemetryLogger, CodecatalystConnect payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codecatalyst_connect";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("userId", payload.UserId);

                datum.AddMetadata("result", payload.Result);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
        
        /// Records Telemetry Event:
        /// Workflow statistic for connecting to a dev environment
        public static void RecordCodecatalystDevEnvironmentWorkflowStatistic(this ITelemetryLogger telemetryLogger, CodecatalystDevEnvironmentWorkflowStatistic payload, Func<MetricDatum, MetricDatum> transformDatum = null)
        {
            try
            {
                var metrics = new Metrics();
                if (payload.CreatedOn.HasValue)
                {
                    metrics.CreatedOn = payload.CreatedOn.Value;
                }
                else
                {
                    metrics.CreatedOn = System.DateTime.Now;
                }
                metrics.Data = new List<MetricDatum>();

                var datum = new MetricDatum();
                datum.MetricName = "codecatalyst_devEnvironmentWorkflowStatistic";
                datum.Unit = Unit.None;
                datum.Passive = payload.Passive;
                if (payload.Value.HasValue)
                {
                    datum.Value = payload.Value.Value;
                }
                else
                {
                    datum.Value = 1;
                }
                datum.AddMetadata("awsAccount", payload.AwsAccount);
                datum.AddMetadata("awsRegion", payload.AwsRegion);
                datum.AddMetadata("reason", payload.Reason);
                datum.AddMetadata("errorCode", payload.ErrorCode);
                datum.AddMetadata("causedBy", payload.CausedBy);
                datum.AddMetadata("httpStatusCode", payload.HttpStatusCode);
                datum.AddMetadata("requestId", payload.RequestId);
                datum.AddMetadata("requestServiceType", payload.RequestServiceType);
                if (payload.Duration.HasValue)
                {
                    datum.AddMetadata("duration", payload.Duration.Value);
                }
                datum.AddMetadata("locale", payload.Locale);

                datum.AddMetadata("userId", payload.UserId);

                datum.AddMetadata("result", payload.Result);

                datum.AddMetadata("codecatalyst_devEnvironmentWorkflowStep", payload.CodecatalystDevEnvironmentWorkflowStep);

                datum.AddMetadata("codecatalyst_devEnvironmentWorkflowError", payload.CodecatalystDevEnvironmentWorkflowError);

                datum = datum.InvokeTransform(transformDatum);

                metrics.Data.Add(datum);
                telemetryLogger.Record(metrics);
            }
            catch (System.Exception e)
            {
                telemetryLogger.Logger.Error("Error recording telemetry event", e);
                System.Diagnostics.Debug.Assert(false, "Error Recording Telemetry");
            }
        }
    }
    
    /// Metric field type
    /// The source artifact of an App Runner service
    public struct AppRunnerServiceSource
    {
        
        private string _value;
        
        /// ecr
        public static readonly AppRunnerServiceSource Ecr = new AppRunnerServiceSource("ecr");
        
        /// ecrPublic
        public static readonly AppRunnerServiceSource EcrPublic = new AppRunnerServiceSource("ecrPublic");
        
        /// repository
        public static readonly AppRunnerServiceSource Repository = new AppRunnerServiceSource("repository");
        
        public AppRunnerServiceSource(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The current state of the App Runner service
    public struct AppRunnerServiceStatus
    {
        
        private string _value;
        
        /// CREATE_FAILED
        public static readonly AppRunnerServiceStatus CREATEFAILED = new AppRunnerServiceStatus("CREATE_FAILED");
        
        /// RUNNING
        public static readonly AppRunnerServiceStatus RUNNING = new AppRunnerServiceStatus("RUNNING");
        
        /// DELETED
        public static readonly AppRunnerServiceStatus DELETED = new AppRunnerServiceStatus("DELETED");
        
        /// DELETE_FAILED
        public static readonly AppRunnerServiceStatus DELETEFAILED = new AppRunnerServiceStatus("DELETE_FAILED");
        
        /// PAUSED
        public static readonly AppRunnerServiceStatus PAUSED = new AppRunnerServiceStatus("PAUSED");
        
        /// OPERATION_IN_PROGRESS
        public static readonly AppRunnerServiceStatus OPERATIONINPROGRESS = new AppRunnerServiceStatus("OPERATION_IN_PROGRESS");
        
        public AppRunnerServiceStatus(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// AWS filetype kind
    public struct AwsFiletype
    {
        
        private string _value;
        
        /// awsCredentials
        public static readonly AwsFiletype AwsCredentials = new AwsFiletype("awsCredentials");
        
        /// cloudformation
        public static readonly AwsFiletype Cloudformation = new AwsFiletype("cloudformation");
        
        /// cloudformationSam
        public static readonly AwsFiletype CloudformationSam = new AwsFiletype("cloudformationSam");
        
        /// codebuildBuildspec
        public static readonly AwsFiletype CodebuildBuildspec = new AwsFiletype("codebuildBuildspec");
        
        /// ecsTask
        public static readonly AwsFiletype EcsTask = new AwsFiletype("ecsTask");
        
        /// eventbridgeSchema
        public static readonly AwsFiletype EventbridgeSchema = new AwsFiletype("eventbridgeSchema");
        
        /// iamPolicy
        public static readonly AwsFiletype IamPolicy = new AwsFiletype("iamPolicy");
        
        /// samconfig
        public static readonly AwsFiletype Samconfig = new AwsFiletype("samconfig");
        
        /// serverless
        public static readonly AwsFiletype Serverless = new AwsFiletype("serverless");
        
        /// stepfunctionsAsl
        public static readonly AwsFiletype StepfunctionsAsl = new AwsFiletype("stepfunctionsAsl");
        
        /// smithyModel
        public static readonly AwsFiletype SmithyModel = new AwsFiletype("smithyModel");
        
        /// ssmDocument
        public static readonly AwsFiletype SsmDocument = new AwsFiletype("ssmDocument");
        
        /// other
        public static readonly AwsFiletype Other = new AwsFiletype("other");
        
        public AwsFiletype(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Presentation mode used in a CloudWatch Logs operation
    public struct CloudWatchLogsPresentation
    {
        
        private string _value;
        
        /// ui
        public static readonly CloudWatchLogsPresentation Ui = new CloudWatchLogsPresentation("ui");
        
        /// text
        public static readonly CloudWatchLogsPresentation Text = new CloudWatchLogsPresentation("text");
        
        public CloudWatchLogsPresentation(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// CloudWatch Logs entity
    public struct CloudWatchResourceType
    {
        
        private string _value;
        
        /// logGroup
        public static readonly CloudWatchResourceType LogGroup = new CloudWatchResourceType("logGroup");
        
        /// logGroupList
        public static readonly CloudWatchResourceType LogGroupList = new CloudWatchResourceType("logGroupList");
        
        /// logStream
        public static readonly CloudWatchResourceType LogStream = new CloudWatchResourceType("logStream");
        
        public CloudWatchResourceType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The result of the operation
    public struct Result
    {
        
        private string _value;
        
        /// Succeeded
        public static readonly Result Succeeded = new Result("Succeeded");
        
        /// Failed
        public static readonly Result Failed = new Result("Failed");
        
        /// Cancelled
        public static readonly Result Cancelled = new Result("Cancelled");
        
        public Result(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The IDE or OS component used for the action. (Examples: S3 download to filesystem, S3 upload from editor, ...)
    public struct Component
    {
        
        private string _value;
        
        /// editor
        public static readonly Component Editor = new Component("editor");
        
        /// viewer
        public static readonly Component Viewer = new Component("viewer");
        
        /// filesystem
        public static readonly Component Filesystem = new Component("filesystem");
        
        /// explorer
        public static readonly Component Explorer = new Component("explorer");
        
        /// infobar
        public static readonly Component Infobar = new Component("infobar");
        
        public Component(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The type of IAM resource referenced by a metric or operation
    public struct IamResourceType
    {
        
        private string _value;
        
        /// group
        public static readonly IamResourceType Group = new IamResourceType("group");
        
        /// role
        public static readonly IamResourceType Role = new IamResourceType("role");
        
        /// user
        public static readonly IamResourceType User = new IamResourceType("user");
        
        public IamResourceType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The Lambda Package type of the function
    public struct LambdaPackageType
    {
        
        private string _value;
        
        /// Zip
        public static readonly LambdaPackageType Zip = new LambdaPackageType("Zip");
        
        /// Image
        public static readonly LambdaPackageType Image = new LambdaPackageType("Image");
        
        public LambdaPackageType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Lambda architecture identifier
    public struct LambdaArchitecture
    {
        
        private string _value;
        
        /// x86_64
        public static readonly LambdaArchitecture X8664 = new LambdaArchitecture("x86_64");
        
        /// arm64
        public static readonly LambdaArchitecture Arm64 = new LambdaArchitecture("arm64");
        
        public LambdaArchitecture(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The type of modification performed on the credentials
    public struct CredentialModification
    {
        
        private string _value;
        
        /// Add
        public static readonly CredentialModification Add = new CredentialModification("Add");
        
        /// Edit
        public static readonly CredentialModification Edit = new CredentialModification("Edit");
        
        /// Delete
        public static readonly CredentialModification Delete = new CredentialModification("Delete");
        
        public CredentialModification(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// High level categorization indicating the cause of the error
    public struct CausedBy
    {
        
        private string _value;
        
        /// user
        public static readonly CausedBy User = new CausedBy("user");
        
        /// service
        public static readonly CausedBy Service = new CausedBy("service");
        
        /// client
        public static readonly CausedBy Client = new CausedBy("client");
        
        /// unknown
        public static readonly CausedBy Unknown = new CausedBy("unknown");
        
        public CausedBy(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The lambda runtime
    public struct Runtime
    {
        
        private string _value;
        
        /// dotnetcore3.1
        public static readonly Runtime Dotnetcore31 = new Runtime("dotnetcore3.1");
        
        /// dotnetcore2.1
        public static readonly Runtime Dotnetcore21 = new Runtime("dotnetcore2.1");
        
        /// dotnet5.0
        public static readonly Runtime Dotnet50 = new Runtime("dotnet5.0");
        
        /// dotnet6
        public static readonly Runtime Dotnet6 = new Runtime("dotnet6");
        
        /// dotnet7
        public static readonly Runtime Dotnet7 = new Runtime("dotnet7");
        
        /// nodejs18.x
        public static readonly Runtime Nodejs18x = new Runtime("nodejs18.x");
        
        /// nodejs16.x
        public static readonly Runtime Nodejs16x = new Runtime("nodejs16.x");
        
        /// nodejs14.x
        public static readonly Runtime Nodejs14x = new Runtime("nodejs14.x");
        
        /// nodejs12.x
        public static readonly Runtime Nodejs12x = new Runtime("nodejs12.x");
        
        /// nodejs10.x
        public static readonly Runtime Nodejs10x = new Runtime("nodejs10.x");
        
        /// nodejs8.10
        public static readonly Runtime Nodejs810 = new Runtime("nodejs8.10");
        
        /// ruby2.5
        public static readonly Runtime Ruby25 = new Runtime("ruby2.5");
        
        /// java8
        public static readonly Runtime Java8 = new Runtime("java8");
        
        /// java8.al2
        public static readonly Runtime Java8al2 = new Runtime("java8.al2");
        
        /// java11
        public static readonly Runtime Java11 = new Runtime("java11");
        
        /// go1.x
        public static readonly Runtime Go1x = new Runtime("go1.x");
        
        /// python3.9
        public static readonly Runtime Python39 = new Runtime("python3.9");
        
        /// python3.8
        public static readonly Runtime Python38 = new Runtime("python3.8");
        
        /// python3.7
        public static readonly Runtime Python37 = new Runtime("python3.7");
        
        /// python3.6
        public static readonly Runtime Python36 = new Runtime("python3.6");
        
        /// python2.7
        public static readonly Runtime Python27 = new Runtime("python2.7");
        
        public Runtime(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Languages targeted by the schemas service
    public struct SchemaLanguage
    {
        
        private string _value;
        
        /// Java8
        public static readonly SchemaLanguage Java8 = new SchemaLanguage("Java8");
        
        /// Python36
        public static readonly SchemaLanguage Python36 = new SchemaLanguage("Python36");
        
        /// TypeScript3
        public static readonly SchemaLanguage TypeScript3 = new SchemaLanguage("TypeScript3");
        
        public SchemaLanguage(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Where credentials are stored or retrieved from
    public struct CredentialSourceId
    {
        
        private string _value;
        
        /// sharedCredentials
        public static readonly CredentialSourceId SharedCredentials = new CredentialSourceId("sharedCredentials");
        
        /// sdkStore
        public static readonly CredentialSourceId SdkStore = new CredentialSourceId("sdkStore");
        
        /// ec2
        public static readonly CredentialSourceId Ec2 = new CredentialSourceId("ec2");
        
        /// ecs
        public static readonly CredentialSourceId Ecs = new CredentialSourceId("ecs");
        
        /// envVars
        public static readonly CredentialSourceId EnvVars = new CredentialSourceId("envVars");
        
        /// awsId
        public static readonly CredentialSourceId AwsId = new CredentialSourceId("awsId");
        
        /// iamIdentityCenter
        public static readonly CredentialSourceId IamIdentityCenter = new CredentialSourceId("iamIdentityCenter");
        
        /// memory
        public static readonly CredentialSourceId Memory = new CredentialSourceId("memory");
        
        /// other
        public static readonly CredentialSourceId Other = new CredentialSourceId("other");
        
        public CredentialSourceId(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The type of credential that was selected
    public struct CredentialType
    {
        
        private string _value;
        
        /// staticProfile
        public static readonly CredentialType StaticProfile = new CredentialType("staticProfile");
        
        /// staticSessionProfile
        public static readonly CredentialType StaticSessionProfile = new CredentialType("staticSessionProfile");
        
        /// credentialProcessProfile
        public static readonly CredentialType CredentialProcessProfile = new CredentialType("credentialProcessProfile");
        
        /// assumeRoleProfile
        public static readonly CredentialType AssumeRoleProfile = new CredentialType("assumeRoleProfile");
        
        /// assumeMfaRoleProfile
        public static readonly CredentialType AssumeMfaRoleProfile = new CredentialType("assumeMfaRoleProfile");
        
        /// assumeSamlRoleProfile
        public static readonly CredentialType AssumeSamlRoleProfile = new CredentialType("assumeSamlRoleProfile");
        
        /// ssoProfile
        public static readonly CredentialType SsoProfile = new CredentialType("ssoProfile");
        
        /// ecsMetatdata
        public static readonly CredentialType EcsMetatdata = new CredentialType("ecsMetatdata");
        
        /// ec2Metadata
        public static readonly CredentialType Ec2Metadata = new CredentialType("ec2Metadata");
        
        /// bearerToken
        public static readonly CredentialType BearerToken = new CredentialType("bearerToken");
        
        /// other
        public static readonly CredentialType Other = new CredentialType("other");
        
        public CredentialType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// How the database credentials are being retrieved
    public struct DatabaseCredentials
    {
        
        private string _value;
        
        /// IAM
        public static readonly DatabaseCredentials IAM = new DatabaseCredentials("IAM");
        
        /// SecretsManager
        public static readonly DatabaseCredentials SecretsManager = new DatabaseCredentials("SecretsManager");
        
        public DatabaseCredentials(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The type of an SQS Queue
    public struct SqsQueueType
    {
        
        private string _value;
        
        /// standard
        public static readonly SqsQueueType Standard = new SqsQueueType("standard");
        
        /// fifo
        public static readonly SqsQueueType Fifo = new SqsQueueType("fifo");
        
        public SqsQueueType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Dialog open trigger source location
    public struct InsightsDialogOpenSource
    {
        
        private string _value;
        
        /// explorer
        public static readonly InsightsDialogOpenSource Explorer = new InsightsDialogOpenSource("explorer");
        
        /// resultsWindow
        public static readonly InsightsDialogOpenSource ResultsWindow = new InsightsDialogOpenSource("resultsWindow");
        
        /// logGroup
        public static readonly InsightsDialogOpenSource LogGroup = new InsightsDialogOpenSource("logGroup");
        
        public InsightsDialogOpenSource(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// User-selected time range type while starting an insights query
    public struct InsightsQueryTimeType
    {
        
        private string _value;
        
        /// relative
        public static readonly InsightsQueryTimeType Relative = new InsightsQueryTimeType("relative");
        
        /// absolute
        public static readonly InsightsQueryTimeType Absolute = new InsightsQueryTimeType("absolute");
        
        public InsightsQueryTimeType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// User-specified search string type while starting an insights query
    public struct InsightsQueryStringType
    {
        
        private string _value;
        
        /// insights
        public static readonly InsightsQueryStringType Insights = new InsightsQueryStringType("insights");
        
        /// searchTerm
        public static readonly InsightsQueryStringType SearchTerm = new InsightsQueryStringType("searchTerm");
        
        public InsightsQueryStringType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Ways to connect to an EC2 Instance
    public struct Ec2ConnectionType
    {
        
        private string _value;
        
        /// remoteDesktop
        public static readonly Ec2ConnectionType RemoteDesktop = new Ec2ConnectionType("remoteDesktop");
        
        /// ssh
        public static readonly Ec2ConnectionType Ssh = new Ec2ConnectionType("ssh");
        
        /// scp
        public static readonly Ec2ConnectionType Scp = new Ec2ConnectionType("scp");
        
        public Ec2ConnectionType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Actions that can affect an EC2 Instance state
    public struct Ec2InstanceState
    {
        
        private string _value;
        
        /// start
        public static readonly Ec2InstanceState Start = new Ec2InstanceState("start");
        
        /// stop
        public static readonly Ec2InstanceState Stop = new Ec2InstanceState("stop");
        
        /// reboot
        public static readonly Ec2InstanceState Reboot = new Ec2InstanceState("reboot");
        
        /// terminate
        public static readonly Ec2InstanceState Terminate = new Ec2InstanceState("terminate");
        
        public Ec2InstanceState(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Infrastructure type used by ECS tasks and services
    public struct EcsLaunchType
    {
        
        private string _value;
        
        /// ec2
        public static readonly EcsLaunchType Ec2 = new EcsLaunchType("ec2");
        
        /// fargate
        public static readonly EcsLaunchType Fargate = new EcsLaunchType("fargate");
        
        public EcsLaunchType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Type of execution selected while running the execute command
    public struct EcsExecuteCommandType
    {
        
        private string _value;
        
        /// command
        public static readonly EcsExecuteCommandType Command = new EcsExecuteCommandType("command");
        
        /// shell
        public static readonly EcsExecuteCommandType Shell = new EcsExecuteCommandType("shell");
        
        public EcsExecuteCommandType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The source content specified in the ECR deployment request
    public struct EcrDeploySource
    {
        
        private string _value;
        
        /// dockerfile
        public static readonly EcrDeploySource Dockerfile = new EcrDeploySource("dockerfile");
        
        /// tag
        public static readonly EcrDeploySource Tag = new EcrDeploySource("tag");
        
        public EcrDeploySource(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The type of fetch being performed
    public struct DynamoDbFetchType
    {
        
        private string _value;
        
        /// scan
        public static readonly DynamoDbFetchType Scan = new DynamoDbFetchType("scan");
        
        /// query
        public static readonly DynamoDbFetchType Query = new DynamoDbFetchType("query");
        
        public DynamoDbFetchType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The type of index being hit for the query/scan operation
    public struct DynamoDbIndexType
    {
        
        private string _value;
        
        /// primary
        public static readonly DynamoDbIndexType Primary = new DynamoDbIndexType("primary");
        
        /// localSecondary
        public static readonly DynamoDbIndexType LocalSecondary = new DynamoDbIndexType("localSecondary");
        
        /// globalSecondary
        public static readonly DynamoDbIndexType GlobalSecondary = new DynamoDbIndexType("globalSecondary");
        
        public DynamoDbIndexType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The type of DynamoDB entity referenced by a metric or operation
    public struct DynamoDbTarget
    {
        
        private string _value;
        
        /// table
        public static readonly DynamoDbTarget Table = new DynamoDbTarget("table");
        
        /// tableProperties
        public static readonly DynamoDbTarget TableProperties = new DynamoDbTarget("tableProperties");
        
        /// tableStream
        public static readonly DynamoDbTarget TableStream = new DynamoDbTarget("tableStream");
        
        public DynamoDbTarget(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The dynamic resource operation being executed
    public struct DynamicResourceOperation
    {
        
        private string _value;
        
        /// Create
        public static readonly DynamicResourceOperation Create = new DynamicResourceOperation("Create");
        
        /// Update
        public static readonly DynamicResourceOperation Update = new DynamicResourceOperation("Update");
        
        /// Delete
        public static readonly DynamicResourceOperation Delete = new DynamicResourceOperation("Delete");
        
        public DynamicResourceOperation(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The experiment action taken action taken
    public struct ExperimentState
    {
        
        private string _value;
        
        /// activated
        public static readonly ExperimentState Activated = new ExperimentState("activated");
        
        /// deactivated
        public static readonly ExperimentState Deactivated = new ExperimentState("deactivated");
        
        public ExperimentState(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The tool being installed
    public struct ToolId
    {
        
        private string _value;
        
        /// session-manager-plugin
        public static readonly ToolId Sessionmanagerplugin = new ToolId("session-manager-plugin");
        
        /// dotnet-lambda-deploy
        public static readonly ToolId Dotnetlambdadeploy = new ToolId("dotnet-lambda-deploy");
        
        /// dotnet-deploy-cli
        public static readonly ToolId Dotnetdeploycli = new ToolId("dotnet-deploy-cli");
        
        /// aws-cli
        public static readonly ToolId Awscli = new ToolId("aws-cli");
        
        /// sam-cli
        public static readonly ToolId Samcli = new ToolId("sam-cli");
        
        public ToolId(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The type of the Automated trigger to send request to CodeWhisperer service
    public struct CodewhispererAutomatedTriggerType
    {
        
        private string _value;
        
        /// KeyStrokeCount
        public static readonly CodewhispererAutomatedTriggerType KeyStrokeCount = new CodewhispererAutomatedTriggerType("KeyStrokeCount");
        
        /// SpecialCharacters
        public static readonly CodewhispererAutomatedTriggerType SpecialCharacters = new CodewhispererAutomatedTriggerType("SpecialCharacters");
        
        /// Enter
        public static readonly CodewhispererAutomatedTriggerType Enter = new CodewhispererAutomatedTriggerType("Enter");
        
        /// IntelliSenseAcceptance
        public static readonly CodewhispererAutomatedTriggerType IntelliSenseAcceptance = new CodewhispererAutomatedTriggerType("IntelliSenseAcceptance");
        
        /// IdleTime
        public static readonly CodewhispererAutomatedTriggerType IdleTime = new CodewhispererAutomatedTriggerType("IdleTime");
        
        /// Classifier
        public static readonly CodewhispererAutomatedTriggerType Classifier = new CodewhispererAutomatedTriggerType("Classifier");
        
        public CodewhispererAutomatedTriggerType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Completion Type of the inference results returned from CodeWhisperer model layer
    public struct CodewhispererCompletionType
    {
        
        private string _value;
        
        /// Line
        public static readonly CodewhispererCompletionType Line = new CodewhispererCompletionType("Line");
        
        /// Block
        public static readonly CodewhispererCompletionType Block = new CodewhispererCompletionType("Block");
        
        public CodewhispererCompletionType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Programming language of the CodeWhisperer recommendation
    public struct CodewhispererLanguage
    {
        
        private string _value;
        
        /// java
        public static readonly CodewhispererLanguage Java = new CodewhispererLanguage("java");
        
        /// python
        public static readonly CodewhispererLanguage Python = new CodewhispererLanguage("python");
        
        /// javascript
        public static readonly CodewhispererLanguage Javascript = new CodewhispererLanguage("javascript");
        
        /// plaintext
        public static readonly CodewhispererLanguage Plaintext = new CodewhispererLanguage("plaintext");
        
        /// jsx
        public static readonly CodewhispererLanguage Jsx = new CodewhispererLanguage("jsx");
        
        /// typescript
        public static readonly CodewhispererLanguage Typescript = new CodewhispererLanguage("typescript");
        
        /// tsx
        public static readonly CodewhispererLanguage Tsx = new CodewhispererLanguage("tsx");
        
        /// csharp
        public static readonly CodewhispererLanguage Csharp = new CodewhispererLanguage("csharp");
        
        /// c
        public static readonly CodewhispererLanguage C = new CodewhispererLanguage("c");
        
        /// cpp
        public static readonly CodewhispererLanguage Cpp = new CodewhispererLanguage("cpp");
        
        /// go
        public static readonly CodewhispererLanguage Go = new CodewhispererLanguage("go");
        
        /// kotlin
        public static readonly CodewhispererLanguage Kotlin = new CodewhispererLanguage("kotlin");
        
        /// php
        public static readonly CodewhispererLanguage Php = new CodewhispererLanguage("php");
        
        /// ruby
        public static readonly CodewhispererLanguage Ruby = new CodewhispererLanguage("ruby");
        
        /// rust
        public static readonly CodewhispererLanguage Rust = new CodewhispererLanguage("rust");
        
        /// scala
        public static readonly CodewhispererLanguage Scala = new CodewhispererLanguage("scala");
        
        /// shell
        public static readonly CodewhispererLanguage Shell = new CodewhispererLanguage("shell");
        
        /// sql
        public static readonly CodewhispererLanguage Sql = new CodewhispererLanguage("sql");
        
        public CodewhispererLanguage(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// the pre-defined set of values for runtime version of the language of CodeWhisperer recommendation
    public struct CodewhispererRuntime
    {
        
        private string _value;
        
        /// java8
        public static readonly CodewhispererRuntime Java8 = new CodewhispererRuntime("java8");
        
        /// java11
        public static readonly CodewhispererRuntime Java11 = new CodewhispererRuntime("java11");
        
        /// java16
        public static readonly CodewhispererRuntime Java16 = new CodewhispererRuntime("java16");
        
        /// python2
        public static readonly CodewhispererRuntime Python2 = new CodewhispererRuntime("python2");
        
        /// python3
        public static readonly CodewhispererRuntime Python3 = new CodewhispererRuntime("python3");
        
        /// javascript
        public static readonly CodewhispererRuntime Javascript = new CodewhispererRuntime("javascript");
        
        /// unknown
        public static readonly CodewhispererRuntime Unknown = new CodewhispererRuntime("unknown");
        
        public CodewhispererRuntime(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// User decision of each of the suggestion returned from CodeWhisperer
    public struct CodewhispererSuggestionState
    {
        
        private string _value;
        
        /// Accept
        public static readonly CodewhispererSuggestionState Accept = new CodewhispererSuggestionState("Accept");
        
        /// Reject
        public static readonly CodewhispererSuggestionState Reject = new CodewhispererSuggestionState("Reject");
        
        /// Discard
        public static readonly CodewhispererSuggestionState Discard = new CodewhispererSuggestionState("Discard");
        
        /// Ignore
        public static readonly CodewhispererSuggestionState Ignore = new CodewhispererSuggestionState("Ignore");
        
        /// Filter
        public static readonly CodewhispererSuggestionState Filter = new CodewhispererSuggestionState("Filter");
        
        /// Unseen
        public static readonly CodewhispererSuggestionState Unseen = new CodewhispererSuggestionState("Unseen");
        
        /// Empty
        public static readonly CodewhispererSuggestionState Empty = new CodewhispererSuggestionState("Empty");
        
        public CodewhispererSuggestionState(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The type of the user trigger to send request to CodeWhisperer service
    public struct CodewhispererTriggerType
    {
        
        private string _value;
        
        /// OnDemand
        public static readonly CodewhispererTriggerType OnDemand = new CodewhispererTriggerType("OnDemand");
        
        /// AutoTrigger
        public static readonly CodewhispererTriggerType AutoTrigger = new CodewhispererTriggerType("AutoTrigger");
        
        public CodewhispererTriggerType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The aggregated user decision from previous trigger. 
    public struct CodewhispererPreviousSuggestionState
    {
        
        private string _value;
        
        /// Accept
        public static readonly CodewhispererPreviousSuggestionState Accept = new CodewhispererPreviousSuggestionState("Accept");
        
        /// Reject
        public static readonly CodewhispererPreviousSuggestionState Reject = new CodewhispererPreviousSuggestionState("Reject");
        
        /// Discard
        public static readonly CodewhispererPreviousSuggestionState Discard = new CodewhispererPreviousSuggestionState("Discard");
        
        /// Empty
        public static readonly CodewhispererPreviousSuggestionState Empty = new CodewhispererPreviousSuggestionState("Empty");
        
        public CodewhispererPreviousSuggestionState(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Describes which parts of an application (that we know of) were synced to the cloud. "Code" resources follow the SAM spec: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-sync.html
    public struct SyncedResources
    {
        
        private string _value;
        
        /// AllResources
        public static readonly SyncedResources AllResources = new SyncedResources("AllResources");
        
        /// CodeOnly
        public static readonly SyncedResources CodeOnly = new SyncedResources("CodeOnly");
        
        public SyncedResources(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Type of Git repository provided to the Amazon CodeCatalyst dev environment create wizard
    public struct CodecatalystCreateDevEnvironmentRepoType
    {
        
        private string _value;
        
        /// linked
        public static readonly CodecatalystCreateDevEnvironmentRepoType Linked = new CodecatalystCreateDevEnvironmentRepoType("linked");
        
        /// unlinked
        public static readonly CodecatalystCreateDevEnvironmentRepoType Unlinked = new CodecatalystCreateDevEnvironmentRepoType("unlinked");
        
        /// none
        public static readonly CodecatalystCreateDevEnvironmentRepoType None = new CodecatalystCreateDevEnvironmentRepoType("none");
        
        public CodecatalystCreateDevEnvironmentRepoType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// Locality of the Amazon CodeCatalyst update dev environment request (i.e., from the thin client or the local IDE instance)
    public struct CodecatalystUpdateDevEnvironmentLocationType
    {
        
        private string _value;
        
        /// remote
        public static readonly CodecatalystUpdateDevEnvironmentLocationType Remote = new CodecatalystUpdateDevEnvironmentLocationType("remote");
        
        /// local
        public static readonly CodecatalystUpdateDevEnvironmentLocationType Local = new CodecatalystUpdateDevEnvironmentLocationType("local");
        
        public CodecatalystUpdateDevEnvironmentLocationType(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Metric field type
    /// The id of the feature the user is interacting in.
    public struct FeatureId
    {
        
        private string _value;
        
        /// awsExplorer
        public static readonly FeatureId AwsExplorer = new FeatureId("awsExplorer");
        
        /// codewhisperer
        public static readonly FeatureId Codewhisperer = new FeatureId("codewhisperer");
        
        /// codecatalyst
        public static readonly FeatureId Codecatalyst = new FeatureId("codecatalyst");
        
        public FeatureId(string value)
        {
            this._value = value;
        }
        
        public override string ToString()
        {
            return this._value;
        }
    }
    
    /// Copying an API Gateway remote URL
    public sealed class ApigatewayCopyUrl : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public ApigatewayCopyUrl()
        {
            this.Passive = false;
        }
    }
    
    /// Invoking one simulated API Gateway call using the SAM cli
    public sealed class ApigatewayInvokeLocal : BaseTelemetryEvent
    {
        
        /// Optional - The lambda runtime
        public Runtime? Runtime;
        
        /// Optional - Any valid HTTP method (GET/HEAD/etc)
        public string HttpMethod;
        
        /// The result of the operation
        public Result Result;
        
        /// If the action was run in debug mode or not
        public bool Debug;
        
        /// Optional - Lambda architecture identifier
        public LambdaArchitecture? LambdaArchitecture;
        
        public ApigatewayInvokeLocal()
        {
            this.Passive = false;
        }
    }
    
    /// Calling a remote API Gateway
    public sealed class ApigatewayInvokeRemote : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - Any valid HTTP method (GET/HEAD/etc)
        public string HttpMethod;
        
        public ApigatewayInvokeRemote()
        {
            this.Passive = false;
        }
    }
    
    /// Called when starting a local API Gateway server simulator with SAM. Only called when starting it for long running testing, not for single invokes
    public sealed class ApigatewayStartLocalServer : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public ApigatewayStartLocalServer()
        {
            this.Passive = false;
        }
    }
    
    /// Open the service URL in a browser
    public sealed class ApprunnerOpenServiceUrl : BaseTelemetryEvent
    {
        
        public ApprunnerOpenServiceUrl()
        {
            this.Passive = false;
        }
    }
    
    /// Copy the service URL
    public sealed class ApprunnerCopyServiceUrl : BaseTelemetryEvent
    {
        
        public ApprunnerCopyServiceUrl()
        {
            this.Passive = false;
        }
    }
    
    /// Create an App Runner service
    public sealed class ApprunnerCreateService : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The source artifact of an App Runner service
        public AppRunnerServiceSource AppRunnerServiceSource;
        
        public ApprunnerCreateService()
        {
            this.Passive = false;
        }
    }
    
    /// Pause a running App Runner service
    public sealed class ApprunnerPauseService : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public ApprunnerPauseService()
        {
            this.Passive = false;
        }
    }
    
    /// Resume a paused App Runner service
    public sealed class ApprunnerResumeService : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public ApprunnerResumeService()
        {
            this.Passive = false;
        }
    }
    
    /// Delete an App Runner service
    public sealed class ApprunnerDeleteService : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The current state of the App Runner service
        public AppRunnerServiceStatus? AppRunnerServiceStatus;
        
        public ApprunnerDeleteService()
        {
            this.Passive = false;
        }
    }
    
    /// Start a new deployment for an App Runner service
    public sealed class ApprunnerStartDeployment : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public ApprunnerStartDeployment()
        {
            this.Passive = false;
        }
    }
    
    /// View the App Runner application logs (the logs for your running service)
    public sealed class ApprunnerViewApplicationLogs : BaseTelemetryEvent
    {
        
        public ApprunnerViewApplicationLogs()
        {
            this.Passive = false;
        }
    }
    
    /// View the App Runner service logs (the logs produced by App Runner)
    public sealed class ApprunnerViewServiceLogs : BaseTelemetryEvent
    {
        
        public ApprunnerViewServiceLogs()
        {
            this.Passive = false;
        }
    }
    
    /// Captures the result of adding a new connection in the 'Add New Connection' workflow
    public sealed class AuthAddConnection : BaseTelemetryEvent
    {
        
        /// The source of the operation
        public string Source;
        
        /// The id of the feature the user is interacting in.
        public FeatureId FeatureId;
        
        /// Where credentials are stored or retrieved from
        public CredentialSourceId CredentialSourceId;
        
        /// Whether this was an individual point or an aggregation of points.
        public bool IsAggregated;
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - A generic number of attempts
        public System.Int32? Attempts;
        
        /// Optional - Comma delimited list of input fields that user has invalid inputs typed. e.g. 'profileName,accessKey,startUrl'
        public string InvalidInputFields;
        
        public AuthAddConnection()
        {
            this.Passive = false;
        }
    }
    
    /// The diff/change in Auth connections
    public sealed class AuthAddedConnections : BaseTelemetryEvent
    {
        
        /// The source of the operation
        public string Source;
        
        /// Current number of authentication connections the user has
        public int AuthConnectionsCount;
        
        /// Number of new authentication connections the user has
        public int NewAuthConnectionsCount;
        
        /// Comma delimited list of enabled auth connections
        public string EnabledAuthConnections;
        
        /// Comma delimited list of NEW enabled auth connections
        public string NewEnabledAuthConnections;
        
        /// A generic number of attempts
        public int Attempts;
        
        /// The result of the operation
        public Result Result;
        
        public AuthAddedConnections()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user clicks yes or no to switch role upon adding new connection
    public sealed class AuthSwitchRoles : BaseTelemetryEvent
    {
        
        /// Current number of authentication connections the user has
        public int AuthConnectionsCount;
        
        /// User selection from a predefined menu (not user-provided input)
        public string UserChoice;
        
        public AuthSwitchRoles()
        {
            this.Passive = false;
        }
    }
    
    /// Copy the ARN of an AWS resource
    public sealed class AwsCopyArn : BaseTelemetryEvent
    {
        
        /// The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        public AwsCopyArn()
        {
            this.Passive = false;
        }
    }
    
    /// Delete an AWS resource
    public sealed class AwsDeleteResource : BaseTelemetryEvent
    {
        
        /// The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        /// The result of the operation
        public Result Result;
        
        public AwsDeleteResource()
        {
            this.Passive = false;
        }
    }
    
    /// Select a credentials profile
    public sealed class AwsSetCredentials : BaseTelemetryEvent
    {
        
        /// Optional - The type of credential that was selected
        public CredentialType? CredentialType;
        
        /// Optional - Where credentials are stored or retrieved from
        public CredentialSourceId? CredentialSourceId;
        
        public AwsSetCredentials()
        {
            this.Passive = false;
        }
    }
    
    /// A region change occurred
    public sealed class AwsSetRegion : BaseTelemetryEvent
    {
        
        public AwsSetRegion()
        {
            this.Passive = false;
        }
    }
    
    /// A partition change occurred
    public sealed class AwsSetPartition : BaseTelemetryEvent
    {
        
        /// The ID of the partition that was selected
        public string PartitionId;
        
        public AwsSetPartition()
        {
            this.Passive = false;
        }
    }
    
    /// Open the credentials file
    public sealed class AwsOpenCredentials : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public AwsOpenCredentials()
        {
            this.Passive = false;
        }
    }
    
    /// Opens a url
    public sealed class AwsOpenUrl : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The url associated with a metric
        public string Url;
        
        /// Optional - The source of the operation
        public string Source;
        
        public AwsOpenUrl()
        {
            this.Passive = false;
        }
    }
    
    /// Save credentials
    public sealed class AwsSaveCredentials : BaseTelemetryEvent
    {
        
        public AwsSaveCredentials()
        {
            this.Passive = false;
        }
    }
    
    /// Modify credentials (e.g. Add, Edit, Delete)
    public sealed class AwsModifyCredentials : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of modification performed on the credentials
        public CredentialModification CredentialModification;
        
        /// The source of the operation
        public string Source;
        
        /// Optional - The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        public AwsModifyCredentials()
        {
            this.Passive = false;
        }
    }
    
    /// Load credentials from a credential source
    public sealed class AwsLoadCredentials : BaseTelemetryEvent
    {
        
        /// Where credentials are stored or retrieved from
        public CredentialSourceId CredentialSourceId;
        
        public AwsLoadCredentials()
        {
            this.Passive = true;
        }
    }
    
    /// Create a new credentials file
    public sealed class AwsCreateCredentials : BaseTelemetryEvent
    {
        
        public AwsCreateCredentials()
        {
            this.Passive = false;
        }
    }
    
    /// Inject selected AWS credentials into a third-party run (e.g. RunConfiguration)
    public sealed class AwsInjectCredentials : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - A free-text field to record runtimes that may be separate from Lambda runtimes
        public string RuntimeString;
        
        public AwsInjectCredentials()
        {
            this.Passive = false;
        }
    }
    
    /// Validate credentials when selecting new credentials
    public sealed class AwsValidateCredentials : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The type of credential that was selected
        public CredentialType? CredentialType;
        
        /// Optional - Where credentials are stored or retrieved from
        public CredentialSourceId? CredentialSourceId;
        
        public AwsValidateCredentials()
        {
            this.Passive = true;
        }
    }
    
    /// Emitted when credentials are automatically refreshed by the AWS SDK or Toolkit
    public sealed class AwsRefreshCredentials : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The type of credential that was selected
        public CredentialType? CredentialType;
        
        /// Optional - Where credentials are stored or retrieved from
        public CredentialSourceId? CredentialSourceId;
        
        /// Optional - Length of time, in milliseconds, that an authentication session has lived for. Useful for determining how frequently a user has to reauthenticate.
        public System.Int32? SessionDuration;
        
        public AwsRefreshCredentials()
        {
            this.Passive = true;
        }
    }
    
    /// Called when a connection requires login using the browser
    public sealed class AwsLoginWithBrowser : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The type of credential that was selected
        public CredentialType? CredentialType;
        
        /// Optional - Where credentials are stored or retrieved from
        public CredentialSourceId? CredentialSourceId;
        
        public AwsLoginWithBrowser()
        {
            this.Passive = false;
        }
    }
    
    /// Open docs for the extension
    public sealed class AwsHelp : BaseTelemetryEvent
    {
        
        /// Optional - A generic name metadata
        public string Name;
        
        public AwsHelp()
        {
            this.Passive = false;
        }
    }
    
    /// Open the quickstart guide
    public sealed class AwsHelpQuickstart : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public AwsHelpQuickstart()
        {
            this.Passive = true;
        }
    }
    
    /// Open the repo for the extension
    public sealed class AwsShowExtensionSource : BaseTelemetryEvent
    {
        
        public AwsShowExtensionSource()
        {
            this.Passive = false;
        }
    }
    
    /// Refresh the AWS explorer window
    public sealed class AwsRefreshExplorer : BaseTelemetryEvent
    {
        
        public AwsRefreshExplorer()
        {
            this.Passive = false;
        }
    }
    
    /// Expand a service root node in the AWS explorer window
    public sealed class AwsExpandExplorerNode : BaseTelemetryEvent
    {
        
        /// The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        public AwsExpandExplorerNode()
        {
            this.Passive = false;
        }
    }
    
    /// Report an issue with the plugin
    public sealed class AwsReportPluginIssue : BaseTelemetryEvent
    {
        
        public AwsReportPluginIssue()
        {
            this.Passive = false;
        }
    }
    
    /// Called when deploying an application to Elastic Beanstalk
    public sealed class BeanstalkDeploy : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Whether or not the deploy targets a new destination (true) or an existing destination (false)
        public bool InitialDeploy;
        
        /// Optional - A generic name metadata
        public string Name;
        
        /// Optional - Application framework being used
        public string Framework;
        
        /// Optional - Whether or not AWS X-Ray is enabled
        public System.Boolean? XrayEnabled;
        
        /// Optional - Whether or not Elastic Beanstalk enhanced health reporting and monitoring is being used
        public System.Boolean? EnhancedHealthEnabled;
        
        /// Optional - The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        /// Optional - The source of the operation
        public string Source;
        
        public BeanstalkDeploy()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user completes the Elastic Beanstalk publish wizard
    public sealed class BeanstalkPublishWizard : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        /// Optional - The source of the operation
        public string Source;
        
        public BeanstalkPublishWizard()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view the status of the Beanstalk Application
    public sealed class BeanstalkOpenApplication : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public BeanstalkOpenApplication()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view the status of the Beanstalk Environment
    public sealed class BeanstalkOpenEnvironment : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public BeanstalkOpenEnvironment()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user deletes a Beanstalk application
    public sealed class BeanstalkDeleteApplication : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public BeanstalkDeleteApplication()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user deletes a Beanstalk environment
    public sealed class BeanstalkDeleteEnvironment : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public BeanstalkDeleteEnvironment()
        {
            this.Passive = false;
        }
    }
    
    /// Restart application server for a Beanstalk environment
    public sealed class BeanstalkRestartApplication : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public BeanstalkRestartApplication()
        {
            this.Passive = false;
        }
    }
    
    /// Rebuild a Beanstalk environment
    public sealed class BeanstalkRebuildEnvironment : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public BeanstalkRebuildEnvironment()
        {
            this.Passive = false;
        }
    }
    
    /// Edit configuration of a Beanstalk environment
    public sealed class BeanstalkEditEnvironment : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public BeanstalkEditEnvironment()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view the status of the CloudFront Distribution
    public sealed class CloudfrontOpenDistribution : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudfrontOpenDistribution()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view the status of the CloudFront Streaming Distribution
    public sealed class CloudfrontOpenStreamingDistribution : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudfrontOpenStreamingDistribution()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view the Cloudfront Invalidation requests
    public sealed class CloudfrontOpenInvalidationRequest : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudfrontOpenInvalidationRequest()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user deletes a CloudFront Distribution
    public sealed class CloudfrontDeleteDistribution : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudfrontDeleteDistribution()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user deletes a CloudFront Streaming Distribution
    public sealed class CloudfrontDeleteStreamingDistribution : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudfrontDeleteStreamingDistribution()
        {
            this.Passive = false;
        }
    }
    
    /// Create a CloudFront Distribution
    public sealed class CloudfrontCreateDistribution : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudfrontCreateDistribution()
        {
            this.Passive = false;
        }
    }
    
    /// Create a CloudFront Streaming Distribution
    public sealed class CloudfrontCreateStreamingDistribution : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudfrontCreateStreamingDistribution()
        {
            this.Passive = false;
        }
    }
    
    /// Copy the ARN of a CloudWatch Logs entity
    public sealed class CloudwatchlogsCopyArn : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// CloudWatch Logs entity
        public CloudWatchResourceType CloudWatchResourceType;
        
        public CloudwatchlogsCopyArn()
        {
            this.Passive = false;
        }
    }
    
    /// Open a CloudWatch Logs entity. ServiceType and source indicate where the request came from (example: while viewing an ECS container)
    public sealed class CloudwatchlogsOpen : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// CloudWatch Logs entity
        public CloudWatchResourceType CloudWatchResourceType;
        
        /// Optional - Presentation mode used in a CloudWatch Logs operation
        public CloudWatchLogsPresentation? CloudWatchLogsPresentation;
        
        /// Optional - The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        /// Optional - A text based filter was used
        public System.Boolean? HasTextFilter;
        
        /// Optional - A time based filter was used
        public System.Boolean? HasTimeFilter;
        
        /// The source of the operation
        public string Source;
        
        public CloudwatchlogsOpen()
        {
            this.Passive = false;
        }
    }
    
    /// Open the CloudWatch Logs group window. ServiceType indicates that it was opened from a different service (like directly from an ECS container) (Deprecated - use cloudwatchlogs_open)
    public sealed class CloudwatchlogsOpenGroup : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        public CloudwatchlogsOpenGroup()
        {
            this.Passive = false;
        }
    }
    
    /// Open a CloudWatch Logs stream in the window. ServiceType indicates that it was opened from a different service (like directly from an ECS container) (Deprecated - use cloudwatchlogs_open)
    public sealed class CloudwatchlogsOpenStream : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        public CloudwatchlogsOpenStream()
        {
            this.Passive = false;
        }
    }
    
    /// Delete a CloudWatch Logs entity.
    public sealed class CloudwatchlogsDelete : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// CloudWatch Logs entity
        public CloudWatchResourceType CloudWatchResourceType;
        
        public CloudwatchlogsDelete()
        {
            this.Passive = false;
        }
    }
    
    /// Download a CloudWatch Logs entity. Value indicates the final size of the formatted stream in bytes.
    public sealed class CloudwatchlogsDownload : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// CloudWatch Logs entity
        public CloudWatchResourceType CloudWatchResourceType;
        
        public CloudwatchlogsDownload()
        {
            this.Passive = false;
        }
    }
    
    /// Download a stream to a file on disk. Value indicates the final size of the formatted stream. (Deprecated - use cloudwatchlogs_download)
    public sealed class CloudwatchlogsDownloadStreamToFile : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudwatchlogsDownloadStreamToFile()
        {
            this.Passive = false;
        }
    }
    
    /// Download a stream to memory then open in an editor.
    public sealed class CloudwatchlogsOpenStreamInEditor : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudwatchlogsOpenStreamInEditor()
        {
            this.Passive = false;
        }
    }
    
    /// Copy the currently open (possibly filtered) messages to an editor
    public sealed class CloudwatchlogsViewCurrentMessagesInEditor : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudwatchlogsViewCurrentMessagesInEditor()
        {
            this.Passive = false;
        }
    }
    
    /// Word wrap events off/on
    public sealed class CloudwatchlogsWrapEvents : BaseTelemetryEvent
    {
        
        /// True if turned on, false if turned off
        public bool Enabled;
        
        public CloudwatchlogsWrapEvents()
        {
            this.Passive = false;
        }
    }
    
    /// Tail stream off/on
    public sealed class CloudwatchlogsTailStream : BaseTelemetryEvent
    {
        
        /// True if turned on, false if turned off
        public bool Enabled;
        
        public CloudwatchlogsTailStream()
        {
            this.Passive = false;
        }
    }
    
    /// Refresh a CloudWatch Logs entity
    public sealed class CloudwatchlogsRefresh : BaseTelemetryEvent
    {
        
        /// CloudWatch Logs entity
        public CloudWatchResourceType CloudWatchResourceType;
        
        public CloudwatchlogsRefresh()
        {
            this.Passive = false;
        }
    }
    
    /// Refresh group is pressed (Deprecated, use cloudwatchlogs_refresh)
    public sealed class CloudwatchlogsRefreshGroup : BaseTelemetryEvent
    {
        
        public CloudwatchlogsRefreshGroup()
        {
            this.Passive = false;
        }
    }
    
    /// Refresh stream is pressed (Deprecated, use cloudwatchlogs_refresh)
    public sealed class CloudwatchlogsRefreshStream : BaseTelemetryEvent
    {
        
        public CloudwatchlogsRefreshStream()
        {
            this.Passive = false;
        }
    }
    
    /// Filters a CloudWatch Logs entity. (Essentially a subset of cloudwatchlogs_open)
    public sealed class CloudwatchlogsFilter : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// CloudWatch Logs entity
        public CloudWatchResourceType CloudWatchResourceType;
        
        /// Optional - The source of the operation
        public string Source;
        
        /// Optional - A text based filter was used
        public System.Boolean? HasTextFilter;
        
        /// Optional - A time based filter was used
        public System.Boolean? HasTimeFilter;
        
        public CloudwatchlogsFilter()
        {
            this.Passive = false;
        }
    }
    
    /// Called when a stream is searched
    public sealed class CloudwatchlogsSearchStream : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudwatchlogsSearchStream()
        {
            this.Passive = false;
        }
    }
    
    /// Called when a group is searched
    public sealed class CloudwatchlogsSearchGroup : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudwatchlogsSearchGroup()
        {
            this.Passive = false;
        }
    }
    
    /// Show event around a time period in ms specified by Value
    public sealed class CloudwatchlogsShowEventsAround : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudwatchlogsShowEventsAround()
        {
            this.Passive = false;
        }
    }
    
    /// Called when creating a CloudFormation project
    public sealed class CloudformationCreateProject : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Generic name of a template
        public string TemplateName;
        
        public CloudformationCreateProject()
        {
            this.Passive = false;
        }
    }
    
    /// Called when deploying a CloudFormation template
    public sealed class CloudformationDeploy : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Whether or not the deploy targets a new destination (true) or an existing destination (false)
        public bool InitialDeploy;
        
        /// Optional - The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        /// Optional - The source of the operation
        public string Source;
        
        public CloudformationDeploy()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user completes the CloudFormation template publish wizard
    public sealed class CloudformationPublishWizard : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        /// Optional - The source of the operation
        public string Source;
        
        public CloudformationPublishWizard()
        {
            this.Passive = false;
        }
    }
    
    /// Open a CloudFormation stack in the stack viewer
    public sealed class CloudformationOpen : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudformationOpen()
        {
            this.Passive = false;
        }
    }
    
    /// A repo is cloned from CodeCommit
    public sealed class CodecommitCloneRepo : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CodecommitCloneRepo()
        {
            this.Passive = false;
        }
    }
    
    /// A repo is created in CodeCommit
    public sealed class CodecommitCreateRepo : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CodecommitCreateRepo()
        {
            this.Passive = false;
        }
    }
    
    /// A connection is established to CodeCommit to perform actions on repos
    public sealed class CodecommitSetCredentials : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The type of credential that was selected
        public CredentialType? CredentialType;
        
        public CodecommitSetCredentials()
        {
            this.Passive = true;
        }
    }
    
    /// Create a DynamoDB table
    public sealed class DynamodbCreateTable : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public DynamodbCreateTable()
        {
            this.Passive = false;
        }
    }
    
    /// Delete a DynamoDB table
    public sealed class DynamodbDeleteTable : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public DynamodbDeleteTable()
        {
            this.Passive = false;
        }
    }
    
    /// Modify a DynamoDB entity
    public sealed class DynamodbEdit : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of DynamoDB entity referenced by a metric or operation
        public DynamoDbTarget DynamoDbTarget;
        
        public DynamodbEdit()
        {
            this.Passive = false;
        }
    }
    
    /// Fetch records from a DynamoDB table in the table browser
    public sealed class DynamodbFetchRecords : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of fetch being performed
        public DynamoDbFetchType DynamoDbFetchType;
        
        /// Optional - The type of index being hit for the query/scan operation
        public DynamoDbIndexType? DynamoDbIndexType;
        
        public DynamodbFetchRecords()
        {
            this.Passive = false;
        }
    }
    
    /// Open a DynamoDB table in the table browser
    public sealed class DynamodbOpenTable : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public DynamodbOpenTable()
        {
            this.Passive = false;
        }
    }
    
    /// View a DynamoDB entity
    public sealed class DynamodbView : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of DynamoDB entity referenced by a metric or operation
        public DynamoDbTarget DynamoDbTarget;
        
        public DynamodbView()
        {
            this.Passive = false;
        }
    }
    
    /// Change the state of an EC2 Instance
    public sealed class Ec2ChangeState : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Actions that can affect an EC2 Instance state
        public Ec2InstanceState Ec2InstanceState;
        
        public Ec2ChangeState()
        {
            this.Passive = false;
        }
    }
    
    /// Remove the private key of an EC2 Key Pair from internal storage
    public sealed class Ec2ClearPrivateKey : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2ClearPrivateKey()
        {
            this.Passive = false;
        }
    }
    
    /// Perform a connection to an EC2 Instance
    public sealed class Ec2ConnectToInstance : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Ways to connect to an EC2 Instance
        public Ec2ConnectionType Ec2ConnectionType;
        
        public Ec2ConnectToInstance()
        {
            this.Passive = false;
        }
    }
    
    /// Copy AMI image to another region
    public sealed class Ec2CopyAmiToRegion : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2CopyAmiToRegion()
        {
            this.Passive = false;
        }
    }
    
    /// Create an image from an EC2 Instance
    public sealed class Ec2CreateAmi : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2CreateAmi()
        {
            this.Passive = false;
        }
    }
    
    /// Create (allocate) an Elastic IP address
    public sealed class Ec2CreateElasticIp : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2CreateElasticIp()
        {
            this.Passive = false;
        }
    }
    
    /// Create an EC2 Key Pair
    public sealed class Ec2CreateKeyPair : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2CreateKeyPair()
        {
            this.Passive = false;
        }
    }
    
    /// Create an EC2 security group
    public sealed class Ec2CreateSecurityGroup : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2CreateSecurityGroup()
        {
            this.Passive = false;
        }
    }
    
    /// Create an EC2 volume snapshot
    public sealed class Ec2CreateSnapshot : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2CreateSnapshot()
        {
            this.Passive = false;
        }
    }
    
    /// Create an EC2 volume
    public sealed class Ec2CreateVolume : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2CreateVolume()
        {
            this.Passive = false;
        }
    }
    
    /// Delete (de-register) an AMI image
    public sealed class Ec2DeleteAmi : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2DeleteAmi()
        {
            this.Passive = false;
        }
    }
    
    /// Delete (release) an Elastic IP address
    public sealed class Ec2DeleteElasticIp : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2DeleteElasticIp()
        {
            this.Passive = false;
        }
    }
    
    /// Delete an EC2 Key Pair
    public sealed class Ec2DeleteKeyPair : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2DeleteKeyPair()
        {
            this.Passive = false;
        }
    }
    
    /// Delete an EC2 security group
    public sealed class Ec2DeleteSecurityGroup : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2DeleteSecurityGroup()
        {
            this.Passive = false;
        }
    }
    
    /// Delete an EC2 Volume Snapshot
    public sealed class Ec2DeleteSnapshot : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2DeleteSnapshot()
        {
            this.Passive = false;
        }
    }
    
    /// Delete an EC2 Volume
    public sealed class Ec2DeleteVolume : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2DeleteVolume()
        {
            this.Passive = false;
        }
    }
    
    /// Edit AMI image permissions
    public sealed class Ec2EditAmiPermission : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2EditAmiPermission()
        {
            this.Passive = false;
        }
    }
    
    /// Associate or disassociate an Elastic IP with an EC2 Instance
    public sealed class Ec2EditInstanceElasticIp : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - True if turned on, false if turned off
        public System.Boolean? Enabled;
        
        public Ec2EditInstanceElasticIp()
        {
            this.Passive = false;
        }
    }
    
    /// Adjust the shutdown behavior of an EC2 Instance
    public sealed class Ec2EditInstanceShutdownBehavior : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2EditInstanceShutdownBehavior()
        {
            this.Passive = false;
        }
    }
    
    /// Adjust the termination protection of an EC2 Instance
    public sealed class Ec2EditInstanceTerminationProtection : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - True if turned on, false if turned off
        public System.Boolean? Enabled;
        
        public Ec2EditInstanceTerminationProtection()
        {
            this.Passive = false;
        }
    }
    
    /// Adjust the instance type of an EC2 Instance
    public sealed class Ec2EditInstanceType : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2EditInstanceType()
        {
            this.Passive = false;
        }
    }
    
    /// Adjust an EC2 Instance's user data
    public sealed class Ec2EditInstanceUserData : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2EditInstanceUserData()
        {
            this.Passive = false;
        }
    }
    
    /// Alter an EC2 security group permission
    public sealed class Ec2EditSecurityGroupPermission : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2EditSecurityGroupPermission()
        {
            this.Passive = false;
        }
    }
    
    /// Attach (enabled = true) or detach a volume
    public sealed class Ec2EditVolumeAttachment : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// True if turned on, false if turned off
        public bool Enabled;
        
        public Ec2EditVolumeAttachment()
        {
            this.Passive = false;
        }
    }
    
    /// Save the private key of an EC2 Key Pair out to disk
    public sealed class Ec2ExportPrivateKey : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2ExportPrivateKey()
        {
            this.Passive = false;
        }
    }
    
    /// Store the private key of an EC2 Key Pair in internal storage
    public sealed class Ec2ImportPrivateKey : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2ImportPrivateKey()
        {
            this.Passive = false;
        }
    }
    
    /// Launch an EC2 Instance
    public sealed class Ec2LaunchInstance : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2LaunchInstance()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view EC2 Instances
    public sealed class Ec2OpenInstances : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2OpenInstances()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view EC2 AMIs
    public sealed class Ec2OpenAMIs : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2OpenAMIs()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view EC2 Elastic IPs
    public sealed class Ec2OpenElasticIPs : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2OpenElasticIPs()
        {
            this.Passive = false;
        }
    }
    
    /// Open to view EC2 Key pairs
    public sealed class Ec2OpenKeyPairs : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2OpenKeyPairs()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view EC2 Security Groups
    public sealed class Ec2OpenSecurityGroups : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2OpenSecurityGroups()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view EC2 Volumes
    public sealed class Ec2OpenVolumes : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2OpenVolumes()
        {
            this.Passive = false;
        }
    }
    
    /// View the system log of an EC2 Instance
    public sealed class Ec2ViewInstanceSystemLog : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2ViewInstanceSystemLog()
        {
            this.Passive = false;
        }
    }
    
    /// Open to view status of an ECS Cluster
    public sealed class EcsOpenCluster : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcsOpenCluster()
        {
            this.Passive = false;
        }
    }
    
    /// View an EC2 Instance's user data
    public sealed class Ec2ViewInstanceUserData : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public Ec2ViewInstanceUserData()
        {
            this.Passive = false;
        }
    }
    
    /// Called when ECS execute command is enabled
    public sealed class EcsEnableExecuteCommand : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcsEnableExecuteCommand()
        {
            this.Passive = false;
        }
    }
    
    /// Called when ECS execute command is disabled
    public sealed class EcsDisableExecuteCommand : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcsDisableExecuteCommand()
        {
            this.Passive = false;
        }
    }
    
    /// Called when the ECS execute command is run
    public sealed class EcsRunExecuteCommand : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Type of execution selected while running the execute command
        public EcsExecuteCommandType EcsExecuteCommandType;
        
        public EcsRunExecuteCommand()
        {
            this.Passive = false;
        }
    }
    
    /// Called when the user copies the repository uri from a node
    public sealed class EcrCopyRepositoryUri : BaseTelemetryEvent
    {
        
        public EcrCopyRepositoryUri()
        {
            this.Passive = false;
        }
    }
    
    /// Called when the user copies the repository tag uri from a node. The tag uri is the repository uri + : + the tag name
    public sealed class EcrCopyTagUri : BaseTelemetryEvent
    {
        
        public EcrCopyTagUri()
        {
            this.Passive = false;
        }
    }
    
    /// Called when creating a new ECR repository
    public sealed class EcrCreateRepository : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcrCreateRepository()
        {
            this.Passive = false;
        }
    }
    
    /// Called when deleting an existing ECR repository
    public sealed class EcrDeleteRepository : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcrDeleteRepository()
        {
            this.Passive = false;
        }
    }
    
    /// Called when deleting a tag in an ECR repository. The operation is a batch operation by default, value represents the number of tags deleted.
    public sealed class EcrDeleteTags : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcrDeleteTags()
        {
            this.Passive = false;
        }
    }
    
    /// Called when deploying an image to ECR
    public sealed class EcrDeployImage : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The source content specified in the ECR deployment request
        public EcrDeploySource? EcrDeploySource;
        
        public EcrDeployImage()
        {
            this.Passive = false;
        }
    }
    
    /// Called when deploying a scheduled task to an ECS cluster
    public sealed class EcsDeployScheduledTask : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Infrastructure type used by ECS tasks and services
        public EcsLaunchType EcsLaunchType;
        
        public EcsDeployScheduledTask()
        {
            this.Passive = false;
        }
    }
    
    /// Called when deploying a service to an ECS cluster
    public sealed class EcsDeployService : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Infrastructure type used by ECS tasks and services
        public EcsLaunchType EcsLaunchType;
        
        public EcsDeployService()
        {
            this.Passive = false;
        }
    }
    
    /// Called when deploying a task to an ECS cluster
    public sealed class EcsDeployTask : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Infrastructure type used by ECS tasks and services
        public EcsLaunchType EcsLaunchType;
        
        public EcsDeployTask()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user completes the ECS publish wizard
    public sealed class EcsPublishWizard : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcsPublishWizard()
        {
            this.Passive = false;
        }
    }
    
    /// Open to view status of an ECS Repository
    public sealed class EcsOpenRepository : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcsOpenRepository()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user deletes an ECS service
    public sealed class EcsDeleteService : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcsDeleteService()
        {
            this.Passive = false;
        }
    }
    
    /// Edit configuration of an ECS service
    public sealed class EcsEditService : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcsEditService()
        {
            this.Passive = false;
        }
    }
    
    /// Delete an ECS cluster
    public sealed class EcsDeleteCluster : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcsDeleteCluster()
        {
            this.Passive = false;
        }
    }
    
    /// Stop ECS task(s)
    public sealed class EcsStopTask : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcsStopTask()
        {
            this.Passive = false;
        }
    }
    
    /// Delete ECS Scheduled task(s)
    public sealed class EcsDeleteScheduledTask : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public EcsDeleteScheduledTask()
        {
            this.Passive = false;
        }
    }
    
    /// Called while submitting in-IDE feedback
    public sealed class FeedbackResult : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public FeedbackResult()
        {
            this.Passive = false;
        }
    }
    
    /// Use authoring features such as autocompletion, syntax checking, and highlighting, for AWS filetypes (CFN, SAM, etc.). Emit this _once_ per file-editing session for a given file. Ideally this is emitted only if authoring features are used, rather than merely opening or touching a file.
    public sealed class FileEditAwsFile : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// AWS filetype kind
        public AwsFiletype AwsFiletype;
        
        /// Optional - Filename extension (examples: .txt, .yml, .yaml, .asl.yaml, ...), or empty string if the filename does not contain dot (.) between two chars.
        public string FilenameExt;
        
        public FileEditAwsFile()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view/edit IAM Role Policy
    public sealed class IamOpenRole : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public IamOpenRole()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view/edit IAM Group Policy
    public sealed class IamOpenGroup : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public IamOpenGroup()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view/edit IAM User Configuration
    public sealed class IamOpenUser : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public IamOpenUser()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view/edit an IAM resource
    public sealed class IamOpen : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of IAM resource referenced by a metric or operation
        public IamResourceType IamResourceType;
        
        public IamOpen()
        {
            this.Passive = false;
        }
    }
    
    /// Create an IAM resource
    public sealed class IamCreate : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of IAM resource referenced by a metric or operation
        public IamResourceType IamResourceType;
        
        public IamCreate()
        {
            this.Passive = false;
        }
    }
    
    /// Delete an IAM resource
    public sealed class IamDelete : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of IAM resource referenced by a metric or operation
        public IamResourceType IamResourceType;
        
        public IamDelete()
        {
            this.Passive = false;
        }
    }
    
    /// Edits policy/configuration associated with an IAM resource
    public sealed class IamEdit : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of IAM resource referenced by a metric or operation
        public IamResourceType IamResourceType;
        
        public IamEdit()
        {
            this.Passive = false;
        }
    }
    
    /// Create Access Key for an IAM user
    public sealed class IamCreateUserAccessKey : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public IamCreateUserAccessKey()
        {
            this.Passive = false;
        }
    }
    
    /// Delete Access Key for an IAM user
    public sealed class IamDeleteUserAccessKey : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public IamDeleteUserAccessKey()
        {
            this.Passive = false;
        }
    }
    
    /// called when deleting lambdas remotely
    public sealed class LambdaDelete : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public LambdaDelete()
        {
            this.Passive = false;
        }
    }
    
    /// Called when opening the local configuration of a Lambda to edit
    public sealed class LambdaConfigure : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public LambdaConfigure()
        {
            this.Passive = false;
        }
    }
    
    /// Called when creating lambdas remotely
    public sealed class LambdaCreate : BaseTelemetryEvent
    {
        
        /// The lambda runtime
        public Runtime Runtime;
        
        public LambdaCreate()
        {
            this.Passive = false;
        }
    }
    
    /// Called when creating a lambda project
    public sealed class LambdaCreateProject : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Language used for the project
        public string Language;
        
        /// Generic name of a template
        public string TemplateName;
        
        /// Optional - A generic variant metadata
        public string Variant;
        
        public LambdaCreateProject()
        {
            this.Passive = false;
        }
    }
    
    /// Jump to a lambda handler from elsewhere
    public sealed class LambdaGoToHandler : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public LambdaGoToHandler()
        {
            this.Passive = false;
        }
    }
    
    /// Called when creating lambdas remotely
    public sealed class LambdaEditFunction : BaseTelemetryEvent
    {
        
        /// Optional - If the operation was an update or not
        public System.Boolean? Update;
        
        /// The Lambda Package type of the function
        public LambdaPackageType LambdaPackageType;
        
        /// The result of the operation
        public Result Result;
        
        public LambdaEditFunction()
        {
            this.Passive = false;
        }
    }
    
    /// Called when invoking lambdas remotely
    public sealed class LambdaInvokeRemote : BaseTelemetryEvent
    {
        
        /// Optional - The lambda runtime
        public Runtime? Runtime;
        
        /// The result of the operation
        public Result Result;
        
        public LambdaInvokeRemote()
        {
            this.Passive = false;
        }
    }
    
    /// Called when invoking lambdas locally (with SAM in most toolkits)
    public sealed class LambdaInvokeLocal : BaseTelemetryEvent
    {
        
        /// Optional - The lambda runtime
        public Runtime? Runtime;
        
        /// Optional - A generic version metadata
        public string Version;
        
        /// The Lambda Package type of the function
        public LambdaPackageType LambdaPackageType;
        
        /// The result of the operation
        public Result Result;
        
        /// If the action was run in debug mode or not
        public bool Debug;
        
        /// Optional - Lambda architecture identifier
        public LambdaArchitecture? LambdaArchitecture;
        
        public LambdaInvokeLocal()
        {
            this.Passive = false;
        }
    }
    
    /// Called when importing a remote Lambda function
    public sealed class LambdaImport : BaseTelemetryEvent
    {
        
        /// Optional - The lambda runtime
        public Runtime? Runtime;
        
        /// The result of the operation
        public Result Result;
        
        public LambdaImport()
        {
            this.Passive = false;
        }
    }
    
    /// Called when updating a Lambda function's code outside the context of a SAM template
    public sealed class LambdaUpdateFunctionCode : BaseTelemetryEvent
    {
        
        /// Optional - The lambda runtime
        public Runtime? Runtime;
        
        /// The result of the operation
        public Result Result;
        
        public LambdaUpdateFunctionCode()
        {
            this.Passive = false;
        }
    }
    
    /// Called when deploying a Lambda Function
    public sealed class LambdaDeploy : BaseTelemetryEvent
    {
        
        /// The Lambda Package type of the function
        public LambdaPackageType LambdaPackageType;
        
        /// The result of the operation
        public Result Result;
        
        /// Whether or not the deploy targets a new destination (true) or an existing destination (false)
        public bool InitialDeploy;
        
        /// Optional - The lambda runtime
        public Runtime? Runtime;
        
        /// Optional - Language-specific identification. Examples: v4.6.1, netcoreapp3.1, nodejs12.x. Not AWS Lambda specific. Allows for additional details when other fields are opaque, such as the Lambda runtime value 'provided'.
        public string Platform;
        
        /// Optional - Lambda architecture identifier
        public LambdaArchitecture? LambdaArchitecture;
        
        /// Optional - Language used for the project
        public string Language;
        
        /// Optional - Whether or not AWS X-Ray is enabled
        public System.Boolean? XrayEnabled;
        
        /// Optional - The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        /// Optional - The source of the operation
        public string Source;
        
        public LambdaDeploy()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user completes the Lambda publish wizard
    public sealed class LambdaPublishWizard : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        /// Optional - The source of the operation
        public string Source;
        
        public LambdaPublishWizard()
        {
            this.Passive = false;
        }
    }
    
    /// Called when deleting a cloudformation stack
    public sealed class CloudformationDelete : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudformationDelete()
        {
            this.Passive = false;
        }
    }
    
    /// Called when getting IAM/SecretsManager credentials for a RDS database. Value represents how long it takes in ms.
    public sealed class RdsGetCredentials : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// How the database credentials are being retrieved
        public DatabaseCredentials DatabaseCredentials;
        
        /// The database engine used (mysql/postgres/redshift)
        public string DatabaseEngine;
        
        public RdsGetCredentials()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view RDS DB Instances
    public sealed class RdsOpenInstances : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public RdsOpenInstances()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view RDS Security Groups
    public sealed class RdsOpenSecurityGroups : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public RdsOpenSecurityGroups()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view RDS Subnet Groups
    public sealed class RdsOpenSubnets : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public RdsOpenSubnets()
        {
            this.Passive = false;
        }
    }
    
    /// Launch a RDS DB instance
    public sealed class RdsLaunchInstance : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public RdsLaunchInstance()
        {
            this.Passive = false;
        }
    }
    
    /// Create a RDS security group
    public sealed class RdsCreateSecurityGroup : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public RdsCreateSecurityGroup()
        {
            this.Passive = false;
        }
    }
    
    /// Create a RDS subnet group
    public sealed class RdsCreateSubnetGroup : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public RdsCreateSubnetGroup()
        {
            this.Passive = false;
        }
    }
    
    /// Delete a RDS DB instance
    public sealed class RdsDeleteInstance : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public RdsDeleteInstance()
        {
            this.Passive = false;
        }
    }
    
    /// Delete RDS security group(s)
    public sealed class RdsDeleteSecurityGroup : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public RdsDeleteSecurityGroup()
        {
            this.Passive = false;
        }
    }
    
    /// Delete RDS subnet group(s)
    public sealed class RdsDeleteSubnetGroup : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public RdsDeleteSubnetGroup()
        {
            this.Passive = false;
        }
    }
    
    /// Called when creating a new database connection configuration to for a RDS database. In Datagrip we do not get this infromation if it is created directly, so this is only counts actions.
    public sealed class RdsCreateConnectionConfiguration : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// How the database credentials are being retrieved
        public DatabaseCredentials DatabaseCredentials;
        
        /// Optional - The database engine used (mysql/postgres/redshift)
        public string DatabaseEngine;
        
        public RdsCreateConnectionConfiguration()
        {
            this.Passive = false;
        }
    }
    
    /// Called when getting IAM/SecretsManager credentials for a Redshift database. Value represents how long it takes in ms.
    public sealed class RedshiftGetCredentials : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// How the database credentials are being retrieved
        public DatabaseCredentials DatabaseCredentials;
        
        public RedshiftGetCredentials()
        {
            this.Passive = false;
        }
    }
    
    /// Called when creating a new database connection configuration to for a Redshift database. In Datagrip we do not get this infromation if it is created directly, so this only counts actions.
    public sealed class RedshiftCreateConnectionConfiguration : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// How the database credentials are being retrieved
        public DatabaseCredentials DatabaseCredentials;
        
        public RedshiftCreateConnectionConfiguration()
        {
            this.Passive = false;
        }
    }
    
    /// Called when deploying a SAM application
    public sealed class SamDeploy : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - A generic version metadata
        public string Version;
        
        public SamDeploy()
        {
            this.Passive = false;
        }
    }
    
    /// Called when syncing a SAM application
    public sealed class SamSync : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Describes which parts of an application (that we know of) were synced to the cloud. "Code" resources follow the SAM spec: https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-sync.html
        public SyncedResources SyncedResources;
        
        /// The Lambda Package type of the function
        public LambdaPackageType LambdaPackageType;
        
        /// Optional - A generic version metadata
        public string Version;
        
        public SamSync()
        {
            this.Passive = false;
        }
    }
    
    /// Called when initing a SAM application
    public sealed class SamInit : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The lambda runtime
        public Runtime? Runtime;
        
        /// Optional - Generic name of a template
        public string TemplateName;
        
        /// Optional - A generic version metadata
        public string Version;
        
        /// Optional - The Lambda Package type of the function
        public LambdaPackageType? LambdaPackageType;
        
        /// Optional - The name of the EventBridge Schema used in the operation
        public string EventBridgeSchema;
        
        /// Optional - Lambda architecture identifier
        public LambdaArchitecture? LambdaArchitecture;
        
        public SamInit()
        {
            this.Passive = false;
        }
    }
    
    /// Called when selecting an EventBridge schema to view
    public sealed class SchemasView : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public SchemasView()
        {
            this.Passive = false;
        }
    }
    
    /// Called when downloading an EventBridge schema
    public sealed class SchemasDownload : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - Languages targeted by the schemas service
        public SchemaLanguage? SchemaLanguage;
        
        public SchemasDownload()
        {
            this.Passive = false;
        }
    }
    
    /// Called when searching an EventBridge schema registry
    public sealed class SchemasSearch : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public SchemasSearch()
        {
            this.Passive = false;
        }
    }
    
    /// Called when starting the plugin
    public sealed class SessionStart : BaseTelemetryEvent
    {
        
        public SessionStart()
        {
            this.Passive = true;
        }
    }
    
    /// Called when stopping the IDE on a best effort basis
    public sealed class SessionEnd : BaseTelemetryEvent
    {
        
        public SessionEnd()
        {
            this.Passive = true;
        }
    }
    
    /// Copy the bucket name to the clipboard
    public sealed class S3CopyBucketName : BaseTelemetryEvent
    {
        
        public S3CopyBucketName()
        {
            this.Passive = false;
        }
    }
    
    /// Copy the path of a S3 object to the clipboard
    public sealed class S3CopyPath : BaseTelemetryEvent
    {
        
        public S3CopyPath()
        {
            this.Passive = false;
        }
    }
    
    /// Copy the S3 URI of a S3 object to the clipboard (e.g. s3://<bucketName>/abc.txt)
    public sealed class S3CopyUri : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public S3CopyUri()
        {
            this.Passive = false;
        }
    }
    
    /// Copy the URL of a S3 object to the clipboard
    public sealed class S3CopyUrl : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Whether or not it was a presigned request
        public bool Presigned;
        
        public S3CopyUrl()
        {
            this.Passive = false;
        }
    }
    
    /// Create a S3 bucket
    public sealed class S3CreateBucket : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public S3CreateBucket()
        {
            this.Passive = false;
        }
    }
    
    /// Delete a S3 bucket
    public sealed class S3DeleteBucket : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public S3DeleteBucket()
        {
            this.Passive = false;
        }
    }
    
    /// Delete S3 object(s)
    public sealed class S3DeleteObject : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The number of successful operations
        public System.Int32? SuccessCount;
        
        /// Optional - The number of failed operations
        public System.Int32? FailedCount;
        
        public S3DeleteObject()
        {
            this.Passive = false;
        }
    }
    
    /// Create an S3 folder
    public sealed class S3CreateFolder : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public S3CreateFolder()
        {
            this.Passive = false;
        }
    }
    
    /// Download S3 object(s)
    public sealed class S3DownloadObject : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The number of successful operations
        public System.Int32? SuccessCount;
        
        /// Optional - The number of failed operations
        public System.Int32? FailedCount;
        
        /// Optional - The IDE or OS component used for the action. (Examples: S3 download to filesystem, S3 upload from editor, ...)
        public Component? Component;
        
        public S3DownloadObject()
        {
            this.Passive = false;
        }
    }
    
    /// Download multiple S3 objects
    public sealed class S3DownloadObjects : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public S3DownloadObjects()
        {
            this.Passive = false;
        }
    }
    
    /// Upload S3 object(s)
    public sealed class S3UploadObject : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The number of successful operations
        public System.Int32? SuccessCount;
        
        /// Optional - The number of failed operations
        public System.Int32? FailedCount;
        
        /// Optional - The IDE or OS component used for the action. (Examples: S3 download to filesystem, S3 upload from editor, ...)
        public Component? Component;
        
        public S3UploadObject()
        {
            this.Passive = false;
        }
    }
    
    /// Rename a single S3 object
    public sealed class S3RenameObject : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public S3RenameObject()
        {
            this.Passive = false;
        }
    }
    
    /// Upload multiple S3 objects
    public sealed class S3UploadObjects : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public S3UploadObjects()
        {
            this.Passive = false;
        }
    }
    
    /// Open a view of a S3 bucket
    public sealed class S3OpenEditor : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public S3OpenEditor()
        {
            this.Passive = false;
        }
    }
    
    /// Edit or view one or more S3 objects in the IDE
    public sealed class S3EditObject : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The IDE or OS component used for the action. (Examples: S3 download to filesystem, S3 upload from editor, ...)
        public Component? Component;
        
        public S3EditObject()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view S3 bucket properties
    public sealed class S3OpenBucketProperties : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public S3OpenBucketProperties()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view S3 Multipart upload
    public sealed class S3OpenMultipartUpload : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public S3OpenMultipartUpload()
        {
            this.Passive = false;
        }
    }
    
    /// The Toolkit has completed initialization
    public sealed class ToolkitInit : BaseTelemetryEvent
    {
        
        /// Optional - The result of the operation
        public Result? Result;
        
        public ToolkitInit()
        {
            this.Passive = true;
        }
    }
    
    /// View logs for the toolkit
    public sealed class ToolkitViewLogs : BaseTelemetryEvent
    {
        
        public ToolkitViewLogs()
        {
            this.Passive = false;
        }
    }
    
    /// Open an SQS queue. Initially opens to either the send message pane or poll messages pane.
    public sealed class SqsOpenQueue : BaseTelemetryEvent
    {
        
        /// The type of an SQS Queue
        public SqsQueueType SqsQueueType;
        
        public SqsOpenQueue()
        {
            this.Passive = false;
        }
    }
    
    /// Create a new SQS queue
    public sealed class SqsCreateQueue : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The type of an SQS Queue
        public SqsQueueType? SqsQueueType;
        
        public SqsCreateQueue()
        {
            this.Passive = false;
        }
    }
    
    /// Send a message to an SQS queue
    public sealed class SqsSendMessage : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of an SQS Queue
        public SqsQueueType SqsQueueType;
        
        public SqsSendMessage()
        {
            this.Passive = false;
        }
    }
    
    /// Delete one or more messages from an SQS queue. Value indicates the number of messages that we tried to delete.
    public sealed class SqsDeleteMessages : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of an SQS Queue
        public SqsQueueType SqsQueueType;
        
        public SqsDeleteMessages()
        {
            this.Passive = false;
        }
    }
    
    /// Subscribe the queue to messages from an sns topic
    public sealed class SqsSubscribeSns : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of an SQS Queue
        public SqsQueueType SqsQueueType;
        
        public SqsSubscribeSns()
        {
            this.Passive = false;
        }
    }
    
    /// Configure the queue as a trigger for a Lambda
    public sealed class SqsConfigureLambdaTrigger : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of an SQS Queue
        public SqsQueueType SqsQueueType;
        
        public SqsConfigureLambdaTrigger()
        {
            this.Passive = false;
        }
    }
    
    /// Edit the Queue parameters
    public sealed class SqsEditQueueParameters : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of an SQS Queue
        public SqsQueueType SqsQueueType;
        
        public SqsEditQueueParameters()
        {
            this.Passive = false;
        }
    }
    
    /// Purge all messages from the queue
    public sealed class SqsPurgeQueue : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The type of an SQS Queue
        public SqsQueueType SqsQueueType;
        
        public SqsPurgeQueue()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user deletes a SQS queue
    public sealed class SqsDeleteQueue : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The type of an SQS Queue
        public SqsQueueType? SqsQueueType;
        
        public SqsDeleteQueue()
        {
            this.Passive = false;
        }
    }
    
    /// Create a SNS Topic
    public sealed class SnsCreateTopic : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public SnsCreateTopic()
        {
            this.Passive = false;
        }
    }
    
    /// Create a SNS Subscription
    public sealed class SnsCreateSubscription : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public SnsCreateSubscription()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view details of SNS Topic
    public sealed class SnsOpenTopic : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public SnsOpenTopic()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view SNS Subscriptions
    public sealed class SnsOpenSubscriptions : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public SnsOpenSubscriptions()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user deletes a SNS Topic
    public sealed class SnsDeleteTopic : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public SnsDeleteTopic()
        {
            this.Passive = false;
        }
    }
    
    /// Called when user deletes SNS subscription(s)
    public sealed class SnsDeleteSubscription : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public SnsDeleteSubscription()
        {
            this.Passive = false;
        }
    }
    
    /// Publish message to a SNS topic
    public sealed class SnsPublishMessage : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public SnsPublishMessage()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view VPC RouteTable
    public sealed class VpcOpenRouteTables : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public VpcOpenRouteTables()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view VPC Internet Gateway
    public sealed class VpcOpenGateways : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public VpcOpenGateways()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view VPC Network ACLs
    public sealed class VpcOpenACLs : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public VpcOpenACLs()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view VPC Subnets
    public sealed class VpcOpenSubnets : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public VpcOpenSubnets()
        {
            this.Passive = false;
        }
    }
    
    /// Open a window to view VPC details
    public sealed class VpcOpenVPCs : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public VpcOpenVPCs()
        {
            this.Passive = false;
        }
    }
    
    /// Open the insights query editor
    public sealed class CloudwatchinsightsOpenEditor : BaseTelemetryEvent
    {
        
        /// Dialog open trigger source location
        public InsightsDialogOpenSource InsightsDialogOpenSource;
        
        public CloudwatchinsightsOpenEditor()
        {
            this.Passive = false;
        }
    }
    
    /// Start an insights query
    public sealed class CloudwatchinsightsExecuteQuery : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// User-selected time range type while starting an insights query
        public InsightsQueryTimeType InsightsQueryTimeType;
        
        /// User-specified search string type while starting an insights query
        public InsightsQueryStringType InsightsQueryStringType;
        
        public CloudwatchinsightsExecuteQuery()
        {
            this.Passive = false;
        }
    }
    
    /// Save query parameters to AWS
    public sealed class CloudwatchinsightsSaveQuery : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudwatchinsightsSaveQuery()
        {
            this.Passive = false;
        }
    }
    
    /// Retrieve list of available saved queries from AWS
    public sealed class CloudwatchinsightsRetrieveQuery : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudwatchinsightsRetrieveQuery()
        {
            this.Passive = false;
        }
    }
    
    /// Get all details for the selected log record
    public sealed class CloudwatchinsightsOpenDetailedLogRecord : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        public CloudwatchinsightsOpenDetailedLogRecord()
        {
            this.Passive = false;
        }
    }
    
    /// The toolkit tried to retrieve blob data from a url
    public sealed class ToolkitGetExternalResource : BaseTelemetryEvent
    {
        
        /// The url associated with a metric
        public string Url;
        
        /// The result of the operation
        public Result Result;
        
        public ToolkitGetExternalResource()
        {
            this.Passive = true;
        }
    }
    
    /// The toolkit tried to show a notification message
    public sealed class ToolkitShowNotification : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// A generic ID metadata
        public string Id;
        
        /// The IDE or OS component used for the action. (Examples: S3 download to filesystem, S3 upload from editor, ...)
        public Component Component;
        
        public ToolkitShowNotification()
        {
            this.Passive = false;
        }
    }
    
    /// The toolkit tried to show an action. Source represents the notification that produced the action
    public sealed class ToolkitShowAction : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// A generic ID metadata
        public string Id;
        
        /// The source of the operation
        public string Source;
        
        /// The IDE or OS component used for the action. (Examples: S3 download to filesystem, S3 upload from editor, ...)
        public Component Component;
        
        public ToolkitShowAction()
        {
            this.Passive = false;
        }
    }
    
    /// A user invoked an action. Source represents the notification that produced the action
    public sealed class ToolkitInvokeAction : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// A generic ID metadata
        public string Id;
        
        /// The source of the operation
        public string Source;
        
        /// The IDE or OS component used for the action. (Examples: S3 download to filesystem, S3 upload from editor, ...)
        public Component Component;
        
        public ToolkitInvokeAction()
        {
            this.Passive = false;
        }
    }
    
    /// Open the dynamic resource model in the IDE
    public sealed class DynamicresourceGetResource : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The dynamic resource type being interacted with
        public string ResourceType;
        
        public DynamicresourceGetResource()
        {
            this.Passive = false;
        }
    }
    
    /// Expand a Resource Type node
    public sealed class DynamicresourceListResource : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The dynamic resource type being interacted with
        public string ResourceType;
        
        public DynamicresourceListResource()
        {
            this.Passive = false;
        }
    }
    
    /// Change the list of available dynamic resources in the AWS Explorer
    public sealed class DynamicresourceSelectResources : BaseTelemetryEvent
    {
        
        public DynamicresourceSelectResources()
        {
            this.Passive = false;
        }
    }
    
    /// Copy the dynamic resource identifier
    public sealed class DynamicresourceCopyIdentifier : BaseTelemetryEvent
    {
        
        /// The dynamic resource type being interacted with
        public string ResourceType;
        
        public DynamicresourceCopyIdentifier()
        {
            this.Passive = false;
        }
    }
    
    /// A dynamic resource mutation request completed
    public sealed class DynamicresourceMutateResource : BaseTelemetryEvent
    {
        
        /// The result of the operation
        public Result Result;
        
        /// The dynamic resource type being interacted with
        public string ResourceType;
        
        /// The dynamic resource operation being executed
        public DynamicResourceOperation DynamicResourceOperation;
        
        public DynamicresourceMutateResource()
        {
            this.Passive = false;
        }
    }
    
    /// An experiment was activated or deactivated in the Toolkit
    public sealed class AwsExperimentActivation : BaseTelemetryEvent
    {
        
        /// The id of the experiment being activated or deactivated
        public string ExperimentId;
        
        /// The experiment action taken action taken
        public ExperimentState ExperimentState;
        
        public AwsExperimentActivation()
        {
            this.Passive = false;
        }
    }
    
    /// An external tool was installed automatically
    public sealed class AwsToolInstallation : BaseTelemetryEvent
    {
        
        /// The tool being installed
        public ToolId ToolId;
        
        /// The result of the operation
        public Result Result;
        
        public AwsToolInstallation()
        {
            this.Passive = true;
        }
    }
    
    /// An setting was changed by users in the Toolkit. This metric can optionally provide the new state of the setting via settingState.
    public sealed class AwsModifySetting : BaseTelemetryEvent
    {
        
        /// The id of the setting being changed. Consistent namespace should be used for the id, e.g. codewhisperer_autoSuggestionActivation
        public string SettingId;
        
        /// Optional - The state of the setting being changed to. This should not be recorded for free-form settings like file-system paths. Instead, stick to things like flags, numbers, and enums.
        public string SettingState;
        
        public AwsModifySetting()
        {
            this.Passive = false;
        }
    }
    
    /// User clicked/activated a UI element. This does not necessarily have to be an explicit mouse click. Any user action that has the same behavior as a mouse click can use this event.
    public sealed class UiClick : BaseTelemetryEvent
    {
        
        /// An identifier associated with a UI element
        public string ElementId;
        
        public UiClick()
        {
            this.Passive = false;
        }
    }
    
    /// User requested that a resource be opened in the browser using the deeplink service
    public sealed class DeeplinkOpen : BaseTelemetryEvent
    {
        
        /// The source of the operation
        public string Source;
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The name of the AWS service acted on. These values come from the AWS SDK. To find them in the JAVA SDK search for SERVICE_NAME in each service client, or look for serviceId in metadata in the service2.json
        public string ServiceType;
        
        public DeeplinkOpen()
        {
            this.Passive = true;
        }
    }
    
    /// Percentage of user tokens against suggestions until 5 mins of time
    public sealed class CodewhispererCodePercentage : BaseTelemetryEvent
    {
        
        /// The metrics accepted on suggested CodeWhisperer code
        public int CodewhispererAcceptedTokens;
        
        /// Programming language of the CodeWhisperer recommendation
        public CodewhispererLanguage CodewhispererLanguage;
        
        /// The percentage of acceptance on suggested CodeWhisperer code on the overall code
        public int CodewhispererPercentage;
        
        /// The metrics generated by the user and acceptance of suggested CodeWhisperer code in the language CodeWhisperer supports.
        public int CodewhispererTotalTokens;
        
        /// The user group identifier we assign to the customer and it should be unique identifier across different IDE platforms, i.e. Classifier, CrossFile etc.
        public string CodewhispererUserGroup;
        
        /// The number of successful operations
        public int SuccessCount;
        
        public CodewhispererCodePercentage()
        {
            this.Passive = true;
        }
    }
    
    /// Client side invocation of the CodeWhisperer Security Scan
    public sealed class CodewhispererSecurityScan : BaseTelemetryEvent
    {
        
        /// How many lines of code being sent for security scan
        public int CodewhispererCodeScanLines;
        
        /// Optional - The ID of the security scan job
        public string CodewhispererCodeScanJobId;
        
        /// Optional - The total size in bytes of customer project to perform security scan on
        public System.Double? CodewhispererCodeScanProjectBytes;
        
        /// The uncompressed payload size in bytes of the source files in customer project context sent for security scan
        public int CodewhispererCodeScanSrcPayloadBytes;
        
        /// Optional - The uncompressed payload size in bytes of the build files in customer project context sent for security scan
        public System.Int32? CodewhispererCodeScanBuildPayloadBytes;
        
        /// The compressed payload size of source files in bytes of customer project context sent for security scan
        public int CodewhispererCodeScanSrcZipFileBytes;
        
        /// Optional - The compressed payload size of built jars in bytes of customer project context sent for security scan. This is only applicable for Java project
        public System.Int32? CodewhispererCodeScanBuildZipFileBytes;
        
        /// The number of security issues been detected
        public int CodewhispererCodeScanTotalIssues;
        
        /// Programming language of the CodeWhisperer recommendation
        public CodewhispererLanguage CodewhispererLanguage;
        
        /// Time taken for context truncation in milliseconds
        public int ContextTruncationDuration;
        
        /// Time taken to fetch the upload URL and upload the artifacts in milliseconds
        public int ArtifactsUploadDuration;
        
        /// Time taken to invoke code scan service APIs in milliseconds
        public int CodeScanServiceInvocationsDuration;
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The start URL of current SSO connection
        public string CredentialStartUrl;
        
        public CodewhispererSecurityScan()
        {
            this.Passive = false;
        }
    }
    
    /// Client side invocation of the CodeWhisperer service for suggestion
    public sealed class CodewhispererServiceInvocation : BaseTelemetryEvent
    {
        
        /// Optional - The type of the Automated trigger to send request to CodeWhisperer service
        public CodewhispererAutomatedTriggerType? CodewhispererAutomatedTriggerType;
        
        /// Optional - Completion Type of the inference results returned from CodeWhisperer model layer
        public CodewhispererCompletionType? CodewhispererCompletionType;
        
        /// cursor location offset in the editor when invoking CodeWhisperer for recommendation
        public int CodewhispererCursorOffset;
        
        /// Programming language of the CodeWhisperer recommendation
        public CodewhispererLanguage CodewhispererLanguage;
        
        /// Optional - The last index of recommendation from a particular response
        public System.Int32? CodewhispererLastSuggestionIndex;
        
        /// The line number of the cursor when the event happens
        public int CodewhispererLineNumber;
        
        /// Optional - The ID of the request to CodeWhisperer service
        public string CodewhispererRequestId;
        
        /// Optional - the pre-defined set of values for runtime version of the language of CodeWhisperer recommendation
        public CodewhispererRuntime? CodewhispererRuntime;
        
        /// Optional - the original (free-text) of the runtime version of the language of CodeWhisperer recommendation
        public string CodewhispererRuntimeSource;
        
        /// Optional - The unique identifier for a CodeWhisperer session(which can contain multiple requests)
        public string CodewhispererSessionId;
        
        /// Optional - If the supplemental context fetching timeout or not
        public System.Boolean? CodewhispererSupplementalContextTimeout;
        
        /// Optional - If the supplemental context is for test file(UTG) or src file
        public System.Boolean? CodewhispererSupplementalContextIsUtg;
        
        /// Optional - Latency to obtain supplemental context
        public System.Double? CodewhispererSupplementalContextLatency;
        
        /// Optional - Length of codewhisperer supplemental context extracted from files
        public System.Int32? CodewhispererSupplementalContextLength;
        
        /// The type of the user trigger to send request to CodeWhisperer service
        public CodewhispererTriggerType CodewhispererTriggerType;
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - The start URL of current SSO connection
        public string CredentialStartUrl;
        
        /// Optional - Whether Import Recommendation is enabled.
        public System.Boolean? CodewhispererImportRecommendationEnabled;
        
        /// The user group identifier we assign to the customer and it should be unique identifier across different IDE platforms, i.e. Classifier, CrossFile etc.
        public string CodewhispererUserGroup;
        
        public CodewhispererServiceInvocation()
        {
            this.Passive = false;
        }
    }
    
    /// Client side invocation blocked by another invocation in progress
    public sealed class CodewhispererBlockedInvocation : BaseTelemetryEvent
    {
        
        /// Optional - The type of the Automated trigger to send request to CodeWhisperer service
        public CodewhispererAutomatedTriggerType? CodewhispererAutomatedTriggerType;
        
        /// cursor location offset in the editor when invoking CodeWhisperer for recommendation
        public int CodewhispererCursorOffset;
        
        /// Programming language of the CodeWhisperer recommendation
        public CodewhispererLanguage CodewhispererLanguage;
        
        /// The line number of the cursor when the event happens
        public int CodewhispererLineNumber;
        
        /// The type of the user trigger to send request to CodeWhisperer service
        public CodewhispererTriggerType CodewhispererTriggerType;
        
        /// Optional - The start URL of current SSO connection
        public string CredentialStartUrl;
        
        public CodewhispererBlockedInvocation()
        {
            this.Passive = false;
        }
    }
    
    /// User acceptance or rejection of each suggestion returned by the CodeWhisperer service request
    public sealed class CodewhispererUserDecision : BaseTelemetryEvent
    {
        
        /// Completion Type of the inference results returned from CodeWhisperer model layer
        public CodewhispererCompletionType CodewhispererCompletionType;
        
        /// Programming language of the CodeWhisperer recommendation
        public CodewhispererLanguage CodewhispererLanguage;
        
        /// Optional - The number of recommendations received so far when user makes a decision
        public System.Int32? CodewhispererPaginationProgress;
        
        /// The ID of the request to CodeWhisperer service
        public string CodewhispererRequestId;
        
        /// Optional - the pre-defined set of values for runtime version of the language of CodeWhisperer recommendation
        public CodewhispererRuntime? CodewhispererRuntime;
        
        /// Optional - the original (free-text) of the runtime version of the language of CodeWhisperer recommendation
        public string CodewhispererRuntimeSource;
        
        /// Optional - The unique identifier for a CodeWhisperer session(which can contain multiple requests)
        public string CodewhispererSessionId;
        
        /// The index for each suggestion, respectively, in the list of suggestions returned from service invocation
        public int CodewhispererSuggestionIndex;
        
        /// Number of references the particular suggestion is referenced with.
        public int CodewhispererSuggestionReferenceCount;
        
        /// Optional - The list of unique license names for a particular suggestion
        public string CodewhispererSuggestionReferences;
        
        /// Optional - The number of import statements included with recommendation.
        public System.Int32? CodewhispererSuggestionImportCount;
        
        /// User decision of each of the suggestion returned from CodeWhisperer
        public CodewhispererSuggestionState CodewhispererSuggestionState;
        
        /// Optional - If the supplemental context fetching timeout or not
        public System.Boolean? CodewhispererSupplementalContextTimeout;
        
        /// Optional - If the supplemental context is for test file(UTG) or src file
        public System.Boolean? CodewhispererSupplementalContextIsUtg;
        
        /// Optional - Length of codewhisperer supplemental context extracted from files
        public System.Int32? CodewhispererSupplementalContextLength;
        
        /// The type of the user trigger to send request to CodeWhisperer service
        public CodewhispererTriggerType CodewhispererTriggerType;
        
        /// Optional - The start URL of current SSO connection
        public string CredentialStartUrl;
        
        /// The user group identifier we assign to the customer and it should be unique identifier across different IDE platforms, i.e. Classifier, CrossFile etc.
        public string CodewhispererUserGroup;
        
        public CodewhispererUserDecision()
        {
            this.Passive = false;
        }
    }
    
    /// User decision aggregated at trigger level
    public sealed class CodewhispererUserTriggerDecision : BaseTelemetryEvent
    {
        
        /// Optional - The unique identifier for a CodeWhisperer session(which can contain multiple requests)
        public string CodewhispererSessionId;
        
        /// The request id of the first request in a paginated session.
        public string CodewhispererFirstRequestId;
        
        /// Optional - The start URL of current SSO connection
        public string CredentialStartUrl;
        
        /// Optional - If user has accepted only part of the recommendation or not.
        public System.Boolean? CodewhispererIsPartialAcceptance;
        
        /// Optional - The number of times the user accept part of the recommendations.
        public System.Int32? CodewhispererPartialAcceptanceCount;
        
        /// Optional - The number of characters user has accepted through partial acceptance.
        public System.Int32? CodewhispererCharactersAccepted;
        
        /// Optional - The number of characters originally recommended to the user in partial acceptance scenario.
        public System.Int32? CodewhispererCharactersRecommended;
        
        /// Completion Type of the inference results returned from CodeWhisperer model layer
        public CodewhispererCompletionType CodewhispererCompletionType;
        
        /// Programming language of the CodeWhisperer recommendation
        public CodewhispererLanguage CodewhispererLanguage;
        
        /// The type of the user trigger to send request to CodeWhisperer service
        public CodewhispererTriggerType CodewhispererTriggerType;
        
        /// Optional - The type of the Automated trigger to send request to CodeWhisperer service
        public CodewhispererAutomatedTriggerType? CodewhispererAutomatedTriggerType;
        
        /// The line number of the cursor when the event happens
        public int CodewhispererLineNumber;
        
        /// cursor location offset in the editor when invoking CodeWhisperer for recommendation
        public int CodewhispererCursorOffset;
        
        /// The total number of code suggestions in a paginated session.
        public int CodewhispererSuggestionCount;
        
        /// The number of import statements included with recommendation.
        public int CodewhispererSuggestionImportCount;
        
        /// Optional - The time that recommendations are shown to the user in a paginated session.
        public System.Double? CodewhispererTotalShownTime;
        
        /// Optional - The character that triggered recommendation for special characters trigger.
        public string CodewhispererTriggerCharacter;
        
        /// The length of additional characters inputted by the user since the invocation. 
        public int CodewhispererTypeaheadLength;
        
        /// Optional - The time from last document change to the current document change. 
        public System.Double? CodewhispererTimeSinceLastDocumentChange;
        
        /// Optional - The time from last user decision to current invocation. 
        public System.Double? CodewhispererTimeSinceLastUserDecision;
        
        /// Optional - The time from user trigger to the first recommendation is received. 
        public System.Double? CodewhispererTimeToFirstRecommendation;
        
        /// Optional - The aggregated user decision from previous trigger. 
        public CodewhispererPreviousSuggestionState? CodewhispererPreviousSuggestionState;
        
        /// User decision of each of the suggestion returned from CodeWhisperer
        public CodewhispererSuggestionState CodewhispererSuggestionState;
        
        /// Optional - The result from Classifier trigger.
        public System.Double? CodewhispererClassifierResult;
        
        /// Optional - If the supplemental context fetching timeout or not
        public System.Boolean? CodewhispererSupplementalContextTimeout;
        
        /// Optional - If the supplemental context is for test file(UTG) or src file
        public System.Boolean? CodewhispererSupplementalContextIsUtg;
        
        /// Optional - Length of codewhisperer supplemental context extracted from files
        public System.Int32? CodewhispererSupplementalContextLength;
        
        /// Optional - The threshold of Classifier trigger.
        public System.Double? CodewhispererClassifierThreshold;
        
        /// The user group identifier we assign to the customer and it should be unique identifier across different IDE platforms, i.e. Classifier, CrossFile etc.
        public string CodewhispererUserGroup;
        
        public CodewhispererUserTriggerDecision()
        {
            this.Passive = false;
        }
    }
    
    /// Percentage of user modifications for the selected suggestion until a fixed period of time
    public sealed class CodewhispererUserModification : BaseTelemetryEvent
    {
        
        /// Completion Type of the inference results returned from CodeWhisperer model layer
        public CodewhispererCompletionType CodewhispererCompletionType;
        
        /// Programming language of the CodeWhisperer recommendation
        public CodewhispererLanguage CodewhispererLanguage;
        
        /// The percentage of user modifications on the suggested code
        public double CodewhispererModificationPercentage;
        
        /// The ID of the request to CodeWhisperer service
        public string CodewhispererRequestId;
        
        /// Optional - the pre-defined set of values for runtime version of the language of CodeWhisperer recommendation
        public CodewhispererRuntime? CodewhispererRuntime;
        
        /// Optional - the original (free-text) of the runtime version of the language of CodeWhisperer recommendation
        public string CodewhispererRuntimeSource;
        
        /// Optional - The unique identifier for a CodeWhisperer session(which can contain multiple requests)
        public string CodewhispererSessionId;
        
        /// The index for each suggestion, respectively, in the list of suggestions returned from service invocation
        public int CodewhispererSuggestionIndex;
        
        /// The type of the user trigger to send request to CodeWhisperer service
        public CodewhispererTriggerType CodewhispererTriggerType;
        
        /// Optional - The start URL of current SSO connection
        public string CredentialStartUrl;
        
        /// The user group identifier we assign to the customer and it should be unique identifier across different IDE platforms, i.e. Classifier, CrossFile etc.
        public string CodewhispererUserGroup;
        
        public CodewhispererUserModification()
        {
            this.Passive = false;
        }
    }
    
    /// The duration from user last modification to the first recommendation shown in milliseconds
    public sealed class CodewhispererPerceivedLatency : BaseTelemetryEvent
    {
        
        /// The ID of the request to CodeWhisperer service
        public string CodewhispererRequestId;
        
        /// Optional - The unique identifier for a CodeWhisperer session(which can contain multiple requests)
        public string CodewhispererSessionId;
        
        /// The type of the user trigger to send request to CodeWhisperer service
        public CodewhispererTriggerType CodewhispererTriggerType;
        
        /// Completion Type of the inference results returned from CodeWhisperer model layer
        public CodewhispererCompletionType CodewhispererCompletionType;
        
        /// Programming language of the CodeWhisperer recommendation
        public CodewhispererLanguage CodewhispererLanguage;
        
        /// Optional - The start URL of current SSO connection
        public string CredentialStartUrl;
        
        /// The user group identifier we assign to the customer and it should be unique identifier across different IDE platforms, i.e. Classifier, CrossFile etc.
        public string CodewhispererUserGroup;
        
        public CodewhispererPerceivedLatency()
        {
            this.Passive = false;
        }
    }
    
    /// The latency from each CodeWhisperer components in milliseconds
    public sealed class CodewhispererClientComponentLatency : BaseTelemetryEvent
    {
        
        /// The ID of the request to CodeWhisperer service
        public string CodewhispererRequestId;
        
        /// The unique identifier for a CodeWhisperer session(which can contain multiple requests)
        public string CodewhispererSessionId;
        
        /// The time it takes for the plugin to make the first GenerateCompletions API call after the user performs the CW trigger action.
        public double CodewhispererPreprocessingLatency;
        
        /// The time it takes to get the Sono/SSO credential for the invocation.
        public double CodewhispererCredentialFetchingLatency;
        
        /// The time it takes for the first completions to be displayed in the IDE after the plugin receives the initial Completions object.
        public double CodewhispererPostprocessingLatency;
        
        /// The time it takes for the response to be received after the plugin makes a first GenerateCompletions API call.
        public double CodewhispererFirstCompletionLatency;
        
        /// The time it takes for the first completion to be shown in the IDE after the user performs the CW trigger action.
        public double CodewhispererEndToEndLatency;
        
        /// The time it takes for the last GenerateCompletions response to be received after plugin makes a first call to GenerateCompletions API.
        public double CodewhispererAllCompletionsLatency;
        
        /// Completion Type of the inference results returned from CodeWhisperer model layer
        public CodewhispererCompletionType CodewhispererCompletionType;
        
        /// The type of the user trigger to send request to CodeWhisperer service
        public CodewhispererTriggerType CodewhispererTriggerType;
        
        /// Programming language of the CodeWhisperer recommendation
        public CodewhispererLanguage CodewhispererLanguage;
        
        /// Optional - The start URL of current SSO connection
        public string CredentialStartUrl;
        
        /// The user group identifier we assign to the customer and it should be unique identifier across different IDE platforms, i.e. Classifier, CrossFile etc.
        public string CodewhispererUserGroup;
        
        public CodewhispererClientComponentLatency()
        {
            this.Passive = true;
        }
    }
    
    /// Create an Amazon CodeCatalyst Dev Environment
    public sealed class CodecatalystCreateDevEnvironment : BaseTelemetryEvent
    {
        
        /// Opaque AWS Builder ID identifier
        public string UserId;
        
        /// The result of the operation
        public Result Result;
        
        /// Optional - Type of Git repository provided to the Amazon CodeCatalyst dev environment create wizard
        public CodecatalystCreateDevEnvironmentRepoType? CodecatalystCreateDevEnvironmentRepoType;
        
        public CodecatalystCreateDevEnvironment()
        {
            this.Passive = false;
        }
    }
    
    /// Update properties of a Amazon CodeCatalyst Dev Environment
    public sealed class CodecatalystUpdateDevEnvironmentSettings : BaseTelemetryEvent
    {
        
        /// Opaque AWS Builder ID identifier
        public string UserId;
        
        /// The result of the operation
        public Result Result;
        
        /// Locality of the Amazon CodeCatalyst update dev environment request (i.e., from the thin client or the local IDE instance)
        public CodecatalystUpdateDevEnvironmentLocationType CodecatalystUpdateDevEnvironmentLocationType;
        
        public CodecatalystUpdateDevEnvironmentSettings()
        {
            this.Passive = false;
        }
    }
    
    /// Trigger a devfile update on a Amazon CodeCatalyst dev environment
    public sealed class CodecatalystUpdateDevfile : BaseTelemetryEvent
    {
        
        /// Opaque AWS Builder ID identifier
        public string UserId;
        
        /// The result of the operation
        public Result Result;
        
        public CodecatalystUpdateDevfile()
        {
            this.Passive = false;
        }
    }
    
    /// Clone a Amazon CodeCatalyst code repository locally
    public sealed class CodecatalystLocalClone : BaseTelemetryEvent
    {
        
        /// Opaque AWS Builder ID identifier
        public string UserId;
        
        /// The result of the operation
        public Result Result;
        
        public CodecatalystLocalClone()
        {
            this.Passive = false;
        }
    }
    
    /// Connect to a Amazon CodeCatalyst dev environment
    public sealed class CodecatalystConnect : BaseTelemetryEvent
    {
        
        /// Opaque AWS Builder ID identifier
        public string UserId;
        
        /// The result of the operation
        public Result Result;
        
        public CodecatalystConnect()
        {
            this.Passive = false;
        }
    }
    
    /// Workflow statistic for connecting to a dev environment
    public sealed class CodecatalystDevEnvironmentWorkflowStatistic : BaseTelemetryEvent
    {
        
        /// Opaque AWS Builder ID identifier
        public string UserId;
        
        /// The result of the operation
        public Result Result;
        
        /// Workflow step name
        public string CodecatalystDevEnvironmentWorkflowStep;
        
        /// Optional - Workflow error name
        public string CodecatalystDevEnvironmentWorkflowError;
        
        public CodecatalystDevEnvironmentWorkflowStatistic()
        {
            this.Passive = true;
        }
    }
}