Heimdall.Abstractions 1.4.0

dotnet add package Heimdall.Abstractions --version 1.4.0
                    
NuGet\Install-Package Heimdall.Abstractions -Version 1.4.0
                    
This command is intended to be used within the Package Manager Console in Visual Studio, as it uses the NuGet module's version of Install-Package.
<PackageReference Include="Heimdall.Abstractions" Version="1.4.0" />
                    
For projects that support PackageReference, copy this XML node into the project file to reference the package.
<PackageVersion Include="Heimdall.Abstractions" Version="1.4.0" />
                    
Directory.Packages.props
<PackageReference Include="Heimdall.Abstractions" />
                    
Project file
For projects that support Central Package Management (CPM), copy this XML node into the solution Directory.Packages.props file to version the package.
paket add Heimdall.Abstractions --version 1.4.0
                    
#r "nuget: Heimdall.Abstractions, 1.4.0"
                    
#r directive can be used in F# Interactive and Polyglot Notebooks. Copy this into the interactive tool or source code of the script to reference the package.
#:package Heimdall.Abstractions@1.4.0
                    
#:package directive can be used in C# file-based apps starting in .NET 10 preview 4. Copy this into a .cs file before any lines of code to reference the package.
#addin nuget:?package=Heimdall.Abstractions&version=1.4.0
                    
Install as a Cake Addin
#tool nuget:?package=Heimdall.Abstractions&version=1.4.0
                    
Install as a Cake Tool

Heimdall

build license nuget

Heimdall ist ein eigenständiges, OTel-kompatibles .NET-Observability-System (Traces, Metriken, Logs) — eingebettet und stand-alone nutzbar. Es importiert Grafana-Dashboards (JSON) und rendert sie selbst (in-process PromQL-Engine + server-seitiges SVG), bietet eine professionelle Web-UI, eine Prometheus-kompatible HTTP-API, ein konfigurierbares Alarm-Subsystem und eine index-gestützte Attributfeldsuche. Kein Collector, keine externe Datenbank, kein SignalR — alles läuft im .NET-Prozess.

  • Backend: SQLite (FTS5 + Attribut-Index). Implementiert IHeimdallSink (Schreiben) und IHeimdallQuery (Lesen) — dasselbe Objekt geht überall rein. Ein Walhalla-Backend ist als künftiger NuGet-Konsument vorgesehen (siehe Walhalla-Backend).
  • Ingest: In-Process (OTel-SDK-Exporter, kein OTLP) oder OTLP/HTTP + OTLP/gRPC (Stand-alone-Empfänger).
  • UI: Server-gerenderte Blazor-Static-SSR unter /otel (Traces, Logs, Metriken, Endpoints, Dashboards, Alerts). JS nur als Progressive Enhancement.
  • Prometheus: PromQL-Engine + /api/v1/* — Grafana kann Heimdall direkt als Datenquelle nutzen.

Status: 1.1.0 — alle Tests grün, live verifiziert (CI: Windows + Linux, .NET 8/9/10). 1.0-Vorbereitung: SQLite-only, keine Cross-Repo-Abhängigkeiten mehr. Walhalla-Historie (1.0: SQLite-only, Walhalla-Backend vorausliegend) siehe DESIGN.md und Walhalla-Backend.


Inhalt


Pakete

Alle Pakete sind additiv und greifen nicht in bestehende Add*/Map*- Signaturen ein. Version 1.1.0, Target-Frameworks net8.0;net9.0;net10.0.

