Existem ferramentas e APIs para facilitar a administração dos dados armazenados de uma aplicação.
Google Cloud consola
Quando usar o Google Cloud console, lembre-se de que o NDB é implementado por meio do Datastore e da cache de memória. Quando o NDB "lê" um valor, verifica primeiro a memcache. Só lê a partir do Datastore se não encontrar o valor na memcache.
Assim, se usar a consola Google Cloud para editar uma entidade no Datastore, a aplicação pode continuar a usar o valor "antigo" se esse valor estiver na cache de memória. Pode contornar este problema limpando a cache de memória. No entanto, isto é bastante disruptivo. Se precisar de ajustar os valores "manualmente" com frequência, é recomendável configurar uma IU para tal na sua aplicação que escreva valores através da biblioteca de cliente NDB. A escrita através do NDB mantém o Datastore e o memcache sincronizados.
Consultas de metadados
O NDB suporta uma API de consulta de metadados. Isto permite que uma aplicação obtenha algumas informações gerais sobre a respetiva utilização do Datastore. Esta API está no módulo google.appengine.ext.ndb.metadata
. Tem funções:
get_namespaces(start=None, end=None)
: devolver uma lista de nomes de espaços de nomesget_kinds(start=None, end=None)
: devolve uma lista de nomes de tiposget_properties_of_kind(kind, start=None, end=None)
: devolve uma lista de nomes de propriedades para o nome do tipo fornecidoget_representations_of_kind(kind, start=None, end=None)
: devolve um dict que mapeia os nomes das propriedades para o nome do tipo fornecido para listas de nomes de representação, como "STRING", "BOOLEAN" ou "INT64".
Estas funções têm argumentos start e end opcionais que podem ser usados para restringir a consulta a um determinado intervalo. Aqui, start é inclusivo e end é exclusivo. Ambos têm como predefinição None
. Por exemplo, para obter todos os espaços de nomes que começam
com uma letra minúscula, pode chamar get_namespaces('a', chr(ord('z') + 1))
.
Todas estas, exceto get_namespaces()
, estão implicitamente restritas ao espaço de nomes atual. As consultas e as obtenções de metadados são faturadas da mesma forma que as
consultas e as obtenções do Datastore.
Consultas de estatísticas
O Datastore mantém estatísticas sobre os dados armazenados para uma aplicação, como o número de entidades de um determinado tipo ou o espaço usado pelos valores das propriedades de um determinado tipo. Pode ver estas estatísticas na Google Cloud consola, na página Painel de controlo.
Também pode aceder a estes valores de forma programática na aplicação consultando entidades com nomes especiais através da API Datastore.
Cada estatística é acessível como uma entidade cujo nome do tipo começa e termina com dois carateres de sublinhado. Por exemplo, cada app tem exatamente uma entidade do tipo
__Stat_Total__
que representa estatísticas sobre todas as entidades no
Datastore no total. Cada entidade de estatísticas 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 esta estatística (um número inteiro longo)timestamp
, a hora da atualização mais recente da estatística (um valor de data/hora)
Alguns tipos de estatísticas também têm propriedades adicionais, indicadas abaixo.
Uma aplicação pode usar classes de modelos fornecidas pelo pacote google.appengine.ext.ndb.stats
para aceder a entidades de 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
Quando o sistema de estatísticas cria novas entidades estatísticas, não elimina
as antigas de imediato. A melhor forma de obter uma vista consistente das estatísticas é consultar a entidade com a data/hora mais recente, e, em seguida, usar esse valor de data/hora como filtro ao obter outras entidades de estatísticas.GlobalStat
timestamp
As entidades de estatísticas estão incluídas nos valores de estatísticas calculados. As entidades de estatísticas ocupam espaço relativamente ao número de tipos únicos e nomes de propriedades usados pela aplicação.
O sistema de estatísticas também cria estatísticas específicas para cada
namespace
Tenha em atenção que, se uma aplicação não usar namespaces do Datastore,
não são criadas estatísticas específicas do namespace. As estatísticas específicas do espaço de nomes
encontram-se no espaço de nomes ao qual são específicas. Os nomes dos tipos para estatísticas específicas do espaço de nomes têm o prefixo __Stat_Ns_
e o mesmo sufixo correspondente que os tipos de estatísticas ao nível da aplicação.
As aplicações com milhares de espaços de nomes, tipos ou nomes de propriedades requerem um número muito elevado de entidades de estatísticas. Para manter a sobrecarga do armazenamento e da atualização das estatísticas razoável, o Datastore elimina progressivamente as entidades de estatísticas, pela seguinte ordem:
- Estatísticas por espaço de nomes, 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 espaço de nomes 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__
e__Stat_PropertyType_Kind__
- Estatísticas por espaço de nomes:
__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 ignoradas.
Segue-se a lista completa de estatísticas disponíveis:
Estatística | Tipo de entidade de estatísticas | Descrição |
---|---|---|
todas as entidades | __Stat_Total__ Classe Python: GlobalStat Entrada específica do espaço de nomes: __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 incorporadas medido em bytes.• builtin_index_count : a contagem de entradas de índice incorporadas.• 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 num espaço de nomes | __Stat_Namespace__ Classe Python: NamespaceStat tenha em atenção que as entidades __Stat_Namespace__ são criadas para cada espaço de nomes encontrado e só são encontradas no espaço de nomes de string vazio. |
Todas as entidades num espaço de nomes. • subject_namespace , o espaço de nomes representado (uma string)• entity_bytes : o armazenamento na tabela de entidades medido em bytes.• builtin_index_bytes : o armazenamento em entradas de índice incorporadas medido em bytes.• builtin_index_count : a contagem de entradas de índice incorporadas.• 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 nos índices definidos pela aplicação | __Stat_Kind_CompositeIndex__ Entrada específica do espaço de nomes: __Stat_Ns_Kind_CompositeIndex__ classe Python: KindStat |
Entradas na tabela de índice composto; uma entidade de estatísticas para cada tipo de entidade armazenada. Propriedades adicionais: • index_id , o ID do índice.• kind_name , o nome do tipo representado (uma string) |
entidades de um tipo | __Stat_Kind__ Classe Python: KindStat Entrada específica do espaço de nomes: __Stat_Ns_Kind__ Classe Python: NamespaceKindStat |
Entidades de um tipo; uma entidade de estatísticas para cada tipo de entidade armazenada. 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 incorporadas medido em bytes.• builtin_index_count : a contagem de entradas de índice incorporadas.• composite_index_bytes : o armazenamento em entradas de índice composto medido em bytes.• composite_index_count : a contagem de entradas de índice composto. |
entidades de raiz de um tipo | __Stat_Kind_IsRootEntity__ Classe Python: KindRootEntityStat Entrada específica do espaço de nomes: __Stat_Ns_Kind_IsRootEntity__ Classe Python: NamespaceKindRootEntityStat |
Entidades de um tipo que são entidades raiz do grupo de entidades (não têm um elemento principal antecessor); uma entidade de estatísticas para cada tipo de entidade armazenada. 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 principais de um tipo | __Stat_Kind_NotRootEntity__ Classe Python: KindNotRootEntityStat Entrada específica do espaço de nomes: __Stat_Ns_Kind_NotRootEntity__ Classe Python: NamespaceKindNotRootEntityStat |
Entidades de um tipo que não são entidades raiz do grupo de entidades (têm um elemento superior antecessor); uma entidade de estatísticas para cada tipo de entidade armazenada. 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 espaço de nomes: __Stat_Ns_PropertyType__ Classe Python: NamespacePropertyTypeStat |
Propriedades de um tipo de valor em todas as entidades; uma entidade de estatísticas 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 incorporadas medido em bytes.• builtin_index_count : a contagem de entradas de índice incorporadas. |
propriedades de um tipo por género | __Stat_PropertyType_Kind__ Classe Python: KindPropertyTypeStat Entrada específica do espaço de nomes: __Stat_Ns_PropertyType_Kind__ Classe Python: NamespaceKindPropertyTypeStat |
Propriedades de um tipo de valor em entidades de um determinado tipo; uma entidade de estatísticas 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 incorporadas. |
propriedades com um nome | __Stat_PropertyName_Kind__ Classe Python: KindPropertyNameStat Entrada específica do espaço de nomes: __Stat_Ns_PropertyName_Kind__ Classe Python: NamespaceKindPropertyNameStat |
Propriedades com um determinado nome em todas as entidades de um determinado tipo; uma entidade de estatísticas por combinação de nome de propriedade e tipo exclusivos. 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 incorporadas medido em bytes.• builtin_index_count : a contagem de entradas de índice incorporadas. |
propriedades de um tipo e com um nome | __Stat_PropertyType_PropertyName_Kind__ Classe Python: KindPropertyNamePropertyTypeStat Entrada específica do espaço de nomes: __Stat_Ns_PropertyType_PropertyName_Kind__ Classe Python: NamespaceKindPropertyNamePropertyTypeStat |
Propriedades com um determinado nome e de um determinado tipo de valor em entidades de um determinado tipo; uma entidade de estatísticas por combinação de nome da propriedade, tipo de valor e tipo que existe 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 incorporadas medido em bytes.• builtin_index_count : a contagem de entradas de índice incorporadas. |
Algumas estatísticas referem-se aos tipos de valores de propriedades do Datastore pelo nome, como strings. Estes nomes são os seguintes:
"Blob"
"BlobKey"
"Boolean"
"Category"
"Date/Time"
"Email"
"Float"
"GeoPt"
"IM"
"Integer"
"Key"
"Link"
"NULL"
"PhoneNumber"
"PostalAddress"
"Rating"
"ShortBlob"
"String"
"Text"
"User"