Condividi tramite


Servizio metadati di Azure: Eventi pianificati per macchine virtuali Windows

Si applica a: ✔️ macchine virtuali di Windows ✔️ set di scalabilità flessibili ✔️ set di scalabilità uniformi

Gli eventi pianificati sono un servizio metadati di Azure che concede all'applicazione il tempo di prepararsi alla manutenzione delle macchine virtuali. Questo servizio secondario offre informazioni sugli eventi di manutenzione imminenti (ad esempio il riavvio), in modo che l'applicazione possa prepararsi di conseguenza e limitare le interruzioni. È disponibile per tutti i tipi di macchine virtuali di Azure, incluse quelle di tipo PaaS e IaaS sia Windows che Linux.

Per informazioni su Eventi pianificati in Linux, vedere Eventi pianificati per macchine virtuali Linux.

Gli eventi pianificati forniscono notifiche proattive sugli eventi imminenti, per informazioni reattive sugli eventi già verificati, vedere informazioni sulla disponibilità delle macchine virtuali in Azure Resource Graph e Creare una regola di avviso di disponibilità per la macchina virtuale di Azure.

Nota

Gli eventi pianificati sono disponibili a livello generale in tutte le aree di Azure. Per informazioni sulla versione più recente, vedere Versione e disponibilità in base all'area geografica.

Perché usare gli eventi pianificati

Per molte applicazioni è un vantaggio avere tempo per prepararsi alla manutenzione delle macchine virtuali. Questo tempo può essere impiegato in attività specifiche dell'applicazione per ottenere un miglioramento in termini di disponibilità, affidabilità e gestibilità, ad esempio:

  • Checkpoint e ripristino
  • Esaurimento delle connessioni
  • Failover della replica primaria
  • Rimozione da un pool di bilanciamento del carico
  • Registrazione eventi
  • Arresto normale

Grazie agli eventi pianificati, l'applicazione è in grado di sapere quando verrà eseguita la manutenzione e di attivare attività specifiche per limitarne l'impatto.