Paket Zweck
Heimdall.Abstractions Vertrag: IHeimdallSink, IHeimdallQuery, Model-Records (HLogRecord, HSpan, …), LogSearch/AttrFilter. Abhängigkeitsfrei. Das einzige Paket, das Consumer (auch Walhalla) referenzieren müssen.
Heimdall.Sdk In-Process-Exporter für das OpenTelemetry-SDK: AddOpenTelemetry().UseHeimdallExporter(...). Traces/Logs/Metriken landen direkt im Sink — ohne OTLP/HTTP/gRPC.
Heimdall.Direct Native API (HeimdallHub: Tracer/Logger/Meter) für Einbettung ohne OTel-SDK.
Heimdall.Ingest Bounded Buffer, Batching, Backpressure, Rekursionsschutz über IHeimdallSink.
Heimdall.Storage.SQLite SQLite-Backend (Microsoft.Data.Sqlite, FTS5-Volltext, heim_log_attrs-Attribut-Index, Retention-Sweeper). Empfohlen für den Einstieg. In 1.0 das einzige Backend.
Heimdall.Otlp OTLP/HTTP-Empfänger (/v1/{traces,metrics,logs}, Protobuf + JSON).
Heimdall.Otlp.Proto OTLP-Proto-Typen + OTLP→Heimdall-Konverter (transport-agnostisch).
Heimdall.Otlp.Grpc OTLP/gRPC-Empfänger (localhost:4317). Zieht Grpc.AspNetCore.
Heimdall.Prometheus PromQL-Engine + Prometheus-HTTP-API (/api/v1/*) + RED-Ableitung aus Spans. Storage-agnostisch.
Heimdall.Blazor Die Web-UI: Traces/Logs/Metriken/Endpoints/Dashboards/Alerts, server-gerendert. Enthält das Alarm-Subsystem.
Heimdall.AspNetCore.Enrichment Dünne Middleware: taggt den OTel-Server-Span mit aspnetmvc.controller/action/route für den Controller/Endpoint-Drilldown. (Paket-ID; Namespace bleibt Heimdall.AspNetCore.)

Installation

1. Pakete beziehen

Ab der 1.0 liegen die Heimdall-Pakete auf nuget.org — dann reicht ein schlichtes dotnet add package Heimdall.Sdk (bzw. --version 1.1.0). Für Pre-Release- oder Integrationsbuilds liegt ein lokaler Feed unter artifacts/nupkg/; diesen als NuGet-Source hinzufügen (z. B. in der nuget.config eures API-Projekts):

# im Projektverzeichnis der realen API; <HEIMDALL-REPO> = Pfad zum Heimdall-Checkout
dotnet nuget add source "<HEIMDALL-REPO>/artifacts/nupkg" -n HeimdallLocal

oder als nuget.config:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <packageSources>
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
    <add key="HeimdallLocal" value="<HEIMDALL-REPO>/artifacts/nupkg" />
  </packageSources>
</configuration>

2. Pakete neu bauen (optional)

Falls sich der Code geändert hat, Pakete neu erzeugen:

cd Heimdall
# packt alle Heimdall-Src-Projekte (IsPackable=true) nach artifacts/nupkg
# (Version 1.1.0 zentral in Directory.Build.props):
dotnet pack Heimdall.slnx -c Release -o artifacts/nupkg

3. Pakete referenzieren

Für die in-Process-Einbettung (Pfad A) in eurer realen API:

dotnet add package Heimdall.Sdk          --version 1.1.0
dotnet add package Heimdall.Storage.SQLite --version 1.1.0
dotnet add package Heimdall.Blazor         --version 1.1.0
dotnet add package Heimdall.Prometheus     --version 1.1.0
dotnet add package Heimdall.AspNetCore.Enrichment --version 1.1.0

Heimdall-Pakete ziehen einander (jedes hängt an Heimdall.Abstractions); die öffentlichen OpenTelemetry-Abhängigkeiten kommen von nuget.org.


Erste Schritte

Heimdall kennt zwei Einbettungspfade. Pfad A ist der schnellste für „eine reale API instrumentieren und das Dashboard sehen" — alles im Prozess, kein Collector.

Pfad A — Eingebettet (in-process, kein OTLP)

Eine ASP.NET-Core-WebAPI, die ihre Telemetrie per Heimdall-SDK-Exporter direkt in den eingebetteten SQLite-Sink schreibt und das Dashboard im selben Prozess bereitstellt.

Program.cs:

using Heimdall;
using Heimdall.AspNetCore;
using Heimdall.Blazor;
using Heimdall.Prometheus;
using Heimdall.Sdk;
using Heimdall.Storage.SQLite;
using OpenTelemetry;
using OpenTelemetry.Logs;
using OpenTelemetry.Metrics;
using OpenTelemetry.Trace;

var builder = WebApplication.CreateBuilder(args);

// 1) Backend: SQLite ist IHeimdallSink (Schreiben) UND IHeimdallQuery (Lesen).
var sink = new SQLiteTelemetrySink(new SQLiteTelemetryOptions
{
    DataPath = "heimdall.db",     // persistent; RetentionDays=7 default
});

// 2) Dashboard + Prometheus + Grafana-Store registrieren (das selbe Sink-Objekt).
builder.Services.AddHeimdallDashboard(sink)
    .AddHeimdallPrometheus(sink, sink)          // PromQL + RED aus Spans
    .AddHeimdallDashboards("./dashboards");      // dateibasierter Grafana-Store

// 3) OTel-Resource: service.name/version + deployment.environment + host.name
//    (werden vom SQLite-Backend als Metrik-Label übernommen → service_name-Filter
//    des otel-dotnet-webapi-Dashboards greifen).
var exporterOpts = new HeimdallExporterOptions
{
    Sink = sink,
    ServiceName = "MyApi",
    ServiceVersion = "1.0.0",
    ResourceAttributes = new[]
    {
        new HAttribute("deployment.environment", "production"),
        new HAttribute("host.name", Environment.MachineName),
    },
    MetricExportIntervalMs = 15_000,           // 15 s → rate()-Fenster füllen sich schnell
};

builder.Logging.AddOpenTelemetry(o => { o.IncludeFormattedMessage = true; o.IncludeScopes = true; });

// 4) OTel-SDK: alle 3 Signale direkt in den Heimdall-Sink (in-process).
builder.Services.AddOpenTelemetry()
    .WithTracing(t => t.AddAspNetCoreInstrumentation()
                       .AddHttpClientInstrumentation()
                       .UseHeimdallExporter(exporterOpts))
    .WithMetrics(m => m.AddAspNetCoreInstrumentation()
                       .AddHttpClientInstrumentation()
                       .AddRuntimeInstrumentation()
                       .UseHeimdallExporter(exporterOpts))
    .WithLogging(l => l.UseHeimdallExporter(exporterOpts));

// 5) Controller/Endpoint-Drilldown: taggt Server-Spans mit echten Namen.
builder.Services.AddHeimdallAspNetCore();

builder.Services.AddControllers();

var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
app.UseHeimdallAspNetCore();        // nach UseRouting, vor MapControllers
app.MapControllers();
app.MapHeimdallDashboard("/otel"); // UI + Dashboards unter /otel
app.MapHeimdallPrometheus("/otel"); // Prom-HTTP-API (/api/v1/*) — Grafana-kompatibel
app.Run();

Starten:

dotnet run

Dann:

  • Dashboard: http://localhost:<port>/otel (Übersicht, Dashboard, Dashboards, Endpoints, Drilldown → Traces/Logs/Metriken, Alerts)
  • Prometheus-API: http://localhost:<port>/otel/api/v1/query?query=... (Grafana kann hier als Datenquelle zeigen)
  • Logs-Feldsuche: http://localhost:<port>/otel/logs?q={service.name="MyApi"} |= "error"

Die reale API erzeugt nun echte Server-Spans, ASP.NET-/Runtime-Metriken und Logs, die sofort im Dashboard erscheinen.

Eingebettet hinter einem Login (opt-in)

Heimdall lässt sich opt-in hinter einen Name/Passwort-Login verbauen — nützlich, wenn das eingebettete Dashboard in einer App erreichbar ist, die nicht jeden Besucher zur Observability-Oberfläche lassen soll. Die Auth lebt in der Bibliothek (Heimdall.AspNetCore, UseHeimdallAuth) und ist dieselbe, die der Stand-alone-Host nutzt; konfiguriert wird sie in appsettings.json:

"Heimdall": { "Auth": { "Enabled": true, "Username": "admin", "Password": "change-me", "ApiKey": "change-me-too" } }

Im Host der App drei Zeilen (vor UseStaticFiles/Map*):

var auth = builder.Configuration.GetSection("Heimdall:Auth").Get<HeimdallAuthOptions>() ?? new();
auth.ProtectedPrefix = "/otel";   // nur /otel/* schützen — App-Routes (/api/…) bleiben frei
auth.Validate();
…
app.UseHeimdallAuth(auth);
  • UI (/otel/*): HTTP-Basic-Auth (browser-nativer Login-Dialog, kein JS) gegen Username + Password. Username null = beliebiger Name (Shared-Password).
  • Prom-API (/otel/api/v1/*): Header x-heimdall-key gegen ApiKey (Header only — kein Query-Fallback; Query-Strings landen in Access-Logs).
  • ProtectedPrefix: nur dieser Subtree wird geschützt; die App-eigenen Routes bleiben frei (im Gegensatz zum Stand-alone-Host, dessen Routes sämtlich Heimdalls sind → dort kein Prefix, globale Auth).
  • Enabled=false (Default) = Zero-Overhead-Passthrough — bestehende Deployments unverändert.
  • Vergleiche zeitkonstant (SecretComparer/FixedTimeEquals).

Eigentelemetrie unterdrücken (Heimdall:SelfTelemetry)

Betreibt man Heimdall eingebettet (Pfad A), erfasst das OTel-SDK der umgebenden App den ganzen Prozess — inklusive der Heimdall-Oberfläche selbst: jeder Dashboard-Aufruf (/otel/*) erzeugt Spans/Metriken, und Heimdalls interne Diagnose-Logs (AlertEvaluator, Alarm-Kanäle — Kategorie Heimdall.Blazor.Alerts.*) landen über den Logger-Exporter im Log-Store. Im Dashboard verrauscht das die eigentlich zu beobachtende App. Daher ist die Erfassung der Heimdall-Eigentelemetrie per Default aus — angeschaltet wird sie nur, wenn man Heimdall selbst untersuchen will. Konfiguriert in appsettings.json:

"Heimdall": { "SelfTelemetry": { "Enabled": false } }
  • Enabled: false (Default) — der Heimdall-Exporter verwirft Spans mit http.route/http.target/url.path/aspnetmvc.route-Prefix /otel und Metrik-Punkte mit http.route-Prefix /otel sowie Logs der Kategorie Heimdall.Blazor.Alerts.*. App-eigene Routes (/api/…) und Runtime-Metriken (GC, ThreadPool, …) bleiben unangetastet.
  • Enabled: true — nichts wird verworfen; alle Telemetrie inkl. Heimdalls eigener landet im Dashboard (für die Fehlersuche an Heimdall selbst).

Warum Heimdall.Blazor.Alerts und nicht pauschal Heimdall.? Die Heimdall- Bibliotheken loggen nur unter Heimdall.Blazor.Alerts.* (AlertEvaluator + Kanäle). Der präzise Prefix verhindert, dass App-eigene Logs unter einem Heimdall.*-Namespace (z. B. Heimdall.MyCompany.*) mitgefiltert werden. Wer sicherheitshalber alle Heimdall-Bibliotheks-Logs herauswerfen will, setzt "Heimdall." — riskiert dann aber die App-Kollision.

Die Schalter sitzen im Library-Exporter (HeimdallExporterOptions), nicht nur im Sample — jeder Embedded-Nutzer profitiert. Im Host der App:

var resource = new HeimdallExporterOptions { Sink = sink, ServiceName = "MyApi", … };
if (!builder.Configuration.GetValue<bool>("Heimdall:SelfTelemetry:Enabled"))
{
    resource.ExcludeRoutePrefixes = new[] { "/otel" };                 // Dashboard-Routes
    resource.ExcludeLogCategoryPrefixes = new[] { "Heimdall.Blazor.Alerts" }; // Diagnose-Logs
}
builder.Services.AddOpenTelemetry()
    .WithTracing(t => t.UseHeimdallExporter(resource))
    .WithMetrics(m => m.UseHeimdallExporter(resource))
    .WithLogging(l => l.UseHeimdallExporter(resource));

Beide Listen sind frei konfigurierbar: weitere eigene Pfade (z. B. /health) oder weitere Kategorie-Prefixe lassen sich ergänzen; null/leer = nichts verwerfen.

Pfad B — Stand-alone Host + OTLP

Wenn die reale API bereits OTLP exportiert (oder soll), läuft Heimdall als eigenständiger Empfänger (Grafana-Stack-Äquivalent), konfiggetrieben:

cd Heimdall
dotnet run --project host/Heimdall.Host -c Release
# UI:        http://localhost:5099/otel
# OTLP/HTTP: POST http://localhost:5099/otel/v1/{traces,metrics,logs}
# OTLP/gRPC: localhost:4317
# Prom-API:  http://localhost:5099/otel/api/v1/*

Die reale API bekommt das normale OTel-SDK mit OTLP-Exporter, der auf den Host zeigt:

builder.Services.AddOpenTelemetry()
    .WithTracing(t => t.AddAspNetCoreInstrumentation()
                       .AddOtlpExporter(o => o.Endpoint = new Uri("http://localhost:4317")))
    .WithMetrics(m => m.AddRuntimeInstrumentation()
                       .AddOtlpExporter(o => o.Endpoint = new Uri("http://localhost:4317")))
    .WithLogging(l => l.AddOtlpExporter(o => o.Endpoint = new Uri("http://localhost:4317")));

Die Host-Konfiguration liegt in host/Heimdall.Host/appsettings.json (Sektion Heimdall): Backend (1.0: sqlite), DataPath, Retention, OTLP-HTTP/gRPC (je MaxConcurrentRequests-Cap, C1), Prometheus, Dashboard, Alerting, Auth (ApiKey/Username/Password), SeedDemoData. Siehe auch host/Heimdall.Host/README.md.


Dashboards & Grafana-Import

Heimdall importiert Grafana-Dashboard-JSON und rendert sie selbst — unabhängig von einem laufenden Grafana. Unterstützte Panel-Typen: Timeseries, Stat (graphMode=area → Kachel mit Sparkline), Table, Gauge, BarGauge, Pie, Heatmap, Logs (Loki via eigenem Log-Store). Template-Variablen ($service_name, $http_route, …) werden als var-*-Query-Parameter übergeben.

  • Import: http://localhost:<port>/otel/dashboards/import (Datei-Upload oder JSON).
  • Datei-Store: Verzeichnis aus AddHeimdallDashboards(dir) bzw. Host Heimdall:DashboardsStore:Dir.
  • Beispiel-Dashboard: otel-dotnet-webapi (gnetId 20568, .NET-OTel-WebAPI) liegt in host/Heimdall.Host/var/heimdall/dashboards/.

Alternativ nutzt ihr ein echtes Grafana mit Heimdall als Prometheus-Datenquelle (http://host/otel/api/v1).


Features

  • Traces: Listen, Wasserfall-Detail, Filter (Name/Service/Fehler), Zeitraum. Controller/Endpoint-Drilldown (/otel/endpoints) aus aspnetmvc.*-Tags.
  • Metriken: Metrik-Serien, Prometheus-PromQL (rate, histogram_quantile, topk, …), RED-Ableitung (Rate/Errors/Duration) aus Server-Spans, Runtime-Metriken.
  • Logs: Seq-style Tabelle (volle Breite, ganze Zeile aufklappbar), Body-Volltext (FTS5) und index-gestützte Attributfeldsuche ({service.name="x"} |= "text", Op = != =~ !~, Key-Norm .↔_), strict Loki-Semantik. Deckt Log- und Resource-Attribute (service.name).
  • Alerting: Regeln über Logs/Metriken/Traces, Zustandsautomat (OK→Pending→Firing→Resolved + Dedup), Kanäle Logger/SMTP/Webhook, file-basierte Rule- und State-Stores, UI unter /otel/alerts. Lebt vollständig in Heimdall.Blazor.
  • Prometheus-API: /api/v1/{query,query_range,labels,series,status/buildinfo}
    • Text-Exposition. Range-Query-Prefetch (Dashboard-Render 108 s → 0,8 s).
  • UI: Responsive, Dark-Only, Crosshair/Brushing, moderner Zeitbereich + Auto-Refresh, server-gerendert (kein SignalR).
  • Auth (Host): minimal — API-Key (x-heimdall-key, Header only) für OTLP + Prom-API, Basic-Auth für die UI, via Prefix-Middleware. Zeitkonstanter Vergleich (SecretComparer/FixedTimeEquals); kein Query-Fallback (Access-Log- Hygiene). Bibliotheken bleiben auth-frei.
  • Admission Control (Host, C1): Concurrency-Cap auf den OTLP-Empfängern (Heimdall:Otlp:{Http,Grpc}:MaxConcurrentRequests, Default 32, 0=unbegrenzt); Überlauf → HTTP 429 / gRPC ResourceExhausted (retrybar). Schützt den Single-Connection-SQLite-Sink vor Last-Spitzen.
  • Host-Self-Observability (C3): synthetisierte heimdall.host.*-Metriken — Ingest-Volume pro Signal (heimdall.host.ingest{signal=…}, Prom *_total) + Sweep-Latenz (heimdall.host.sweep.duration, Prom *_seconds); in-memory, nicht in heim_metrics gespeichert (kein Selbst-Feedback). Ergänzt A4 (heimdall.retention.*/heimdall.storage.*).
  • Graceful Shutdown (C4): Sink-Dispose nach Kestrel-Drain (ApplicationStopped); in-flight OTLP-Writes committen vor dem Verbindungs- Abbau; IngestBuffer draint beim Stopp vollständig.

