Emulador baseado em Linux – vNext (versão prévia)

A próxima geração do emulador do Azure Cosmos DB é inteiramente baseada em Linux e está disponível como um contêiner do Docker. Ele dá suporte à execução em uma ampla variedade de processadores e sistemas operacionais.

Importante

Esta versão do emulador dá suporte apenas à API para NoSQL no modo gateway, com um subconjunto selecionado de recursos. Para obter mais informações, consulte suporte de funcionalidades.

Prerequisites

Installation

Obter a imagem de contêiner do Docker usando docker pull. A imagem do contêiner é publicada no Registro de Artefato da Microsoft como mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview.

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

Em execução

Para executar o contêiner, use docker run. Posteriormente, use docker ps para validar se o contêiner está em execução.

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>

O emulador inclui dois componentes:

  • Data Explorer – explore interativamente os dados no emulador. Por padrão, esse componente é executado na porta 1234.
  • Azure Cosmos DB emulador – uma versão local do serviço de banco de dados Azure Cosmos DB. Por padrão, esse componente é executado na porta 8081.

O ponto de extremidade do gateway do emulador usa a porta 8081 no endereço http://localhost:8081. Para navegar até o Data Explorer, use o endereço http://localhost:1234 no navegador da Web. O ponto de extremidade do gateway normalmente está disponível imediatamente, mas o Data Explorer pode levar alguns segundos para iniciar.

Sonda de saúde

O emulador expõe um endpoint de verificação de integridade na porta 8080. Use esse ponto de extremidade para determinar quando o emulador está totalmente inicializado e pronto para aceitar solicitações.

Os seguintes endpoints estão disponíveis:

Note

A mensagem herdada de log System is now fully ready to accept requests ainda é emitida para garantir compatibilidade retroativa, mas pode ser removida em uma versão futura. Em vez disso, use a sonda de integridade para verificações de preparação.

Modo HTTPS

Os SDKs .NET e Java não suportam o modo HTTP no emulador. Como essa versão do emulador começa com HTTP por padrão, você precisará habilitar explicitamente o HTTPS ao iniciar o contêiner (veja abaixo). Para o SDK Java, você também precisará instalar certificados.

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 você usa HTTPS com volumes de dados persistentes, o emulador regenera automaticamente certificados SSL na inicialização, portanto, você não precisa gerenciar a renovação do certificado.

Comandos do Docker

A tabela a seguir resume os comandos do Docker disponíveis para configurar o emulador. Esta tabela detalha os argumentos correspondentes, variáveis de ambiente, valores permitidos, configurações padrão e descrições de cada comando.

Requisito Argh Env Valores permitidos Default Description
Imprimir as configurações para stdout do contêiner --help, -h N/A N/A N/A Exibir informações sobre a configuração disponível
Definir a porta do ponto de extremidade do Cosmos --port [INT] PORTO INT 8081 A porta do ponto de extremidade do Cosmos no contêiner. Você ainda precisa publicar essa porta (por exemplo, -p 8081:8081).
Especificar o protocolo usado pelo ponto de extremidade do Cosmos --protocol PROTOCOLO https http, https-insecure http O protocolo do ponto de extremidade do Cosmos no contêiner.
Habilitar o explorador de dados --enable-explorer HABILITAR_EXPLORADOR true, false true Habilite a execução do Cosmos Data Explorer no mesmo contêiner.
Definir a porta usada pelo data explorer --explorer-port EXPLORER_PORT INT 1234 A porta de comunicação do Cosmos Data Explorer no contêiner. Você ainda precisa publicar essa porta (por exemplo, -p 1234:1234).
Especificar o protocolo usado pelo data explorer --explorer-protocol EXPLORER_PROTOCOL https http, https-insecure <the value of --protocol> O protocolo do Cosmos Data Explorer no contêiner. O padrão é a configuração do protocolo no ponto de extremidade do Cosmos.
Personalizar o ponto de extremidade público do gateway --gateway-endpoint GATEWAY_PUBLIC_ENDPOINT N/A localhost O ponto de extremidade do gateway público. Usa localhost como padrão.
Especificar a chave por meio do arquivo --key-file [PATH] KEY_FILE Caminho <default secret> Substitua a chave padrão pela chave especificada no arquivo. Você precisará montar este arquivo no contêiner (por exemplo, se KEY_FILE=/mykey, você deve adicionar um parâmetro como o seguinte ao comando docker run: --mount type=bind,source=./myKey,target=/myKey)
Definir o caminho de dados --data-path [PATH] DATA_PATH Caminho /data Especifique um diretório para dados. Usado com frequência com a opção docker run --mount (por exemplo, se DATA_PATH=/usr/cosmos/data, você adicionará uma opção como a seguinte à execução do docker: --mount type=bind,source=./.local/data,target=/usr/cosmos/data)
Especificar o caminho do certificado a ser usado para https --cert-path [PATH] CERT_PATH Caminho <default cert> Especifique um caminho para um certificado para proteger o tráfego. Você precisa montar esse arquivo no contêiner (por exemplo, se CERT_PATH=/mycert.pfx, adicione uma opção como a seguinte ao executar o docker: --mount type=bind,source=./mycert.pfx,target=/mycert.pfx)
Especificar o segredo do certificado a ser usado para https N/A CERT_SECRET cadeia <default secret> O segredo do certificado especificado no CERT_PATH.
Definir o nível de log --log-level [LEVEL] LOG_LEVEL quiet, error, warn, info, debug, , trace info A verbosidade dos logs que são emitidos pelo emulador e pelo explorador de dados.
Habilitar o exportador OTLP do OpenTelemetry --enable-otlp ENABLE_OTLP_EXPORTER true, false false Habilitar a integração do OpenTelemetry.
Habilitar exportador de console --enable-console ENABLE_CONSOLE_EXPORTER true, false false Habilite a saída do console de dados de telemetria (útil para depuração).
Habilitar o modo detalhado --verbose PROLIXO true, false false Habilite o modo detalhado para exibir logs do PostgreSQL (pglog) no console. Útil para debugging.
Definir o tamanho do buffer de consulta --query-buffer-size QUERY_BUFFER_SIZE_KB INT 4096 (4 MB), máximo de 65536 (64 MB) O tamanho máximo em KB para buffers de resultados de consulta. Aumente isso se você encontrar erros HTTP 500 em consultas grandes.
Habilitar informações de diagnóstico que estão sendo enviadas à Microsoft --enable-telemetry ATIVAR_TELEMETRIA true, false true Habilite o envio de dados de uso para a Microsoft para nos ajudar a melhorar o emulador.

