Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
La característica de exportación del historial de orquestación permite a la aplicación extraer historiales de ejecución para instancias de orquestación terminal (estado completado, erróneo o terminado) del Programador de Tareas Durable y los escriba en Azure Blob Storage. Use esta característica para auditar, cumplir, analizar y archivar datos de orquestación a largo plazo fuera del programador.
Nota:
La característica de exportación del historial de orquestaciones está actualmente en versión preliminar y está disponible para la Durable Task .NET SDK. Requiere el paquete Microsoft.DurableTask.ExportHistory.
Sugerencia
Hay disponible un ejemplo de referencia completo y ejecutable en ExportHistoryWebApp. Se recomienda usarlo como referencia a medida que siga esta guía.
Cómo funciona la exportación del historial de orquestación
El historial de exportación usa entidades y orquestaciones duraderas de forma interna para administrar trabajos de exportación de forma fiable a través del siguiente proceso.
- Se crea un trabajo de exportación a través de
ExportHistoryClient, especificando un período de tiempo y un modo de exportación. - El SDK crea una entidad duradera (
ExportJob) que realiza un seguimiento del estado y el progreso del trabajo. - Una orquestación interna enumera las instancias de orquestación de terminales que coinciden con el período de tiempo y los filtros de estado especificados.
- Para cada instancia coincidente, una actividad captura el historial de ejecución completo de Durable Task Scheduler.
- El historial se serializa (JSONL con compresión gzip de forma predeterminada) y se escribe en Azure Blob Storage.
- El trabajo hacer guardados del progreso, por lo que puede reanudarse si se interrumpe.
Modos de exportación para trabajos por lotes y continuos
El historial de exportación admite dos modos:
| Mode | Comportamiento |
|---|---|
| Batch | Exporta instancias que alcanzaron un estado terminal dentro de un período de tiempo fijo (completedTimeFrom a completedTimeTo), y a continuación, marca el trabajo como completado. |
| Continuo | Hace un seguimiento continuo de las instancias del terminal a partir de completedTimeFrom en adelante, sin que haya una hora de finalización. La tarea permanece activa hasta que la elimines. |
Prerrequisitos
- SDK de .NET 8 o posterior
- Un centro de tareas Programador de Tareas Durable (o el emulador local)
- Una cuenta de Azure Storage (o Azurite para el desarrollo local)
- Los siguientes paquetes NuGet:
Microsoft.DurableTask.ExportHistoryMicrosoft.DurableTask.Client.AzureManagedMicrosoft.DurableTask.Worker.AzureManaged
Habilitación de la exportación del historial de orquestación
Instale el paquete del historial de exportación.
dotnet add package Microsoft.DurableTask.ExportHistoryInstale el Azure cliente administrado y los paquetes de trabajo para Durable Task Scheduler.
dotnet add package Microsoft.DurableTask.Client.AzureManaged dotnet add package Microsoft.DurableTask.Worker.AzureManagedRegistra el historial de exportación tanto en el trabajador como en el cliente.
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"); }); });
Creación y administración de trabajos de exportación
Después de habilitar el historial de exportación, use el ExportHistoryClient para crear y administrar trabajos.
Creación de un trabajo de exportación por lotes
En el ejemplo siguiente, un trabajo de exportación por lotes exporta todas las instancias de orquestación que alcanzaron un estado de terminal dentro de un período de tiempo fijo.
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();
Creación de un trabajo de exportación continua
En el ejemplo siguiente, un trabajo de exportación continuo supervisa indefinidamente las instancias del terminal a partir de una hora de inicio.
ExportJobCreationOptions options = new(
mode: ExportMode.Continuous,
completedTimeFrom: DateTimeOffset.UtcNow,
completedTimeTo: null,
destination: null);
ExportHistoryJobClient jobClient = await exportClient.CreateJobAsync(options);
Cuando destination es null, el trabajo usa el contenedor predeterminado y el prefijo configurados en ExportHistoryStorageOptions.
Obtener detalles del trabajo de exportación
Use el código siguiente para recuperar la descripción completa de un trabajo, incluidos su estado, contadores de progreso y errores.
ExportJobDescription? job = await exportClient.GetJobAsync("my-job-id");
Nota:
GetJobAsync lanza una excepción ExportJobNotFoundException si el identificador de trabajo especificado no existe. Controle esta excepción al consultar los trabajos que se pueden haber eliminado.
La ExportJobDescription incluye lo siguiente:
| Propiedad | Descripción |
|---|---|
JobId |
Identificador de trabajo único. |
Status |
Estado actual: Pending, Active, Failedo Completed. |
CreatedAt |
El momento en que se creó el trabajo. |
LastModifiedAt |
Cuándo fue la última actualización del trabajo. |
ScannedInstances |
Número total de instancias analizadas hasta ahora. |
ExportedInstances |
Número total de instancias exportadas hasta ahora. |
LastError |
Último mensaje de error, si existe. |
Enumerar trabajos
Exporte una lista de trabajos activos mediante código similar al ejemplo siguiente.
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)");
}
ExportJobQuery admite las siguientes propiedades de filtro:
| Propiedad | Descripción |
|---|---|
Status |
Filtre por estado del trabajo: Pending, Active, Failedo Completed. |
JobIdPrefix |
Filtre los trabajos cuyo identificador comienza con este prefijo. |
CreatedFrom |
Muestre únicamente los puestos de trabajo creados a partir de esa fecha. |
CreatedTo |
Muestre únicamente los puestos de trabajo creados después de esa fecha. |
PageSize |
Número máximo de resultados por página. |
ContinuationToken |
Token para recuperar la siguiente página de resultados. |
Eliminación de un trabajo
Use el código siguiente para eliminar un trabajo.
ExportHistoryJobClient jobClient = exportClient.GetJobClient("my-job-id");
await jobClient.DeleteAsync();
Nota:
DeleteAsync lanza ExportJobNotFoundException si el trabajo no existe. Eliminar un trabajo no elimina los blobs ya exportados de Azure Blob Storage.
Exportar opciones de creación de trabajos
La ExportJobCreationOptions clase controla el comportamiento del trabajo de exportación e incluye los parámetros siguientes.
| Parámetro | Obligatorio | Descripción | Predeterminado |
|---|---|---|---|
mode |
Sí |
Batch para una ventana fija o Continuous para la exportación en curso. |
— |
completedTimeFrom |
Sí (por lotes) | Inicio del período de tiempo (inclusivo), en función de cuándo las instancias alcanzaron un estado de terminal. En Modo continuo, el valor predeterminado es UtcNow si no se proporciona. |
— |
completedTimeTo |
Sí (por lotes) | Fin del período de tiempo (inclusivo). Debe omitirse para el modo continuo. No puede ser posterior a la fecha actual. | — |
destination |
No | Anula el contenedor de blobs predeterminado y el prefijo de este trabajo. | Usa el valor predeterminado de ExportHistoryStorageOptions |
jobId |
No | Identificador de trabajo personalizado. | GUID generado automáticamente |
format |
No | Formato de exportación: JSONL (gzip-compressed) o JSON (sin comprimir). | JSONL con gzip |
runtimeStatus |
No | Filtre por estado de terminal: Completed, Failed, Terminated. |
Todos los estados de terminal |
maxInstancesPerBatch |
No | Número de instancias que se van a procesar por lote (de 1 a 1000). | 100 |
Dónde se almacenan los datos exportados en Azure Blob Storage
El historial exportado se escribe en Azure Blob Storage con los parámetros siguientes.
-
Contenedor: valor predeterminado de
EXPORT_HISTORY_CONTAINER_NAMEo la invalidación dedestinationpor trabajo. -
Nombre de blob: derivado de un hash SHA-256 de
(completedTimestamp, instanceId). -
Formato de archivo:
- Valor predeterminado:
.jsonl.gz(Líneas JSON, gzip-compressed: un evento de historial por línea) - Opcional:
.json(matriz JSON sin comprimir de eventos de historial)
- Valor predeterminado:
- Ruta de acceso de blob con prefijo: cuando se configura un prefijo (por ejemplo,
exports/daily), la ruta de acceso del blob se convierte enexports/daily/{hash}.{ext}. Sin un prefijo, el blob se escribe directamente en la raíz del contenedor como{hash}.{ext}.
Cada blob incluye una instanceId etiqueta de metadatos para la rastreabilidad.
Variables de entorno para la configuración del historial de exportación
Use estas variables de entorno con el ejemplo de historial de exportación de Durable Task .NET SDK.
| Variable | Descripción | Ejemplo de valor predeterminado |
|---|---|---|
DURABLE_TASK_CONNECTION_STRING |
Cadena de conexión del planificador de tareas duraderas | Endpoint=http://localhost:8080;TaskHub=default;Authentication=None |
EXPORT_HISTORY_STORAGE_CONNECTION_STRING |
La cadena de conexión de Azure Storage en blobs de historial exportados | UseDevelopmentStorage=true |
EXPORT_HISTORY_CONTAINER_NAME |
Contenedor de blobs del historial exportado | export-history |
EXPORT_HISTORY_PREFIX |
Prefijo de ruta de carpeta virtual opcional de nombres de blobs | anular |
ASPNETCORE_URLS |
Escucha de direcciones URL para el host HTTP del ejemplo | valor predeterminado del marco |
permisos de Azure para el historial de exportación
Al usar Azure recursos en lugar de emuladores locales, la identidad de la aplicación necesita acceso a Durable Task Scheduler y Blob Storage:
- Conceda
Durable Task Data Contributoren el centro de tareas de la aplicación. - Asigne el rol
Storage Blob Data Contributoren la cuenta de almacenamiento que almacene los blobs del historial exportado.
Consideraciones importantes para los trabajos de exportación
Operaciones de purga simultáneas:
Si purga instancias de orquestación mientras se ejecuta un trabajo de exportación, la exportación puede verse afectada. Las instancias que se purgan antes de que la exportación las lea estarán ausentes de los datos exportados. Evite ejecutar operaciones de purga simultáneamente con trabajos de exportación activos que cubran la misma ventana de tiempo.Limpieza de blobs:
Al eliminar un trabajo de exportación no se quitan los blobs exportados de Azure Blob Storage. Si necesita quitar los datos exportados, elimine los blobs de la cuenta de almacenamiento por separado.
Verifica que la exportación funcione
Después de crear un trabajo de exportación, compruebe que funciona comprobando ambas señales:
- El estado del trabajo pasa de
PendingaActivey finalmente aCompleted(para el modo Batch). - Las entradas de blob aparecen en el contenedor de exportación configurado.
Puede sondear el estado del trabajo mediante programación:
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);
Para el desarrollo local, ejecute este comando CLI de Azure para inspeccionar el contenedor:
az storage blob list \
--connection-string "UseDevelopmentStorage=true" \
--container-name export-history \
--output table
Sugerencia
El ejemplo ExportHistoryWebApp incluye un archivo ExportHistoryWebApp.http con solicitudes de cliente REST listas para VS Code. Ábralo y haga clic en Enviar solicitud para probar rápidamente las operaciones de creación, obtención, lista y eliminación.