Projektstruktur

src/
  Heimdall.Abstractions/     Vertrag (Schnittstellen + Records)
  Heimdall.Sdk/               OTel-SDK in-process Exporter
  Heimdall.Direct/            Native API ohne OTel-SDK
  Heimdall.Ingest/            Buffer/Batching/Backpressure
  Heimdall.Storage.SQLite/    SQLite-Backend (empfohlen, 1.0 einziges Backend)
  Heimdall.Otlp(.Proto/.Grpc)/ OTLP-Empfänger (HTTP + gRPC)
  Heimdall.Prometheus/        PromQL + Prom-HTTP-API
  Heimdall.Blazor/            Web-UI + Alerts + Grafana-Renderer
  Heimdall.AspNetCore/        Controller/Endpoint-Enrichment
host/Heimdall.Host/           Stand-alone Host (config-getrieben, Docker)
samples/
  Heimdall.OtelSample/        WebAPI + in-process Exporter + Live-Dashboard
  Heimdall.MvcSample/         WebAPI + Controller/Endpoint-Drilldown
tests/Heimdall.Tests/         xUnit, net8/9/10 (siehe CI-Badge)
artifacts/nupkg/              lokale NuGet-Pakete (1.1.0)

Bauen aus dem Source

cd Heimdall

# Solution bauen (net8/9/10)
dotnet build Heimdall.slnx -c Release

