// Specify the "builtin binding types". These are types that are directly accesible without needing an explicit load gesture.
        // This is the set of bindings we shipped prior to binding extensibility.
        // Map from BindingType to the Assembly Qualified Type name for its IExtensionConfigProvider object.

        public ScriptHost(IOptions <JobHostOptions> options,
                          IOptions <LanguageWorkerOptions> languageWorkerOptions,
                          IEnvironment environment,
                          IJobHostContextFactory jobHostContextFactory,
                          IConfiguration configuration,
                          IDistributedLockManager distributedLockManager,
                          IScriptEventManager eventManager,
                          ILoggerFactory loggerFactory,
                          IFunctionMetadataManager functionMetadataManager,
                          IProxyMetadataManager proxyMetadataManager,
                          IMetricsLogger metricsLogger,
                          IOptions <ScriptJobHostOptions> scriptHostOptions,
                          ITypeLocator typeLocator,
                          IScriptJobHostEnvironment scriptHostEnvironment,
                          IDebugStateProvider debugManager,
                          IEnumerable <IScriptBindingProvider> bindingProviders,
                          IPrimaryHostStateProvider primaryHostStateProvider,
                          IJobHostMetadataProvider metadataProvider,
                          IHostIdProvider hostIdProvider,
                          ScriptSettingsManager settingsManager = null)
            : base(options, jobHostContextFactory)
        {
            _environment = environment;
            _typeLocator = typeLocator as ScriptTypeLocator
                           ?? throw new ArgumentException(nameof(typeLocator), $"A {nameof(ScriptTypeLocator)} instance is required.");

            _instanceId              = Guid.NewGuid().ToString();
            _hostOptions             = options;
            _configuration           = configuration;
            _storageConnectionString = configuration.GetWebJobsConnectionString(ConnectionStringNames.Storage);
            _distributedLockManager  = distributedLockManager;
            _functionMetadataManager = functionMetadataManager;
            _hostIdProvider          = hostIdProvider;
            _proxyMetadataManager    = proxyMetadataManager;
            _workerConfigs           = languageWorkerOptions.Value.WorkerConfigs;

            ScriptOptions          = scriptHostOptions.Value;
            _scriptHostEnvironment = scriptHostEnvironment;
            FunctionErrors         = new Dictionary <string, ICollection <string> >(StringComparer.OrdinalIgnoreCase);

            EventManager = eventManager;

            _settingsManager = settingsManager ?? ScriptSettingsManager.Instance;

            _metricsLogger = metricsLogger;

            _hostLogPath = Path.Combine(ScriptOptions.RootLogPath, "Host");

            _currentRuntimelanguage = _environment.GetEnvironmentVariable(LanguageWorkerConstants.FunctionWorkerRuntimeSettingName);

            _loggerFactory = loggerFactory;
            _logger        = loggerFactory.CreateLogger(LogCategories.Startup);
            Logger         = _logger;

            _debugManager             = debugManager;
            _primaryHostStateProvider = primaryHostStateProvider;
            _bindingProviders         = new List <IScriptBindingProvider>(bindingProviders);
            _metadataProvider         = metadataProvider;
        }
Exemple #2
0
        public static bool IsEnvironment(this IScriptJobHostEnvironment environment, string environmentName)
        {
            if (environment == null)
            {
                throw new ArgumentNullException(nameof(environment));
            }

            return(string.Equals(environment.EnvironmentName, environmentName, StringComparison.OrdinalIgnoreCase));
        }
