예제 #1
0
        /// <summary>
        /// <para>Configures common static providers with values from given <paramref name="environment"/>.</para>
        /// <para>Following static providers are configured:</para>
        /// <list type="bullet">
        ///     <item><description><see cref="LogProvider"/></description></item>
        ///     <item><description><see cref="TracerProvider"/></description></item>
        ///     <item><description><see cref="HerculesSinkProvider"/></description></item>
        ///     <item><description><see cref="DatacentersProvider"/></description></item>
        ///     <item><description>ClusterConfigClient.<see cref="ClusterConfigClient.Default"/> (if not configured earlier)</description></item>
        ///     <item><description>ConfigurationProvider.<see cref="ConfigurationProvider.Default"/> (if not configured earlier)</description></item>
        /// </list>
        /// </summary>
        public static void Configure([NotNull] IVostokHostingEnvironment environment)
        {
            if (environment == null)
            {
                throw new ArgumentNullException(nameof(environment));
            }

            ClusterClientDefaults.ClientApplicationName = environment.ApplicationIdentity.FormatServiceName();

            LogProvider.Configure(environment.Log, true);
            TracerProvider.Configure(environment.Tracer, true);
            HerculesSinkProvider.Configure(environment.HerculesSink, true);
            DatacentersProvider.Configure(environment.Datacenters, true);

            var log = environment.Log.ForContext(typeof(StaticProvidersHelper));

            if (environment.ClusterConfigClient is ClusterConfigClient clusterConfigClient)
            {
                if (!ClusterConfigClient.TrySetDefaultClient(clusterConfigClient) && !ReferenceEquals(ClusterConfigClient.Default, environment.ClusterConfigClient))
                {
                    log.Warn("ClusterConfigClient.Default has already been configured.");
                }
            }

            if (environment.ConfigurationProvider is ConfigurationProvider configurationProvider && !ReferenceEquals(ConfigurationProvider.Default, environment.ConfigurationProvider))
            {
                if (!ConfigurationProvider.TrySetDefault(configurationProvider))
                {
                    log.Warn("ConfigurationProvider.Default has already been configured.");
                }
            }
        }
        public static void SetupSingular(this IClusterClientConfiguration configuration, SingularClientSettings settings)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }

            if (settings == null)
            {
                throw new ArgumentNullException(nameof(settings));
            }

            configuration.RequestTransforms.Add(
                new AdHocRequestTransform(
                    request => request
                    .WithHeader(SingularHeaders.Environment, settings.TargetEnvironment)
                    .WithHeader(SingularHeaders.Service, settings.TargetService)));

            configuration.TargetEnvironment = settings.TargetEnvironment;
            configuration.TargetServiceName = ServiceMeshEnvironmentInfo.UseLocalSingular
                ? $"{settings.TargetService} via ServiceMesh"
                : $"{settings.TargetService} via {SingularConstants.ServiceName}";

            var clusterConfigClient = ClusterConfigClient.Default;

            configuration.ClusterProvider = settings.AlternativeClusterProvider ??
                                            new ClusterConfigClusterProvider(clusterConfigClient, SingularConstants.CCTopologyName, configuration.Log);

            configuration.SetupWeighedReplicaOrdering(
                builder =>
            {
                var datacenters = DatacentersProvider.Get();
                builder.AddRelativeWeightModifier(new RelativeWeightSettings());
                builder.SetupAvoidInactiveDatacentersWeightModifier(datacenters);
                builder.SetupBoostLocalDatacentersWeightModifier(datacenters);
            });

            var forkingStrategy       = Strategy.Forking(SingularClientConstants.ForkingStrategyParallelismLevel);
            var idempotencyIdentifier = IdempotencyIdentifierCache.Get(clusterConfigClient, settings.TargetEnvironment, settings.TargetService);

            configuration.DefaultRequestStrategy = new IdempotencySignBasedRequestStrategy(idempotencyIdentifier, Strategy.Sequential1, forkingStrategy);

            configuration.MaxReplicasUsedPerRequest = SingularClientConstants.ForkingStrategyParallelismLevel;

            if (ServiceMeshEnvironmentInfo.UseLocalSingular)
            {
                var serviceMeshRequestModule = new ServiceMeshRequestModule(configuration.Log, idempotencyIdentifier);
                configuration.AddRequestModule(serviceMeshRequestModule, RequestModule.RequestExecution);
            }

            InitializeMetricsProviderIfNeeded(configuration, settings.MetricContext, clusterConfigClient);
        }
예제 #3
0
        /// <summary>
        /// <para>Configures common static providers with values from given <paramref name="environment"/>.</para>
        /// <para>Following static providers are configured:</para>
        /// <list type="bullet">
        ///     <item><description><see cref="LogProvider"/></description></item>
        ///     <item><description><see cref="TracerProvider"/></description></item>
        ///     <item><description><see cref="HerculesSinkProvider"/></description></item>
        ///     <item><description><see cref="DatacentersProvider"/></description></item>
        ///     <item><description><see cref="MetricContextProvider"/></description></item>
        ///     <item><description>ClusterConfigClient.<see cref="ClusterConfigClient.Default"/> (if not configured earlier)</description></item>
        ///     <item><description>ConfigurationProvider.<see cref="ConfigurationProvider.Default"/> (if not configured earlier)</description></item>
        /// </list>
        /// </summary>
        public static void Configure([NotNull] IVostokHostingEnvironment environment)
        {
            if (environment == null)
            {
                throw new ArgumentNullException(nameof(environment));
            }

            ClusterClientDefaults.ClientApplicationName = environment.ServiceBeacon is ServiceBeacon beacon
                ? beacon.ReplicaInfo.Application
                : environment.ApplicationIdentity.FormatServiceName();

            LogProvider.Configure(environment.Log, true);
            TracerProvider.Configure(environment.Tracer, true);
            HerculesSinkProvider.Configure(environment.HerculesSink, true);
            DatacentersProvider.Configure(environment.Datacenters, true);
            MetricContextProvider.Configure(environment.Metrics.Root, true);

            FlowingContext.Configuration.ErrorCallback = (errorMessage, error) => environment.Log.ForContext(typeof(FlowingContext)).Error(error, errorMessage);

            var log = environment.Log.ForContext(typeof(StaticProvidersHelper));

            if (environment.ClusterConfigClient is ClusterConfigClient clusterConfigClient)
            {
                if (!ClusterConfigClient.TrySetDefaultClient(clusterConfigClient) && !ReferenceEquals(ClusterConfigClient.Default, environment.ClusterConfigClient))
                {
                    log.Warn("ClusterConfigClient.Default has already been configured.");
                }
            }

            if (environment.ConfigurationProvider is ConfigurationProvider configurationProvider && !ReferenceEquals(ConfigurationProvider.Default, environment.ConfigurationProvider))
            {
                if (!ConfigurationProvider.TrySetDefault(configurationProvider))
                {
                    log.Warn("ConfigurationProvider.Default has already been configured.");
                }
            }
        }