# Tests
dotnet test tests/Heimdall.Tests/Heimdall.Tests.csproj -c Release --no-build

# Samples starten (jeweils eigenständig, frische Temp-DB)
dotnet run --project samples/Heimdall.OtelSample   # http://localhost:5198/otel
dotnet run --project samples/Heimdall.MvcSample    # http://localhost:5199/otel

Voraussetzungen: .NET 8/9/10 SDK. 1.0 ist SQLite-only und hat keine Cross-Repo-Abhängigkeiten — ein kompletter Klon baut und testet ohne das Nachbarrepo ../Walhalla.

Roadmap: Walhalla-Backend (v2.0.0)

Geplant für 2.0.0, nicht Teil der 1.x-Linie. Bis dahin gilt Backend=sqlite.

A) Walhalla als Heimdall-Storage-Backend (ersetzt SQLite). Das frühere Heimdall.Storage.Walhalla (konsumierte die eingebettete WalhallaSql-Engine via cross-repo ProjectReference) ist aus Heimdall entfernt. Die Vertrags-Schicht Heimdall.Abstractions ist so angelegt, dass Walhalla künftig als NuGet-Konsument wiederkommt: sobald Heimdall.Abstractions gepackt ist, referenziert ein separates Heimdall.Storage.Walhalla-Paket nur dieses Paket (keine Zirkelabhängigkeit mehr) und implementiert IHeimdallSink + IHeimdallQuery + IHeimdallMetricSource — die SQLite-Implementierung (src/Heimdall.Storage.SQLite) ist dabei die Referenz-Spec. Der Erweiterungspunkt steht bereits in host/Heimdall.Host/Program.cs (BuildSink, Zweig Backend=="walhalla").

