Há ferramentas e APIs para facilitar a administração dos dados armazenados de um aplicativo.
Console do Google Cloud
Ao usar o console do Google Cloud, lembre-se de que o NDB é implementado por meio do Datastore e do Memcache. Quando o NDB "lê" um valor, ele verifica primeiro o memcache. Ele só lê do Datastore se não encontrar o valor no memcache.
Portanto, se você usar o console do Google Cloud para editar uma entidade no Datastore, o aplicativo ainda poderá usar o valor "antigo" se esse valor estiver no Memcache. Convém contornar isso limpando o Memcache. No entanto, isso é disruptivo. Se você precisar ajustar os valores manualmente com frequência, convém configurar uma IU para isso no aplicativo que grava valores por meio da biblioteca de cliente do NDB. Escrever via NDB mantém o Datastore e o Memcache em sincronia.
Consultas de metadados
O NDB é compatível com uma API de consulta de metadados. Isso permite que um aplicativo consiga algumas informações gerais sobre o uso do 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 namespaceget_kinds(start=None, end=None)
: retorna uma lista de nomes de tipoget_properties_of_kind(kind, start=None, end=None)
: retorna uma lista de nomes de propriedades para o nome do tipo fornecidoget_representations_of_kind(kind, start=None, end=None)
: retorna os nomes de propriedade de mapeamento de dict para o nome de tipo fornecido para 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. O padrão é None
. Por exemplo, para receber todos os namespaces começando com uma letra minúscula, chame get_namespaces('a', chr(ord('z') + 1))
.
Todos esses, exceto get_namespaces()
, estão implicitamente restritos ao namespace atual. Consultas e gets de metadados são faturados da mesma maneira que consultas e gets do armazenamento de dados.
Consultas estatísticas
O Datastore mantém as estatísticas dos dados armazenados de um aplicativo, como o número de determinados tipos de entidades existentes ou o espaço usado por determinados tipos de valores de propriedade. É possível ver essas estatísticas no console do Google Cloud, na página Painel.
Esses valores também podem ser acessados de modo programático no aplicativo por meio de consulta de entidades especialmente nomeadas usando a API Datastore.
Cada estatística é acessível como uma entidade com um sublinhado no início e outro no final do nome do tipo. Por exemplo, cada aplicativo tem exatamente uma entidade do tipo __Stat_Total__
que representa estatísticas sobre todas as entidades no Datastore no total. Cada entidade de estatística tem as seguintes propriedades:
count
, o número de itens considerados pela estatística (um número inteiro longo)bytes
, o tamanho total dos itens para essa estatística (um número inteiro longo)timestamp
, a hora da atualização mais recente na estatística (um valor de data e 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 obter uma visão consistente das estatísticas é consultar a entidade GlobalStat
com o timestamp
mais recente e usar o valor do carimbo de data/hora como um filtro ao obter outras entidades de estatística.
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 Datastore, as estatísticas específicas de 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 Datastore descarta as entidades estatísticas 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__
) nunca são descartadas.
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 Python: GlobalStat Entrada específica do namespace: __Stat_Ns_Total__ Classe Python: NamespaceGlobalStat |
Todas as entidades. Propriedades adicionais: • entity_bytes : o armazenamento na tabela de entidades medido em bytes.• builtin_index_bytes : o armazenamento em entradas de índice integrado medido em bytes.• builtin_index_count : a contagem de entradas de índice integrado.• composite_index_bytes : o armazenamento em entradas de índice composto medido em bytes.• composite_index_count : a contagem de entradas de índice composto. |
todas as entidades em um namespace | __Stat_Namespace__ Classe Python: NamespaceStat As entidades __Stat_Namespace__ são criadas para cada namespace encontrado e só são encontradas no namespace da string vazia. |
Todas as entidades de 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 em entradas de índice integrado medido em bytes.• builtin_index_count : a contagem de entradas de índice integrado.• composite_index_bytes : o armazenamento em entradas de índice composto medido em bytes.• composite_index_count : a contagem de entradas de índice composto. |
todas as entradas em índices definidos pelo aplicativo | __Stat_Kind_CompositeIndex__ Entrada específica do namespace: __Stat_Ns_Kind_CompositeIndex__ Classe 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 Python: KindStat Entrada específica do namespace: __Stat_Ns_Kind__ Classe 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 em entradas de índice integrado medido em bytes.• builtin_index_count : a contagem de entradas de índice integrado.• composite_index_bytes : o armazenamento em entradas de índice composto medido em bytes.• composite_index_count : a contagem de entradas de índice composto. |
entidades raiz de um tipo | __Stat_Kind_IsRootEntity__ Classe Python: KindRootEntityStat Entrada específica do namespace: __Stat_Ns_Kind_IsRootEntity__ Classe 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 Python: KindNotRootEntityStat Entrada específica do namespace: __Stat_Ns_Kind_NotRootEntity__ Classe 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 Python: PropertyTypeStat Entrada específica do namespace: __Stat_Ns_PropertyType__ Classe 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 em entradas de índice integrado medido em bytes.• builtin_index_count : a contagem de entradas de índice integrado. |
propriedades de um tipo por tipo | __Stat_PropertyType_Kind__ Classe Python: KindPropertyTypeStat Entrada específica do namespace: __Stat_Ns_PropertyType_Kind__ Classe 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 de índice integrado. |
propriedades com um nome | __Stat_PropertyName_Kind__ Classe Python: KindPropertyNameStat Entrada específica do namespace: __Stat_Ns_PropertyName_Kind__ Classe 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 em entradas de índice integrado medido em bytes.• builtin_index_count : a contagem de entradas de índice integrado. |
propriedades de um tipo e com um nome | __Stat_PropertyType_PropertyName_Kind__ Classe Python: KindPropertyNamePropertyTypeStat Entrada específica do namespace: __Stat_Ns_PropertyType_PropertyName_Kind__ Classe 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 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 em entradas de índice integrado medido em bytes.• builtin_index_count : a contagem de entradas de índice integrado. |
Algumas estatísticas se referem aos tipos de valor de propriedade do Datastore pelo nome, como strings. Veja estes nomes:
"Blob"
"BlobKey"
"Boolean"
"Category"
"Date/Time"
"Email"
"Float"
"GeoPt"
"IM"
"Integer"
"Key"
"Link"
"NULL"
"PhoneNumber"
"PostalAddress"
"Rating"
"ShortBlob"
"String"
"Text"
"User"