Web analytics com Piwik

Parte da tela inicial do Piwik, obtida a partir de http://demo.piwik.org
Parte da tela inicial do Piwik, obtida a partir de http://demo.piwik.org

O Piwik (pronuncia-se píuiqui) é um software livre, mantido no github, destinado à web analytics. Pode substituir o google analytics e softwares de leitura de logs de servidores web, como o AWStats. É construído em PHP e MySQL e pode ser facilmente integrado à vários softwares, como o wordpress, mediawiki, joomla e drupal. Aqui estarei abordando um pouco da utilização da ferramenta, mas, caso precise, além do software a empresa oferece serviços de hospedagem e consultoria.

Instalação

A instalação é rápida. No meu ambiente, com Debian 7.8, Apache 2.2.22 e MySQL 5.5.41, realizei os seguintes procedimentos:

  • Baixar a última versão estável, descompactar e mover para a raiz do servidor web

    $ mkdir /tmp/piwik
    $ cd /tmp/piwik
    $ wget -c http://builds.piwik.org/piwik.zip
    $ unzip piwik.zip

    mv piwik/ /var/www/

    chown -R www-data: piwik/

  • Criar a base de dados (podes usar mysql -u root -p para abrir um console do MySQL). Substitua piwiki e suaSenhaAqui pelo nome de usuário e senha que quiseres

    CREATE USER ‘piwik’@‘localhost’ IDENTIFIED BY ‘suaSenhaAqui’;
    GRANT USAGE ON . TO ‘piwik’@‘localhost’ IDENTIFIED BY ‘suaSenhaAqui’
    WITH MAX_QUERIES_PER_HOUR 0
    MAX_CONNECTIONS_PER_HOUR 0
    MAX_UPDATES_PER_HOUR 0
    MAX_USER_CONNECTIONS 0;
    CREATE DATABASE IF NOT EXISTS piwik;
    GRANT ALL PRIVILEGES ON piwik.* TO ‘piwik’@‘localhost’;

  • Acessar a interface do piwik (http://site.com.br/piwik) e seguir os passos. Após terminá-los pode ser necessário alterar o idioma de Português para Português brasileiro, através do menu com o nome do usuário -> Configurações -> Configurações do utilizador.

  • Habilite a geolocalização

    # apt-get install php5-geoip php5-dev libgeoip-dev

    service apache2 restart

    Agora acesse Usuário -> Geolocalização e habilite o item GeoIP (PECL). Para mais informações sobre a geolocalização no piwik acesse este link.

    • Cadastre os sites que deseja monitorar. Vá em Usuário -> Websites -> Adicionar novo site.

No site do projeto há mais informações sobre a instalação, inclusive como ajustar o software para sites com médio/alto tráfego.

Monitorando aplicativos e páginas

Cada um dos mais de 65 aplicativos que tem um plugin para o piwik terá um processo de instalação e configuração, mas geralmente as informações que vais precisar são a url onde ele está acessível (ex.: site.com.br/piwik) e o token auth, que é um hash MD5, composto por 32 caracteres, que está disponível na página API, acessível através do menu com o nome do usuário.

Também é possível inserir manualmente, nas páginas que desejas monitorar, o código javascript e/ou uma imagem que obterá as informações do acesso. Para ver estas informações vá em Usuário -> Configurações -> Código de rastreamento.

Por fim, o piwik oferece uma API HTTP que pode ser utilizada com a sua linguagem de programação favorita, inclusive já conta com clientes para PHP, Java, Python, C#, Android, iOS e Titanium.

Leitura de logs

Atualmente o piwik “sabe” ler os logs do apache (em três versões diferentes), amazon cloudfront, icecast2, iis, ncsa, nginx, s3 e w3c_extend porém, caso nenhum destes formatos lhe atenda, é possível definir uma expressão regular.

Na documentação do projeto são citadas algumas situações onde a análise de logs pode ser utilizada:

  • Se você manipula um aplicativo web ou desktop e não pode adicionar código javascript diretamente nele
  • Caso queira acompanhar e verificar a atividade de determinado servidor ou grupo de servidores ou até fornecer relatórios para seus clientes (no caso de provedores de hospedagem, por exemplo)
  • Se você quiser comparar os dados dos logs com os obtidos via javascript
  • Se você tem logs antigos e deseja importá-los para o piwik

No futuro, o piwik possibilitará que a análise de logs e o rastreamento via javascript sejam utilizados conjuntamente, para o mesmo site. Atualmente, se você quiser utilizar as duas técnicas simultaneamente, é necessário ter o site cadastrado duas vezes no piwik e, durante a importação de logs, especificar o parâmetro idsite.

Analisando logs do Apache

No diretório misc/log-analytics/ há o script, feito em python 2.6, chamado _importlogs.py, capaz de ler diversos tipos de logs e armazenar as informações no banco de dados do piwik. A análise de logs do apache contém um número menor de informações do que as obtidas pelo método em javascript.

Um exemplo de uso desta ferramenta:

# python piwik/misc/log-analytics/import_logs.py --url=site.com.br/piwik --show-progress --enable-static --enable-bots --enable-http-errors --idsite=1 /var/log/apache2/access.log*

Onde:

  • –url onde o piwik está disponível
  • –show-progress durante a importação, exibe o número de linhas analisadas e gravadas, a média e o valor atual de gravações por segundo
  • –enable-static registra arquivos estáticos (js, css, imagens, etc)
  • –enable-bots registra acessos de bots
  • –enable-http-errors registra os erros HTTP da série 400 e 500
  • –idsite o id do site, registrado no piwik, referente aos registros nos logs. É necessário especificar pois o apache, por padrão, não armazena nos logs o domínio que está sendo acessado. Para encontrar o id do site, acesse Usuário -> Configurações -> Websites
  • /var/log/apache2/access.log* o caminho completo para os arquivos de log que serão analisados. Neste caso o * faz com que todos os arquivos cujo nome comece com access.log sejam analisados, mesmo se estiverem compactados pelo logrotate.

O comando acima produzirá uma saída parecida com esta:

0 lines parsed, 0 lines recorded, 0 records/sec (avg), 0 records/sec (current)
Parsing log /var/log/apache2/access.log…
802 lines parsed, 0 lines recorded, 0 records/sec (avg), 0 records/sec (current)
1002 lines parsed, 200 lines recorded, 99 records/sec (avg), 200 records/sec (current)
[…]
256390 lines parsed, 254736 lines recorded, 78 records/sec (avg), 0 records/sec (current)
256390 lines parsed, 254936 lines recorded, 78 records/sec (avg), 200 records/sec (current)

Logs import summary

255152 requests imported successfully
687 requests were downloads
1238 requests ignored:
    0 HTTP errors
    8 HTTP redirects
    1230 invalid log lines
    0 requests did not match any known site
    0 requests did not match any --hostname
    0 requests done by bots, search engines...
    0 requests to static resources (css, js, images, ico, ttf...)
    0 requests to file downloads did not match any --download-extensions

Website import summary

255152 requests imported to 1 sites
    1 sites already existed
    0 sites were created:

0 distinct hostnames did not match any existing site:

Performance summary

Total time: 3244 seconds
Requests imported per second: 78.64 requests per second</pre>

Não é um processo rápido. Neste caso, rodando em uma VPS simples, foram gastos cerca de 55 minutos para processar 255.152 registros, com uma média de 78.64 registros por segundo. Para deixar o processo mais rápido pode-se usar os parâmetros _recorders_ e _recorder-max-payload-size_, que definem, respectivamente, o número de threads e a quantidade de páginas visitadas (ou entradas no log) que serão enviadas, por vez, para gravação. O valor recomendado para o parâmetro _recorders_ é o número de núcleos da máquina, mas podes usar um outro número, dependendo dos recursos do host.

Após realizar a importação inicial dos logs, você pode querer processar todos os relatórios. Para isso execute o comando _console_, de uma maneira parecida com esta:

<pre class="wrap:true lang:default highlight:0 decode:true  ">root@host:/var/www/piwik# ./console core:archive --force-all-websites --force-all-periods=315576000 --force-date-last-n=1000 --url=http://site.com.br/piwik</pre>

Para mais informações sobre a ferramenta de importação de logs, [visite esta página][1].

### <span id="Alterando_o_formato_dos_logs_e_agendando_a_importacao_no_cron">Alterando o formato dos logs e agendando a importação no cron</span>

Para que o piwik possa detectar, nos logs, qual o site sendo acessado, é necessário configurar a diretiva LogFormat no apache, como segue:

<pre class="lang:apache decode:true">LogFormat "%v %h %l %u %t \"%r\" %&gt;s %b \"%{Referer}i\" \"%{User-Agent}i\"" apelidoDoFormatoDeLog</pre>

Porém no debian e ubuntu o arquivo _/etc/apache2/apache2.conf_ vem com uma configuração semelhante que é apelidada de _vhost_combined_, de modo que somente precisamos alterar a opção _CustomLog_ no arquivo _/etc/apache2/sites-enabled/000-default_ (ou no virtual host que quiseres) para algo do tipo:

<pre class="lang:apache decode:true ">CustomLog ${APACHE_LOG_DIR}/access.log vhost_combined</pre>

Note que esse processo não irá alterar os logs já feitos, somente os novos. Reinicie o apache para aplicar a configuração.

Para agendar o processamento dos logs para uma vez por dia, realize os seguintes procedimentos:

  * altere o arquivo _/etc/logrotate.d/apache2_, substituindo _weekly_ por _daily (_você pode querer adicionar a opção _dateext_ para que o logrotate adicone a data da rotação ao nome do arquivo, no formato YYYYMMDD)
  * no _/etc/crontab_, adicione uma entrada para rodar o script de importação todos os dias pela manhã. Repare, no próprio crontab, o horário no qual é executado o _/etc/cron.daily_, de modo que a execução do _import_logs.py_ ocorra depois desse horário (no debian 7.8 o horário é 6:25) <pre class="wrap:true lang:sh decode:true">00 07 * * * root /usr/bin/python /var/www/piwik/misc/log-analytics/import_logs.py --url=site.com.br/piwik --add-sites-new-hosts --enable-static --enable-bots --enable-http-errors --idsite=1 /var/log/apache2/access.log.1.gz</pre>

  *  Ou utilize esta sintaxe caso seus logs estejam sendo gerados com a opção _dateext_ no logrotate: <pre class="wrap:true lang:default decode:true">00 07 * * * root /usr/bin/python /var/www/piwik/misc/log-analytics/import_logs.py --url=site.com.br/piwik --add-sites-new-hosts --enable-static --enable-bots --enable-http-errors --idsite=1 $(date --date=yesterday +/var/log/apache2/access.log-\%Y\%m\%d).gz</pre>

  * Agende também a execução do comando de arquivamento <pre class="lang:default highlight:0 decode:true">00 8 * * * root /usr/bin/php /var/www/piwik/console core:archive --url=http://site.com.br/piwik/</pre>

    &nbsp;</li> </ul> 

    Para mais informações sobre configurações de logs e sobre o _import_logs.py_, visite a <a href="https://github.com/piwik/piwik/tree/master/misc/log-analytics" target="_blank">página do projeto no github</a>.

    &nbsp;