Em setembro, publicamos o post O Google App Engine, com o objetivo de apresentar essa plataforma do Google e dar uma visão geral de suas funcionalidades. Dando continuidade a esse tema, o post dessa semana objetiva falar sobre as cotas de utilização dessa plataforma de desenvolvimento web. Além disso, vamos expor as restrições impostas pelo App Engine para garantir a segurança e eficiência de sua utilização. Por fim, abordaremos as mudanças ocorridas desde a publicação do post anterior. Para mais detalhes, leia no site do google.
Existe uma ferramenta chamada de Administrator Console, disponibilizada pelo App Engine ao desenvolvedor, que lhe permite realizar operações de administrador na sua aplicação. O Administrator Console é “web based” e é acessado utilizando o login cadastrado pelo desenvolvedor que criou a aplicação, ou que tenha acesso de nível administrativo. Existe no console, muitas estatísticas da utilização das aplicações publicadas. Dados como número de requisições feitas a aplicação (por páginas/links), tamanho e números dos dados (entidades) armazenados no datastore, requisições por segundo, número das instâncias da sua aplicação em funcionamento, dentre outros. Os diagramas a seguir, darão uma impressão de como todas estas informações são visualizadas:
DataStore Viewer: Visualização das entidades armazenadas no datastore mostrando as propriedades.

