diff --git a/templates_gold/ping/template_icmp_ping_gold_ptbr.yaml b/templates_gold/ping/template_icmp_ping_gold_ptbr.yaml new file mode 100644 index 0000000..3c9b73e --- /dev/null +++ b/templates_gold/ping/template_icmp_ping_gold_ptbr.yaml @@ -0,0 +1,282 @@ +zabbix_export: + version: '7.0' + template_groups: + - uuid: 4322df9ecdf44b26b60c5bc406bc844f + name: Templates/Network devices + templates: + - uuid: a04dd94507e94e888fd2a288f7b55b9f + template: ICMP Ping + name: ICMP Ping + description: 'Template ICMP Ping (Arthur Style) + + + Monitoramento de disponibilidade e tempo de resposta via ICMP. + + + Itens: + + - Status (Ping) + + - Perda de Pacotes (%) + + - Tempo de Resposta (s) + + + Triggers com design "Arthur": + + - Emojis de severidade + + - Instruções de Ação e Impacto + + - Event Names ricos com valores + + + Análise Avançada: + + - Detecção de Degradação (Tendência de Latência) + + - Detecção de Instabilidade (Jitter percebido) + + ' + vendor: + name: IT Guys + version: 7.0-0 + groups: + - name: Templates/Network devices + items: + - uuid: a5d833a13151456eafb79e634cd88fa0 + name: Ping (Status) + type: SIMPLE + key: icmpping + description: 'Verifica a acessibilidade do host via ICMP Ping. + + + 0 - Host inacessível (Offline) + + 1 - Host acessível (Online) + + ' + valuemap: + name: Estado do Serviço + tags: + - tag: componente + value: saude + - tag: componente + value: rede + triggers: + - uuid: 4c33295f2ce84612958bb007255ec165 + expression: max(/ICMP Ping/icmpping,#3)=0 + name: 🚨 Host Indisponível (Ping Down) + event_name: '🚨 Host Indisponível: {HOST.NAME} não responde a Ping (Status: Down)' + priority: HIGH + description: 'O dispositivo não está respondendo a requisições ICMP (Ping) nas últimas 3 tentativas. + + + Impacto: Serviços dependentes deste host estão inacessíveis. + + Ação: + + 1. Verifique se o equipamento está ligado. + + 2. Verifique a conectividade física (cabos, portas de switch). + + 3. Verifique bloqueios de Firewall/Segurança. + + ' + tags: + - tag: escopo + value: disponibilidade + - uuid: 6ca8a13276864f0cac7a7132d9b192ba + name: Perda de Pacotes + type: SIMPLE + key: icmppingloss + value_type: FLOAT + units: '%' + description: Porcentagem de pacotes perdidos. + tags: + - tag: componente + value: saude + - tag: componente + value: rede + triggers: + - uuid: 81af653371c0451aa7fc2a6afa2e24ff + expression: min(/ICMP Ping/icmppingloss,5m)>{$ICMP_LOSS_WARN} and min(/ICMP Ping/icmppingloss,5m)<100 + name: ⚠️ Alta Perda de Pacotes + event_name: '⚠️ Perda de Pacotes em {HOST.NAME}: {ITEM.LASTVALUE} (Limite: > {$ICMP_LOSS_WARN}%)' + opdata: 'Perda Atual: {ITEM.LASTVALUE1}' + priority: WARNING + description: 'Detectada perda de pacotes ICMP acima do limite configurado. + + + Impacto: Lentidão, desconexões e falhas em aplicações sensíveis. + + Ação: + + 1. Verifique congestionamento no link de rede. + + 2. Verifique qualidade do cabeamento físico (erros de CRC). + + 3. Verifique duplex mismatch em interfaces. + + ' + dependencies: + - name: 🚨 Host Indisponível (Ping Down) + expression: max(/ICMP Ping/icmpping,#3)=0 + tags: + - tag: escopo + value: disponibilidade + - tag: escopo + value: performance + - uuid: 9678ce4ab93642889984d75098059b13 + name: Tempo de Resposta (Latência) + type: SIMPLE + key: icmppingsec + value_type: FLOAT + units: s + description: Tempo de resposta do Ping ICMP (em segundos). + tags: + - tag: componente + value: saude + - tag: componente + value: rede + triggers: + - uuid: 644c6ea04b2d4eabaafe666b86083e68 + expression: avg(/ICMP Ping/icmppingsec,5m)>{$ICMP_RESPONSE_TIME_WARN} + name: 🐢 Latência Alta (Lag) + event_name: '🐢 Latência Alta em {HOST.NAME}: {ITEM.LASTVALUE} (Limite: > {$ICMP_RESPONSE_TIME_WARN}s)' + opdata: 'Latência: {ITEM.LASTVALUE1}' + priority: WARNING + description: 'O tempo médio de resposta ICMP está muito alto. + + + Impacto: Degradação de performance em serviços (RDP, VoIP, Banco de Dados). + + Ação: + + 1. Verifique saturação de banda de internet/rede. + + 2. Verifique alta carga de CPU no roteador ou firewall. + + 3. Rastreie a rota (traceroute) para identificar gargalos. + + ' + dependencies: + - name: ⚠️ Alta Perda de Pacotes + expression: min(/ICMP Ping/icmppingloss,5m)>{$ICMP_LOSS_WARN} and min(/ICMP Ping/icmppingloss,5m)<100 + - name: 🚨 Host Indisponível (Ping Down) + expression: max(/ICMP Ping/icmpping,#3)=0 + tags: + - tag: escopo + value: disponibilidade + - tag: escopo + value: performance + - uuid: 776c9bb9c1044262b0ab42c9cae4d6ed + expression: avg(/ICMP Ping/icmppingsec,5m) > 1.5 * avg(/ICMP Ping/icmppingsec,1h) and avg(/ICMP Ping/icmppingsec,5m) > 0.05 + name: 🐢 Possível Degradação de Link (Basineline Change) + event_name: '🐢 Possível Degradação em {HOST.NAME}: Latência subiu 50% em relação à média (Atual: {ITEM.LASTVALUE})' + opdata: 'Atual: {ITEM.LASTVALUE1} | Média 1h: {ITEM.LASTVALUE2}' + priority: INFO + description: 'A latência atual aumentou 50% em comparação com a média da última hora. + + + Isso pode indicar um início de congestionamento ou alteração de rota, mesmo que não tenha atingido o limite crítico ainda. + + ' + dependencies: + - name: 🐢 Latência Alta (Lag) + expression: avg(/ICMP Ping/icmppingsec,5m)>{$ICMP_RESPONSE_TIME_WARN} + tags: + - tag: escopo + value: performance + - tag: tipo + value: anomalia + - uuid: b23c4caf44eb4fed90250d1c3b938f39 + name: Jitter (Variação de Latência) + type: CALCULATED + key: icmp.jitter + params: stddevpop(//icmppingsec,1m) + value_type: FLOAT + units: s + description: 'Desvio padrão da latência no último minuto. + + Indica a estabilidade da conexão. + + ' + tags: + - tag: componente + value: rede + triggers: + - uuid: ff51182051234ec79b61d13b7505064a + expression: min(/ICMP Ping/icmp.jitter,5m) > 0.05 + name: ⚠️ Instabilidade de Latência (Jitter Elevado) + event_name: '⚠️ Conexão Instável em {HOST.NAME}: Jitter de {ITEM.LASTVALUE}' + opdata: 'Jitter: {ITEM.LASTVALUE1}' + priority: WARNING + description: 'A variação da latência (Jitter) está muito alta (> 50ms). + + + Impacto: Chamadas de voz robóticas, lag em jogos/RDP. + + Ação: Verificar qualidade do link ou interferência. + + ' + tags: + - tag: escopo + value: performance + tags: + - tag: classe + value: rede + - tag: alvo + value: icmp + macros: + - macro: '{$ICMP_LOSS_WARN}' + value: '20' + description: Limiar de alerta para perda de pacotes em %. + - macro: '{$ICMP_RESPONSE_TIME_WARN}' + value: '0.15' + description: Limiar de alerta para tempo de resposta ICMP em segundos. + valuemaps: + - uuid: ff98a96f65b847ffb8827efa21d95a93 + name: Estado do Serviço + mappings: + - value: '0' + newvalue: Offline (Down) + - value: '1' + newvalue: Online (Up) + dashboards: + - uuid: f4ffe799a4c6415fb5ca0c947fa39a2a + name: Desempenho de Rede ICMP + pages: + - widgets: + - type: graph + width: '24' + height: '10' + fields: + - type: GRAPH + name: graphid + value: + host: ICMP Ping + name: 'Ping: Latência e Perda de Pacotes' + - type: INTEGER + name: show_legend + value: '1' + graphs: + - uuid: 8ca17283137d4a02b34342c88338677d + name: 'Ping: Latência e Perda de Pacotes' + width: '900' + height: '200' + yaxismax: '100' + yaxismin: '0' + ymax_type_1: FIXED + graph_items: + - color: 00C800 + item: + host: ICMP Ping + key: icmppingsec + - sortorder: '1' + drawtype: GRADIENT_LINE + color: C80000 + yaxisside: RIGHT + item: + host: ICMP Ping + key: icmppingloss diff --git a/templates_gold/ping/template_icmp_ping_gold_ptbr_generated.md b/templates_gold/ping/template_icmp_ping_gold_ptbr_generated.md new file mode 100644 index 0000000..6d4c103 --- /dev/null +++ b/templates_gold/ping/template_icmp_ping_gold_ptbr_generated.md @@ -0,0 +1,38 @@ +# Documentação: ICMP Ping + +**Template:** ICMP Ping +**Descrição:** +Template ICMP Ping (Arthur Style) + +Monitoramento de disponibilidade e tempo de resposta via ICMP. + +Itens: +- Status (Ping) +- Perda de Pacotes (%) +- Tempo de Resposta (s) + +Triggers com design "Arthur": +- Emojis de severidade +- Instruções de Ação e Impacto +- Event Names ricos com valores + +Análise Avançada: +- Detecção de Degradação (Tendência de Latência) +- Detecção de Instabilidade (Jitter percebido) + +## Itens Monitorados + +### Itens Globais +- **Ping (Status)** (`icmpping`) +- **Perda de Pacotes** (`icmppingloss`) +- **Tempo de Resposta (Latência)** (`icmppingsec`) +- **Jitter (Variação de Latência)** (`icmp.jitter`) + +## Alertas (Triggers) + +### Triggers Globais +- [HIGH] **🚨 Host Indisponível (Ping Down)** +- [WARNING] **⚠️ Alta Perda de Pacotes** +- [WARNING] **🐢 Latência Alta (Lag)** +- [INFO] **🐢 Possível Degradação de Link (Basineline Change)** +- [WARNING] **⚠️ Instabilidade de Latência (Jitter Elevado)** diff --git a/validate_zabbix_template.py b/validate_zabbix_template.py index bad3a61..c832bcf 100644 --- a/validate_zabbix_template.py +++ b/validate_zabbix_template.py @@ -190,6 +190,73 @@ def validate_dashboard_references(content, graph_names): return errors +def validate_calculated_formulas(content): + """ + Check for deprecated or invalid functions in Calculated Items (Zabbix 7.0 compatibility). + e.g. 'stddev' is not valid, should be 'stddevpop' or 'stddevsamp'. + """ + errors = [] + + def check_formulas(node, path="root"): + if isinstance(node, dict): + # Check if it's a calculated item + if node.get('type') == 'CALCULATED' and 'params' in node: + params = node['params'] + + # Check for 'stddev(' -> Deprecated/Invalid in 6.0+ + if 'stddev(' in params: + errors.append(f"[INVALID FORMULA] 'stddev' function usage at {path}. Use 'stddevpop' (population) or 'stddevsamp' (sample) instead.") + + for k, v in node.items(): + check_formulas(v, f"{path}.{k}") + elif isinstance(node, list): + for i, item in enumerate(node): + check_formulas(item, f"{path}[{i}]") + + check_formulas(content) + return errors + + +def validate_nested_structure(content): + """ + Check for bad nesting, specifically Items nested inside Trigger lists. + This happens when indentation is wrong in YAML. + """ + errors = [] + + def check_structure(node, path="root", parent_context=None): + if isinstance(node, dict): + # Identify current context based on keys + is_trigger = 'expression' in node and 'priority' in node + is_item = 'key' in node and 'type' in node + + if parent_context == 'triggers': + # If we are inside a 'triggers' list, we should ONLY see triggers. + # If we see an item (has 'key' and 'type'), it's a nesting error. + if is_item and not is_trigger: # Triggers don't have 'type' usually, but items do. + # Extra check: 'key' is definitely an item property, not trigger + if 'key' in node: + errors.append(f"[BAD NESTING] Found Item with key '{node.get('key')}' nested inside 'triggers' list at {path}. Check indentation.") + + # Recurse + for k, v in node.items(): + # Pass context if we are entering a relevant list + next_context = None + if k == 'triggers': + next_context = 'triggers' + elif k == 'items': + next_context = 'items' + + check_structure(v, f"{path}.{k}", next_context) + + elif isinstance(node, list): + for i, item in enumerate(node): + check_structure(item, f"{path}[{i}]", parent_context) + + check_structure(content) + return errors + + def check_duplicate_yaml_keys(file_path): """ Check for duplicate YAML keys at the same level (e.g., two 'macros:' sections). @@ -333,7 +400,7 @@ def validate_yaml(file_path): print(f" ✅ All graph item references are valid ({len(item_keys)} items found)") # ========== 4. Dashboard Graph References ========== - print("\n[4/4] Checking dashboard graph references...") + print("\n[4/6] Checking dashboard graph references...") graph_names = collect_graph_names(content) dashboard_ref_errors = validate_dashboard_references(content, graph_names) if dashboard_ref_errors: @@ -342,6 +409,24 @@ def validate_yaml(file_path): else: print(f" ✅ All dashboard graph references are valid ({len(graph_names)} graphs found)") + # ========== 5. Calculated Formulas Check ========== + print("\n[5/6] Checking calculated item formulas...") + formula_errors = validate_calculated_formulas(content) + if formula_errors: + all_errors.extend(formula_errors) + print(f" ❌ Found {len(formula_errors)} invalid formulas") + else: + print(" ✅ Formula syntax looks compatible") + + # ========== 6. Nested Structure Check ========== + print("\n[6/6] Checking for structure nesting errors...") + nesting_errors = validate_nested_structure(content) + if nesting_errors: + all_errors.extend(nesting_errors) + print(f" ❌ Found {len(nesting_errors)} nesting errors (items inside triggers, etc)") + else: + print(" ✅ Structure nesting looks correct") + # ========== Summary ========== print("\n" + "=" * 60)