Emulatore basato su Linux - vNext (anteprima)

La nuova generazione dell'emulatore Azure Cosmos DB è interamente basata su Linux ed è disponibile come contenitore Docker. Supporta l'esecuzione su un'ampia gamma di processori e sistemi operativi.

Importante

Questa versione dell'emulatore supporta solo l'API per NoSQL in modalità gateway, con un subset selezionato di funzionalità. Per altre informazioni, vedere il supporto delle funzionalità.

Prerequisiti

Installazione

Ottenere l'immagine del contenitore Docker usando docker pull. L'immagine del contenitore viene pubblicata nel registro Microsoft Artifact Registry come mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview.

docker pull mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview

In esecuzione

Per eseguire il contenitore, usare docker run. Successivamente, usare docker ps per verificare che il contenitore sia in esecuzione.

docker run --detach --publish 8081:8081 --publish 8080:8080 --publish 1234:1234 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview

docker ps
CONTAINER ID   IMAGE                                                             COMMAND                  CREATED         STATUS         PORTS                                                                                  NAMES
c1bb8cf53f8a   mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview  "/bin/bash -c /home/…"   5 seconds ago   Up 5 seconds   0.0.0.0:1234->1234/tcp, :::1234->1234/tcp, 0.0.0.0:8081->8081/tcp, :::8081->8081/tcp   <container-name>

L'emulatore include due componenti:

  • Esplora dati - Esplorare in modo interattivo i dati nell'emulatore. Per impostazione predefinita, questo componente viene eseguito sulla porta 1234.
  • emulatore Azure Cosmos DB: versione locale del servizio di database Azure Cosmos DB. Per impostazione predefinita, questo componente viene eseguito sulla porta 8081.

L'endpoint del gateway emulatore usa la porta 8081 all'indirizzo http://localhost:8081. Per passare alla Esplora dati, usare l'indirizzo http://localhost:1234 nel Web browser. L'endpoint del gateway è in genere disponibile immediatamente, ma l'avvio di Esplora dati potrebbe richiedere alcuni secondi.

Sonda di diagnostica

L'emulatore espone un endpoint sonda di integrità sulla porta 8080. Usare questo endpoint per determinare quando l'emulatore è completamente inizializzato e pronto per accettare le richieste.

Sono disponibili i seguenti endpoint:

Annotazioni

Il messaggio System is now fully ready to accept requests di log legacy viene ancora generato per la compatibilità con le versioni precedenti, ma potrebbe essere rimosso in una versione futura. Usare invece la sonda di integrità per i controlli di disponibilità.

Modalità HTTPS

Gli SDK .NET e Java non supportano la modalità HTTP nell'emulatore. Poiché questa versione dell'emulatore inizia con HTTP per impostazione predefinita, sarà necessario abilitare in modo esplicito HTTPS all'avvio del contenitore (vedere di seguito). Per Java SDK, è anche necessario installare i certificati.

docker run --detach --publish 8081:8081 --publish 8080:8080 --publish 1234:1234 mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview --protocol https

Quando si usa HTTPS con volumi di dati persistenti, l'emulatore rigenera automaticamente i certificati SSL all'avvio, quindi non è necessario gestire il rinnovo del certificato.

Comandi Docker

La tabella seguente riepiloga i comandi Docker disponibili per la configurazione dell'emulatore. Questa tabella illustra in dettaglio gli argomenti corrispondenti, le variabili di ambiente, i valori consentiti, le impostazioni predefinite e le descrizioni di ogni comando.

