コード例 #1
0
        static void Main(string[] args)
        {
            // Create a LoggerFactory responsible for internal logging
            var loggerFactory = LoggerFactory.Create(builder => builder
                                                     .SetMinimumLevel(LogLevel.Debug)
                                                     .AddConsole());

            var logger = loggerFactory.CreateLogger("Main");

            // Manually setup the configuration for the library
            var configuration = new Configuration
            {
                ServiceName         = "DemoApp",
                ServiceType         = "ConsoleApp",
                LogGroupName        = "DemoApp",
                EnvironmentOverride = Environments.EC2,
                AgentEndPoint       = "tcp://127.0.0.1:25888"
            };

            // create the logger using a DefaultEnvironment which will write over TCP
            var environment = new DefaultEnvironment(configuration, loggerFactory);
            var metrics     = new MetricsLogger(environment, loggerFactory);

            for (int i = 0; i < 10; i++)
            {
                EmitMetrics(logger, metrics);
            }

            logger.LogInformation("Shutting down");

            environment.Sink.Shutdown().Wait(TimeSpan.FromSeconds(120));
        }
コード例 #2
0
        /// <summary>
        /// A simple function that takes a string and does a ToUpper
        /// </summary>
        /// <param name="input"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public string FunctionHandler(string input, ILambdaContext context)
        {
            var envProvider  = new EnvironmentProvider(EnvironmentConfigurationProvider.Config, new ResourceFetcher());
            var logger       = new MetricsLogger();
            var dimensionSet = new DimensionSet();

            dimensionSet.AddDimension("Service", "Aggregator");
            dimensionSet.AddDimension("Region", "us-west-2");
            logger.PutDimensions(dimensionSet);
            logger.SetNamespace("EMFLambda");
            logger.PutMetric("ProcessingLatency", 101, Unit.MILLISECONDS);
            logger.PutMetric("ProcessingLatency", 100, Unit.MILLISECONDS);
            logger.PutMetric("ProcessingLatency", 99, Unit.MILLISECONDS);
            logger.PutMetric("Count", 3, Unit.COUNT);
            logger.PutProperty("AccountId", "123456789");
            logger.PutProperty("RequestId", "422b1569-16f6-4a03-b8f0-fe3fd9b100f8");
            logger.PutProperty("DeviceId", "61270781-c6ac-46f1-baf7-22c808af8162");
            Dictionary <string, object> payLoad = new Dictionary <string, object>
            {
                { "sampleTime", 123456789 },
                { "temperature", 273.0 },
                { "pressure", 101.3 }
            };

            logger.PutProperty("Payload", payLoad);
            logger.Flush();
            return(input?.ToUpper());
        }
