Jede Option auf QueueHawkOptions, was sie tut, ihr Default, und wann man sie tatsächlich ändert. Alle Optionen sind optional ausser ApiKey.
builder.Services.AddQueueHawk(options =>
{
options.ApiKey = builder.Configuration["QueueHawk:ApiKey"];
options.Environment = "Production";
// jede Option unten ist optional und hat einen sinnvollen Default
});
| Option | Beschreibung | Default |
|---|---|---|
ApiKey | Identifiziert Tenant/Application. Die einzige erforderliche Option — erhältlich durch eine kostenlose Application-Anlage auf queuehawk.com. | (erforderlich) |
Environment | Freitext-Label im Dashboard, z. B. "Production" oder ein Kundenname bei Multi-Tenant-Hosting. Wird serverseitig gegen nichts validiert — eine Abweichung vom ASP.NET-Core-Hosting-Environment-Namen wird nie abgelehnt. | "Default" |
IncludeJobPayloads | Sendet Job-Argumentwerte mit, nicht nur Metadaten. Standardmässig aus, da Payloads PII oder Geschäftsdaten enthalten können — siehe unten. | false |
OnBeforeSend | Callback, der pro erfasstem Event aufgerufen wird, bevor es gepuffert wird, um es umzuschreiben oder zu verwerfen — genutzt zur Zensur von Exception-Inhalten. Siehe unten. | null |
MaxStackTraceLength | Kürzt Exception.ToString() (inkl. Stacktrace) auf diese Zeichenanzahl vor dem Senden. | 4000 |
BatchIntervalSeconds | Wie oft der Hintergrund-Dispatcher gepufferte Events per HTTPS versendet. Niedrigere Werte reduzieren die Latenz zum Dashboard, höhere Werte reduzieren die Request-Anzahl. | 5 |
HeartbeatIntervalSeconds | Wie oft jeder Hangfire-Server-Prozess einen Heartbeat meldet — das Signal, mit dem QueueHawk einen Worker erkennt, der zwar läuft, aber keine Jobs mehr aufnimmt. | 30 |
Enabled | Globaler Schalter. Bei false wird kein Hangfire-Filter registriert und keine Hintergrund-Services erfassen oder senden irgendetwas — nützlich, um den Agenten in der lokalen Entwicklung komplett zu deaktivieren. | true |
MaxBufferedEvents | Grösse des lokalen In-Memory-Ring-Buffers zwischen Hangfire-Filter und Dispatcher. Ist er voll, wird zuerst das älteste gepufferte Event verworfen — der Agent blockiert nie die Job-Ausführung und wächst nie unbegrenzt im Speicher, um ein Event nicht zu verlieren. | 5000 |
IngestionBaseUrl | Hostname, an den der Agent Events und Heartbeats sendet. Nur für lokale Tests oder einen selbst gehosteten Ingestion-Endpunkt überschreiben — produktive Integrationen sollten das beim Default belassen. | "https://ingest.queuehawk.com" |
IncludeJobPayloads steuert, ob die tatsächlichen Argumentwerte eines Hangfire-Jobs — nicht nur Typ und Methodenname — an QueueHawk gesendet werden. Standardmässig false, da Job-Argumente regelmässig Kundendaten enthalten: die Argumente eines SendInvoice(Guid customerId, decimal amount)-Jobs sind genau die Art von Daten, die die eigene Infrastruktur nicht ohne bewusste Entscheidung verlassen sollten. Das Aktivieren ist global, nicht pro Job-Typ — aktuell gibt es keinen Weg, es für einen Job-Typ zu aktivieren und für einen anderen nicht.
OnBeforeSendJob-Payloads und Exception-Inhalte werden bewusst unterschiedlich behandelt. Exception-Messages und Stacktraces werden standardmässig gesendet (nur längen-gekürzt via MaxStackTraceLength) — ein Alert ohne Exception-Detail ist kaum ein Alert. Aber eine Exception-Message ist Freitext, geschrieben vom werfenden Code, und kann gelegentlich etwas Sensibles wiedergeben: eine Validierungs-Exception, die eine abgelehnte E-Mail-Adresse zitiert, eine Datenbank-Constraint-Verletzung, die den Schlüssel einer Zeile enthält, ein Third-Party-SDK, das eine Request-URL samt Query-String protokolliert.
OnBeforeSend ist der Hook für diesen Fall — ein Func<JobEventDto, JobEventDto?>, aufgerufen für jedes erfasste State-Change-Event, bevor es in den lokalen Puffer geschrieben wird:
builder.Services.AddQueueHawk(options =>
{
options.ApiKey = builder.Configuration["QueueHawk:ApiKey"];
options.Environment = "Production";
options.OnBeforeSend = jobEvent =>
{
// nur Failed-Events tragen Exception-Inhalte
if (jobEvent.ExceptionMessage is null)
{
return jobEvent;
}
return jobEvent with
{
ExceptionMessage = Regex.Replace(
jobEvent.ExceptionMessage,
@"[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}",
"[REDACTED-EMAIL]"),
};
};
});
jobEvent.ExceptionMessage/jobEvent.State prüfen, um die eigene Logik auf fehlgeschlagene Jobs zu beschränken.null zurückgeben, um das Event komplett zu verwerfen — für diesen State-Change wird dann nichts gepuffert oder gesendet.Ausführlicherer Artikel mit weiteren Beispielen: Personenbezogene Daten aus Exception-Messages fernhalten, bevor sie die App verlassen.
Diese sind nicht konfigurierbar — es sind architektonische Eigenschaften des Agenten, die unabhängig davon gelten, wie die obigen Optionen gesetzt sind:
Jede Agent-Operation — der Hangfire-Filter, der Dispatcher, der eigene OnBeforeSend-Callback — ist exception-gesichert. Ein Bug oder Netzwerkfehler im Agenten kann einen Kunden-Hangfire-Job nie fehlschlagen lassen oder crashen.
Der lokale Puffer wächst nie über MaxBufferedEvents hinaus. Ist er voll, wird zuerst das älteste Event verworfen (Ring-Buffer-Prinzip), statt dass der Agent unbegrenzt Speicher verbraucht.
Der Agent macht nur ausgehende HTTPS-Aufrufe an IngestionBaseUrl. Für QueueHawk muss nichts eingehend in der eigenen Firewall geöffnet werden.
Kostenlos für eine Application, keine Kreditkarte nötig.