Gli eventi pianificati informano sugli eventi nei casi d'uso seguenti:

  • Manutenzione avviata dalla piattaforma (ad esempio, riavvio di macchine virtuali, migrazione in tempo reale o aggiornamenti con manutenzione della memoria per l'host).
  • Macchina virtuale in esecuzione in hardware host danneggiato ed è possibile un guasto imminente.
  • La macchina virtuale era in esecuzione in un host che ha subito un errore hardware.
  • Manutenzione avviata dall'utente, ad esempio il riavvio o la ridistribuzione di una macchina virtuale eseguita dall'utente.
  • Eliminazione di istanze di macchina virtuale Spot e set di scalabilità Spot.

Nozioni di base

Il servizio metadati presenta informazioni sulle macchine virtuali in esecuzione usando un endpoint REST accessibile dall'interno della macchina virtuale. Le informazioni sono disponibili tramite un indirizzo IP non instradabile e non sono esposte all'esterno della macchina virtuale.

Ambito

Gli eventi pianificati vengono recapitati e possono essere riconosciuti da:

  • Macchine virtuali autonome.
  • Tutte le macchine virtuali in un servizio cloud di Azure (versione classica).
  • Tutte le macchine virtuali in un set di disponibilità.
  • Tutte le macchine virtuali in un gruppo di posizionamento di un set di scalabilità.

Gli eventi pianificati per tutte le macchine virtuali in un intero set di disponibilità o in un gruppo di posizionamento per un set di scalabilità di macchine virtuali vengono recapitati a tutte le altre macchine virtuali nello stesso gruppo o set indipendentemente dall'utilizzo della zona di disponibilità.

Di conseguenza, è opportuno controllare il campo Resources dell'evento per identificare quali macchine virtuali sono interessate.

Nota

Le macchine virtuali con accelerazione delle GPU in un set di scalabilità che usa 1 dominio di errore (FD = 1) riceveranno solo eventi pianificati per la risorsa interessata. Gli eventi non verranno trasmessi a tutte le macchine virtuali nello stesso gruppo di posizionamento.

Individuazione degli endpoint

Per le macchine virtuali abilitate per le reti virtuali, il servizio metadati è disponibile da un indirizzo IP statico non instradabile, 169.254.169.254. L'endpoint completo per la versione più recente degli eventi pianificati è:

http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01

Se la macchina virtuale non viene creata all'interno di una rete virtuale, caso predefinito per i servizi cloud e le macchine virtuali classiche, è necessaria logica aggiuntiva per individuare l'indirizzo IP da usare. Per informazioni su come individuare l'endpoint dell'host, vedere l'esempio seguente.

Versione e disponibilità in base all'area geografica

Il servizio eventi pianificati è un servizio con versione. Le versioni sono obbligatorie; la versione corrente è 2020-07-01.

Versione Tipo di versione Aree Note sulla versione
01-07-2020 Disponibilità generale Tutte le date
  • Aggiunta del supporto per la durata dell'evento
  • 2019-08-01 Disponibilità generale Tutte le date
  • Aggiunta del supporto per l'origine dell'evento
  • 01/04/2019 Disponibilità generale Tutte le date
  • Aggiunta del supporto per la descrizione evento
  • 2019-01-01 Disponibilità generale Tutte le date
  • Supporto aggiunto per i set di scalabilità di macchine virtuali EventType 'Terminate'
  • 2017-11-01 Disponibilità generale Tutte le date
  • Supporto aggiunto per l'eliminazione di VM spot EventType 'Preempt'
  • 01-08-2017 Disponibilità generale Tutte le date
  • È stato rimosso il carattere di sottolineatura all'inizio dei nomi delle risorse per le macchine virtuali IaaS
  • Requisito dell'intestazione dei metadati applicato per tutte le richieste
  • 2017-03-01 Anteprima Tutte le date
  • Versione iniziale
  • Nota

    Le precedenti versioni di anteprima del servizio eventi pianificati supportano {latest} come api-version. Questo formato non è più supportato e verrà rimosso in futuro.

    Abilitazione e disabilitazione degli eventi pianificati

    Gli eventi pianificati vengono abilitati per il servizio la prima volta che si effettua una richiesta di eventi. Ci si dovrebbe aspettare una risposta con un ritardo di un massimo di due minuti nella prima chiamata e si inizierà a ricevere eventi entro 5 minuti. Gli eventi pianificati sono disabilitati per il servizio se non effettua una richiesta all'endpoint per 24 ore.

    Manutenzione avviata dall'utente

    La manutenzione delle macchine virtuali avviata dall'utente tramite il portale, l'API o l'interfaccia della riga di comando di Azure oppure tramite PowerShell restituisce un evento pianificato. È quindi possibile testare la logica di preparazione della manutenzione dell'applicazione e permettere all'applicazione di prepararsi per la manutenzione avviata dall'utente.

    Se si riavvia una macchina virtuale, viene pianificato un evento di tipo Reboot. Se si ridistribuisce una macchina virtuale, viene pianificato un evento di tipo Redeploy. In genere, gli eventi con un'origine evento utente possono essere approvati immediatamente per evitare un ritardo nelle azioni avviate dall'utente. È consigliabile che una macchina virtuale primaria e secondaria comunichi e approvi gli eventi pianificati generati dall'utente nel caso in cui la macchina virtuale primaria non risponda. L'approvazione immediata degli eventi impedisce ritardi nel ripristino dell'applicazione a uno stato corretto.

    Gli eventi pianificati per aggiornamenti del sistema operativo guest del set di scalabilità di macchine virtuali o di nuova creazione delle immagini sono supportati per le dimensioni delle macchine virtuali per utilizzo generico che supportano solo gli aggiornamenti. Non può essere usata con le serie G, M, N e H. Gli eventi pianificati per gli aggiornamenti del sistema operativo guest dei set di scalabilità di macchine virtuali e le ricreazioni dell'immagine sono disabilitati per impostazione predefinita. Per abilitare gli eventi pianificati per queste operazioni sulle dimensioni di macchina virtuale supportate, abilitarle prima di tutto usando OSImageNotificationProfile.

    Usare l'API

    Panoramica generale

    Esistono due componenti principali per la gestione di eventi pianificati, preparazione e ripristino. Tutti gli eventi pianificati correnti che influiscono su una macchina virtuale sono disponibili per la lettura tramite l'endpoint eventi pianificati IMDS. Quando l'evento ha raggiunto uno stato terminale, viene rimosso dall'elenco di eventi. Il diagramma seguente illustra le varie transizioni di stato che un singolo evento pianificato può sperimentare:

    Diagramma di stato che mostra le varie transizioni che possono essere necessarie per un evento pianificato.

    Per gli eventi nello stato EventStatus: "Scheduled", è necessario eseguire i passaggi per preparare il carico di lavoro. Al termine della preparazione, è necessario approvare l'evento usando l'API evento pianificata. In caso contrario, l'evento viene approvato automaticamente quando viene raggiunto il tempo NotBefore. Se la macchina virtuale si trova nell'infrastruttura condivisa, il sistema attenderà che anche tutti gli altri tenant nello stesso hardware approvino il processo o il timeout. Dopo aver raccolto le approvazioni da tutte le macchine virtuali interessate o quando il tempo NotBefore viene raggiunto, Azure genera un nuovo payload dell'evento pianificato con EventStatus:"Started" e attiva l'inizio dell'evento di manutenzione. Quando l'evento ha raggiunto uno stato terminale, viene rimosso dall'elenco di eventi. Ciò funge da segnale per il cliente per il ripristino delle macchine virtuali.

    Di seguito è riportato lo pseudo codice che illustra un processo per la lettura e la gestione degli eventi pianificati nell'applicazione:

    current_list_of_scheduled_events = get_latest_from_se_endpoint()
    #prepare for new events
    for each event in current_list_of_scheduled_events:
      if event not in previous_list_of_scheduled_events:
        prepare_for_event(event)
    #recover from completed events
    for each event in previous_list_of_scheduled_events:
      if event not in current_list_of_scheduled_events:
        receover_from_event(event)
    #prepare for future jobs
    previous_list_of_scheduled_events = current_list_of_scheduled_events
    

    Poiché gli eventi pianificati vengono spesso usati per le applicazioni con requisiti di disponibilità elevata, è necessario considerare alcuni casi eccezionali:

    1. Una volta completato e rimosso un evento pianificato dalla matrice, non ci saranno altri impatti senza un nuovo evento incluso un altro evento EventStatus:"Scheduled"
    2. Azure monitora le operazioni di manutenzione nell'intera flotta e in rari casi determina che un'operazione di manutenzione è troppo rischiosa da applicare. In tal caso, l'evento pianificato passa direttamente da essere "Programmato" a essere rimosso dalla matrice di eventi
    3. In caso di errore hardware, Azure ignora lo stato "Scheduled" e passa immediatamente allo stato EventStatus:"Started".
    4. Anche se l'evento è ancora in stato EventStatus:"Started", potrebbe verificarsi un altro impatto di una durata più breve rispetto a quella pubblicizzata nell'evento pianificato.

    Come parte della garanzia di disponibilità di Azure, le macchine virtuali in domini di errore diversi non saranno interessate contemporaneamente dalle operazioni di manutenzione di routine. Tuttavia, possono avere operazioni serializzate una dopo l'altra. Le macchine virtuali in un dominio di errore possono ricevere eventi pianificati con EventStatus:"Scheduled" poco dopo il completamento della manutenzione di un altro dominio di errore. Indipendentemente dall'architettura scelta, mantenere sempre il controllo dei nuovi eventi in sospeso rispetto alle macchine virtuali.

    Anche se i tempi esatti degli eventi variano, il diagramma seguente fornisce una linea guida approssimativa per il funzionamento tipico di un'operazione di manutenzione:

    • Da EventStatus:"Scheduled" ad Approval Timeout: 15 minuti
    • Durata impatto: 7 secondi
    • Da EventStatus:"Started" a Completed (evento rimosso dalla matrice eventi): 10 minuti

    Diagramma di una sequenza temporale che mostra il flusso di un evento pianificato.

    Tutte le operazioni che influiscono sulla disponibilità delle macchine virtuali genereranno un evento pianificato, ma non tutti gli eventi pianificati verranno visualizzati in altre aree di Azure, ad esempio i log attività di Azure o Integrità risorse. Il controllo regolare degli eventi pianificati garantisce di avere le informazioni più aggiornate su eventuali impatti imminenti sulle macchine virtuali.

    Intestazioni

    Quando si eseguono query sul servizio metadati, è necessario specificare l'intestazione Metadata:true per garantire che la richiesta non sia stata reindirizzata accidentalmente. L'intestazione Metadata:true è obbligatoria per tutte le richieste di eventi pianificati. Se non si include l'intestazione nella richiesta, il servizio metadati restituisce una risposta di richiesta non valida.

    Query per gli eventi

    È possibile eseguire query per eventi pianificati eseguendo la chiamata seguente:

    Esempio Bash

    curl -H Metadata:true http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
    

    Esempio PowerShell

    Invoke-RestMethod -Headers @{"Metadata"="true"} -Method GET -Uri "http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01" | ConvertTo-Json -Depth 64
    

    Esempio in Python

    import json
    import requests
    
    metadata_url ="http://169.254.169.254/metadata/scheduledevents"
    header = {'Metadata' : 'true'}
    query_params = {'api-version':'2020-07-01'}
    
    def get_scheduled_events():           
        resp = requests.get(metadata_url, headers = header, params = query_params)
        data = resp.json()
        return data
    
    

    Una risposta contiene una serie di eventi pianificati. Una matrice vuota indica che al momento non sono presenti eventi pianificati. Nel caso in cui siano presenti eventi pianificati, la risposta contiene una matrice di eventi.

    {
        "DocumentIncarnation": {IncarnationID},
        "Events": [
            {
                "EventId": {eventID},
                "EventType": "Reboot" | "Redeploy" | "Freeze" | "Preempt" | "Terminate",
                "ResourceType": "VirtualMachine",
                "Resources": [{resourceName}],
                "EventStatus": "Scheduled" | "Started",
                "NotBefore": {timeInUTC},       
                "Description": {eventDescription},
                "EventSource" : "Platform" | "User",
                "DurationInSeconds" : {timeInSeconds},
            }
        ]
    }
    

    Proprietà dell'evento

    Proprietà Descrizione
    Incarnazione documento Intero che aumenta quando cambia la matrice di eventi. I documenti con la stessa incarnazione contengono le stesse informazioni sugli eventi e l'incarnazione verrà incrementata quando un evento cambia.
    EventId Identificatore globalmente univoco per l'evento.

    Esempio:
    • 602d9444-d2cd-49c7-8624-8643e7171297
    EventType Effetti previsti che questo evento causerà.

    Valori:
    • Freeze: per la macchina virtuale è pianificata una pausa di pochi secondi. La connettività di CPU e di rete può essere sospesa, ma non c'è alcun impatto sulla memoria o sui file aperti.
    • Reboot: è pianificato un riavvio della macchina virtuale. La memoria non permanente andrà persa. In rari casi, una macchina virtuale pianificata per EventType:"Reboot" potrebbe riscontrare un evento di blocco anziché un riavvio. Seguire le istruzioni riportate sopra per sapere se l'evento è completo ed è sicuro ripristinare il carico di lavoro.
    • Redeploy: è pianificato uno spostamento della macchina virtuale in un altro nodo. I dischi temporanei andranno persi.
    • Preempt: la macchina virtuale Spot viene eliminata (i dischi temporanei andranno perduti). Questo evento viene reso disponibile in base al massimo sforzo
    • Terminate: per la macchina virtuale è pianificata l'eliminazione.
    ResourceType Tipo di risorsa interessata dall'evento.

    Valori:
    • VirtualMachine
    Risorse Elenco di risorse interessate dall'evento.

    Esempio:
    • ["FrontEnd_IN_0", "BackEnd_IN_0"]
    EventStatus Stato dell'evento.

    Valori:
    • Scheduled: l'avvio dell'evento è pianificato in seguito al tempo specificato nella proprietà NotBefore.
    • Started: l'evento si è avviato.
    Lo stato Completed o simile non viene mai restituito. Al termine dell'evento, quest'ultimo non viene più restituito.
    NotBefore Tempo al termine del quale l'evento può essere avviato. L'evento non viene avviato prima di questa volta. Se l'evento è già stato avviato, l'evento sarà vuoto

    Esempio:
    • Lun 19 set 2016 18:29:47 GMT
    Descrizione Descrizione di questo evento.

    Esempio:
    • Il server host è in fase di manutenzione.
    EventSource Iniziatore dell'evento.

    Esempio:
    • Platform: questo evento viene avviato dalla piattaforma.
    • User: questo evento viene avviato dall'utente.
    DurationInSeconds Durata prevista dell'interruzione causata dall'evento. Può verificarsi un effetto secondario di una durata più breve durante la finestra di impatto.

    Esempio:
    • 9: l'interruzione causata dall'evento durerà per 9 secondi.
    • 0: l'evento non interrompe la macchina virtuale o influisce sulla sua disponibilità (ad esempio, l'aggiornamento alla rete)
    • -1: valore predefinito usato se la durata dell'impatto è sconosciuta o non applicabile.

    Pianificazione degli eventi

    Ogni evento è pianificato con un ritardo minimo che dipende dal tipo di evento. Questo tempo si riflette in una proprietà NotBefore dell'evento.

    EventType Preavviso minimo
    Blocca 15 minuti
    Riavvio 15 minuti
    Ripetere la distribuzione 10 minuti
    Termina Configurabile dall'utente: da 5 a 15 minuti

    Ciò significa che è possibile rilevare una pianificazione futura dell'evento almeno in base al tempo minimo di preavviso prima che si verifichi l'evento. Una volta pianificato un evento, passerà allo stato Started dopo l'approvazione o quando il tempo NotBefore è trascorso. Tuttavia, in rari casi, l'operazione verrà annullata da Azure prima dell'avvio. In tal caso, l'evento verrà rimosso dalla matrice Eventi e l'impatto non si verificherà come pianificato in precedenza.

    Nota

    In alcuni casi, Azure è in grado di stimare gli errori dell'host dovuti ad hardware danneggiato e tenterà di attenuare le interruzioni del servizio tramite la pianificazione di una migrazione. Le macchine virtuali interessate riceveranno un evento pianificato con un elemento NotBefore che in genere equivale a pochi giorni in futuro. Il tempo effettivo varia a seconda della valutazione del rischio di errore stimato. Quando possibile, Azure prova a fornire un preavviso di 7 giorni, ma il tempo effettivo varia e potrebbe essere inferiore se la stima indica che potrebbe verificarsi un problema di hardware imminente. Per ridurre al minimo i rischi per il servizio qualora l'hardware presenti un guasto prima della migrazione avviata dal sistema, è consigliabile eseguire la ridistribuzione automatica della macchina virtuale appena possibile.

    Nota

    Nel caso in cui il nodo host subisca un errore hardware, Azure ignora il periodo di preavviso minimo e inizia immediatamente il processo di ripristino per le macchine virtuali interessate. In questo modo si riduce il tempo di ripristino nel caso in cui le macchine virtuali interessate non siano in grado di rispondere. Durante il processo di ripristino verrà creato un evento per tutte le macchine virtuali interessate con EventType = Reboot e EventStatus = Started.

    Frequenza di polling

    È possibile eseguire il polling dell'endpoint per gli aggiornamenti con frequenza o raramente desiderato. Tuttavia, più tempo intercorre tra le richieste, maggiore è il tempo che si può perdere per reagire a un evento imminente. La maggior parte degli eventi ha da 5 a 15 minuti di preavviso, anche se in alcuni casi l'avviso anticipato potrebbe essere minimo di 30 secondi. Per assicurarsi di avere il più tempo possibile per eseguire azioni di mitigazione, è consigliabile eseguire il polling del servizio una volta al secondo.

    Avviare un evento

    Dopo aver ricevuto l'avviso di un evento imminente e aver completato la logica per l'arresto normale, è possibile approvare l'evento in sospeso eseguendo una chiamata POST al servizio metadati con EventId. Questa chiamata segnala ad Azure che è possibile ridurre il tempo minimo di notifica, quando possibile. L'evento potrebbe non iniziare immediatamente dopo l'approvazione; in alcuni casi, Azure richiede l'approvazione di tutte le macchine virtuali ospitate nel nodo prima di procedere con l'evento.

    Di seguito è riportato l'esempio JSON con il codice previsto nel corpo della richiesta POST. La richiesta deve contenere un elenco di StartRequests. Ogni StartRequest contiene EventId per l'evento che si vuole velocizzare:

    {
    	"StartRequests" : [
    		{
    			"EventId": {EventId}
    		}
    	]
    }
    

    Il servizio restituisce sempre un codice di operazione riuscita 200 se viene passato un ID evento valido, anche se un'altra macchina virtuale ha già approvato l'evento. Un codice di errore 400 indica che l'intestazione o il payload della richiesta non sono validi.

    Nota

    Gli eventi non procederanno a meno che non siano approvati tramite un messaggio POST o il tempo notBefore trascorso. Sono inclusi gli eventi attivati dall'utente, ad esempio i riavvii delle macchine virtuali dal portale di Azure.

    Esempio Bash

    curl -H Metadata:true -X POST -d '{"StartRequests": [{"EventId": "f020ba2e-3bc0-4c40-a10b-86575a9eabd5"}]}' http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01
    

    Esempio PowerShell

    Invoke-RestMethod -Headers @{"Metadata" = "true"} -Method POST -body '{"StartRequests": [{"EventId": "5DD55B64-45AD-49D3-BBC9-F57D4EA97BD7"}]}' -Uri http://169.254.169.254/metadata/scheduledevents?api-version=2020-07-01 | ConvertTo-Json -Depth 64
    

    Esempio in Python

    import json
    import requests
    
    def confirm_scheduled_event(event_id):  
       # This payload confirms a single event with id event_id
       payload = json.dumps({"StartRequests": [{"EventId": event_id }]})
       response = requests.post("http://169.254.169.254/metadata/scheduledevents", 
                                headers =  {'Metadata' : 'true'}, 
                                params = {'api-version':'2020-07-01'}, 
                                data = payload)    
       return response.status_code
    

    Nota

    Il riconoscimento consente a un evento di procedere per tutti gli elementi Resources dell'evento, non solo per la macchina virtuale che riconosce l'evento. Di conseguenza, è possibile scegliere un coordinatore che si occupi del riconoscimento, che potrebbe essere semplicemente il primo computer elencato nel campo Resources.

    Risposte di esempio

    Gli eventi seguenti sono un esempio visualizzato da due macchine virtuali di cui è stata eseguita la migrazione in tempo reale a un altro nodo.

    DocumentIncarnation cambia ogni volta che sono presenti nuove informazioni in Events. Un'approvazione dell'evento consente al blocco di procedere sia per WestNO_0 che per WestNO_1. DurationInSeconds pari a -1 indica che la piattaforma non conosce il tempo necessario per l'operazione.

    {
        "DocumentIncarnation":  1,
        "Events":  [
                   ]
    }
    
    {
        "DocumentIncarnation":  2,
        "Events":  [
                       {
                           "EventId":  "C7061BAC-AFDC-4513-B24B-AA5F13A16123",
                           "EventStatus":  "Scheduled",
                           "EventType":  "Freeze",
                           "ResourceType":  "VirtualMachine",
                           "Resources":  [
                                             "WestNO_0",
                                             "WestNO_1"
                                         ],
                           "NotBefore":  "Mon, 11 Apr 2022 22:26:58 GMT",
                           "Description":  "Virtual machine is being paused because of a memory-preserving Live Migration operation.",
                           "EventSource":  "Platform",
                           "DurationInSeconds":  5
                       }
                   ]
    }
    
    {
        "DocumentIncarnation":  3,
        "Events":  [
                       {
                           "EventId":  "C7061BAC-AFDC-4513-B24B-AA5F13A16123",
                           "EventStatus":  "Started",
                           "EventType":  "Freeze",
                           "ResourceType":  "VirtualMachine",
                           "Resources":  [
                                             "WestNO_0",
                                             "WestNO_1"
                                         ],
                           "NotBefore":  "",
                           "Description":  "Virtual machine is being paused because of a memory-preserving Live Migration operation.",
                           "EventSource":  "Platform",
                           "DurationInSeconds":  5
                       }
                   ]
    }
    
    {
        "DocumentIncarnation":  4,
        "Events":  [
                   ]
    }
    
    

    Esempio Python

    L'esempio seguente esegue query sul servizio metadati per gli eventi pianificati e approva ogni evento in sospeso:

    #!/usr/bin/python
    import json
    import requests
    from time import sleep
    
    # The URL to access the metadata service
    metadata_url ="http://169.254.169.254/metadata/scheduledevents"
    # This must be sent otherwise the request will be ignored
    header = {'Metadata' : 'true'}
    # Current version of the API
    query_params = {'api-version':'2020-07-01'}
    
    def get_scheduled_events():           
        resp = requests.get(metadata_url, headers = header, params = query_params)
        data = resp.json()
        return data
    
    def confirm_scheduled_event(event_id):  
        # This payload confirms a single event with id event_id
        # You can confirm multiple events in a single request if needed      
        payload = json.dumps({"StartRequests": [{"EventId": event_id }]})
        response = requests.post(metadata_url, 
                                headers= header,
                                params = query_params, 
                                data = payload)    
        return response.status_code
    
    def log(event): 
        # This is an optional placeholder for logging events to your system 
        print(event["Description"])
        return
    
    def advanced_sample(last_document_incarnation): 
        # Poll every second to see if there are new scheduled events to process
        # Since some events may have necessarily short warning periods, it is 
        # recommended to poll frequently
        found_document_incarnation = last_document_incarnation
        while (last_document_incarnation == found_document_incarnation):
            sleep(1)
            payload = get_scheduled_events()    
            found_document_incarnation = payload["DocumentIncarnation"]        
            
        # We recommend processing all events in a document together, 
        # even if you won't be actioning on them right away
        for event in payload["Events"]:
    
            # Events that have already started, logged for tracking
            if (event["EventStatus"] == "Started"):
                log(event)
                
            # Approve all user initiated events. These are typically created by an 
            # administrator and approving them immediately can help to avoid delays 
            # in admin actions
            elif (event["EventSource"] == "User"):
                confirm_scheduled_event(event["EventId"])            
                
            # For this application, freeze events less that 9 seconds are considered
            # no impact. This will immediately approve them
            elif (event["EventType"] == "Freeze" and 
                int(event["DurationInSeconds"]) >= 0  and 
                int(event["DurationInSeconds"]) < 9):
                confirm_scheduled_event(event["EventId"])
                
            # Events that may be impactful (for example reboot or redeploy) may need custom 
            # handling for your application
            else: 
                #TODO Custom handling for impactful events
                log(event)
        print("Processed events from document: " + str(found_document_incarnation))
        return found_document_incarnation
    
    def main():
        # This will track the last set of events seen 
        last_document_incarnation = "-1"
    
        input_text = "\
            Press 1 to poll for new events \n\
            Press 2 to exit \n "
        program_exit = False 
    
        while program_exit == False:
            user_input = input(input_text)    
            if (user_input == "1"):                        
                last_document_incarnation = advanced_sample(last_document_incarnation)
            elif (user_input == "2"):
                program_exit = True       
    
    if __name__ == '__main__':
        main()
    

    Passaggi successivi