Administración de NDB

Hay herramientas y APIs que facilitan la administración de los datos almacenados de una aplicación.

Google Cloud consola

Cuando uses la Google Cloud console, recuerda que NDB se implementa mediante Datastore y memcache. Cuando NDB "lee" un valor, primero comprueba la caché de memoria. Solo lee de Datastore si no encuentra el valor en la caché de memoria.

Por lo tanto, si usas la consola de Google Cloud para editar una entidad en Datastore, es posible que la aplicación siga usando el valor "antiguo" si ese valor está en memcache. Puedes solucionar este problema purgando la caché de memoria. Sin embargo, esto es bastante disruptivo. Si necesitas ajustar los valores "manualmente" a menudo, te recomendamos que configures una interfaz de usuario en tu aplicación que escriba los valores a través de la biblioteca de cliente de NDB. Al escribir a través de NDB, Datastore y memcache se mantienen sincronizados.

consultas de metadatos

NDB admite una API de consulta de metadatos. Permite que una aplicación obtenga información general sobre su uso de Datastore. Esta API se encuentra en el módulo google.appengine.ext.ndb.metadata. Tiene las siguientes funciones:

  • get_namespaces(start=None, end=None): devuelve una lista de nombres de espacios de nombres
  • get_kinds(start=None, end=None): devuelve una lista de nombres de tipos.
  • get_properties_of_kind(kind, start=None, end=None): devuelve una lista de nombres de propiedades para el nombre de tipo proporcionado.
  • get_representations_of_kind(kind, start=None, end=None): devuelve un diccionario que asigna nombres de propiedades del nombre de tipo proporcionado a listas de nombres de representación, como "STRING", "BOOLEAN" o "INT64".

Estas funciones tienen argumentos start y end opcionales que se pueden usar para restringir la consulta a un intervalo determinado. En este caso, start se incluye en el intervalo y end no. Ambos tienen el valor predeterminado None. Por ejemplo, para obtener todos los espacios de nombres que empiecen por una letra minúscula, puedes llamar a get_namespaces('a', chr(ord('z') + 1)). Todos estos elementos, excepto get_namespaces(), están restringidos de forma implícita al espacio de nombres actual. Las operaciones de obtención y consulta de metadatos se facturan de la misma forma que las operaciones de obtención y consulta de Datastore.

Consultas de estadísticas

Datastore mantiene estadísticas sobre los datos almacenados de una aplicación, como el número de entidades de un tipo determinado o el espacio que utilizan los valores de propiedad de un tipo determinado. Puedes ver estas estadísticas en la consola, en la página Panel de control. Google Cloud

También puedes acceder a estos valores de forma programática en la aplicación consultando entidades con nombres especiales mediante la API Datastore. Se puede acceder a cada estadística como una entidad cuyo nombre de tipo empieza y termina con dos guiones bajos. Por ejemplo, cada aplicación tiene exactamente una entidad del tipo __Stat_Total__ que representa las estadísticas de todas las entidades de Datastore en total. Cada entidad de estadísticas tiene las siguientes propiedades:

  • count, el número de elementos que tiene en cuenta la estadística (un entero largo)
  • bytes: tamaño total de los elementos de esta estadística (un entero largo).
  • timestamp: hora de la actualización más reciente de la estadística (valor de fecha y hora)

Algunos tipos de estadísticas incluyen también propiedades adicionales, las cuales se enumeran a continuación.

Una aplicación puede usar clases de modelo proporcionadas por 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 nuevas entidades de estadísticas, no elimina las antiguas de inmediato. La mejor forma de obtener una vista coherente de las estadísticas es consultar la entidad GlobalStat con la timestamp más reciente y, a continuación, usar ese valor de marca de tiempo como filtro al obtener otras entidades de estadísticas.

Las entidades con estadísticas se incluyen en los valores de estadísticas que se calculan. Las entidades de estadísticas ocupan espacio en función del número de tipos únicos y nombres de propiedades que utiliza 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, no se crearán estadísticas específicas de espacios de nombres. Las estadísticas específicas de un espacio de nombres se encuentran en el espacio de nombres al que corresponden. Los nombres de los tipos de estadísticas específicas de un espacio de nombres tienen el prefijo __Stat_Ns_ y el mismo sufijo correspondiente que los tipos de estadísticas de toda la aplicación.

Las aplicaciones con miles de espacios de nombres, tipos o nombres de propiedades requieren un número muy elevado de entidades de estadísticas. Para que la sobrecarga de almacenar y actualizar las estadísticas sea razonable, Datastore elimina progresivamente las entidades de estadísticas en el siguiente orden:

  • Estadísticas por espacio de nombres, por tipo y por propiedad: __Stat_Ns_PropertyName_Kind__, __Stat_Ns_PropertyType_PropertyName_Kind__
  • Estadísticas por tipo y por propiedad: __Stat_PropertyName_Kind__, __Stat_PropertyType_PropertyName_Kind__
  • Estadísticas por espacio de nombres y por tipo: __Stat_Ns_Kind__, __Stat_Ns_Kind_IsRootEntity__, __Stat_Ns_Kind_NotRootEntity__, __Stat_Ns_PropertyType_Kind__
  • Estadísticas por tipo: __Stat_Kind__, __Stat_Kind_IsRootEntity__, __Stat_Kind_NotRootEntity__ y __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 eliminan.

A continuación, se incluye la lista completa de estadísticas disponibles:

Estadística Tipo de entidad con 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 integradas, medido en bytes.
builtin_index_count: número de entradas de índice integradas.
composite_index_bytes: el almacenamiento de las entradas de índice compuesto, medido en bytes.
composite_index_count: número de entradas de índices compuestos.
Todas las entidades de un espacio de nombres __Stat_Namespace__
Clase de Python: NamespaceStat
ten en cuenta que se crean entidades __Stat_Namespace__ para cada espacio de nombres encontrado y que solo se encuentran en el espacio de nombres de cadena vacía.
Todas las entidades de un espacio de nombres.

subject_namespace, el espacio de nombres representado (una cadena)
entity_bytes: el almacenamiento en la tabla de entidades medido en bytes.
builtin_index_bytes: el almacenamiento en entradas de índice integradas, medido en bytes.
builtin_index_count: número de entradas de índice integradas.
composite_index_bytes: el almacenamiento de las entradas de índice compuesto, medido en bytes.
composite_index_count: número de entradas de índices compuestos.
Todas las entradas de los índices definidos en la aplicación __Stat_Kind_CompositeIndex__
Entrada específica del espacio de nombres: __Stat_Ns_Kind_CompositeIndex__

Clase de Python: KindStat
Entradas de la tabla de índices compuestos. Una entidad de estadísticas por cada tipo de entidad almacenada. Propiedades adicionales:

index_id, el ID del índice.
kind_name, el nombre del tipo representado (una cadena)
Entidades de un tipo __Stat_Kind__
Clase de Python: KindStat
Entrada específica del espacio de nombres:
__Stat_Ns_Kind__
Clase de Python: NamespaceKindStat
Entidades de un tipo; una entidad con estadísticas para cada tipo de entidad almacenado Propiedades adicionales:

kind_name, el nombre del tipo representado (una cadena)
entity_bytes: el almacenamiento en la tabla de entidades medido en bytes.
builtin_index_bytes: el almacenamiento en entradas de índice integradas, medido en bytes.
builtin_index_count: número de entradas de índice integradas.
composite_index_bytes: el almacenamiento de las entradas de índice compuesto, medido en bytes.
composite_index_count: número de entradas de índices compuestos.
Entidades raíz de un tipo __Stat_Kind_IsRootEntity__
Clase de Python: KindRootEntityStat
Entrada específica del espacio de nombres:
__Stat_Ns_Kind_IsRootEntity__
Clase de Python: NamespaceKindRootEntityStat
Entidades de un tipo que son entidades raíz del grupo de entidades (sin entidad principal de ancestro); una entidad con estadísticas para cada tipo de entidad almacenado Propiedades adicionales:

kind_name, el nombre del tipo representado (una cadena)
entity_bytes: el almacenamiento en la tabla de entidades medido en bytes.
Entidades de un tipo sin raíz __Stat_Kind_NotRootEntity__
Clase de Python: KindNotRootEntityStat
Entrada específica del espacio de nombres:
__Stat_Ns_Kind_NotRootEntity__
Clase de Python: NamespaceKindNotRootEntityStat
Entidades de un tipo que no son entidades raíz del grupo de entidades (con entidad principal de ancestro); una entidad con estadísticas para cada tipo de entidad almacenado Propiedades adicionales:

kind_name, el nombre del tipo representado (una cadena)
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 con estadísticas por tipo de valor Propiedades adicionales:

property_type: el nombre del tipo de valor (una cadena)
entity_bytes: el almacenamiento en la tabla de entidades medido en bytes.
builtin_index_bytes: el almacenamiento en entradas de índice integradas, medido en bytes.
builtin_index_count: el recuento de entradas de índice integradas.
Propiedades de un tipo por tipo __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 entidades del tipo especificado; una entidad con estadísticas por cada combinación de tipo de propiedad y de tipo Propiedades adicionales:

property_type, el nombre del tipo de valor (una cadena)
kind_name, el nombre del tipo representado (una cadena)
entity_bytes: el almacenamiento en la tabla de entidades medido en bytes.
builtin_index_bytes: el almacenamiento del índice integrado, medido en bytes.
builtin_index_count: el recuento de entradas de índice integradas.
Propiedades con un 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 determinado nombre en entidades de un tipo específico; una entidad con estadísticas por combinación de nombre de propiedad y tipo exclusivos Propiedades adicionales:

property_name: nombre de la propiedad (una cadena)
kind_name: nombre del tipo representado (una cadena)
entity_bytes: almacenamiento en la tabla de entidades medido en bytes.
builtin_index_bytes: el almacenamiento en entradas de índice integradas, medido en bytes.
builtin_index_count: el recuento de entradas de índice integradas.
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 y un tipo de valor determinados en todas las entidades de un tipo determinado. Se trata de una entidad de estadísticas por cada combinación de nombre de propiedad, tipo de valor y tipo que exista en Datastore. Propiedades adicionales:

property_type, el nombre del tipo de valor (una cadena)
property_name, el nombre de la propiedad (una cadena)
kind_name, el nombre del tipo representado (una cadena)
entity_bytes: el almacenamiento en la tabla de entidades medido en bytes.
builtin_index_bytes: el almacenamiento en entradas de índice integradas, medido en bytes.
builtin_index_count: el recuento de entradas de índice integradas.

Algunas estadísticas hacen referencia a los tipos de valor de propiedad de Datastore por nombre, como cadenas. Estos son los nombres:

  • "Blob"
  • "BlobKey"
  • "Boolean"
  • "Category"
  • "Date/Time"
  • "Email"
  • "Float"
  • "GeoPt"
  • "IM"
  • "Integer"
  • "Key"
  • "Link"
  • "NULL"
  • "PhoneNumber"
  • "PostalAddress"
  • "Rating"
  • "ShortBlob"
  • "String"
  • "Text"
  • "User"