Techerest

Network Incident Automation & Ticket Integration

Network Incident Automation & Ticket Integration | Techerest

Network Incident Automation & Ticket Integration — Alert Webhooks, Incident Deduplication, Ticket Lifecycle และ Automated Evidence Collection

คู่มือสำหรับ Network Engineer และ Network Operations ที่ต้องการเชื่อม Monitoring เข้ากับระบบ Incident Management ด้วยขั้นตอนและตัวอย่าง Lab ที่ตรวจสอบได้

บทนำ: จาก Alert สู่ Incident ที่ติดตามได้

เมื่อระบบ Monitoring ตรวจพบปัญหา เช่น Switch Uplink Down หรือ Interface Error เพิ่มสูงผิดปกติ การแจ้งเตือนอย่างเดียวไม่เพียงพอ ทีม Network Operations ต้องทราบว่าเหตุการณ์ใดเป็นเรื่องเดียวกัน ใครรับผิดชอบ มีหลักฐานอะไร และบริการกลับมาใช้งานได้เมื่อใด

บทความนี้ออกแบบกระบวนการ Alert → Normalize → Deduplicate → Ticket → Evidence → Escalate → Verify → Close โดยใช้เครื่องมือโอเพนซอร์สและตัวอย่างระบบจำลองที่สามารถขยายต่อได้

ขอบเขตความปลอดภัย: ใช้กับระบบที่ได้รับอนุญาตเท่านั้น ตัวอย่าง Cisco CLI เป็นคำสั่งอ่านข้อมูล (read-only) ไม่แก้ไข Configuration อัตโนมัติ

สถาปัตยกรรมระบบ Network Incident Automation

Prometheus / SNMP Exporter / Syslog
                |
          Alertmanager
                | HTTPS Webhook
                v
       Python Incident API
          |          |
     SQLite/DB     Job Queue
          |          |
       Ticket     Evidence Collector
          |          |
    Operator UI   Cisco SSH (read-only)
          |          |
          +---- Incident Record ----+
                |
       Notification / Escalation

องค์ประกอบหลัก

  • Alertmanager: จัดกลุ่มและส่ง Alert ไปยัง Webhook
  • Incident API: ตรวจสอบ Payload, ทำ Normalization และ Deduplication
  • Ticket Database: บันทึกสถานะ Owner, Severity, Timeline และ Evidence
  • Evidence Collector: อ่านสถานะ Cisco ผ่าน SSH ด้วยสิทธิ์จำกัด
  • Notification: ส่งต่อเหตุการณ์ที่ต้องตอบสนอง ไม่ใช่ทุก Event ที่เกิดขึ้น

ระบบตัวอย่างใช้ SQLite เพื่อการเรียนรู้เท่านั้น สำหรับ Production ให้พิจารณา PostgreSQL, งานประมวลผลแบบ Queue, HTTPS และระบบยืนยันตัวตนที่เหมาะสม

ออกแบบข้อมูล Alert และ Incident ให้สัมพันธ์กัน

Alert Labels และ Annotations

ฟิลด์ตัวอย่างประโยชน์
alertnameNetworkInterfaceDownประเภทเหตุการณ์
deviceYL-SW01ระบุอุปกรณ์
interfaceGi1/0/24ระบุจุดขัดข้อง
siteYL01ระบุพื้นที่
severitycriticalกำหนดลำดับตอบสนอง
startsAtISO 8601เวลาเริ่มต้นเหตุการณ์
statusfiring / resolvedสถานะ Alert

Incident Key และ Fingerprint

ควรกำหนด Deduplication Key จากชุดฟิลด์ที่มีความหมาย เช่น site|device|interface|alertname ไม่ควรใช้เวลาเริ่มต้นหรือข้อความ Description เพราะทำให้เหตุการณ์เดียวกันสร้าง Ticket ใหม่ทุกครั้งที่แจ้งซ้ำ

ค่า fingerprint ของ Alertmanager มีประโยชน์สำหรับระบุ Alert แต่ควรออกแบบกฎการรวม Incident ตามบริบทบริการด้วย เช่น Uplink Down ที่ทำให้เกิดหลาย Alarm ตามมา

กำหนด Incident Lifecycle และกฎการปิดงาน