コード例 #3
0
        private RunDependencies CreateDependencies(TraceLevel traceLevel = TraceLevel.Info, IScriptHostEnvironment environment = null)
        {
            var dependencies = new RunDependencies();

            var functionTraceWriter     = new TestTraceWriter(System.Diagnostics.TraceLevel.Verbose);
            var traceWriter             = new TestTraceWriter(System.Diagnostics.TraceLevel.Verbose);
            var scriptHostConfiguration = new ScriptHostConfiguration
            {
                HostConfig          = new JobHostConfiguration(),
                TraceWriter         = traceWriter,
                FileLoggingMode     = FileLoggingMode.Always,
                FileWatchingEnabled = true
            };

            scriptHostConfiguration.HostConfig.Tracing.ConsoleLevel = System.Diagnostics.TraceLevel.Verbose;
            var eventManager = new ScriptEventManager();
            var host         = new Mock <ScriptHost>(environment ?? new NullScriptHostEnvironment(), eventManager, scriptHostConfiguration, null, null);

            var traceWriterFactory = new Mock <IFunctionTraceWriterFactory>();

            traceWriterFactory.Setup(f => f.Create(It.IsAny <string>(), null))
            .Returns(functionTraceWriter);

            host.SetupGet(h => h.IsPrimary).Returns(true);
            host.SetupGet(h => h.FunctionTraceWriterFactory).Returns(traceWriterFactory.Object);

            var entrypointResolver = new Mock <IFunctionEntryPointResolver>();

            var compilation = new Mock <IDotNetCompilation>();

            compilation.Setup(c => c.GetDiagnostics())
            .Returns(ImmutableArray <Diagnostic> .Empty);

            var compilationService = new Mock <ICompilationService <IDotNetCompilation> >();

            compilationService.Setup(s => s.SupportedFileTypes)
            .Returns(() => new[] { ".csx" });
            compilationService.Setup(s => s.GetFunctionCompilationAsync(It.IsAny <FunctionMetadata>()))
            .ReturnsAsync(compilation.Object);

            var compilationServiceFactory = new Mock <ICompilationServiceFactory <ICompilationService <IDotNetCompilation>, IFunctionMetadataResolver> >();

            compilationServiceFactory.Setup(f => f.CreateService(ScriptType.CSharp, It.IsAny <IFunctionMetadataResolver>()))
            .Returns(compilationService.Object);

            var metricsLogger = new MetricsLogger();

            scriptHostConfiguration.HostConfig.AddService <IMetricsLogger>(metricsLogger);

            return(new RunDependencies
            {
                Host = host,
                EntrypointResolver = entrypointResolver,
                Compilation = compilation,
                CompilationService = compilationService,
                CompilationServiceFactory = compilationServiceFactory,
                TraceWriterFactory = traceWriterFactory,
                TraceWriter = functionTraceWriter
            });
        }
コード例 #4
0
ファイル: GameSettings.cs プロジェクト: mecha-rm/GDW_Y3-PJT
    // saves the game settings
    public void SaveSettings()
    {
        // uses the metric logger to save the settings
        MetricsLogger prefLog = new MetricsLogger();

        // adjusts the volume
        // TODO: maybe move this function or put it into this game settings file.
        SettingsInterface.AdjustVolume();

        // Saving Content to Fle
        // sets the logger file
        prefLog.SetLoggerFile(FILE_NAME);

        // TODO: add function to metrics to see if the file exists.
        // see what happens if the file isn't there.

        // adds the contents
        // master volume
        prefLog.AddMetricToLogger(LBL_MASTER_VOL, masterVolume);

        // bgm volume
        prefLog.AddMetricToLogger(LBL_BGM_VOL, bgmVolume);

        // sound effects
        prefLog.AddMetricToLogger(LBL_SFX_VOL, sfxVolume);

        // saves the data
        prefLog.SaveMetrics();
    }
コード例 #5
0
ファイル: GameSettings.cs プロジェクト: mecha-rm/GDW_Y3-PJT
    // loads the game settings
    public void LoadSettings()
    {
        MetricsLogger prefLog = new MetricsLogger();

        // sets the logger file
        prefLog.SetLoggerFile(FILE_NAME);
        prefLog.LoadMetrics();

        // get the contents
        float value;

        // master volume
        value = prefLog.GetMetricFromLogger(LBL_MASTER_VOL);
        SetMasterVolume(value);

        // bgm
        value = prefLog.GetMetricFromLogger(LBL_BGM_VOL);
        SetBgmVolume(value);

        // sound effects
        value = prefLog.GetMetricFromLogger(LBL_SFX_VOL);
        SetSfxVolume(value);

        // adjust all volume settings
        SettingsInterface.AdjustVolume();
    }