Requisito Argomento Env Valori consentiti Default Description
Stampare le impostazioni in stdout dal contenitore --help, -h N/A N/A N/A Visualizzare informazioni sulla configurazione disponibile
Impostare la porta dell'endpoint Cosmos --port [INT] PORTA INT 8081 Porta dell'endpoint Cosmos nel contenitore. È comunque necessario pubblicare questa porta, ad esempio -p 8081:8081.
Specificare il protocollo usato dall'endpoint Cosmos --protocol PROTOCOLLO https, http, https-insecure http Il protocollo dell'endpoint Cosmos nel contenitore.
Abilitare Esplora dati --enable-explorer ENABLE_EXPLORER true, false true Abilitare l'esecuzione del Esplora dati Cosmos nello stesso contenitore.
Impostare la porta usata da Esplora dati --explorer-port EXPLORER_PORT INT 1234 La porta del Cosmos Esplora dati sul contenitore. È comunque necessario pubblicare questa porta, ad esempio -p 1234:1234.
Specificare il protocollo usato da Esplora dati --explorer-protocol EXPLORER_PROTOCOL https, http, https-insecure <the value of --protocol> Protocollo del Esplora dati Cosmos nel contenitore. Il valore predefinito è l'impostazione del protocollo nell'endpoint Cosmos.
Personalizzare l'endpoint pubblico del gateway --gateway-endpoint GATEWAY_PUBLIC_ENDPOINT N/A localhost Endpoint del gateway pubblico. Il valore predefinito è localhost.
Specificare la chiave tramite file --key-file [PATH] KEY_FILE PERCORSO <default secret> Eseguire l'override della chiave predefinita con la chiave specificata nel file. È necessario montare questo file nel contenitore (ad esempio, se KEY_FILE=/mykey, aggiungere un'opzione simile alla seguente all'esecuzione di Docker: --mount type=bind,source=./myKey,target=/myKey)
Impostare il percorso dati --data-path [PATH] DATA_PATH PERCORSO /data Specificare una directory per i dati. Usato di frequente con l'opzione docker run --mount (ad esempio, se DATA_PATH=/usr/cosmos/data, aggiungere un'opzione simile alla seguente all'esecuzione di Docker: --mount type=bind,source=./.local/data,target=/usr/cosmos/data)
Specificare il percorso del certificato da usare per https --cert-path [PATH] CERT_PATH PERCORSO <default cert> Specificare un percorso di un certificato per la protezione del traffico. È necessario montare questo file nel contenitore (ad esempio, se CERT_PATH=/mycert.pfx, aggiungere un'opzione simile alla seguente all'esecuzione di Docker: --mount type=bind,source=./mycert.pfx,target=/mycert.pfx)
Specificare il segreto del certificato da usare per https N/A CERT_SEGRETO string <default secret> Il segreto per il certificato specificato in CERT_PATH.
Impostare il livello di log --log-level [LEVEL] LOG_LEVEL quiet, error, warn, info, debugtrace info Livello di verbosità dei log emessi dall'emulatore e dal data explorer.
Abilitare l'esportatore OTLP di OpenTelemetry --enable-otlp ENABLE_OTLP_EXPORTER true, false false Abilitare l'integrazione di OpenTelemetry.
Abilitare l'esportatore della console --enable-console ENABLE_CONSOLE_EXPORTER true, false false Abilitare l'output della console dei dati di telemetria (utile per il debug).
Abilitare la modalità dettagliata --verbose PROLISSO true, false false Abilitare la modalità dettagliata per stampare i log di PostgreSQL (abbreviazione: pglog) nella console. Utile per il debug.
Impostare le dimensioni del buffer di query --query-buffer-size QUERY_BUFFER_SIZE_KB INT 4096 (4 MB), massimo 65536 (64 MB) Dimensione massima in KB per i buffer dei risultati della query. Aumenta questo parametro se si verificano errori HTTP 500 su query di grandi dimensioni.
Abilitare l'invio di informazioni di diagnostica a Microsoft --enable-telemetry ATTIVA_TELEMETRIA true, false true Abilitare l'invio di dati di utilizzo a Microsoft per migliorare l'emulatore.

Supporto delle funzionalità

Questo emulatore è in fase di sviluppo e anteprima attivi. Di conseguenza, non tutte le funzionalità di Azure Cosmos DB sono supportate. Alcune funzionalità non saranno supportate in futuro. Questa tabella include lo stato di varie funzionalità e il relativo livello di supporto.

