[PYTHON] Ich habe versucht, Zabbix Server über einen Ausführungsfehler der AWS Lambda-Funktion zu informieren

Einführung

Da das Betriebsüberwachungssystem zentral von Zabbix verwaltet wird, wollte ich Zabbix Server über den Ausführungsfehler der AWS Lambda-Funktion informieren, also habe ich es versucht.

Umgebung

Host / Item / Trigger zu Zabbix Server hinzugefügt

Host hinzugefügt

Einstellungen> Hosts> Host erstellen

Registerkarte "Host"

Artikel hinzugefügt

[Einstellungen]> [Hosts]> [Items]> [Create Item] von Lambda-Trapper in der Hostliste

--Name: ErrorLog

Auslöser hinzugefügt

[Einstellungen]> [Hosts]> [Trigger]> [Trigger erstellen] von Lambda-Trapper in der Hostliste

Registerkarte Trigger

--Name: Lambda-Funktionsausführungsfehler

Protokollierungsprozess zur AWS Lambda-Funktion hinzugefügt

Fügen Sie der vorhandenen AWS Lambda-Funktion (der Funktion, mit der Sie Ausführungsfehler abfangen möchten) die Protokollierungsverarbeitung wie folgt hinzu.

Code

lambda_function.py


# (Kürzung)

import logging

# (Kürzung)

#Logger-Initialisierung
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def lambda_handler(event, context):
    try:

        # (Kürzung)

        logger.info("Execution succeeded.")
    except Exception, e:
        logger.error(e)
        raise(e)    #Beschrieben, wann Sie den Python-Stack-Trace im CloudWatch-Protokoll aufzeichnen möchten

Durch Hinzufügen des Protokollierungsprozesses wird das Ausführungsergebnis der AWS Lambda-Funktion an CloudWatch ausgegeben. Beispiel eines normalen Endprotokolls)

[INFO]	2017-03-01T08:18:31.149Z	a7afba37-fe57-11e6-a428-371557c5f4e7	Execution succeeded.

Beispiel für ein abnormales Beendigungsprotokoll)

[ERROR]	2017-03-01T09:38:37.966Z	d8c7ede3-fe62-11e6-b58a-7dce3a95f14a	cannot concatenate 'str' and 'int' objects

Erstellen Sie eine AWS Lambda-Funktion zum Senden von Zabbix

Erstellen Sie eine neue AWS Lambda-Funktion zum Senden von Zabbix aus CloudWatch. Das Zabbix Sender-Modul wird übrigens in "hier" veröffentlicht. Ich habe den Code umgeleitet.

Name der AWS Lambda-Funktion

cwl-to-zabbix

Code

handler.py


import os
import json
from StringIO import StringIO
import base64
import gzip
from ZabbixSender import ZabbixSender
import logging

ZBX_SERVER = os.environ['ZBX_SERVER']
ZBX_HOST = os.environ['ZBX_HOST']
ZBX_ITEM = os.environ['ZBX_ITEM']
logger = logging.getLogger()
logger.setLevel(logging.INFO)

def sender(event, context):
    log_b64 = event['awslogs']['data']
    log_gz = StringIO(base64.b64decode(log_b64))
    jsonData = json.load(gzip.GzipFile(fileobj=log_gz, mode='rb'))
    status = jsonData['logEvents'][0]['extractedFields']['status']
    message = jsonData['logEvents'][0]['extractedFields']['event']
    timestamp = int(jsonData['logEvents'][0]['timestamp']) / 1000
    func = os.path.basename(jsonData['logGroup'])

    try:
        if status == "ERROR":
            errlog = func + ': ' + message
            sender = ZabbixSender(ZBX_SERVER)
            sender.add(ZBX_HOST, ZBX_ITEM, errlog, timestamp)
            sender.send()
        logger.info("Execution Succeeded.")
    except Exception, e:
        logger.error(e)
        raise(e)

ZabbixSender.py


import socket
import struct
import time
import json

