コード例 #1
0
        public LanguageWorkerChannel(
            ScriptHostConfiguration scriptConfig,
            IScriptEventManager eventManager,
            IWorkerProcessFactory processFactory,
            IProcessRegistry processRegistry,
            IObservable <FunctionRegistrationContext> functionRegistrations,
            WorkerConfig workerConfig,
            Uri serverUri,
            ILoggerFactory loggerFactory)
        {
            _workerId = Guid.NewGuid().ToString();

            _scriptConfig          = scriptConfig;
            _eventManager          = eventManager;
            _processFactory        = processFactory;
            _processRegistry       = processRegistry;
            _functionRegistrations = functionRegistrations;
            _workerConfig          = workerConfig;
            _serverUri             = serverUri;

            _logger = loggerFactory.CreateLogger($"Worker.{workerConfig.Language}.{_workerId}");

            _inboundWorkerEvents = _eventManager.OfType <InboundEvent>()
                                   .Where(msg => msg.WorkerId == _workerId);

            _eventSubscriptions.Add(_inboundWorkerEvents
                                    .Where(msg => msg.MessageType == MsgType.RpcLog)
                                    .Subscribe(Log));

            if (scriptConfig.LogFilter.Filter("Worker", LogLevel.Trace))
            {
                _eventSubscriptions.Add(_eventManager.OfType <RpcEvent>()
                                        .Where(msg => msg.WorkerId == _workerId)
                                        .Subscribe(msg =>
                {
                    var jsonMsg = JsonConvert.SerializeObject(msg, _verboseSerializerSettings);
                    _logger.LogTrace(jsonMsg);
                }));
            }

            _eventSubscriptions.Add(_eventManager.OfType <FileEvent>()
                                    .Where(msg => Path.GetExtension(msg.FileChangeArguments.FullPath) == Config.Extension)
                                    .Throttle(TimeSpan.FromMilliseconds(300)) // debounce
                                    .Subscribe(msg => _eventManager.Publish(new HostRestartEvent())));

            StartWorker();
        }
コード例 #2
0
        internal LanguageWorkerChannel(
            string workerId,
            string rootScriptPath,
            IScriptEventManager eventManager,
            IObservable <FunctionRegistrationContext> functionRegistrations,
            IWorkerProcessFactory processFactory,
            IProcessRegistry processRegistry,
            WorkerConfig workerConfig,
            Uri serverUri,
            ILoggerFactory loggerFactory,
            IMetricsLogger metricsLogger,
            int attemptCount)
        {
            _workerId = workerId;
            _functionRegistrations = functionRegistrations;
            _rootScriptPath        = rootScriptPath;
            _eventManager          = eventManager;
            _processFactory        = processFactory;
            _processRegistry       = processRegistry;
            _workerConfig          = workerConfig;
            _serverUri             = serverUri;
            _workerChannelLogger   = loggerFactory.CreateLogger($"Worker.{workerConfig.Language}.{_workerId}");
            _userLogsConsoleLogger = loggerFactory.CreateLogger(LanguageWorkerConstants.FunctionConsoleLogCategoryName);

            _inboundWorkerEvents = _eventManager.OfType <InboundEvent>()
                                   .Where(msg => msg.WorkerId == _workerId);

            _eventSubscriptions.Add(_inboundWorkerEvents
                                    .Where(msg => msg.MessageType == MsgType.RpcLog)
                                    .Subscribe(Log));

            _eventSubscriptions.Add(_eventManager.OfType <RpcEvent>()
                                    .Where(msg => msg.WorkerId == _workerId)
                                    .Subscribe(msg =>
            {
                var jsonMsg = JsonConvert.SerializeObject(msg, LanguageWorkerChannelUtilities.VerboseSerializerSettings);
                _userLogsConsoleLogger.LogDebug(jsonMsg);
            }));

            _eventSubscriptions.Add(_eventManager.OfType <FileEvent>()
                                    .Where(msg => Config.Extensions.Contains(Path.GetExtension(msg.FileChangeArguments.FullPath)))
                                    .Throttle(TimeSpan.FromMilliseconds(300)) // debounce
                                    .Subscribe(msg => _eventManager.Publish(new HostRestartEvent())));

            _startLatencyMetric = metricsLogger?.LatencyEvent(string.Format(MetricEventNames.WorkerInitializeLatency, workerConfig.Language, attemptCount));
        }
コード例 #3
0
 internal HttpWorkerProcess(string workerId,
                            string rootScriptPath,
                            WorkerProcessArguments workerProcessArguments,
                            IScriptEventManager eventManager,
                            IWorkerProcessFactory processFactory,
                            IProcessRegistry processRegistry,
                            ILogger workerProcessLogger,
                            ILanguageWorkerConsoleLogSource consoleLogSource)
     : base(eventManager, processRegistry, workerProcessLogger, consoleLogSource)
 {
     _processFactory         = processFactory;
     _eventManager           = eventManager;
     _workerProcessLogger    = workerProcessLogger;
     _workerId               = workerId;
     _scriptRootPath         = rootScriptPath;
     _workerProcessArguments = workerProcessArguments;
 }
コード例 #4
0
 public HttpWorkerProcessFactory(IScriptEventManager eventManager,
                                 ILoggerFactory loggerFactory,
                                 IWorkerProcessFactory defaultWorkerProcessFactory,
                                 IProcessRegistry processRegistry,
                                 IWorkerConsoleLogSource consoleLogSource,
                                 IEnvironment environment,
                                 IMetricsLogger metricsLogger,
                                 IServiceProvider serviceProvider)
 {
     _loggerFactory        = loggerFactory ?? throw new ArgumentNullException(nameof(loggerFactory));
     _eventManager         = eventManager ?? throw new ArgumentNullException(nameof(eventManager));
     _consoleLogSource     = consoleLogSource ?? throw new ArgumentNullException(nameof(consoleLogSource));
     _workerProcessFactory = defaultWorkerProcessFactory ?? throw new ArgumentNullException(nameof(defaultWorkerProcessFactory));
     _processRegistry      = processRegistry ?? throw new ArgumentNullException(nameof(processRegistry));
     _metricsLogger        = metricsLogger ?? throw new ArgumentNullException(nameof(metricsLogger));
     _environment          = environment;
     _serviceProvider      = serviceProvider;
 }