สถานะความหมายเงื่อนไข
NEWรับ Alert แล้วผ่านการตรวจสอบ Payload
ACKNOWLEDGEDเจ้าหน้าที่รับงานมี Owner และเวลา Acknowledge
INVESTIGATINGกำลังตรวจสอบมีผลตรวจสอบหรือหลักฐาน
MITIGATEDผลกระทบลดลงบริการหลักกลับมาแต่ยังติดตาม
RESOLVEDตรวจยืนยันว่าปัญหาหายAlert Resolved + Service Verification
CLOSEDปิด Ticketบันทึกสาเหตุและผลทดสอบครบ

ข้อสำคัญ: Alertmanager ส่ง resolved ไม่ได้หมายความว่าควรปิด Ticket โดยอัตโนมัติทุกกรณี ต้องตรวจสอบการกลับมาของบริการจริงและกำหนดช่วงเวลาสังเกตการณ์ก่อนปิดงาน

ตั้งค่า Alertmanager Webhook Receiver

ตัวอย่างส่วนหนึ่งของ alertmanager.yml สำหรับระบบ Lab ที่ใช้ HTTPS ผ่าน Reverse Proxy ภายในองค์กร

route:
  receiver: network-incident-webhook
  group_by: ['alertname', 'site', 'device']
  group_wait: 30s
  group_interval: 5m
  repeat_interval: 4h

receivers:
  - name: network-incident-webhook
    webhook_configs:
      - url: 'https://incident.example.internal/api/alerts'
        send_resolved: true
        max_alerts: 0

URL นี้เป็น ตัวอย่างสมมติ ต้องเปลี่ยนเป็น Endpoint ที่มี HTTPS และเข้าถึงได้จาก Alertmanager จริง การยืนยันตัวตนของ Webhook ให้ตั้งค่าที่ Reverse Proxy หรือใช้กลไก Authentication ที่ Alertmanager รุ่นที่ใช้งานรองรับ พร้อมจำกัด Source IP และเก็บ Secret แยกจาก Repository

ทดสอบ Configuration

amtool check-config alertmanager.yml

ตรวจสอบ Route และ Receiver ก่อน Reload ทุกครั้ง และตรวจสอบว่า Alert ที่ถูก Silence หรือ Inhibit จะไม่ถูกส่งตามปกติ

สร้าง Python Webhook สำหรับรับและลด Ticket ซ้ำ

ตัวอย่างนี้ใช้ FastAPI + SQLite เพื่อแสดงแนวคิด Idempotent Ingestion โดยเก็บ Event และรวม Incident ที่ยังเปิดอยู่ตาม Deduplication Key ไม่ใช่ระบบ Production สำเร็จรูป

ติดตั้ง Lab

python -m venv .venv
# Linux/macOS:
source .venv/bin/activate
# Windows PowerShell:
# .venv\Scripts\Activate.ps1
python -m pip install fastapi uvicorn

ตัวอย่าง app.py

import os
import sqlite3
import hashlib
from contextlib import closing
from fastapi import FastAPI, Header, HTTPException
from pydantic import BaseModel, Field

DB = os.environ.get("INCIDENT_DB", "incidents.db")
TOKEN = os.environ.get("WEBHOOK_TOKEN")
app = FastAPI()

class Alert(BaseModel):
    status: str
    labels: dict[str, str] = Field(default_factory=dict)
    annotations: dict[str, str] = Field(default_factory=dict)
    startsAt: str | None = None

class AlertPayload(BaseModel):
    receiver: str | None = None
    status: str | None = None
    alerts: list[Alert]

def connect():
    db = sqlite3.connect(DB, timeout=10)
    db.execute("PRAGMA busy_timeout=10000")
    return db

@app.on_event("startup")
def init_db():
    with closing(connect()) as db:
        db.execute("""CREATE TABLE IF NOT EXISTS incidents (
            incident_key TEXT PRIMARY KEY,
            site TEXT, device TEXT, interface TEXT,
            alertname TEXT, severity TEXT,
            state TEXT NOT NULL, event_count INTEGER NOT NULL DEFAULT 1,
            updated_at TEXT DEFAULT CURRENT_TIMESTAMP
        )""")
        db.commit()

