/// <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); }
/// <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."); } } }