USO DE UM PROCESSO ETL EM UM MODELO DATA WAREHOUSE PARA A GERAÇÃO DE DASHBOARDS DE INDICADORES DE REDES DE TELEFONIA CELULAR Antonio Luiz Bonna de Lyra Projeto de Graduação apresentado ao Corpo Docente do Departamento de Engenharia Eletrônica e de Computação da Escola Politécnica da Universidade Federal do Rio de Janeiro, como parte dos requisitos necessários à obtenção do título de Engenheiro Eletrônico e de Computação. Orientador: Flávio Luis de Mello Rio de Janeiro Agosto de 2016 USO DE UM PROCESSO ETL EM UM MODELO DATA WAREHOUSE PARA A GERAÇÃO DE DASHBOARDS DE INDICADORES DE REDES DE TELEFONIA CELULAR Antonio Luiz Bonna de Lyra PROJETO DE GRADUAÇÃO SUBMETIDO AO CORPO DOCENTE DO DEPARTAMENTO DE ENGENHARIA ELETRÔNICA E DE COMPUTAÇÃO DA ESCOLA POLITÉCNICA DA UNIVERSIDADE FEDERAL DO RIO DE JANEIRO COMO PARTE DOS REQUISITOS NECESSÁRIOS PARA A OBTENÇÃO DO GRAU DE ENGENHEIRO ELETRÔNICO E DE COMPUTAÇÃO. Autor: Antonio Luiz Bonna de Lyra Orientador: Prof. Flávio Luis de Mello, D.Sc. Examinador: Prof. Heraldo Luís Silveira de Almeida, D.Sc. Examinador: Prof. Ricardo Rhomberg Martins, D.Sc. RIO DE JANEIRO, RJ – BRASIL AGOSTO DE 2016 Bonna de Lyra, Antonio Luiz Uso de um Processo ETL em um Modelo Data Warehouse para a Geração de Dashboards de Indicadores de Redes de Telefonia Celular / Antonio Luiz Bonna de Lyra. – Rio de Janeiro: UFRJ/Escola Politécnica, 2016. XVI, 90 p.: il.; 29, 7cm. Orientador: Flávio Luis de Mello Projeto de Graduação – UFRJ/Escola Politécnica/ Departamento de Engenharia Eletrônica e de Computação, 2016. Referências Bibliográficas: p. 62 – 66. 1. ETL. 2. Banco de Dados. 3. Data Warehouse. 4. Redes de Telefonia. 5. KPI. 6. Dashboard. I. Luis de Mello, Flávio. II. Universidade Federal do Rio de Janeiro, Escola Politécnica, Departamento de Engenharia Eletrônica e de Computação. III. Uso de um Processo ETL em um Modelo Data Warehouse para a Geração de Dashboards de Indicadores de Redes de Telefonia Celular. iii UNIVERSIDADE FEDERAL DO RIO DE JANEIRO Escola Politécnica - Departamento de Eletrônica e de Computação Centro de Tecnologia, bloco H, sala H-212, Cidade Universitária Rio de Janeiro - RJ CEP 21949-900 Este exemplar é de propriedade da Universidade Federal do Rio de Janeiro, que poderá incluí-lo em base de dados, armazenar em computador, microfilmar ou adotar qualquer forma de arquivamento. É permitida a menção, reprodução parcial ou integral e a transmissão entre bibliotecas deste trabalho, sem modificação de seu texto, em qualquer meio que esteja ou venha a ser fixado, para pesquisa acadêmica, comentários e citações, desde que sem finalidade comercial e que seja feita a referência bibliográfica completa. Os conceitos expressos neste trabalho são de responsabilidade do(s) autor(es). iv A todos os professores e funcionários da UFRJ. v AGRADECIMENTOS Agradeço a equipe da Huawei NPM, principalmente aos engenheiros Carlos Eduardo Covas Costa e Eduardo Martins Montenegro, pela ajuda, ensinamentos e amizade durante todo o período em que fiz meu estágio na empresa, onde tive a oportunidade de desenvolver a ferramenta que apresento neste trabalho; aos meus chefes Eng. Bruno Leonardo Barbosa de Oliveira e Eng. Henrique Amaral Omena, que coordenaram o desenvolvimento da ferramenta na Huawei. Agradeço a todos os professores do curso de Engenharia Eletrônica e de Computação da UFRJ que contribuíram para minha formação acadêmica, em especial ao meu orientador acadêmico e coordenador de curso Carlos José Ribas D’Avila, e aos professores Heraldo Luís Silveira de Almeida e Ricardo Rhomberg Martins que aceitaram o convite de participação na banca de defesa deste projeto de graduação. E, finalmente, ao professor Flávio Mello que aceitou me orientar nesse trabalho. vi Resumo do Projeto de Graduação apresentado à Escola Politécnica/UFRJ como parte dos requisitos necessários para a obtenção do grau de Engenheiro Eletrônico e de Computação USO DE UM PROCESSO ETL EM UM MODELO DATA WAREHOUSE PARA A GERAÇÃO DE DASHBOARDS DE INDICADORES DE REDES DE TELEFONIA CELULAR Antonio Luiz Bonna de Lyra Agosto/2016 Orientador: Flávio Luis de Mello Departamento: Engenharia Eletrônica e de Computação RESUMO Este trabalho destina-se em desenvolver uma ferramenta capaz coletar dados das redes de telefonia 3G e 4G e gerar relatórios com os indicadores de performance da rede com menor atraso de tempo possível. A intenção foi desenvolver um processo ETL (Extract, Transform, Load ) capaz de extrair dados dos servidores da operadora, transformá-los e carregá-los em um Data Warehouse. Inicialmente foram feitos testes para escolher quais tecnologias a serem utilizadas. Esses testes foram de suma importância para garantir que o processo ocorra de forma rápida, com poucos erros e com menos atraso. Neste sentido, foram escolhidas diferentes ferramentas para cada etapa do processo. A partir de então, os dados já carregados no Data Warehouse foram processados para cálculos dos principais indicadores das redes de telefonia, e depois agrupados em maiores níveis de granularidade. Por fim, foi utilizada uma aplicação web para extrair esses dados do Date Warehouse para gerar dashboards em uma interface web, de modo que o usuário possa analisar esses dados através de diversos tipos de consultas. Palavras-Chave: ETL, Banco de Dados, Data Warehouse, KPI, 3G, 4G, dashboard. vii Abstract of Graduation Project teste presented to POLI/UFRJ as a partial fulfillment of the requirements for the degree of Electronic and Computer Engineer AN ETL PROCESS IN DATA WAREHOUSE TO GENERATE KPI DASHBOARDS FOR MOBILE NETWORKS Antonio Luiz Bonna de Lyra August/2016 Advisor: Flávio Luis de Mello Department: Electronic and Computer Engineering ABSTRACT This work aims to develop a tool that can collect data from 3G and 4G mobile networks and generate reports with the network performance indicators with less delay as long as possible. The intention was to develop an ETL (Extract, Transform, Load) process capable of extracting data from the enterprise servers, transform and load it in a Data Warehouse. Initially tests were made to choose which technologies to be used. These tests were of very importance to guarantee that the process occurs as fast as possible, with fewer errors and less delay. In this sense, they were chosen different tools for each step of the process. With the data already loaded in the Data Warehouse, KPIs (Key Performance Indicator) of the mobile networks are calculated and grouped into higher levels of granularity. Finally, a web application extract data from the Data Warehouse to generate dashboards on a web interface, then the user can analyze the data from different kinds of views. Key-words: ETL, Database, Data Warehouse, KPI, 3G, 4G, dashboard. viii Sumário Lista de Figuras xi Lista de Tabelas xiii Lista de Abreviaturas e Siglas xiv 1 Introdução 1.1 Tema . . . . 1.2 Delimitação 1.3 Justificativa 1.4 Objetivos . 1.5 Metodologia 1.6 Descrição . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 Fundamentação Teórica 2.1 Tecnologias de telefonia móvel . . . . . 2.1.1 Breve histórico sobre a telefonia 2.1.2 Cenário atual . . . . . . . . . . 2.1.3 Características do UMTS . . . . 2.1.4 Características do LTE . . . . . 2.2 Conceitos de KPI . . . . . . . . . . . . 2.3 Conceitos de BI . . . . . . . . . . . . . 2.3.1 ETL . . . . . . . . . . . . . . . 2.3.2 Data Warehouse . . . . . . . . 2.3.3 Data Marts . . . . . . . . . . . 2.3.4 Dashboard . . . . . . . . . . . . 3 Solução implementada 3.1 Arquitetura do Sistema . . . . . 3.1.1 Servidores Externos . . . 3.1.2 Implementação do ETL 3.1.3 Aplicação MVC . . . . . . . . . ix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . móvel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 1 1 2 2 3 4 . . . . . . . . . . . 5 5 5 6 8 11 12 18 19 20 21 22 . . . . 23 23 24 27 37 3.2 Materiais e Métodos . . . . . 3.2.1 Infra-estrutura . . . . 3.2.2 Ferramentas utilizadas 3.2.3 Funcionamento . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Resultados e Discussões 4.1 KPIs básicos para tecnologia UMTS . . . . . 4.2 Principais ofensores por RNC . . . . . . . . 4.3 KPIs personalizados para tecnologia UMTS 4.4 KPIs básicos para tecnologia LTE . . . . . . 4.5 Discussões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 39 39 48 . . . . . 50 53 55 56 57 57 5 Conclusões e Trabalhos Futuros 59 5.1 Conclusões . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 5.2 Trabalhos futuros . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Referências Bibliográficas 62 A Códigos Fonte - ETL A.1 Extração . . . . . . . . . . . . . A.1.1 Ftp.py . . . . . . . . . . A.1.2 Auto-get-performance.sh A.2 Conversão . . . . . . . . . . . . A.2.1 pm-convert.sh . . . . . . A.2.2 auto-convert.sh . . . . . A.2.3 parser.py . . . . . . . . . A.2.4 auto-parse.sh . . . . . . A.3 Carga . . . . . . . . . . . . . . A.3.1 staging.sh . . . . . . . . A.3.2 auto-staging.sh . . . . . . . . . . . . . . . . 67 68 68 70 71 71 73 74 77 78 78 82 . . . . . . . 83 84 84 85 86 87 87 89 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . B Códigos Fonte - Processamento B.1 Cálculo dos KPIs de Acessibilidade . . . . . . . . . . . . . . . . . B.1.1 View vw_acessibility.sql . . . . . . . . . . . . . . . . . . . B.1.2 Função PL/SQL inserir_kpi_accessibility.sql . . . . . . . . B.1.3 inserir_kpi_accessibility.sh . . . . . . . . . . . . . . . . . B.2 Cálculo dos ofensores por RNC dos KPIs de Acessibilidade . . . . B.2.1 Função PL/SQL inserir_worst_cells_rnc_accessibility.sql B.2.2 inserir_worst_cells_rnc_accessibility.sh . . . . . . . . . . x . . . . . . . . . . . . . . . . . . Lista de Figuras 2.1 2.2 2.3 . Números de celulares no mundo ano a ano, em bilhões. Fonte: Teleco [2]. . Evolução dos padrões de telefonia móvel 3GPP. Fonte: 5G Americas [1]. Projeção do números de assinantes globais em cada tecnologia, em milhões. . . . . . . . . . . . . . . . . . . . . . . . Projeção para os acessos móveis no Brasil. Fonte: 5G Americas [4]. . Divisão lógica da rede móvel em rede de acesso e núcleo de rede. . . Topologia UMTS. Fonte: Qualcomm Wireless Academy [5]. . . . . . Fonte: 5G Americas [3]. 2.4 2.5 2.6 2.7 6 7 . . . . . . . . . 7 . 8 . 9 . 10 UTRAN - UMTS Terrestrial Radio Access Network. Fonte: Qualcomm Wireless Academy [5]. . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 2.8 2.9 2.10 2.11 2.12 2.13 2.14 2.15 2.16 Core Network Fonte: Qualcomm Wireless Academy [5]. . . . . . . . . . . 11 3.1 3.2 3.3 3.4 3.5 Arquitetura do Sistema. . . . . . . . . . . . . . . . . . . . . . . . . . . 24 Arquitetura E-UTRAN . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 Valores típicos de RTWP. Fonte: telecomHall [6] . . . . . . . . . . . . . . 15 Softer Handover. Fonte: Teleco [7] . . . . . . . . . . . . . . . . . . . . . 15 Soft Handover. Fonte: Teleco [7] . . . . . . . . . . . . . . . . . . . . . . 16 . . . . . . Inter-RAT Hard Handover. Fonte: Teleco [7] . Arquitetura tecnológica de um BI. [8] . . . . Estrutura do ETL. [9] . . . . . . . . . . . . Hard Handover. Fonte: Teleco [7] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 17 19 19 Estrutura do EMS. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25 Diagrama de Fluxos do Processo de ETL. . . . . . . . . . . . . . . . . . 28 Exemplo de um arquivo XML contendo uma família com contadores de RRC. 30 Objeto de um arquivo XML contendo o nome do RNC, e o nome e identificador de uma célula. 3.6 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Objeto de um arquivo XML da rede LTE contendo o nome e identificador de um eNode-B, e o nome e identificador de uma célula. . . . . . . . . . . 31 3.7 3.8 3.9 3.10 Tempo de carga em uma base de dados vazia, em segundos. . . . . . . . . 32 . . . . 32 Arquivo do exemplo anterior após a conversão para uma planilha em CSV. 32 Arquivo do exemplo anterior após o parser. . . . . . . . . . . . . . . . . 33 Tempo de carga em uma base de dados já populada, em segundos. xi 3.11 3.12 3.13 3.14 3.15 3.16 Volume de dados por arquivo (MB). . . . . . . . . . . . . . . . . . . . . 35 Diagrama de Fluxos do Processamento dos Dados. . . . . . . . . . . . . . 36 . . . . . . . . . . . . . 38 Diagrama de um processador XSLT. . . . . . . . . . . . . . . . . . . . . 41 Arquivo DTD usado para validar um arquivo XML. . . . . . . . . . . . . 42 Arquitetua MVC. Fonte: CodeIgniter Brasil [10]. Tempo de carga de 4 GB de dados, em segundos. Fonte: página oficial do pg_bulkload [11]. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 3.17 Tempo de carga de 1 GB de dados para diferentes métodos de inserção, em minutos. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 3.18 Monitoramento do ETL . . . . . . . . . . . . . . . . . . . . . . . . . . 48 3.19 Monitoramento dos KPIs . . . . . . . . . . . . . . . . . . . . . . . . . . 48 4.1 4.2 4.3 4.4 4.5 4.6 4.7 4.8 4.9 4.10 4.11 4.12 4.13 4.14 4.15 5.1 Organização do Banco de Dados. . . . . . . . . . . . . . . . . . . . . . . 51 Página inicial da ferramenta. . . . . . . . . . . . . . . . . . . . . . . . . 51 Menu com os indicadores de performance. . . . . . . . . . . . . . . . . . 52 . . . . . . . . . . . Agregações de KPIs disponíveis. . . . . . . . KPIs básicos de Accessibility e Retainability. . KPIs básicos de Traffic. . . . . . . . . . . . Tecnologias disponíveis. KPIs básicos de Service Integrity e Retention. KPIs básicos de Mobility. . . . . . . . . . . . KPIs básicos de Availability e Coverage. . . . Ranqueamento das piores células de um RNC. . KPIs personalizados. . . . . . . . . . . . Piores células para o KPI QDA PS . . . . KPIs básicos da rede LTE. . . . . . . . . KPI de uma célula ao longo de um dia. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52 52 53 53 54 54 54 55 55 56 56 57 Modelo Multidimensional proposto. [8] . . . . . . . . . . . . . . . . . . . 60 xii Lista de Tabelas 2.1 Principais mercados de celular no mundo, em milhões. Fonte: Teleco [2]. . 8 3.1 3.2 3.3 3.4 RNCs disponíveis em cada um dos servidores do EMS . . . . . . . . . . . 26 Exemplo de uma tabela de uma família de contadores por RNC. . . . . . . 33 . . . . . . . . . . . 34 Exemplo de uma família de contadores do LTE . . . . . . . . . . . . . . 34 Exemplo de uma família com contadores por Node-B xiii Lista de Abreviaturas e Siglas 1G 1st Generation, p. 5 2G 2nd Generation, p. 5, 8 3GPP 3rd Generation Partnership Project, p. 5 3G 3rd Generation, p. 1, 2, 4, 5, 8, 9, 23 4G Fourth Generation, p. 1, 2, 4, 6, 8, 23 API BI CRUD CSV CS Application Programming Interface, p. 48 Business Intelligence, p. 4, 18, 39 Create, Read, Update, Delete, p. 38 Comma-separated values, p. 31, 34, 41, 42, 45, 59 Circuit Switched, p. 9–14, 17 CTL Control Temporal Logic, p. 45 DTD Document Type Definition, p. 42 E-UTRAN EDGE Evolved Universal Terrestrial Radio Access, p. 11 Enhanced Data rates for GSM Evolution, p. 5 EMS Element Management System, p. 25, 29, 49 EPC Evolved Packet Core, p. 11 ETL Extract, Transform, Load, p. 1, 3, 4, 18–20, 23, 27, 31, 39, 45, 48, 49, 58, 59 FTP File Transfer Protocol, p. 27, 40, 49 GERAN GGSN GSM EDGE Radio Access Network, p. 9 Gateway GPRS Support Node, p. 11 xiv GMSC Gateway Mobile Switching Center, p. 11 GPRS General Packet Radio Services, p. 5 GSM GUI HSDPA HSPA HSUPA IP Global System for Mobile Communications, p. 5, 7, 9, 15–17, 59 Graphical User Interface, p. 44 High Speed Downlink Packet Access, p. 6, 14, 18 High Speed Packet Access, p. 6, 9 High Speed Uplink Packet Access, p. 6 Internet Protocol, p. 27 ISDN Integrated Service Digital Network, p. 11 JSON JavaScript Object Notation, p. 3 KPI Key Performance Indicator, p. 1–4, 12, 13, 18, 23, 27, 29, 35, 37, 39, 40, 43, 45, 46, 48–58, 83 LTE Long Term Evolution, p. 6–8, 11, 17, 25, 29, 31, 34, 35, 37, 50, 57 MSC Mobile Switching Center, p. 11 MVC Model, View, Controler, p. 3, 37, 39, 46, 59 OFDM Orthogonal Frequency Division Multiple Access, p. 11 OLAP Online Analytical Processing, p. 60 PL/SQL PSTN PS Procedural Language/Structured Query Language, p. 39, 43, 44, 46 Public Switched Telephone Network, p. 11 Packet Switched, p. 9–11, 13, 14, 17 RAB Radio Access Bearer, p. 13, 14, 27 RAN Radio Access Network, p. 9 RF Radio Frequência, p. 1, 10 xv RNC Radio Network Controller, p. 10, 12, 14, 15, 25–27, 30, 33, 37, 50, 52, 55, 60 RRC Radio Resource Control, p. 13, 27, 29 RTWP SGSN Received Total Wideband Power, p. 14 Serving GPRS Support Node, p. 11 SMS Short Message Service, p. 5 SQL Structured Query Language, p. 2, 43, 44, 49 SSH Secure Shell, p. 47 UF UMTS USIN UTRAN Unidade da Federação, p. 27, 57 Universal Mobile Telecommunication System, p. 5, 6, 8, 9, 11, 15–17, 25, 29, 30, 35, 37, 50, 53, 57 Universal Subscriber Identity Module, p. 9 UMTS Terrestrial Radio Access Network, p. 9, 10, 12, 17 VBA Visual Basic for Applications, p. 2 VPN Virtual Private Network, p. 49 VoIP Voice over Internet Protocol, p. 14 WCDMA Wideband Code Division Multiple Access, p. 8 XML eXtensible Markup Language, p. 27, 31, 41, 42, 59 XSLT eXtensible Stylesheet Language for Transformation, p. 41 xvi Capítulo 1 Introdução 1.1 Tema O tema do trabalho é o desenvolvimento de uma ferramenta que utiliza o processo de ETL (Extract, Transform, Load - Extração, Transformação, Carga) voltado para arquitetura de um Data Warehouse (Armazém de Dados) [12] com a finalidade de gerar dashboards (painel de indicadores) contendo os principais indicadores de performance de redes de telefonia celular que utilizam as tecnologias 3G (3rd Generation - Terceira Geração) e 4G (Fourth Generation - Quarta Geração). Neste sentido, pretende-se estudar os seguintes problemas: (1) como extrair dados de fontes diversas de uma empresa de telecomunicações (que fornece serviços para uma operadora de telefonia celular) e transformá-los de modo a serem carregados em um Banco de Dados; (2) como esses dados podem ser processados para cálculos dos KPIs (Key Performance Indicator - Indicador-chave de Desempenho) da rede; (3) como esses indicadores podem ser apresentados em dashboards por uma interface web, com menor atraso de tempo possível. 1.2 Delimitação O desenvolvimento da ferramenta é voltado para o mercado de telecomunicações, onde os engenheiros de RF (rádio frequência) usam arquivos de performance extraídos dos servidores das empresas para monitoramento ou confecção de relatórios. O objeto de estudo do trabalho é limitado ao desenvolvimento de uma solução ETL para um modelo Data Warehouse e geração de dashboards de indicadores em uma interface web. Não faz parte do escopo do trabalho a análise desses indicadores. Tampouco o design da interface web, mas sim o modelo da aplicação web que realiza consultas a um Banco de Dados. 1 1.3 Justificativa No ramo das telecomunicações atualmente é muito exigido pelas empresas contratantes a elaboração de relatórios técnicos por engenheiros, contendo os diversos indicadores de performance sobre as redes de telefonia. Além da elaboração dos relatórios, outra tarefa dos engenheiros é o monitoramento da rede e a realização das otimizações necessárias a fim de melhorar os indicadores. Isso acaba tomando boa parte do seu tempo, pois primeiro eles têm que extrair manualmente os dados da rede em forma de planilhas, depois fazer gráficos no Excel, para só depois analisar o estado da rede, elaborar relatórios e fazer as otimizações. Outra dificuldade é a falta de padronização dos relatórios, podendo cada engenheiro realizá-los de uma forma bem diferente. Com o aumento da quantidade de dispositivos móveis, chegando, inclusive, a mais de 7,7 bilhões de dispositivos móveis espalhados pelo mundo [13], surgiu a necessidade de expansão de toda rede de telefonia. Com isso, a demanda de engenheiros da área de telecomunicações é crescente, e a tendência do mercado é juntar os conhecimentos técnicos de engenharia e de Banco de Dados, pois o números de dados a serem analisados é cada vez maior, ficando cada vez mais inviável o uso de planilhas e a criação de macros em VBA (Visual Basic for Applications) no Excel. É seguindo essa tendência que surgiu a ideia desenvolvida na ferramenta deste trabalho, com a criação de um Banco de Dados contendo, de forma centralizada, as informações necessárias de uma rede de telefonia celular, para consultas simplificadas via SQL (Structured Query Language - Linguagem de Consulta Estruturada). Além do Banco de Dados, uma interface Web poderá gerar relatórios de forma rápida, dinâmica e customizável através de consultas ao banco. Através dos dashboards da interface web, o monitoramento da rede pode ser feito de forma constante. 1.4 Objetivos O objetivo geral do trabalho é desenvolver de uma ferramenta OpenSource (Código Aberto) capaz de gerar dashboards com os KPIs de redes de telefonia 3G e 4G através de uma consulta a um Data Warehouse. Desta forma, tem-se como objetivos específicos: • Extrair dados dos servidores externos de uma empresa de telecomunicações, contendo os arquivos necessários para análise das redes 3G e 4G • Realizar as transformações nos arquivos para carregá-los em um Banco de Dados 2 • Calcular os KPIs da rede de telefonia • Fazer agregações dos KPIs por datas (dia e semana) e por outros parâmetros de acordo com a tecnologia da rede em questão, como por RNC, Node-B, eNodeb, cidade, etc para obter um nível maior de granularidade dos dados, e calcular os principais ofensores de cada KPI para cada granularidade • Gerar tabelas e gráficos em uma interface web com os indicadores calculados 1.5 Metodologia Para o desenvolvimento do trabalho, foi consultada a documentação oficial da empresa de telecomunicações [14] que fornece os serviços a uma operadora de redes de telefonia, com o objetivo de saber quais os principais KPIs usados, quais as fórmulas associadas para o cálculo de cada KPI e quais contadores específicos precisam ser extraídos dos servidores da empresa para realizar os cálculos. O passo seguinte foi a criação de um Banco de Dados em um servidor próprio, com tabelas e campos no mesmo formato dos arquivos de performance e configuração presentes nos servidores da empresa. As tabelas foram divididas em schemas (esquemas), sendo indexadas nos campos onde são realizadas a maior parte das consultas e adicionadas constraints (restrições) para persistência dos dados, seguindo a modelagem relacional. [12] Outro servidor de arquivos foi usado para o primeiro passo do ETL, onde arquivos de performance e configuração são extraídos dos servidores externos e armazenados em disco, e onde esses arquivos são transformados para o mesmo formato das tabelas correspondentes no Banco de Dados. A última etapa do ETL foi realizada no servidor do Banco de Dados, ocorrendo a carga dos dados e processamento para cálculos dos KPIs, agregação dos dados para obter maior nível de granularidade e cálculo dos principais ofensores da rede. Todas essas etapas do ETL foram agendadas para serem executadas variando de um minuto a duas horas. O último passo foi o desenvolvimento de uma aplicação web em um servidor utilizando a arquitetura MVC (Model, View, Controler - Modelo, Visão, Controle) [15]. Assim foi possível separar a camada de acesso aos dados do Data Warehouse (Model ) da interface (View ). Alguns arquivos no formato JSON (JavaScript Object Notation) também foram gerados para diminuir os acessos ao Banco de Dados. 3 Com isso, o presente trabalho reúne conceitos de telecomunicações, onde serão estudados como são estruturadas as redes de telefonia móvel que usam as tecnologias UMTS (3G) e LTE (4G) e quais seus principais indicadores utilizados para análise de performance da rede e satisfação do usuário. Reúne também conceitos de Banco de Dados e ETL, onde um grande volume de dados será armazenado e processado. Por fim reúne o conceito de aplicação web, onde uma interface web irá gerar dashboards através de consultas ao Banco de Dados. 1.6 Descrição No capítulo 2 será feita a fundamentação teórica do trabalho, começando com um breve histórico sobre a telefonia celular e descrevendo as características das UMTS e LTE. Após serão apresentados os conceitos básicos de KPI, ressaltando os principais indicadores utilizados para análise de redes de telecomunicações. Por fim serão apresentados os principais conceitos de BI (Business Intelligence - Inteligência de Negócios) para o entendimento do tema abordado no trabalho. O capítulo 3 apresenta a solução proposta e implementada. Será detalhada cada etapa do trabalho dando alguns exemplos práticos do uso do processo ETL. Neste capítulo também serão apresentadas as ferramentas e tecnologias utilizadas e o porquê de cada uma dessas escolhas. Os resultados são apresentados no capítulo 4. Nele será apresentada a interface web do trabalho, o menu com as opções disponíveis e alguns exemplos de gráficos e tabelas que podem ser gerados com a ferramenta desenvolvida. As conclusões e sugestões para trabalhos futuros se encontram no capítulo 5. 4 Capítulo 2 Fundamentação Teórica 2.1 2.1.1 Tecnologias de telefonia móvel Breve histórico sobre a telefonia móvel Os telefones móveis analógicos começaram a ser utilizados na década de 80, e são classificados como de primeira geração, 1G (1st Generation). Gradativamente esses foram substituídos pelos de segunda geração, 2G (2nd Generation), que utilizam a tecnologia GSM (Global System for Mobile Communications - Sistema Global para Comunicações Móveis) e técnicas digitais. Estes sistemas foram desenvolvidos para suportar comunicações de voz, porém, é possível também enviar pequenas mensagens de texto (SMS - Short Message Service - Serviço de mensagens curtas) entre os dispositivos da rede. [16, 17] Os sistemas 2G evoluíram para permitir que os usuários acessassem a Internet a partir de seus aparelhos. Estes sistemas ficaram conhecidos como sistemas de segunda geração e meia (2,5G). Dentre os sistemas 2,5G, destacam-se o GPRS (General Packet Radio Services - Serviços Gerais de Pacote por Rádio) e o EDGE (Enhanced Data rates for GSM Evolution - Taxas de Dados Ampliadas para a Evolução do GSM), ambos são evoluções do GSM. No GPRS, um usuário alcança uma taxa de pico, para transmissão de dados, de 140 Kbps, enquanto no EDGE esta taxa chega a 384 Kbps. [16] Entretanto, as taxas atingidas por esses sistemas não eram suficientes para atender as novas demandas de comunicação. Em dezembro de 1998, foi criada a 3GPP (3rd Generation Partnership Project), uma organização global de comunicações sem fio que trabalha em colaboração para desenvolver normas e especificações para tecnologias de rádio e arquiteturas de serviço. Como evolução das redes GPRS e EDGE, o UMTS (Universal Mobile Telecommunication System - Sistema Universal de Tele5 comunicações Móveis) foi proposto e apresentado na Release-99 (R99) da 3GPP no ano de 2000, para ser uma solução integrada para aspectos de transmissão de voz e dados na telefonia 3G. Com o rápido avanço do UMTS, uma nova tecnologia foi incorporada na Release2005 (R5), oferecendo maiores taxas de download. Desta forma, o sistema também recebeu o nome de High Speed Downlink Packet Access (HSDPA). Por conseguinte, foi incorporada na Release-2006 (R6) a tecnologia HSUPA , que permitiu maiores taxas de upload. Quando as tecnologias HSDPA e HSUPA são implementadas juntas em uma rede, são comumente referidos como HSPA (High Speed Packet Access). [1] A evolução do HSPA veio na Release 7, chamado de HSPA+. Foi na Realease 8 que foi introduzida a quarta geração de tecnologia móvel (4G), a tecnologia LTE (Long Term Evolution), com o objetivo de oferecer velocidades maiores na transmissão de dados. A Figura 2.1 mostra o gráfico da evolução das tecnologias 3GPP durante os anos, incluindo o LTE-Advance, proposto na Release 10 e que propôs melhorias tecnológicas para o LTE. Figura 2.1: Evolução dos padrões de telefonia móvel 3GPP. Fonte: 5G Americas [1]. 2.1.2 Cenário atual A maior parte dos habitantes do mundo já possui acesso à telefonia móvel. Conforme dito na seção 1.3, o número de dispositivos móveis já ultrapassou a marca de 7 bilhões desde 2015, conforme ilustra a Figura 2.2. Além disso, deve-se considerar que o número de usuários com dois ou mais dispositivos (podendo ser celulares, tablets, notebooks, etc) está se tornando cada vez mais comum. Isto sugere que o número de dispositivos móveis irá ultrapassar o número de habitantes no mundo.1 Atualmente (agosto de 2016), o número de habitantes no mundo passou a marca de 7,4 bilhões de pessoas.[18] 1 6 Figura 2.2: Números de dispositivos móveis no mundo ano a ano, em bilhões. Fonte: Teleco [2]. Os recursos de comunicações móveis são, na grande maioria, destinados a serviços de envio de mensagens de texto (SMS), chamadas de voz e acesso básico a rede de dados (Internet). Neste cenário das comunicações móveis, o LTE vem sendo adotado como o próximo padrão de telefonia móvel pela maior parte das operadoras de telefonia celular. A Figura 2.3 mostra que, apesar de atualmente a maioria dos usuários de dispositivos móveis no mundo serem assinantes da tecnologia GSM, a tendência é que até 2020 a maioria utilize a tecnologia LTE. Figura 2.3: Projeção do números de assinantes globais em cada tecnologia, em milhões. Fonte: 5G Americas [3]. 7 No Brasil, também é visível o crescimento acelerado das comunicações móveis. A tecnologia LTE vem surgindo para suprir a demanda dos usuários por serviços móveis sempre com taxas de transmissão de dados cada vez maiores, pois as tecnologias 2,5G e 3G utilizadas pelas operadoras brasileiras não conseguem oferecer serviços de qualidade aos clientes em função das limitações de taxa de transferência de dados. Atualmente o Brasil é o quinto maior mercado do mundo em telefonia celular, conforme indicado na tabela 2.1. Até 2014, cerca de 40% dos dispositivos ainda utilizavam a tecnologia 2G, enquanto apenas 2% destes usavam a tecnologia 4G. Seguindo a tendência mundial, a projeção é que até 2019 a porcentagem de acessos 4G suba para 47,5% e a de acessos 2G caia para 11%, como mostra os gráficos da Figura 2.4. Tabela 2.1: Principais mercados de celular no mundo, em milhões. Fonte: Teleco [2]. Ranking 1 2 3 4 5 6 7 País China Índia EUA Indonésia Brasil Rússia Japão 2008 641 347 270 141 152 188 110 2009 747 525 286 159 174 208 115 2010 859 752 296 220 203 215 121 2011 986 894 316 237 242 228 130 2012 1.112 865 326 281 262 231 138 2013 1.229 886 336 304 271 243 146 2014 1.286 944 355 319 281 221 153 MAno 4,6% 6,5% 5,8% 4,9% 3,6% -9,1% 4,6% Figura 2.4: Projeção para os acessos móveis no Brasil. Fonte: 5G Americas [4]. 2.1.3 Características do UMTS O UMTS usa a técnica de múltiplo acesso WCDMA (Wideband Code Division Multiple Access) como interface de rádio, pois necessita de uma banda larga com alta capacidade. Ela utiliza um canal de rádio portador de 5 Mhz, e aperfeiçoa a 8 utilização dessa banda, apresentando menor custo por bit transmitido. Isso o torna melhor adaptado para a realização múltiplos serviços como internet móvel, e-mail, transferência de dados em alta velocidade, vídeo-chamada, multimídia, vídeo sobre demanda e streaming de áudio. Estes serviços de dados necessitam maior velocidade e menor tempo de atraso na transmissão de dados. Com as novas tecnologias HSPA, é possível atingir taxas de download e upload de 14,4 Mbits/s e 5,76 Mbits/s respectivamente. No WCDMA existe uma divisão lógica entre a rede de acesso de rádio, RAN (Radio Access Network - Rede de Acesso), que garante acesso sem fio do usuário em um ambiente móvel, e o de núcleo de rede, Core Network (Núcleo da Rede), que processa as chamadas de voz e conexão de dados, garantindo a conexão do usuário com outras redes de telecomunicações. Essa divisão é ilustrada na Figura 2.5. Figura 2.5: Divisão lógica da rede móvel em rede de acesso (RAN) e núcleo de rede (Core Network.) A Figura 2.6 mostra a topologia de uma rede UMTS. O primeiro bloco refere-se ao dispositivo do usuário, como um aparelho celular que possuiu seu próprio Sim Card (USIM - Universal Subscriber Identity Module). O segundo bloco refere-se a rede de acesso, onde a fim de garantir o investimento das operadoras, existe a compatibilidade do dispositivo e entre as redes 2G e 3G. Para o primeiro caso, a rede de acesso chama-se GERAN (GSM EDGE Radio Access Network ), que serve para as tecnologias GSM, GPRS e EDGE. No segundo caso, a rede se chamada UTRAN (UMTS Terrestrial Radio Access Network ), que garante o acesso para as tecnologias UMTS e HSPA. Por fim a rede se comunica com a Core Network, que possui o domínio PS (Packet Switched - Comutação por Circuitos) e o domínio CS (Circuit Switched - Comutação por Pacotes), sendo o primeiro responsável pelo acesso à internet e o segundo responsável por chamadas de voz. 9 Figura 2.6: Topologia UMTS. Fonte: Qualcomm Wireless Academy [5]. A Figura 2.7 detalha o funcionamento da UTRAN, que faz a interface entre o dispositivo móvel e a Core Network. Ela é composta de dois equipamentos principais, o Node-B e o RNC (Radio Network Controller ). O Node-B, ou estação móvel, desempenha funções de amplificação de sinal RF, modulação e codificação, e multiplexação/demultiplexação das informações dos usuários. É o equipamento da UTRAN que implementa a interface de comunicação sem fio com as unidades móveis. Cada Node-B tipicamente possuiu três setores de cobertura, a qual chamamos de célula. O RNC é um elemento que gerencia vários Node-Bs sendo responsável principalmente pelos procedimentos ligados à alocação de canais na interface aérea e a garantia da qualidade dos enlaces de RF.[5, 16, 19] Figura 2.7: UTRAN - UMTS Terrestrial Radio Access Network. Fonte: Qualcomm Wireless Academy [5]. A Figura 2.8 mostra o núcleo de uma Core Network. Pode-se observar que os domínios PS e CS ocorrem em paralelo na rede. A interface de um RNC com a Core 10 Network CS é chamada de Iu-CS, enquanto a interface de um RNC com a Core Network se chama de Iu-PS. No domínio PS existem dois elementos, SGSN (Serving GPRS Support Node) e GGSN (Gateway GPRS Support Node), que servem para prover serviços de dados comutados por pacotes à rede de telefonia móvel. O SGSN tem a função de roteamento e transferência de pacotes, conexão e desconexão de estações móveis, autenticações e gerenciamento lógico das conexões. O GGSN serve como interface para outra rede baseada em comutação de pacotes, como a internet. [5, 16, 17] No domínio CS destaca-se a MSC (Mobile Switching Center ), que tem tem as funções de comutação das chamadas de voz, gerência de mobilidade dos usuários, sinalização de conexão, entre outras. A MSC pode se conectar a uma rede de telefonia pública comutada (PSTN – Public Switched Telephone Network ), ou a uma rede digital com integração de serviços (ISDN – Integrated Service Digital Network ) por meio de uma ponte de rede, denominado GMSC (Gateway Mobile Switching Center ). Assim é possível realizar ligações entre telefonias fixas e móveis. [5, 16] Figura 2.8: Core Network. Fonte: Qualcomm Wireless Academy [5]. 2.1.4 Características do LTE A tecnologia LTE possui transmissão de dados de 100 Mbps para o downlink e de 50 Mbps para o uplink em uma banda de 20 MHz. Utiliza a técnica de transmissão OFDM (Orthogonal Frequency Division Multiple Access). A arquitetura do LTE é considerada mais simples que a da UMTS, como pode-se ser visto na Figura 2.9. A rede de acesso agora é chamada de E-UTRAN (Evolved Universal Terrestrial Radio Access) e o núcleo de rede de EPC (Evolved Packet Core). A E-UTRAN é caracterizada, basicamente, por dois requisitos: 11 (1) Suporte apenas para comutação de pacote (não existindo mais o domínio CS) (2) Baixa latência Para atingir esses requisitos foi necessário diminuir os elementos de rede, pois assim o processamento com relação aos protocolos de rede é menor, assim como é menor o custo com testes e interfaces. Com isso a rede de acesso contém apenas os eNode-Bs (Evolved Nodeb-B), que incorpora as funções que RNC e Node-B tinham na rede UTRAN. Pode-se notar ainda que um eNode-B também se comunica diretamente com outros eNode-Bs. [16] Figura 2.9: Arquitetura E-UTRAN. 2.2 Conceitos de KPI KPI é um indicador chave, utilizado para medir o desempenho dos processos de uma iniciativa, estratégia ou negócio de uma empresa e, com essas informações, colaborar para que alcance seus objetivos. Esse indicador deve ser quantificável por meio de um índice (normalmente representado por um número) que retrate o andamento do processo como um todo ou em parte. KPIs não são exclusividade de telecomunicações ou da área tecnológica, podendo existir KPIs financeiros ou econômicos. Nesses casos é de suma importância definir e escolher qual indicador usar para que esteja ligado ao objetivo do processo. Neste trabalho usaremos os KPIs mais utilizados e já definidos na documentação oficial da empresa de comunicações [14], que são comumente usados para monitorar e avaliar o funcionamento da uma rede de telefonia celular, além de monitorar o tráfego de rede, monitorar a distribuição de recursos e facilitar a expansão da rede e otimização. Na grande maioria dos casos esses KPIs estão diretamente ligados à qualidade da rede, no entanto alguns KPIs são criados com a finalidade de retratar, ou melhor, tentar retratar a experiência do usuário ou qualidade do serviço. 12 KPIs são, geralmente, computados por fórmulas e não dados brutos. As fórmulas normalmente não são iguais para operadoras de telefonia diferentes. Como exemplo temos uma fórmula para o KPI Acessibilidade RRC : RRC.SuccConnEstab.OrgConvCall + RRC.SuccConnEstab.OrgStrCall + RRC.SuccConnEstab.OrgInterCall + RRC.SuccConnEstab.OrgBkgCall +RRC.SuccConnEstab.OrgSubCall + RRC.SuccConnEstab.T mConvCall + RRC.SuccConnEstab.T mStrCall + RRC.SuccConnEstab.T mItrCall 100× RRC.AttConnEstab.OrgConvCall + RRC.AttConnEstab.OrgStrCall + RRC.AttConnEstab.OrgInterCall + RRC.AttConnEstab.OrgBkgCall +RRC.AttConnEstab.OrgSubCall + RRC.AttConnEstab.T mConvCall + RRC.AttConnEstab.T mStrCall + RRC.AttConnEstab.T mItrCall Onde: OrgConvCall = Originating Conversational Call OrgStrCall = Originating Streaming Call OrgInterCall = Originating Interactive Call OrgBkgCall = Originating Background Call OrgSubCall = Originating Subscribed traffic Call TmConvCall = Terminating Conversational Call TmStrCall = Terminating Streaming Call TmItrCall = Terminating Interactive Call Os elementos que fazem parte da fórmula são os contadores, ou dados de desempenho, retirados dos servidores da empresa. Pode-se observar que a fórmula usa o conceito Sucessos/T entativas. Também é possível usar o conceito [(T entativas − F alhas)/T entativas] que exprime a mesma realidade. Os KPIs escolhidos para o desenvolvimento do trabalho são divididos em grupos, conforme a documentação oficial da empresa [14]. São estes: • Acessibilidade (do inglês, Accessibility): Capacidade do usuário para obter o serviço de chamada, seja de voz (domínio CS) ou dados (domínio PS). Podemos dividir uma chamada em duas partes simples: a sinalização (ou controle) e os dados (ou informação). Já adiantando um dos principais conceitos, podemos entender o RRC (Radio Resource Control ) como responsável pela parte de controle, e o RAB (Radio Access Bearer ) como responsável pela parte da informação. [20] 13 – RRC Setup Succcess Ratio: Mede a taxa de sucessos (em %) de conexões RRC para chamadas de voz, streaming, chamadas de emergência, chamadas de espera, etc. Note que uma conexão RRC apenas não é suficiente para estabelecimento desses serviços de chamada. – CS RAB Setup Success Ratio (apenas para tecnologia UMTS): Mede a taxa de sucessos (em %) de conexões RAB para chamadas de voz e streaming no domínio CS da Core Network. Só é possível estabelecer uma conexão RAB após o estabelecimento de uma conexão RRC. – PS RAB Setup Success Ratio (apenas para tecnologia UMTS): Mede a taxa de sucessos (em %) de conexões RAB para chamadas de voz e streaming no domínio PS da Core Network. – E-RAB Setup Success Rate (apenas para tecnologia LTE): Mede a taxa de sucessos (em %) de conexões E-RAB (Evolved Radio Access Bearer ) para todos os serviços de rádio ou VoIP (Voice over Internet Protocol ). Só é possível estabelecer uma conexão E-RAB após o estabelecimento de uma conexão RRC. – HSDPA RAB Setup Success Ratio (apenas para tecnologia UMTS): Mede a taxa de sucessos (em %) de conexões RAB para serviços que utilizam a tecnologia HSDPA, no domínio PS. • Disponibilidade (do inglês, Availability): Indica a disponibilidade dos serviços da rede. – Cell Unavailability duration: Mede a duração total do tempo (em segundos) que uma célula ficou indisponível na rede por causa de alguma falha no sistema. • Cobertura (do inglês, Coverage): Monitora as interferências das células e o uso de Soft Handovers em um RNC. – RTWP (Received Total Wideband Power ): Representa a medida do nível total de ruído (em dB) dentro da banda de frequência de uma célula. Está relacionada com a interferência de uplink, e a sua monitoração ajuda no controle de queda de chamadas - principalmente no domínio CS. (apenas para tecnologia UMTS). Em redes não congestionadas, o valor médio aceitável de RTWP é de -104.5 a -105.5 dBm. Valores muito abaixo indicam interferência de uplink na rede, conforme indica a Figura 2.10. – Soft Handover Overhead (apenas para tecnologia UMTS): Verifica o consumo da rede devido à Soft Handovers. 14 Figura 2.10: Valores típicos de RTWP. Fonte: telecomHall [6] • Mobilidade (do inglês, Mobility): Monitora as taxas de sucesso de vários tipos de handover. O conceito de sucesso de handover é manter a integridade de uma chamada em movimento, sem que haja interrupções. Isto é necessário porque o usuário pode mover-se (talvez com alta velocidade) e seria inconveniente se a chamada caísse quando o usuário mudasse de uma célula para outra. Em muitos casos, um usuário pode até entrar em uma área onde há cobertura da rede UMTS e terminar a mesma chamada sem interrupções em uma rede GSM / GPRS. – Softer Handover Success Ratio (apenas para tecnologia UMTS): Mede a taxa de sucesso (em %) de Softer Handover em um RNC, que consiste na transferência de chamada de uma célula para outra célula do mesmo Node-B. Figura 2.11: Softer Handover. Fonte: Teleco [7] – Soft Handover Success Ratio (apenas para tecnologia UMTS): Mede a taxa de sucesso (em %) de Soft Handover em um RNC, que consiste na 15 transferência de chamada de um Node-B para outro Node-B. Figura 2.12: Soft Handover. Fonte: Teleco [7] – Intra-frequency Hard Handover Success Ratio: Mede a taxa de sucesso (em %) do Intra-frequency Hard Handover Success, que ocorre quando a conexão com o Node-B atual é interrompida antes de ser conectada com um novo Node-B de mesma frequência. – Inter-frequency Hard Handover Success Ratio: Mede a taxa de sucesso do Intra-frequency Hard Handover Success, que ocorre quando a conexão com o Node-B atual é interrompida antes de ser conectar com um novo Node-B de outra frequência. Figura 2.13: Hard Handover. Fonte: Teleco [7] – W2G Inter-RAT Hard Handover Success Ratio: Mede a taxa de sucesso (em %) da transferência de chamada de um sistema UMTS para GSM ou vice-versa. A finalidades básica é manter a continuidade da chamada em sistema de borda de cobertura UMTS, transferindo assim a chamada sem interrupções para um sistema GSM ou de um GSM para um UMTS. 16 Figura 2.14: Inter-RAT Hard Handover. Fonte: Teleco [7] – L2W Inter-RAT Handover Out Success Rate: Mede a taxa de sucesso (em %) da transferência de chamada de um sistema LTE para UMTS ou vice-versa. – L2G Inter-RAT Handover Out Success Rate: Mede a taxa de sucesso (em %) da transferência de chamada de um sistema LTE para GSM ou vice-versa. • Capacidade de Retenção (do inglês, Retainability): Mede a capacidade do usuário de manter uma conexão estabelecida sem que esta seja finalizada de forma anormal. Comumente medimos a porcentagem de quedas nos serviços providos aos usuários, mas também é possível medi-la nos canais de sinalização. – CS Service Drop Ratio: Taxa de quedas de serviços CS na rede UTRAN. – PS Call Drop Ratio: Taxa de quedas de chamadas PS na rede UTRAN. • Integridade de Serviço (do inglês, Service Integrity): Indica principalmente a capacidade da taxa de transferência em cada célula e qualidade de serviço na rede. – HSDPA Throughput: Indica a média de downlink throughput (taxa de transferência, em kbit/s) em uma célula. – HSUPA Throughput: Indica a média de uplink throughput (taxa de transferência, em kbit/s) em uma célula. • Tráfego (do inglês, Traffic): Mede o tráfego da rede, quantidade de dados e de usuários. 17 – HSDPA RLC Traffic Volume: Fornece o total em bytes de downlink de todos os tipos de serviços em uma célula. – HSUPA RLC Traffic Volume: Fornece o total em bytes de uplink de todos os tipos de serviços em uma célula. – Number of HSDPA Users: Fornece a quantidade total e a quantidade média de usuários usando a tecnologia HSDPA. – Number of HSUPA Users: Fornece a quantidade total e a quantidade média de usuários usando a tecnologia HSUPA. Os contadores e fórmulas usadas para cálculo desses KPIs podem ser encontrados na documentação oficial da empresa. Os KPIs apresentados no trabalho são geralmente os padrões que as empresas utilizam para análise de uma rede de telefonia, mas é possível também definir um KPI personalizado para uma operadora, sabendo que contadores usar e qual a metodologia para o seu cálculo. 2.3 Conceitos de BI O termo Business Intelligence (BI), inteligência de negócios, refere-se ao processo de coleta, organização, análise, compartilhamento e monitoramento de informações que oferecem suporte à gestão de negócios. É o conjunto de teorias, metodologias, processos, estruturas e tecnologias que transformam uma grande quantidade de dados brutos em informação útil para tomadas de decisões estratégicas. [21] Pode-se resumir da definição anterior que BI é um sistema capaz de transformar uma quantidade de informação em informações realmente úteis para uma rápida visualização dos objetivos propostos. Esse conceito será utilizado no trabalho, quando dados provenientes de fontes dispersas serão transformados com o objetivo de gerar KPIs das redes de telecomunicações. A Figura 2.15 mostra a arquitetura tecnológica de um BI, onde é possível verificar a existência de fontes externas ou internas contendo os dados desejados, podendo essas fontes serem arquivos em diversos formatos ou outros bancos de dados. Pode-se observar também a existência de um processo ETL para carga dos dados em uma Data Warehouse. Por fim, informações presentes em Data Marts serão analisadas pelos usuários de um sistema BI através de aplicações Front-End. No caso deste trabalho, através de dashboards. 18 Figura 2.15: Arquitetura tecnológica de um BI. [8] Cada um dos conceitos usados em BI será melhor explicado a seguir: 2.3.1 ETL A sigla ETL significa Extração, Transformação e Carga (em inglês Extract, Transform and Load ) e visa trabalhar com toda a parte de extração de dados de fontes externas, transformação para atender às necessidades de negócios e carga dos dados dentro do Data Warehouse.[22] ETL é uma das etapas mais importantes do projeto, sendo necessária bastante atenção na integridade dos dados a serem carregados em um Data Warehouse. Existem estudos que indicam que o ETL e as ferramentas de limpeza de dados consomem cerca de 70% dos recursos de desenvolvimento e manutenção de um projeto de Data Warehouse.[12] A Figura 2.16 apresenta cada uma das etapas do ETL que serão descritas a seguir: Figura 2.16: Estrutura do ETL. [9] 19 Extração É a coleta de dados dos sistemas de origem, que podem ser outras bases de dados relacionais ou arquivos, extraindo-os e transferindo-os para a staging area (área de transição ou área temporária), onde o processo de ETL pode operar de forma independente. Transformação É nesta etapa que são realizados os devidos ajustes dos dados extraídos, aplicando uma série de regras ou funções para assim melhorar a qualidade dos dados e consolidar dados de duas ou mais fontes. Algumas fontes de dados necessitarão de muito pouca manipulação de dados. Em outros casos, diversos tipos de transformações são feitas para atender as regras do negócio. [9, 22] Carga Consiste em carregar os dados para dentro do Data Warehouse. Dependendo das necessidades da organização, o tempo de execução deste processo pode variar bastante, podendo ter dados atualizados semanalmente ou a cada meia hora. 2.3.2 Data Warehouse É um depósito de dados é utilizado para armazenar, de forma consolidada, informações relativas às atividades de uma organização em bancos de dados. Nesse contexto, o Data Warehouse possibilita a confecção de relatórios, a análise de grandes volumes de dados históricos, permitindo uma melhor análise de eventos passados, oferecendo suporte às tomadas de decisões estratégicas que podem facilitar a tomada de decisão. Por definição, os dados em um Data Warehouse não são voláteis, ou seja, eles não mudam, salvo quando é necessário fazer correções de dados previamente carregados. Fora de um caso específico os dados estão disponíveis somente para leitura e não podem ser alterados. Os Data Warehouse surgiram como conceito acadêmico na década de 1980. Com o amadurecimento dos sistemas de informação empresariais, as necessidades de análise dos dados cresceram paralelamente. Nesse contexto, a implementação do Data Warehouse passou a se tornar realidade nas grandes corporações. O mercado de ferramentas de Data Warehouse, que faz parte do mercado de Business Intelligence, cresceu então, e ferramentas melhores e mais sofisticadas foram desenvolvidas para apoiar a estrutura do Data Warehouse e sua utilização. 20 Como principais requisitos para um Data Warehouse bem elaborado, pode-se destacar: [22] • Tornar a informação facilmente acessível. O Conteúdo do Data Warehouse deve ser intuitivo e de fácil entendimento para o usuário (não apenas para o desenvolvedor). • Apresentar informações consistentes. Informação consistente significa informação de alta-qualidade. Significa que todos os dados são relevantes, precisos e completos. Os dados apresentados devem ser confiáveis e íntegros. • Adaptável e flexível à mudanças. As necessidades dos usuários, os dados e as condições do negócio vão mudar com o passar do tempo, então é preciso que o Data Warehouse esteja apto a endereçar novas questões, novas necessidades sem que se perca todo o trabalho realizado. • Auxiliar no processo de tomada de decisão e ser aceito pela comunidade de negócios. De nada adianta um Data Warehouse com milhões de dados que não tragam os indicadores necessários para a tomada de decisão da empresa. Um dos maiores problemas no desenvolvimento do Data Warehouse é a compreensão dos dados, onde as dimensões devem ser definidas conforme a necessidade de visualização do usuário. Pode-se armazenar grandes quantidades de informação, sendo o modelo mais utilizado conhecido como modelagem multidimensional. Apesar de bastante utilizado, não existe um padrão na indústria de software para o armazenamento de dados. Existem, na verdade, algumas controvérsias sobre qual a melhor maneira para estruturar os dados em um Data Warehouse.[23, 24] Neste trabalho não será usada a modelagem multidimensional, pois acredita-se que isso atrasaria a carga dos dados e aumentaria tempo de latência. Porém a modelagem multidimensional não está descartada em trabalhos futuros. 2.3.3 Data Marts O Data Warehouse é normalmente acedido através de Data Marts, que é uma estrutura similar ao do Data Warehouse, porém com uma proporção menor de informações. Trata-se de um subconjunto de informações do Data Warehouse que podem ser identificadas por assuntos ou departamentos específicos. Por exemplo: um Data Mart financeiro poderia armazenar informações consolidadas dia-a-dia para um usuário gerencial e em periodicidades maiores (semana, mês, ano) para um usuário no nível da diretoria. Um Data Mart pode ser composto por um ou mais cubos de dados. [9, 23] 21 2.3.4 Dashboard Na tradução simples um dashboard é um painel de indicadores, com seus principais indicadores e gráficos compilados em um único painel de fácil acesso, manuseio e visualização. O dashboard organizará e apresentará melhor os conteúdos informativos, dando a eles um design mais profissional e interativo. Todo resultado apresentado será mais facilmente analisado possibilitando uma melhor tomada de decisões. [25] 22 Capítulo 3 Solução implementada O escopo da ferramenta desenvolvida no trabalho, conforme descrito na seção 1.4, é criar dashboards com os principais KPIs de redes de telefonia que utilizam as tecnologias 3G e 4G. Ela possui somente a interface de usuário, que irá interagir apenas com a interface web. Este capítulo descreve a arquitetura do trabalho e suas funcionalidades na seção 3.1. Na seção 3.2 serão apresentadas as ferramentas e tecnologias utilizadas no trabalho e alguns dos motivos de suas escolhas. 3.1 Arquitetura do Sistema A Figura 3.1 apresenta a arquitetura geral do sistema, mostrando como se encontram divididas as principais etapas do trabalho. Pode-se observar a presença de servidores externos onde arquivos contendo os dados necessários serão extraídos, transformados e carregados em um Data Warehouse (que na arquitetura do sistema, fica dentro do Servidor de Dados), que é justamente o processo de ETL descrito na seção 2.3.1 da fundamentação teórica. A seguir será realizada uma descrição de cada uma dessas etapas. 23 Figura 3.1: Arquitetura do Sistema. 3.1.1 Servidores Externos São elementos que fazem parte da rede de móvel que irão prover os dados necessários ao sistema. O trabalho foi desenvolvido usando os servidores externos da empresa Huawei, mas poderiam ser usados os de qualquer outra empresa de telecomunicações que possua os dados de performance e configuração de redes de telefonia celular. 24 A solução da Huawei para gerenciar redes móveis se chama EMS (Element Management System), uma plataforma de gerenciamento para suportar operadoras de telecomunicações com uma única interface para as diversas tecnologias existentes, os modelos disponíveis são conhecidos como M2000 e U2000. O sistema opera de uma forma cliente-servidor e a estrutura do hardware geralmente é composta por servidores, clientes, alarm-boxes dedicados e outros dispositivos dedicados de rede como arrays de discos, roteadores, etc. A Figura 3.2 mostra como se organiza a estrutura do EMS. Figura 3.2: Estrutura do EMS. O trabalho utiliza três servidores do EMS para a rede UMTS, chamados de ATAE, 15 e 40. Já para a rede LTE utiliza apenas um servidor, chamado de 10. Cada servidor da rede UMTS possui um conjunto de RNCs, conforme indica a tabela 3.1, em um total de 43 RNCs. 25 Tabela 3.1: RNCs disponíveis em cada um dos servidores do EMS Servidor 15 40 ATAE RNC RNCMG01 RNCMG02 RNCMG03 RNCMG04 RNCMG05 RNCMG06 RNCMG07 RNCMS01 RNCMS02 RNCMS03 RNCMT02 RNCRO01 RNCTO01 RNCAL01 RNCBA01 RNCBA02 RNCBA03 RNCBA04 RNCBA05 RNCCE01 RNCCE02 RNCPB01 RNCPE01 RNCPE02 RNCPE04 RNCPI01 RNCPI02 RNCRN01 RNCAC01 RNCDF02 RNCDF03 RNCDF04 RNCES01 RNCGO01 RNCGO04 RNCGO05 RNCPR01 RNCPR02 RNCPR03 RNCPR04 RNCPR05 RNCSC01 RNCSC02 26 Através da tabela 3.1 pode-se perceber que a nomenclatura de cada RNC segue o padrão {RNC}{UF}{Numeração com dois algarismo}, sendo possível determinar o estado do Brasil onde se encontra um RNC através do UF (Unidade da Federação). Cada um dos três servidores possui seu endereço IP (Internet Protocol - Protocolo de Internet) onde é possível conectar-se através de uma interface FTP (File Transfer Protocol - Protocolo de Transferência de Arquivos) e extrair os arquivos de configuração (contendo diversas informações como a quantidade de Node-Bs e células que um RNC possui, em qual frequência cada célula se encontra, em qual bairro ou cidade uma célula está localizada, etc.) e de performance nos formatos XML (eXtensible Markup Language - Linguagem de Marcadores Extensível). Os arquivos de performance contém contadores em amostras de 15, 30 ou 60 minutos de diversos tipos de famílias, como as famílias com contadores de conexões RRC e RAB, as de medidas dos diversos tipos de handover, as de medidas de tráfego, etc. Esses contadores são usados para cálculos dos KPIs, conforme dito na seção 2.2. 3.1.2 Implementação do ETL O conceito de ETL introduzido na seção 2.3.1 foi implementado no trabalho conforme o Diagrama de Fluxos da Figura 3.3. É importante ressaltar que antes de se iniciar o processo é necessário atender os seguintes pré-requisitos: • Tabelas de todas as famílias de contadores tenham sido criadas no Banco de Dados • Uma tabela de log de todos os arquivos baixados tenha sido criada no Banco de Dados Em seguida será detalhada cada etapa do processo ETL, dando exemplos práticos para o seu melhor entendimento. 27 Figura 3.3: Diagrama de Fluxos do Processo de ETL. 28 Extração Arquivos de desempenho e configuração são baixados dos servidores EMS, onde apenas os arquivos de performance contendo as famílias dos contadores usados no trabalho para os cálculos dos KPIs serão extraídos. Para a rede UMTS isso significa um total de 29 famílias, enquanto para a tecnologia LTE são extraídos arquivos para 11 famílias de contadores. Das 29 famílias de contadores da rede UMTS, 27 são disponíveis em amostras de 30 minutos e duas em amostras de 60 minutos. Para a rede LTE, todas as famílias baixadas são de contadores com amostras de 60 minutos. A informação de cada arquivo baixado é armazenada em uma tabela de log no Banco de Dados para que durante esta etapa seja feita uma verificação de quais arquivos já foram baixados, a fim de evitar downloads desnecessários. Os arquivos baixados estão todos no formato XML. O XML é uma linguagem de programação de marcadores como a HTML e foi desenhada para descrever dados, com a grande vantagem de que é extensível , ou seja, pode-se criar as suas próprias tags, assim sendo ela é uma linguagem auto definível. O XML possui estrutura em árvore, contendo elementos da raiz (pai), elementos filhos e assim por diante. Usando a estrutura de árvore, pode-se conhecer todos os ramos que partem da raiz. [12, 26] XML é muito usado para a transferência de dados. A desvantagem do formato XML é que com uma grande quantidade de dados em uma mesma estrutura, podese gerar um arquivo extremamente complexo e ineficiente para ser carregado em uma base de dados. A Figura 3.4 mostra um exemplo de um arquivo XML usado no trabalho para uma família com contadores de RRC da rede UMTS, aberto em um editor de texto. O objeto <cbt> destacado na quarta linha contem a data da amostra com os valores do ano, mês, dia e hora. O objeto <gp> destacado na nona linha contem o intervalo da mostra em minutos, no caso de 30 minutos. Os demais objetos a partir da décima linha possuem os nomes dos contadores. 29 Figura 3.4: Exemplo de um arquivo XML contendo uma família com contadores de RRC. A linha 156 do mesmo arquivo possui o objeto <moid>, contendo as informações do nome e identificador de uma célula, e qual seu RNC, conforme destacado na Figura 3.5. Abaixo do objeto estão os valores que os contadores dessa célula recebem. Toda a rede UMTS possui aproximadamente 46 mil células. Figura 3.5: Objeto de um arquivo XML contendo o nome de um RNC, e o nome e identificador de uma célula. 30 A Figura 3.6 mostra agora um exemplo do objeto <moid> para a rede LTE, contendo então o nome e identificador de um eNode-B, e o nome e identificador de uma célula. A rede LTE possui aproximadamente 8.500 células. Figura 3.6: Objeto de um arquivo XML da rede LTE contendo o nome e identificador de um eNode-B, e o nome e identificador de uma célula. Transformação Como dito anteriormente, arquivos XML muito grandes acabam se tornando ineficientes para serem carregados em um Data Warehouse. Pensando nisso, a segunda etapa do processo ETL é dividida em duas partes, sendo a primeira a conversão do arquivo do formato XML para CSV (Comma-separated values) e a segunda a transformação desse arquivo para o mesmo formato da sua respectiva tabela no Banco de Dados, comumente chamada de parser. Antes da primeira conversão é necessário validar o arquivo XML para garantir sua integridade, evitando erros de arquivos danificados ou mal-baixados. A conversão do arquivo XML para planilhas no formato CSV faz com que o arquivo fique mais leve e fácil de ser manipulado, além de ser muito mais inteligível para o usuário. Em média, um arquivo convertido para CSV fica 70% menor que o original em XML.1 Com isso, a carga de um arquivo no formato CSV no Banco de Dados é muito mais rápida do que de um arquivo XML. Para se ter uma ideia mais precisa da vantagem de um arquivo CSV, foram testados dois cenários: o primeiro comparando o tempo de carga de um arquivo XML com o tempo das etapas de transformação, parser e carga de um arquivo CSV em uma base de dados vazia; o segundo faz a mesma comparação, mas para uma base de dados já povoada. A Figura 3.7 mostra que, para o primeiro cenário, a carga do arquivo XML de 26 MB demorou aproximadamente 13 segundos, enquanto todas as etapas para o arquivo CSV demoraram aproximadamente 11 segundos. O segundo cenário é apresentado na Figura 3.8, onde o mesmo arquivo XML demorou aproximadamente 37 segundos e as etapas com o arquivo CSV próximo dos 14 segundos. O arquivo XML do exemplo anterior tinha 26 MB, ficando com 8 MB após a conversão para CSV. 1 31 Figura 3.7: Tempo de carga em uma base de dados vazia, em segundos. Figura 3.8: Tempo de carga em uma base de dados já populada, em segundos. O arquivo do exemplo anterior após a conversão é mostrado na Figura 3.9, aberto no Excel. Em vez de tags e objetos, a nova estrutura é formada por linhas e colunas em que os cabeçalhos são CBT, GP, MOID e os contadores daquela família. Figura 3.9: Arquivo do exemplo anterior após a conversão para uma planilha em CSV. 32 A segunda etapa da conversão consiste em ajustar os campos da coluna CBT para data no formato padrão do Banco de Dados (ano-mês-dia hora:minuto), quebrar os campos da coluna CBT em várias colunas e ordenar todas as colunas para o mesmo formato da sua tabela correspondente no Banco de Dados. Essa etapa também elimina cabeçalhos e os dados de contadores que não estão sendo utilizados, diminuindo o tamanho do arquivo e fazendo com que a carga para dentro do Data Warehouse se torne mais rápida. O formato das tabelas no Banco de Dados para as famílias de contadores por RNC segue o padrão da tabela 3.2, contendo sempre as mesmas cinco primeira colunas no cabeçalho (RNC, Cellname, CellID, Datetime e GP) e os contadores nas colunas restantes. Tabela 3.2: Exemplo de uma tabela de uma família de contadores por RNC. RNC RNCAC01 ... RNCSC02 Cellname UACABL01A ... USCTIO02G Cellid 63096 ... 64843 Datetime 2016-06-01 00:00 ... 2016-06-01 23:30 GP 30 ... 30 ... ... ... ... Continuando com os exemplos anteriores, a Figura 3.10 mostra o arquivo anterior após o parser, aberto no Excel. Foi tirado o cabeçalho e agora existem colunas novas e reordenadas seguindo o modelo da tabela 3.2. Notam-se também colunas com todos os campos em branco, indicando que essa família possui contadores que não estão sendo utilizados no trabalho. Figura 3.10: Arquivo do exemplo anterior após o parser. 33 Para famílias com contadores por Nodeb-B, o padrão seguido é o da tabela 3.3. Neste trabalho existem duas famílias desse tipo, ambas com amostragem de uma hora (exatamente por isso a coluna GP possui valor igual a 60). Tabela 3.3: Exemplo de uma família com contadores por Node-B Nodeb CBA0036S ... WTOTAQ08 Locell 0 ... 2 Datetime 2016-06-01 00:00 ... 2016-06-01 23:30 GP 60 ... 60 ... ... ... ... A tabela 3.4 mostra um exemplo para uma família do LTE, possuindo sempre as mesmas cinco primeiras colunas (eNodebID, eNodeb, Locall Cell, Cellname,Datetime e GP) com contadores em amostras de uma hora. Tabela 3.4: Exemplo de uma família de contadores do LTE eNodebid 270016 ... 880216 eNodeb EESCAR01 ... ECESOL12 LoCellid 0 ... 2 Cellname EESCAR01A ... ECESOL12C Datetime 2016-06-01 00:00 ... 2016-06-01 23:30 GP 60 ... 60 ... ... ... ... Carga dos Dados Após os arquivos passarem pelo processo de transformação, já é possível ser feita a carga destes no Data Warehouse. Quando os dados são carregados no Banco de Dados acabam ocupando um maior volume do que quando estavam no formato de arquivo CSV, conforme mostra a Figura 3.11. Porém é importante ressaltar que existem grandes vantagens de utilizar uma base de dados, das quais pode-se destacar a resposta mais rápida a consultas e manipulação dos dados. 34 Figura 3.11: Volume de dados por arquivo (MB). Dados de configuração ficam armazenados no Banco de Dados para consultas, sendo atualizados diariamente. Os dados de performance por sua vez precisam passar por mais uma etapa, onde ocorrerá o processamento dos dados para os cálculos dos KPIs das redes UMTS e LTE. Processamento dos Dados A Figura 3.12 apresenta o diagrama de fluxos do processamento dos dados da ferramenta. É feita sempre uma verificação periódica se todos arquivos de performance que foram carregados para alguma meia hora. 35 Figura 3.12: Diagrama de Fluxos do Processamento dos Dados. 36 Com meias horas completas, já é possível começar a calcular os indicadores de 30 minutos por célula e RNC mencionados na seção 2.2. Os dados dos indicadores calculados são armazenados em tabelas no Banco de Dados. Ao final de um dia espera-se que todos os KPIs das 48 meia horas do dia já tenham sido calculados para rede UMTS, assim como os KPIs das 24 horas do dia para rede LTE. Então são calculados outros indicadores diários, tais como: • Cálculos dos indicadores diários por célula, agregando também por região, por RNC e por cidade. Cada cálculo é armazenado em sua tabela correspondente no Banco de Dados. • Cálculos dos ofensores diários. Neste caso são ranquedas as piores células diárias (em geral, as com maior quantidades de falhas) por RNC, cidade e regional, e é feita a previsão de quanto cada KPI irá melhorar quando corrigidas essas falha. • Cálculo de outros KPIS customizáveis, não presentes na seção 2.2, asism como seus ofensores. Ao término de uma semana, as mesmas agregações dos indicadores diários também são feitas para semana que passou. 3.1.3 Aplicação MVC MVC (Model, View, Controller ) é a modelagem padrão usada para comunicação entre a interface web e o Banco de Dados. Essa arquitetura é muito utilizada em Engenharia de Sofware, onde é possível dividir tarefas, garantindo que cada camada da aplicação tenha seu próprio escopo e definição e que a comunicação entre todas elas se dê de maneira eficiente e controlada. Em aplicações que enviam um conjunto de dados para o usuário, o desenvolvedor, frequentemente, separa os dados (Model ) da interface (View ). Desta forma, alterações feitas na interface não afetam a manipulação dos dados, e estes podem ser reorganizados sem alterar a interface do usuário. O Model-View-Controller resolve este problema através da separação das tarefas de acesso aos dados e lógica do negócio da apresentação e interação com o usuário, introduzindo um componente entre os dois: o Controller. [10, 27] A arquitetura MVC é apresentada na Figura 3.13, onde é possível visualizar a divisão de cada uma das camadas descritas a seguir: 37 Figura 3.13: Arquitetura MVC. Fonte: CodeIgniter Brasil [10]. Descrição da camada de Visão (do inglês, View ) Nesta camada estão as telas do sistema que fazem as interfaces com o usuário. É a apresentação, é o que aparece, é o que é visualizado por quem usa o sistema. É no View que as informações, sejam elas quais forem e de qual lugar tenha vindo, serão exibidas para a pessoa. No caso do trabalho, essas informações são exibidas através de dashboards. Essa camada possui além da definição da interface, controladores para a correta manipulação da tela em questão. Tratam corretamente tanto o envio quanto a apresentação de dados. Descrição da camada de Modelo (do inglês, Model ) Esta camada representa os dados da aplicação e as regras do negócio que governam o acesso e a modificação dos dados. É esta camada que manipula as estruturas de dados e realiza a conexão com o Banco de Dados. É somente no Model que as operações de CRUD (Create, Read, Update, Delete) devem acontecer. Descrição da camada de Controle (do inglês, Controller ) Como sugere o nome, camada de controle é responsável por controlar todo o fluxo do programa, a ligação da camada Model com a camada View. É o “cérebro” 38 e o “coração” do aplicativo, quem define o comportamento da aplicação, é ela que interpreta as ações do usuário e as mapeia para chamadas do modelo. No controller é definido desde o que deve ser consultado no Banco de Dados à tela que vai ser exibida para quem usa o programa. 3.2 3.2.1 Materiais e Métodos Infra-estrutura Para o ambiente de desenvolvimento foram utilizados dois computadores com sistema operacional Linux, distribuição Debian 8.1. O primeiro deles foi usado para o servidor de arquivos conforme indicado na Figura 3.1, com um processador Intel Core i7, com 8 GB de memória RAM e disco rígido com capacidade de armazenamento de 500 GB. O segundo foi usado para o servidor de dados, com um processador Intel Core i5, com 8 GB de memória RAM e disco rígido de 1,5 TB. 3.2.2 Ferramentas utilizadas Segundo Kimball [12], para o uso de um processo de ETL pode-se utilizar ferramentas pagas existentes no mercado ou desenvolver todo o código do programa através de uma ou mais linguagens de programação. Para o autor, uma das vantagens da ferramenta paga é a sua rapidez (não é preciso perder tempo desenvolvendo todo o código), robustez (um programa já bastante testado e consolidado no mercado tende a ter menos erros) e facilidade no uso (geralmente acompanha um manual para o usuário, não sendo necessário que o mesmo tenha um amplo conhecimento em programação). Já o segundo método permite uma maior flexibilidade do processo, afinal utilizando linguagens de programação pode-se desenvolver programas com inúmeras possibilidades e menos custosos computacionalmente (desde que sejam escritos códigos que façam somente o estritamente necessário para o projeto). Inicialmente no projeto foi utilizado o Pentaho para o processo de ETL, um sofware de BI desenvolvido em Java. [28] Depois foram desenvolvidos programas escritos nas linguagens Python e Shell Script para realizarem o processo, havendo um ganho considerável de desempenho, o que se encontra de acordo com a teoria de Kimball. Para gerenciar o Banco de Dados, foi usado o software PostgreSQL. É também no PostgreSQL que foram desenvolvidas funções na linguagem PL/SQL (Procedural Language/Structured Query Language) para cálculos dos KPIs. Já para a aplicação MVC, foi utilizado o framework PHP CodeIgniter. O servidor web utilizado é baseado em tecnologia Apache e opera sob o sistema operacional Linux. 39 Essas e as demais ferramentas utilizadas no trabalho serão descritas a seguir: Python Python [29] é uma linguagem de programação de altíssimo nível, de sintaxe moderna, interpretada, orientada a objetos, com tipagem forte (não há conversões automáticas) e dinâmica (não há declaração de variáveis e elas podem conter diferentes objetos) e multiplataforma. Sua primeira versão foi lançada em 1991, e a versão mais recente (3.4.1) foi lançada em maio de 2014. Atualmente possui um modelo de desenvolvimento comunitário e aberto. [30] A linguagem foi projetada com a filosofia de enfatizar a importância do esforço do programador sobre o esforço computacional. Prioriza a legibilidade do código sobre a velocidade ou expressividade. Combina uma sintaxe concisa e clara com os recursos poderosos de sua biblioteca padrão e por módulos e frameworks desenvolvidos por terceiros. A grande motivação para o uso do Python no trabalho foi o fato da linguagem ser multiplataforma e ser atualmente a quarta linguagem mais usada no mundo [31], fazendo com que haja muito material disponível na internet para realizar consultas e tirar dúvidas. A etapa do processo ETL do trabalho que executa a extração dos dados foi desenvolvida em Python usando a biblioteca ftplib [32], que implementa um servidor FTP. A etapa que faz o parser dos arquivos também foi desenvolvida em Python, utilizando a biblioteca csv [33]. Para a conexão com o PostgreSQL, foi usada a biblioteca psycopg [34]. Shell Script O Shell Script é uma linguagem simples e que não precisa ser compilada para executar as tarefas, ou seja, ela é interpretada diretamente pelo shell. É usada em vários sistemas operacionais, com diferentes dialetos, dependendo do interpretador de comandos utilizado. O interpretador de comandos usado no trabalho é o bash [35], disponível na grande maioria das distribuições GNU/Linux. Diversos scripts em Shell foram desenvolvidos no trabalho, para todas as etapas do ETL e também para os cálculos dos KPIs. Inclusive os programas em Python descritos anteriormente são executados por scripts em Shell, que antes verificam se o programa já está em execução através do comando pgrep e também possibilitam que vários scripts rodem em paralelo através da ferramenta GNU Parallel, a próxima a ser descrita. 40 GNU Parallel GNU Parallel [36] é uma ferramenta de código aberto que possibilita a execução de vários processos em paralelo, tanto no mesmo computador, quanto em computadores diferentes. Ela foi utilizada no trabalho para rodar em paralelo scripts em Shell e em Python. A execução é feita usando o comando parallel, podendo opcionalmente ser passado como parâmetro a quantidade de processos que deseja-se serem executados em paralelo. Por padrão, o número de processos executados em paralelo é o mesmo da quantidade de núcleos do processador. Saxon Saxon [37] é um processador XSLT (eXtensible Stylesheet Language for Transformation) OpenSource(Código Aberto) desenvolvido na linguagem Java pela empresa Saxonica. Com ele é possível transformar arquivos no formato XML para os formatos CSV, texto ou HTML. O Saxon é executado por linha de comando, devendo ter um ambiente Java habilitado para o seu funcionamento. O Saxon realiza a transformação de um arquivo XML para o formato CSV conforme o diagrama da Figura 3.14: Figura 3.14: Diagrama de um processador XSLT. Para o Saxon executar a transformação é preciso de um arquivo externo XSL contendo um código na linguagem XSLT. A linguagem XSLT serve justamente para transformar arquivos XML em qualquer outro formato, contendo uma sintaxe simples para quem já está familiarizado com a estrutura de um XML. No trabalho foi utilizado o programa Stylus Studio [38] para criar o template contendo o código XSLT necessário para a transformação. 41 Abaixo um exemplo do uso do Saxon para transformar uma fonte XML em um arquivo CSV: java -cp saxon9he.jar net.sf.saxon.Transform -t -s:fonte.xml \ -xsl:estilo.xls -o:arquivo.csv LibXML Antes de ser feita conversão do arquivo XML é necessário validá-lo para garantir sua integridade, conforme já havia sido indicado no diagrama de fluxos da Figura 3.3. Para que um documento XML seja validado é preciso usar a Definição do Tipo do Documento ou, originalmente, DTD (Document Type Definition). O propósito do DTD é definir uma construção de blocos válida para um documento XML, e ela define a estrutura do documento usando uma lista de elementos válidos. O DTD pode ser declarado dentro de um documento XML ou em um arquivo externo. [26] O DTD permite descrever cada marca e fornecer regras para interpretar cada informação usada em um arquivo XML. Para o trabalho foi usado um arquivo externo, apresentado na Figura 3.15: Figura 3.15: Arquivo DTD usado para validar um arquivo XML. Para fazer a validação do XML foi usada a libXML [39], uma ferramenta gratuita escrita na linguagem C que faz diversas análises de arquivos no formato XML. É 42 preciso colocar o arquivo DTD no diretório indicado no arquivo XML, e executar o comando xmllint, seguido da opção valid e do nome do arquivo: xmllint --valid arquivo.xml PostgreSQL PostgreSQL [40] é um sistema gerenciador de Banco de Dados relacional e orientado a objetos. Um de seus atrativos é ser otimizado para aplicações complexas, isto é, que envolvem grandes volumes de dados ou que tratam de informações críticas. Além disso, trata-se de um Banco de Dados versátil, seguro, com suporte a grande parte do padrão SQL, gratuito e de código aberto. [41] Entre suas características e funcionalidades, tem-se: • Compatibilidade multi-plataforma, ou seja, executa em vários sistema operacionais • Consultas complexas em SQL • Chaves estrangeiras • Integridade transacional • Gatilhos • Visões • Funções • Tipos de Dados • Operadores • Funções de agregação • Métodos de índice • Linguagens procedurais (PL/SQL, PL/Python, PL/Java, PL/Perl) A escolha do PostgreSQL como o gerenciador de Banco de Dados do trabalho foi devido ao fato de ser bastante otimizado para trabalhar com um grande volume de dados, tendo também bastante flexibilidade nas suas configurações de desempenho. Foram criadas diversas funções na linguagem PL/SQL para os cálculos dos KPIs e dos principais ofensores, que depois de armazenados podem ser chamados por linha de comando, passando opcionalmente parâmetros como data, cidade, RNC, etc. 43 A linguagem PL/SQL pode ser entendida como uma extensão da linguagem SQL, adicionada de funcionalidades que a tornam uma linguagem de programação completa: controle de fluxo, tratamento de exceções, orientação a objetos, entre outras. Com a PL/SQL podemos escrever programas inteiros, desde os mais simples até os mais sofisticados. [42] Para auxiliar no uso do PostgreSQL foi utilizada a GUI (Graphical User Interface) pgAdmin [43], que é uma plataforma grátis desenvolvida em C++ e a mais popular para o PostgreSQL. O pgAdmin está disponível para os sistemas operacionais Linux, FreeBSD, Solaris, Mac OSX e Windows, com isso foi possível acessar remotamente o Banco de Dados para realizar consultas em SQL ou desenvolver funções em PL/SQL mesmo de uma máquina com Windows. Pg_bulkload O pg_bulkload [11] é uma ferramenta para o PostgreSQL desenvolvida para fazer a carga de uma grande quantidade de dados em um Banco de Dados. É uma alternativa mais rápida para o comando COPY [44] do PostgreSQL, além de possuir outras funcionalidades como substituir linhas duplicadas e ignorar eventuais erros de parser. A Figura 3.16 apresenta o tempo de carga para 4 GB de dados em tabelas vazias indexadas e não-indexadas, usando o comando COPY e usando o pg_bulkload. Notase que tabelas com índices demoram mais tempo para carregar os dados, mas é uma boa prática indexar algumas colunas da tabela para otimizar as consultas via SQL. Existem dois métodos de escrita para o pg_bulkload, direct e parallel, sendo o parallel o mais rápido e que pode durar menos de 50% do tempo do COPY. 44 Figura 3.16: Tempo de carga de 4 GB de dados, em segundos. Fonte: página oficial do pg_bulkload [11]. Para a última etapa do processo ETL foi utilizado o pg_bulkload para carregar os dados dos arquivos CSV nas respectivas tabelas do Banco de Dados através do comando: pg_bulkload -i arquivo.csv -O tabela_do_bd arquivo_controle.ctl O arquivo de controle no formato CTL (Control Temporal Logic) contém as opções utilizadas para o pg_bulkload, como o método de escrita (parallel ), tipo de arquivo (CSV), além de outras opções como ignorar erros e substituir linhas duplicadas por linhas novas. O pg_bulkload também foi usado no trabalho para carregar os KPIs calculados nas tabelas de KPIs do Banco de Dados. Para isso foram testados cinco métodos diferentes: 1. Utilizando a instrução SQL INSERT [45] 2. Utilizando o comando COPY do PostgreSQL 3. Utilizando o comando COPY binário do PostgreSQL 4. Com o pg_bulkload para um arquivo CSV 5. Com o pg_bulkload para uma função 45 Para os métodos 2, 3 e 4 é preciso antes criar um arquivo intermediário (CSV ou binário) usando o comando COPY antes de carregá-lo no Banco de Dados. Os métodos 1 e 5 possuem a vantagem de não precisar de arquivos intermediários. A Figura 3.17 apresenta os tempo necessários para carregar 1 GB de dados em tabelas vazias e em tabelas já com 4 GB de dados para cada um dos métodos citados: Figura 3.17: Tempo de carga de 1 GB de dados para diferentes métodos de inserção, em minutos. O método de inserção usando o pg_bulkload com uma função como tipo de entrada foi o mais rápido nos testes tanto para tabelas vazias quanto para tabelas já populadas. Essa foi a solução utilizada no trabalho, sendo necessário então criar as funções em PL/SQL com as fórmulas necessárias para o cálculo dos KPIs e executar o seguinte comando para inserir os dados com KPIs calculados nas tabelas de KPIs: pg_bulkload -i nome_funcao() -O tabela_kpi arquivo_controle.ctl CodeIgniter O CodeIgniter [46] é um framework de desenvolvimento gratuito de aplicações em PHP. Seu objetivo é disponibilizar um framework de máxima performance e capacidade, que seja flexível e o mais leve possível. A primeira versão pública do CodeIgniter foi lançada em 28 de fevereiro de 2006. O CodeIgniter permite que se mantenha o foco em um projeto, minimizando a quantidade de código necessário para uma dada tarefa. CodeIgniter foi desenvolvido sob o paradigma da programação Orientada a Objetos sob o padrão de arquitetura de software MVC. A aplicação MVC do trabalho descrita na seção 3.1.3 foi construída utilizando o CodeIgniter devido à ampla biblioteca de classes disponíveis neste framework, que 46 possuem uma estrutura de atributos e métodos que facilitam a implementação de tarefas comuns ao desenvolvimento de qualquer uma das aplicações necessárias, tais como, conexão com o Banco de Dados, tratamento e consultas de dados retornados, construção de formulários e outros conteúdos HTML para a criação da interface visual da aplicação, entre várias outras. Além disso, possui um conjunto de helpers, que pode ser compreendido como bibliotecas de funções, agrupadas de acordo com suas finalidades. As URL’s geradas pelo CodeIngniter são limpas e amigáveis. Está entre os frameworks PHP mais utilizados em 2016 [47]. Apache O servidor Apache [48] é o mais bem sucedido servidor web livre. Foi criado em 1995 por Rob McCool. Em uma pesquisa realizada em novembro de 2015 [49], foi constatado que a utilização do Apache representava cerca de 50% dos servidores ativos no mundo. Assim como qualquer servidor do tipo, o Apache é responsável por disponibilizar páginas e todos os recursos que podem ser acessados por um internauta. Envio de e-mails, mensagens, compras online e diversas outras funções podem ser executadas graças a servidores como o Apache. O que vale destacar no Apache é que, apesar de tudo, ele é distribuído sob a licença GNU, ou seja, é gratuito e pode ser estudado e modificado através de seu código fonte por qualquer pessoa. É graças a essa característica que o software foi (e continua sendo) melhorado com o passar dos anos. Graças ao trabalho muitas vezes voluntário de vários desenvolvedores, o Apache continua sendo o servidor Web mais usado no mundo. MobaXterm O MobaXterm [50] é um terminal de simulação OpenSource para Windows, usado principalmente para estabelecer conexões seguras de acesso remoto a servidores via SSH (Secure Shell ). Permite abrir múltiplas abas para executar simultaneamente várias operações diferentes. Eles rodam com o servidor gratuito Xorg, para exportar o display Unix/Linux e vários dos novos comandos GNU Unix. Foi utilizado no trabalho para poder acessar os servidores Linux via SSH através de máquinas Windows. 47 Telepot Com o intuito de monitorar cada etapa em todos os processos do trabalho, foi utilizado o Telepot [51], um framework em Python que funciona como um bot utilizando a API (Application Programming Interface) do Telegram [52], um aplicativo de mensagens para celular. Foram desenvolvidos scripts em Python para o envio automático de mensagens para um canal no Telegram usando a biblioteca do Telepot. A Figura 3.18 mostra um exemplo de mensagem indicando o andamento de cada parte do processo ETL, e a Figura 3.19 apresenta um exemplo de mensagem indicando para quais horas os KPIs já foram calculados. Figura 3.18: Monitoramento do ETL 3.2.3 Figura 3.19: Monitoramento dos KPIs Funcionamento Antes de começar o processo ETL, é necessário criar todas as tabelas necessárias no PostgreSQL, que são: as tabelas de todas as famílias de contadores de performance, as tabelas para todos os grupos de KPIs, as tabelas que irão armazenar os dados de configuração e as tabelas de controle que irão armazenar o log de arquivos baixados, convertidos e carregados no Banco de Dados. 48 Após todas as tabelas terem sido criadas, os scripts desenvolvidos para o processo ETL são agendados na cron [53] do Linux. Para extrair os arquivos dos quatro servidores do EMS, é preciso que uma VPN (Virtual Private Network ) da empresa esteja conectada. Os scripts que fazem o FTP são agendados para serem executados a cada 10 minutos no servidor de arquivos. Os outros scripts do processo ETL que fazem a conversão e o parser no servidor de arquivos são agendados para serem executados a cada minuto. Os arquivos prontos para serem carregados no Data Warehouse são enviados para o servidor de dados onde os scripts de carga são agendados para serem executados a cada dois minutos. Também neste servidor é feito o processamento dos dados, já descritos anteriormente conforme a Figura 3.12, agendados para serem executados a cada 30 minutos. Como o processo de carga e de cálculos dos KPIs são muito pesados e devido à limitação dos processadores usado no trabalho, foi feito um controle simples para que os mesmos não sejam executados ao mesmo tempo: enquanto os cálculos dos KPIs ocorrem é criado um arquivo temporário em um diretório específico impedindo que carga dos dados seja inicializada. Logo após qualquer etapa do processamento dos dados, são executados os comandos SQL Vacuum e Analyze, para limpeza dos registros e atualização das estatísticas dos cálculos, a fim de sempre otimizar o desempenho do Banco de Dados. 49 Capítulo 4 Resultados e Discussões A ferramenta desenvolvida no trabalho apresentou resultados satisfatórios, incluindo os seguintes recursos: • Interface gráfica contendo os KPIs básicos para as tecnologias UMTS e LTE. • Os mesmos KPIs podem ser acessados quando agrupados por célula, região, RNC, cidade, meias-horas, dia e semana. • Ranqueamento das piores células, mostrando os maiores ofensores por RNC (UMTS) e região (LTE) para um determinado KPI, e quanto este KPI irá melhorar quando corrigidas suas falhas. • KPIs personalizados, agregados por dia e semana e mostrando também seus piores ofensores por RNC. A Figura 4.1 mostra a interface do pgAdmin, destacando como foi feita a organização do Banco de Dados no PostgreSQL. Divisão em esquemas por tecnologia (UMTS e LTE) e por KPI, control, counter, configuration etc serviram para organizar e facilitar o acesso aos dados do banco. 50 Figura 4.1: Organização do Banco de Dados. A Figura 4.2 exibe a página inicial da interface web da ferramenta. Por padrão é exibida uma tabela com os KPIs básicos da última semana calculada, por região. No menu superior é possível selecionar se deseja exibir os indicadores de performance agrupados por dia ou semana, ou se deseja exibir outros indicadores personalizados, como mostra a Figura 4.3. Figura 4.2: Página inicial da ferramenta. 51 Figura 4.3: Menu com os indicadores de performance. No menu superior à direita é possível selecionar a tecnologia (Figura 4.4) e as agregações desejadas dos KPIs, por região, RNC ou cidade (Figura 4.5). Figura 4.4: Tecnologias disponíveis. Figura 4.5: Agregações de KPIs disponíveis. 52 Nas seções seguintes serão destacados alguns dos principais dashboards gerados no trabalho. 4.1 KPIs básicos para tecnologia UMTS A seguir, serão apresentados exemplos de relatórios semanais contendo os gráficos de KPIs básicos, sendo eles de Accessibility e Retainability (Figura 4.6); Traffic (Figura 4.7); Service Integrity e Retention (Figura 4.8); Mobility (Figura 4.9); Availability e Coverage (Figura 4.10). Nesses exemplos aparecem as variações dos KPIs diários para toda a rede UMTS. Figura 4.6: KPIs básicos de Accessibility e Retainability. Figura 4.7: KPIs básicos de Traffic. 53 Figura 4.8: KPIs básicos de Service Integrity e Retention. Figura 4.9: KPIs básicos de Mobility. Figura 4.10: KPIs básicos de Availability e Coverage. 54 4.2 Principais ofensores por RNC Uma das funcionalidades desenvolvidas no trabalho foi a possibilidade fazer drilldown em cada um dos KPIs de um determinado RNC e descobrir quais foram suas piores células durante um dia específico. Em geral, a pior célula é aquela que apresenta mais falhas. É feito o ranqueamento dessas células e qual o peso que todas as falhas de cada célula tiveram no KPI do RNC, e o quanto o KPI do RNC irá melhorar quando as falhas forem corrigidas. Como exemplo, a Figura 4.11 mostra as piores células para o RNC RNCMG01 do KPI Acessibilidade RRC. Figura 4.11: Ranqueamento das piores células de um RNC. É possível também fazer drill-down em uma célula específica e descobrir qual foi a variação no KPI daquela célula durante as horas do dia, como mostra a Figura 4.12. Figura 4.12: KPI de uma célula ao longo de um dia. 55 4.3 KPIs personalizados para tecnologia UMTS Os KPIs básicos apresentados anteriormente servem, em teoria, para medir o desempenho da rede de telefonia. Portanto bons níveis do KPI deveriam também garantir a satisfação dos usuários destas redes. Porém esse conceito não é um consenso em todas as empresas, por conta disso algumas delas criaram KPIs próprios para chegar a um indicador que se aproxime mais do nível de satisfação do usuário. Alguns desses KPIs personalizados foram feitos para o trabalho, chamados de AMX NQI. Encontram-se na Figura 4.13, e os ofensores do KPI QDA PS com o ranqueamento das piores células do RNC RNCMG01 pode ser visto na Figura 4.14. Figura 4.13: KPIs personalizados. Figura 4.14: Piores células para o KPI QDA PS. 56 4.4 KPIs básicos para tecnologia LTE A Figura 4.15 mostra KPIs básicos gerados para rede LTE. Figura 4.15: KPIs básicos da rede LTE. Seguindo o mesmo padrão da rede UMTS, a ferramenta também gerou relatórios dos KPIs da rede LTE agrupados por região, cidade e UF, além de tabelas com as piores células de cada região. 4.5 Discussões A ferramenta desenvolvida neste trabalho cumpriu seu objetivo de gerar dashboards com indicadores de performance rede de telefonia celular para as tecnologias UMTS e LTE, através de uma interface web. O atraso apresentado para os cálculos KPIs foi de no mínimo duas horas (diferença entre a hora atual e a hora do último KPI calculado). Apesar dessa limitação, os resultados foram bastante satisfatórios, sendo possível consultar não só os KPIs do dia atual como os dos dias retroativos, além de diversas outras agregações e funcionalidades, tais como KPIs das cidades, RNCs e regiões, seus principais ofensores, consulta aos parâmetros e configurações da rede, etc. 57 O trabalho inicial de extração, transformação e carga em um modelo Data Warehouse. Desde o início teve-se a dúvida se seria melhor usar uma ferramenta paga para fazer o processo de ETL ou se criava-se todos os códigos para cada etapa do processo. O segundo método foi escolhido porque observou-se que o processo ficava mais rápido e consumia menos recursos visto as limitações de processamento dos computadores utilizados. Um processo mais rápido é fundamental para garantir que os KPIs sejam calculados com o menor atraso possível no trabalho. 58 Capítulo 5 Conclusões e Trabalhos Futuros 5.1 Conclusões Todas as ferramentas escolhidas para o processo ETL e para aplicação MVC se mostraram úteis e funcionais. Porém uma das dificuldades para desenvolver todo o processo com várias ferramentas diferentes foi a falta de controle externo para gerenciar todas as etapas do processo, algo presente nas ferramentas pagas. A forma escolhida para contornar esse problema foi através de envio automático de mensagens pelo Telegram para monitorar cada etapa. O trabalho todo foi feito usando dados de performance e de configuração presentes nos servidores externos da empresa Huawei, mas pode ser estendido para qualquer empresa de telecomunicações que forneça esses arquivos nos formatos XML ou CSV. 5.2 Trabalhos futuros Mesmo com boa parte dos objetivos iniciais cumpridos, é importante ressaltar que muitas outras funcionalidades podem ser incorporadas na ferramenta, como cálculo dos ofensores para outros tipos de agregações (cidade, semana, mês, etc), indicadores de capacidade das redes de telefonia, georreferenciamento de antenas, adição de outras tecnologias como GSM, etc. Outra das principais e possíveis mudanças no trabalho é adotar a modelagem multidimensional. A modelagem multidimensional é a técnica de projeto mais freqüentemente utilizada para a construção de um Data Warehouse. O objetivo é buscar um padrão de apresentação de dados que seja facilmente visualizado pelo usuário final e que possua um bom desempenho para consultas. 59 O modelo dimensional é formado por uma tabela central (tabela de fatos) e várias outras a ela interligadas (tabelas de dimensão), sempre por meio de chaves especiais, que associam o fato a uma dimensão do cubo. O conceito de dimensão pode ser entendido como a organização dos dados, determinando possíveis consultas/cruzamentos. Para o trabalho, por exemplo, poderiam ser RNC, Node-B, data, hora e cidade. Cada dimensão pode ainda ter seus elementos, chamados membros, organizados em diferentes níveis hierárquicos. As tabelas de dimensão geralmente são tabelas simples em relação ao número de linhas, mas podem conter um número muito grande de colunas. [8, 54] A tabela de fatos é a principal tabela de um modelo dimensional, onde as medições numéricas de interesse da empresa ficam armazenadas. A palavra “fato” é usada para representar uma medição de negócio da empresa, ou seja, cada linha da tabela representa uma medição. A tabela de fatos registra os fatos que serão analisados e os dados a serem agrupados. A Figura 5.1 mostra uma futura proposta de modelo multidimensional para o trabalho, utilizando o chamado Modelo Estrela (Star Schema). Figura 5.1: Modelo Multidimensional proposto. [8] Como consulta a banco de dados multidimensionais temos um conjunto de aplicações que se denominam ferramentas OLAP (Online Analytical Processing - Processamento Analítico Online). OLAP é a denominação que se dá a uma ferramenta que tem a capacidade de manipular e analisar um grande volume de dados sob múltiplas perspectivas, chamada de cubo. O principal benefício do uso de uma ferramenta 60 OLAP é a disponibilidade de métodos para acessar, visualizar e analisar dados com muita flexibilidade e velocidade. 61 Referências Bibliográficas [1] AMERICAS, G. “Evolução Tecnológica da 3GPP”. 2016. Disponível em: <http://www.4gamericas.org/pt-br/resources/ technology-education/3gpp-technology-evolution/>. (Acesso em 12 de maio de 2016). [2] TELECO. “Estatísiticas de Celular no Mundo”. 2016. Disponível em: <http: //www.teleco.com.br/pais/celular.asp>. (Acesso em 08 de maio de 2016). [3] AMERICAS, G. “Mobile Technology Statistics - Global”. 2016. Disponível em: <http://www.4gamericas.org/en/resources/statistics/ statistics-global/>. (Acesso em 13 de maio de 2016). [4] AMERICAS, G. “Mercado móvel Brasil 2014 - 2019”. 2015. Disponível em: <http://www.4gamericas.org/pt-br/resources/infographics/ mercado-movel-argentina-2014-20191/>. (Acesso em 09 de maio de 2016). [5] PERINI, P. UMTS/HSDPA Protocols, Procedures and Operations. Relatório técnico, Qualcomm Wireless Academy, Washington, D.C., May 2003. [6] TELECOMHALL. “O que é RRC e RAB?” 2011. Disponível em: <http: //www.telecomhall.com/BR/o-que-e-rtwp.aspx>. (Acesso em 18 de maio de 2016). [7] TELECO. “Redes 3G: Tipos de Handover”. 2016. Disponível em: <http://www. teleco.com.br/tutoriais/tutorial3ghandover/pagina_2.asp>. (Acesso em 18 de maio de 2016). [8] DOS SANTOS, V. V. “Data Warehouse: Análise da Performance de Ferramentas de ETL”. 2013. Disponível em: <http://www.uniedu.sed.sc.gov.br/ wp-content/uploads/2013/10/Valdinei-Valmir-dos-Santos.pdf>. (Acesso em 20 de maio de 2016). 62 [9] ELIAS, D. “Entendendo o processo de ETL”. 2015. Disponível em: <http: //corporate.canaltech.com.br/noticia/business-intelligence/ entendendo-o-processo-de-etl-22850/>. (Acesso em 22 de maio de 2016). [10] ZEMEL, T. “MVC (Model – View – Controller)”. 2009. Disponível em: <http://codeigniterbrasil.com/passos-iniciais/ mvc-model-view-controller/>. (Acesso em 20 de junho de 2016). [11] “pg_bulkload: Project Home Page”. Disponível em: <http://ossc-db. github.io/pg_bulkload/index.html>. (Acesso em 03 de julho de 2016). [12] KIMBALL, R., CASERTA, J. The Data Warehouse ETL Toolkit. USA, Wiley, 2004. [13] INTELLIGENCE, G. “Definitive data and analysis for the mobile industry”. 2016. Disponível em: <https://www.gsmaintelligence.com/>. (Acesso em 07 de maio de 2016). [14] BSC6900 UMTS Product Documentation, v900r015c00 ed. Huawei, April 2015. [15] GABARDO, A. C. PHP e MVC com CodeIgniter. Brasil, NOVATEC, 2012. [16] AQUINO, G. P. “Curso Tecnologia Celular 4G-LTE”. 2013. Inatel. [17] GUSSEN, C. M. G. “Estudo e Simulação da Camada Física do 3G–LTE na Conexão Downlink ”. 2009. Disponível em: <http://monografias.poli. ufrj.br/monografias/monopoli10002720.pdf>. [18] WORLDOMETERS. “Current World Population”. Disponível em: <http:// www.worldometers.info/world-population/>. (Acesso em 02 de julho de 2016). [19] D’ÁVILA, D. C. K. “UTRAN - UMTS Terrestrial Radio Access Network | 3G Wireless | O que é”. 2009. Disponível em: <http://www.cedet.com. br/index.php?/O-que-e/3G-Wireless/utran.html>. (Acesso em 16 de março de 2016). [20] TELECOMHALL. “O que é RRC e RAB?” 2013. Disponível em: <http: //www.telecomhall.com/br/o-que-e-rrc-e-rab.aspx>. (Acesso em 18 de maio de 2016). 63 [21] DA NET, O. “O que é Business Intelligence?” 2014. Disponível em: <https://www.oficinadanet.com.br/post/ 13153-o-que-e-business-intelligence>. (Acesso em 20 de maio de 2016). [22] RIBEIRO, V. “O que é ETL?” 2011. Disponível em: <https: //vivianeribeiro1.wordpress.com/2011/06/28/o-que-e-etl-2/>. (Acesso em 10 de março de 2016). [23] OLIVEIRA, M., 2008. Disponível em: <http://www.datawarehouse.inf. br/Academicos/A%20PUBLICAR_DATA_WAREHOUSE_MARCELL_OLIVEIRA. pdf>. (Acesso em 23 de maio de 2016). [24] WIKIPÉDIA, A. E. L. “Armazém de dados”. Disponível em: <https: //pt.wikipedia.org/wiki/Armaz%C3%A9m_de_dados>. (Acesso em 23 de maio de 2016). [25] BORGES, L. “Dicas importantes para elaborar um dashboard útil e profissional”. Disponível em: <http://blog.luz.vc/excel/ dicas-importantes-para-elaborar-um-dashboard-util-e-profissional/>. (Acesso em 30 de maio de 2016). [26] MACORATTI.NET. “XML – Introdução e conceitos básicos”. Disponível em: <http://www.macoratti.net/xml.htm>. (Acesso em 31 de maio de 2016). [27] DA SILVA ANTUNES, D. L. “Sistema de Gerenciamento e Automatização de Cálculo de Indicadores (SGACI)”. 2009. Disponível em: <http:// monografias.poli.ufrj.br/monografias/monopoli10002083.pdf>. [28] “Pentaho | Data Integration, Business Analytics and Big Data Leaders”. Disponível em: <http://www.pentaho.com/>. (Acesso em 1° de julho de 2016). [29] “Python Programming Language”. . Disponível em: <https://www.python. org/>. (Acesso em 1° de julho de 2016). [30] BRASIL, P. “PerguntasFrequentes/SobrePython”. Disponível em: <http:// wiki.python.org.br/PerguntasFrequentes/SobrePython>. (Acesso em 1° de julho de 2016). [31] CASS, S. “The Disponível em: 2015 Top Ten Programming Languages”. 2015. <http://spectrum.ieee.org/computing/software/ 64 the-2015-top-ten-programming-languages>. (Acesso em 1° de julho de 2016). [32] “ftplib - FTP protocol client - Python documentation”. Disponível em: <https: //docs.python.org/2.7/library/ftplib.html>. (Acesso em 02 de julho de 2016). [33] “csv - CSV File Reading and Writing - Python documentation”. . Disponível em: <https://docs.python.org/2/library/csv.html>. (Acesso em 02 de julho de 2016). [34] “PostgreSQL + Python | Psycopg”. Disponível em: <http://initd.org/ psycopg/>. (Acesso em 02 de julho de 2016). [35] “Bash - GNU Project - Free Software Foundation”. Disponível em: <https: //www.gnu.org/software/bash/>. (Acesso em 1° de julho de 2016). [36] “GNU Parallel - GNU Project - Free Software Foundation”. Disponível em: <https://www.gnu.org/software/parallel/>. (Acesso em 02 de julho de 2016). [37] “Saxonica - XSLT and Xquery Processing”. Disponível em: <http://www. saxonica.com/>. (Acesso em 02 de julho de 2016). [38] “XML Editor, XML Tools, and XQuery - Stylus Studio”. Disponível em: <http: //www.stylusstudio.com/>. (Acesso em 02 de julho de 2016). [39] “libXML - The XML C parser and toolkit of Gnome”. Disponível em: <http: //xmlsoft.org/>. (Acesso em 02 de julho de 2016). [40] “PostgreSQL: The world’s most advanced open source database”. Disponível em: <https://www.postgresql.org/>. (Acesso em 1° de julho de 2016). [41] ALECRIM, E. “Banco de dados MySQL e PostgreSQL”. 2008. Disponível em: <http://www.infowester.com/postgremysql.php>. (Acesso em 03 de julho de 2016). [42] CORRÊA, E. “Conhecendo o PL/SQL”. Disponível em: <http://www. devmedia.com.br/conhecendo-o-pl-sql/24763>. (Acesso em 03 de julho de 2016). [43] “pgAdmin: PostgreSQL administration and management tools”. Disponível em: <https://www.pgadmin.org/>. (Acesso em 03 de julho de 2016). 65 [44] “PostgreSQL: Documentation: 9.5: COPY”. Disponível em: <https://www. postgresql.org/docs/current/static/sql-copy.html>. (Acesso em 10 de julho de 2016). [45] “PostgreSQL: Documentation: 9.5: INSERT”. Disponível em: <https://www. postgresql.org/docs/current/static/sql-insert.html>. (Acesso em 10 de julho de 2016). [46] “CodeIgniter Web Framework”. Disponível em: <https://www.codeigniter. com/>. (Acesso em 1° de julho de 2016). [47] REVISIONS, W. “Best PHP Framework for 2016”. 2016. Disponível em: <http://webrevisions.com/tutorials/ php-framework-the-best-php-framework-for-2013/>. (Acesso em 11 de julho de 2016). [48] “The Apache HTTP Server Project”. Disponível em: apache.org/>. (Acesso em 11 de julho de 2016). <https://httpd. [49] NETCRAFT. “November 2015 Web Server Survey”. 2015. Disponível em: <http://news.netcraft.com/archives/2015/11/16/ november-2015-web-server-survey.html>. (Acesso em 11 de julho de 2016). [50] “MobaXterm free Xserver and tabbed SSH client for Windows”. Disponível em: <http://mobaxterm.mobatek.net/>. (Acesso em 11 de julho de 2016). [51] “Python framework for Telegram Bot API”. . Disponível em: <https: //github.com/nickoala/telepot>. (Acesso em 11 de julho de 2016). [52] “Telegram Messenger”. . Disponível em: <https://telegram.org/>. (Acesso em 11 de julho de 2016). [53] “Agendando Tarefas com cron e atd”. Disponível em: <https: //www.debian.org/doc/manuals/debian-handbook/sect. task-scheduling-cron-atd.pt-br.html>. (Acesso em 12 de julho de 2016). [54] ROHDEN, R. B. “Banco de Dados: Relacional X Multidimensional”. Disponível em: <https://pt.scribd.com/doc/22742853/ Artigo-Banco-de-Dados-Relacional-vs-Multidimensional>. (Acesso em 14 de julho de 2016). 66 Apêndice A Códigos Fonte - ETL Neste apêndice se encontram os códigos fonte do processo ETL, contendo as partes de extração, conversão e carga. Além desses códigos fonte, também está disponível o script em Shell que faz a execução de cada uma dessas partes. 67 A.1 A.1.1 1 2 3 4 5 6 7 8 Extração Ftp.py ### i m p o r t s n e c e s s á r i o s ### from f t p l i b import FTP import psycopg2 import time import d a t e t i m e import o s import s h u t i l import r e 9 10 11 12 13 14 15 16 d e f getpm ( ip , u s e r , password , pmfolder , p r e f i x ) : # f u n ç ã o que f a z o FTP ### d e f i n i ç õ e s dos a r q u i v o s e d i r e t ó r i o s ### l o c a l d i r = ' / e t l /umts/ p e r f o r m a n c e /temp/ f t p / ' f i n a l d i r = ' / e t l /umts/ p e r f o r m a n c e /raw/ ' c o n v e r t e d d i r = ' / e t l /umts/ p e r f o r m a n c e / c o n v e r t e d / ' b a c k u p d i r = ' / e t l / backup /umts/ p e r f o r m a n c e / ' l o g f i l e = ' /home/ e t l u s e r / l o g / f t p . l o g ' 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 try : conn = psycopg2 . c o n n e c t ( "dbname=' p o s t g r e s ' u s e r =' p o s t g r e s ' h o s t= host_ip password=password_db " ) # c o n e c t a no Banco de Dados except : p r i n t ( ' db e r r o r ' ) s q l l o a d e d = "SELECT CONCAT( o s s , '_ ' , f i l e ) FROM umts_control . l o g _ e t l WHERE d a t e t i m e >= ( c u r r e n t _ d a t e − i n t e r v a l ' 4 day ' ) AND o s s = '% s ' ORDER BY f i l e ; " % s e r v e r s q l s e l e c t e d = "SELECT DISTINCT(CONCAT( f u n c t i o n s u b s e t _ i d , '_ ' , gp ) ) FROM umts_control . c o u n t e r _ r e f e r e n c e WHERE c o u n t e r _ e n a b l e = 'TRUE ' ; " c u r s o r = conn . c u r s o r ( ) cursor . execute ( sqlloaded ) time . s l e e p ( 0 . 5 ) s q l l o a d e d f i l e s = [ item [ 0 ] f o r item i n c u r s o r . f e t c h a l l ( ) ] cursor . execute ( s q l s e l e c t e d ) time . s l e e p ( 0 . 5 ) s q l s e l e c t e d s u b s e t = [ item [ 0 ] f o r item i n c u r s o r . f e t c h a l l ( ) ] f t p = FTP( ip , u s e r , password ) ftp . login () f t p . cwd ( p m f o l d e r ) d i r l i s t = ftp . nlst () 35 36 37 38 f o r dirname i n d i r l i s t : matchdir = r e . match ( ' . ∗ pmexport_ . ∗ ' , dirname ) i f matchdir : 68 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 f t p . cwd ( p m f o l d e r+dirname ) filenames = ftp . nlst () f i l e n a m e s = s o r t e d ( f i l e n a m e s , key=lambda x : x . s p l i t ( "_" ) [ 3 ] ) for filename in filenames : OutputFilename = p r e f i x + f i l e n a m e i f OutputFilename not i n s q l l o a d e d f i l e s : for s e l e c t i o n in s q l s e l e c t e d s u b s e t : m a t c h f i l e = r e . match ( ' . ∗ '+s t r ( s e l e c t i o n )+ ' . ∗ ' , f i l e n a m e ) i f matchfile : i f ( o s . path . e x i s t s ( f i n a l d i r+OutputFilename ) o r o s . path . e x i s t s ( c o n v e r t e d d i r+OutputFilename+ ' . c s v ' ) ) : p r i n t ( '%s E x i s t s ' % OutputFilename ) else : p r i n t ( ' Opening l o c a l f i l e ' + OutputFilename ) f i l e = open ( l o c a l d i r +OutputFilename , 'wb ' ) p r i n t ( ' G e t t i n g ' + OutputFilename ) try : f t p . r e t r b i n a r y ( 'RETR %s ' % f i l e n a m e , f i l e . w r i t e ) c u r s o r . e x e c u t e ( 'INSERT INTO umts_control . l o g _ e t l ( o s s , f i l e , f s s , datetime , f t p ) VALUES (%s , %s , %s , %s , %s ) ' , ( p r e f i x . s p l i t ( '_ ' ) [ 0 ] , f i l e n a m e , f i l e n a m e . s p l i t ( '_ ' ) [ 1 ] , f i l e n a m e . s p l i t ( '_ ' ) [ 3 ] [ 0 : 4 ] + '− ' + f i l e n a m e . s p l i t ( '_ ' ) [ 3 ] [ 4 : 6 ] + '− ' + f i l e n a m e . s p l i t ( '_ ' ) [ 3 ] [ 6 : 8 ] + ' ' + f i l e n a m e . s p l i t ( '_ ' ) [ 3 ] [ 8 : 1 0 ] + ' : ' + f i l e n a m e . s p l i t ( '_ ' ) [ 3 ] [ 1 0 : 1 2 ] + ' : 0 0 ' , s t r ( d a t e t i m e . d a t e t i m e . now ( ) ) [ 0 : 1 9 ] ) ) conn . commit ( ) time . s l e e p ( 0 . 5 ) f i l e . close () o s . rename ( l o c a l d i r+OutputFilename , f i n a l d i r+ OutputFilename ) s h u t i l . c o p y f i l e ( f i n a l d i r+OutputFilename , b a c k u p d i r+ OutputFilename ) time . s l e e p ( 0 . 5 ) l o g = open ( l o g f i l e , " a " ) l o g . w r i t e ( d a t e t i m e . d a t e t i m e . now ( ) . s t r f t i m e ( '%d/%m/%Y − %H:%M:%S ' )+" : a r q u i v o "+OutputFilename+" baixado \n" ) log . close () except : print ( " Error " ) print ( ' Closing f i l e ' + filename ) f i l e . close () ftp . quit () cursor . close () 72 73 getpm ( s e r v e r _ i p , s e r v e r _ u s e r , server_password , server_path , s e r v e r + '_ ' ) 69 A.1.2 1 Auto-get-performance.sh #! / b i n / bash 2 3 4 LOG=" /home/ e t l u s e r / l o g / auto−get−p e r f o r m a n c e . l o g " FTPLOG=" /home/ e t l u s e r / l o g / f t p . l o g " 5 6 7 8 9 10 ### d e f i n i ç õ e s ### h o r a r i o ( ) # f u n ç ã o que pega a data a t u a l { d a t e +%d/%m/%Y" − "%H:%M:%S } 11 12 pgrep −f f t p . py # v e r i f i c a s e o s c r i p t de FTP j á e s t á sendo e x e c u t a d o 13 14 15 16 17 18 19 20 i f [ $ ? −ne 0 ] ; then echo " $ ( h o r a r i o ) : FTP e x e c u t a d o . ">>$LOG echo −e "−\n$ ( h o r a r i o ) : I n i c i o da e x e c u c a o . ">>$FTPLOG python / e t l / s c r i p t s / f t p . py # e x e c u t a o s c r i p t de FTP echo " $ ( h o r a r i o ) : Fim da e x e c u c a o . ">>$FTPLOG exit 0 fi 21 22 echo " $ ( h o r a r i o ) : P r o c e s s o j a em e x e c u c a o . ">>$LOG 23 24 exit 0 70 A.2 A.2.1 1 Conversão pm-convert.sh #! / b i n / bash 2 3 #d e f i n i ç õ e s 4 5 6 7 8 9 10 11 12 TEMP_DIR=" / e t l /umts/ p e r f o r m a n c e /temp/ x s l t / " OUT_DIR=" / e t l /umts/ p e r f o r m a n c e / c o n v e r t e d / " IMP_DIR=" / e t l /umts/ p e r f o r m a n c e /raw/ " XSLT=" / e t l / s c r i p t s / pmResult . x s l " SAXON=" / u s r / s h a r e /maven−r e p o / n e t / s f / saxon / Saxon−HE/ d e b i a n / Saxon−HE− debian . j a r " LOG=" /home/ e t l u s e r / l o g / ConvertXml2Csv . l o g " TREADS=4 T e s t I n t e r v a l =1 13 14 e x p o r t TEMP_DIR OUT_DIR IMP_DIR XSLT SAXON LOG TREADS T e s t I n t e r v a l 15 16 17 #mata a e x e c u ç ã o s e o d i r e t o r i o não f o r e n c o n t r a d o [ −d $IMP_DIR ] | | e x i t 1 18 19 20 21 22 23 24 25 #f u n c a o que pega hora a t u a l horario () { d a t e +%d/%m/%Y" − "%H:%M:%S } #e x p o r t a a f u n ç ã o para s h e l l s f i l h o s e x p o r t −f h o r a r i o 26 27 28 #f u n ç ã o que f a z a c o n v e r s a o Convert2Csv ( ) { 29 30 31 FileName=$1 [ −r $FileName ] && x m l l i n t −−noout −−v a l i d $ {IMP_DIR}/ $ { FileName } 32 33 34 35 36 37 i f [ $ ? −eq 0 ] ; then time j a v a −cp $ {SAXON} n e t . s f . saxon . Transform −t −s : $ { FileName } −x s l : $ {XSLT} −o : $ {TEMP_DIR}/ $ { FileName } . c s v \ && p s q l −d p o s t g r e s −h $HOST_IP −U p o s t g r e s −c "UPDATE umts_control . l o g _ e t l SET x s l t ='$ ( d a t e +"%Y−%m−%d %T" ) ' WHERE o s s ='$ { FileName%%_∗ } ' AND f i l e ='$ { FileName#∗_} ' ; " \ && rm $ { FileName } \ && mv $ {TEMP_DIR}/ $ { FileName } . c s v $ {OUT_DIR} 38 71 echo " $ ( h o r a r i o ) : Arquivo $FileName c o n v e r t i d o ">>$LOG 39 40 else p s q l −d p o s t g r e s −h $HOST_IP −U p o s t g r e s −c "DELETE FROM umts_control . l o g _ e t l WHERE o s s ='$ { FileName%%_∗ } ' AND f i l e ='$ { FileName#∗_} ' ; " rm −f $ { FileName } 41 42 43 fi 44 45 46 47 } #e x p o r t a a f u n ç ã o para s h e l l s f i l h o s e x p o r t −f Convert2Csv 48 49 50 51 T o t a l F i l e s=$ ( l s $ {IMP_DIR} ∗ . xml | wc − l ) cd $ {IMP_DIR} echo −e "−\n$ ( h o r a r i o ) : I n i c i o da e x e c u c a o ">>$LOG 52 53 p a r a l l e l −j$TREADS −u Convert2Csv { } \ ; ' echo −e " \ n P r o g r e s s : {#}/ ' $ T o t a l F i l e s ' F i l e s c o n v e r t e d \n" ' \ ; s l e e p $ T e s t I n t e r v a l : : : $ ( l s ∗ . xml | s o r t −t "_" −k 5 ) 54 55 56 57 echo " $ ( h o r a r i o ) : Fim da e x e c u c a o ">>$LOG echo −e " \n" exit 0 72 A.2.2 1 auto-convert.sh #! / b i n / bash 2 3 4 IMP_FILES="/ e t l /umts/ p e r f o r m a n c e /raw/ " LOG=" /home/ e t l u s e r / l o g / auto_convert . l o g " 5 6 7 8 9 horario () { d a t e +%d/%m/%Y" − "%H:%M:%S # f u n ç ã o que pega a data a t u a l } 10 11 12 13 14 15 16 17 18 19 20 21 if [ [ ! $ ( l s −A $IMP_FILES / ∗ . xml ) ] ] ; then echo " $ ( h o r a r i o ) : Nao ha a r q u i v o s a serem c a r r e g a d o s . ">>$LOG exit 1 else pgrep −f pm−c o n v e r t . sh # v e r i f i c a s e o s c r i p t de c o n v e r s ã o j á e s t á sendo e x e c u t a d o i f [ $ ? −ne 0 ] ; then echo " $ ( h o r a r i o ) : Converted e x e c u t a d o . ">>$LOG / e t l / s c r i p t s /pm−c o n v e r t . sh exit 0 fi fi 22 23 24 echo " $ ( h o r a r i o ) : P r o c e s s o j a em e x e c u c a o . ">>$LOG exit 0 73 A.2.3 1 2 3 4 5 6 7 8 9 import import import import import import import import import parser.py os csv time psycopg2 time datetime re sys ftplib 10 11 12 13 14 15 #####SET DIR c o n v e r t e d d i r = ' / e t l /umts/ p e r f o r m a n c e / c o n v e r t e d / ' tempdir = ' / e t l /umts/ p e r f o r m a n c e /temp/ p a r s e r / ' o u t d i r = ' / p e r f o r m a n c e /umts/ ' l o g f i l e = ' /home/ e t l u s e r / l o g /parsePM . l o g ' 16 17 18 #####Get F i l e f i l e = s y s . argv [ 1 ] 19 20 21 22 #####Connect t o t h e d a t a b a s e db_conn = psycopg2 . c o n n e c t ( "dbname=' p o s t g r e s ' u s e r =' p o s t g r e s ' h o s t =' host_ip ' password ='password_db ' " ) # c o n e c t a no Banco de Dados c u r s o r = db_conn . c u r s o r ( ) 23 24 try : print ( ifile reader ofile writer 25 26 27 28 29 ' C o n v e r t i n g f i l e '+ f i l e ) = open ( c o n v e r t e d d i r+f i l e , " r " ) = c s v . r e a d e r ( i f i l e , d e l i m i t e r= ' ; ' ) = open ( tempdir+f i l e , "w" , n e w l i n e=" \n" , e n c o d i n g=" u t f −8" ) = c s v . w r i t e r ( o f i l e , d e l i m i t e r= ' ; ' , q u o t i n g=c s v .QUOTE_MINIMAL ) 30 31 32 33 34 35 36 37 38 39 40 ###p a r s e h e a d e r f o r row i n r e a d e r row . i n s e r t ( 0 , " d a t e t i m e " ) row . i n s e r t ( 0 , " c e l l i d " ) row . i n s e r t ( 0 , " c e l l n a m e " ) row . i n s e r t ( 0 , " r n c " ) row = [ r . r e p l a c e ( " . " , "_" ) f o r r i n row ] row = [ r . l o w e r ( ) f o r r i n row ] w r i t e r . w r i t e r o w ( row ) break 41 42 43 ###p a r s e body f o r row i n r e a d e r : 74 44 45 46 47 48 49 50 51 row = [ r . r e p l a c e ( "NULL" , " " ) f o r r i n row ] row . i n s e r t ( 0 , ( row [ 0 ] [ 0 : 4 ] + '− ' + row [ 0 ] [ 4 : 6 ] + '− ' + row [ 0 ] [ 6 : 8 ] + ' ' + row [ 0 ] [ 8 : 1 0 ] + ' : ' + row [ 0 ] [ 1 0 : 1 2 ] ) )#d a t e t i m e row . i n s e r t ( 0 , row [ 3 ] . s p l i t ( ' , ' ) [ 1 ] [ 8 : ] ) ##c e l l i d row . i n s e r t ( 0 , row [ 4 ] . s p l i t ( ' , ' ) [ 0 ] . s p l i t ( '= ' ) [ 1 ] )##c e l l n a m e row . i n s e r t ( 0 , row [ 5 ] . s p l i t ( ' / ' ) [ 0 ] )##r n c w r i t e r . w r i t e r o w ( row ) i f i l e . close () o f i l e . close () 52 53 54 55 56 57 58 59 ###Query s e l e c t e d columns f s s = s t r ( f i l e . s p l i t ( '_ ' ) [ 2 ] ) query = "SELECT counter_name FROM umts_control . c o u n t e r _ r e f e r e n c e WHERE c o u n t e r _ e n a b l e = 'TRUE ' and f u n c t i o n s u b s e t _ i d = ' "+f s s+" ' ; " c u r s o r . e x e c u t e ( query ) enabled_columns = [ item [ 0 ] f o r item i n c u r s o r . f e t c h a l l ( ) ] s e l e c t e d _ c o l u m n s = [ ' r n c ' , ' c e l l n a m e ' , ' c e l l i d ' , ' d a t e t i m e ' , ' gp ' ] # s e l e c t header s e l e c t e d _ c o l u m n s . extend ( enabled_columns ) 60 61 62 63 64 65 ###Query columns o r d e r t a b l e = ' f s s _ '+s t r ( f i l e . s p l i t ( '_ ' ) [ 2 ] ) query = "SELECT column_name FROM INFORMATION_SCHEMA.COLUMNS WHERE table_schema = ' umts_counter ' and table_name = ' "+t a b l e+" ' o r d e r by ordinal_position ; " c u r s o r . e x e c u t e ( query ) columns = [ item [ 0 ] f o r item i n c u r s o r . f e t c h a l l ( ) ] 66 67 68 69 70 71 ###Read and w r i t e columns i n b u l k l o a d format i f i l e = open ( tempdir+f i l e , " r " ) r e a d e r = c s v . DictReader ( i f i l e , d e l i m i t e r= ' ; ' ) o f i l e = open ( tempdir+ f i l e + ' . t x t ' , "w" , n e w l i n e=" \n" , e n c o d i n g=" u t f −8" ) w r i t e r = c s v . D i c t W r i t e r ( o f i l e , f i e l d n a m e s=columns , r e s t v a l= ' ' , e x t r a s a c t i o n= ' i g n o r e ' , d e l i m i t e r= ' \ t ' ) 72 73 74 75 76 77 78 #w r i t e r . w r i t e h e a d e r ( ) f o r row i n r e a d e r : newrow = {k : v f o r k , v i n row . i t e m s ( ) i f k i n s e l e c t e d _ c o l u m n s } w r i t e r . w r i t e r o w ( newrow ) i f i l e . close () o f i l e . close () 79 80 81 82 83 except IndexError : p r i n t ( ' Couldnt c o n v e r t ' ) i f i l e . close () o f i l e . close () 75 84 o s . remove ( tempdir+ f i l e ) 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 else : p r i n t ( ' Could Convert ' ) s e s s i o n = f t p l i b .FTP( ' host_ip ' , ' p o s t g r e s ' , ' password_db ' ) u p l o a d f i l e = open ( tempdir+ f i l e + ' . t x t ' , ' rb ' ) s e s s i o n . s t o r b i n a r y ( 'STOR '+o u t d i r+ f i l e + ' . t x t ' , u p l o a d f i l e ) # e n v i a o a r q u i v o para o s e r v i d o de dados uploadfile . close () session . quit () query = "UPDATE umts_control . l o g _ e t l SET f i l t e r ='"+s t r ( d a t e t i m e . d a t e t i m e . now ( ) ) [ 0 : 1 9 ] + " ' WHERE o s s ='"+s t r ( f i l e . s p l i t ( '_ ' ) [ 0 ] ) +" ' AND f i l e ='"+s t r ( ( f i l e . r p a r t i t i o n ( f i l e . s p l i t ( '_ ' ) [ 0 ] + '_ ' ) [ 2 ] ) [ : − 4 ] )+ " '" c u r s o r . e x e c u t e ( query ) db_conn . commit ( ) l o g = open ( l o g f i l e , " a " ) l o g . w r i t e ( d a t e t i m e . d a t e t i m e . now ( ) . s t r f t i m e ( '%d/%m/%Y − %H:%M:%S ' )+" : a r q u i v o "+ f i l e +" p a r s e a d o \n" ) log . close () o s . remove ( c o n v e r t e d d i r+ f i l e ) o s . remove ( tempdir+ f i l e ) o s . remove ( tempdir+ f i l e + ' . t x t ' ) 102 103 cursor . close () 76 A.2.4 1 auto-parse.sh #! / b i n / bash 2 3 4 5 6 7 IMP_FILES="/ e t l /umts/ p e r f o r m a n c e / c o n v e r t e d / " LOG=" /home/ e t l u s e r / l o g / auto_parse . l o g " PARSELOG=" /home/ e t l u s e r / l o g /parsePM . l o g " TREADS=4 T e s t I n t e r v a l =0 8 9 e x p o r t IMP_FILES LOG PARSELOG TREADS T e s t I n t e r v a l 10 11 12 13 14 15 h o r a r i o ( ) # f u n ç ã o que pega a data a t u a l { d a t e +%d/%m/%Y" − "%H:%M:%S } e x p o r t −f h o r a r i o 16 17 18 19 20 if [ [ ! $ ( l s −A $IMP_FILES) ] ] ; then echo " $ ( h o r a r i o ) : Nao ha a r q u i v o s a serem c a r r e g a d o s . ">>$LOG exit 1 else 21 pgrep −f p a r s e r . py # v e r i f i c a s e o s c r i p t de p a r s e r j á e s t á sendo executado i f [ $ ? −ne 0 ] ; then echo " $ ( h o r a r i o ) : Parse e x e c u t a d o . ">>$LOG echo −e "−\n$ ( h o r a r i o ) : I n i c i o da e x e c u c a o . ">>$PARSELOG cd $IMP_FILES T o t a l F i l e s=$ ( l s ∗ . c s v | wc − l ) p a r a l l e l −j$TREADS −u python3 . 4 / e t l / s c r i p t s / p a r s e r . py { } \ ; ' echo −e " \ n P r o g r e s s : {#}/ ' $ T o t a l F i l e s ' F i l e s p a r s e d \n" ' \ ; s l e e p $ T e s t I n t e r v a l : : : $ ( l s ∗ . c s v | s o r t −t "_" −k 5 ) echo " $ ( h o r a r i o ) : Fim da e x e c u c a o . ">>$PARSELOG exit 0 fi 22 23 24 25 26 27 28 29 30 31 32 fi 33 34 echo " $ ( h o r a r i o ) : P r o c e s s o j a em e x e c u c a o . ">>$LOG 35 36 exit 0 77 A.3 A.3.1 1 Carga staging.sh #! / b i n / bash 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 #d e f i n i e s PSQL=" p s q l " IOSTAT=" / u s r / b i n / i o s t a t " #V a r i a v e i s t r o c a r conforme n e c e s s i a d e T e s t I n t e r v a l =1 TAB_Pref="umts" IMP_DIR=" /home/ p o s t g r e s /$TAB_Pref/ p e r f o r m a n c e / " LOG=" /home/ p o s t g r e s / l o g / s t a g i n g / " CONTROLE=" /home/ p o s t g r e s / s c r i p t s / s t a g i n g _ b u l k l o a d . c l t " #c o n t r o l e de p r o c e s s o s MAXCPULOAD=3.2 #s y s l o a d 1min MINMEMFREE=100000 #kB MAXkBreads=50000 #kB_read/ s i n s t a l l s y s s t a t MAXkBwrtns=100000 #kB_wrtn/ s MAXTreads=1 MAXHDUsage=90 # % de d i s k para p a r a r BLOCK_DIR=" /home/ p o s t g r e s / b l o c k _ p r o c e s s " 20 21 22 #e x p o r t a t o d a s a s v a r i a v e i s para poder u s a r com o s s h e l l s f i l h o s e x p o r t PSQL IOSTAT T e s t I n t e r v a l TAB_Pref IMP_DIR MAXCPULOAD MINMEMFREE MAXkBreads MAXkBwrtns MAXTreads MAXHDUsage LOG CONTROLE BLOCK_DIR 23 24 25 #mata a execuo s e o d i r e t o r i o no f o r e n c o n t r a d o [ −d $IMP_DIR ] | | e x i t 1 26 27 #python $STATUS_MESSAGE ' S t a g i n g . sh r e s t a r t e d ' 28 29 30 31 32 33 34 35 36 37 38 CatchErrors ( ) { i f [ $ ? −eq 1 ] | | [ $ ? −eq 2 ] ; then echo −e " \ n S c r i p t aborted , b e c a u s e o f e r r o r s . \ n" k i l l $$ exit 1 fi } e x p o r t −f C a t c h E r r o r s #funo para r e a l i z a r o import propiamente d i t o RunPSQL ( ) { 39 40 41 FileName=$1 TAB_Name=$ ( echo $1 | c u t −d"_" −f 3 ) 78 42 43 44 45 46 47 48 49 50 echo −ne " \n\ npg_bulkload − i $FileName −O umts_counter . fss_$TAB_Name\ n" [ −r $FileName ] && time pg_bulkload − i $FileName −O umts_counter . fss_$TAB_Name −P $ {LOG}parseLog$TAB_Name . t x t −u $ {LOG} duplicadosLog$TAB_Name . t x t $CONTROLE CatchErrors DATE=$ ( d a t e +"%Y−%m−%d %T" ) C u t F i l e=$ { FileName##∗/} OSS=$ ( echo $ C u t F i l e | c u t −d"_" −f 1 ) FILE=$ ( echo $ { C u t F i l e%%.c s v . t x t } | c u t −d"_" −f2 −6) p s q l −c "UPDATE umts_control . l o g _ e t l SET b u l k l o a d = '$DATE' WHERE o s s = ' $OSS ' AND f i l e = ' $FILE ' ; " rm −f " $FileName " && echo " removed $ C u t F i l e " 51 52 53 54 55 } #e x p o r t a a funo para s h e l l s f i l h o s e x p o r t −f RunPSQL ControlLoad ( ) { 56 57 58 59 60 61 62 #r o t i n a s de t e s t e CPULOAD=$ ( c a t / p r o c / l o a d a v g | c u t −d" " −f 1 | t r " , " " . " ) MEMFREE=$ ( c a t / p r o c / meminfo | g r e p "MemFree" | t r −s " " | c u t −d" " −f 2 | t r " , " " . " ) # pode sem com o MemAvailable IOrwvet=($ ($IOSTAT | g r e p " sda " | t r −s " " | c u t −d" " −f3 , 4 | t r " , " " . ") ) NTreads=$ ( j o b s | g r e p −c "RunPSQL" ) HDUsage=$ ( d f 2> / dev / n u l l | g r e p " / var / l i b / p o s t g r e s q l " | t r −s " " | c u t −d" " −f 5 | t r −d "%" ) # t r o c a r o argumento do g r e p p e l o d i r e t o r i o de montagem como a p a r e c e no d f 2> / dev / n u l l 63 64 65 66 67 68 69 [ $ ( echo " $CPULOAD >= $MAXCPULOAD " | bc ) −eq 1 ] && blkCPU=1 | | blkCPU=0 [ $ ( echo " $MEMFREE <= $MINMEMFREE " | bc ) −eq 1 ] && blkMEM=1 | | blkMEM=0 [ $ ( echo " $ { IOrwvet [ 0 ] } > $MAXkBreads | | $ { IOrwvet [ 1 ] } > $MAXkBwrtns " | bc ) −eq 1 ] && blkIO=1 | | blkIO=0 [ $ ( echo " $NTreads >= $MAXTreads " | bc ) −eq 1 ] && blkTread=1 | | blkTread=0 [ [ $ ( echo " $HDUsage >= $MAXHDUsage " | bc ) −eq 1 ] ] && blkHDFull=1 | | blkHDFull=0 [ [ ` l s −A "$BLOCK_DIR" ` ] ] && BLOCK_PROCESS=1 | | BLOCK_PROCESS=0 70 71 72 73 74 # echo " $CPULOAD >= $MAXCPULOAD " # echo " $MEMFREE <= $MINMEMFREE " # echo " ${ IOrwvet [ 0 ] } > $MAXkBreads | | $ { IOrwvet [ 1 ] } > $MAXkBwrtns " BLOQUEADO=$ ( echo " $blkCPU + $blkMEM + $blkIO + $blkTread + $BLOCK_PROCESS " | bc ) 79 75 76 77 78 79 80 81 82 83 84 85 86 87 w h i l e [ $BLOQUEADO −ne 0 ] ; do #r o t i n a de t e s t e CPULOAD=$ ( c a t / p r o c / l o a d a v g | c u t −d" " −f 1 | t r " , " " . " ) MEMFREE=$ ( c a t / p r o c / meminfo | g r e p "MemFree" | t r −s " " | c u t −d" " −f 2 | t r " , " " . " ) # pode sem com o MemAvailable IOrwvet=($ ($IOSTAT | g r e p " sda " | t r −s " " | c u t −d" " −f3 , 4 | t r " ," " . ") ) NTreads=$ ( j o b s | g r e p −c "RunPSQL" ) HDUsage=$ ( d f 2> / dev / n u l l | g r e p "/ var / l i b / p g s q l " | t r −s " " | c u t −d" " −f 5 | t r −d "%" ) # t r o c a r o argumento do g r e p p e l o d i r e t o r i o de montagem como a p a r e c e no d f 2> / dev / n u l l [ $ ( echo " $CPULOAD >= $MAXCPULOAD " | bc ) −eq 1 ] && blkCPU=1 | | blkCPU=0 [ $ ( echo " $MEMFREE <= $MINMEMFREE " | bc ) −eq 1 ] && blkMEM=1 | | blkMEM=0 [ $ ( echo " $ { IOrwvet [ 0 ] } > $MAXkBreads | | ${ IOrwvet [ 1 ] } > $MAXkBwrtns " | bc ) −eq 1 ] && blkIO=1 | | blkIO=0 [ $ ( echo " $NTreads >= $MAXTreads " | bc ) −eq 1 ] && blkTread=1 | | blkTread=0 [ [ $ ( echo " $HDUsage >= $MAXHDUsage " | bc ) −eq 1 ] ] && blkHDFull =1 | | blkHDFull=0 [ [ ` l s −A "$BLOCK_DIR" ` ] ] && BLOCK_PROCESS=1 | | BLOCK_PROCESS=0 88 89 BLOQUEADO=$ ( echo " $blkCPU + $blkMEM + $blkIO + $blkTread + $blkHDFull + $BLOCK_PROCESS" | bc ) 90 91 92 93 94 95 96 97 98 echo " Blk s t a t u s ($BLOQUEADO) ; CPU: $CPULOAD >= $MAXCPULOAD( $blkCPU ) / MEM: $MEMFREE <= $MINMEMFREE($blkMEM) / IO : $ { IOrwvet [ 0 ] } > $MAXkBreads | | $ { IOrwvet [ 1 ] } > $MAXkBwrtns ( $blkIO ) / NTreads : $NTreads >= $MAXTreads ( $blkTread ) / HD: $HDUsage >= $MAXHDUsage ( $blkHDFull ) | | FLAG BLOCK: $BLOCK_PROCESS" sleep $TestInterval done #chama a funo de import em background RunPSQL $1 } #e x p o r t a a funo para s h e l l s f i l h o s e x p o r t −f ControlLoad 99 100 101 102 103 104 105 106 #l i s t a o s a r q u i v o s ordenando por data e r e v e r t e a s e q u e n c i a chamando a funo a cada l i n h a T o t a l F i l e s=$ ( l s $IMP_DIR | wc − l ) count=1 f o r t i m e s i n $ ( l s $IMP_DIR | c u t −d"_" −f 5 | s o r t | uniq ) ; do # echo −ne "\ r \ t \ t \ t t i m e s : $ t i m e s " f o r FILE i n $ ( l s $IMP_DIR/∗ $ { t i m e s }_∗ ) ; do echo −ne " \ n P r o g r e s s : $count / $ T o t a l F i l e s F i l e s l o a d . " 80 107 108 109 110 111 112 113 ( ( count++)) #echo $FILE ControlLoad $FILE #s l e e p $ T e s t I n t e r v a l done done echo −e " \n" 81 A.3.2 1 auto-staging.sh #! / b i n / bash 2 3 4 5 6 7 BLOCK_DIR=" /home/ p o s t g r e s / b l o c k _ p r o c e s s " IMP_FILES="/home/ p o s t g r e s / p e r f o r m a n c e /umts" PROCESS=" s t a g i n g . sh " LOG=" /home/ p o s t g r e s / l o g / s t a g i n g . t x t " E r r o r l o g=" /home/ p o s t g r e s / l o g / auto_stag . t x t " 8 9 10 11 12 h o r a r i o ( ) # f u n ç ã o que pega a data a t u a l { d a t e +%d/%m/%Y" − "%H:%M:%S } 13 14 [ [ ` l s −A $BLOCK_DIR` ] ] && echo " $ ( h o r a r i o ) : S t a g i n g bloqueado . ">> $ E r r o r l o g && e x i t 1 15 16 17 18 19 20 21 22 23 24 25 26 if [ [ ! ` l s −A $IMP_FILES` ] ] ; then echo " $ ( h o r a r i o ) : Nao ha a r q u i v o s a serem c a r r e g a d o s . ">>$ E r r o r l o g exit 1 else pgrep −f $PROCESS # v e r i f i c a s e o s c r i p t de s t a g i n g j á e s t á sendo executado i f [ $ ? −ne 0 ] ; then echo " $ ( h o r a r i o ) : S t a g i n g e x e c u t a d o . ">>$ E r r o r l o g /home/ p o s t g r e s / s c r i p t s /$PROCESS exit 0 fi fi 27 28 29 echo " $ ( h o r a r i o ) : P r o c e s s o j a em e x e c u c a o . ">>$ E r r o r l o g exit 0 82 Apêndice B Códigos Fonte - Processamento Neste apêndice estão alguns dos códigos fonte do processamento proposto neste trabalho. Para não ficar muito extenso, está disponível apenas o cálculo dos KPIs de Acessibilidade e o cálculo dos ofensores por RNC destes KPIs. 83 B.1 B.1.1 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 Cálculo dos KPIs de Acessibilidade View vw_acessibility.sql CREATE OR REPLACE VIEW umts_kpi . v w _ a c c e s s i b i l i t y AS SELECT f s s _ 6 7 1 0 9 3 6 5 . rnc , fss_67109365 . cellname , fss_67109365 . c e l l i d , f s s _ 6 7 1 0 9 3 6 5 . datetime , f s s _ 6 7 1 0 9 3 6 5 . gp , rrc_succconnestab_orgintercall + rrc_succconnestab_orgbkgcall + rrc_succconnestab_orgsubcall + rrc_succconnestab_tmitrcall + r r c _ s u c c c o n n e s t a b _ t m b k g c a l l AS acc_rrc_num , rrc_attconnestab_orgintercall + rrc_attconnestab_orgbkgcall + rrc_attconnestab_orgsubcall + rrc_attconnestab_tmintercall + r r c _ a t t c o n n e s t a b _ t m b k g c a l l AS acc_rrc_den , vs_rab_succestabcs_amr + vs_rab_succestabcs_amrwb AS acc_cs_rab_num , vs_rab_attestab_amr + vs_rab_attestabcs_amrwb AS acc_cs_rab_den , vs_rab_succestabps_conv + vs_rab_succestabps_str + vs_rab_succestabps_int + vs_rab_succestabps_bkg AS acc_ps_rab_num , vs_rab_attestabps_conv + v s _ r a b _ a t t e s t a b p s _ s t r + vs_rab_attestabps_int + vs_rab_attestabps_bkg AS acc_ps_rab_den , vs_hsdpa_rab_succestab AS acc_hs_num , vs_hsdpa_rab_attestab AS acc_hs_den , v s _ a t t r e c f g _ f 2 h _ d a t a t r a n s t r i g + v s _ a t t r e c f g _ p 2 h _ d a t a t r a n s t r i g AS acc_hs_f2h_num , v s _ s u c c r e c f g _ f 2 h _ d a t a t r a n s t r i g + v s _ s u c c r e c f g _ p 2 h _ d a t a t r a n s t r i g AS acc_hs_f2h_den FROM umts_counter . f s s _ 6 7 1 0 9 3 6 5 JOIN umts_counter . f s s _ 6 7 1 0 9 3 6 8 ON f s s _ 6 7 1 0 9 3 6 5 . r n c = f s s _ 6 7 1 0 9 3 6 8 . r n c AND f s s _ 6 7 1 0 9 3 6 5 . d a t e t i m e = f s s _ 6 7 1 0 9 3 6 8 . d a t e t i m e AND fss_67109365 . c e l l i d = fss_67109368 . c e l l i d JOIN umts_counter . f s s _ 6 7 1 0 9 3 7 2 ON f s s _ 6 7 1 0 9 3 6 5 . r n c = f s s _ 6 7 1 0 9 3 7 2 . r n c AND f s s _ 6 7 1 0 9 3 6 5 . d a t e t i m e = f s s _ 6 7 1 0 9 3 7 2 . d a t e t i m e AND fss_67109365 . c e l l i d = fss_67109372 . c e l l i d JOIN umts_counter . f s s _ 6 7 1 0 9 3 9 0 ON f s s _ 6 7 1 0 9 3 6 5 . r n c = f s s _ 6 7 1 0 9 3 9 0 . r n c AND f s s _ 6 7 1 0 9 3 6 5 . d a t e t i m e = f s s _ 6 7 1 0 9 3 9 0 . d a t e t i m e AND fss_67109365 . c e l l i d = fss_67109390 . c e l l i d LEFT JOIN umts_counter . f s s _ 8 2 8 6 4 1 3 1 ON f s s _ 6 7 1 0 9 3 6 5 . r n c = f s s _ 8 2 8 6 4 1 3 1 . r n c AND f s s _ 6 7 1 0 9 3 6 5 . d a t e t i m e = f s s _ 8 2 8 6 4 1 3 1 . d a t e t i m e AND f s s _ 6 7 1 0 9 3 6 5 . c e l l i d = f s s _ 8 2 8 6 4 1 3 1 . c e l l i d ; 84 B.1.2 1 2 3 4 Função PL/SQL inserir_kpi_accessibility.sql CREATE OR REPLACE FUNCTION umts_kpi . i n s e r i r _ k p i _ a c c e s s i b i l i t y ( data timestamp w i t h o u t time zone ) RETURNS SETOF umts_kpi . a c c e s s i b i l i t y AS $BODY$ 5 6 BEGIN 7 8 9 10 11 r e t u r n query e x e c u t e format ( ' s e l e c t v w _ a c c e s s i b i l i t y . rnc , v w _ a c c e s s i b i l i t y . cellname , v w _ a c c e s s i b i l i t y . c e l l i d , v w _ a c c e s s i b i l i t y . datetime , v w _ a c c e s s i b i l i t y . gp , v w _ a c c e s s i b i l i t y . acc_rrc_num , v w _ a c c e s s i b i l i t y . acc_rrc_den , v w _ a c c e s s i b i l i t y . acc_cs_rab_num , v w _ a c c e s s i b i l i t y . acc_cs_rab_den , v w _ a c c e s s i b i l i t y . acc_ps_rab_num , v w _ a c c e s s i b i l i t y . acc_ps_rab_den , v w _ a c c e s s i b i l i t y . acc_hs_num , v w _ a c c e s s i b i l i t y . acc_hs_den , v w _ a c c e s s i b i l i t y . acc_hs_f2h_num , v w _ a c c e s s i b i l i t y . acc_hs_f2h_den 12 13 14 15 16 from umts_kpi . v w _ a c c e s s i b i l i t y WHERE d a t e t i m e = ' '%I ' ' %s ' , data ) ; END; $BODY$ LANGUAGE p l p g s q l 85 B.1.3 1 inserir_kpi_accessibility.sh #! / b i n / bash 2 3 4 5 6 l o g=" /home/ p o s t g r e s / l o g / i n s e r i r K P I A c e s s i b i l i d a d e . t x t " l o g E r r o r=" /home/ p o s t g r e s / l o g / e r r o r I n s e r i r K P I A c e s s i b i l i d a d e . t x t " CONTROLE=" /home/ p o s t g r e s / s c r i p t s / b u l k l o a d _ c o n t r o l _ f u n c t i o n . c l t " BLOCK_DIR=" /home/ p o s t g r e s / b l o c k _ p r o c e s s / " 7 8 9 10 11 12 13 14 15 catch_errors () { i f [ $ ? −eq 1 ] | | [ $ ? −eq 2 ] ; then echo −e " \n$ ( h o r a r i o ) : S c r i p t f i n a l i z a d o d e v i d o a e r r o s . \ n" echo " $ ( h o r a r i o ) : S c r i p t f i n a l i z a d o d e v i d o a e r r o s . ">>$ l o g k i l l $$ exit 1 fi } 16 17 18 19 20 21 horario () { d a t e +%d/%m/%Y" − "%H:%M:%S } DATA=$1 # r e c e b e a data por l i n h a de comando 22 23 24 25 echo "−">>$ l o g echo " $ ( h o r a r i o ) : I n i c i o da e x e c u c a o . ">>$ l o g echo −e " \n$ ( h o r a r i o ) : I n i c i o da e x e c u c a o para c a l c u l o de KPIs A c e s s i b i l i d a d e para a data $DATA" 26 27 28 29 30 31 time ( echo −e " \n" pg_bulkload − i " umts_kpi . i n s e r i r _ k p i _ a c c e s s i b i l i t y ( '$DATAS' ) " −O umts_kpi . a c c e s s i b i l i t y −P $ l o g E r r o r $CONTROLE catch_errors echo " $ ( h o r a r i o ) : KPI a c e s s i b i l i d a d e c a l c u l a d o para a data $DATA">> $log echo −e " \n$ ( h o r a r i o ) : KPI a c e s s i b i l i d a d e c a l c u l a d o para a data $DATA ") 32 33 34 echo " $ ( h o r a r i o ) : Fim da e x e c u c a o . ">>$ l o g echo −e " \n$ ( h o r a r i o ) : Fim da e x e c u c a o para c a l c u l o s do KPI a c c e s s i b i l i d a d e para a data $DATA" 35 36 exit 0 86 B.2 Cálculo dos ofensores por RNC dos KPIs de Acessibilidade B.2.1 Função PL/SQL inserir_worst_cells_rnc_accessibility.sql 1 2 3 4 5 6 7 8 9 10 CREATE OR REPLACE FUNCTION umts_kpi . inserir_worst_cells_rnc_accessibility ( kpi text , data d a t e ) RETURNS SETOF umts_kpi . w o r s t _ c e l l s _ r n c _ a c c e s s i b i l i t y AS $BODY$ declare cur_row2 t e x t ; cur_row r e c o r d ; r worstcells_rnctype ; rank i n t e g e r ; 11 12 13 14 15 16 17 18 19 20 21 begin f o r cur_row2 i n e x e c u t e format ( 'SELECT d i s t i n c t r n c FROM umts_kpi . a c c e s s i b i l i t y _ r n c WHERE d a t e t i m e : : d a t e = ' '%s ' ' ORDER BY r n c ' , data ) loop r . new_rnc_kpi := 2 ; r . rank := 0 ; f o r cur_row i n e x e c u t e format ( 'SELECT A. rnc , A. c e l l i d , A. date , % s_num a s cell_kpi_num , %1$s_den a s cell_kpi_den , (%1$s_den − %1 $s_num ) a s c e l l _ f a i l s , rnc_kpi_num , rnc_kpi_den , ( rnc_kpi_den − rnc_kpi_num ) a s r n c _ f a i l s FROM umts_kpi . a c c e s s i b i l i t y _ d a i l y A JOIN (SELECT rnc , date , SUM(%1$s_num ) a s rnc_kpi_num , SUM(%1$s_den ) a s rnc_kpi_den FROM umts_kpi . a c c e s s i b i l i t y _ d a i l y WHERE r n c = ' '%s ' ' AND d a t e = ' '%s ' ' GROUP BY rnc , d a t e ) B ON A. r n c = B . r n c AND A. d a t e = B . d a t e WHERE A. r n c = ' '%2$ s ' ' AND A. d a t e = ' '%3$ s ' ' ORDER BY c e l l _ f a i l s DESC ' , kpi , cur_row2 , data ) 22 23 loop 24 25 26 27 i f ( r . new_rnc_kpi = 2 ) then r . new_rnc_kpi := COALESCE( cur_row . rnc_kpi_num / NULLIF ( cur_row . rnc_kpi_den , 0 ) , 1 ) ; end i f ; 28 29 r . r n c := cur_row . r n c ; 87 30 31 32 33 34 35 36 37 38 39 40 41 r . c e l l i d := cur_row . c e l l i d ; r . d a t e := cur_row . d a t e ; r . k p i := format ( '%s ' , k p i ) ; r . cell_kpi_num := cur_row . cell_kpi_num ; r . cell_kpi_den := cur_row . cell_kpi_den ; r . c e l l _ f a i l s := cur_row . c e l l _ f a i l s ; r . rnc_kpi_num := cur_row . rnc_kpi_num ; r . rnc_kpi_den := cur_row . rnc_kpi_den ; r . impact := COALESCE( cur_row . c e l l _ f a i l s / NULLIF ( cur_row . rnc_fails , 0) , 0) ; r . rnc_kpi := COALESCE( cur_row . rnc_kpi_num / NULLIF ( cur_row . rnc_kpi_den , 0 ) , 1 ) ; r . new_rnc_kpi := r . new_rnc_kpi + COALESCE( cur_row . c e l l _ f a i l s / NULLIF ( cur_row . rnc_kpi_den , 0 ) , 0 ) ; r . rank := r . rank + 1 ; 42 43 44 45 r e t u r n next r ; end l o o p ; end l o o p ; 46 47 48 49 end ; $BODY$ LANGUAGE p l p g s q l 88 B.2.2 1 inserir_worst_cells_rnc_accessibility.sh #! / b i n / bash 2 3 4 5 l o g=" /home/ p o s t g r e s / l o g / i n s e r i r W o r s t C e l l s R N C A c c e s s i b i l i t y . t x t " l o g E r r o r=" /home/ p o s t g r e s / l o g / e r r o r I n s e r i r W o r s t C e l l s R N C A c c e s s i b i l i t y . t x t " CONTROLE=" /home/ p o s t g r e s / s c r i p t s / b u l k l o a d _ c o n t r o l _ f u n c t i o n . c l t " 6 7 8 9 10 11 12 13 14 catch_errors () { i f [ $ ? −eq 1 ] | | [ $ ? −eq 2 ] ; then echo −e " \n$ ( h o r a r i o ) : S c r i p t f i n a l i z a d o d e v i d o a e r r o s . \ n" echo " $ ( h o r a r i o ) : S c r i p t f i n a l i z a d o d e v i d o a e r r o s . ">>$ l o g k i l l $$ exit 1 fi } 15 16 17 18 19 20 horario () { d a t e +%d/%m/%Y" − "%H:%M:%S } DIA=$1 #r e c e b e o d i a por l i n h a de comando 21 22 23 24 echo "−">>$ l o g echo " $ ( h o r a r i o ) : I n i c i o da e x e c u c a o . ">>$ l o g echo −e " \n$ ( h o r a r i o ) : I n i c i o da e x e c u c a o para c a l c u l o s das p i o r e s c e l u l a s para o d i a $DIA" 25 26 27 28 29 30 l i s t a D e K P I s=" r r c _ e f c cs_rab_acc ps_rab_acc hs_acc hs_acc_f2h " 31 32 33 34 35 36 37 38 f o r KPI i n $ l i s t a D e K P I s ; do time ( echo −e " \n" pg_bulkload − i " umts_kpi . i n s e r i r _ w o r s t _ c e l l s _ r n c _ a c c e s s i b i l i t y ( ' $KPI ' , ' $DIA ' ) " −O umts_kpi . w o r s t _ c e l l s _ r n c _ a c c e s s i b i l i t y −P $ l o g E r r o r $CONTROLE catch_errors echo " $ ( h o r a r i o ) : Worst C e l l s RNC A c c e s s i b i l i t y do KPI $KPI c a r r e g a d o s para o d i a $DIA">>$ l o g echo −e " \n$ ( h o r a r i o ) : Worst C e l l s RNC A c c e s s i b i l i t y do KPI $KPI c a r r e g a d o s para o d i a $DIA" ) done 39 89 40 41 42 echo " $ ( h o r a r i o ) : Fim da e x e c u c a o . ">>$ l o g echo −e " \n$ ( h o r a r i o ) : Fim da e x e c u c a o para c a l c u l o s das p i o r e s c e l u l a s para o d i a $DIA" p s q l −c "VACUUM ANALYZE umts_kpi . w o r s t _ c e l l s _ r n c _ a c c e s s i b i l i t y ; " 43 44 exit 0 90