@app.post("/api/alerts")
def receive(payload: AlertPayload, authorization: str | None = Header(None)):
    if not TOKEN or authorization != f"Bearer {TOKEN}":
        raise HTTPException(status_code=401, detail="Unauthorized")
    with closing(connect()) as db:
        for alert in payload.alerts:
            labels = alert.labels
            fields = [labels.get(k, "unknown") for k in
                      ("site", "device", "interface", "alertname")]
            key = hashlib.sha256("|".join(fields).encode()).hexdigest()
            state = "NEW" if alert.status == "firing" else "VERIFY_RECOVERY"
            db.execute("""INSERT INTO incidents
                (incident_key,site,device,interface,alertname,severity,state)
                VALUES (?,?,?,?,?,?,?)
                ON CONFLICT(incident_key) DO UPDATE SET
                event_count=event_count+1,
                updated_at=CURRENT_TIMESTAMP,
                state=CASE WHEN excluded.state='VERIFY_RECOVERY'
                     THEN 'VERIFY_RECOVERY'
                     WHEN incidents.state IN ('CLOSED','RESOLVED')
                     THEN 'NEW' ELSE incidents.state END""",
                (key, *fields, labels.get("severity", "warning"), state))
        db.commit()
    return {"accepted": len(payload.alerts)}

ข้อจำกัดของตัวอย่าง: ใช้ Key เดิมสำหรับ Incident ที่เกิดซ้ำหลังปิดงาน จึงยังไม่มี Incident ID แยกตามรอบเหตุการณ์ ไม่มี Audit Trail หรือ Event-ID Deduplication และอาจนับการส่งซ้ำเป็น Event ใหม่ เหมาะกับ Lab เท่านั้น ระบบ Production ควรมีตาราง incidents และ alert_events แยกกัน มี Unique Event ID, Transaction, Locking และ Reopen Policy ชัดเจน

เริ่มต้น API

# ตั้งค่า WEBHOOK_TOKEN ใน Environment ก่อนเริ่ม
uvicorn app:app --host 127.0.0.1 --port 8000

ใช้ Reverse Proxy ที่บังคับ HTTPS และเติม Authorization: Bearer ... หลังตรวจสอบต้นทาง หรือใช้ Authentication ของ Alertmanager ที่รองรับตามเวอร์ชันจริง ห้ามเปิด API ตัวอย่างสู่ Internet โดยตรง

ทดสอบ Webhook และ Ticket Deduplication

Payload ตัวอย่าง

{
  "receiver": "network-incident-webhook",
  "status": "firing",
  "alerts": [{
    "status": "firing",
    "labels": {
      "alertname": "NetworkInterfaceDown",
      "site": "YL01",
      "device": "YL-SW01",
      "interface": "Gi1/0/24",
      "severity": "critical"
    },
    "annotations": {"summary": "Uplink interface down"}
  }]
}

ส่ง Payload เดิมสองครั้งแล้วตรวจสอบว่า จำนวน Incident Key ยังเท่าเดิม แต่ event_count เพิ่มขึ้น นี่คือการรวม Ticket ตาม Key ไม่ใช่การลบ Event ซ้ำอย่างสมบูรณ์

ทดสอบอีกครั้งด้วย status: resolved ในระดับ Alert และตรวจสอบว่า Ticket เปลี่ยนเป็น VERIFY_RECOVERY เพื่อรอเจ้าหน้าที่ตรวจสอบบริการ ไม่ปิดอัตโนมัติ

Automated Evidence Collection จาก Cisco Switch และ Router

เมื่อเกิด Incident ระบบสามารถรวบรวมข้อมูลแบบ Read-Only โดยใช้ Python และ Netmiko ภายใต้บัญชีที่ได้รับอนุญาต แนะนำให้แยก Evidence Collector ออกจาก HTTP Request และส่งงานผ่าน Queue เพื่อไม่ให้ Webhook Timeout

ชุดคำสั่งตามประเภทเหตุการณ์

เหตุการณ์คำสั่งตัวอย่างสิ่งที่ตรวจสอบ
Interface Downshow interfaces statusLink/Port State
Uplink Flappingshow loggingเวลา Link Up/Down
Packet Errorsshow interfaces GigabitEthernet1/0/24CRC, Input/Output Errors
Layer 2 Loopshow spanning-treeTopology Change/Port Role
Routing Faultshow ip routeเส้นทางที่ใช้งาน
Device Healthshow processes cpuCPU Utilization

คำสั่งบางรายการขึ้นอยู่กับ Cisco IOS/IOS XE และรุ่นอุปกรณ์ ให้ทดสอบบน Lab ก่อนนำไปใช้จริง และกำหนด Command Allowlist แทนการรับคำสั่งจาก Webhook โดยตรง

ตัวอย่าง Netmiko Collector

import os
from pathlib import Path
from datetime import datetime, timezone
from netmiko import ConnectHandler