コード例 #5
0
 public RpcWorkerProcessFactory(IRpcServer rpcServer,
                                IScriptEventManager eventManager,
                                ILoggerFactory loggerFactory,
                                IWorkerProcessFactory defaultWorkerProcessFactory,
                                IProcessRegistry processRegistry,
                                IWorkerConsoleLogSource consoleLogSource,
                                IMetricsLogger metricsLogger,
                                IServiceProvider serviceProvider)
 {
     _loggerFactory        = loggerFactory;
     _eventManager         = eventManager;
     _rpcServer            = rpcServer;
     _consoleLogSource     = consoleLogSource;
     _workerProcessFactory = defaultWorkerProcessFactory;
     _processRegistry      = processRegistry;
     _metricsLogger        = metricsLogger;
     _serviceProvider      = serviceProvider;
 }
コード例 #6
0
 internal HttpWorkerProcess(string workerId,
                            string rootScriptPath,
                            HttpWorkerOptions httpWorkerOptions,
                            IScriptEventManager eventManager,
                            IWorkerProcessFactory processFactory,
                            IProcessRegistry processRegistry,
                            ILogger workerProcessLogger,
                            IWorkerConsoleLogSource consoleLogSource,
                            IEnvironment environment,
                            IMetricsLogger metricsLogger)
     : base(eventManager, processRegistry, workerProcessLogger, consoleLogSource, metricsLogger, httpWorkerOptions.Description.UseStdErrorStreamForErrorsOnly)
 {
     _processFactory         = processFactory;
     _eventManager           = eventManager;
     _workerProcessLogger    = workerProcessLogger;
     _workerId               = workerId;
     _scriptRootPath         = rootScriptPath;
     _httpWorkerOptions      = httpWorkerOptions;
     _workerProcessArguments = _httpWorkerOptions.Arguments;
     _environment            = environment;
 }
コード例 #7
0
 internal RpcWorkerProcess(string runtime,
                           string workerId,
                           string rootScriptPath,
                           Uri serverUri,
                           WorkerProcessArguments workerProcessArguments,
                           IScriptEventManager eventManager,
                           IWorkerProcessFactory processFactory,
                           IProcessRegistry processRegistry,
                           ILogger workerProcessLogger,
                           IWorkerConsoleLogSource consoleLogSource)
     : base(eventManager, processRegistry, workerProcessLogger, consoleLogSource)
 {
     _runtime                = runtime;
     _processFactory         = processFactory;
     _eventManager           = eventManager;
     _workerProcessLogger    = workerProcessLogger;
     _workerId               = workerId;
     _serverUri              = serverUri;
     _scriptRootPath         = rootScriptPath;
     _workerProcessArguments = workerProcessArguments;
 }
コード例 #8
0
 internal RpcWorkerProcess(string runtime,
                           string workerId,
                           string rootScriptPath,
                           Uri serverUri,
                           RpcWorkerConfig rpcWorkerConfig,
                           IScriptEventManager eventManager,
                           IWorkerProcessFactory processFactory,
                           IProcessRegistry processRegistry,
                           ILogger workerProcessLogger,
                           IWorkerConsoleLogSource consoleLogSource,
                           IMetricsLogger metricsLogger)
     : base(eventManager, processRegistry, workerProcessLogger, consoleLogSource, metricsLogger, rpcWorkerConfig.Description.UseStdErrorStreamForErrorsOnly)
 {
     _runtime                = runtime;
     _processFactory         = processFactory;
     _eventManager           = eventManager;
     _workerProcessLogger    = workerProcessLogger;
     _workerId               = workerId;
     _serverUri              = serverUri;
     _scriptRootPath         = rootScriptPath;
     _workerProcessArguments = rpcWorkerConfig.Arguments;
     _workerDirectory        = rpcWorkerConfig.Description.WorkerDirectory;
 }
コード例 #9
0
        public LanguageWorkerChannelManager(IScriptEventManager eventManager, IEnvironment environment, IRpcServer rpcServer, ILoggerFactory loggerFactory, IOptions <LanguageWorkerOptions> languageWorkerOptions, IOptionsMonitor <ScriptApplicationHostOptions> applicationHostOptions)
        {
            _rpcServer              = rpcServer;
            _environment            = environment ?? throw new ArgumentNullException(nameof(environment));
            _eventManager           = eventManager;
            _loggerFactory          = loggerFactory;
            _logger                 = loggerFactory.CreateLogger(ScriptConstants.LanguageWorkerChannelManager);
            _workerConfigs          = languageWorkerOptions.Value.WorkerConfigs;
            _applicationHostOptions = applicationHostOptions;
            _processFactory         = new DefaultWorkerProcessFactory();
            try
            {
                _processRegistry = ProcessRegistryFactory.Create();
            }
            catch (Exception e)
            {
                _logger.LogWarning(e, "Unable to create process registry");
            }

            _shutdownStandbyWorkerChannels = ScheduleShutdownStandbyChannels;
            _shutdownStandbyWorkerChannels = _shutdownStandbyWorkerChannels.Debounce(5000);
            _rpcChannelReadySubscriptions  = _eventManager.OfType <RpcChannelReadyEvent>()
                                             .Subscribe(AddOrUpdateWorkerChannels);
        }