コード例 #6
0
        // TODO: DI (FACAVAL) Use test helpers to create host and inject services
        private RunDependencies CreateDependencies(Action <IServiceCollection> configureServices = null)
        {
            var dependencies = new RunDependencies();

            TestLoggerProvider loggerProvider = new TestLoggerProvider();
            ILoggerFactory     loggerFactory  = new LoggerFactory();

            loggerFactory.AddProvider(loggerProvider);

            var eventManager       = new ScriptEventManager();
            var entrypointResolver = new Mock <IFunctionEntryPointResolver>();

            var compilation = new Mock <IDotNetCompilation>();

            compilation.Setup(c => c.GetDiagnostics())
            .Returns(ImmutableArray <Diagnostic> .Empty);

            var compilationService = new Mock <ICompilationService <IDotNetCompilation> >();

            compilationService.Setup(s => s.SupportedFileTypes)
            .Returns(() => new[] { ".csx" });
            compilationService.Setup(s => s.GetFunctionCompilationAsync(It.IsAny <FunctionMetadata>()))
            .ReturnsAsync(compilation.Object);

            var compilationServiceFactory = new Mock <ICompilationServiceFactory <ICompilationService <IDotNetCompilation>, IFunctionMetadataResolver> >();

            compilationServiceFactory.Setup(f => f.CreateService(DotNetScriptTypes.CSharp, It.IsAny <IFunctionMetadataResolver>()))
            .Returns(compilationService.Object);

            var metricsLogger = new MetricsLogger();

            var hostBuilder = new HostBuilder()
                              .ConfigureDefaultTestWebScriptHost(o =>
            {
                o.ScriptPath = TestHelpers.FunctionsTestDirectory;
                o.LogPath    = TestHelpers.GetHostLogFileDirectory().Parent.FullName;
            });

            if (configureServices != null)
            {
                hostBuilder.ConfigureServices(configureServices);
            }

            var host = hostBuilder.Build();

            var scriptHost = host.GetScriptHost();

            return(new RunDependencies
            {
                Host = scriptHost,
                EntrypointResolver = entrypointResolver,
                Compilation = compilation,
                CompilationService = compilationService,
                CompilationServiceFactory = compilationServiceFactory,
                LoggerProvider = loggerProvider,
                LoggerFactory = loggerFactory,
                MetricsLogger = metricsLogger
            });
        }
コード例 #7
0
        private void LogMetric(String metricName)
        {
            MetricsLogger logger = new MetricsLogger(new EnvironmentProvider(EnvironmentConfigurationProvider.Config, new ResourceFetcher()), NullLoggerFactory.Instance);

            logger.PutDimensions(_dimensions);
            logger.PutMetric(metricName, 100, Unit.MILLISECONDS);
            logger.Flush();
        }
コード例 #8
0
        private RunDependencies CreateDependencies(IScriptHostEnvironment environment = null)
        {
            var dependencies = new RunDependencies();

            var scriptHostConfiguration = new ScriptHostConfiguration
            {
                HostConfig          = new JobHostConfiguration(),
                FileLoggingMode     = FileLoggingMode.Always,
                FileWatchingEnabled = true,
                BindingProviders    = new List <ScriptBindingProvider>()
            };

            TestLoggerProvider loggerProvider = new TestLoggerProvider();
            ILoggerFactory     loggerFactory  = new LoggerFactory();

            loggerFactory.AddProvider(loggerProvider);
            scriptHostConfiguration.HostConfig.LoggerFactory = loggerFactory;

            var eventManager = new ScriptEventManager();

            var host = new Mock <ScriptHost>(environment ?? new NullScriptHostEnvironment(), eventManager, scriptHostConfiguration, null, null, null);

            host.CallBase = true;

            host.SetupGet(h => h.IsPrimary).Returns(true);
            var entrypointResolver = new Mock <IFunctionEntryPointResolver>();

            var compilation = new Mock <IDotNetCompilation>();

            compilation.Setup(c => c.GetDiagnostics())
            .Returns(ImmutableArray <Diagnostic> .Empty);

            var compilationService = new Mock <ICompilationService <IDotNetCompilation> >();

            compilationService.Setup(s => s.SupportedFileTypes)
            .Returns(() => new[] { ".csx" });
            compilationService.Setup(s => s.GetFunctionCompilationAsync(It.IsAny <FunctionMetadata>()))
            .ReturnsAsync(compilation.Object);

            var compilationServiceFactory = new Mock <ICompilationServiceFactory <ICompilationService <IDotNetCompilation>, IFunctionMetadataResolver> >();

            compilationServiceFactory.Setup(f => f.CreateService(ScriptType.CSharp, It.IsAny <IFunctionMetadataResolver>()))
            .Returns(compilationService.Object);

            var metricsLogger = new MetricsLogger();

            scriptHostConfiguration.HostConfig.AddService <IMetricsLogger>(metricsLogger);

            return(new RunDependencies
            {
                Host = host,
                EntrypointResolver = entrypointResolver,
                Compilation = compilation,
                CompilationService = compilationService,
                CompilationServiceFactory = compilationServiceFactory,
                LoggerProvider = loggerProvider
            });
        }