class ZabbixSender:

    log = True

    def __init__(self, host='127.0.0.1', port=10051):
        self.address = (host, port)
        self.data    = []

    def __log(self, log):
        if self.log: print log

    def __connect(self):
        self.sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        try:
            self.sock.connect(self.address)
        except:
            raise Exception("Can't connect server.")

    def __close(self):
        self.sock.close()

    def __pack(self, request):
        string = json.dumps(request)
        header = struct.pack('<4sBQ', 'ZBXD', 1, len(string))
        return header + string

    def __unpack(self, response):
        header, version, length = struct.unpack('<4sBQ', response[:13])
        (data, ) = struct.unpack('<%ds'%length, response[13:13+length])
        return json.loads(data)

    def __request(self, request):
        self.__connect()
        try:
            self.sock.sendall(self.__pack(request))
        except Exception as e:
            raise Exception("Failed sending data.\nERROR: %s" % e)

        response = ''
        while True:
            data = self.sock.recv(4096)
            if not data:
                break
            response += data

        self.__close()
        return self.__unpack(response)

    def __active_checks(self):
        hosts = set()
        for d in self.data:
            hosts.add(d['host'])

        for h in hosts:
            request = {"request":"active checks", "host":h}
            self.__log("[active check] %s" % h)
            response = self.__request(request)
            if not response['response'] == 'success': self.__log("[host not found] %s" % h)

    def add(self, host, key, value, clock=None):
        if clock is None: clock = int(time.time())
        self.data.append({"host":host, "key":key, "value":value, "clock":clock})

    def send(self):
        if not self.data:
            self.__log("Not found sender data, end without sending.")
            return False

        self.__active_checks()
        request  = {"request":"sender data", "data":self.data}
        response = self.__request(request)
        result   = True if response['response'] == 'success' else False

        if result:
            for d in self.data:
                self.__log("[send data] %s" % d)
            self.__log("[send result] %s" % response['info'])
        else:
            raise Exception("Failed send data.")

        return result

Umgebungsvariable

--ZBX_SERVER =

Aufbau

※ Erstellen Sie im Voraus eine Rolle mit den folgenden Zugriffsrechten und weisen Sie diese Rolle zu.

Erstellen Sie einen Abonnementfilter

  1. Klicken Sie in der Liste der AWS Lambda-Funktionen auf die Funktion zum Senden von Zabbix (cwl-to-zabbix).
  2. Klicken Sie auf die Registerkarte Trigger und dann auf Trigger hinzufügen
  3. Klicken Sie auf das Ereignisquellenfeld (innerhalb der gestrichelten Linie) und wählen Sie [CloudWatch-Protokolle] aus der Quellenliste aus.
  4. Füllen Sie die unten gezeigten Felder aus und klicken Sie auf [Senden].

Zusammenfassung

Recommended Posts