Exemple #3
0
        public static bool IsDevelopment(this IScriptJobHostEnvironment environment)
        {
            if (environment == null)
            {
                throw new ArgumentNullException(nameof(environment));
            }

            return(environment.IsEnvironment(EnvironmentName.Development));
        }
        public FunctionDispatcher(IOptions <ScriptJobHostOptions> scriptHostOptions,
                                  IMetricsLogger metricsLogger,
                                  IEnvironment environment,
                                  IScriptJobHostEnvironment scriptJobHostEnvironment,
                                  IScriptEventManager eventManager,
                                  ILoggerFactory loggerFactory,
                                  ILanguageWorkerChannelFactory languageWorkerChannelFactory,
                                  IOptions <LanguageWorkerOptions> languageWorkerOptions,
                                  IWebHostLanguageWorkerChannelManager webHostLanguageWorkerChannelManager,
                                  IJobHostLanguageWorkerChannelManager jobHostLanguageWorkerChannelManager,
                                  IOptions <ManagedDependencyOptions> managedDependencyOptions,
                                  IFunctionDispatcherLoadBalancer functionDispatcherLoadBalancer)
        {
            _metricsLogger                       = metricsLogger;
            _scriptOptions                       = scriptHostOptions.Value;
            _environment                         = environment;
            _scriptJobHostEnvironment            = scriptJobHostEnvironment;
            _webHostLanguageWorkerChannelManager = webHostLanguageWorkerChannelManager;
            _jobHostLanguageWorkerChannelManager = jobHostLanguageWorkerChannelManager;
            _eventManager                        = eventManager;
            _workerConfigs                       = languageWorkerOptions.Value.WorkerConfigs;
            _managedDependencyOptions            = managedDependencyOptions;
            _logger = loggerFactory.CreateLogger <FunctionDispatcher>();
            _languageWorkerChannelFactory = languageWorkerChannelFactory;
            _workerRuntime = _environment.GetEnvironmentVariable(LanguageWorkerConstants.FunctionWorkerRuntimeSettingName);

            var processCount = _environment.GetEnvironmentVariable(LanguageWorkerConstants.FunctionsWorkerProcessCountSettingName);

            _maxProcessCount = (processCount != null && int.Parse(processCount) > 1) ? int.Parse(processCount) : 1;
            _maxProcessCount = _maxProcessCount > _maxAllowedProcessCount ? _maxAllowedProcessCount : _maxProcessCount;
            _functionDispatcherLoadBalancer = functionDispatcherLoadBalancer;

            State = FunctionDispatcherState.Default;

            _workerErrorSubscription = _eventManager.OfType <WorkerErrorEvent>()
                                       .Subscribe(WorkerError);

            _rpcChannelReadySubscriptions = _eventManager.OfType <RpcJobHostChannelReadyEvent>()
                                            .ObserveOn(NewThreadScheduler.Default)
                                            .Subscribe(AddOrUpdateWorkerChannels);

            _shutdownStandbyWorkerChannels = ShutdownWebhostLanguageWorkerChannels;
            _shutdownStandbyWorkerChannels = _shutdownStandbyWorkerChannels.Debounce(5000);
        }
        public FileMonitoringService(IOptions <ScriptJobHostOptions> scriptOptions, ILoggerFactory loggerFactory, IScriptEventManager eventManager, IScriptJobHostEnvironment scriptEnvironment)
        {
            _scriptOptions     = scriptOptions.Value;
            _eventManager      = eventManager;
            _scriptEnvironment = scriptEnvironment;
            _hostLogPath       = Path.Combine(_scriptOptions.RootLogPath, "Host");
            _logger            = loggerFactory.CreateLogger(LogCategories.Startup);

            // 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 = RestartAsync;
            _restart = _restart.Debounce(500);

            _shutdown = Shutdown;
            _shutdown = _shutdown.Debounce(500);
        }
Exemple #6
0
        public RpcFunctionInvocationDispatcher(IOptions <ScriptJobHostOptions> scriptHostOptions,
                                               IMetricsLogger metricsLogger,
                                               IEnvironment environment,
                                               IScriptJobHostEnvironment scriptJobHostEnvironment,
                                               IScriptEventManager eventManager,
                                               ILoggerFactory loggerFactory,
                                               IRpcWorkerChannelFactory rpcWorkerChannelFactory,
                                               IOptions <LanguageWorkerOptions> languageWorkerOptions,
                                               IWebHostRpcWorkerChannelManager webHostLanguageWorkerChannelManager,
                                               IJobHostRpcWorkerChannelManager jobHostLanguageWorkerChannelManager,
                                               IOptions <ManagedDependencyOptions> managedDependencyOptions,
                                               IRpcFunctionInvocationDispatcherLoadBalancer functionDispatcherLoadBalancer)
        {
            _metricsLogger                       = metricsLogger;
            _scriptOptions                       = scriptHostOptions.Value;
            _environment                         = environment;
            _scriptJobHostEnvironment            = scriptJobHostEnvironment;
            _webHostLanguageWorkerChannelManager = webHostLanguageWorkerChannelManager;
            _jobHostLanguageWorkerChannelManager = jobHostLanguageWorkerChannelManager;
            _eventManager                        = eventManager;
            _workerConfigs                       = languageWorkerOptions.Value.WorkerConfigs;
            _managedDependencyOptions            = managedDependencyOptions ?? throw new ArgumentNullException(nameof(managedDependencyOptions));
            _logger = loggerFactory.CreateLogger <RpcFunctionInvocationDispatcher>();
            _rpcWorkerChannelFactory = rpcWorkerChannelFactory;
            _workerRuntime           = _environment.GetEnvironmentVariable(RpcWorkerConstants.FunctionWorkerRuntimeSettingName);

            var processCount = _environment.GetEnvironmentVariable(RpcWorkerConstants.FunctionsWorkerProcessCountSettingName);

            _maxProcessCount = (processCount != null && int.Parse(processCount) > 1) ? int.Parse(processCount) : 1;
            _maxProcessCount = _maxProcessCount > _maxAllowedProcessCount ? _maxAllowedProcessCount : _maxProcessCount;
            _functionDispatcherLoadBalancer = functionDispatcherLoadBalancer;

            State = FunctionInvocationDispatcherState.Default;

            _workerErrorSubscription = _eventManager.OfType <WorkerErrorEvent>()
                                       .Subscribe(WorkerError);
            _workerRestartSubscription = _eventManager.OfType <WorkerRestartEvent>()
                                         .Subscribe(WorkerRestart);

            _shutdownStandbyWorkerChannels = ShutdownWebhostLanguageWorkerChannels;
            _shutdownStandbyWorkerChannels = _shutdownStandbyWorkerChannels.Debounce(milliseconds: 5000);
        }
