Encoding.RegisterProvider(CodePagesEncodingProvider.Instance);
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Diagnostics.HealthChecks;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using Microsoft.Extensions.Logging;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;
namespace Microsoft.Extensions.Hosting;
public static class Extensions
public static IHostApplicationBuilder AddServiceDefaults(this IHostApplicationBuilder builder)
builder.ConfigureOpenTelemetry();
builder.AddDefaultHealthChecks();
builder.Services.AddServiceDiscovery();
builder.Services.ConfigureHttpClientDefaults(http =>
http.AddStandardResilienceHandler();
http.UseServiceDiscovery();
public static IHostApplicationBuilder ConfigureOpenTelemetry(this IHostApplicationBuilder builder)
builder.Logging.AddOpenTelemetry(logging =>
logging.IncludeFormattedMessage = true;
logging.IncludeScopes = true;
builder.Services.AddOpenTelemetry()
metrics.AddRuntimeInstrumentation()
if (builder.Environment.IsDevelopment())
tracing.SetSampler(new AlwaysOnSampler());
tracing.AddAspNetCoreInstrumentation()
.AddGrpcClientInstrumentation()
.AddHttpClientInstrumentation();
builder.AddOpenTelemetryExporters();
private static IHostApplicationBuilder AddOpenTelemetryExporters(this IHostApplicationBuilder builder)
var useOtlpExporter = !string.IsNullOrWhiteSpace(builder.Configuration["OTEL_EXPORTER_OTLP_ENDPOINT"]);
builder.Services.Configure<OpenTelemetryLoggerOptions>(logging => logging.AddOtlpExporter());
builder.Services.ConfigureOpenTelemetryMeterProvider(metrics => metrics.AddOtlpExporter());
builder.Services.ConfigureOpenTelemetryTracerProvider(tracing => tracing.AddOtlpExporter());
public static IHostApplicationBuilder AddDefaultHealthChecks(this IHostApplicationBuilder builder)
builder.Services.AddHealthChecks()
.AddCheck("self", () => HealthCheckResult.Healthy(), ["live"]);
public static WebApplication MapDefaultEndpoints(this WebApplication app)
app.MapHealthChecks("/health");
app.MapHealthChecks("/alive", new HealthCheckOptions
Predicate = r => r.Tags.Contains("live")
private static MeterProviderBuilder AddBuiltInMeters(this MeterProviderBuilder meterProviderBuilder) =>
meterProviderBuilder.AddMeter(
"Microsoft.AspNetCore.Hosting",
"Microsoft.AspNetCore.Server.Kestrel",
var utf8bytes = Encoding.UTF8.GetBytes(s);
var w1252bytes = Encoding.GetEncoding(1252).GetBytes(s);
Console.WriteLine(string.Join(" ", utf8bytes));
Console.WriteLine(string.Join(" ", w1252bytes));
Console.WriteLine(utf8bytes.SequenceEqual(w1252bytes));