Observability / sygnały operacyjne
Twój pierwszy sygnał
Wyślij informację o operacji i odczytaj ją z API. Na początek wystarczy jeden wpis audytu. Bez Studio, urządzenia i konfiguracji całego systemu.
Wpis z działaniem review.run i wynikiem Succeeded. To kontrolowana informacja wysłana przez Ciebie — nie automatyczny pomiar działania platformy.
1. Uruchom lokalne API
Potrzebujesz repozytorium junexis-observability, .NET SDK zgodnego z jego global.json (obecnie .NET 10) oraz PowerShell 7 lub równoważnego klienta HTTP. Publiczny katalog nie udostępnia gotowego zestawu do tej instrukcji.
W katalogu repozytorium:
dotnet build Junexis.Observability.slnx -c Release
dotnet run --no-launch-profile --project src/Junexis.Observability.QueryApi -c Release --no-build -- --urls http://127.0.0.1:18128
Pozostaw terminal włączony. Port 18128 musi być wolny. API jest lokalnym procesem; ta strona nie uruchamia go za Ciebie.
W drugim terminalu:
$api = 'http://127.0.0.1:18128'
Invoke-RestMethod "$api/"
Odpowiedź status: ready potwierdza, że API odpowiada. Nie potwierdza gotowości urządzeń, Runtime ani trwałego magazynu.
2. Przygotuj jeden wpis audytu
Audyt opisuje kto, jaką operację i z jakim skutkiem zgłosił. Zewnętrzna struktura zdarzenia niesie identyfikatory i kontekst, a payloadJson zawiera właściwy wpis audytu.
$session = 'first-signal-' + [guid]::NewGuid().ToString('N')
$payload = @{
actor = 'local-review'
action = 'review.run'
target = 'observability'
outcome = 'Succeeded'
reason = 'Local API acceptance'
evidenceRefs = @()
} | ConvertTo-Json -Compress
$event = @{
eventId = [guid]::NewGuid().ToString('N')
kind = 'Audit'
producer = 'local-review'
component = 'review'
platformRole = 'Tooling'
occurredAt = [DateTimeOffset]::UtcNow.ToString('O')
receivedAt = '0001-01-01T00:00:00+00:00'
correlationId = $session
sessionId = $session
buildId = 'local-review'
schemaVersion = '1.0'
payloadType = 'AuditRecord'
payloadJson = $payload
tags = @{ review = 'local' }
} | ConvertTo-Json -Depth 8
Succeeded to treść deklaracji producenta. Samo API nie wykonuje tej operacji ani nie uwierzytelnia wpisanego tekstu actor. Identyfikator sesji jest tu kluczem do powiązania wpisów, nie kontem logowania.
3. Wyślij i odczytaj
Invoke-RestMethod -Method Post -Uri "$api/ingress/events" `
-ContentType 'application/json' -Body $event
$entries = @(Invoke-RestMethod "$api/audit?sessionId=$session")
$entries | ForEach-Object { $_.record } |
Format-Table actor, action, target, outcome
Pierwsze przyjęcie zwraca HTTP 202. W odczycie znajdziesz jeden wpis z local-review, review.run, observability i Succeeded.
Rozróżniasz treść zdarzenia od zapytania, które ją odnajduje. Nie musisz konfigurować pozostałych integracji.
4. Sprawdź ponowienie
Wyślij ponownie tę samą zmienną $event, bez generowania nowego identyfikatora:
Invoke-RestMethod -Method Post -Uri "$api/ingress/events" `
-ContentType 'application/json' -Body $event
@(Invoke-RestMethod "$api/audit?sessionId=$session").Count
Poprawnie rozpoznany duplikat zwraca HTTP 200, a liczba wpisów pozostaje 1. Stan rozpoznawania duplikatów jest w pamięci procesu. Nie jest to gwarancja zachowania po restarcie ani dokładnie jednego importu z dowolnego zewnętrznego źródła.
Wynik rzeczywistej próby
24 października 2026 uruchomiliśmy Release Query API na loopback i wysłaliśmy cztery kontrolowane rodzaje zdarzeń. Każdy został przyjęty, odczytany oraz rozpoznany przy ponowieniu.
| Sygnał | Pierwsze przyjęcie | Ponowienie | Wpisów w odczycie |
|---|---|---|---|
| Audit | 202 | 200 | 1 |
| Log | 202 | 200 | 1 |
| Health | 202 | 200 | 1 |
| Telemetry | 202 | 200 | 1 |
Wpis audytu z rzeczywistej odpowiedzi — wybrane pole record
{
"actor": "local-review",
"action": "review.run",
"target": "observability",
"outcome": "Succeeded",
"reason": "Local API acceptance",
"evidenceRefs": []
}
To zapis wcześniejszej próby API, bez danych z fizycznego urządzenia, Studio ani rzeczywistego Runtime. Powyższe polecenia tworzą nową sesję, więc jej identyfikatory i czasy będą inne. Otwórz zapis próby w JSON.
Zakończ własny proces API przez Ctrl+C w jego terminalu. Główne magazyny są w pamięci i ich zawartość nie przetrwa restartu.