示例#1
0
        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);
        }
示例#2
0
        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);
        }
示例#3
0
        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);
        }