B) Heimdall als Telemetriesystem für Walhalla. Walhalla wird mit dem OpenTelemetry-.NET-SDK + UseHeimdallExporter instrumentiert (Metriken, Traces pro SQL-Statement, Logs). Zur Vermeidung der Rekursion gilt die Zwei-Instanzen-Topologie: Heimdall-DATA (Backend=walhalla, speichert App-Telemetrie in Walhalla-prod, instrumentiert sich NICHT selbst) und Heimdall-CONTROL (empfängt Walhallas Selbst-Telemetrie, speichert sie NICHT im überwachten Walhalla-prod, sondern in SQLite oder einem separaten Kontroll-Depot) — sonst verstärkt sich die Schleife, und bei einem Walhalla-Ausfall fiele genau die Telemetrie aus, die ihn melden soll.

Product Compatible and additional computed target framework versions.
.NET net8.0 is compatible.  net8.0-android was computed.  net8.0-browser was computed.  net8.0-ios was computed.  net8.0-maccatalyst was computed.  net8.0-macos was computed.  net8.0-tvos was computed.  net8.0-windows was computed.  net9.0 is compatible.  net9.0-android was computed.  net9.0-browser was computed.  net9.0-ios was computed.  net9.0-maccatalyst was computed.  net9.0-macos was computed.  net9.0-tvos was computed.  net9.0-windows was computed.  net10.0 is compatible.  net10.0-android was computed.  net10.0-browser was computed.  net10.0-ios was computed.  net10.0-maccatalyst was computed.  net10.0-macos was computed.  net10.0-tvos was computed.  net10.0-windows was computed. 
Compatible target framework(s)
Included target framework(s) (in package)
Learn more about Target Frameworks and .NET Standard.
  • net10.0

    • No dependencies.
  • net8.0

    • No dependencies.
  • net9.0

    • No dependencies.