DataStore Statistics: Visualização da quantidade de entidades armazenadas no datastore e o quanto as propriedades (Texto, String, Data/Time, Metadata, Image etc) destas entidades ocupam de memória.
Admin Log: Informações sobre operações feitas durante a utilização (inserção/remoção de dados, deploys, etc). Por motivo de organização, estes não incluem logs de erros, que ficam disponíveis no painel Logs(main).
Logs(main): Informações detalhadas sobre operações feitas durante a utilização (inserção/remoção de dados, deploys, erros, logs etc). Os logs de erros aparecem com hora, descrição do erro e o “Stack Trace”. Existe a possibilidade de filtrar os logs vistos.
DashBoard: Informações gerais como número de requisição por página, total de dados armazenados, etc
Antes de escrever este post, fiquei pensando em qual seria a melhor maneira de mostrar como as cotas de utilização do App Engine funcionam. Decidi mostrar as tabelas do monitoramento de cotas no Administrator Console pois, na minha opinião, essas tabelas dão uma visão geral mais completa e direta para o entendimento dos parâmetros que devem ser levados em conta, na verificação das cotas de utilização do App Engine .
As seguintes tabelas podem ser visualizadas no Administrator Console através do link, Quota Details:
Obs: Todas as informações presentes nos diagramas anteriores são relativas a uma conta gratuita. Existe um outro nível de conta chamada Premier que oferece cotas mais elevadas, mas são pagas. Para utilizar esse nível, o desenvolvedor monta sua “cota” de acordo com suas necessidades e o preço é definido sob demanda. Para saber mais sobre as cotas clique aqui.
Para finalizar, resolvi criar um exemplo simples de uma aplicação chamada “tweetretriever”, que utiliza alguns dos recursos fundametais oferecidos pelo App Engine, i.e criação de uma entidade (modelo), inserção no datastore e a consulta das entidades inseridas.
O aplicativo foi escrito em Python. Atualmente, o suporte do App Engine ao Python 2.7 é experimental mas já é um avanço comparado ao Python 2.5, que tem tido cada vez menos suporte pela comunidade do Python. Basicamente, a aplicação cria entidades chamadas “tweet” que possuem duas propriedades: ‘conteudo’ do tipo texto e ‘data’ do tipo datetime. Estas, devem ser salvas no datastore e podem retornar (“retrieve”) os tweets enviados no período solicitado em segundos, limitando o número de entidades retornadas a 100 entidades. Serão necessários dois arquivos:
- tweetretriever.py : a lógica negócio da aplicação.
- app.yaml : configuração da aplicação.
Importando os módulos necessários para execução do module tweetretriever:
#!/usr/bin/env python import cgi import wsgiref.handlers from datetime import * from google.appengine.ext import db from google.appengine.ext import webapp
Crie o modelo da entidade com as propriedades db.TextProperty() e db.DateTimeProperty(). Atribua ao parâmetro auto_now_add=True ; essa ação faz com que o App Engine, ao inserir a entidade no datastore (através do método put()), atribua o datetime.now() à propriedade ‘data’ da entidade. Para mais informações sobre os tipos de propriedades que existem, leia aqui .
class Tweet(db.Model):
conteudo = db.TextProperty()
data = db.DateTimeProperty(auto_now_add=True)
Define o Handler principal.
class MainHandler(webapp.RequestHandler):
def get(self):
stream = self.response.out
'''
Cria a página que sera utilizada
para criar, enviar, consultada os
tweets.
'''
stream.write(
'''<html>
<Title>Tweet Enviar-Buscar</Title>
<h1>Tweet Retriever</h1>
<body>
<form action='/salvar' method='post'>
<div><textarea name='tweet' rows='3' cols='25'></textarea></div>
<div><input type='submit' value='Enviar'></div>
</form><br />
<form action='/' method='get'>
<div><input type='text' name='tempo' style='width:65px' /></div>
<div>
<input type='submit'
value='Buscar'
title='Buscar todos tweets enviados com menos do tempo especificado em segundos'>
</div>
</form>''')
valor = self.request.get('tempo')
if valor and valor.isdigit():
tempo = int(valor)
''' Calcula a data mínima de consulta '''
data_minimo = datetime.now() - timedelta(seconds=tempo)
tweets = Tweet.gql(
'''
WHERE
data > :data
ORDER BY
data DESC
LIMIT 100
''', data=data_minimo)
ha_retorno = False
stream.write('<fieldset><legend>Tweets</legend>')
''' Exibe todos os tweets retornados na consulta '''
for tweet in tweets:
ha_retorno = True;
stream.write('<p><strong>%s</strong>: <i>%s</italic></i>' %
(tweet.data.strftime('(%d-%m-%y) %H:%M:%S'), tweet.conteudo))
if not ha_retorno:
stream.write("<font color='blue'>nenhum tweet diponivel</font>")
stream.write('</fieldset>')
stream.write('</body></html>')
É bom ressaltar que, na utilização do query(i.e GqlQuery) de consulta ao datastore, a filtragem é limitada apenas a uma propriedade por consulta.
Define o Handler que vai salvar os tweets no datastore.
class Tweeter(webapp.RequestHandler):
'''
Cria e preenche os valores da entidade
e a insere no datastore.
Obs: atribui-se datetime.now() ao
propriedade data automaticamente.
'''
def post(self):
text = self.request.get('texto')
if text.strip():
Tweet(conteudo=text).put()
self.redirect('/')
Define a função main, espcificando a classe ou Handler que deve tratar as requisições para as páginas especificadas.
def main():
mapeamento_url =[('/', MainHandler),
('/salvar', Tweeter)]
application = webapp.WSGIApplication(mapeamento_url, debug=True)
wsgiref.handlers.CGIHandler().run(application)
if __name__ == '__main__':
main()
E finalmente o arquivo de configuração.(app.yaml)
# O indentificador da aplcacao
application: tweetretriever
version: 1
runtime: python
api_version: 1
# Especifica quais scripts tratam as requisicoes ás urls
# definidas, neste caso, a expressão regular
# ".*" significa que toda requisição ao aplicação
# será tratada pelo script: tweetretriever.py
#tratado pelo
handlers:
- url: .*
script: tweetretriever.py
O UI da aplicação.
O objetivo deste exemplo é simples, mostrando o suficiente para que tenhamos uma ideia de como funciona o App Engine. Se quiser testar de forma mais aprofundada, você pode utilizar os templates oferecidos pelo framework do Django o do próprio webapp; Assim o html poderá ser separado em um outro arquivo, consequentemente melhorando a organização, especialmente no desenvolvimento de grandes aplicações. Para mais informações sobre templating no App Engine leia aqui.
Por hoje é isso. Não hesite em deixar os seus comentários e suas críticas. Todos serão bem-vindos. Até a próxima.
Referências:
http://code.google.com/appengine/
http://code.google.com/intl/pt-BR/appengine/
http://www.google.com/enterprise/cloud/appengine/pricing.html
Escrito por Ahmed Alejo











