Ein einfacher Go-Tipp, um Benachrichtigungen über langsame Abfragen, unerwartete Fehler und andere wichtige Protokolle zu erhalten.
Mein Slack-Bot hat mich auf eine lang laufende SQL-Abfrage aufmerksam gemacht. Ich sollte es so schnell wie möglich beheben.
Wir können nicht verwalten, was wir nicht messen können. Für jede Backend-Anwendung müssen wir ihre Leistung in der Datenbank überwachen. Wenn eine bestimmte Abfrage mit zunehmender Datenmenge langsamer wird, müssen Sie sie optimieren, bevor sie zu langsam wird.
Da Slack zum zentralen Bestandteil unserer Arbeit geworden ist, verändert es auch die Art und Weise, wie wir unsere Systeme überwachen. Obwohl wir bereits über ziemlich gute Überwachungstools verfügen, ist es auch eine gute Idee, einen Slack-Bot zu haben, der uns mitteilt, wenn sich im System ein Trend entwickelt. Beispielsweise dauert die Ausführung einer SQL-Abfrage zu lange oder in einem bestimmten Go-Paket tritt ein schwerwiegender Fehler auf.
In diesem Blogbeitrag erklären wir Ihnen, wie Sie ein einfaches Protokollierungssystem einrichten, das diese Funktionen bereits unterstützt, und eine vorhandene Datenbankbibliothek, um dieses Ziel zu erreichen.
Verwenden Sie einen Loggerlogger ist eine kleine Bibliothek, die für die Verwendung durch Go-Bibliotheken und -Anwendungen entwickelt wurde. In diesem Beispiel verwenden wir seine drei wichtigen Funktionen:
Es bietet einen einfachen Timer zur Leistungsmessung.
Unterstützt komplexe Ausgabefilter, sodass Sie Protokolle aus bestimmten Paketen auswählen können. Beispielsweise können Sie den Logger anweisen, nur Datenbankpakete auszugeben und nur Timer-Protokolle auszugeben, die länger als 500 ms sind.
Es verfügt über einen Slack-Hook, sodass Sie Protokolle filtern und in Slack einspeisen können.
Sehen wir uns in diesem Beispiel an, wie man einen Timer verwendet. Später werden wir auch Filter verwenden:
package main import ( "github.com/azer/logger" "time" ) var ( users = logger.New("users") database = logger.New("database") ) func main () { users.Info("Hi!") timer := database.Timer() time.Sleep(time.Millisecond * 250) // sleep 250ms timer.End("Connected to database") users.Error("Failed to create a new user.", logger.Attrs{ "e-mail": "[email protected]", }) database.Info("Just a random log.") fmt.Println("Bye.") }
Keine Ausgabe beim Ausführen dieses Programms:
Der Logger ist standardmäßig stumm, sodass er innerhalb der Bibliothek verwendet werden kann. Wir verwenden einfach eine Umgebungsvariable, um das Protokoll anzuzeigen: Zum Beispiel:
$ LOG=database@timer go run example-01.go 01:08:54.997 database(250.095587ms): Connected to database. Bye
Im obigen Beispiel haben wir den Datenbank@Timer-Filter verwendet, um die Timer-Protokollausgabe im Datenbankpaket anzuzeigen. Sie können auch andere Filter ausprobieren, wie zum Beispiel:
LOG=*: Alle Protokolle
LOG=users@error,database: alle Fehlerprotokolle von Benutzern, alle Protokolle aus der Datenbank
LOG=*@timer,database@info: Timer-Protokolle und Fehlerprotokolle von allen Paketen und alle Protokolle von der Datenbank
LOG=*,users@mute: Alle Protokolle außer Benutzern
Konsolenprotokoll ist für die Entwicklungsumgebung bestimmt, wir benötigen jedoch, dass das Produkt eine benutzerfreundliche Oberfläche bietet. Dank Slack-Hook können wir es im obigen Beispiel problemlos mit Slack integrieren:
import ( "github.com/azer/logger" "github.com/azer/logger-slack-hook" ) func init () { logger.Hook(&slackhook.Writer{ WebHookURL: "https://hooks.slack.com/services/...", Channel: "slow-queries", Username: "Query Person", Filter: func (log *logger.Log) bool { return log.Package == "database" && log.Level == "TIMER" && log.Elapsed >= 200 } }) }
Lassen Sie uns erklären, was wir im obigen Beispiel getan haben:
Zeile Nr. 5: Legen Sie die eingehende Webhook-URL fest. Die URL ist hier verlinkt.
Zeile Nr. 6: Wählen Sie den Eingangskanal für das Flussprotokoll aus.
Zeile #7: Angezeigter Benutzername des Absenders.
Zeile Nr. 11: Verwenden Sie einen Stream-Filter, um nur Timer-Protokolle auszugeben, die älter als 200 ms sind.
Ich hoffe, dieses Beispiel kann Ihnen einen allgemeinen Eindruck vermitteln. Wenn Sie weitere Fragen haben, schauen Sie sich die Dokumentation des Loggers an.
crud ist eine Bibliothek im ORM-Stil für Go-Datenbanken. Eine ihrer versteckten Funktionen ist, dass das interne Protokollierungssystem Logger verwendet. Dadurch können wir laufende SQL-Abfragen einfach überwachen.
AbfrageHier ist eine einfache Abfrage, die den Benutzernamen einer E-Mail-Adresse zurückgibt:
func GetUserNameByEmail (email string) (string, error) { var name string if err := DB.Read(&name, "SELECT name FROM user WHERE email=?", email); err != nil { return "", err } return name, nil }
Okay, das ist zu kurz und es fühlt sich an, als würde etwas fehlen. Fügen wir den vollständigen Kontext hinzu:
import ( "github.com/azer/crud" _ "github.com/go-sql-driver/mysql" "os" ) var db *crud.DB func main () { var err error DB, err = crud.Connect("mysql", os.Getenv("DATABASE_URL")) if err != nil { panic(err) } username, err := GetUserNameByEmail("[email protected]") if err != nil { panic(err) } fmt.Println("Your username is: ", username) }
Wir haben also eine Rohinstanz, die über die Umgebungsvariable DATABASE_URL mit der MySQL-Datenbank verbunden ist. Wenn wir dieses Programm ausführen, sehen wir eine Ausgabezeile:
$ DATABASE_URL=root:123456@/testdb go run example.go Your username is: azer
Wie ich bereits erwähnt habe, erfolgt die Protokollierung standardmäßig stumm. Werfen wir einen Blick auf die internen Protokolle von Crud:
$ LOG=crud go run example.go 22:56:29.691 crud(0): SQL Query Executed: SELECT username FROM user WHERE email='[email protected]' Your username is: azer
Das ist einfach und reicht aus, um zu sehen, wie die Abfrage in unserer Entwicklungsumgebung ausgeführt wird.
CRUD- und Slack-IntegrationLogger ist für die Konfigurationsverwaltung von „internen Protokollierungssystemen“ auf Anwendungsebene konzipiert. Das bedeutet, dass Sie grobe Protokolle in Slack einfließen lassen können, indem Sie den Logger auf Ihrer Anwendungsebene konfigurieren:
import ( "github.com/azer/logger" "github.com/azer/logger-slack-hook" ) func init () { logger.Hook(&slackhook.Writer{ WebHookURL: "https://hooks.slack.com/services/...", Channel: "slow-queries", Username: "Query Person", Filter: func (log *logger.Log) bool { return log.Package == "mysql" && log.Level == "TIMER" && log.Elapsed >= 250 } }) }
Im Code oben:
Wir haben die Bibliotheken logger und logger-slack-hook importiert.
Wir konfigurieren die Logger-Protokolle so, dass sie in Slack einfließen. Diese Konfiguration deckt alle Verwendungen des Loggers in der Codebasis ab, einschließlich Abhängigkeiten von Drittanbietern.
Wir haben einen Stream-Filter verwendet, um nur Timer-Protokolle aus dem MySQL-Paket auszugeben, die länger als 250 ms sind.
Diese Verwendung kann über die einfache Berichterstattung über langsame Abfragen hinaus erweitert werden. Ich persönlich verwende es, um wichtige Fehler in bestimmten Paketen zu verfolgen und auch für Statistiken wie neue Benutzeranmeldungen oder Protokolle zur Zahlungsgenerierung.
krud
Logger
logger-slack-hook
Sagen Sie uns, wenn Sie Fragen oder Anregungen haben
Das obige ist der detaillierte Inhalt vonÜberwachung von SQL-Abfragen auf Slack. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!