Exemple #7
0
        public HttpFunctionInvocationDispatcher(IOptions <ScriptJobHostOptions> scriptHostOptions,
                                                IMetricsLogger metricsLogger,
                                                IScriptJobHostEnvironment scriptJobHostEnvironment,
                                                IScriptEventManager eventManager,
                                                ILoggerFactory loggerFactory,
                                                IHttpWorkerChannelFactory httpWorkerChannelFactory)
        {
            _metricsLogger            = metricsLogger;
            _scriptOptions            = scriptHostOptions.Value;
            _scriptJobHostEnvironment = scriptJobHostEnvironment;
            _eventManager             = eventManager;
            _logger = loggerFactory.CreateLogger <HttpFunctionInvocationDispatcher>();
            _httpWorkerChannelFactory = httpWorkerChannelFactory ?? throw new ArgumentNullException(nameof(httpWorkerChannelFactory));

            State = FunctionInvocationDispatcherState.Default;

            _workerErrorSubscription = _eventManager.OfType <HttpWorkerErrorEvent>()
                                       .Subscribe(WorkerError);
            _workerRestartSubscription = _eventManager.OfType <HttpWorkerRestartEvent>()
                                         .Subscribe(WorkerRestart);
        }
        public FunctionInvocationDispatcherFactory(IOptions <ScriptJobHostOptions> scriptHostOptions,
                                                   IMetricsLogger metricsLogger,
                                                   IScriptJobHostEnvironment scriptJobHostEnvironment,
                                                   IScriptEventManager eventManager,
                                                   ILoggerFactory loggerFactory,
                                                   IHttpWorkerChannelFactory httpWorkerChannelFactory,
                                                   IRpcWorkerChannelFactory rpcWorkerChannelFactory,
                                                   IOptions <HttpWorkerOptions> httpWorkerOptions,
                                                   IOptions <LanguageWorkerOptions> rpcWorkerOptions,
                                                   IEnvironment environment,
                                                   IWebHostRpcWorkerChannelManager webHostLanguageWorkerChannelManager,
                                                   IJobHostRpcWorkerChannelManager jobHostLanguageWorkerChannelManager,
                                                   IOptions <ManagedDependencyOptions> managedDependencyOptions,
                                                   IRpcFunctionInvocationDispatcherLoadBalancer functionDispatcherLoadBalancer)
        {
            if (httpWorkerOptions.Value == null)
            {
                throw new ArgumentNullException(nameof(httpWorkerOptions.Value));
            }

            if (httpWorkerOptions.Value.Description != null)
            {
                _functionDispatcher = new HttpFunctionInvocationDispatcher(scriptHostOptions, metricsLogger, scriptJobHostEnvironment, eventManager, loggerFactory, httpWorkerChannelFactory);
                return;
            }
            _functionDispatcher = new RpcFunctionInvocationDispatcher(scriptHostOptions,
                                                                      metricsLogger,
                                                                      environment,
                                                                      scriptJobHostEnvironment,
                                                                      eventManager,
                                                                      loggerFactory,
                                                                      rpcWorkerChannelFactory,
                                                                      rpcWorkerOptions,
                                                                      webHostLanguageWorkerChannelManager,
                                                                      jobHostLanguageWorkerChannelManager,
                                                                      managedDependencyOptions,
                                                                      functionDispatcherLoadBalancer);
        }
 public WebScriptHostExceptionHandler(IScriptJobHostEnvironment jobHostEnvironment, ILogger <WebScriptHostExceptionHandler> logger)
 {
     _jobHostEnvironment = jobHostEnvironment ?? throw new ArgumentNullException(nameof(jobHostEnvironment));
     _logger             = logger ?? throw new ArgumentNullException(nameof(logger));
 }