コード例 #9
0
 public DynamicServiceReporter(IMetricsRegistry registry,
   ZmqContext context, IRubyServiceHost service_host) {
   service_host_ = service_host;
   reporter_ = new NopMetricsReporter();
   period_ = 5;
   period_unit_ = TimeUnit.Seconds;
   registry_ = registry;
   logger_ = MetricsLogger.ForCurrentProcess;
   context_ = context;
 }
コード例 #10
0
        static void Main(string[] args)
        {
            var init = true;

            var configuration = new Configuration
            {
                LogGroupName        = "/Canary/Dotnet/CloudWatchAgent/Metrics",
                EnvironmentOverride = Environments.ECS,
                AgentEndPoint       = "tcp://127.0.0.1:25888"
            };

            var loggerFactory = LoggerFactory.Create(builder =>
                                                     builder
                                                     .SetMinimumLevel(LogLevel.Information)
                                                     .AddConsole());

            EnvironmentConfigurationProvider.Config = configuration;

            // get the assembly version (this does not reflect NuGet pre-releases)
            var packageVersion = GetPackageVersion();

            while (true)
            {
                using (var logger = new MetricsLogger(loggerFactory))
                {
                    logger.SetNamespace("Canary");

                    var dimensionSet = new DimensionSet();
                    dimensionSet.AddDimension("Runtime", "Dotnet");
                    dimensionSet.AddDimension("Platform", "ECS");
                    dimensionSet.AddDimension("Agent", "CloudWatchAgent");
                    dimensionSet.AddDimension("Version", packageVersion);
                    logger.SetDimensions(dimensionSet);

                    using (var currentProcess = System.Diagnostics.Process.GetCurrentProcess())
                    {
                        // https://github.com/dotnet/corefx/blob/3633ea2c6bf9d52029681efeedd84fd7a06eb6ba/src/System.Diagnostics.Process/src/System/Diagnostics/ProcessManager.Linux.cs#L137
                        logger.PutMetric("Memory.RSS", currentProcess.WorkingSet64, Unit.BYTES);
                    }

                    logger.PutMetric("Invoke", 1, Unit.NONE);

                    if (init)
                    {
                        init = false;
                        logger.PutMetric("Init", 1, Unit.NONE);
                    }

                    logger.PutMetric("Memory.HeapUsed", GC.GetTotalMemory(false), Unit.BYTES);
                }
                Thread.Sleep(1_000);
            }
        }
コード例 #11
0
 void Awake()
 {
     if (_instance == null)
     { // gameobject was created in editor
         _instance = this;
         DontDestroyOnLoad(this.gameObject);
     }
     else if (_instance != this)
     { // duplicate gameobject not needed
         DestroyImmediate(this.gameObject);
     }
 }
コード例 #12
0
        public MetricsLoggerTests()
        {
            _fixture             = new Fixture().Customize(new AutoNSubstituteCustomization());
            _logger              = _fixture.Create <ILoggerFactory>();
            _environment         = _fixture.Create <IEnvironment>();
            _environmentProvider = _fixture.Create <IEnvironmentProvider>();

            _sink = new MockSink();
            _environment.Sink.Returns(_sink);
            _environmentProvider.ResolveEnvironment().Returns(_environment);

            _metricsLogger = new MetricsLogger(_environmentProvider, _logger);
        }
