private static MetricsWebHostOptions GetMetricsWebHostOptions(MetricsOptions metricsOptions) { var options = new MetricsWebHostOptions(); if (!metricsOptions.Enabled) { return(options); } if (!metricsOptions.PrometheusEnabled) { return(options); } options.EndpointOptions = endpointOptions => { switch (metricsOptions.PrometheusFormatter?.ToLowerInvariant() ?? string.Empty) { case "protobuf": endpointOptions.MetricsEndpointOutputFormatter = new MetricsPrometheusProtobufOutputFormatter(); break; default: endpointOptions.MetricsEndpointOutputFormatter = new MetricsPrometheusTextOutputFormatter(); break; } }; return(options); }
public static IConveyBuilder AddMetrics(this IConveyBuilder builder, MetricsOptions metricsOptions, AppOptions appOptions) { builder.Services.AddSingleton(metricsOptions); if (!builder.TryRegister(RegistryName) || !metricsOptions.Enabled || _initialized) { return(builder); } _initialized = true; //TODO: Remove once fixed https://github.com/AppMetrics/AppMetrics/issues/396 builder.Services.Configure <KestrelServerOptions>(o => o.AllowSynchronousIO = true); builder.Services.Configure <IISServerOptions>(o => o.AllowSynchronousIO = true); var metricsBuilder = new MetricsBuilder().Configuration.Configure(cfg => { var tags = metricsOptions.Tags; if (tags is null) { return; } tags.TryGetValue("app", out var app); tags.TryGetValue("env", out var env); tags.TryGetValue("server", out var server); cfg.AddAppTag(string.IsNullOrWhiteSpace(app) ? appOptions.Service : app); cfg.AddEnvTag(string.IsNullOrWhiteSpace(env) ? null : env); cfg.AddServerTag(string.IsNullOrWhiteSpace(server) ? null : server); if (!string.IsNullOrWhiteSpace(appOptions.Instance)) { cfg.GlobalTags.Add("instance", appOptions.Instance); } if (!string.IsNullOrWhiteSpace(appOptions.Version)) { cfg.GlobalTags.Add("version", appOptions.Version); } foreach (var tag in tags) { if (cfg.GlobalTags.ContainsKey(tag.Key)) { cfg.GlobalTags.Remove(tag.Key); } if (!cfg.GlobalTags.ContainsKey(tag.Key)) { cfg.GlobalTags.TryAdd(tag.Key, tag.Value); } } }); if (metricsOptions.InfluxEnabled) { metricsBuilder.Report.ToInfluxDb(o => { o.InfluxDb.Database = metricsOptions.Database; o.InfluxDb.BaseUri = new Uri(metricsOptions.InfluxUrl); o.InfluxDb.CreateDataBaseIfNotExists = true; o.FlushInterval = TimeSpan.FromSeconds(metricsOptions.Interval); }); } var metrics = metricsBuilder.Build(); var metricsWebHostOptions = GetMetricsWebHostOptions(metricsOptions); using (var serviceProvider = builder.Services.BuildServiceProvider()) { var configuration = serviceProvider.GetService <IConfiguration>(); builder.Services.AddHealth(); builder.Services.AddHealthEndpoints(configuration); builder.Services.AddMetricsTrackingMiddleware(configuration); builder.Services.AddMetricsEndpoints(configuration); builder.Services.AddSingleton <IStartupFilter>(new DefaultMetricsEndpointsStartupFilter()); builder.Services.AddSingleton <IStartupFilter>(new DefaultHealthEndpointsStartupFilter()); builder.Services.AddSingleton <IStartupFilter>(new DefaultMetricsTrackingStartupFilter()); builder.Services.AddMetricsReportingHostedService(metricsWebHostOptions.UnobservedTaskExceptionHandler); builder.Services.AddMetricsEndpoints(metricsWebHostOptions.EndpointOptions, configuration); builder.Services.AddMetricsTrackingMiddleware(metricsWebHostOptions.TrackingMiddlewareOptions, configuration); builder.Services.AddMetrics(metrics); } return(builder); }
public static IConveyBuilder AddMetrics(this IConveyBuilder builder, MetricsOptions options) { builder.Services.AddSingleton(options); if (!builder.TryRegister(RegistryName) || !options.Enabled || _initialized) { return(builder); } _initialized = true; var metricsBuilder = new MetricsBuilder().Configuration.Configure(cfg => { var tags = options.Tags; if (tags == null) { return; } tags.TryGetValue("app", out var app); tags.TryGetValue("env", out var env); tags.TryGetValue("server", out var server); cfg.AddAppTag(string.IsNullOrWhiteSpace(app) ? null : app); cfg.AddEnvTag(string.IsNullOrWhiteSpace(env) ? null : env); cfg.AddServerTag(string.IsNullOrWhiteSpace(server) ? null : server); foreach (var tag in tags) { if (!cfg.GlobalTags.ContainsKey(tag.Key)) { cfg.GlobalTags.Add(tag.Key, tag.Value); } } }); if (options.InfluxEnabled) { metricsBuilder.Report.ToInfluxDb(o => { o.InfluxDb.Database = options.Database; o.InfluxDb.BaseUri = new Uri(options.InfluxUrl); o.InfluxDb.CreateDataBaseIfNotExists = true; o.FlushInterval = TimeSpan.FromSeconds(options.Interval); }); } var metrics = metricsBuilder.Build(); var metricsWebHostOptions = GetMetricsWebHostOptions(options); using (var serviceProvider = builder.Services.BuildServiceProvider()) { var configuration = serviceProvider.GetService <IConfiguration>(); builder.Services.AddHealth(); builder.Services.AddHealthEndpoints(configuration); builder.Services.AddMetricsTrackingMiddleware(configuration); builder.Services.AddMetricsEndpoints(configuration); builder.Services.AddSingleton <IStartupFilter>(new DefaultMetricsEndpointsStartupFilter()); builder.Services.AddSingleton <IStartupFilter>(new DefaultHealthEndpointsStartupFilter()); builder.Services.AddSingleton <IStartupFilter>(new DefaultMetricsTrackingStartupFilter()); builder.Services.AddMetricsReportingHostedService(metricsWebHostOptions.UnobservedTaskExceptionHandler); builder.Services.AddMetricsEndpoints(metricsWebHostOptions.EndpointOptions, configuration); builder.Services.AddMetricsTrackingMiddleware(metricsWebHostOptions.TrackingMiddlewareOptions, configuration); builder.Services.AddMetrics(metrics); } return(builder); }