Administração do NDB

Há ferramentas e APIs para facilitar a administração dos dados armazenados de um aplicativo.

Console do Google Cloud Platform

Ao usar o Console do GCP, lembre-se de que o NDB é implementado por meio do Cloud Datastore e do Memcache. Ao "ler" um valor, o NDB verifica primeiro o Memcache. Ele só vai ler do Cloud Datastore se não encontrar o valor no Memcache.

Assim, se você usar o console do GCP para editar uma entidade no Cloud Datastore, o aplicativo ainda poderá usar o valor "anterior" se esse valor estiver no Memcache. Convém contornar isso limpando o Memcache. Porém, isso é um pouco complicado. Se precisar ajustar valores "manualmente" com frequência, você poderá configurar uma IU para isso no aplicativo que grava valores por meio da biblioteca de cliente NDB. Gravar via NDB mantém o Cloud Datastore e o Memcache sincronizados.

Consultas de metadados

O NDB aceita uma API de consulta de metadados. Isso permite que um aplicativo receba algumas informações gerais sobre o uso do Cloud Datastore. Essa API está no módulo google.appengine.ext.ndb.metadata. Ela tem as seguintes funções:

  • get_namespaces(start=None, end=None): retorna uma lista de nomes de namespace
  • get_kinds(start=None, end=None): retorna uma lista de nomes de tipo
  • get_properties_of_kind(kind, start=None, end=None): retorna uma lista de nomes de propriedades do nome do tipo fornecido
  • get_representations_of_kind(kind, start=None, end=None): retorna um dict que mapeia nomes de propriedades para o nome do tipo fornecido em listas de nomes de representação, como 'STRING', 'BOOLEAN' ou 'INT64'.

Essas funções têm argumentos de início e término opcionais que podem ser usados para restringir a consulta a um determinado intervalo. Aqui, início é inclusivo e término é exclusivo. Ambos assumem como padrão None. Por exemplo, para recuperar todos os namespaces que comecem com uma letra minúscula, você poderia chamar get_namespaces('a', chr(ord('z') + 1)). Todos eles, exceto get_namespaces(), estão implicitamente restritos ao namespace atual. Os gets e queries de metadados são faturados da mesma maneira que gets e consultas do Cloud Datastore.

Consultas estatísticas

O Cloud Datastore mantém estatísticas sobre os dados armazenados de um aplicativo, como quantas entidades existem de um determinado tipo ou quanto de espaço é usado por certos valores de propriedade de um dado tipo. Você pode ver essas estatísticas no console do GCP, na página Painel de controle.

Você também pode acessar esses valores de maneira programática dentro do aplicativo consultando entidades nomeadas especialmente usando a Cloud Datastore API. Cada estatística é acessível como uma entidade com nome do tipo que começa e termina com dois sublinhados. Por exemplo, cada app tem exatamente uma entidade do tipo __Stat_Total__ que representa estatísticas de todas as entidades no Cloud Datastore no total. Cada entidade de estatística tem as seguintes propriedades:

  • count, o número de itens considerados pela estatística (um inteiro longo)
  • bytes, o tamanho total dos itens da estatística (um inteiro longo)
  • timestamp, a hora da atualização mais recente da estatística (um valor data-hora)

Alguns tipos de estatística também têm propriedades extras, listadas abaixo.

Um aplicativo pode usar classes de modelo fornecidas pelo pacote google.appengine.ext.ndb.stats para acessar entidades estatísticas.

from google.appengine.ext.ndb import stats

global_stat = stats.GlobalStat.query().get()
print 'Total bytes stored: %d' % global_stat.bytes
print 'Total entities stored: %d' % global_stat.count

Ao criar novas entidades de estatística, o sistema de estatísticas não exclui as anteriores de imediato. A melhor maneira de conseguir uma visualização consistente das estatísticas é consultar a entidade GlobalStat com o timestamp mais recente e usar esse carimbo de data/hora como um filtro ao buscar outras entidades estatísticas.

As entidades de estatística são incluídas nos valores de estatística calculados. Elas ocupam um espaço relativo ao número de tipos únicos e nomes de propriedades usados pelo aplicativo.