コード例 #13
0
        public void TestFlushWithDefaultDimensionDefined()
        {
            MetricsContext metricsContext = new MetricsContext();

            metricsContext.DefaultDimensions.Dimensions.Add("foo", "bar");
            _metricsLogger = new MetricsLogger(_environment, metricsContext, _logger);
            string logGroup = "TestLogGroup";

            _environment.LogGroupName.Returns(logGroup);
            _metricsLogger.Flush();

            ExpectDimension("foo", "bar");
            ExpectDimension("LogGroup", null);
        }
コード例 #14
0
 public void Init(TracingOptions options)
 {
     Options = options;
     if (Options.Enabled)
     {
         var logger = new MetricsLogger();
         TraceManager.SamplingRate = Options.Rate;
         TraceManager.RegisterTracer(new ZipkinTracer(new HttpZipkinSender(Options.TraceEndpoint, "application/json"), new JSONSpanSerializer(), new Statistics()));
         TraceManager.Start(logger);
     }
     LogManager.Configuration.AddTarget(new ZipkinLogTarget());
     LogManager.Configuration.AddRule(LogLevel.Warn, LogLevel.Error, nameof(ZipkinLogTarget));
     LogManager.ReconfigExistingLoggers();
 }
コード例 #15
0
        public static void InitProviders(NetworkSettings settings, string tag)
        {
            RouterProvider     = new RouterProvider(settings);
            ConnectionProvider = new ConnectionProvider(settings);
            NodeProvider       = new NodeProvider(settings);
            ConnectionProvider.GenerateConnections();

            Tag = tag;
            var dbProvider = new InfluxDBProvider(tag);

            MetricsLogger = new MetricsLogger(dbProvider);

            MessagesDeliverFailed = 0;
            MessagesUnDelivered   = settings.MessagesSettings.Quantity;
        }
コード例 #16
0
        public void TestOverrideDefaultDimensions()
        {
            var dimensionName   = "dim";
            var dimensionValue  = "dimValue";
            var defaultDimName  = "defaultDim";
            var defaultDimValue = "defaultDimValue";

            MetricsContext metricsContext = new MetricsContext();

            metricsContext.DefaultDimensions.AddDimension(defaultDimName, defaultDimValue);
            metricsContext.SetDimensions(new DimensionSet(defaultDimName, defaultDimValue));

            _metricsLogger = new MetricsLogger(_environment, metricsContext, _logger);
            _metricsLogger.SetDimensions(new DimensionSet(dimensionName, dimensionValue));
            _metricsLogger.Flush();

            Assert.Single(_sink.MetricsContext.GetAllDimensionSets());
            Assert.Null(_sink.MetricsContext.GetAllDimensionSets()[0].GetDimensionValue(defaultDimName));
        }
コード例 #17
0
    // the amount of steps that have been completed.
    // private int stepsCompleted = 0;

    // destroys steps upon completing them.
    // public bool destroySteps = true;

    // Start is called before the first frame update
    void Start()
    {
        // creates metric logger
        if (logMetrics && logger == null)
        {
            logger = new MetricsLogger();
        }

        // starts the first step if there are steps
        if (activeList && steps.Count > 0)
        {
            steps[currentStep].OnStepActivation();
        }

        // checks to see if the step list is active.
        if (stepList != null)
        {
            // gets the text object.
            if (stepList == null)
            {
                stepListText = stepList.GetComponent <Text>();
            }

            // starts list
            RefreshStepList();
        }

        // if step children should be added.
        if (addStepChildren)
        {
            List <Step> childSteps = new List <Step>();
            GetComponentsInChildren <Step>(true, childSteps);
            steps.AddRange(childSteps);
        }

        // adds checklist to step
        foreach (Step step in steps)
        {
            step.checklist = this;
        }
    }
