Nextended.Aspire.Hosting.Grafana
📚 Vollständige API-Referenz — jeder öffentliche Typ und Member, erzeugt aus der kompilierten Assembly.
Der Grafana-Observability-Stack für .NET Aspire: Grafana, Prometheus, Loki, Tempo, Promtail, cAdvisor, postgres_exporter und der OpenTelemetry Collector als kombinierbare Container-Ressourcen. Datenquellen werden automatisch bereitgestellt, sämtliche YAML-Konfigurationen beim Anwendungsstart aus den tatsächlichen Ressourcennamen erzeugt — keine fest verdrahteten Konfigurationsdateien, und die Fluent-Aufrufe funktionieren in beliebiger Reihenfolge.
▶ Beispielprojekt ansehen — lauffähiger AppHost für diese Integration.
Installation
dotnet add package Nextended.Aspire.Hosting.GrafanaIns AppHost-Projekt.
Fluent API
var builder = DistributedApplication.CreateBuilder(args);
var pg = builder.AddPostgres("pg");
builder.AddGrafana("grafana")
.WithAnonymousAdmin() // oder .WithAdminUser("admin", password)
.WithPrometheus(configure: p => p
.WithRetention("30d")
.WithScrapeTarget("api", "my-api:8080")
.WithDataVolume())
.WithLoki(configure: l => l.WithPromtail()) // Promtail liefert alle Docker-Container-Logs
.WithTempo()
.WithOtelCollector() // OTLP-Empfänger, verteilt an Tempo/Loki/Prometheus
.WithCAdvisor() // CPU-, Speicher- und Netzwerkmetriken pro Container
.WithPostgresDatasource(pg) // die Datenbank aus Grafana heraus durchsuchen
.WithPostgresExporter(pg) // Datenbank-Interna als Prometheus-Metriken
.WithDashboards("./dashboards", "MyApp") // Dashboard-JSONs werden automatisch geladen
.WithDataVolume(); // Grafana-Zustand übersteht ein Neuanlegen des Containers
builder.Build().Run();Jeder Komponentenaufruf legt zusätzlich die passende Grafana-Datenquelle an, verdrahtet die Startreihenfolge über WaitFor und hängt den Container im Aspire-Dashboard unter Grafana ein.
Eigene Datenquellen
Was die typisierten Methoden nicht abdecken, geht über den Notausgang:
grafana.WithDatasource(new GrafanaDatasource
{
Name = "MySQL",
Type = "mysql",
Url = "my-mysql:3306",
User = "app",
});Der ganze Stack in einem Aufruf
using Nextended.Aspire.Hosting.Observability;
builder.AddObservabilityStack(new ObservabilityStackOptions
{
ConfigRootPath = Path.Combine(builder.AppHostDirectory, "observability"),
IncludeTempo = true,
IncludeOtelCollector = true,
GrafanaDashboardsFolder = "MyApp",
});Nextended.Aspire.Hosting.Supabase baut auf diesem Paket auf und ergänzt eine Überladung, die die Postgres-Verbindung aus einem Supabase-Stack ableitet: builder.AddObservabilityStack(supabase, opts => …).
Hinweise
Docker-Socket. Promtail und cAdvisor brauchen den Docker-Socket des Hosts. Im Publish-Modus (azd up) werden sie deshalb automatisch übersprungen.
Erzeugte Konfigurationen einsehen. Die generierten Dateien landen unter {configRoot}/.generated/. Sie können also nachsehen, was die Container tatsächlich geladen haben — nützlich, wenn eine Datenquelle nicht so reagiert wie erwartet.
Geheimnisse. Datenquellen-Passwörter laufen über Container-Umgebungsvariablen; das erzeugte YAML enthält nur ${VAR}-Referenzen. Im Konfigurationsverzeichnis steht damit kein Klartext.
Ausführbares Beispiel
git clone https://github.com/fgilde/Nextended.git
cd Nextended/Tests/TestProjects/Grafana.AppHost
dotnet runUnterstützte Frameworks
net8.0net9.0net10.0
Abhängigkeiten
Aspire.Hosting.AppHostAspire.Hosting.PostgreSQL