Suporte de funcionalidades

Esse emulador está em desenvolvimento ativo e versão prévia. Como resultado, nem todos os recursos do Azure Cosmos DB têm suporte. Alguns recursos também não terão suporte no futuro. Esta tabela inclui o estado de vários recursos e seu nível de suporte.

Funcionalidade Support
API do Lote ✅ Com suporte
API em massa ✅ Com suporte
Feed de Alterações ✅ Com suporte
Criar e ler documento com dados utf ✅ Com suporte
Criar coleção ✅ Com suporte
Criar conflito de coleção duas vezes ✅ Com suporte
Criar coleção com a política de índice personalizada ⚠️ No-op
Criar coleção com expiração de ttl ✅ Com suporte
Criar banco de dados ✅ Com suporte
Criar banco de dados duas vezes em conflito ✅ Com suporte
Criar documento ✅ Com suporte
Criar coleção particionada ✅ Com suporte
Excluir coleção ✅ Com suporte
Excluir banco de dados ✅ Com suporte
Excluir documento ✅ Com suporte
Obter e alterar o desempenho da coleção ⚠️ Ainda não implementado
Inserir documento grande ✅ Com suporte
Documento de patch ✅ Com suporte
Consultar coleção particionada em paralelo ⚠️ Ainda não implementado
Consulta com agregações ✅ Com suporte
Consultar com e filtrar ✅ Com suporte
Consultar com e filtrar e projeção ✅ Com suporte
Consulta com igualdade ✅ Com suporte
Consulta com iguais na ID ✅ Com suporte
Consultar com junções ✅ Com suporte
Consulta com ordem por ✅ Com suporte
Consulta com ordem por para coleção particionada ✅ Com suporte
Consultar com ordem por números ✅ Com suporte
Consultar com ordem por cadeias de caracteres ✅ Com suporte
Consulta com paginação ✅ Com suporte
Horários de data de consulta com operadores de intervalo ✅ Com suporte
Consulta com operadores de intervalo em números ✅ Com suporte
Consulta com operadores de intervalo em cadeias de caracteres ✅ Com suporte
Consulta com junção única ✅ Com suporte
Consulta com operadores de matriz e matemática de cadeia de caracteres ✅ Com suporte
Consulta com subdocumentos ✅ Com suporte
Consultar com duas junções ✅ Com suporte
Consultar com duas junções e filtrar ✅ Com suporte
Coleção de leitura ✅ Com suporte
Feed de coleta de leitura ⚠️ Ainda não implementado
Ler banco de dados ✅ Com suporte
Ler fluxo do banco de dados ⚠️ Ainda não implementado
Ler documento ✅ Com suporte
Ler fluxo de documentos ✅ Com suporte
Substituir documento ✅ Com suporte
Unidades de Solicitação ⚠️ Ainda não implementado
Procedimentos armazenados ❌ Não planejado
Gatilhos ❌ Não planejado
UDFs ❌ Não planejado
Atualizar coleção ⚠️ No-op
Atualizar documento ✅ Com suporte
Endpoint de oferta ⚠️ No-op
Endpoint de usuários ⚠️ No-op
Endpoint de permissões ⚠️ No-op
CEK (Chaves de Criptografia do Cliente) ⚠️ No-op

Note