Caratteristica / Funzionalità Support
Batch API ✅ Sostenuto
API in blocco ✅ Sostenuto
Feed di modifiche ✅ Sostenuto
Creare e leggere un documento con dati utf ✅ Sostenuto
CreateCollection ✅ Sostenuto
Creare una raccolta due volte in conflitto ✅ Sostenuto
Creare una raccolta con criteri di indice personalizzati ⚠️ Nessuna operazione (No-op)
Creare una raccolta con scadenza ttl ✅ Sostenuto
CreateDatabase ✅ Sostenuto
Creare un conflitto di database due volte ✅ Sostenuto
Creare un documento ✅ Sostenuto
Creare una raccolta partizionata ✅ Sostenuto
Eliminare una raccolta ✅ Sostenuto
Eliminare un database ✅ Sostenuto
Eliminare un documento ✅ Sostenuto
Ottenere e modificare le prestazioni della raccolta ⚠️ Non ancora implementato
Inserire un documento di grandi dimensioni ✅ Sostenuto
Applicare patch a un documento ✅ Sostenuto
Eseguire query sulla raccolta partizionata in parallelo ⚠️ Non ancora implementato
Query con aggregazioni ✅ Sostenuto
Eseguire query con e filtrare ✅ Sostenuto
Eseguire query con e filtrare e proiettare ✅ Sostenuto
Query con uguaglianza ✅ Sostenuto
Query con uguale all'ID ✅ Sostenuto
Eseguire query con join ✅ Sostenuto
Eseguire query con riordina per ✅ Sostenuto
Eseguire una query con riordina per raccolta partizionata ✅ Sostenuto
Eseguire una query con ordine in base ai numeri ✅ Sostenuto
Eseguire query con riordina per stringhe ✅ Sostenuto
Query con paging ✅ Sostenuto
Eseguire una query con gli operatori di intervallo data/ora ✅ Sostenuto
Eseguire query con operatori di intervallo su numeri ✅ Sostenuto
Eseguire query con operatori di intervallo su stringhe ✅ Sostenuto
Query con un singolo join ✅ Sostenuto
Eseguire query con operatori di stringa, matematici e di matrice ✅ Sostenuto
Eseguire query con documenti secondari ✅ Sostenuto
Eseguire una query con due join ✅ Sostenuto
Eseguire una query con due join e filtri ✅ Sostenuto
Leggere la raccolta ✅ Sostenuto
Leggere il feed di raccolta ⚠️ Non ancora implementato
Leggere un database ✅ Sostenuto
Leggere il feed di un database ⚠️ Non ancora implementato
Leggere un documento ✅ Sostenuto
Leggere il feed di un documento ✅ Sostenuto
Sostituire un documento ✅ Sostenuto
Unità richiesta ⚠️ Non ancora implementato
Procedure memorizzate ❌ Non pianificato
Trigger ❌ Non pianificato
funzioni definite dall'utente ❌ Non pianificato
UpdateCollection ⚠️ Nessuna operazione (No-op)
Aggiornare un documento ✅ Sostenuto
Endpoint offerte ⚠️ Nessuna operazione (No-op)
Endpoint utenti ⚠️ Nessuna operazione (No-op)
Endpoint delle autorizzazioni ⚠️ Nessuna operazione (No-op)
Chiavi di crittografia client (CEK) ⚠️ Nessuna operazione (No-op)

Annotazioni

Funzionalità contrassegnate come no-op accettano richieste e restituiscono codici di stato HTTP validi, ma non eseguono l'operazione sottostante. Il codice non si interrompe, ma non dipende da queste funzionalità per il comportamento funzionale. I criteri di indice personalizzati e gli aggiornamenti delle raccolte vengono accettati per la compatibilità, ma le query non sono ottimizzate da indici personalizzati.

Limitazioni

Oltre alle funzionalità non ancora supportate o non pianificate, l'elenco seguente include le limitazioni correnti dell'emulatore.

  • L'SDK di .NET per Azure Cosmos DB non supporta l'esecuzione in blocco nell'emulatore.
  • Se vengono visualizzati errori HTTP 500 in risultati di query di grandi dimensioni, aumentare le dimensioni del buffer di query con il --query-buffer-size flag o la QUERY_BUFFER_SIZE_KB variabile di ambiente. Il valore predefinito è 4096 KB (4 MB) e il valore massimo è 65536 KB (64 MB).

Installazione dei certificati per Java SDK

Quando si usa Java SDK per Azure Cosmos DB con questa versione dell'emulatore in modalità https, è necessario installare i certificati nell'archivio trust locale Java.

Ottenere il certificato

In una finestra bash, eseguire quanto segue:

# If the emulator was started with /AllowNetworkAccess, replace localhost with the actual IP address of it:
EMULATOR_HOST=localhost
EMULATOR_PORT=8081
EMULATOR_CERT_PATH=/tmp/cosmos_emulator.cert
openssl s_client -connect ${EMULATOR_HOST}:${EMULATOR_PORT} </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > $EMULATOR_CERT_PATH

Installare il certificato

Passare alla directory dell'installazione java in cui è collocato il file cacerts (sostituire di seguito con la directory corretta):

cd "C:/Program Files/Eclipse Adoptium/jdk-17.0.10.7-hotspot/bin"

Importare il certificato (è possibile che venga chiesta una password; il valore predefinito è "changeit"):

keytool -cacerts -importcert -alias cosmos_emulator -file $EMULATOR_CERT_PATH

Se viene visualizzato un errore perché l'alias esiste già, eliminarlo e quindi eseguire di nuovo quanto sopra:

keytool -cacerts -delete -alias cosmos_emulator

Supporto di OpenTelemetry

OpenTelemetry è un framework di osservabilità open source che fornisce una raccolta di strumenti, API e SDK per instrumentare, generare, raccogliere ed esportare dati di telemetria. Il protocollo OPENTelemetry Protocol (OTLP) è il protocollo usato da OpenTelemetry per trasmettere i dati di telemetria tra i componenti.

