Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Funkcja eksportowania historii orkiestracji umożliwia aplikacji wyodrębnianie historii wykonywania dla końcowych instancji orkiestracji (ukończonych, nieudanych lub zakończonych) z Durable Task Scheduler i zapisuje je w Azure Blob Storage. Ta funkcja służy do inspekcji, zgodności, analizy i długoterminowego archiwizowania danych aranżacji poza harmonogramem.
Uwaga / Notatka
Funkcja eksportowania historii aranżacji jest obecnie dostępna w wersji zapoznawczej i jest dostępna dla zestawu SDK Durable Task .NET SDK. Wymaga pakietu Microsoft.DurableTask.ExportHistory.
Wskazówka
Kompletny przykład referencyjny możliwy do uruchomienia jest dostępny pod adresem ExportHistoryWebApp. Zalecamy użycie go jako referencji podczas korzystania z tego przewodnika.
Jak działa eksportowanie historii aranżacji
Historia eksportu używa trwałych jednostek i orkiestracji wewnętrznie do niezawodnego zarządzania zadaniami eksportu według następującego procesu.
- Tworzysz zadanie eksportu za pomocą
ExportHistoryClient, określając przedział czasu i tryb eksportu. - Zestaw SDK tworzy trwałą jednostkę (
ExportJob), która śledzi stan i postęp zadania. - Wewnętrzna aranżacja wyświetla wystąpienia orkiestracji terminalu, które pasują do określonego przedziału czasu i filtrów stanu.
- Dla każdego pasującego wystąpienia działanie pobiera pełną historię wykonywania z narzędzia Durable Task Scheduler.
- Historia jest serializowana (JSONL z kompresją gzip domyślnie) i zapisywana w Azure Blob Storage.
- Zadanie zapisuje swój postęp, aby można było wznowić proces, jeśli zostanie przerwany.
Typy eksportu dla zadań wsadowych i ciągłych
Historia eksportu obsługuje dwa tryby:
| Tryb | Zachowanie |
|---|---|
| Batch | Eksportuje wystąpienia, które osiągnęły stan terminalu w określonym przedziale czasu (completedTimeFrom do completedTimeTo), a następnie oznacza zadanie jako ukończone. |
| Ciągły | Instancje terminala programu Tails działają na bieżąco od completedTimeFrom, bez określonego czasu zakończenia. Zadanie pozostaje aktywne, dopóki go nie usuniesz. |
Wymagania wstępne
- .NET 8 SDK lub nowszy
- Trwały Durable Task Scheduler hub zadań (lub emulator lokalny)
- Konto Azure Storage (lub Azurite na potrzeby programowania lokalnego)
- Następujące pakiety NuGet:
Microsoft.DurableTask.ExportHistoryMicrosoft.DurableTask.Client.AzureManagedMicrosoft.DurableTask.Worker.AzureManaged
Włączanie eksportowania historii aranżacji
Zainstaluj pakiet historii eksportu.
dotnet add package Microsoft.DurableTask.ExportHistoryZainstaluj pakiety klienta i procesu roboczego zarządzanego Azure dla harmonogramu zadań Durable Task Scheduler.
dotnet add package Microsoft.DurableTask.Client.AzureManaged dotnet add package Microsoft.DurableTask.Worker.AzureManagedZarejestruj historię eksportu zarówno w procesie roboczym, jak i u klienta.
using Microsoft.DurableTask.Client; using Microsoft.DurableTask.Client.AzureManaged; using Microsoft.DurableTask.ExportHistory; using Microsoft.DurableTask.Worker; using Microsoft.DurableTask.Worker.AzureManaged; string connectionString = builder.Configuration.GetValue<string>("DURABLE_TASK_CONNECTION_STRING") ?? throw new InvalidOperationException("Missing DURABLE_TASK_CONNECTION_STRING"); string storageConnectionString = builder.Configuration.GetValue<string>("EXPORT_HISTORY_STORAGE_CONNECTION_STRING") ?? throw new InvalidOperationException("Missing EXPORT_HISTORY_STORAGE_CONNECTION_STRING"); string containerName = builder.Configuration.GetValue<string>("EXPORT_HISTORY_CONTAINER_NAME") ?? throw new InvalidOperationException("Missing EXPORT_HISTORY_CONTAINER_NAME"); // Register the worker with export history support. // This registers internal entities, orchestrations, and activities that manage export jobs. builder.Services.AddDurableTaskWorker(worker => { worker.UseDurableTaskScheduler(connectionString); worker.UseExportHistory(); }); // Register the client with export history support. // This configures the Azure Blob Storage destination and registers the ExportHistoryClient. builder.Services.AddDurableTaskClient(client => { client.UseDurableTaskScheduler(connectionString); client.UseExportHistory(options => { options.ConnectionString = storageConnectionString; options.ContainerName = containerName; // Optional: set a virtual folder path prefix for blob names (for example, "exports/daily"). // When set, blobs are written to "{prefix}/{hash}.{ext}" instead of "{hash}.{ext}". options.Prefix = builder.Configuration.GetValue<string>("EXPORT_HISTORY_PREFIX"); }); });
Tworzenie zadań eksportu i zarządzanie nimi
Po włączeniu historii eksportu użyj polecenia ExportHistoryClient , aby utworzyć zadania i zarządzać nimi.
Utwórz zadanie eksportu wsadowego
W poniższym przykładzie zadanie wsadowe eksportuje wszystkie wystąpienia orkiestracji, które osiągnęły stan końcowy w określonym przedziale czasu.
ExportHistoryClient exportClient = app.Services.GetRequiredService<ExportHistoryClient>();
ExportJobCreationOptions options = new(
mode: ExportMode.Batch,
completedTimeFrom: DateTimeOffset.UtcNow.AddHours(-24),
completedTimeTo: DateTimeOffset.UtcNow,
destination: new ExportDestination("my-export-container")
{
// Virtual folder path prefix applied to all blob names for this job
Prefix = "exports/daily",
});
ExportHistoryJobClient jobClient = await exportClient.CreateJobAsync(options);
ExportJobDescription description = await jobClient.DescribeAsync();
Utwórz zadanie eksportu ciągłego
W poniższym przykładzie ciągłe zadanie eksportu śledzi wystąpienia terminalu na czas nieokreślony od czasu rozpoczęcia.
ExportJobCreationOptions options = new(
mode: ExportMode.Continuous,
completedTimeFrom: DateTimeOffset.UtcNow,
completedTimeTo: null,
destination: null);
ExportHistoryJobClient jobClient = await exportClient.CreateJobAsync(options);
Gdy destination ma wartość null, zadanie używa domyślnego kontenera i prefiksu skonfigurowanego w ExportHistoryStorageOptions.
Uzyskaj szczegóły zadania eksportu
Użyj poniższego kodu, aby pobrać pełny opis zadania, w tym jego stan, liczniki postępu i wszelkie błędy.
ExportJobDescription? job = await exportClient.GetJobAsync("my-job-id");
Uwaga / Notatka
GetJobAsync zgłasza błąd ExportJobNotFoundException , jeśli określony identyfikator zadania nie istnieje. Obsłuż ten wyjątek podczas wykonywania zapytań dotyczących zadań, które mogły zostać usunięte.
Obejmuje ExportJobDescription :
| Majątek | Opis |
|---|---|
JobId |
Unikatowy identyfikator zadania. |
Status |
Bieżący stan: Pending, , ActiveFailedlub Completed. |
CreatedAt |
Po utworzeniu zadania. |
LastModifiedAt |
Kiedy zadanie zostało ostatnio zaktualizowane. |
ScannedInstances |
Całkowita liczba skanowanych wystąpień do tej pory. |
ExportedInstances |
Całkowita liczba wyeksportowanych wystąpień do tej pory. |
LastError |
Ostatni komunikat o błędzie, jeśli istnieje. |
Wyświetlanie listy zadań
Wyeksportuj listę aktywnych zadań przy użyciu kodu podobnego do poniższego przykładu.
ExportJobQuery query = new()
{
Status = ExportJobStatus.Active,
CreatedFrom = DateTimeOffset.UtcNow.AddDays(-7),
PageSize = 50,
};
AsyncPageable<ExportJobDescription> jobs = exportClient.ListJobsAsync(query);
await foreach (ExportJobDescription job in jobs)
{
Console.WriteLine($"{job.JobId}: {job.Status} ({job.ExportedInstances} exported)");
}
Element ExportJobQuery obsługuje następujące właściwości filtru:
| Majątek | Opis |
|---|---|
Status |
Filtruj według stanu zadania: Pending, , ActiveFailedlub Completed. |
JobIdPrefix |
Filtruj zadania, których identyfikator zaczyna się od tego prefiksu. |
CreatedFrom |
Zwracaj tylko zadania utworzone po lub dokładnie o tej godzinie. |
CreatedTo |
Zwracaj tylko zadania utworzone o tej godzinie lub wcześniej. |
PageSize |
Maksymalna liczba wyników na stronę. |
ContinuationToken |
Token do pobierania następnej strony wyników. |
Usuwanie zadania
Użyj następującego kodu, aby usunąć zadanie.
ExportHistoryJobClient jobClient = exportClient.GetJobClient("my-job-id");
await jobClient.DeleteAsync();
Uwaga / Notatka
DeleteAsync zgłasza wyjątek ExportJobNotFoundException, jeśli zadanie nie istnieje. Usunięcie zadania nie powoduje usunięcia już wyeksportowanych obiektów blob z Azure Blob Storage.
Opcje tworzenia zadania eksportu
Klasa ExportJobCreationOptions steruje zachowaniem zadania eksportu i zawiera następujące parametry.
| Parameter | Wymagane | Opis | Wartość domyślna |
|---|---|---|---|
mode |
Yes |
Batch dla ustalonego okna lub Continuous trwającego eksportu. |
— |
completedTimeFrom |
Tak (Batch) | Początek przedziału czasowego (włącznie), na podstawie tego, kiedy instancje osiągnęły stan końcowy. W przypadku trybu ciągłego wartość domyślna to UtcNow , jeśli nie zostanie podana. |
— |
completedTimeTo |
Tak (Batch) | Koniec przedziału czasu (włącznie). Należy pominąć tryb ciągły. Nie może znajdować się w przyszłości. | — |
destination |
Nie. | Zastąp domyślny kontener BLOB i prefiks dla tego zadania. | Używa wartości domyślnej z ExportHistoryStorageOptions |
jobId |
Nie. | Niestandardowy identyfikator zadania. | Identyfikator GUID generowany automatycznie |
format |
Nie. | Format eksportu: JSONL (skompresowany przez gzip) lub JSON (nieskompresowany). | JSONL z gzip |
runtimeStatus |
Nie. | Filtruj według stanów terminali: Completed, Failed, Terminated. |
Wszystkie stany terminalu |
maxInstancesPerBatch |
Nie. | Liczba wystąpień do przetworzenia w partii (1–1000). | 100 |
Gdzie eksportowane dane są przechowywane w Azure Blob Storage
Wyeksportowana historia jest zapisywana w Azure Blob Storage przy użyciu następujących parametrów.
-
Kontener: domyślnie z
EXPORT_HISTORY_CONTAINER_NAME, lub zastąpienie dla poszczególnych zadańdestination. -
Nazwa obiektu blob: pochodzi ze skrótu SHA-256 zasobu
(completedTimestamp, instanceId). -
Format pliku:
- Ustawienie domyślne:
.jsonl.gz(Linie JSON, skompresowane za pomocą pliku gzip — jedno zdarzenie historii na wiersz) - Opcjonalnie:
.json(nieskompresowana tablica zdarzeń historii JSON)
- Ustawienie domyślne:
- Ścieżka obiektu blob z prefiksem: kiedy prefiks zostanie skonfigurowany (na przykład ), ścieżka obiektu blob staje się
exports/daily. Bez prefiksu obiekt blob jest zapisywany bezpośrednio w root kontenera jako{hash}.{ext}.
Każdy obiekt blob zawiera instanceId tag metadanych umożliwiający śledzenie.
Zmienne środowiskowe konfiguracji historii eksportu
Użyj tych zmiennych środowiskowych z przykładem historii eksportu zestawu Durable Task .NET SDK.
| Zmienna | Opis | Przykładowa wartość domyślna |
|---|---|---|
DURABLE_TASK_CONNECTION_STRING |
Ciąg połączenia harmonogramu zadań Durable Task | Endpoint=http://localhost:8080;TaskHub=default;Authentication=None |
EXPORT_HISTORY_STORAGE_CONNECTION_STRING |
Ciąg połączeniowy Azure Storage na potrzeby eksportowanych obiektów blob z historii | UseDevelopmentStorage=true |
EXPORT_HISTORY_CONTAINER_NAME |
Kontener blobów dla wyeksportowanej historii | export-history |
EXPORT_HISTORY_PREFIX |
Opcjonalny prefiks ścieżki folderu wirtualnego dla nazw obiektów blob | Nieustawiony |
ASPNETCORE_URLS |
Adresy URL nasłuchiwania dla hosta HTTP próbki | domyślna struktura |
Uprawnienia Azure do historii eksportu
Jeśli używasz zasobów Azure zamiast lokalnych emulatorów, identyfikator aplikacji musi mieć dostęp do Harmonogramu Zadań Durable Task i magazynu obiektów Blob:
- Nadaj
Durable Task Data Contributorw centrum zadań aplikacji. - Przyznaj
Storage Blob Data Contributorna koncie magazynu przechowującym wyeksportowane obiekty blob historii.
Ważne zagadnienia dotyczące zadań eksportu
Równoczesne operacje przeczyszczania:
Jeśli usuwasz wystąpienia orkiestracji podczas, gdy zadanie eksportu jest uruchomione, może to mieć wpływ na eksport. Wystąpienia, które zostaną usunięte przed rozpoczęciem eksportu, nie pojawią się w wyeksportowanych danych. Unikaj uruchamiania operacji przeczyszczania jednocześnie z aktywnymi zadaniami eksportu, które obejmują to samo okno czasowe.Oczyszczanie blobów:
Usunięcie zadania eksportu nie powoduje usunięcia wyeksportowanych obiektów blob z Azure Blob Storage. Jeśli musisz usunąć wyeksportowane dane, usuń bloby z konta przechowywania oddzielnie.
Sprawdzanie, czy eksport działa
Po utworzeniu zadania eksportu sprawdź, czy działa, sprawdzając oba sygnały:
- Stan zadania przechodzi z
PendingdoActive, a następnie ostatecznie doCompleted(w trybie wsadowym). - Wpisy obiektów blob są wyświetlane w skonfigurowanym kontenerze eksportu.
Można programowo monitorować status zadania:
ExportJobDescription? job;
do
{
await Task.Delay(TimeSpan.FromSeconds(5));
job = await exportClient.GetJobAsync(jobId);
Console.WriteLine($"Status: {job?.Status}, Exported: {job?.ExportedInstances}");
}
while (job?.Status is ExportJobStatus.Pending or ExportJobStatus.Active);
W przypadku programowania lokalnego uruchom następujące polecenie Azure CLI, aby sprawdzić kontener:
az storage blob list \
--connection-string "UseDevelopmentStorage=true" \
--container-name export-history \
--output table
Wskazówka
Przykład ExportHistoryWebApp zawiera plik ExportHistoryWebApp.http z gotowymi żądaniami klienta REST dla programu VS Code. Otwórz go i kliknij pozycję Wyślij żądanie , aby szybko przetestować operacje tworzenia, pobierania, wyświetlania listy i usuwania.