NuGet packages (10)

Showing the top 5 NuGet packages that depend on Heimdall.Abstractions:

Package Downloads
Heimdall.Otlp.Proto

Heimdall OTLP-Proto-Typen + OtlpConvert: generiert die OTLP-Messages (opentelemetry-proto v1.7.0, GrpcServices="None") und den OTLP→Heimdall-Konverter. Transport-agnostisch — Konsum von Heimdall.Otlp (HTTP) und Heimdall.Otlp.Grpc (gRPC) gleichermaßen. Die 3 Collector-Service-protos liegen hier als Dateien, werden aber nur von Heimdall.Otlp.Grpc (Server) kompiliert.

Heimdall.Prometheus

Heimdall Prometheus-compatible HTTP API + PromQL engine. Exposes stored OTel metrics as a Prometheus data source (Grafana points at /api/v1/*). Storage-agnostic — consumes IHeimdallMetricSource + IHeimdallQuery only.

Heimdall.AspNetCore.Enrichment

Heimdall ASP.NET Core integration: (1) a thin enrichment middleware that tags the OTel server span with aspnetmvc.controller / aspnetmvc.action / aspnetmvc.route read from the MVC pipeline metadata, so the Heimdall dashboard can drill down API → Controller → Endpoint by real names (no own metric, no measurement — pure Activity-tag enrichment); (2) an optional, opt-in auth gate (HeimdallAuthMiddleware / UseHeimdallAuth) that protects the Heimdall surface behind a name/password Basic-Auth (UI) plus an x-heimdall-key API-Key (OTLP/HTTP + Prom-API), prefix-scoped so the host app's own routes stay free. SecretComparer (zeitkonstant) from Heimdall.Abstractions.

Heimdall.Blazor

Heimdall embedded observability UI: server-rendered Blazor dashboard (traces / logs / metrics) consuming IHeimdallQuery. No SignalR/JS required — static SSR, maximally embeddable.

Heimdall.Storage.SQLite

Heimdall storage backend backed by SQLite (Microsoft.Data.Sqlite) with FTS5 fulltext search. Mature, stable alternative to the Walhalla backend.

GitHub repositories

This package is not used by any popular GitHub repositories.

Version Downloads Last Updated
1.4.0 386 9/11/2026
1.3.1 396 9/2/2026
1.3.0 270 9/2/2026
1.2.0 516 8/24/2026
1.1.0 306 8/24/2026
1.0.2 291 8/22/2026
1.0.1 259 8/22/2026
1.0.0 291 8/22/2026