private static ApplicationInsightsSink initializeSink(ITelemetryInitializer[] telemetryInitializers, String InstrumentationKey = null) { if (InstrumentationKey != null) return new ApplicationInsightsSink(InstrumentationKey, telemetryInitializers); else return new ApplicationInsightsSink(telemetryInitializers); }
public void EnableAppInsightsForKubernetesWithTimeOutSetThroughConfiguration() { IServiceCollection services = new ServiceCollection(); IConfiguration config = new ConfigurationBuilder().AddInMemoryCollection( new Dictionary <string, string>() { { "a", "b" }, { "AppInsightsForKubernetes:InitializationTimeout", "3.1:12:15.34" } }).Build(); services.AddSingleton(config); ApplicationInsightsExtensions.ConfigureKubernetesTelemetryInitializer(services, () => true, new KubernetesTestServiceCollectionBuilder(), null); Assert.NotNull(services.FirstOrDefault(sd => sd.ImplementationType == typeof(KubernetesTelemetryInitializer))); IServiceProvider serviceProvider = services.BuildServiceProvider(); ITelemetryInitializer targetTelemetryInitializer = serviceProvider.GetServices <ITelemetryInitializer>().FirstOrDefault(ti => ti is KubernetesTelemetryInitializer); if (targetTelemetryInitializer is KubernetesTelemetryInitializer target) { Assert.StrictEqual(new TimeSpan(days: 3, hours: 1, minutes: 12, seconds: 15, milliseconds: 340), target._options.InitializationTimeout); } else { Assert.True(false, "Not the target telemetry initializer."); } }
/// <summary> /// Enables Application Insights Kubernetes for a given TelemetryConfiguration. /// </summary> /// <remarks> /// The use of AddApplicationInsightsKubernetesEnricher() on the ServiceCollection is always preferred unless you have more than one TelemetryConfiguration /// instance, or if you are using Application Insights from a non ASP.NET environment, like a console app. /// </remarks> public static void AddApplicationInsightsKubernetesEnricher( this TelemetryConfiguration telemetryConfiguration, TimeSpan?timeout = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null, Func <bool> detectKubernetes = null) { IServiceCollection standaloneServiceCollection = new ServiceCollection(); standaloneServiceCollection = EnableKubernetesImpl(standaloneServiceCollection, detectKubernetes, kubernetesServiceCollectionBuilder, null, timeout); // Static class can't used as generic types. ILogger logger = standaloneServiceCollection.GetLogger <IKubernetesServiceCollectionBuilder>(); IServiceProvider serviceProvider = standaloneServiceCollection.BuildServiceProvider(); ITelemetryInitializer k8sTelemetryInitializer = serviceProvider.GetServices <ITelemetryInitializer>() .FirstOrDefault(ti => ti is KubernetesTelemetryInitializer); if (k8sTelemetryInitializer != null) { telemetryConfiguration.TelemetryInitializers.Add(k8sTelemetryInitializer); } else { logger.LogError($"Getting ${nameof(KubernetesTelemetryInitializer)} from the service provider failed."); } }
public static void AddApplicationInsightsKubernetesEnricher( this TelemetryConfiguration telemetryConfiguration, Action <AppInsightsForKubernetesOptions> applyOptions = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null, Func <bool> detectKubernetes = null, ILogger <IKubernetesServiceCollectionBuilder> logger = null) { IServiceCollection standaloneServiceCollection = new ServiceCollection(); standaloneServiceCollection = standaloneServiceCollection.AddApplicationInsightsKubernetesEnricher( applyOptions, kubernetesServiceCollectionBuilder, detectKubernetes, logger); // Static class can't used as generic types. IServiceProvider serviceProvider = standaloneServiceCollection.BuildServiceProvider(); ITelemetryInitializer k8sTelemetryInitializer = serviceProvider.GetServices <ITelemetryInitializer>() .FirstOrDefault(ti => ti is KubernetesTelemetryInitializer); if (k8sTelemetryInitializer != null) { telemetryConfiguration.TelemetryInitializers.Add(k8sTelemetryInitializer); logger?.LogInformation($"{nameof(KubernetesTelemetryInitializer)} is injected."); } else { logger?.LogError($"Getting ${nameof(KubernetesTelemetryInitializer)} from the service provider failed."); } }
public void ServiceInjected() { IServiceCollection services = new ServiceCollection(); ApplicationInsightsExtensions.ConfigureKubernetesTelemetryInitializer(services, () => true, new KubernetesTestServiceCollectionBuilder(), null); Assert.NotNull(services.FirstOrDefault(sd => sd.ImplementationType == typeof(KubernetesTelemetryInitializer))); IServiceProvider serviceProvider = services.BuildServiceProvider(); ITelemetryInitializer targetTelemetryInitializer = serviceProvider.GetServices <ITelemetryInitializer>().FirstOrDefault(ti => ti is KubernetesTelemetryInitializer); Assert.NotNull(targetTelemetryInitializer); // K8s services serviceProvider.GetRequiredService <IKubeHttpClientSettingsProvider>(); serviceProvider.GetRequiredService <KubeHttpClientFactory>(); serviceProvider.GetRequiredService <K8sQueryClientFactory>(); serviceProvider.GetRequiredService <IK8sEnvironmentFactory>(); }
public void EnableAppInsightsForKubernetesWithDefaultTimeOut() { TelemetryConfiguration telemetryConfiguration = new TelemetryConfiguration(); telemetryConfiguration.AddApplicationInsightsKubernetesEnricher( applyOptions: null, kubernetesServiceCollectionBuilder: new KubernetesTestServiceCollectionBuilder(), detectKubernetes: () => true); ITelemetryInitializer targetTelemetryInitializer = telemetryConfiguration.TelemetryInitializers.FirstOrDefault(ti => ti is KubernetesTelemetryInitializer); if (targetTelemetryInitializer is KubernetesTelemetryInitializer target) { Assert.StrictEqual(TimeSpan.FromMinutes(2), target._options.InitializationTimeout); } else { Assert.True(false, "Not the target telemetry initializer."); } }
public TelemetryQueue( [NotNull] ITelemetryRouter telemetryRouter, [NotNull] ITelemetryInitializer telemetryInitializer) { if (telemetryRouter == null) { throw new ArgumentNullException(nameof(telemetryRouter)); } if (telemetryInitializer == null) { throw new ArgumentNullException(nameof(telemetryInitializer)); } _telemetryRouter = telemetryRouter; _telemetryInitializer = telemetryInitializer; _telemetryQueue = new Queue <ITelemetry>(); AutoCommit = true; }
public AppInsightsTelemetryInitializerTests() { var mockHttpContextAccessory = new Mock <IHttpContextAccessor>(); var defaultContext = new DefaultHttpContext(); var identity = new ClaimsIdentity(new Claim[] { new Claim(ClaimTypes.Name, "username") }, "custom"); var principal = new ClaimsPrincipal(identity); defaultContext.User = principal; mockHttpContextAccessory .Setup(m => m.HttpContext) .Returns(defaultContext); this.telemetryInitializer = new AppInsightsTelemetryInitializer(mockHttpContextAccessory.Object); }
/// <summary> /// Enable Application Insights Kubernetes for a given TelemetryConfiguration. /// Note: The use of EnableKubernetes() on the ServiceCollection is always preferred unless you have more than one /// TelemetryConfiguration instances. /// </summary> public static void EnableKubernetes( this TelemetryConfiguration telemetryConfiguration, TimeSpan?timeout = null, IKubernetesServiceCollectionBuilder kubernetesServiceCollectionBuilder = null) { IServiceCollection standaloneServiceCollection = new ServiceCollection(); standaloneServiceCollection = EnableKubernetesImpl(standaloneServiceCollection, timeout, kubernetesServiceCollectionBuilder); IServiceProvider serviceProvider = standaloneServiceCollection.BuildServiceProvider(); ITelemetryInitializer k8sTelemetryInitializer = serviceProvider.GetServices <ITelemetryInitializer>() .FirstOrDefault(ti => ti is KubernetesTelemetryInitializer); if (k8sTelemetryInitializer != null) { telemetryConfiguration.TelemetryInitializers.Add(k8sTelemetryInitializer); } else { _logger.LogError($"Getting ${nameof(KubernetesTelemetryInitializer)} from the service provider failed."); } }
/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services">An instance of <see cref="IServiceCollection"/>.</param> public void ConfigureServices(IServiceCollection services) { this.ConfigureServicesCommon(services); _ = services.AddMvc(); _ = services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "NotificationService", Version = "v1" }); }); ITelemetryInitializer[] itm = new ITelemetryInitializer[1]; var envInitializer = new EnvironmentInitializer { Service = this.Configuration[AIConstants.ServiceConfigName], ServiceLine = this.Configuration[AIConstants.ServiceLineConfigName], ServiceOffering = this.Configuration[AIConstants.ServiceOfferingConfigName], ComponentId = this.Configuration[AIConstants.ComponentIdConfigName], ComponentName = this.Configuration[AIConstants.ComponentNameConfigName], EnvironmentName = this.Configuration[AIConstants.EnvironmentName], IctoId = "IctoId", }; itm[0] = envInitializer; NotificationProviders.Common.Logger.LoggingConfiguration loggingConfiguration = new NotificationProviders.Common.Logger.LoggingConfiguration { IsTraceEnabled = true, TraceLevel = (SeverityLevel)Enum.Parse(typeof(SeverityLevel), this.Configuration[ConfigConstants.AITraceLelelConfigKey]), EnvironmentName = this.Configuration[AIConstants.EnvironmentName], }; var tconfig = TelemetryConfiguration.CreateDefault(); tconfig.InstrumentationKey = this.Configuration[ConfigConstants.AIInsrumentationConfigKey]; DependencyTrackingTelemetryModule depModule = new DependencyTrackingTelemetryModule(); depModule.Initialize(tconfig); RequestTrackingTelemetryModule requestTrackingTelemetryModule = new RequestTrackingTelemetryModule(); requestTrackingTelemetryModule.Initialize(tconfig); _ = services.AddSingleton <NotificationProviders.Common.Logger.ILogger>(_ => new NotificationProviders.Common.Logger.AILogger(loggingConfiguration, tconfig, itm)); _ = services.AddScoped <IEmailManager, EmailManager>(s => new EmailManager( this.Configuration, s.GetService <IRepositoryFactory>(), s.GetService <ILogger>(), s.GetService <IMailTemplateManager>(), s.GetService <ITemplateMerge>())) .AddScoped <IEmailServiceManager, EmailServiceManager>(s => new EmailServiceManager(this.Configuration, s.GetService <IRepositoryFactory>(), s.GetService <ICloudStorageClient>(), s.GetService <ILogger>(), s.GetService <INotificationProviderFactory>(), s.GetService <IEmailManager>())) .AddScoped <ITemplateMerge, TemplateMerge>() .AddSingleton <IEmailAccountManager, EmailAccountManager>() .AddScoped <INotificationProviderFactory, NotificationProviderFactory>(); NotificationProviderType providerType = (NotificationProviderType)Enum.Parse(typeof(NotificationProviderType), this.Configuration[ConfigConstants.NotificationProviderType]); if (NotificationProviderType.DirectSend == providerType) { this.ConfigureDirectSendServices(services); } else if (NotificationProviderType.SMTP == providerType) { this.ConfigureSMTPServices(services); } else { this.ConfigureGraphServices(services); } }
/// <summary> /// Initialize AppInsights pipeline: read config and enable sinks for logging /// </summary> /// <param name="config"></param> /// <param name="initaInitializers"></param> /// <returns></returns> public static async Task Initialize(IConfiguration config, ILogger logger, IServiceProvider serviceProvider) { // AppInsights Config var configAppInsights = config.GetSection(AppInsightsLoggingConfig.ApplicationInsightsSection); var appInsightsLoggingConfig = new AppInsightsLoggingConfig(); configAppInsights.Bind(appInsightsLoggingConfig); // >>>>> Use the custom in-memory pipeline publishing channel // Config for InMemoryPublishingChannel var configInMemoryPublishingChannel = configAppInsights .GetSection(AppInsightsLoggingConfig.InMemoryPublishingChannelSection); TelemetryConfiguration.Active.TelemetryChannel = new InMemoryPublishingChannel( configInMemoryPublishingChannel, logger, new Uri(appInsightsLoggingConfig.TelemetryServiceEndpoint), CoreConstants.CustomPipelineKey); // >>>>> Add each ITelemetryInitializer loaded from config via Reflection and calling Factory for ITelemetryInitializer var telemetryInitializerSection = configAppInsights.GetSection(AppInsightsLoggingConfig.TelemetryInitializer); foreach (var initializerEntry in telemetryInitializerSection.GetChildren()) { var initializerEntryConfig = new AssemblyInfoConfig(); initializerEntry.Bind(initializerEntryConfig); ITelemetryInitializerFactory factory; try { // Using Reflection, get the ITelemetryInitializerFactory interface var factoryType = Type.GetType(initializerEntryConfig.ClassAssembly, throwOnError: true); factory = Activator.CreateInstance(factoryType) as ITelemetryInitializerFactory; ITelemetryInitializer telemetryInitializer = await factory.CreateInitializer(initializerEntry, logger, serviceProvider); TelemetryConfiguration.Active.TelemetryInitializers.Add(telemetryInitializer); } catch (Exception e) { logger?.LogError(0, e, nameof(Initialize)); } } // >>>>> Set up a custom app insights pipeline: add custom sinks var aiClientBuilder = TelemetryConfiguration.Active.TelemetryProcessorChainBuilder; // Get list from Config of IProcessorSinks, add them to the TelemetryProcessorChainBuilder var processorSinksSection = configAppInsights.GetSection(AppInsightsLoggingConfig.TelemetryProcessorSinks); foreach (var sinkSection in processorSinksSection.GetChildren()) { var sinkConfig = new AssemblyInfoConfig(); sinkSection.Bind(sinkConfig); ITelemetryProcessorSinkFactory factory; try { // Using Reflection, get the ITelemetryProcessorSinkFactory interface var factoryType = Type.GetType(sinkConfig.ClassAssembly, throwOnError: true); factory = Activator.CreateInstance(factoryType) as ITelemetryProcessorSinkFactory; await factory.UseProcessorSink(sinkSection, logger, aiClientBuilder); } catch (Exception e) { logger?.LogError(0, e, nameof(Initialize)); } } // Update the ai client configuration aiClientBuilder.Build(); }
public TelemetryClientBuilder AddInitializer(ITelemetryInitializer telemetryInitializer) { _initializers.Add(telemetryInitializer); return(this); }
/// <inheritdoc/> public override void Configure(IFunctionsHostBuilder builder) { var azureFuncConfig = builder?.Services?.BuildServiceProvider()?.GetService <IConfiguration>(); var configBuilder = new ConfigurationBuilder(); _ = configBuilder.AddConfiguration(azureFuncConfig); var configFolder = Directory.GetParent(Assembly.GetExecutingAssembly().Location).Parent?.FullName; _ = configBuilder.SetBasePath(configFolder); _ = configBuilder.AddJsonFile("functionSettings.json"); _ = configBuilder.AddEnvironmentVariables(); var configuration = configBuilder.Build(); MaxDequeueCount = configuration.GetSection(ConfigConstants.MaxDequeueCountConfigKey); AzureKeyVaultConfigurationOptions azureKeyVaultConfigurationOptions = new AzureKeyVaultConfigurationOptions(configuration[ConfigConstants.KeyVaultUrlConfigKey]) { ReloadInterval = TimeSpan.FromSeconds(double.Parse(configuration[Constants.KeyVaultConfigRefreshDurationSeconds])), }; _ = configBuilder.AddAzureKeyVault(azureKeyVaultConfigurationOptions); configuration = configBuilder.Build(); _ = configBuilder.AddAzureAppConfiguration(options => { var settings = options.Connect(configuration[ConfigConstants.AzureAppConfigConnectionstringConfigKey]) .Select(KeyFilter.Any, "Common").Select(KeyFilter.Any, "QueueProcessor"); _ = settings.ConfigureRefresh(refreshOptions => { _ = refreshOptions.Register(key: configuration[ConfigConstants.ForceRefreshConfigKey], refreshAll: true, label: LabelFilter.Null); }); }); configuration = configBuilder.Build(); ITelemetryInitializer[] itm = new ITelemetryInitializer[1]; var envInitializer = new EnvironmentInitializer { Service = configuration[AIConstants.ServiceConfigName], ServiceLine = configuration[AIConstants.ServiceLineConfigName], ServiceOffering = configuration[AIConstants.ServiceOfferingConfigName], ComponentId = configuration[AIConstants.ComponentIdConfigName], ComponentName = configuration[AIConstants.ComponentNameConfigName], EnvironmentName = configuration[AIConstants.EnvironmentName], IctoId = "IctoId", }; itm[0] = envInitializer; LoggingConfiguration loggingConfiguration = new LoggingConfiguration { IsTraceEnabled = true, TraceLevel = (SeverityLevel)Enum.Parse(typeof(SeverityLevel), configuration[ConfigConstants.AITraceLelelConfigKey]), EnvironmentName = configuration[AIConstants.EnvironmentName], }; var tconfig = TelemetryConfiguration.CreateDefault(); tconfig.InstrumentationKey = configuration[ConfigConstants.AIInsrumentationConfigKey]; DependencyTrackingTelemetryModule depModule = new DependencyTrackingTelemetryModule(); depModule.Initialize(tconfig); RequestTrackingTelemetryModule requestTrackingTelemetryModule = new RequestTrackingTelemetryModule(); requestTrackingTelemetryModule.Initialize(tconfig); _ = builder.Services.AddSingleton <ILogger>(_ => new AILogger(loggingConfiguration, tconfig, itm)); StorageType storageType = (StorageType)Enum.Parse(typeof(StorageType), configuration?[ConfigConstants.StorageType]); if (storageType == StorageType.DocumentDB) { _ = builder.Services.Configure <CosmosDBSetting>(configuration.GetSection(ConfigConstants.CosmosDBConfigSectionKey)); _ = builder.Services.Configure <CosmosDBSetting>(s => s.Key = configuration[ConfigConstants.CosmosDBKeyConfigKey]); _ = builder.Services.Configure <CosmosDBSetting>(s => s.Uri = configuration[ConfigConstants.CosmosDBURIConfigKey]); _ = builder.Services.AddScoped <ICosmosLinqQuery, CustomCosmosLinqQuery>(); _ = builder.Services.AddSingleton <ICosmosDBQueryClient, CosmosDBQueryClient>(); } _ = builder.Services.Configure <StorageAccountSetting>(configuration.GetSection(ConfigConstants.StorageAccountConfigSectionKey)); _ = builder.Services.Configure <StorageAccountSetting>(s => s.ConnectionString = configuration[ConfigConstants.StorageAccountConnectionStringConfigKey]); _ = builder.Services.AddSingleton <IConfiguration>(configuration); _ = builder.Services.AddScoped <IRepositoryFactory, RepositoryFactory>(); _ = builder.Services.AddScoped <EmailNotificationRepository>(); _ = builder.Services.AddScoped <IEmailNotificationRepository, EmailNotificationRepository>(s => s.GetService <EmailNotificationRepository>()); _ = builder.Services.AddScoped <TableStorageEmailRepository>(); _ = builder.Services.AddScoped <IEmailNotificationRepository, TableStorageEmailRepository>(s => s.GetService <TableStorageEmailRepository>()); _ = builder.Services.AddScoped <ITableStorageClient, TableStorageClient>(); _ = builder.Services.AddHttpClient <IHttpClientHelper, HttpClientHelper>(); }
/// <summary> /// Adds a telemetry initializer. /// </summary> /// <param name="configuration">The configuration.</param> /// <param name="initializer">The initializer.</param> /// <returns> /// The configuration for a fluent interface. /// </returns> /// <exception cref="System.ArgumentNullException">If any arguments are null.</exception> public static TelemetryConfiguration InitializeWith(this TelemetryConfiguration configuration, ITelemetryInitializer initializer) { if (configuration == null) { throw new ArgumentNullException("configuration"); } if (initializer == null) { throw new ArgumentNullException("initializer"); } configuration.TelemetryInitializers.Add(initializer); return(configuration); }
/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services">An instance of <see cref="IServiceCollection"/>.</param> public void ConfigureServicesCommon(IServiceCollection services) { _ = services.AddAzureAppConfiguration(); _ = services.AddAuthorization(configure => { configure.AddPolicy(ApplicationConstants.AppNameAuthorizePolicy, policy => { policy.Requirements.Add(new AppNameAuthorizeRequirement()); }); configure.AddPolicy(ApplicationConstants.AppIdAuthorizePolicy, policy => { policy.Requirements.Add(new AppIdAuthorizeRequirement()); }); }); _ = services.AddSingleton <IAuthorizationHandler, AppNameAuthorizePolicyHandler>(s => new AppNameAuthorizePolicyHandler(s.GetService <IHttpContextAccessor>(), this.Configuration)); _ = services.AddSingleton <IAuthorizationHandler, AppIdAuthorizePolicyHandler>(s => new AppIdAuthorizePolicyHandler(s.GetService <IHttpContextAccessor>(), this.Configuration)); _ = services.AddControllers(); _ = services.AddApplicationInsightsTelemetry(); _ = services.AddScoped(typeof(ValidateModelAttribute)); _ = services.AddOptions(); _ = services.Configure <StorageAccountSetting>(this.Configuration.GetSection(ConfigConstants.StorageAccountConfigSectionKey)); _ = services.Configure <StorageAccountSetting>(s => s.ConnectionString = this.Configuration[ConfigConstants.StorageAccountConnectionStringConfigKey]); _ = services.Configure <UserTokenSetting>(this.Configuration.GetSection(ConfigConstants.UserTokenSettingConfigSectionKey)); _ = services.Configure <RetrySetting>(this.Configuration.GetSection(ConfigConstants.RetrySettingConfigSectionKey)); _ = services.AddSingleton <IConfiguration>(this.Configuration); _ = services.AddSingleton <IEncryptionService, EncryptionService>(); _ = services.AddSingleton <IKeyEncryptionKey, CryptographyClient>(cc => new CryptographyClient(new Uri(this.Configuration[ConfigConstants.KeyVaultRSAUriConfigKey]), new DefaultAzureCredential())); _ = services.AddTransient <IHttpContextAccessor, HttpContextAccessor>() .AddSingleton <ICloudStorageClient, CloudStorageClient>() .AddScoped <ITokenHelper, TokenHelper>() .AddScoped <IRepositoryFactory, RepositoryFactory>() .AddSingleton <IEmailAccountManager, EmailAccountManager>(); StorageType storageType = (StorageType)Enum.Parse(typeof(StorageType), this.Configuration?[ConfigConstants.StorageType]); if (storageType == StorageType.DocumentDB) { this.ConfigureCosmosDB(services); } ConfigureStorageAccountServices(services); _ = services.AddHttpContextAccessor(); _ = services.AddAuthentication(ApplicationConstants.BearerAuthenticationScheme).AddJwtBearer(options => { options.Authority = this.Configuration[ConfigConstants.BearerTokenIssuerConfigKey]; options.ClaimsIssuer = this.Configuration[ConfigConstants.BearerTokenIssuerConfigKey]; options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters() { ValidateIssuer = false, ValidAudiences = this.Configuration[ConfigConstants.BearerTokenValidAudiencesConfigKey].Split(ApplicationConstants.SplitCharacter), }; }); ITelemetryInitializer[] itm = new ITelemetryInitializer[1]; var envInitializer = new EnvironmentInitializer { Service = this.Configuration[AIConstants.ServiceConfigName], ServiceLine = this.Configuration[AIConstants.ServiceLineConfigName], ServiceOffering = this.Configuration[AIConstants.ServiceOfferingConfigName], ComponentId = this.Configuration[AIConstants.ComponentIdConfigName], ComponentName = this.Configuration[AIConstants.ComponentNameConfigName], EnvironmentName = this.Configuration[AIConstants.EnvironmentName], IctoId = "IctoId", }; itm[0] = envInitializer; LoggingConfiguration loggingConfiguration = new LoggingConfiguration { IsTraceEnabled = true, TraceLevel = (SeverityLevel)Enum.Parse(typeof(SeverityLevel), this.Configuration[ConfigConstants.AITraceLelelConfigKey]), EnvironmentName = this.Configuration[AIConstants.EnvironmentName], }; #pragma warning disable CA2000 // Dispose objects before losing scope var tconfig = TelemetryConfiguration.CreateDefault(); #pragma warning restore CA2000 // Dispose objects before losing scope tconfig.InstrumentationKey = this.Configuration[ConfigConstants.AIInsrumentationConfigKey]; #pragma warning disable CA2000 // Dispose objects before losing scope DependencyTrackingTelemetryModule depModule = new DependencyTrackingTelemetryModule(); #pragma warning restore CA2000 // Dispose objects before losing scope depModule.Initialize(tconfig); #pragma warning disable CA2000 // Dispose objects before losing scope RequestTrackingTelemetryModule requestTrackingTelemetryModule = new RequestTrackingTelemetryModule(); #pragma warning restore CA2000 // Dispose objects before losing scope requestTrackingTelemetryModule.Initialize(tconfig); _ = services.AddSingleton <ILogger>(_ => new AILogger(loggingConfiguration, tconfig, itm)); }
/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services">An instance of <see cref="IServiceCollection"/>.</param> public void ConfigureServicesCommon(IServiceCollection services) { _ = services.AddAuthorization(configure => { configure.AddPolicy(Constants.AppNameAuthorizePolicy, policy => { policy.Requirements.Add(new AppNameAuthorizeRequirement()); }); configure.AddPolicy(Constants.AppAudienceAuthorizePolicy, policy => { policy.Requirements.Add(new AppAudienceAuthorizeRequirement()); }); }); _ = services.AddSingleton <IAuthorizationHandler, AppNameAuthorizePolicyHandler>(s => new AppNameAuthorizePolicyHandler(s.GetService <IHttpContextAccessor>(), this.Configuration)); _ = services.AddSingleton <IAuthorizationHandler, AppAudienceAuthorizePolicyHandler>(s => new AppAudienceAuthorizePolicyHandler(s.GetService <IHttpContextAccessor>(), this.Configuration)); _ = services.AddControllers(); _ = services.AddApplicationInsightsTelemetry(); _ = services.AddScoped(typeof(ValidateModelAttribute)); _ = services.AddOptions(); _ = services.Configure <MSGraphSetting>(this.Configuration.GetSection("MSGraphSetting")); _ = services.Configure <MSGraphSetting>(s => s.ClientCredential = this.Configuration["MSGraphSettingClientCredential"]); _ = services.Configure <MSGraphSetting>(s => s.ClientId = this.Configuration["MSGraphSettingClientId"]); _ = services.Configure <CosmosDBSetting>(this.Configuration.GetSection("CosmosDB")); _ = services.Configure <CosmosDBSetting>(s => s.Key = this.Configuration["CosmosDBKey"]); _ = services.Configure <CosmosDBSetting>(s => s.Uri = this.Configuration["CosmosDBURI"]); _ = services.Configure <StorageAccountSetting>(this.Configuration.GetSection("StorageAccount")); _ = services.Configure <StorageAccountSetting>(s => s.ConnectionString = this.Configuration["StorageAccountConnectionString"]); _ = services.Configure <UserTokenSetting>(this.Configuration.GetSection("UserTokenSetting")); _ = services.Configure <RetrySetting>(this.Configuration.GetSection("RetrySetting")); _ = services.AddSingleton <IConfiguration>(this.Configuration); _ = services.AddSingleton <IEncryptionService, EncryptionService>(); _ = services.AddSingleton <IKeyEncryptionKey, CryptographyClient>(cc => new CryptographyClient(new Uri(this.Configuration["KeyVault:RSAKeyUri"]), new DefaultAzureCredential())); _ = services.AddTransient <IHttpContextAccessor, HttpContextAccessor>() .AddScoped <ICosmosLinqQuery, CustomCosmosLinqQuery>() .AddSingleton <ICosmosDBQueryClient, CosmosDBQueryClient>() .AddSingleton <ICloudStorageClient, CloudStorageClient>() .AddScoped <ITokenHelper, TokenHelper>() .AddHttpClient <IMSGraphProvider, MSGraphProvider>(); _ = services.AddHttpContextAccessor(); _ = services.AddAuthentication("Bearer").AddJwtBearer(options => { options.Authority = this.Configuration["Authority"]; options.ClaimsIssuer = this.Configuration["BearerTokenAuthentication:Issuer"]; options.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters() { ValidateIssuer = true, ValidAudiences = this.Configuration["BearerTokenAuthentication:ValidAudiences"].Split(Constants.SplitCharacter), }; }); ITelemetryInitializer[] itm = new ITelemetryInitializer[1]; var envInitializer = new EnvironmentInitializer { Service = this.Configuration[Constants.ServiceConfigName], ServiceLine = this.Configuration[Constants.ServiceLineConfigName], ServiceOffering = this.Configuration[Constants.ServiceOfferingConfigName], ComponentId = this.Configuration[Constants.ComponentIdConfigName], ComponentName = this.Configuration[Constants.ComponentNameConfigName], EnvironmentName = this.Configuration[Constants.EnvironmentName], IctoId = "IctoId", }; itm[0] = envInitializer; LoggingConfiguration loggingConfiguration = new LoggingConfiguration { IsTraceEnabled = true, TraceLevel = (SeverityLevel)Enum.Parse(typeof(SeverityLevel), this.Configuration["ApplicationInsights:TraceLevel"]), EnvironmentName = this.Configuration[Constants.EnvironmentName], }; var tconfig = TelemetryConfiguration.CreateDefault(); tconfig.InstrumentationKey = this.Configuration["ApplicationInsights:InstrumentationKey"]; DependencyTrackingTelemetryModule depModule = new DependencyTrackingTelemetryModule(); depModule.Initialize(tconfig); RequestTrackingTelemetryModule requestTrackingTelemetryModule = new RequestTrackingTelemetryModule(); requestTrackingTelemetryModule.Initialize(tconfig); _ = services.AddSingleton <ILogger>(_ => new AILogger(loggingConfiguration, tconfig, itm)); }
public static IApplicationBuilder UseApplicationInsightsInitializer(this IApplicationBuilder applicationBuilder, ITelemetryInitializer telemetryInitializer) { applicationBuilder.ApplicationServices.GetRequiredService <TelemetryConfiguration>().TelemetryInitializers.Add(telemetryInitializer); return(applicationBuilder); }
/// <summary> /// This method gets called by the runtime. Use this method to add services to the container. /// </summary> /// <param name="services">An instance of <see cref="IServiceCollection"/>.</param> public void ConfigureServices(IServiceCollection services) { this.ConfigureServicesCommon(services); _ = services.AddMvc(); _ = services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "NotificationService", Version = "v1" }); }); ITelemetryInitializer[] itm = new ITelemetryInitializer[1]; var envInitializer = new EnvironmentInitializer { Service = this.Configuration[Constants.ServiceConfigName], ServiceLine = this.Configuration[Constants.ServiceLineConfigName], ServiceOffering = this.Configuration[Constants.ServiceOfferingConfigName], ComponentId = this.Configuration[Constants.ComponentIdConfigName], ComponentName = this.Configuration[Constants.ComponentNameConfigName], EnvironmentName = this.Configuration[Constants.EnvironmentName], IctoId = "IctoId", }; itm[0] = envInitializer; NotificationProviders.Common.Logger.LoggingConfiguration loggingConfiguration = new NotificationProviders.Common.Logger.LoggingConfiguration { IsTraceEnabled = true, TraceLevel = (SeverityLevel)Enum.Parse(typeof(SeverityLevel), this.Configuration["ApplicationInsights:TraceLevel"]), EnvironmentName = this.Configuration[Constants.EnvironmentName], }; var tconfig = TelemetryConfiguration.CreateDefault(); tconfig.InstrumentationKey = this.Configuration["ApplicationInsights:InstrumentationKey"]; DependencyTrackingTelemetryModule depModule = new DependencyTrackingTelemetryModule(); depModule.Initialize(tconfig); RequestTrackingTelemetryModule requestTrackingTelemetryModule = new RequestTrackingTelemetryModule(); requestTrackingTelemetryModule.Initialize(tconfig); _ = services.AddSingleton <NotificationProviders.Common.Logger.ILogger>(_ => new NotificationProviders.Common.Logger.AILogger(loggingConfiguration, tconfig, itm)); _ = services.AddSingleton <SendAccountConfiguration>(new SendAccountConfiguration() { DisplayName = this.Configuration["DirectSendSetting:DisplayName"], }); if (int.TryParse(this.Configuration["DirectSendSetting:SmtpPort"], out int port)) { _ = services.AddSingleton <ISmtpConfiguration>(new SmtpConfiguration() { SmtpPort = port, SmtpServer = this.Configuration["DirectSendSetting:SmtpServer"] }); } _ = services.AddSingleton <ISmtpClientFactory, DSSmtpClientFactory>() .AddSingleton <ISmtpClientPool, SmtpClientPool>() .AddSingleton <IEmailService, DirectSendMailService>(); _ = services.AddScoped <INotificationReportManager, NotificationReportManager>() .AddScoped <IEmailManager, EmailManager>(s => new EmailManager( this.Configuration, s.GetService <IRepositoryFactory>(), s.GetService <ILogger>(), s.GetService <IMailTemplateManager>(), s.GetService <ITemplateMerge>())) .AddScoped <IEmailServiceManager, EmailServiceManager>(s => new EmailServiceManager(this.Configuration, s.GetService <IRepositoryFactory>(), s.GetService <ICloudStorageClient>(), s.GetService <ILogger>(), s.GetService <INotificationProviderFactory>(), s.GetService <IEmailManager>())) .AddScoped <IRepositoryFactory, RepositoryFactory>() .AddScoped <EmailNotificationRepository>() .AddScoped <IEmailNotificationRepository, EmailNotificationRepository>(s => s.GetService <EmailNotificationRepository>()) .AddScoped <TableStorageEmailRepository>() .AddScoped <IEmailNotificationRepository, TableStorageEmailRepository>(s => s.GetService <TableStorageEmailRepository>()) .AddScoped <ITableStorageClient, TableStorageClient>() .AddScoped <IMailTemplateManager, MailTemplateManager>() .AddScoped <IMailTemplateRepository, MailTemplateRepository>() .AddScoped <IMailAttachmentRepository, MailAttachmentRepository>() .AddScoped <ITemplateMerge, TemplateMerge>() .AddSingleton <IEmailAccountManager, EmailAccountManager>() .AddScoped <INotificationProviderFactory, NotificationProviderFactory>() .AddScoped <DirectSendNotificationProvider>(s => new DirectSendNotificationProvider(this.Configuration, s.GetService <IEmailService>(), s.GetService <ILogger>(), s.GetService <IEmailManager>())) .AddScoped <INotificationProvider, DirectSendNotificationProvider>() .AddScoped <MSGraphNotificationProvider>(s => new MSGraphNotificationProvider(this.Configuration, s.GetService <IEmailAccountManager>(), s.GetService <ILogger>(), Options.Create(this.Configuration.GetSection("MSGraphSetting").Get <MSGraphSetting>()), Options.Create(this.Configuration.GetSection("PollyRetrySetting").Get <RetrySetting>()), s.GetService <ITokenHelper>(), s.GetService <IMSGraphProvider>(), s.GetService <IEmailManager>())) .AddScoped <INotificationProvider, MSGraphNotificationProvider>(); }
/// <inheritdoc/> public override void Configure(IFunctionsHostBuilder builder) { var configuration = builder?.Services?.BuildServiceProvider()?.GetService <IConfiguration>(); MaxDequeueCount = configuration.GetSection(ConfigConstants.MaxDequeueCountConfigKey); _ = builder.Services.AddAzureAppConfiguration(); ITelemetryInitializer[] itm = new ITelemetryInitializer[1]; var envInitializer = new EnvironmentInitializer { Service = configuration[AIConstants.ServiceConfigName], ServiceLine = configuration[AIConstants.ServiceLineConfigName], ServiceOffering = configuration[AIConstants.ServiceOfferingConfigName], ComponentId = configuration[AIConstants.ComponentIdConfigName], ComponentName = configuration[AIConstants.ComponentNameConfigName], EnvironmentName = configuration[AIConstants.EnvironmentName], IctoId = "IctoId", }; itm[0] = envInitializer; LoggingConfiguration loggingConfiguration = new LoggingConfiguration { IsTraceEnabled = true, TraceLevel = (SeverityLevel)Enum.Parse(typeof(SeverityLevel), configuration[ConfigConstants.AITraceLelelConfigKey]), EnvironmentName = configuration[AIConstants.EnvironmentName], }; var tconfig = TelemetryConfiguration.CreateDefault(); tconfig.InstrumentationKey = configuration[ConfigConstants.AIInsrumentationConfigKey]; DependencyTrackingTelemetryModule depModule = new DependencyTrackingTelemetryModule(); depModule.Initialize(tconfig); RequestTrackingTelemetryModule requestTrackingTelemetryModule = new RequestTrackingTelemetryModule(); requestTrackingTelemetryModule.Initialize(tconfig); _ = builder.Services.AddSingleton <ILogger>(_ => new AILogger(loggingConfiguration, tconfig, itm)); StorageType storageType = (StorageType)Enum.Parse(typeof(StorageType), configuration?[ConfigConstants.StorageType]); if (storageType == StorageType.DocumentDB) { _ = builder.Services.Configure <CosmosDBSetting>(configuration.GetSection(ConfigConstants.CosmosDBConfigSectionKey)); _ = builder.Services.Configure <CosmosDBSetting>(s => s.Key = configuration[ConfigConstants.CosmosDBKeyConfigKey]); _ = builder.Services.Configure <CosmosDBSetting>(s => s.Uri = configuration[ConfigConstants.CosmosDBURIConfigKey]); _ = builder.Services.AddScoped <ICosmosLinqQuery, CustomCosmosLinqQuery>(); _ = builder.Services.AddSingleton <ICosmosDBQueryClient, CosmosDBQueryClient>(); _ = builder.Services.AddScoped <EmailNotificationRepository>(); _ = builder.Services.AddScoped <IEmailNotificationRepository, EmailNotificationRepository>(s => s.GetService <EmailNotificationRepository>()); } _ = builder.Services.Configure <StorageAccountSetting>(configuration.GetSection(ConfigConstants.StorageAccountConfigSectionKey)); _ = builder.Services.Configure <StorageAccountSetting>(s => s.ConnectionString = configuration[ConfigConstants.StorageAccountConnectionStringConfigKey]); _ = builder.Services.AddScoped <IRepositoryFactory, RepositoryFactory>(); _ = builder.Services.AddScoped <TableStorageEmailRepository>(); _ = builder.Services.AddScoped <IEmailNotificationRepository, TableStorageEmailRepository>(s => s.GetService <TableStorageEmailRepository>()); _ = builder.Services.AddScoped <ITableStorageClient, TableStorageClient>(); _ = builder.Services.AddHttpClient <IHttpClientHelper, HttpClientHelper>(); _ = builder.Services.BuildServiceProvider(); }
public TelemetryConfigurationBuilder WithTelemetryInitializer(ITelemetryInitializer initializer) { _configuration.TelemetryInitializers.Add(initializer); return(this); }