O sistema de estatísticas também criará estatísticas específicas para cada namespace. Se um aplicativo não usar namespaces do Cloud Datastore, as estatísticas específicas do namespace não serão criadas. Essas estatísticas específicas de namespace são encontradas no namespace específico. Os nomes de tipo das estatísticas específicas do namespace recebem o prefixo __Stat_Ns_ e têm o mesmo sufixo correspondente aos tipos de estatísticas do aplicativo inteiro.

Aplicativos com milhares de namespaces, tipos ou nomes de propriedade exigem um número muito grande de entidades de estatísticas. Para não sobrecarregar o armazenamento e a atualização das estatísticas, o Cloud Datastore as remove progressivamente, na seguinte ordem:

  • estatísticas por namespace, por tipo e por propriedade: __Stat_Ns_PropertyName_Kind__, __Stat_Ns_PropertyType_PropertyName_Kind__
  • estatísticas por tipo e por propriedade: __Stat_PropertyName_Kind__, __Stat_PropertyType_PropertyName_Kind__
  • estatísticas por namespace e por tipo: __Stat_Ns_Kind__, __Stat_Ns_Kind_IsRootEntity__, __Stat_Ns_Kind_NotRootEntity__, __Stat_Ns_PropertyType_Kind__
  • estatísticas por tipo: __Stat_Kind__, __Stat_Kind_IsRootEntity__, __Stat_Kind_NotRootEntity__, __Stat_PropertyType_Kind__
  • estatísticas por namespace: __Stat_Namespace__, __Stat_Ns_Kind_CompositeIndex__, __Stat_Ns_PropertyType__, __Stat_Ns_Total__

As entidades de estatísticas de resumo (__Stat_Kind_CompositeIndex__, __Stat_PropertyType__, __Stat_Total__) jamais são removidas.

Veja abaixo a lista completa de estatísticas disponíveis:

Estatística Tipo de entidade de estatística Descrição
todas as entidades __Stat_Total__
Classe do Python: GlobalStat
Entrada específica do namespace:
__Stat_Ns_Total__
Classe do Python: NamespaceGlobalStat
Todas as entidades. Propriedades adicionais:

entity_bytes: o armazenamento na tabela de entidades medido em bytes
builtin_index_bytes: o armazenamento nas entradas do índice integrado medido em bytes
builtin_index_count: a contagem de entradas do índice integrado
composite_index_bytes: o armazenamento nas entradas do índice composto medido em bytes
composite_index_count: a contagem de entradas do índice composto
todas as entidades em um namespace __Stat_Namespace__
Classe do Python: NamespaceStat
As entidades __Stat_Namespace__ são criadas para cada namespace encontrado e são encontradas apenas no namespace de string vazia.
Todas as entidades em um namespace.

subject_namespace: o namespace representado (uma string)
entity_bytes: o armazenamento na tabela de entidades medido em bytes
builtin_index_bytes: o armazenamento nas entradas do índice integrado medido em bytes
builtin_index_count: a contagem de entradas do índice integrado
composite_index_bytes: o armazenamento nas entradas do índice composto medido em bytes
composite_index_count: a contagem de entradas do índice composto
todas as entradas em índices definidos pelo aplicativo __Stat_Kind_CompositeIndex__
Entrada específica do namespace: __Stat_Ns_Kind_CompositeIndex__

Classe do Python: KindStat
Entradas na tabela do índice composto, uma entidade de estatística para cada tipo de entidade armazenada. Propriedades adicionais:

index_id: o código do índice
kind_name: o nome do tipo representado (uma string)
entidades de um tipo __Stat_Kind__
Classe do Python: KindStat
Entrada específica do namespace:
__Stat_Ns_Kind__
Classe do Python: NamespaceKindStat
As entidades de um tipo, uma entidade de estatística para cada tipo de entidade armazenado. Propriedades adicionais:

kind_name: o nome do tipo representado (uma string)
entity_bytes: o armazenamento na tabela de entidades medido em bytes
builtin_index_bytes: o armazenamento nas entradas do índice integrado medido em bytes
builtin_index_count: a contagem de entradas do índice integrado
composite_index_bytes: o armazenamento nas entradas do índice composto medido em bytes
composite_index_count: a contagem de entradas do índice composto
entidades raiz de um tipo __Stat_Kind_IsRootEntity__
Classe do Python: KindRootEntityStat
Entrada específica do namespace:
__Stat_Ns_Kind_IsRootEntity__
Classe do Python: NamespaceKindRootEntityStat
Entidades de um tipo que são entidades raiz de um grupo de entidades (sem pai ancestral), uma entidade de estatística para cada tipo de entidade armazenado. Propriedades adicionais:

