public Task InitializeAsync(IVostokHostingEnvironment environment) { SetupEventsLimitMetric(environment, () => environment.ConfigurationProvider.Get <AggregatorSettings>().EventsLimitMetric); var settings = environment.ConfigurationProvider.Get <AggregatorSettings>(); Func <string> apiKeyProvider = () => environment.SecretConfigurationProvider.Get <AggregatorSecretSettings>().HerculesApiKey; var binaryWriterSettings = new StreamBinaryWriterSettings( apiKeyProvider, new AdHocClusterProvider(() => null)) { MetricContext = environment.Metrics.Instance, GateClientAdditionalSetup = environment.HostExtensions.Get <ClusterClientSetup>(Constants.GateClientSetupKey) }; var binaryWriter = new StreamBinaryWriter(binaryWriterSettings, environment.Log); var eventsWriterSettings = new StreamBinaryEventsWriterSettings(binaryWriter, settings.TargetStream) { BufferCapacityLimit = settings.EventsWriteBufferCapacityLimit }; var eventsWriter = new StreamBinaryEventsWriter(eventsWriterSettings, environment.Log); var consumerSettings = new WindowedStreamConsumerSettings <MetricEvent, MetricTags>( settings.SourceStream, apiKeyProvider, new AdHocClusterProvider(() => null), s => s.Tags, s => s.Timestamp, _ => new MetricProcessor(environment.HostExtensions.Get <Func <IAggregateFunction> >(Constants.AggregateFunctionKey)(), eventsWriter), r => new HerculesMetricEventReader(r), environment.HostExtensions.Get <IStreamCoordinatesStorage>(Constants.LeftCoordinatesStorageKey), environment.HostExtensions.Get <IStreamCoordinatesStorage>(Constants.RightCoordinatesStorageKey), () => new StreamShardingSettings(environment.ApplicationReplicationInfo.InstanceIndex, environment.ApplicationReplicationInfo.InstancesCount) ) { EventsReadBatchSize = settings.EventsReadBatchSize, Lag = settings.Lag, Period = settings.Period, LagProvider = e => e.AggregationParameters?.GetAggregationLag(), PeriodProvider = e => e.AggregationParameters?.GetAggregationPeriod(), MetricContext = environment.Metrics.Instance, StreamApiClientAdditionalSetup = environment.HostExtensions.Get <ClusterClientSetup>(Constants.StreamClientSetupKey), MaximumDeltaAfterNow = settings.MaximumDeltaAfterNow, OnBatchBegin = _ => writeTask?.GetAwaiter().GetResult(), OnBatchEnd = _ => { writeTask = eventsWriter.WriteAsync().SilentlyContinue(); } }; consumer = new WindowedStreamConsumer <MetricEvent, MetricTags>(consumerSettings, environment.Log); return(Task.CompletedTask); }
public MetricProcessor(IAggregateFunction aggregateFunction, StreamBinaryEventsWriter writer) { this.aggregateFunction = aggregateFunction; this.writer = writer; }