Os recursos marcados como Não op aceitam solicitações e retornam códigos de status HTTP válidos, mas não executam a operação subjacente. Seu código não será interrompido, mas não dependerá desses recursos para comportamento funcional. Políticas de índice personalizadas e atualizações de coleção são aceitas para compatibilidade, mas as consultas não são otimizadas por índices personalizados.

Limitações

Além dos recursos ainda não compatíveis ou não planejados, a lista a seguir inclui as limitações atuais do emulador.

  • O SDK do .NET para Azure Cosmos DB não dá suporte à execução em massa no emulador.
  • Se você receber erros HTTP 500 em resultados de consultas grandes, aumente o tamanho do buffer de consulta com o --query-buffer-size flag ou a variável de ambiente QUERY_BUFFER_SIZE_KB. O padrão é 4096 KB (4 MB) e o máximo é 65536 KB (64 MB).

Instalando certificados para Java SDK

Ao usar o SDK Java para Azure Cosmos DB com essa versão do emulador no modo https, é necessário instalar seus certificados no repositório de confiança Java local.

Obter certificado

Em uma janela bash, execute o seguinte:

# 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

Instalar certificado

Navegue até o diretório da instalação do Java onde o arquivo cacerts está localizado (substitua abaixo pelo diretório correto):

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

Importe o certificado (pode ser solicitada uma senha, o valor padrão é "changeit"):

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

Se você receber um erro porque o alias já existe, exclua-o e execute o procedimento acima novamente:

keytool -cacerts -delete -alias cosmos_emulator

Suporte ao OpenTelemetry

O OpenTelemetry é uma estrutura de observabilidade de software livre que fornece uma coleção de ferramentas, APIs e SDKs para instrumentar, gerar, coletar e exportar dados de telemetria. O Protocolo OpenTelemetry (OTLP) é o protocolo usado pelo OpenTelemetry para transmitir dados de telemetria entre componentes.

Você pode usar OpenTelemetry com o emulador para monitorar e rastrear seu aplicativo. O emulador dá suporte a opções de telemetria, que podem ser configuradas por meio de variáveis de ambiente ou sinalizadores de linha de comando ao executar o contêiner do Docker.

O emulador exporta as métricas a seguir. Eles estão disponíveis por meio de qualquer back-end de métricas que dê suporte ao OTLP e fornece insights valiosos sobre o desempenho e a integridade do banco de dados:

  • Taxas de Solicitação: mostra os padrões de tráfego para diferentes tipos de operação
  • Tempos de execução de consulta: mede o tempo necessário para executar consultas diferentes
  • Utilização de recursos: CPU, uso de memória e métricas do pool de conexões
  • Taxas de erro: acompanhamento de erros por tipo e ponto de extremidade

Note

O emulador dá suporte a TLS condicional para o exportador OTLP, para que você possa se integrar às plataformas de observabilidade que exigem conexões seguras.

Instruções detalhadas com exemplos estão disponíveis no repositório GitHub.

Usar no fluxo de trabalho de integração contínua

Há muitos benefícios em usar contêineres do Docker em pipelines de CI/CD, especialmente para sistemas com estado, como bancos de dados. Isso pode ser em termos de custo-benefício, desempenho, confiabilidade e consistência de seus conjuntos de testes.

O emulador pode ser incorporado como parte de pipelines de CI/CD. Você pode consultar este repositório GitHub que fornece exemplos de como usar o emulador como parte de um fluxo de trabalho de CI do GitHub Actions para aplicativos .NET, Python, Java e Go em arquiteturas x64 e ARM64 (demonstrado para executor no Linux usando ubuntu).

Aqui está um exemplo de um fluxo de trabalho de CI do GitHub Actions que mostra como configurar o emulador como um contêiner de serviço do GitHub Actions como parte de um trabalho no fluxo de trabalho. GitHub cuida de iniciar o contêiner do Docker e o destrói quando o trabalho é concluído, sem a necessidade de intervenção manual (como usar o 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

Esse trabalho é executado em um executor do Ubuntu e usa a imagem do mcr.microsoft.com/cosmosdb/linux/azure-cosmos-emulator:vnext-preview Docker como um contêiner de serviço. Ele usa variáveis de ambiente para configurar a cadeia de conexão, o nome do banco de dados e o nome do contêiner. Como nesse caso o trabalho está sendo executado diretamente na máquina do executor do GitHub Actions, a etapa Executar testes no trabalho pode acessar o emulador, que está acessível usando localhost:8081 (8081 é a porta exposta pelo emulador).

A etapa Export Cosmos DB Emulator Certificate é específica para Java aplicativos, pois o SDK do Azure Cosmos DB Java atualmente não dá suporte ao modo HTTP no emulador. A variável de ambiente PROTOCOL é definida como https na seção services e essa etapa exporta o certificado do emulador e o importa para o repositório de chaves Java. O mesmo também se aplica ao .NET.

Problemas de relatórios

Se você encontrar problemas com o uso desta versão do emulador, abra um problema no repositório GitHub (https://github.com/Azure/azure-cosmos-db-emulator-docker) e marque-o com o rótulo cosmosEmulatorVnextPreview.