コード例 #18
0
        protected virtual void Initialize()
        {
            string hostLogPath = Path.Combine(ScriptConfig.RootLogPath, "Host");

            FileUtility.EnsureDirectoryExists(hostLogPath);
            string debugSentinelFileName = Path.Combine(hostLogPath, ScriptConstants.DebugSentinelFileName);

            this.LastDebugNotify = File.GetLastWriteTime(debugSentinelFileName);

            IMetricsLogger metricsLogger = ScriptConfig.HostConfig.GetService <IMetricsLogger>();

            if (metricsLogger == null)
            {
                metricsLogger = new MetricsLogger();
                ScriptConfig.HostConfig.AddService <IMetricsLogger>(metricsLogger);
            }

            using (metricsLogger.LatencyEvent(MetricEventNames.HostStartupLatency))
            {
                // read host.json and apply to JobHostConfiguration
                string hostConfigFilePath = Path.Combine(ScriptConfig.RootScriptPath, ScriptConstants.HostMetadataFileName);

                // If it doesn't exist, create an empty JSON file
                if (!File.Exists(hostConfigFilePath))
                {
                    File.WriteAllText(hostConfigFilePath, "{}");
                }

                if (ScriptConfig.HostConfig.IsDevelopment || InDebugMode)
                {
                    // If we're in debug/development mode, use optimal debug settings
                    ScriptConfig.HostConfig.UseDevelopmentSettings();
                }

                string  json = File.ReadAllText(hostConfigFilePath);
                JObject hostConfig;
                try
                {
                    hostConfig = JObject.Parse(json);
                }
                catch (JsonException ex)
                {
                    throw new FormatException(string.Format("Unable to parse {0} file.", ScriptConstants.HostMetadataFileName), ex);
                }

                ApplyConfiguration(hostConfig, ScriptConfig);

                // Set up a host level TraceMonitor that will receive notification
                // of ALL errors that occur. This allows us to inspect/log errors.
                var traceMonitor = new TraceMonitor()
                                   .Filter(p => { return(true); })
                                   .Subscribe(HandleHostError);
                ScriptConfig.HostConfig.Tracing.Tracers.Add(traceMonitor);

                TraceLevel hostTraceLevel = ScriptConfig.HostConfig.Tracing.ConsoleLevel;
                if (ScriptConfig.FileLoggingMode != FileLoggingMode.Never)
                {
                    // Host file logging is only done conditionally
                    string      hostLogFilePath = Path.Combine(ScriptConfig.RootLogPath, "Host");
                    TraceWriter fileTraceWriter = new FileTraceWriter(hostLogFilePath, hostTraceLevel).Conditional(p => FileLoggingEnabled);

                    if (TraceWriter != null)
                    {
                        // create a composite writer so our host logs are written to both
                        TraceWriter = new CompositeTraceWriter(new[] { TraceWriter, fileTraceWriter });
                    }
                    else
                    {
                        TraceWriter = fileTraceWriter;
                    }
                }

                if (TraceWriter != null)
                {
                    ScriptConfig.HostConfig.Tracing.Tracers.Add(TraceWriter);
                }
                else
                {
                    // if no TraceWriter has been configured, default it to Console
                    TraceWriter = new ConsoleTraceWriter(hostTraceLevel);
                }

                _debugModeFileWatcher = new AutoRecoveringFileSystemWatcher(hostLogPath, ScriptConstants.DebugSentinelFileName,
                                                                            includeSubdirectories: false, changeTypes: WatcherChangeTypes.Created | WatcherChangeTypes.Changed);

                _debugModeFileWatcher.Changed += OnDebugModeFileChanged;

                var storageString = AmbientConnectionStringProvider.Instance.GetConnectionString(ConnectionStringNames.Storage);
                Task <BlobLeaseManager> blobManagerCreation = null;
                if (storageString == null)
                {
                    // Disable core storage
                    ScriptConfig.HostConfig.StorageConnectionString = null;
                    blobManagerCreation = Task.FromResult <BlobLeaseManager>(null);
                }
                else
                {
                    blobManagerCreation = BlobLeaseManager.CreateAsync(storageString, TimeSpan.FromSeconds(15), ScriptConfig.HostConfig.HostId, InstanceId, TraceWriter);
                }

                var bindingProviders = LoadBindingProviders(ScriptConfig, hostConfig, TraceWriter);
                ScriptConfig.BindingProviders = bindingProviders;

                TraceWriter.Info(string.Format(CultureInfo.InvariantCulture, "Reading host configuration file '{0}'", hostConfigFilePath));

                if (ScriptConfig.FileWatchingEnabled)
                {
                    _scriptFileWatcher = new AutoRecoveringFileSystemWatcher(ScriptConfig.RootScriptPath);

                    _scriptFileWatcher.Changed += OnFileChanged;
                }

                // If a file change should result in a restart, we debounce the event to
                // ensure that only a single restart is triggered within a specific time window.
                // This allows us to deal with a large set of file change events that might
                // result from a bulk copy/unzip operation. In such cases, we only want to
                // restart after ALL the operations are complete and there is a quiet period.
                _restart = (e) =>
                {
                    TraceWriter.Info(string.Format(CultureInfo.InvariantCulture, "File change of type '{0}' detected for '{1}'", e.ChangeType, e.FullPath));
                    TraceWriter.Info("Host configuration has changed. Signaling restart.");
                    RestartHost();
                };
                _restart = _restart.Debounce(500);

                // take a snapshot so we can detect function additions/removals
                _directoryCountSnapshot = Directory.EnumerateDirectories(ScriptConfig.RootScriptPath).Count();

                List <FunctionDescriptorProvider> descriptionProviders = new List <FunctionDescriptorProvider>()
                {
                    new ScriptFunctionDescriptorProvider(this, ScriptConfig),
                    new NodeFunctionDescriptorProvider(this, ScriptConfig),
                    new DotNetFunctionDescriptorProvider(this, ScriptConfig),
                    new PowerShellFunctionDescriptorProvider(this, ScriptConfig)
                };

                // Allow BindingProviders to initialize
                foreach (var bindingProvider in ScriptConfig.BindingProviders)
                {
                    try
                    {
                        bindingProvider.Initialize();
                    }
                    catch (Exception ex)
                    {
                        // If we're unable to initialize a binding provider for any reason, log the error
                        // and continue
                        TraceWriter.Error(string.Format("Error initializing binding provider '{0}'", bindingProvider.GetType().FullName), ex);
                    }
                }

                // Create the lease manager that will keep handle the primary host blob lease acquisition and renewal
                // and subscribe for change notifications.
                _blobLeaseManager = blobManagerCreation.GetAwaiter().GetResult();
                if (_blobLeaseManager != null)
                {
                    _blobLeaseManager.HasLeaseChanged += BlobLeaseManagerHasLeaseChanged;
                }

                // read all script functions and apply to JobHostConfiguration
                Collection <FunctionDescriptor>     functions      = ReadFunctions(descriptionProviders);
                Collection <CustomAttributeBuilder> typeAttributes = CreateTypeAttributes(ScriptConfig);
                string defaultNamespace = "Host";
                string typeName         = string.Format(CultureInfo.InvariantCulture, "{0}.{1}", defaultNamespace, "Functions");
                TraceWriter.Info(string.Format(CultureInfo.InvariantCulture, "Generating {0} job function(s)", functions.Count));
                Type        type  = FunctionGenerator.Generate(HostAssemblyName, typeName, typeAttributes, functions);
                List <Type> types = new List <Type>();
                types.Add(type);

                ScriptConfig.HostConfig.TypeLocator = new TypeLocator(types);

                Functions = functions;

                if (ScriptConfig.FileLoggingMode != FileLoggingMode.Never)
                {
                    PurgeOldLogDirectories();
                }
            }
        }