{"id":642,"date":"2026-08-31T20:18:29","date_gmt":"2026-08-31T23:18:29","guid":{"rendered":"https:\/\/carloslopes.programandosolucoes.com.br\/index.php\/portfolio-telemetria-pabx\/"},"modified":"2026-08-31T20:35:03","modified_gmt":"2026-08-31T23:35:03","slug":"portfolio-telemetria-pabx","status":"publish","type":"page","link":"https:\/\/carloslopes.programandosolucoes.com.br\/it\/index.php\/portfolio-telemetria-pabx\/","title":{"rendered":"Telemetria de 250+ PABXs, Observabilidade Zabbix e Previs\u00e3o de Churn"},"content":{"rendered":"<style>\n.pf-wrap{max-width:1100px;margin:0 auto;font-size:16px;line-height:1.65}\n.pf-chamada{font-size:1.15rem;opacity:.85;margin:0 0 2rem}\n.pf-grade{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:1.5rem}\n.pf-card{border:1px solid rgba(128,128,128,.3);border-radius:10px;overflow:hidden;display:flex;flex-direction:column;transition:transform .15s ease,box-shadow .15s ease}\n.pf-card:hover{transform:translateY(-3px);box-shadow:0 8px 24px rgba(0,0,0,.12)}\n.pf-card img{width:100%;height:180px;object-fit:cover;display:block;background:rgba(128,128,128,.12)}\n.pf-card-corpo{padding:1rem 1.1rem 1.2rem;display:flex;flex-direction:column;gap:.6rem;flex:1}\n.pf-card h3{margin:0;font-size:1.05rem;line-height:1.35}\n.pf-card p{margin:0;font-size:.92rem;opacity:.85;flex:1}\n.pf-chips{display:flex;flex-wrap:wrap;gap:.35rem}\n.pf-chip{font-size:.75rem;padding:.18rem .55rem;border-radius:999px;border:1px solid rgba(128,128,128,.35);opacity:.9}\n.pf-meta{font-size:.8rem;opacity:.7}\n.pf-cadeado{font-size:.8rem;opacity:.75}\n.pf-hero{margin:0 0 1.5rem}\n.pf-hero h1{margin:0 0 .4rem;line-height:1.2}\n.pf-secao{margin:2rem 0}\n.pf-secao h2{font-size:1.15rem;margin:0 0 .6rem;text-transform:uppercase;letter-spacing:.06em;opacity:.75}\n.pf-galeria{display:grid;gap:1.2rem;margin:2rem 0}\n.pf-galeria figure{margin:0}\n.pf-galeria img{width:100%;border:1px solid rgba(128,128,128,.3);border-radius:8px;display:block}\n.pf-galeria figcaption{font-size:.85rem;opacity:.75;margin-top:.4rem}\n.pf-repo{border:1px solid rgba(128,128,128,.35);border-left-width:4px;border-radius:8px;padding:1rem 1.2rem;margin:2rem 0}\n.pf-repo h2{margin:0 0 .5rem;font-size:1rem;text-transform:uppercase;letter-spacing:.06em}\n.pf-repo pre{background:rgba(128,128,128,.12);padding:.7rem .9rem;border-radius:6px;overflow-x:auto;margin:.6rem 0;font-size:.85rem}\n.pf-contato{margin:2rem 0;padding-top:1.2rem;border-top:1px solid rgba(128,128,128,.3);font-size:.95rem}\n.pf-voltar{display:inline-block;margin-bottom:1rem;font-size:.9rem}\n@media (max-width:600px){.pf-card img{height:150px}}\n<\/style>\n<div class=\"pf-wrap\">\n  <a class=\"pf-voltar\" href=\"\/index.php\/portfolio-frontend\/\">\u2190 voltar ao portf\u00f3lio<\/a><\/p>\n<header class=\"pf-hero\">\n<p class=\"pf-meta\">07\/2026 &#8211; atual \u00b7 2 meses<\/p>\n<p>Espinha dorsal de telemetria para 250+ PABXs com cache Read-Through, observabilidade Zabbix e previs\u00e3o de churn por s\u00e9ries temporais.<\/p>\n<div class=\"pf-chips\"><span class=\"pf-chip\">Python 3.14<\/span><span class=\"pf-chip\">SQLite WAL<\/span><span class=\"pf-chip\">Zabbix LLD<\/span><span class=\"pf-chip\">JSONPath<\/span><span class=\"pf-chip\">Flask<\/span><span class=\"pf-chip\">ITU-T G.107<\/span><span class=\"pf-chip\">NumPy<\/span><span class=\"pf-chip\">SPA JavaScript<\/span><span class=\"pf-chip\">Docker<\/span><span class=\"pf-chip\">Systemd<\/span><span class=\"pf-chip\">S\u00e9ries Temporais<\/span><\/div>\n<\/header>\n<section class=\"pf-secao\">\n<h2>O problema<\/h2>\n<p>Monitorar uma farm de mais de 250 PABXs Yeastar P-Series em nuvem consultando APIs ao vivo para auditar chamadas e extrair m\u00e9tricas operacionais gera rate limits, lentid\u00e3o de rede e risco de indisponibilidade nas centrais. Al\u00e9m disso, o cancelamento de contratos B2B ocorre de forma silenciosa ap\u00f3s semanas de degrada\u00e7\u00e3o t\u00e9cnica de voz n\u00e3o percebida pelo suporte, e o NOC precisava de observabilidade no padr\u00e3o Zabbix sem onerar a CPU dos PABXs.<\/p>\n<\/section>\n<section class=\"pf-secao\">\n<h2>A arquitetura<\/h2>\n<p>A arquitetura foi estruturada em tr\u00eas pilares fundamentais documentados no manual t\u00e9cnico do sistema:<\/p>\n<p>1. INGEST\u00c3O &amp; CACHE READ-THROUGH (CdrIndex): O coletor em Python faz a ingest\u00e3o ass\u00edncrona por janelas deslizantes, governada por or\u00e7amento de tokens por tenant contra a OpenAPI (\/openapi\/v1.0\/) do Yeastar. Os dados s\u00e3o normalizados e gravados com idempot\u00eancia determin\u00edstica em SQLite no modo WAL. O tenant sint\u00e9tico __ALL__ materializa a soma da carteira na pr\u00f3pria escrita (grava\u00e7\u00e3o dupla), tornando a vis\u00e3o global uma leitura O(1) de uma linha em vez de um fan-out sobre 250+ bancos. O Analisador de \u00c1udio consome essa base local diretamente em microssegundos (CdrIndex) para casar grava\u00e7\u00f5es WAV e CDRs com custo zero de rede externa, com fallback transparente sob demanda.<\/p>\n<p>2. OBSERVABILIDADE ZABBIX &amp; KPI_CACHE: Inspirado no modelo de coleta do Zabbix, desenvolvi o endpoint nativo \/api\/metrics\/zabbix com payload plano (Flat JSON) direto na raiz, otimizado para Low-Level Discovery (LLD) e JSONPath para itens dependentes sem sobrecarga de CPU. Todas as m\u00e9tricas s\u00e3o pr\u00e9-materializadas assincronamente em kpi_cache para que consultas de monitoramento do NOC nunca disparem queries pesadas nas centrais. O payload inclui autodiagn\u00f3stico de frescor com kpi_calculado_em, kpi_idade_s e a flag booleana kpi_vencido, alertando se a esteira de dados parar.<\/p>\n<p>3. PREVIS\u00c3O DE CHURN &amp; MUDAN\u00c7A DE OPERA\u00c7\u00c3O: Motor de an\u00e1lise de s\u00e9ries temporais que monitora m\u00e9dias m\u00f3veis e desvios de volumetria (alertas autom\u00e1ticos para quedas de 30% a 50% de uso). Cruza esses desvios com m\u00e9tricas de qualidade de voz do DSP (MOS ITU-T G.107, taxas de picote, dead-air e anomalias de troncos SIP), classificando a carteira em 4 faixas de risco (Saud\u00e1vel, Aten\u00e7\u00e3o, Risco e Sem Uso).<\/p>\n<p>4. FRONTEND &amp; SEGURAN\u00c7A (LGPD): Dashboard SPA modular em JavaScript nativo (sub-100ms de renderiza\u00e7\u00e3o) com rosca de sa\u00fade da carteira, tela de Mudan\u00e7a de Opera\u00e7\u00e3o e telemetria detalhada de ramais. Controle de acesso rigoroso por allowlist de pap\u00e9is (admin, gestor, cliente, ramal) com barreira de LGPD no after_request que expurga dados sens\u00edveis e transcri\u00e7\u00f5es de perfis n\u00e3o autorizados.<\/p>\n<\/section>\n<section class=\"pf-secao\">\n<h2>O resultado<\/h2>\n<p>Elimina\u00e7\u00e3o de dezenas de milhares de requisi\u00e7\u00f5es redundantes di\u00e1rias nas centrais telef\u00f4nicas atrav\u00e9s do cache Read-Through; integra\u00e7\u00e3o de telemetria em tempo real com Zabbix e NOC sem nenhum impacto nas APIs dos PABXs; e identifica\u00e7\u00e3o preditiva de clientes em risco de cancelamento semanas antes da abertura de tickets de suporte.<\/p>\n<\/section>\n<div class=\"pf-galeria\">\n<figure>\n      <img decoding=\"async\" src=\"https:\/\/carloslopes.programandosolucoes.com.br\/wp-content\/uploads\/portfolio\/telemetria-01-geral.png\" alt=\"Dashboard Geral de Telemetria: vis\u00e3o global da carteira com 232 centrais, KPIs de topo e distribui\u00e7\u00e3o de sa\u00fade\" loading=\"lazy\"><figcaption>Dashboard Geral de Telemetria: vis\u00e3o global da carteira com 232 centrais, KPIs de topo e distribui\u00e7\u00e3o de sa\u00fade<\/figcaption><\/figure>\n<figure>\n      <img decoding=\"async\" src=\"https:\/\/carloslopes.programandosolucoes.com.br\/wp-content\/uploads\/portfolio\/telemetria-02-problemas.png\" alt=\"Painel de Mudan\u00e7a de Opera\u00e7\u00e3o: identifica\u00e7\u00e3o precoce de clientes com queda brusca de tr\u00e1fego e anomalias de uso\" loading=\"lazy\"><figcaption>Painel de Mudan\u00e7a de Opera\u00e7\u00e3o: identifica\u00e7\u00e3o precoce de clientes com queda brusca de tr\u00e1fego e anomalias de uso<\/figcaption><\/figure>\n<figure>\n      <img decoding=\"async\" src=\"https:\/\/carloslopes.programandosolucoes.com.br\/wp-content\/uploads\/portfolio\/telemetria-03-ramais.png\" alt=\"Telemetria de Ramais: monitoramento individual de ramais, tr\u00e1fego e chamadas \u00fateis por PABX\" loading=\"lazy\"><figcaption>Telemetria de Ramais: monitoramento individual de ramais, tr\u00e1fego e chamadas \u00fateis por PABX<\/figcaption><\/figure>\n<\/p><\/div>\n<div class=\"pf-repo\">\n<h2>\ud83d\udd12 C\u00f3digo-fonte<\/h2>\n<pre><code>git clone https:\/\/git.programandosolucoes.com.br\/git\/repos\/analisador-chamadas.git<\/code><\/pre>\n<p>C\u00f3digo-fonte privado. As credenciais de leitura s\u00e3o liberadas sob solicita\u00e7\u00e3o \u2014 me chame para conversar sobre o projeto.<\/p>\n<\/p><\/div>\n<div class=\"pf-contato\">\n    <strong>Carlos Alberto<\/strong> \u2014 carlosalberto4ti@gmail.com \u00b7 +55 11 2615-2880\n  <\/div>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>\u2190 voltar ao portf\u00f3lio 07\/2026 &#8211; atual \u00b7 2 meses Espinha dorsal de telemetria para 250+ PABXs com cache Read-Through, observabilidade Zabbix e previs\u00e3o de churn por s\u00e9ries temporais. Python 3.14SQLite WALZabbix LLDJSONPathFlaskITU-T G.107NumPySPA JavaScriptDockerSystemdS\u00e9ries Temporais O problema Monitorar uma farm de mais de 250 PABXs Yeastar P-Series em nuvem consultando APIs ao vivo para [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-642","page","type-page","status-publish","hentry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"it","enabled_languages":["en","br","it"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"br":{"title":false,"content":false,"excerpt":false},"it":{"title":false,"content":false,"excerpt":false}}},"_links":{"self":[{"href":"https:\/\/carloslopes.programandosolucoes.com.br\/it\/index.php\/wp-json\/wp\/v2\/pages\/642","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/carloslopes.programandosolucoes.com.br\/it\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/carloslopes.programandosolucoes.com.br\/it\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/carloslopes.programandosolucoes.com.br\/it\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/carloslopes.programandosolucoes.com.br\/it\/index.php\/wp-json\/wp\/v2\/comments?post=642"}],"version-history":[{"count":1,"href":"https:\/\/carloslopes.programandosolucoes.com.br\/it\/index.php\/wp-json\/wp\/v2\/pages\/642\/revisions"}],"predecessor-version":[{"id":651,"href":"https:\/\/carloslopes.programandosolucoes.com.br\/it\/index.php\/wp-json\/wp\/v2\/pages\/642\/revisions\/651"}],"wp:attachment":[{"href":"https:\/\/carloslopes.programandosolucoes.com.br\/it\/index.php\/wp-json\/wp\/v2\/media?parent=642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}