commands = [
    "show clock",
    "show interfaces status",
    "show logging"
]

device = {
    "device_type": "cisco_ios",
    "host": "192.168.99.11",  # LAB ONLY
    "username": os.environ["CISCO_USER"],
    "password": os.environ["CISCO_PASS"],
}

with ConnectHandler(**device) as conn:
    output = []
    for command in commands:
        output.append(f"$ {command}\n{conn.send_command(command)}")

Path("evidence").mkdir(exist_ok=True)
stamp = datetime.now(timezone.utc).strftime("%Y%m%dT%H%M%SZ")
file = Path("evidence") / f"YL-SW01-{stamp}.txt"
file.write_text("\n\n".join(output), encoding="utf-8")
print(f"Saved: {file}")

ตัวอย่างนี้สาธิตการเก็บหลักฐานใน Lab เท่านั้น ก่อนใช้งานจริงต้องเพิ่มการตรวจสอบ SSH Host Key, Secret Manager, Redaction, จำกัดจำนวนคำสั่ง, Timeout, Audit Log และการป้องกันข้อมูลอ่อนไหวในไฟล์ Evidence

Event Correlation และ Incident Deduplication ระดับบริการ

ตัวอย่างเหตุการณ์ต่อเนื่อง

10:02:11  YL-SW01 Gi1/0/24 Down
10:02:15  YL-SW02 SNMP Unreachable
10:02:18  YL01 Payment Network Timeout
10:02:23  YL01 Device Offline Alerts

Alert ทั้งหมดอาจมีสาเหตุร่วมกันจาก Uplink ของ SW01 หากสร้าง Ticket แยกทุก Alert จะเพิ่มงานซ้ำและทำให้วิเคราะห์ภาพรวมยาก

กฎ Correlation ที่แนะนำ

  • Topology-based: ใช้ความสัมพันธ์ Parent/Child ระหว่าง Uplink, Switch และอุปกรณ์ปลายทาง
  • Time-window: รวมเหตุการณ์ที่เกิดใกล้กันภายในช่วงเวลาที่กำหนด
  • Service-based: เชื่อม Alert กับบริการที่ได้รับผลกระทบ เช่น AFC, PSD หรือระบบสำนักงาน
  • State-aware: แยกเหตุการณ์ใหม่จาก Incident ที่ปิดแล้ว ไม่ใช้ Key เดิมเป็น Ticket ID ถาวร

ควรเก็บ Raw Alert ทุก Event เพื่อการตรวจสอบย้อนหลัง แม้ระบบจะรวมเป็น Parent Incident เดียวก็ตาม

Incident Priority, SLA และ Escalation Workflow

Priorityตัวอย่างผลกระทบแนวทางตอบสนอง
P1 Criticalเครือข่ายหลักหยุดให้บริการหลายสถานีแจ้ง On-Call และ Incident Commander ทันที
P2 HighUplink สำรองทำงาน แต่ Redundancy ลดลงตรวจสอบและเตรียมแผนแก้ไขเร่งด่วน
P3 MediumInterface Errors สูงแต่บริการยังทำงานวิเคราะห์ Trend และเปิด Corrective Work Order
P4 LowCapacity Warning หรือ Informationalติดตามในรอบ Maintenance

เวลา Acknowledge และ Restore ต้องอ้างอิง SLA/TOR ที่ได้รับอนุมัติจริง ไม่ควรกำหนดจากตัวอย่างโดยถือเป็นข้อผูกพันของสัญญา

Escalation Matrix

ขั้นตอนที่แนะนำ: Monitoring → Center/On-Call → Field Engineer → Network Specialist → Vendor/Provider → Management พร้อมระบุ Owner, เวลาแจ้ง, เวลา Escalate และเหตุผลใน Ticket ทุกครั้ง

ความปลอดภัยและความน่าเชื่อถือของระบบอัตโนมัติ

  • Webhook Authentication: ใช้ HTTPS, Authentication, IP Allowlist และการตรวจสอบ Payload Schema
  • Idempotency: ป้องกันการสร้าง Ticket ซ้ำจาก Webhook Retry และเก็บ Event ID
  • Queue & Retry: แยกงานเก็บ Evidence ออกจาก API; Retry แบบ Backoff และ Dead-letter Queue
  • Least Privilege: บัญชี Cisco สำหรับ Collector ต้องมีสิทธิ์เฉพาะคำสั่งที่จำเป็น
  • Secret Management: ไม่เก็บรหัสผ่านหรือ Token ใน Git, Ticket หรือ Log
  • Data Protection: จำกัดสิทธิ์เข้าถึง PCAP, Config, Syslog และ Evidence ตามระยะเวลาจัดเก็บ
  • Audit Trail: เก็บการเปลี่ยนสถานะ ผู้ดำเนินการ และเหตุผลที่แก้ไข Incident
  • Safe Remediation: ไม่สั่ง Shutdown, Reload หรือเปลี่ยน Config จาก Alert โดยตรงโดยไม่มี Approval

