Existen distintas API y herramientas que facilitan la administración de los datos almacenados de una aplicación.
Consola de Google Cloud
Cuando uses la consola de Google Cloud, recuerda que se implementa NDB por medio de Datastore y Memcache. Cuando NDB “lee” un valor, primero lo verifica en Memcache. Solo lo lee desde Datastore si no lo encuentra allí.
Por eso, si usas la consola de Google Cloud para editar una entidad en Datastore, la aplicación aún podrá usar el valor “antiguo” si este se encuentra en Memcache. Puedes evitar esto si borras Memcache definitivamente. Sin embargo, esto es más bien disruptivo. Si a menudo necesitas ajustar valores “a mano”, quizá debas configurar una IU en la aplicación para ello que escriba valores a través de la biblioteca cliente NDB, ya que esto mantiene a Datastore y a Memcache sincronizados.
Consultas de metadatos
NDB es compatible con una API de consulta de metadatos. Esto permite que una aplicación obtenga información general sobre el uso de Datastore. Esta API está en el módulo google.appengine.ext.ndb.metadata
. Tiene las funciones siguientes:
get_namespaces(start=None, end=None)
: Muestra una lista de nombres de espacio de nombresget_kinds(start=None, end=None)
: Muestra una lista de nombres de categoríasget_properties_of_kind(kind, start=None, end=None)
: Muestra una lista de nombres de propiedades del nombre de categoría que se especificó.get_representations_of_kind(kind, start=None, end=None)
: Muestra un dict que mapea nombres de propiedad para el nombre de categoría que se especificó con las listas de nombres de representación, como “STRING”, “BOOLEAN” o “INT64”.
Estas funciones tienen argumentos opcionales de start y end que pueden usarse para restringir el rango de la consulta. Aquí, start es inclusivo, y end es exclusivo. La configuración predeterminada de ambos es None
. Por ejemplo, para obtener todos los espacios de nombres que comienzan con minúscula, puedes llamar a get_namespaces('a', chr(ord('z') + 1))
.
Todos estos, excepto get_namespaces()
, están restringidos de forma implícita al espacio de nombres actual. La consulta y la obtención de metadatos se facturan de la misma forma que las de Datastore.
Consultas de estadísticas
Datastore conserva estadísticas sobre los datos almacenados para una aplicación, como cuántas entidades hay de una categoría determinada o cuánto espacio usan los valores de propiedad de un tipo determinado. Puedes ver estas estadísticas en la página Panel de la consola de Google Cloud.
También puedes acceder a estos valores de manera programática en la aplicación mediante la consulta de entidades de nombres especiales con la API de Datastore.
Se accede a cada estadística como una entidad cuyo nombre de categoría comienza y termina con dos guiones bajos. Por ejemplo, cada app tiene solo una entidad de categoría __Stat_Total__
que representa las estadísticas de todas las entidades en Datastore. Cada entidad estadística tiene las siguientes propiedades:
count
: El número de elementos que considera la estadística (un número entero largo)bytes
: El tamaño total de los elementos para esta estadística (un número entero largo)timestamp
: La hora de la actualización más reciente de la estadística (un valor de fecha y hora)
Algunas categorías de estadísticas también tienen propiedades adicionales, que se mencionan a continuación.
Una aplicación puede usar las clases modelo que se proporcionan en el paquete google.appengine.ext.ndb.stats
para acceder a entidades estadí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
Cuando el sistema de estadísticas crea entidades de estadísticas nuevas, no se borran las anteriores de inmediato. La mejor manera de obtener una vista coherente de las estadísticas es realizar una consulta sobre la entidad GlobalStat
con la timestamp
más reciente y, luego, usar ese valor de marca de tiempo como filtro para recuperar otras entidades de estadísticas.
Las entidades de estadísticas se incluyen en los valores estadísticos calculados. Las entidades de estadísticas ocupan un espacio según la cantidad de nombres de propiedades y categorías únicos que usa la aplicación.
El sistema de estadísticas también creará estadísticas específicas para cada espacio de nombres. Ten en cuenta que si una aplicación no usa espacios de nombres de Datastore, esas estadísticas específicas no se crearán. Estas estadísticas se encuentran en el espacio de nombres al que corresponden. Los nombres de categoría de las estadísticas específicas de espacio de nombres tienen el prefijo __Stat_Ns_
y tienen el mismo sufijo correspondiente que las categorías de estadísticas de toda la aplicación.
Las aplicaciones con miles de espacios de nombres, categorías o nombres de propiedades necesitan una gran cantidad de entidades de estadísticas. Para mantener la sobrecarga de almacenamiento y actualización de las estadísticas en un nivel razonable, Datastore quita entidades estadísticas de manera progresiva en el siguiente orden:
- estadísticas por espacio de nombres, por categoría y por propiedad:
__Stat_Ns_PropertyName_Kind__
,__Stat_Ns_PropertyType_PropertyName_Kind__
- estadísticas por categoría y por propiedad:
__Stat_PropertyName_Kind__
,__Stat_PropertyType_PropertyName_Kind__
- estadísticas por espacio de nombres y por categoría:
__Stat_Ns_Kind__
,__Stat_Ns_Kind_IsRootEntity__
,__Stat_Ns_Kind_NotRootEntity__
,__Stat_Ns_PropertyType_Kind__
- estadísticas por categoría:
__Stat_Kind__
,__Stat_Kind_IsRootEntity__
,__Stat_Kind_NotRootEntity__
,__Stat_PropertyType_Kind__
- estadísticas por espacio de nombres:
__Stat_Namespace__
,__Stat_Ns_Kind_CompositeIndex__
,__Stat_Ns_PropertyType__
,__Stat_Ns_Total__
Las entidades de estadísticas de resumen (__Stat_Kind_CompositeIndex__
, __Stat_PropertyType__
, __Stat_Total__
) nunca se descartan.
Estas son todas las estadísticas disponibles:
Estadística | Categoría de la entidad de estadística | Descripción |
---|---|---|
Todas las entidades | __Stat_Total__ Clase de Python: GlobalStat Entrada específica del espacio de nombres: __Stat_Ns_Total__ Clase de Python: NamespaceGlobalStat |
Todas las entidades. Propiedades adicionales: • entity_bytes : El almacenamiento en la tabla de entidades medido en bytes builtin_index_bytes : El almacenamiento en entradas de índice integrado medido en bytes • builtin_index_count : El recuento de entradas de índice integrado • composite_index_bytes : El almacenamiento en entradas de índice compuesto medido en bytes • composite_index_count : El recuento de entradas de índice compuesto |
Todas las entidades en un espacio de nombres | __Stat_Namespace__ Clase de Python: NamespaceStat Ten en cuenta que las entidades __Stat_Namespace__ se crean para cada espacio de nombres encontrado y solo se ubican en el espacio de nombres de string vacía. |
Todas las entidades de un espacio de nombres. • subject_namespace : El espacio de nombres representado (una string) • entity_bytes : El almacenamiento en la tabla de entidades medido en bytes • builtin_index_bytes : El almacenamiento en entradas de índice integrado medido en bytes • builtin_index_count : El recuento de entradas de índice integrado • composite_index_bytes : El almacenamiento en entradas de índice compuesto medido en bytes • composite_index_count : El recuento de entradas de índice compuesto |
Todas las entradas en índices definidos de la aplicación | __Stat_Kind_CompositeIndex__ Entrada específica del espacio de nombres: __Stat_Ns_Kind_CompositeIndex__ Clase de Python: KindStat |
Entradas en la tabla de índice compuesto; una entidad estadística por cada categoría de entidad almacenada. Propiedades adicionales: • index_id : El ID del índice • kind_name : El nombre de la categoría representada (una string) |
Entidades de una categoría | __Stat_Kind__ Clase de Python: KindStat Entrada específica del espacio de nombres: __Stat_Ns_Kind__ Clase de Python: NamespaceKindStat |
Entidades de una categoría; una entidad estadística por cada categoría de entidad almacenada. Propiedades adicionales: • kind_name : El nombre de la categoría representada (una string)• entity_bytes : el almacenamiento en la tabla de entidades medido en bytes • builtin_index_bytes : El almacenamiento en entradas de índice integrado medido en bytes • builtin_index_count : El recuento de entradas de índice integrado • composite_index_bytes : El almacenamiento en entradas de índice compuesto medido en bytes • composite_index_count : El recuento de entradas de índice compuesto |
Entidades raíz de una categoría | __Stat_Kind_IsRootEntity__ Clase de Python: KindRootEntityStat Entrada específica del espacio de nombres: __Stat_Ns_Kind_IsRootEntity__ Clase de Python: NamespaceKindRootEntityStat |
Entidades de una categoría que son entidades raíz de un grupo de entidades (no tienen una superior principal); una entidad estadística por cada categoría de entidad almacenada. Propiedades adicionales: • kind_name : El nombre de la categoría representada (una string) • entity_bytes : El almacenamiento en la tabla de entidades medido en bytes |
Entidades que no son raíz de una categoría | __Stat_Kind_NotRootEntity__ Clase de Python: KindNotRootEntityStat Entrada específica del espacio de nombres: __Stat_Ns_Kind_NotRootEntity__ Clase de Python: NamespaceKindNotRootEntityStat |
Entidades de una categoría que no son entidades raíz de un grupo de entidades (tienen una superior principal); una entidad estadística por cada categoría de entidad almacenada. Propiedades adicionales: • kind_name : El nombre de la categoría representada (una string) • entity_bytes : El almacenamiento en la tabla de entidades medido en bytes |
Propiedades de un tipo | __Stat_PropertyType__ Clase de Python: PropertyTypeStat Entrada específica del espacio de nombres: __Stat_Ns_PropertyType__ Clase de Python: NamespacePropertyTypeStat |
Propiedades de un tipo de valor en todas las entidades; una entidad estadística por tipo de valor. Propiedades adicionales: • property_type : El nombre del tipo de valor (una string)• entity_bytes : El almacenamiento en la tabla de entidades medido en bytes • builtin_index_bytes : El almacenamiento en entradas de índice integrado medido en bytes • builtin_index_count : El recuento de entradas de índice integrado |
Propiedades de un tipo por categoría | __Stat_PropertyType_Kind__ Clase de Python: KindPropertyTypeStat Entrada específica del espacio de nombres: __Stat_Ns_PropertyType_Kind__ Clase de Python: NamespaceKindPropertyTypeStat |
Propiedades de un tipo de valor en las entidades de una categoría específica; una entidad estadística por combinación de tipo y categoría de propiedad. Propiedades adicionales: • property_type : El nombre del tipo de valor (una string) • kind_name : El nombre de la categoría representada (una string) • entity_bytes : El almacenamiento en la tabla de entidades medido en bytes • builtin_index_bytes : El almacenamiento en el índice integrado medido en bytes.• builtin_index_count : El recuento de entradas de índice integrado |
Propiedades con nombre | __Stat_PropertyName_Kind__ Clase de Python: KindPropertyNameStat Entrada específica del espacio de nombres: __Stat_Ns_PropertyName_Kind__ Clase de Python: NamespaceKindPropertyNameStat |
Propiedades con un nombre determinado en todas las entidades de una categoría específica; una entidad estadística por combinación de nombre y categoría de propiedad única. Propiedades adicionales: • property_name : El nombre de la propiedad (una string)• kind_name : El nombre de la categoría representada (una string)• entity_bytes : El almacenamiento en la tabla de entidades medido en bytes • builtin_index_bytes : El almacenamiento en entradas de índice integrado medido en bytes • builtin_index_count : El recuento de entradas de índice integrado |
Propiedades de un tipo y con un nombre | __Stat_PropertyType_PropertyName_Kind__ Clase de Python: KindPropertyNamePropertyTypeStat Entrada específica del espacio de nombres: __Stat_Ns_PropertyType_PropertyName_Kind__ Clase de Python: NamespaceKindPropertyNamePropertyTypeStat |
Propiedades con un nombre determinado y de un tipo de valor determinado en entidades de una categoría determinada; una entidad estadística por combinación de nombre de propiedad, tipo de valor y categoría que existe en Datastore. Propiedades adicionales: • property_type : El nombre del tipo de valor (una string)• property_name : El nombre de la propiedad (una string)• kind_name : El nombre de la categoría representada (una string)• entity_bytes : El almacenamiento en la tabla de entidades medido en bytes• builtin_index_bytes : El almacenamiento en entradas de índice integrado medido en bytes • builtin_index_count : El recuento de entradas de índice integrado |
Algunas estadísticas se refieren a los tipos de valores de propiedad de Datastore por nombre, como strings. Los nombres son los siguientes:
"Blob"
"BlobKey"
"Boolean"
"Category"
"Date/Time"
"Email"
"Float"
"GeoPt"
"IM"
"Integer"
"Key"
"Link"
"NULL"
"PhoneNumber"
"PostalAddress"
"Rating"
"ShortBlob"
"String"
"Text"
"User"