È possibile usare OpenTelemetry con l'emulatore per monitorare e tracciare l'applicazione. L'emulatore supporta le opzioni di telemetria, che possono essere configurate tramite variabili di ambiente o flag della riga di comando durante l'esecuzione del contenitore Docker.

L'emulatore esporta le metriche seguenti. Sono disponibili tramite qualsiasi back-end delle metriche che supporta OTLP e fornisce informazioni utili sulle prestazioni e sull'integrità del database:

  • Frequenza delle richieste: mostra i modelli di traffico per diversi tipi di operazione
  • Tempi di esecuzione delle query: misura il tempo impiegato per eseguire query diverse
  • Utilizzo risorse: metriche cpu, utilizzo della memoria e pool di connessioni
  • Frequenza degli errori: rilevamento degli errori per tipo ed endpoint

Annotazioni

L'emulatore supporta TLS condizionale per l'esportatore OTLP, per integrarsi con piattaforme di osservabilità che richiedono connessioni sicure.

Le istruzioni dettagliate con esempi sono disponibili nel repository GitHub.

Uso nel flusso di lavoro dell'integrazione continua

L'uso di contenitori Docker nelle pipeline CI/CD offre numerosi vantaggi, soprattutto per sistemi con stato come i database. Questa potrebbe essere in termini di costo-efficacia, prestazioni, affidabilità e coerenza delle suite di test.

L'emulatore può essere incorporato come parte delle pipeline CI/CD. È possibile fare riferimento a questo repository GitHub che fornisce esempi su come usare l'emulatore come parte di un flusso di lavoro CI di GitHub Actions per applicazioni .NET, Python, Java e Go su entrambe le architetture x64 e ARM64 (illustrato per il runner Linux usando ubuntu).

Di seguito è riportato un esempio di flusso di lavoro CI di GitHub Actions che illustra come configurare l'emulatore come un contenitore di servizio di GitHub Actions all'interno di un processo del flusso di lavoro. GitHub si occupa dell'avvio del contenitore Docker e lo elimina al termine del processo, senza la necessità di intervento manuale, ad esempio usando il comando docker run.

name: CI demo app

on:
  push:
    branches: [main]
    paths:
      - 'java-app/**'
  pull_request:
    branches: [main]
    paths:
      - 'java-app/**'

jobs:
  build-and-test:
    runs-on: ubuntu-latest

    services:
      cosmosdb:
        image: mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview
        ports:
          - 8081:8081
        env:
          PROTOCOL: https
        
    env:
      COSMOSDB_CONNECTION_STRING: ${{ secrets.COSMOSDB_CONNECTION_STRING }}
      COSMOSDB_DATABASE_NAME: ${{ vars.COSMOSDB_DATABASE_NAME }}
      COSMOSDB_CONTAINER_NAME: ${{ vars.COSMOSDB_CONTAINER_NAME }}

    steps:

      - name: Set up Java
        uses: actions/setup-java@v3
        with:
          distribution: 'microsoft'
          java-version: '21.0.0'

      - name: Export Cosmos DB Emulator Certificate
        run: |

          sudo apt update && sudo apt install -y openssl

          openssl s_client -connect localhost:8081 </dev/null | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > cosmos_emulator.cert

          cat cosmos_emulator.cert

          $JAVA_HOME/bin/keytool -cacerts -importcert -alias cosmos_emulator -file cosmos_emulator.cert -storepass changeit -noprompt
      
      - name: Checkout repository
        uses: actions/checkout@v4

      - name: Run tests
        run: cd java-app && mvn test

Questo processo viene eseguito su un runner Ubuntu e usa l'immagine mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview Docker come contenitore di servizio. Usa le variabili di ambiente per configurare la stringa di connessione, il nome del database e il nome del contenitore. Poiché in questo caso il processo viene eseguito direttamente nel computer di esecuzione di GitHub Actions, il passaggio Esegui test nel processo può accedere all'emulatore usando localhost:8081 (8081 è la porta esposta dall'emulatore).

Il passaggio Export Cosmos DB Emulator Certificate (Esporta certificato dell'emulatore Cosmos DB) è specifico per le applicazioni Java poiché l'SDK Java di Azure Cosmos DB attualmente non supporta la modalità HTTP nell'emulatore. La variabile di ambiente PROTOCOL è impostata su https nella sezione services e questo passaggio esporta il certificato dell'emulatore e lo importa nell'archivio chiavi Java. Lo stesso vale anche per .NET.

Segnalazione di problemi

Se si verificano problemi con l'uso di questa versione dell'emulatore, aprire un problema nel repository GitHub (https://github.com/Azure/azure-cosmos-db-emulator-docker) e contrassegnarlo con l'etichetta cosmosEmulatorVnextPreview.