ควรใช้ Network Segmentation, Monitoring ของระบบ Automation เอง และ Backup Database อย่างสม่ำเสมอ

Hands-on Lab: จำลอง Incident Uplink Down แบบ End-to-End

  1. เตรียม Lab: Python 3.11+, FastAPI, SQLite และ Alertmanager หรือ JSON Payload จำลอง
  2. สร้าง Alert: ส่ง NetworkInterfaceDown สำหรับ YL-SW01 / Gi1/0/24
  3. ตรวจสอบ Ticket: ต้องสร้าง Incident ใหม่หนึ่งรายการพร้อม Site, Device, Interface และ Severity
  4. ทดสอบ Retry: ส่ง Alert ซ้ำ ต้องไม่สร้าง Ticket ใหม่สำหรับ Incident เดียวกัน
  5. ทดสอบ Evidence: รัน Collector ใน Lab ด้วยบัญชี Read-Only และบันทึกเวลาจัดเก็บหลักฐาน
  6. ทดสอบ Recovery: ส่ง resolved และยืนยันว่า Incident รอ Verification
  7. ทดสอบ Failure: จำลอง API Timeout, Database Locked และ Cisco SSH Unreachable โดยไม่ทำให้ Event สูญหาย
  8. ปิดงาน: บันทึก Root Cause, Restoration Time, Verification และ Corrective Action

Acceptance Criteria

TestExpected Result
Webhook Validรับ Alert ได้และตอบ HTTP 200
Unauthorized Requestตอบ HTTP 401
Duplicate Alertไม่เพิ่ม Incident ที่ยังเปิดอยู่
Resolved Eventเข้าสู่สถานะรอตรวจสอบบริการ
Collector FailureTicket ยังคงอยู่และบันทึก Failure
Manual Closeต้องมี Verification และ Audit Trail

Troubleshooting และข้อผิดพลาดที่พบบ่อย

อาการสาเหตุที่เป็นไปได้วิธีตรวจสอบ
Webhook ไม่เข้าRoute, DNS, TLS หรือ Firewallตรวจ Alertmanager Logs และ HTTPS Connectivity
HTTP 401Token ไม่ตรงหรือ Proxy ไม่ส่ง Headerตรวจ Authentication Flow โดยไม่พิมพ์ Secret ลง Log
Ticket ซ้ำKey ไม่คงที่หรือ Retry ไม่มี Idempotencyตรวจ Normalize Key และ Event ID
Evidence ไม่ครบSSH Timeout, AAA, CLI ต่างรุ่นตรวจ Collector Log และ Command Allowlist
Ticket ปิดก่อนบริการฟื้นปิดตาม Alert Resolved โดยไม่มี Verificationเพิ่ม Service Check และ Observation Window
Alert Stormไม่มี Grouping/Inhibition/Correlationปรับ Alertmanager Routing และ Parent Incident

สรุปและแนวทางต่อยอดสู่ Production

ระบบ Network Incident Automation ที่ดีต้องไม่ใช่เพียงการสร้าง Ticket จาก Alert แต่ต้องเชื่อมโยงเหตุการณ์กับอุปกรณ์ บริการ ผู้รับผิดชอบ หลักฐาน และผลการกู้คืนอย่างตรวจสอบได้

เริ่มต้นจาก Read-Only Evidence Collection และ Ticket Lifecycle ที่ชัดเจน ก่อนพัฒนาสู่ระบบที่มี Message Queue, PostgreSQL, Topology Correlation, ITSM API Integration, Dashboard และ Approval Workflow สำหรับการแก้ไข Configuration

บทความถัดไป: Network Incident Analytics & Reliability Engineering — Incident Trends, MTTR, Recurring Faults, SLA Insights และ Continuous Improvement

Share this
Facebook Share X
TECHEREST COMMUNITY

Share your thoughts here

Join the conversation and share your perspective on this article.

Comments will load when you reach this section.