Ich habe versucht, Zabbix Server über einen Ausführungsfehler der AWS Lambda-Funktion zu informieren
Ich habe versucht, Slack über das Update von Redmine zu informieren
Ich habe versucht, mit AWS Lambda einen AMI zu erhalten
Ich habe versucht, das lokale Minimum der Goldstein-Preis-Funktion zu bekämpfen
Ich habe versucht, den Index der Liste mithilfe der Aufzählungsfunktion abzurufen
Ich habe den asynchronen Server von Django 3.0 ausprobiert
Zusammenfassung des Schreibens von AWS Lambda
Ich habe versucht, schlechte Tweets regelmäßig mit der AWS Lambda + Twitter API zu löschen
[Lambda] Ich habe versucht, ein externes Python-Modul über S3 zu integrieren
Der erste Schritt, um langsame Abfragen loszuwerden! Ich habe versucht, Chatwork mit Lambda und AWS CLI v2 über langsame Abfragen für RDS for MySQL zu informieren
Ich habe versucht, das Update von "Hameln" mit "Beautiful Soup" und "IFTTT" zu benachrichtigen.
Ich habe die Pivot-Table-Funktion von Pandas ausprobiert
Ich habe versucht, das Umfangsverhältnis mit 100 Millionen Stellen zu ermitteln
Ich habe versucht, die Trapezform des Bildes zu korrigieren
Der Fehler der mit tf.function dekorierten Funktion hat versucht, Variablen beim nicht ersten Aufruf zu erstellen. In tensorflow.keras
Ich habe versucht, die Kosten zu senken, indem ich EC2 in einer Charge mit AWS Lambda gestartet / gestoppt habe
Ich habe versucht, AWS Lambda mit anderen Diensten zu verbinden
Zusammenfassung des Studiums von Python zur Verwendung von AWS Lambda
Ich möchte das Erscheinungsbild von zabbix anpassen
Ich habe versucht, Twitter Scraper mit AWS Lambda zu verwenden, aber es hat nicht funktioniert.
Ich habe versucht, die Texte von Hinatazaka 46 zu vektorisieren!
Ich habe versucht, das Update von "Werde ein Romanautor" mit "IFTTT" und "Werde ein Romanautor API" zu benachrichtigen.
Ich wollte die Google-Tabelle mit AWS Lambda betreiben, also habe ich es versucht [Teil 2]
Ich habe versucht, die Sündenfunktion mit Chainer zu trainieren
Ich habe versucht, Funktionen mit SIFT von OpenCV zu extrahieren
Ich habe versucht zusammenzufassen, wie man Matplotlib von Python verwendet
Ich möchte das Ausführungsergebnis von strace erfassen
Ich habe versucht, die Grundform von GPLVM zusammenzufassen
Ich habe versucht, TensorFlow in der AWS Lambda-Umgebung auszuführen: Vorbereitung
Ich habe versucht, die Sündenfunktion mit Chainer zu approximieren
Ich habe versucht, die Spacha-Informationen von VTuber zu visualisieren
Ich möchte Lambda mit Python auf Mac AWS!
Ich habe versucht, den negativen Teil von Meros zu löschen
AWS Lambda unterstützt jetzt Python, also habe ich es versucht
[Python] Ich habe versucht, Json von Tintenfischring 2 zu bekommen
Ich habe versucht, einen automatischen Nachweis der Sequenzberechnung zu implementieren
[Einführung in AWS] Ich habe versucht, mit der Sprach-Text-Konvertierung zu spielen ♪
Ich habe versucht, die Stimmen der Sprecher zu klassifizieren
Ich habe versucht, die String-Operationen von Python zusammenzufassen
Ich habe AWS CDK ausprobiert!
Ich habe versucht zu debuggen.
Ich habe AWS Iot ausprobiert
Ich habe versucht, den WEB-Server der normalen Linux-Programmierung 1st Edition mit C ++ 14 neu zu schreiben
Ich habe versucht, die Entropie des Bildes mit Python zu finden
[Pferderennen] Ich habe versucht, die Stärke des Rennpferdes zu quantifizieren
Ich habe versucht, die Standortinformationen des Odakyu-Busses zu erhalten
Ich habe versucht, mit TensorFlow den Durchschnitt mehrerer Spalten zu ermitteln
Ich habe versucht, Djangos Server mit VScode anstelle von Pycharm zu starten
Ich habe versucht, die Zugverspätungsinformationen mit LINE Notify zu benachrichtigen
Ich habe eine Funktion erstellt, um das Modell von DCGAN zu überprüfen
Ich habe versucht, CPython ein Post-Inkrement hinzuzufügen. Liste aller Änderungen
[Einführung in AWS] Memorandum zum Erstellen eines Webservers auf AWS
[Python] Ich habe versucht, die folgende Beziehung von Twitter zu visualisieren
Ich habe versucht, ListNet of Rank Learning mit Chainer zu implementieren
Ich habe versucht, die Mail-Sendefunktion in Python zu implementieren
Ich habe ein wenig versucht, das Verhalten der Zip-Funktion