/// <summary>add MagicOnion Telemetry.</summary>
        public static IMagicOnionServerBuilder AddOpenTelemetry(this IMagicOnionServerBuilder builder,
                                                                string configurationName = "")
        {
            var options = BindMagicOnionOpenTelemetryOptions(builder, configurationName);

            return(AddOpenTelemetry(builder, options));
        }
        /// <summary>add MagicOnion Telemetry.</summary>
        public static IMagicOnionServerBuilder AddOpenTelemetry(this IMagicOnionServerBuilder builder,
                                                                Action <MagicOnionOpenTelemetryOptions, MagicOnionOpenTelemetryMeterFactoryOption> configureMeterFactory,
                                                                Action <MagicOnionOpenTelemetryOptions, IServiceProvider, TracerProviderBuilder> configureTracerFactory,
                                                                string configurationName = "")
        {
            var options = BindMagicOnionOpenTelemetryOptions(builder, configurationName);

            return(AddOpenTelemetry(builder, options, configureMeterFactory, configureTracerFactory));
        }
示例#3
0
        public static IMagicOnionServerBuilder UseRedisGroupRepository(this IMagicOnionServerBuilder builder, Action <RedisGroupOptions> configure, bool registerAsDefault = false)
        {
            if (registerAsDefault)
            {
                builder.Services.RemoveAll <IGroupRepositoryFactory>();
                builder.Services.TryAddSingleton <IGroupRepositoryFactory, RedisGroupRepositoryFactory>();
            }
            builder.Services.Configure <RedisGroupOptions>(configure);

            return(builder);
        }
        /// <summary>add MagicOnion Telemetry.</summary>
        public static IMagicOnionServerBuilder AddOpenTelemetry(this IMagicOnionServerBuilder builder,
                                                                MagicOnionOpenTelemetryOptions options,
                                                                Action <MagicOnionOpenTelemetryOptions, MagicOnionOpenTelemetryMeterFactoryOption> configureMeterProvider,
                                                                Action <MagicOnionOpenTelemetryOptions, IServiceProvider, TracerProviderBuilder> configureTracerProvider)
        {
            if (options == null)
            {
                throw new ArgumentNullException(nameof(options));
            }

            builder.Services.AddSingleton(options);

            // configure MeterFactory
            if (configureMeterProvider != null)
            {
                var meterFactoryOption = new MagicOnionOpenTelemetryMeterFactoryOption();
                configureMeterProvider(options, meterFactoryOption);

                MeterProvider.SetDefault(Sdk.CreateMeterProviderBuilder()
                                         .SetProcessor(meterFactoryOption.MetricProcessor)
                                         .SetExporter(meterFactoryOption.MetricExporter)
                                         .SetPushInterval(meterFactoryOption.MetricPushInterval)
                                         .Build());

                builder.Services.AddSingleton(meterFactoryOption.MetricExporter);
                if (meterFactoryOption.MeterLogger != null)
                {
                    builder.Services.AddSingleton <IMagicOnionLogger>(meterFactoryOption.MeterLogger.Invoke(MeterProvider.Default));
                }
            }

            // configure TracerFactory
            if (configureTracerProvider != null)
            {
                if (string.IsNullOrEmpty(options.MagicOnionActivityName))
                {
                    throw new NullReferenceException(nameof(options.MagicOnionActivityName));
                }

                builder.Services.AddOpenTelemetryTracing((provider, builder) =>
                {
                    // ActivitySourceName must match to TracerName.
                    builder.AddSource(options.MagicOnionActivityName);
                    configureTracerProvider?.Invoke(options, provider, builder);
                });

                // Avoid directly register ActivitySource to Singleton for easier identification.
                var activitySource            = new ActivitySource(options.MagicOnionActivityName);
                var magicOnionActivitySources = new MagicOnionActivitySources(activitySource);
                builder.Services.AddSingleton(magicOnionActivitySources);
            }

            return(builder);
        }
        /// <summary>
        /// Adds JWT authentication and provider for MagicOnion to the specified <see cref="IMagicOnionServerBuilder"/>.
        /// </summary>
        /// <typeparam name="TProvider"></typeparam>
        /// <param name="builder"></param>
        /// <param name="configureOptions"></param>
        /// <returns></returns>
        public static IMagicOnionServerBuilder AddJwtAuthentication <TProvider>(this IMagicOnionServerBuilder builder, Action <JwtAuthenticationOptions> configureOptions)
            where TProvider : class, IJwtAuthenticationProvider
        {
            builder.Services.AddSingleton <IJwtAuthenticationProvider, TProvider>();

            builder.Services.Configure <JwtAuthenticationOptions>(configureOptions);
            builder.Services.Configure <MagicOnionOptions>(options =>
            {
                options.GlobalFilters.Add <JwtAuthenticationAttribute>();
            });

            return(builder);
        }
        private static MagicOnionOpenTelemetryOptions BindMagicOnionOpenTelemetryOptions(IMagicOnionServerBuilder builder, string configurationName)
        {
            var name            = !string.IsNullOrEmpty(configurationName) ? configurationName : "MagicOnion:OpenTelemetry";
            var serviceProvider = builder.Services.BuildServiceProvider();
            var config          = serviceProvider.GetService <IConfiguration>();
            var options         = new MagicOnionOpenTelemetryOptions();

            config.GetSection(name).Bind(options);
            return(options);
        }
 /// <summary>add MagicOnion Telemetry.</summary>
 public static IMagicOnionServerBuilder AddOpenTelemetry(this IMagicOnionServerBuilder builder,
                                                         MagicOnionOpenTelemetryOptions options)
 {
     return(AddOpenTelemetry(builder, options, null, null));
 }