kind_name: o nome do tipo representado (uma string)
entity_bytes: o armazenamento na tabela de entidades medido em bytes
entidades não raiz de um tipo __Stat_Kind_NotRootEntity__
Classe do Python: KindNotRootEntityStat
Entrada específica do namespace:
__Stat_Ns_Kind_NotRootEntity__
Classe do Python: NamespaceKindNotRootEntityStat
Entidades de um tipo que não são entidades raiz do grupo de entidades (com pai ancestral), uma entidade de estatística para cada tipo de entidade armazenado. Propriedades adicionais:

kind_name: o nome do tipo representado (uma string)
entity_bytes: o armazenamento na tabela de entidades medido em bytes
propriedades de um tipo __Stat_PropertyType__
Classe do Python: PropertyTypeStat
Entrada específica do namespace:
__Stat_Ns_PropertyType__
Classe do Python: NamespacePropertyTypeStat
Propriedades de um tipo de valor em todas as entidades, uma entidade de estatística por tipo de valor. Propriedades adicionais:

property_type: o nome do tipo de valor (uma string)
entity_bytes: o armazenamento na tabela de entidades medido em bytes
builtin_index_bytes: o armazenamento nas entradas do índice integrado medido em bytes
builtin_index_count: a contagem de entradas do índice integrado
propriedades de um tipo por tipo __Stat_PropertyType_Kind__
Classe do Python: KindPropertyTypeStat
Entrada específica do namespace:
__Stat_Ns_PropertyType_Kind__
Classe do Python: NamespaceKindPropertyTypeStat
Propriedades de um tipo de valor nas entidades de determinado tipo, uma entidade de estatística por combinação de tipo de propriedade e tipo. Propriedades adicionais:

property_type: o nome do tipo de valor (uma string)
kind_name: o nome do tipo representado (uma string)
entity_bytes: o armazenamento na tabela de entidades medido em bytes
builtin_index_bytes: o armazenamento no índice integrado medido em bytes
builtin_index_count: a contagem de entradas do índice integrado
propriedades com um nome __Stat_PropertyName_Kind__
Classe do Python: KindPropertyNameStat
Entrada específica do namespace:
__Stat_Ns_PropertyName_Kind__
Classe do Python: NamespaceKindPropertyNameStat
Propriedades com determinado nome nas entidades de determinado tipo, uma entidade de estatística por combinação de nome de propriedade exclusivo e tipo. Propriedades adicionais:

property_name: o nome da propriedade (uma string)
kind_name: o nome do tipo representado (uma string)
entity_bytes: o armazenamento na tabela de entidades medido em bytes
builtin_index_bytes: o armazenamento nas entradas do índice integrado medido em bytes
builtin_index_count: a contagem de entradas do índice integrado
propriedades de um tipo e com um nome __Stat_PropertyType_PropertyName_Kind__
Classe do Python: KindPropertyNamePropertyTypeStat
Entrada específica do namespace:
__Stat_Ns_PropertyType_PropertyName_Kind__
Classe do Python: NamespaceKindPropertyNamePropertyTypeStat
Propriedades com um determinado nome e de um tipo de valor determinado nas entidades de determinado tipo, uma entidade de estatística por combinação de nome de propriedade, tipo de valor e tipo existente no Cloud Datastore. Propriedades adicionais:

property_type: o nome do tipo de valor (uma string)
property_name: o nome da propriedade (uma string)
kind_name: o nome do tipo representado (uma string)
entity_bytes: o armazenamento na tabela de entidades medido em bytes
builtin_index_bytes: o armazenamento nas entradas do índice integrado medido em bytes
builtin_index_count: a contagem de entradas do índice integrado

Algumas estatísticas se referem a tipos de valor de propriedade do Cloud Datastore por nome, como strings. Esses nomes são:

  • "Blob"
  • "BlobKey"
  • "Boolean"
  • "Category"
  • "Date/Time"
  • "Email"
  • "Float"
  • "GeoPt"
  • "IM"
  • "Integer"
  • "Key"
  • "Link"
  • "NULL"
  • "PhoneNumber"
  • "PostalAddress"
  • "Rating"
  • "ShortBlob"
  • "String"
  • "Text"
  • "User"
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…

Ambiente padrão do App Engine para Python 2